From 48f71ee65b019043e81a5880ad68503146cecacb Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Thu, 26 Mar 2026 22:33:30 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20checkout=20UI=20polish=20=E2=80=94=20bra?= =?UTF-8?q?nd=20colors,=20Pulse=20Select,=20logo,=20touched-only=20errors,?= =?UTF-8?q?=20no=20skeletons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/checkout/page.tsx | 13 ++++--- components/checkout/PaymentForm.tsx | 57 +++++++++-------------------- components/checkout/PlanSummary.tsx | 6 +-- 3 files changed, 28 insertions(+), 48 deletions(-) diff --git a/app/checkout/page.tsx b/app/checkout/page.tsx index d93e67f..87613ef 100644 --- a/app/checkout/page.tsx +++ b/app/checkout/page.tsx @@ -11,7 +11,7 @@ import { getSubscription } from '@/lib/api/billing' import { PLAN_PRICES, TRAFFIC_TIERS } from '@/lib/plans' import PlanSummary from '@/components/checkout/PlanSummary' import PaymentForm from '@/components/checkout/PaymentForm' -import pulseLogo from '@/public/pulse_logo_no_margins.png' +import pulseIcon from '@/public/pulse_icon_no_margins.png' // --------------------------------------------------------------------------- // Validation helpers @@ -174,15 +174,16 @@ function CheckoutContent() {
{/* Header */}
- + Pulse + Pulse
diff --git a/components/checkout/PaymentForm.tsx b/components/checkout/PaymentForm.tsx index 1add585..9b0ae0d 100644 --- a/components/checkout/PaymentForm.tsx +++ b/components/checkout/PaymentForm.tsx @@ -4,6 +4,7 @@ import { useEffect, useRef, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import Script from 'next/script' import { Lock, ShieldCheck } from '@phosphor-icons/react' +import { Select } from '@ciphera-net/ui' import { COUNTRY_OPTIONS } from '@/lib/countries' import { initMollie, getMollie, MOLLIE_FIELD_STYLES, type MollieComponent } from '@/lib/mollie' import { createEmbeddedCheckout } from '@/lib/api/billing' @@ -30,6 +31,7 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps) const [mollieError, setMollieError] = useState(false) const [formError, setFormError] = useState(null) const [cardErrors, setCardErrors] = useState>({}) + const [touchedFields, setTouchedFields] = useState>(new Set()) const [submitting, setSubmitting] = useState(false) const componentsRef = useRef>({ @@ -71,6 +73,9 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps) component.mount(el) component.addEventListener('change', (event: unknown) => { const e = event as { error?: string; touched?: boolean } + if (e.touched) { + setTouchedFields((prev) => new Set(prev).add(type)) + } setCardErrors((prev) => { const next = { ...prev } if (e.error) next[type] = e.error @@ -157,13 +162,8 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps) {/* Cardholder name */}
-
-
- {!mollieReady && ( -
- )} -
- {cardErrors.cardHolder && ( +
+ {touchedFields.has('cardHolder') && cardErrors.cardHolder && (

{cardErrors.cardHolder}

)}
@@ -171,13 +171,8 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps) {/* Card number */}
-
-
- {!mollieReady && ( -
- )} -
- {cardErrors.cardNumber && ( +
+ {touchedFields.has('cardNumber') && cardErrors.cardNumber && (

{cardErrors.cardNumber}

)}
@@ -186,25 +181,15 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps)
-
-
- {!mollieReady && ( -
- )} -
- {cardErrors.expiryDate && ( +
+ {touchedFields.has('expiryDate') && cardErrors.expiryDate && (

{cardErrors.expiryDate}

)}
-
-
- {!mollieReady && ( -
- )} -
- {cardErrors.verificationCode && ( +
+ {touchedFields.has('verificationCode') && cardErrors.verificationCode && (

{cardErrors.verificationCode}

)}
@@ -213,18 +198,12 @@ export default function PaymentForm({ plan, interval, limit }: PaymentFormProps) {/* Country */}
- + onChange={setCountry} + variant="input" + options={[{ value: '', label: 'Select country' }, ...COUNTRY_OPTIONS.map((c) => ({ value: c.value, label: c.label }))]} + />
{/* VAT ID */} diff --git a/components/checkout/PlanSummary.tsx b/components/checkout/PlanSummary.tsx index 7a6eab7..5982492 100644 --- a/components/checkout/PlanSummary.tsx +++ b/components/checkout/PlanSummary.tsx @@ -57,7 +57,7 @@ export default function PlanSummary({ plan, interval, limit }: PlanSummaryProps) {/* Plan header */}

{plan}

- + 30-day trial
@@ -75,7 +75,7 @@ export default function PlanSummary({ plan, interval, limit }: PlanSummaryProps) €{displayPrice.toFixed(2)} billed yearly - + Save 1 month
@@ -115,7 +115,7 @@ export default function PlanSummary({ plan, interval, limit }: PlanSummaryProps)
    {features.map((feature) => (
  • - + {feature}
  • ))}