@thorprovider/blocks 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/designs/checkout-commerce-v1/block.d.ts +49 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.js +2487 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.mjs +2467 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.mjs.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts +8 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.js +44 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs +19 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.d.ts +3 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.js +36 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.mjs +6 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.d.ts +38 -0
- package/dist/blocks/e-commerce/account/account-frame.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.js +102 -0
- package/dist/blocks/e-commerce/account/account-frame.js.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.mjs +78 -0
- package/dist/blocks/e-commerce/account/account-frame.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.d.ts +79 -0
- package/dist/blocks/e-commerce/account/address-book.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.js +250 -0
- package/dist/blocks/e-commerce/account/address-book.js.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.mjs +225 -0
- package/dist/blocks/e-commerce/account/address-book.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.d.ts +35 -0
- package/dist/blocks/e-commerce/account/profile-form.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.js +100 -0
- package/dist/blocks/e-commerce/account/profile-form.js.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.mjs +76 -0
- package/dist/blocks/e-commerce/account/profile-form.mjs.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -0
- package/dist/index.mjs.map +1 -1
- package/dist/lib/contracts/checkout-commerce-v1.d.ts +2350 -0
- package/dist/lib/contracts/checkout-commerce-v1.d.ts.map +1 -0
- package/dist/lib/contracts/checkout-commerce-v1.js +417 -0
- package/dist/lib/contracts/checkout-commerce-v1.js.map +1 -0
- package/dist/lib/contracts/checkout-commerce-v1.mjs +392 -0
- package/dist/lib/contracts/checkout-commerce-v1.mjs.map +1 -0
- package/dist/lib/contracts.d.ts +515 -177
- package/dist/lib/contracts.d.ts.map +1 -1
- package/dist/lib/contracts.js +81 -1
- package/dist/lib/contracts.js.map +1 -1
- package/dist/lib/contracts.mjs +70 -0
- package/dist/lib/contracts.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/designs/checkout-commerce-v1/block.tsx"],"sourcesContent":["'use client'\n\nimport { BlockDataProvider, useBlockData } from './data-context'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardFooter, CardHeader } from '../../../ui/card'\nimport { PRODUCT_IMAGE_FALLBACK } from '../../../lib/contracts'\nimport type { CheckoutCommerceV1Data } from '../../../lib/contracts/checkout-commerce-v1'\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport type { FormEvent, KeyboardEvent } from 'react'\n\n// A unified cart + checkout surface. The data module holds every scenario\n// (cart, delivery groups, rates, addresses, payments and copy); this component\n// owns only ephemeral UI state: quantities, open panels, selections, transient\n// rate states and the simulated confirmation. No fetch, no persistence, no\n// viewport ownership and no page landmark: the host route owns the page.\n//\n// One shipping address feeds the whole order. Each delivery group keeps its own\n// mode, method, pickup point, rate and items, and changing the address re-rates\n// every shipping group without touching pickup groups. A group without a valid\n// rate or with blocked coverage withholds its fee and the order total.\n\ntype ScenarioData = (CheckoutCommerceV1Data[\"scenarios\"])[number]\ntype GroupData = ScenarioData['groups'][number]\ntype PaymentData = (CheckoutCommerceV1Data[\"paymentMethods\"])[number]\ntype CountryData = (CheckoutCommerceV1Data[\"countries\"])[number]\ntype PromotionData = { id: string; label: string; kind: string; amountCents: number; code: string }\ntype TierData = NonNullable<GroupData['items'][number]['tiers']>[number]\ntype AssociateData = NonNullable<GroupData['items'][number]['associates']>[number]\n\ntype AssociatePayload = {\n associateId: string\n parentLineId: string\n lineId: string\n groupId: string\n quantity: number\n unitCents: number\n}\n\ntype AddressData = {\n id: string\n label: string\n recipient: string\n line1: string\n line2: string\n city: string\n province: string\n postalCode: string\n phone: string\n isDefault: boolean\n}\n\ntype LineData = {\n lineId: string\n groupId: string\n title: string\n variant: string\n image?: string\n unitCents: number\n quantity: number\n stock: number\n tiers?: TierData[]\n lineDiscountCents?: number\n lineDiscountLabel?: string\n isAssociate?: boolean\n parentLineId?: string\n associateId?: string\n maxQuantity?: number\n minQuantity?: number\n maxPerMain?: number\n overflowPolicy?: string\n regularCents?: number\n discountLabel?: string\n}\n\ntype GroupState = {\n id: string\n mode: string\n shippingOptionId: string\n pickupPointId: string\n rateState: string\n}\n\ntype CreatedAddressPayload = AddressData & { saveToAccount: boolean }\n\ntype GuestContact = {\n name: string\n email: string\n phone: string\n}\n\ntype OrderSnapshot = {\n reference: string\n totalCents: number\n paymentId: string\n groupIds: string[]\n}\n\ntype ConfirmationGroup = {\n id: string\n title: string\n modeLabel: string\n methodLabel: string\n detailLabel: string\n feeCents: number\n lines: LineData[]\n}\n\ntype ConfirmationOrder = {\n reference: string\n totalCents: number\n subtotalCents: number\n unitCount: number\n promotions: PromotionData[]\n taxCents: number\n taxRateBps: number\n shippingCents: number\n pickupCents: number\n extraCents: number\n extraLabel: string\n groups: ConfirmationGroup[]\n address: AddressData | null\n paymentLabel: string\n paymentDetail: string\n billingLabel: string\n billingDetail: string\n customerName: string\n customerEmail: string\n}\n\nexport type CheckoutCommerceV1Props = {\n data: CheckoutCommerceV1Data;\n onQuantityChange?: (lineId: string, quantity: number) => void\n onRemoveItem?: (lineId: string) => void\n onSelectAddress?: (addressId: string) => void\n onCreateAddress?: (payload: CreatedAddressPayload) => void\n onStartRegistration?: (contact: GuestContact) => void\n onAddAssociate?: (payload: AssociatePayload) => void\n onConfirmOrder?: (snapshot: OrderSnapshot) => void\n onContinueShopping?: () => void\n}\n\nfunction money(cents: number, data: CheckoutCommerceV1Data) {\n const currencyFormatter = new Intl.NumberFormat(data.meta.locale, {\n style: 'currency',\n currency: data.meta.currency,\n minimumFractionDigits: 2,\n})\n return currencyFormatter.format(cents / 100)\n}\n\nconst VARIANT_SECONDARY = 'secondary' as const\nconst VARIANT_OUTLINE = 'outline' as const\nconst VARIANT_GHOST = 'ghost' as const\nconst VARIANT_DESTRUCTIVE = 'destructive' as const\nconst EMPTY_OPTION = ''\nconst AUTOCOMPLETE_NAME = 'name'\nconst AUTOCOMPLETE_EMAIL = 'email'\nconst AUTOCOMPLETE_TEL = 'tel'\n\nfunction fill(template: string, values: Record<string, string | number>) {\n return Object.keys(values).reduce(\n (text, key) => text.split(`{${key}}`).join(String(values[key])),\n template,\n )\n}\n\nfunction countLabel(count: number, one: string, many: string) {\n return count === 1 ? one : fill(many, { count })\n}\n\nfunction addressHeadline(address: AddressData) {\n return `${address.label} · ${address.province}`\n}\n\nfunction addressSummary(address: AddressData) {\n return [address.line1, address.line2, address.city].filter(Boolean).join(', ')\n}\n\nfunction pickupDetail(point: GroupData['pickupPoints'][number]) {\n return [point.address, point.hours].filter(Boolean).join(' · ')\n}\n\nfunction unitPriceFor(line: LineData, quantity: number) {\n let price = line.unitCents\n for (const tier of line.tiers ?? []) {\n if (quantity >= tier.minQuantity) price = tier.unitCents\n }\n return price\n}\n\nfunction currentTierFor(line: LineData, quantity: number) {\n let current: TierData | null = null\n for (const tier of line.tiers ?? []) {\n if (quantity >= tier.minQuantity) current = tier\n }\n return current\n}\n\nfunction nextTierFor(line: LineData, quantity: number) {\n return (line.tiers ?? []).find((tier) => tier.minQuantity > quantity) ?? null\n}\n\nfunction lineNetTotal(line: LineData) {\n return unitPriceFor(line, line.quantity) * line.quantity - (line.lineDiscountCents ?? 0)\n}\n\nfunction tierRangeLabel(tier: TierData, data: CheckoutCommerceV1Data) {\n return tier.maxQuantity > 0\n ? fill(data.labels.tierRange, { min: tier.minQuantity, max: tier.maxQuantity })\n : fill(data.labels.tierRangeFrom, { min: tier.minQuantity })\n}\n\ntype OptionItem = {\n id: string\n title: string\n detail: string\n meta: string\n previousMeta?: string\n disabled: boolean\n reason: string\n}\n\nfunction moveOptionFocus(\n event: KeyboardEvent<HTMLButtonElement>,\n index: number,\n options: OptionItem[],\n onSelect: (id: string) => void,\n) {\n const key = event.key\n let nextIndex = -1\n if (key === 'ArrowDown' || key === 'ArrowRight') nextIndex = (index + 1) % options.length\n if (key === 'ArrowUp' || key === 'ArrowLeft') nextIndex = (index - 1 + options.length) % options.length\n if (nextIndex < 0) return\n event.preventDefault()\n const next = options[nextIndex]\n if (next.disabled) return\n onSelect(next.id)\n const siblings = event.currentTarget.parentElement?.children\n const target = siblings ? siblings[nextIndex] : undefined\n if (target instanceof HTMLElement) target.focus()\n}\n\nfunction OptionGroup({\n legend,\n options,\n selectedId,\n onSelect,\n className,\n}: {\n legend: string\n options: OptionItem[]\n selectedId: string\n onSelect: (id: string) => void\n className: string\n}) {\n const uid = useId()\n const labelId = `${uid}-label`\n return (\n <div>\n <p id={labelId} className=\"text-xs font-medium text-muted-foreground\">\n {legend}\n </p>\n <div role=\"radiogroup\" aria-labelledby={labelId} className={className}>\n {options.map((option, index) => (\n <Button\n key={option.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={selectedId === option.id}\n tabIndex={selectedId === option.id ? 0 : -1}\n disabled={option.disabled}\n variant={selectedId === option.id ? 'secondary' : 'outline'}\n className=\"h-auto w-full min-w-0 justify-start whitespace-normal px-3 py-2 text-left hover:bg-muted hover:text-foreground\"\n onClick={() => onSelect(option.id)}\n onKeyDown={(event) => moveOptionFocus(event, index, options, onSelect)}\n >\n <span className=\"flex w-full min-w-0 flex-col items-start gap-0.5\">\n <span className=\"flex w-full min-w-0 items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">{option.title}</span>\n <span className=\"flex items-center gap-1.5\">\n {option.previousMeta ? (\n <span className=\"text-xs font-normal text-muted-foreground line-through\">\n {option.previousMeta}\n </span>\n ) : null}\n {option.meta ? <span className=\"text-xs font-semibold\">{option.meta}</span> : null}\n </span>\n </span>\n {option.detail ? (\n <span className=\"text-xs font-normal text-muted-foreground\">{option.detail}</span>\n ) : null}\n {option.disabled && option.reason ? (\n <span className=\"text-xs font-normal text-destructive\">{option.reason}</span>\n ) : null}\n </span>\n </Button>\n ))}\n </div>\n </div>\n )\n}\n\nfunction AddressChoices({\n legend,\n name,\n addresses,\n selectedId,\n onSelect,\n labels,\n}: {\n legend: string\n name: string\n addresses: AddressData[]\n selectedId: string\n onSelect: (id: string) => void\n labels: CheckoutCommerceV1Data[\"labels\"]\n}) {\n return (\n <fieldset>\n <legend className=\"text-sm font-medium\">{legend}</legend>\n <div className=\"mt-2 space-y-2\">\n {addresses.map((address) => (\n <label\n key={address.id}\n className=\"flex cursor-pointer items-start gap-3 rounded-md border border-border bg-background p-3\"\n >\n <input\n type=\"radio\"\n name={name}\n checked={selectedId === address.id}\n onChange={() => onSelect(address.id)}\n className=\"mt-1 size-4\"\n />\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">{address.label}</span>\n {address.isDefault ? (\n <Badge variant={VARIANT_SECONDARY}>{labels.addressDefaultBadge}</Badge>\n ) : null}\n </span>\n <span className=\"text-xs text-muted-foreground\">{address.recipient}</span>\n <span className=\"text-xs text-muted-foreground\">{addressSummary(address)}</span>\n <span className=\"text-xs text-muted-foreground\">{address.phone}</span>\n </span>\n </label>\n ))}\n </div>\n </fieldset>\n )\n}\n\nfunction AddressForm({\n labels,\n countries,\n authenticated,\n onSave,\n onCancel,\n}: {\n labels: CheckoutCommerceV1Data[\"labels\"]\n countries: CountryData[]\n authenticated: boolean\n onSave: (address: AddressData, saveToAccount: boolean) => void\n onCancel: () => void\n}) {\n const data = useBlockData()\n const emptyDraft = {\n firstName: '',\n lastName: '',\n phone: '',\n countryCode: data.countries[0].code,\n province: '',\n city: '',\n line1: '',\n line2: '',\n postalCode: '',\n instructions: '',\n}\n type DraftAddress = typeof emptyDraft\n const uid = useId()\n const [draft, setDraft] = useState<DraftAddress>(emptyDraft)\n const [saveToAccount, setSaveToAccount] = useState(authenticated)\n const [errors, setErrors] = useState<Record<string, string>>({})\n\n const country = countries.find((item) => item.code === draft.countryCode)\n const province = country?.provinces.find((item) => item.name === draft.province)\n const postalRule = country?.postalCode ?? 'hidden'\n\n function setField(key: keyof DraftAddress, value: string) {\n setDraft((current) => ({ ...current, [key]: value }))\n }\n\n function handleCountry(code: string) {\n setDraft((current) => ({ ...current, countryCode: code, province: '', city: '' }))\n }\n\n function handleProvince(name: string) {\n setDraft((current) => ({ ...current, province: name, city: '' }))\n }\n\n function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault()\n const next: Record<string, string> = {}\n if (!draft.firstName.trim()) next.firstName = labels.addressRequired\n if (!draft.lastName.trim()) next.lastName = labels.addressRequired\n if (!draft.phone.trim()) next.phone = labels.addressRequired\n if (!draft.countryCode) next.countryCode = labels.addressRequired\n if (!draft.province) next.province = labels.addressRequired\n if (!draft.city) next.city = labels.addressRequired\n if (!draft.line1.trim()) next.line1 = labels.addressRequired\n if (postalRule === 'required' && !draft.postalCode.trim()) {\n next.postalCode = labels.addressRequired\n }\n setErrors(next)\n if (Object.keys(next).length > 0) return\n\n const recipient = `${draft.firstName.trim()} ${draft.lastName.trim()}`\n onSave(\n {\n id: `created-${Date.now()}`,\n label: saveToAccount\n ? fill(labels.addressNewLabel, { city: draft.city })\n : labels.addressTemporary,\n recipient,\n line1: draft.line1.trim(),\n line2: draft.line2.trim(),\n city: draft.city,\n province: draft.province,\n postalCode: draft.postalCode.trim(),\n phone: draft.phone.trim(),\n isDefault: false,\n },\n saveToAccount,\n )\n }\n\n function field(\n key: keyof DraftAddress,\n label: string,\n type: string,\n autoComplete: string,\n requiredField: boolean,\n span: boolean,\n ) {\n const fieldId = `${uid}-${key}`\n const error = errors[key]\n return (\n <div className={span ? 'sm:col-span-2' : undefined}>\n <label htmlFor={fieldId} className=\"text-xs font-medium\">\n {label}\n </label>\n <input\n id={fieldId}\n type={type}\n autoComplete={autoComplete}\n value={draft[key]}\n required={requiredField}\n onChange={(event) => setField(key, event.target.value)}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? `${fieldId}-error` : undefined}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n />\n {error ? (\n <p id={`${fieldId}-error`} className=\"mt-1 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n )\n }\n\n return (\n <form onSubmit={handleSubmit} noValidate>\n <p className=\"text-sm font-semibold\">{labels.addressFormTitle}</p>\n <div className=\"mt-3 grid gap-3 sm:grid-cols-2\">\n {field('firstName', labels.addressFirstName, 'text', 'given-name', true, false)}\n {field('lastName', labels.addressLastName, 'text', 'family-name', true, false)}\n {field('phone', labels.addressPhone, 'tel', 'tel', true, false)}\n <div>\n <label htmlFor={`${uid}-country`} className=\"text-xs font-medium\">\n {labels.addressCountry}\n </label>\n <select\n id={`${uid}-country`}\n value={draft.countryCode}\n onChange={(event) => handleCountry(event.target.value)}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n >\n <option value={EMPTY_OPTION}>{labels.addressSelectPlaceholder}</option>\n {countries.map((item) => (\n <option key={item.code} value={item.code}>\n {item.name}\n </option>\n ))}\n </select>\n {errors.countryCode ? (\n <p className=\"mt-1 text-xs text-destructive\">{errors.countryCode}</p>\n ) : null}\n </div>\n <div>\n <label htmlFor={`${uid}-province`} className=\"text-xs font-medium\">\n {labels.addressProvince}\n </label>\n <select\n id={`${uid}-province`}\n value={draft.province}\n onChange={(event) => handleProvince(event.target.value)}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n >\n <option value={EMPTY_OPTION}>{labels.addressSelectPlaceholder}</option>\n {(country?.provinces ?? []).map((item) => (\n <option key={item.name} value={item.name}>\n {item.name}\n </option>\n ))}\n </select>\n {errors.province ? (\n <p className=\"mt-1 text-xs text-destructive\">{errors.province}</p>\n ) : null}\n </div>\n <div>\n <label htmlFor={`${uid}-city`} className=\"text-xs font-medium\">\n {labels.addressCity}\n </label>\n <select\n id={`${uid}-city`}\n value={draft.city}\n onChange={(event) => setField('city', event.target.value)}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n >\n <option value={EMPTY_OPTION}>{labels.addressSelectPlaceholder}</option>\n {(province?.cities ?? []).map((item) => (\n <option key={item} value={item}>\n {item}\n </option>\n ))}\n </select>\n {errors.city ? <p className=\"mt-1 text-xs text-destructive\">{errors.city}</p> : null}\n </div>\n {field('line1', labels.addressLine1, 'text', 'address-line1', true, true)}\n {field('line2', labels.addressLine2, 'text', 'address-line2', false, true)}\n {postalRule === 'hidden'\n ? null\n : field(\n 'postalCode',\n labels.addressPostal,\n 'text',\n 'postal-code',\n postalRule === 'required',\n false,\n )}\n <div className=\"sm:col-span-2\">\n <label htmlFor={`${uid}-instructions`} className=\"text-xs font-medium\">\n {labels.addressInstructions}\n </label>\n <textarea\n id={`${uid}-instructions`}\n rows={2}\n value={draft.instructions}\n onChange={(event) => setField('instructions', event.target.value)}\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n />\n </div>\n </div>\n {authenticated ? (\n <label className=\"mt-3 flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={saveToAccount}\n onChange={(event) => setSaveToAccount(event.target.checked)}\n className=\"size-4\"\n />\n <span>{labels.addressSaveAccount}</span>\n </label>\n ) : (\n <p className=\"mt-3 text-xs text-muted-foreground\">{labels.addressUseOnce}</p>\n )}\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button type=\"submit\" size=\"sm\">\n {labels.addressSave}\n </Button>\n <Button type=\"button\" size=\"sm\" variant={VARIANT_GHOST} onClick={onCancel}>\n {labels.addressCancel}\n </Button>\n </div>\n </form>\n )\n}\n\nfunction BuyerSection({\n uid,\n session,\n name,\n email,\n phone,\n guestConfirmed,\n authPhoneComplete,\n errors,\n onFieldChange,\n onGuestSave,\n onGuestEdit,\n onAuthPhoneSave,\n onRetrySession,\n onStartRegistration,\n}: {\n uid: string\n session: string\n name: string\n email: string\n phone: string\n guestConfirmed: boolean\n authPhoneComplete: boolean\n errors: Record<string, string>\n onFieldChange: (field: 'name' | 'email' | 'phone', value: string) => void\n onGuestSave: () => void\n onGuestEdit: () => void\n onAuthPhoneSave: () => void\n onRetrySession: () => void\n onStartRegistration?: (contact: GuestContact) => void\n}) {\n const data = useBlockData()\n const labels = data.labels\n const isGuest = session === 'guest'\n const title = isGuest ? labels.buyerTitleGuest : labels.buyerTitleAuth\n\n return (\n <section aria-labelledby={`${uid}-buyer`} aria-busy={session === 'loading'}>\n <h3\n id={`${uid}-buyer`}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {title}\n </h3>\n\n {session === 'loading' ? (\n <div className=\"mt-1\">\n <p className=\"text-xs text-muted-foreground\">{labels.sessionLoading}</p>\n <div className=\"mt-2 h-4 w-40 rounded bg-muted\" />\n </div>\n ) : session === 'error' ? (\n <div className=\"mt-1\">\n <p className=\"text-xs text-destructive\">{labels.sessionError}</p>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_OUTLINE}\n className=\"mt-1.5\"\n onClick={onRetrySession}\n >\n {labels.retryAction}\n </Button>\n </div>\n ) : !isGuest ? (\n <div>\n <p className=\"mt-1 text-sm font-medium\">{name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {[email, authPhoneComplete ? phone : ''].filter(Boolean).join(' · ')}\n </p>\n {!authPhoneComplete ? (\n <form\n className=\"mt-2\"\n onSubmit={(event) => {\n event.preventDefault()\n onAuthPhoneSave()\n }}\n noValidate\n >\n <label htmlFor={`${uid}-buyer-phone`} className=\"text-xs font-medium\">\n {labels.contactPhone}\n </label>\n <div className=\"mt-1 flex flex-wrap items-start gap-2\">\n <input\n id={`${uid}-buyer-phone`}\n type=\"tel\"\n autoComplete={AUTOCOMPLETE_TEL}\n value={phone}\n onChange={(event) => onFieldChange('phone', event.target.value)}\n aria-invalid={errors.contactPhone ? true : undefined}\n aria-describedby={\n errors.contactPhone ? `${uid}-buyer-phone-error` : undefined\n }\n className=\"h-10 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm\"\n />\n <Button type=\"submit\" size=\"sm\">\n {labels.buyerSavePhone}\n </Button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.buyerPhoneHint}</p>\n {errors.contactPhone ? (\n <p id={`${uid}-buyer-phone-error`} className=\"mt-1 text-xs text-destructive\">\n {errors.contactPhone}\n </p>\n ) : null}\n </form>\n ) : null}\n </div>\n ) : guestConfirmed ? (\n <div>\n <div className=\"mt-1 flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {[email, phone].filter(Boolean).join(' · ')}\n </p>\n </div>\n <Button type=\"button\" size=\"sm\" variant={VARIANT_OUTLINE} onClick={onGuestEdit}>\n {labels.contactEdit}\n </Button>\n </div>\n {onStartRegistration ? (\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <p className=\"text-xs text-muted-foreground\">{labels.accountOptional}</p>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n onClick={() => onStartRegistration({ name, email, phone })}\n >\n {labels.createAccount}\n </Button>\n </div>\n ) : null}\n </div>\n ) : (\n <form\n className=\"mt-2 grid gap-3 sm:grid-cols-2\"\n onSubmit={(event) => {\n event.preventDefault()\n onGuestSave()\n }}\n noValidate\n >\n <div className=\"sm:col-span-2\">\n <label htmlFor={`${uid}-buyer-name`} className=\"text-xs font-medium\">\n {labels.contactName}\n </label>\n <input\n id={`${uid}-buyer-name`}\n type=\"text\"\n autoComplete={AUTOCOMPLETE_NAME}\n value={name}\n onChange={(event) => onFieldChange('name', event.target.value)}\n aria-invalid={errors.contactName ? true : undefined}\n aria-describedby={errors.contactName ? `${uid}-buyer-name-error` : undefined}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n />\n {errors.contactName ? (\n <p id={`${uid}-buyer-name-error`} className=\"mt-1 text-xs text-destructive\">\n {errors.contactName}\n </p>\n ) : null}\n </div>\n <div>\n <label htmlFor={`${uid}-buyer-email`} className=\"text-xs font-medium\">\n {labels.contactEmail}\n </label>\n <input\n id={`${uid}-buyer-email`}\n type=\"email\"\n autoComplete={AUTOCOMPLETE_EMAIL}\n value={email}\n onChange={(event) => onFieldChange('email', event.target.value)}\n aria-invalid={errors.contactEmail ? true : undefined}\n aria-describedby={errors.contactEmail ? `${uid}-buyer-email-error` : undefined}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n />\n {errors.contactEmail ? (\n <p id={`${uid}-buyer-email-error`} className=\"mt-1 text-xs text-destructive\">\n {errors.contactEmail}\n </p>\n ) : null}\n </div>\n <div>\n <label htmlFor={`${uid}-buyer-phone`} className=\"text-xs font-medium\">\n {labels.contactPhone}\n </label>\n <input\n id={`${uid}-buyer-phone`}\n type=\"tel\"\n autoComplete={AUTOCOMPLETE_TEL}\n value={phone}\n onChange={(event) => onFieldChange('phone', event.target.value)}\n aria-invalid={errors.contactPhone ? true : undefined}\n aria-describedby={errors.contactPhone ? `${uid}-buyer-phone-error` : undefined}\n className=\"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm\"\n />\n {errors.contactPhone ? (\n <p id={`${uid}-buyer-phone-error`} className=\"mt-1 text-xs text-destructive\">\n {errors.contactPhone}\n </p>\n ) : null}\n </div>\n <div className=\"sm:col-span-2\">\n <Button type=\"submit\" size=\"sm\">\n {labels.buyerContinue}\n </Button>\n </div>\n </form>\n )}\n </section>\n )\n}\n\nfunction SummaryRow({\n label,\n value,\n emphasis,\n}: {\n label: string\n value: string\n emphasis: boolean\n}) {\n return (\n <div className=\"flex items-baseline justify-between gap-3\">\n <dt className={emphasis ? 'text-sm font-semibold' : 'text-sm text-muted-foreground'}>\n {label}\n </dt>\n <dd className={emphasis ? 'text-sm font-semibold tabular-nums' : 'text-sm tabular-nums'}>\n {value}\n </dd>\n </div>\n )\n}\n\nfunction CheckoutCommerceV1Content({\n data,\n onQuantityChange,\n onRemoveItem,\n onSelectAddress,\n onCreateAddress,\n onStartRegistration,\n onAddAssociate,\n onConfirmOrder,\n onContinueShopping,\n}: CheckoutCommerceV1Props) {\n const [scenarioId, setScenarioId] = useState(data.meta.initialScenarioId)\n const scenario = data.scenarios.find((item) => item.id === scenarioId) ?? data.scenarios[0]\n\n return (\n <div className=\"w-full\">\n <div className=\"mb-4 rounded-lg border border-border bg-muted/40 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {data.meta.demoTitle}\n </p>\n <Badge variant={VARIANT_OUTLINE}>{data.labels.demoBadge}</Badge>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-1.5\" role=\"group\" aria-label={data.labels.scenarioGroup}>\n {data.scenarios.map((item) => (\n <Button\n key={item.id}\n type=\"button\"\n size=\"sm\"\n variant={item.id === scenario.id ? 'default' : 'outline'}\n aria-pressed={item.id === scenario.id}\n aria-label={item.name}\n onClick={() => setScenarioId(item.id)}\n >\n {item.id}\n </Button>\n ))}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {fill(data.meta.demoCurrent, { name: scenario.name, blurb: scenario.blurb })}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{data.meta.demoHint}</p>\n </div>\n <CheckoutExperience\n key={scenario.id}\n scenario={scenario}\n onQuantityChange={onQuantityChange}\n onRemoveItem={onRemoveItem}\n onSelectAddress={onSelectAddress}\n onCreateAddress={onCreateAddress}\n onStartRegistration={onStartRegistration}\n onAddAssociate={onAddAssociate}\n onConfirmOrder={onConfirmOrder}\n onContinueShopping={onContinueShopping}\n />\n </div>\n )\n}\n\nfunction CheckoutExperience({\n scenario,\n onQuantityChange,\n onRemoveItem,\n onSelectAddress,\n onCreateAddress,\n onStartRegistration,\n onAddAssociate,\n onConfirmOrder,\n onContinueShopping,\n}: {\n scenario: ScenarioData\n onQuantityChange?: (lineId: string, quantity: number) => void\n onRemoveItem?: (lineId: string) => void\n onSelectAddress?: (addressId: string) => void\n onCreateAddress?: (payload: CreatedAddressPayload) => void\n onStartRegistration?: (contact: GuestContact) => void\n onAddAssociate?: (payload: AssociatePayload) => void\n onConfirmOrder?: (snapshot: OrderSnapshot) => void\n onContinueShopping?: () => void\n}) {\n const data = useBlockData()\n const uid = useId()\n const labels = data.labels\n const [lines, setLines] = useState<LineData[]>(() =>\n scenario.groups.flatMap((group) =>\n group.items.flatMap((item) => {\n const mains: LineData[] = [{ ...item, groupId: group.id }]\n const children: LineData[] = (item.associates ?? [])\n .filter((associate) => (associate.initialQuantity ?? 0) > 0)\n .map((associate) => ({\n lineId: associate.lineId,\n groupId: associate.groupId,\n title: associate.title,\n variant: associate.variant,\n image: associate.image,\n unitCents: associate.unitCents,\n quantity: associate.initialQuantity ?? 1,\n stock: associate.stock,\n isAssociate: true,\n parentLineId: item.lineId,\n associateId: associate.id,\n maxQuantity: associate.maxQuantity,\n minQuantity: associate.minQuantity ?? 1,\n maxPerMain: associate.maxPerMain ?? 0,\n overflowPolicy: associate.overflowPolicy ?? 'clamp',\n regularCents: associate.regularCents,\n discountLabel: associate.discountLabel,\n tiers: associate.tiers,\n lineDiscountCents: associate.lineDiscountCents,\n lineDiscountLabel: associate.lineDiscountLabel,\n }))\n return [...mains, ...children]\n }),\n ),\n )\n const [groupStates, setGroupStates] = useState<GroupState[]>(() =>\n scenario.groups.map((group) => ({\n id: group.id,\n mode: group.initialMode,\n shippingOptionId: group.initialShippingOptionId,\n pickupPointId: group.initialPickupPointId,\n rateState: group.rateState,\n })),\n )\n const [addressBook, setAddressBook] = useState<AddressData[]>(() => scenario.customer.addresses)\n const [shippingAddressId, setShippingAddressId] = useState(scenario.customer.defaultAddressId)\n const [addressOpen, setAddressOpen] = useState(false)\n const [addressMode, setAddressMode] = useState('list')\n const [openPanel, setOpenPanel] = useState('')\n const [addingAssociate, setAddingAssociate] = useState('')\n const [failedAdds, setFailedAdds] = useState<string[]>([])\n const [removingLine, setRemovingLine] = useState('')\n const [confirmRemoveMain, setConfirmRemoveMain] = useState('')\n const [associateNotice, setAssociateNotice] = useState<{\n mainLineId: string\n text: string\n error: boolean\n } | null>(null)\n const [assocOpen, setAssocOpen] = useState('')\n const [contactName, setContactName] = useState(scenario.customer.name)\n const [contactEmail, setContactEmail] = useState(scenario.customer.email)\n const [contactPhone, setContactPhone] = useState(scenario.customer.phone)\n const [guestConfirmed, setGuestConfirmed] = useState(false)\n const [authPhoneComplete, setAuthPhoneComplete] = useState(Boolean(scenario.customer.phone))\n const [sessionRetrying, setSessionRetrying] = useState(false)\n const [formErrors, setFormErrors] = useState<Record<string, string>>({})\n const [paymentId, setPaymentId] = useState(scenario.selectedPaymentId)\n const [billingSame, setBillingSame] = useState(scenario.sameAsShipping)\n const [billingId, setBillingId] = useState(scenario.billingAddressId)\n const [promotions, setPromotions] = useState<PromotionData[]>(() => scenario.promotions)\n const [couponOpen, setCouponOpen] = useState(false)\n const [couponCode, setCouponCode] = useState('')\n const [couponNotice, setCouponNotice] = useState<{ status: string; message: string } | null>(null)\n const [paymentOpen, setPaymentOpen] = useState(false)\n const [openTiers, setOpenTiers] = useState<string[]>([])\n const [priceUpdating, setPriceUpdating] = useState('')\n const priceTimer = useRef<number | null>(null)\n const [stockMessage, setStockMessage] = useState('')\n const [paymentError, setPaymentError] = useState(false)\n const [paymentRetried, setPaymentRetried] = useState(false)\n const [creatingOrder, setCreatingOrder] = useState(false)\n const orderTimer = useRef<number | null>(null)\n const [confirmation, setConfirmation] = useState<ConfirmationOrder | null>(null)\n\n const activeGroups = scenario.groups.filter((group) =>\n lines.some((line) => line.groupId === group.id),\n )\n const session = sessionRetrying ? 'loading' : scenario.customer.sessionState\n\n function stateFor(groupId: string) {\n return (\n groupStates.find((state) => state.id === groupId) ?? {\n id: groupId,\n mode: 'shipping',\n shippingOptionId: '',\n pickupPointId: '',\n rateState: 'pending',\n }\n )\n }\n\n const shippingAddress = addressBook.find((address) => address.id === shippingAddressId) ?? null\n\n function coverageFor(group: GroupData, addressId: string) {\n if (!addressId) return 'none'\n return (group.blockedAddresses ?? []).includes(addressId) ? 'none' : 'ok'\n }\n\n function optionFor(group: GroupData, state: GroupState) {\n return group.shippingOptions.find((option) => option.id === state.shippingOptionId) ?? null\n }\n\n function pointFor(group: GroupData, state: GroupState) {\n return group.pickupPoints.find((point) => point.id === state.pickupPointId) ?? null\n }\n\n function readiness(group: GroupData, state: GroupState) {\n if (state.rateState !== 'ready') return false\n if (state.mode === 'pickup') {\n const point = pointFor(group, state)\n return point !== null && point.available !== false\n }\n return (\n Boolean(shippingAddress) &&\n coverageFor(group, shippingAddressId) === 'ok' &&\n Boolean(optionFor(group, state))\n )\n }\n\n function feeFor(group: GroupData, state: GroupState) {\n if (state.mode === 'pickup') {\n const point = pointFor(group, state)\n return point ? Math.max(0, point.feeCents - (point.discountCents ?? 0)) : 0\n }\n const option = optionFor(group, state)\n return option ? Math.max(0, option.feeCents - (option.discountCents ?? 0)) : 0\n }\n\n function baseFeeFor(group: GroupData, state: GroupState) {\n if (state.mode === 'pickup') return pointFor(group, state)?.feeCents ?? 0\n return optionFor(group, state)?.feeCents ?? 0\n }\n\n function resolveRate(group: GroupData, addressId: string) {\n window.setTimeout(() => {\n setGroupStates((current) =>\n current.map((state) => {\n if (state.id !== group.id) return state\n const covered = state.mode === 'pickup' || coverageFor(group, addressId) === 'ok'\n return {\n ...state,\n rateState: covered ? 'ready' : 'none',\n shippingOptionId:\n state.mode === 'shipping'\n ? group.shippingOptions.some((option) => option.id === state.shippingOptionId)\n ? state.shippingOptionId\n : group.shippingOptions[0]?.id || ''\n : '',\n pickupPointId:\n state.mode === 'pickup'\n ? group.pickupPoints.some(\n (point) => point.id === state.pickupPointId && point.available !== false,\n )\n ? state.pickupPointId\n : group.pickupPoints.find((point) => point.available !== false)?.id || ''\n : '',\n }\n }),\n )\n }, 900)\n }\n\n function recalc(group: GroupData) {\n setGroupStates((current) =>\n current.map((state) => (state.id === group.id ? { ...state, rateState: 'pending' } : state)),\n )\n resolveRate(group, shippingAddressId)\n }\n\n useEffect(() => {\n scenario.groups\n .filter((group) => group.rateState === 'pending')\n .forEach((group) => resolveRate(group, scenario.customer.defaultAddressId))\n // The pending hand-off runs once per mounted scenario; later re-rates go\n // through recalc/selectMode from their own handlers.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(\n () => () => {\n if (orderTimer.current) window.clearTimeout(orderTimer.current)\n },\n [],\n )\n\n function selectMode(group: GroupData, mode: string) {\n const covered = mode === 'pickup' || coverageFor(group, shippingAddressId) === 'ok'\n setGroupStates((current) =>\n current.map((state) =>\n state.id === group.id\n ? {\n ...state,\n mode,\n rateState: covered ? 'pending' : 'none',\n }\n : state,\n ),\n )\n if (covered) resolveRate(group, shippingAddressId)\n }\n\n function chooseShippingOption(group: GroupData, optionId: string) {\n setGroupStates((current) =>\n current.map((state) =>\n state.id === group.id\n ? { ...state, mode: 'shipping', shippingOptionId: optionId, rateState: 'ready' }\n : state,\n ),\n )\n setOpenPanel('')\n }\n\n function choosePickupPoint(group: GroupData, pointId: string) {\n const point = group.pickupPoints.find((item) => item.id === pointId)\n if (!point || point.available === false) return\n setGroupStates((current) =>\n current.map((state) =>\n state.id === group.id\n ? { ...state, mode: 'pickup', pickupPointId: pointId, rateState: 'ready' }\n : state,\n ),\n )\n setOpenPanel('')\n }\n\n function revalidateShipping(addressId: string) {\n activeGroups.forEach((group) => {\n const state = stateFor(group.id)\n if (state.mode !== 'shipping') return\n setGroupStates((current) =>\n current.map((entry) =>\n entry.id === group.id ? { ...entry, rateState: 'pending' } : entry,\n ),\n )\n resolveRate(group, addressId)\n })\n }\n\n function selectShippingAddress(addressId: string) {\n setShippingAddressId(addressId)\n setAddressOpen(false)\n setAddressMode('list')\n onSelectAddress?.(addressId)\n revalidateShipping(addressId)\n }\n\n function openAddressEditor() {\n setAddressOpen(true)\n setAddressMode(addressBook.length === 0 ? 'new' : 'list')\n window.setTimeout(() => {\n document.getElementById(`${uid}-address-panel`)?.scrollIntoView({ block: 'center' })\n }, 60)\n }\n\n function saveNewAddress(address: AddressData, saveToAccount: boolean) {\n const nextAddress = {\n ...address,\n label: saveToAccount ? address.label : labels.addressTemporary,\n isDefault: addressBook.length === 0,\n }\n setAddressBook((current) => [...current, nextAddress])\n setShippingAddressId(nextAddress.id)\n setAddressOpen(false)\n setAddressMode('list')\n onCreateAddress?.({ ...nextAddress, saveToAccount })\n revalidateShipping(nextAddress.id)\n }\n\n function associatesFor(mainLineId: string): AssociateData[] {\n for (const group of scenario.groups) {\n const item = group.items.find((entry) => entry.lineId === mainLineId)\n if (item?.associates) return item.associates\n }\n return []\n }\n\n function mainQuantityFor(line: LineData) {\n if (!line.parentLineId) return line.quantity\n return lines.find((entry) => entry.lineId === line.parentLineId)?.quantity ?? line.quantity\n }\n\n function associateMaxFor(line: LineData, mainQuantity: number) {\n const base = line.maxQuantity ?? line.stock\n const perMain = line.maxPerMain ?? 0\n return Math.min(line.stock, Math.max(0, base + Math.max(0, mainQuantity - 1) * perMain))\n }\n\n function associateDefMax(def: AssociateData, mainQuantity: number) {\n const perMain = def.maxPerMain ?? 0\n return Math.min(\n def.stock,\n Math.max(0, def.maxQuantity + Math.max(0, mainQuantity - 1) * perMain),\n )\n }\n\n function associateDiscountFor(unitCents: number, regularCents?: number) {\n const regular = regularCents ?? 0\n if (regular <= unitCents) return null\n const amountCents = regular - unitCents\n return { amountCents, percent: Math.round((amountCents / regular) * 100) }\n }\n\n function orderGroupLines(groupLines: LineData[]) {\n const ordered: LineData[] = []\n const placed = new Set<string>()\n for (const main of groupLines) {\n if (main.isAssociate) continue\n ordered.push(main)\n placed.add(main.lineId)\n for (const child of groupLines) {\n if (child.parentLineId === main.lineId) {\n ordered.push(child)\n placed.add(child.lineId)\n }\n }\n }\n for (const line of groupLines) {\n if (!placed.has(line.lineId)) ordered.push(line)\n }\n return ordered\n }\n\n function refreshGroup(groupId: string) {\n const group = scenario.groups.find((entry) => entry.id === groupId)\n if (!group) return\n if (stateFor(groupId).mode !== 'shipping') return\n setGroupStates((current) =>\n current.map((state) => (state.id === groupId ? { ...state, rateState: 'pending' } : state)),\n )\n resolveRate(group, shippingAddressId)\n }\n\n function applyAssociatePolicy(nextLines: LineData[], main: LineData, nextQuantity: number) {\n let result = nextLines\n let notice: { mainLineId: string; text: string; error: boolean } | null = null\n const children = nextLines.filter((entry) => entry.parentLineId === main.lineId)\n const removed: LineData[] = []\n for (const child of children) {\n const max = associateMaxFor(child, nextQuantity)\n const min = child.minQuantity ?? 1\n if (child.quantity <= max) continue\n if ((child.overflowPolicy ?? 'clamp') === 'remove' || max < min) {\n result = result.filter((entry) => entry.lineId !== child.lineId)\n removed.push(child)\n notice = {\n mainLineId: main.lineId,\n text: fill(labels.associateRemoved, { name: child.title }),\n error: false,\n }\n } else {\n result = result.map((entry) =>\n entry.lineId === child.lineId ? { ...entry, quantity: max } : entry,\n )\n onQuantityChange?.(child.lineId, max)\n notice = {\n mainLineId: main.lineId,\n text: fill(labels.associateAdjusted, { name: child.title, count: max }),\n error: false,\n }\n }\n }\n removed.forEach((child) => {\n onRemoveItem?.(child.lineId)\n })\n return { lines: result, notice }\n }\n\n function changeQuantity(lineId: string, next: number) {\n const line = lines.find((item) => item.lineId === lineId)\n if (!line) return\n if (line.isAssociate) {\n const max = associateMaxFor(line, mainQuantityFor(line))\n const min = line.minQuantity ?? 1\n if (min === 0 && next === 0) {\n requestRemoveLine(line)\n return\n }\n if (next < min) return\n if (next > max) {\n setAssociateNotice({\n mainLineId: line.parentLineId ?? '',\n text: fill(labels.associateMax, { count: max }),\n error: false,\n })\n return\n }\n } else {\n if (next < 1 || line.stock < 1) return\n if (next > line.stock) {\n setStockMessage(fill(labels.stockMax, { name: line.title }))\n return\n }\n }\n setStockMessage('')\n setAssociateNotice(null)\n const nextLines = lines.map((item) =>\n item.lineId === lineId ? { ...item, quantity: next } : item,\n )\n const adjusted = line.isAssociate\n ? { lines: nextLines, notice: null }\n : applyAssociatePolicy(nextLines, line, next)\n setLines(adjusted.lines)\n if (adjusted.notice) setAssociateNotice(adjusted.notice)\n setPriceUpdating(lineId)\n if (priceTimer.current) window.clearTimeout(priceTimer.current)\n priceTimer.current = window.setTimeout(() => setPriceUpdating(''), 500)\n onQuantityChange?.(lineId, next)\n }\n\n function addAssociate(main: LineData, def: AssociateData) {\n if (addingAssociate) return\n if (def.eligible === false || def.stock < 1) return\n const max = associateDefMax(def, main.quantity)\n if (max < 1) return\n setAssociateNotice(null)\n setAddingAssociate(def.id)\n window.setTimeout(() => {\n if (def.simulateFailure && !failedAdds.includes(def.id)) {\n setFailedAdds((current) => [...current, def.id])\n setAddingAssociate('')\n setAssociateNotice({\n mainLineId: main.lineId,\n text: fill(labels.associateAddError, { name: def.title }),\n error: true,\n })\n return\n }\n const quantity = Math.max(1, def.minQuantity ?? 1)\n const nextLine: LineData = {\n lineId: def.lineId,\n groupId: def.groupId,\n title: def.title,\n variant: def.variant,\n image: def.image,\n unitCents: def.unitCents,\n quantity,\n stock: def.stock,\n isAssociate: true,\n parentLineId: main.lineId,\n associateId: def.id,\n maxQuantity: def.maxQuantity,\n minQuantity: def.minQuantity ?? 1,\n maxPerMain: def.maxPerMain ?? 0,\n overflowPolicy: def.overflowPolicy ?? 'clamp',\n regularCents: def.regularCents,\n discountLabel: def.discountLabel,\n tiers: def.tiers,\n lineDiscountCents: def.lineDiscountCents,\n lineDiscountLabel: def.lineDiscountLabel,\n }\n setLines((current) =>\n current.some((entry) => entry.lineId === def.lineId) ? current : [...current, nextLine],\n )\n setAddingAssociate('')\n setAssocOpen('')\n onAddAssociate?.({\n associateId: def.id,\n parentLineId: main.lineId,\n lineId: def.lineId,\n groupId: def.groupId,\n quantity,\n unitCents: def.unitCents,\n })\n refreshGroup(def.groupId)\n }, 500)\n }\n\n function removeWithPending(mainLineId: string, ids: string[], mainName: string) {\n setRemovingLine(mainLineId)\n window.setTimeout(() => {\n const removed = lines.filter((entry) => ids.includes(entry.lineId))\n const groups = [...new Set(removed.map((entry) => entry.groupId))]\n setLines((current) => current.filter((entry) => !ids.includes(entry.lineId)))\n removed.forEach((entry) => onRemoveItem?.(entry.lineId))\n if (ids.length > 1) {\n setAssociateNotice({\n mainLineId: '',\n text: fill(labels.associateMainRemoved, {\n name: mainName,\n count: ids.length - 1,\n }),\n error: false,\n })\n }\n groups.forEach((groupId) => {\n if (lines.some((entry) => entry.groupId === groupId && !ids.includes(entry.lineId))) {\n refreshGroup(groupId)\n }\n })\n setRemovingLine('')\n setConfirmRemoveMain('')\n }, 250)\n }\n\n function requestRemoveLine(line: LineData) {\n if (line.isAssociate) {\n removeWithPending(line.lineId, [line.lineId], line.title)\n return\n }\n const children = lines.filter((entry) => entry.parentLineId === line.lineId)\n if (children.length > 0) {\n setConfirmRemoveMain(line.lineId)\n return\n }\n removeWithPending(line.lineId, [line.lineId], line.title)\n }\n\n function confirmRemoveMainLine(line: LineData) {\n const ids = [\n line.lineId,\n ...lines.filter((entry) => entry.parentLineId === line.lineId).map((entry) => entry.lineId),\n ]\n removeWithPending(line.lineId, ids, line.title)\n }\n\n function changeBuyerField(field: 'name' | 'email' | 'phone', value: string) {\n const errorKey =\n field === 'name' ? 'contactName' : field === 'email' ? 'contactEmail' : 'contactPhone'\n if (field === 'name') setContactName(value)\n if (field === 'email') setContactEmail(value)\n if (field === 'phone') setContactPhone(value)\n setFormErrors((current) => {\n const next = { ...current }\n delete next[errorKey]\n return next\n })\n }\n\n function validateGuestContact() {\n const next: Record<string, string> = {}\n if (!contactName.trim()) next.contactName = labels.contactNameMissing\n if (!contactEmail.trim() || !contactEmail.includes('@')) next.contactEmail = labels.contactMissing\n if (!contactPhone.trim()) next.contactPhone = labels.contactPhoneMissing\n setFormErrors(next)\n return Object.keys(next).length === 0\n }\n\n function saveGuestContact() {\n if (!validateGuestContact()) {\n setGuestConfirmed(false)\n return\n }\n setGuestConfirmed(true)\n }\n\n function saveAuthPhone() {\n if (!contactPhone.trim()) {\n setFormErrors({ contactPhone: labels.contactPhoneMissing })\n return\n }\n setFormErrors({})\n setAuthPhoneComplete(true)\n }\n\n function retrySession() {\n setSessionRetrying(true)\n window.setTimeout(() => setSessionRetrying(false), 800)\n }\n\n function toggleTiers(lineId: string) {\n setOpenTiers((current) =>\n current.includes(lineId)\n ? current.filter((value) => value !== lineId)\n : [...current, lineId],\n )\n }\n\n const subtotal = lines.reduce((sum, line) => sum + lineNetTotal(line), 0)\n const promotionsTotal = promotions.reduce((sum, promotion) => sum + promotion.amountCents, 0)\n const tax = Math.max(\n 0,\n Math.round(((subtotal - promotionsTotal) * scenario.taxRateBps) / 10000),\n )\n const pickupCount = activeGroups.filter((group) => stateFor(group.id).mode === 'pickup').length\n const unitCount = lines.reduce((sum, line) => sum + line.quantity, 0)\n const hasUnavailable = lines.some((line) => line.stock < 1)\n\n let shippingFees = 0\n let pickupFees = 0\n activeGroups.forEach((group) => {\n const state = stateFor(group.id)\n if (!readiness(group, state)) return\n if (state.mode === 'pickup') pickupFees += feeFor(group, state)\n else shippingFees += feeFor(group, state)\n })\n\n const pendingGroups = activeGroups.filter((group) => !readiness(group, stateFor(group.id)))\n const pending = pendingGroups.length > 0\n const total =\n subtotal - promotionsTotal + tax + shippingFees + pickupFees + scenario.extraCents\n\n const paymentMethods = scenario.paymentIds\n .map((id) => data.paymentMethods.find((method) => method.id === id))\n .filter((method): method is PaymentData => Boolean(method))\n const anyPickup = pickupCount > 0\n const usable = (method: PaymentData) => method.enabled && !(method.kind === 'cash' && anyPickup)\n const firstUsable = paymentMethods.find(usable)\n const selectedMethod = paymentMethods.find((method) => method.id === paymentId)\n const activePaymentId =\n selectedMethod && usable(selectedMethod) ? selectedMethod.id : firstUsable?.id ?? ''\n const activeMethod = paymentMethods.find((method) => method.id === activePaymentId) ?? null\n const paymentNotice =\n selectedMethod && !usable(selectedMethod)\n ? selectedMethod.kind === 'cash'\n ? labels.paymentCashPickup\n : selectedMethod.reason\n : ''\n const paymentOptions: OptionItem[] = paymentMethods.map((method) => {\n const enabled = usable(method)\n return {\n id: method.id,\n title: method.label,\n detail: method.detail,\n meta: method.kind === 'cash' && !enabled ? labels.paymentUnavailable : '',\n disabled: !enabled,\n reason: enabled ? '' : method.kind === 'cash' ? labels.paymentCashPickup : method.reason,\n }\n })\n\n const appliedCoupon = promotions.find((promotion) => promotion.kind === 'coupon') ?? null\n\n const requiresShipping = activeGroups.some((group) => stateFor(group.id).mode === 'shipping')\n const missingAddress = requiresShipping && !shippingAddress\n const sessionBlocked = session === 'loading' || session === 'error'\n const canConfirm =\n lines.length > 0 && !pending && activePaymentId !== '' && !hasUnavailable && !sessionBlocked\n const blockedMessage =\n lines.length === 0\n ? labels.confirmBlockedCart\n : sessionBlocked\n ? labels.confirmBlockedSession\n : hasUnavailable\n ? labels.confirmBlockedStock\n : missingAddress\n ? labels.confirmBlockedAddress\n : pending\n ? labels.confirmBlockedRate\n : activePaymentId === ''\n ? labels.confirmBlockedPayment\n : labels.confirmNote\n\n function buildConfirmationOrder(reference: string): ConfirmationOrder {\n const orderGroups = activeGroups.map((group) => {\n const state = stateFor(group.id)\n const option = optionFor(group, state)\n const point = pointFor(group, state)\n const groupLines = orderGroupLines(lines.filter((line) => line.groupId === group.id))\n return {\n id: group.id,\n title: group.title,\n modeLabel: state.mode === 'pickup' ? labels.modePickup : labels.modeShipping,\n methodLabel: state.mode === 'pickup' ? point?.label ?? '' : option?.label ?? '',\n detailLabel:\n state.mode === 'pickup'\n ? point\n ? pickupDetail(point)\n : ''\n : option?.eta ?? '',\n feeCents: readiness(group, state) ? feeFor(group, state) : 0,\n lines: groupLines.map((line) => ({ ...line })),\n }\n })\n const billingAddress = billingSame\n ? shippingAddress\n : addressBook.find((address) => address.id === billingId) ?? null\n return {\n reference,\n totalCents: total,\n subtotalCents: subtotal,\n unitCount,\n promotions: promotions.map((promotion) => ({ ...promotion })),\n taxCents: tax,\n taxRateBps: scenario.taxRateBps,\n shippingCents: shippingFees,\n pickupCents: pickupFees,\n extraCents: scenario.extraCents,\n extraLabel: scenario.extraLabel,\n groups: orderGroups,\n address: requiresShipping && shippingAddress ? { ...shippingAddress } : null,\n paymentLabel: activeMethod?.label ?? '',\n paymentDetail: activeMethod?.detail ?? '',\n billingLabel: billingAddress\n ? billingSame && shippingAddress\n ? labels.confirmationBillingSame\n : billingAddress.label\n : '',\n billingDetail: billingAddress ? addressSummary(billingAddress) : '',\n customerName: contactName,\n customerEmail: contactEmail,\n }\n }\n\n function completeOrder() {\n if (creatingOrder || orderTimer.current) return\n const reference = data.meta.confirmationCode\n const order = buildConfirmationOrder(reference)\n setPaymentError(false)\n setCreatingOrder(true)\n if (orderTimer.current) window.clearTimeout(orderTimer.current)\n orderTimer.current = window.setTimeout(() => {\n orderTimer.current = null\n setCreatingOrder(false)\n setConfirmation(order)\n onConfirmOrder?.({\n reference,\n totalCents: order.totalCents,\n paymentId: activePaymentId,\n groupIds: order.groups.map((group) => group.id),\n })\n }, 700)\n }\n\n function handleConfirm() {\n if (!canConfirm || creatingOrder) return\n if (session === 'guest' && !validateGuestContact()) {\n setGuestConfirmed(false)\n return\n }\n if (session === 'authenticated' && !contactPhone.trim()) {\n setFormErrors({ contactPhone: labels.contactPhoneMissing })\n return\n }\n if (sessionBlocked) return\n setFormErrors({})\n if (session === 'guest') setGuestConfirmed(true)\n if (scenario.simulateFailure && !paymentRetried) {\n setPaymentError(true)\n return\n }\n completeOrder()\n }\n\n function retryPayment() {\n setPaymentRetried(true)\n setPaymentError(false)\n completeOrder()\n }\n\n function applyCoupon() {\n const code = couponCode.trim().toUpperCase()\n if (!code) return\n const coupon = data.coupons.find((item) => item.code === code)\n if (!coupon) {\n setCouponNotice({ status: 'invalid', message: labels.promoInvalid })\n return\n }\n if (coupon.outcome !== 'valid') {\n setCouponNotice({ status: coupon.outcome, message: coupon.message })\n return\n }\n setPromotions((current) => [\n ...current.filter((promotion) => promotion.kind !== 'coupon'),\n {\n id: `coupon-${coupon.code.toLowerCase()}`,\n label: coupon.label,\n kind: 'coupon',\n amountCents: coupon.amountCents,\n code: coupon.code,\n },\n ])\n setCouponCode('')\n setCouponNotice({ status: 'applied', message: fill(labels.promoApplied, { code: coupon.code }) })\n }\n\n function removeCoupon() {\n setPromotions((current) => current.filter((promotion) => promotion.kind !== 'coupon'))\n setCouponNotice(null)\n }\n\n if (scenario.loading) {\n return (\n <div aria-busy=\"true\">\n <p className=\"text-sm text-muted-foreground\">{data.meta.loadingLabel}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.sessionLoading}</p>\n <div className=\"mt-4 space-y-3\">\n <div className=\"h-24 rounded-lg bg-muted\" />\n <div className=\"h-24 rounded-lg bg-muted\" />\n <div className=\"h-24 rounded-lg bg-muted\" />\n </div>\n </div>\n )\n }\n\n if (creatingOrder) {\n return (\n <section\n aria-busy=\"true\"\n aria-labelledby={`${uid}-creating`}\n aria-live=\"polite\"\n role=\"status\"\n className=\"mx-auto flex w-full max-w-md flex-col items-center rounded-xl border border-border bg-card p-8 text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted\"\n >\n <span className=\"h-5 w-5 animate-spin rounded-full border-2 border-muted-foreground border-t-transparent\" />\n </span>\n <h2 id={`${uid}-creating`} className=\"mt-4 text-xl font-semibold tracking-tight\">\n {labels.confirmationCreating}\n </h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{labels.confirmationCreatingNote}</p>\n <dl className=\"mt-4 w-full rounded-lg bg-muted/40 px-3 py-2\">\n <SummaryRow label={labels.total} value={money(total, data)} emphasis />\n </dl>\n </section>\n )\n }\n\n if (confirmation) {\n const itemsLabel = countLabel(\n confirmation.unitCount,\n labels.summaryItemOne,\n fill(labels.summaryItems, { count: confirmation.unitCount }),\n )\n const deliveriesLabel = countLabel(\n confirmation.groups.length,\n labels.deliveriesOne,\n fill(labels.deliveriesMany, { count: confirmation.groups.length }),\n )\n const orderSteps = [\n {\n title: labels.confirmationNextOneTitle,\n body: labels.confirmationNextOneBody,\n },\n {\n title: labels.confirmationNextTwoTitle,\n body: labels.confirmationNextTwoBody,\n },\n {\n title: labels.confirmationNextThreeTitle,\n body: labels.confirmationNextThreeBody,\n },\n ]\n return (\n <div className=\"mx-auto flex w-full max-w-2xl flex-col gap-4\">\n <section\n aria-labelledby={`${uid}-confirmed`}\n className=\"rounded-xl border border-success/40 bg-card p-5 sm:p-6\"\n >\n <div className=\"flex items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-success/10 text-base font-semibold text-success\"\n >\n {labels.checkSymbol}\n </span>\n <div className=\"min-w-0\">\n <Badge variant={VARIANT_SECONDARY}>{data.meta.confirmationBadge}</Badge>\n <h2\n id={`${uid}-confirmed`}\n className=\"mt-2 text-xl font-semibold tracking-tight\"\n >\n {data.meta.confirmationTitle}\n </h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {fill(data.meta.confirmationBody, { name: confirmation.customerName })}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {fill(labels.confirmationEmailNote, { email: confirmation.customerEmail })}\n </p>\n </div>\n </div>\n <dl className=\"mt-4 grid gap-2 rounded-lg bg-muted/40 px-3 py-2 sm:grid-cols-2\">\n <div>\n <dt className=\"text-xs text-muted-foreground\">\n {data.meta.confirmationReference}\n </dt>\n <dd className=\"text-sm font-medium tabular-nums\">{confirmation.reference}</dd>\n </div>\n <div className=\"sm:text-right\">\n <dt className=\"text-xs text-muted-foreground\">{data.meta.confirmationTotal}</dt>\n <dd className=\"text-sm font-semibold tabular-nums\">\n {money(confirmation.totalCents, data)}\n </dd>\n </div>\n </dl>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {labels.confirmationReferenceNote}\n </p>\n </section>\n\n <section\n aria-labelledby={`${uid}-next`}\n className=\"rounded-xl border border-border bg-card p-5\"\n >\n <h3 id={`${uid}-next`} className=\"text-sm font-semibold\">\n {labels.confirmationNextTitle}\n </h3>\n <ol className=\"mt-3 space-y-3\">\n {orderSteps.map((step, index) => (\n <li key={step.title} className=\"flex gap-3\">\n <span\n aria-hidden=\"true\"\n className={\n index === 0\n ? 'flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-success/10 text-xs font-semibold text-success'\n : 'flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-xs font-medium text-muted-foreground'\n }\n >\n {index + 1}\n </span>\n <div>\n <p className=\"text-sm font-medium\">{step.title}</p>\n <p className=\"text-xs text-muted-foreground\">{step.body}</p>\n </div>\n </li>\n ))}\n </ol>\n </section>\n\n <section\n aria-labelledby={`${uid}-order`}\n className=\"rounded-xl border border-border bg-card\"\n >\n <div className=\"flex flex-wrap items-baseline justify-between gap-2 border-b border-border px-4 py-3\">\n <h3 id={`${uid}-order`} className=\"text-sm font-semibold\">\n {labels.confirmationOrderTitle}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {fill(labels.purchaseBreakdown, {\n items: itemsLabel,\n deliveries: deliveriesLabel,\n })}\n </p>\n </div>\n <div className=\"divide-y divide-border\">\n {confirmation.groups.map((group) => {\n const methodLine = [group.modeLabel, group.methodLabel, group.detailLabel]\n .filter(Boolean)\n .join(' · ')\n return (\n <div key={group.id} className=\"px-4 py-3\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{group.title}</p>\n <p className=\"text-xs text-muted-foreground\">{methodLine}</p>\n </div>\n <p className=\"text-xs tabular-nums text-muted-foreground\">\n {group.feeCents === 0 ? labels.groupFree : money(group.feeCents, data)}\n </p>\n </div>\n <ul className=\"mt-2 space-y-2\">\n {group.lines.map((line) => {\n const unitPrice = unitPriceFor(line, line.quantity)\n return (\n <li\n key={line.lineId}\n className={line.isAssociate ? 'border-l border-border pl-3' : ''}\n >\n <div className=\"flex items-start gap-2.5\">\n <img\n src={line.image ?? PRODUCT_IMAGE_FALLBACK}\n alt={line.title}\n width={40}\n height={40}\n className=\"h-10 w-10 shrink-0 rounded-md border border-border object-cover\"\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <p className=\"text-sm font-medium\">\n {line.title}\n {line.isAssociate ? (\n <span className=\"ml-1.5 text-xs font-normal text-muted-foreground\">\n {labels.confirmationAssociateTag}\n </span>\n ) : null}\n </p>\n <p className=\"text-xs text-muted-foreground\">{line.variant}</p>\n <p className=\"text-xs text-muted-foreground\">\n {fill(labels.confirmationQuantity, {\n count: line.quantity,\n price: money(unitPrice, data),\n })}\n </p>\n {(line.lineDiscountCents ?? 0) > 0 ? (\n <p className=\"text-xs text-success\">\n {fill(labels.lineDiscount, {\n label: line.lineDiscountLabel ?? '',\n amount: money(line.lineDiscountCents ?? 0, data),\n })}\n </p>\n ) : null}\n </div>\n <p className=\"shrink-0 text-sm font-medium tabular-nums\">\n {money(lineNetTotal(line), data)}\n </p>\n </div>\n </li>\n )\n })}\n </ul>\n </div>\n )\n })}\n </div>\n </section>\n\n <section\n aria-labelledby={`${uid}-details`}\n className=\"rounded-xl border border-border bg-card p-4\"\n >\n <h3 id={`${uid}-details`} className=\"text-sm font-semibold\">\n {labels.confirmationDetailsTitle}\n </h3>\n <div className=\"mt-3 divide-y divide-border\">\n {confirmation.address ? (\n <div className=\"py-3 first:pt-0 last:pb-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {labels.addressDelivery}\n </p>\n <p className=\"mt-1 text-sm font-medium\">{confirmation.address.label}</p>\n <p className=\"text-xs text-muted-foreground\">\n {addressSummary(confirmation.address)}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {`${confirmation.address.recipient} · ${confirmation.address.phone}`}\n </p>\n </div>\n ) : null}\n <div className=\"py-3 first:pt-0 last:pb-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {labels.paymentTitle}\n </p>\n <p className=\"mt-1 text-sm font-medium\">{confirmation.paymentLabel}</p>\n {confirmation.paymentDetail ? (\n <p className=\"text-xs text-muted-foreground\">{confirmation.paymentDetail}</p>\n ) : null}\n </div>\n {confirmation.billingLabel ? (\n <div className=\"py-3 first:pt-0 last:pb-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {labels.billingTitle}\n </p>\n <p className=\"mt-1 text-sm font-medium\">{confirmation.billingLabel}</p>\n {confirmation.billingDetail ? (\n <p className=\"text-xs text-muted-foreground\">{confirmation.billingDetail}</p>\n ) : null}\n </div>\n ) : null}\n </div>\n </section>\n\n <section\n aria-labelledby={`${uid}-totals`}\n className=\"rounded-xl border border-border bg-card p-4\"\n >\n <h3 id={`${uid}-totals`} className=\"text-sm font-semibold\">\n {labels.summaryTitle}\n </h3>\n <dl className=\"mt-3 space-y-2\">\n <SummaryRow\n label={labels.subtotal}\n value={money(confirmation.subtotalCents, data)}\n emphasis={false}\n />\n {confirmation.promotions.map((promotion) => (\n <SummaryRow\n key={promotion.id}\n label={promotion.label}\n value={`- ${money(promotion.amountCents, data)}`}\n emphasis={false}\n />\n ))}\n <SummaryRow\n label={fill(labels.tax, { rate: String(confirmation.taxRateBps / 100) })}\n value={money(confirmation.taxCents, data)}\n emphasis={false}\n />\n {confirmation.shippingCents > 0 ? (\n <SummaryRow\n label={labels.shippingCost}\n value={money(confirmation.shippingCents, data)}\n emphasis={false}\n />\n ) : null}\n {confirmation.pickupCents > 0 ? (\n <SummaryRow\n label={labels.pickupCost}\n value={money(confirmation.pickupCents, data)}\n emphasis={false}\n />\n ) : null}\n {confirmation.extraCents > 0 ? (\n <SummaryRow\n label={confirmation.extraLabel || labels.extraCost}\n value={money(confirmation.extraCents, data)}\n emphasis={false}\n />\n ) : null}\n </dl>\n <dl className=\"mt-2 border-t border-border pt-2\">\n <SummaryRow\n label={labels.total}\n value={money(confirmation.totalCents, data)}\n emphasis\n />\n </dl>\n <p className=\"mt-2 text-xs text-muted-foreground\">{labels.totalDemoNote}</p>\n </section>\n\n <div className=\"flex justify-end\">\n <Button\n type=\"button\"\n size=\"lg\"\n className=\"w-full sm:w-auto\"\n onClick={onContinueShopping}\n >\n {data.meta.confirmationCta}\n </Button>\n </div>\n </div>\n )\n }\n\n if (lines.length === 0) {\n return (\n <section\n aria-labelledby={`${uid}-empty`}\n className=\"rounded-xl border border-border bg-card p-8 text-center\"\n >\n <h2 id={`${uid}-empty`} className=\"text-xl font-semibold tracking-tight\">\n {data.meta.emptyTitle}\n </h2>\n <p className=\"mx-auto mt-2 max-w-sm text-sm text-muted-foreground\">\n {data.meta.emptyBody}\n </p>\n <div className=\"mt-5\">\n <Button type=\"button\" onClick={onContinueShopping}>\n {data.meta.emptyCta}\n </Button>\n </div>\n </section>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-5\">\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight\">{data.meta.title}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {fill(labels.purchaseBreakdown, {\n items: countLabel(\n unitCount,\n labels.summaryItemOne,\n fill(labels.summaryItems, { count: unitCount }),\n ),\n deliveries: countLabel(\n activeGroups.length,\n labels.deliveriesOne,\n fill(labels.deliveriesMany, { count: activeGroups.length }),\n ),\n })}\n </p>\n </div>\n\n <div className=\"sticky top-0 z-10 flex items-center justify-between gap-3 rounded-xl border border-border bg-card/95 p-3 backdrop-blur md:hidden\">\n <div>\n <p className=\"text-xs text-muted-foreground\">\n {pending ? labels.totalPending : labels.total}\n </p>\n <p className=\"text-base font-semibold tabular-nums\">\n {pending ? labels.overviewPending : money(total, data)}\n </p>\n </div>\n <Button type=\"button\" disabled={!canConfirm || creatingOrder} onClick={handleConfirm}>\n {creatingOrder ? labels.confirmationCreating : labels.confirm}\n </Button>\n </div>\n\n <div className=\"md:grid md:grid-cols-5 md:items-start md:gap-6\">\n <div className=\"flex flex-col gap-5 md:col-span-3\">\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"px-4 py-3\">\n <BuyerSection\n uid={uid}\n session={session}\n name={contactName}\n email={contactEmail}\n phone={contactPhone}\n guestConfirmed={guestConfirmed}\n authPhoneComplete={authPhoneComplete}\n errors={formErrors}\n onFieldChange={changeBuyerField}\n onGuestSave={saveGuestContact}\n onGuestEdit={() => {\n setGuestConfirmed(false)\n setFormErrors({})\n }}\n onAuthPhoneSave={saveAuthPhone}\n onRetrySession={retrySession}\n onStartRegistration={onStartRegistration}\n />\n </div>\n <div className=\"border-t border-border px-4 py-3\">\n <section aria-labelledby={`${uid}-shipping-address`}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3\n id={`${uid}-shipping-address`}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {labels.addressTitle}\n </h3>\n {!requiresShipping ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.pickupOnlyAddress}</p>\n ) : shippingAddress ? (\n <>\n <p className=\"mt-1 text-sm font-medium\">{addressHeadline(shippingAddress)}</p>\n <p className=\"text-xs text-muted-foreground\">{addressSummary(shippingAddress)}</p>\n {shippingAddress.recipient !== contactName ||\n shippingAddress.phone !== contactPhone ? (\n <p className=\"text-xs text-muted-foreground\">\n {[shippingAddress.recipient, shippingAddress.phone]\n .filter(Boolean)\n .join(' · ')}\n </p>\n ) : null}\n </>\n ) : (\n <p className=\"mt-1 text-sm text-destructive\">{labels.groupNeedsAddress}</p>\n )}\n </div>\n {requiresShipping ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_OUTLINE}\n aria-expanded={addressOpen}\n aria-controls={`${uid}-address-panel`}\n onClick={() => (addressOpen ? setAddressOpen(false) : openAddressEditor())}\n >\n {shippingAddress ? labels.changeAction : labels.groupAddAddress}\n </Button>\n ) : null}\n </div>\n\n {addressOpen && requiresShipping ? (\n <div\n id={`${uid}-address-panel`}\n className=\"mt-3 rounded-lg border border-border bg-muted/30 p-3\"\n >\n {addressMode === 'new' ? (\n <AddressForm\n labels={labels}\n countries={data.countries}\n authenticated={scenario.customer.sessionState === 'authenticated'}\n onSave={saveNewAddress}\n onCancel={() =>\n addressBook.length === 0 ? setAddressOpen(false) : setAddressMode('list')\n }\n />\n ) : (\n <>\n <AddressChoices\n legend={labels.addressSelectTitle}\n name={`${uid}-shipping-address`}\n addresses={addressBook}\n selectedId={shippingAddressId}\n onSelect={selectShippingAddress}\n labels={labels}\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_OUTLINE}\n onClick={() => setAddressMode('new')}\n >\n {labels.addressNew}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_GHOST}\n onClick={() => setAddressOpen(false)}\n >\n {labels.addressCancel}\n </Button>\n </div>\n </>\n )}\n </div>\n ) : null}\n </section>\n </div>\n </div>\n\n <section aria-labelledby={`${uid}-groups`}>\n <div className=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h3 id={`${uid}-groups`} className=\"text-sm font-semibold\">\n {labels.groupsTitle}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {countLabel(\n activeGroups.length,\n labels.deliveriesOne,\n fill(labels.deliveriesMany, { count: activeGroups.length }),\n )}\n </p>\n </div>\n <p aria-live=\"polite\" className=\"mt-1 text-xs text-destructive\">\n {stockMessage}\n </p>\n {associateNotice && associateNotice.mainLineId === '' ? (\n <p\n aria-live=\"polite\"\n className={\n associateNotice.error\n ? 'mt-1 text-xs text-destructive'\n : 'mt-1 text-xs text-muted-foreground'\n }\n >\n {associateNotice.text}\n </p>\n ) : null}\n\n <div className=\"mt-3 space-y-4\">\n {activeGroups.map((group, index) => {\n const state = stateFor(group.id)\n const groupLines = orderGroupLines(\n lines.filter((line) => line.groupId === group.id),\n )\n const point = pointFor(group, state)\n const ready = readiness(group, state)\n const fee = ready ? feeFor(group, state) : null\n const baseFee = baseFeeFor(group, state)\n const feeDiscount = fee !== null ? Math.max(0, baseFee - fee) : 0\n const option = optionFor(group, state)\n const heading = fill(state.mode === 'pickup' ? labels.groupPickup : labels.groupDelivery, {\n n: index + 1,\n })\n const panelId = `${uid}-panel-${group.id}`\n const editing = openPanel === group.id\n const methodLine =\n state.mode === 'pickup'\n ? [labels.modePickup, ready ? point?.label : ''].filter(Boolean).join(' · ')\n : [labels.modeShipping, ready ? option?.label : '', ready ? option?.eta : '']\n .filter(Boolean)\n .join(' · ')\n const pickupDetailLine =\n state.mode === 'pickup' && point\n ? [point.address, point.hours].filter(Boolean).join(' · ')\n : ''\n const needsAddress = state.mode === 'shipping' && !shippingAddress\n const ratePending = state.rateState === 'pending'\n const rateError = state.rateState === 'error'\n const noCoverage = state.rateState === 'none'\n const shippingAvailable =\n group.modes.includes('shipping') &&\n group.shippingOptions.length > 0 &&\n Boolean(shippingAddress) &&\n coverageFor(group, shippingAddressId) === 'ok'\n const pickupAvailable =\n group.modes.includes('pickup') &&\n group.pickupPoints.some((item) => item.available !== false)\n const bothModes = shippingAvailable && pickupAvailable\n const currentModeAvailable =\n state.mode === 'shipping' ? shippingAvailable : pickupAvailable\n const currentChoiceCount =\n state.mode === 'shipping'\n ? group.shippingOptions.length\n : group.pickupPoints.length\n const canChange =\n bothModes ||\n (currentModeAvailable\n ? currentChoiceCount > 1\n : pickupAvailable || shippingAvailable)\n const panelMode = currentModeAvailable\n ? state.mode\n : pickupAvailable\n ? 'pickup'\n : 'shipping'\n const shippingChoices: OptionItem[] = group.shippingOptions.map((item) => {\n const discount = item.discountCents ?? 0\n const payable = Math.max(0, item.feeCents - discount)\n return {\n id: item.id,\n title: item.label,\n detail: item.eta,\n meta: payable === 0 ? labels.groupFree : money(payable, data),\n previousMeta: discount > 0 ? money(item.feeCents, data) : '',\n disabled: false,\n reason: '',\n }\n })\n const pickupChoices: OptionItem[] = group.pickupPoints.map((item) => {\n const discount = item.discountCents ?? 0\n const payable = Math.max(0, item.feeCents - discount)\n return {\n id: item.id,\n title: item.label,\n detail: pickupDetail(item),\n meta: payable === 0 ? labels.groupFree : money(payable, data),\n previousMeta: discount > 0 ? money(item.feeCents, data) : '',\n disabled: item.available === false,\n reason: item.available === false ? item.unavailableReason || '' : '',\n }\n })\n const modeChoices: OptionItem[] = [\n {\n id: 'shipping',\n title: labels.modeShipping,\n detail: '',\n meta: '',\n disabled: false,\n reason: '',\n },\n {\n id: 'pickup',\n title: labels.modePickup,\n detail: '',\n meta: '',\n disabled: false,\n reason: '',\n },\n ]\n\n return (\n <section\n key={group.id}\n aria-labelledby={`${uid}-group-${group.id}`}\n className=\"overflow-hidden rounded-xl border border-border bg-card\"\n >\n <div className=\"flex items-start justify-between gap-3 px-4 py-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h4 id={`${uid}-group-${group.id}`} className=\"text-sm font-semibold\">\n {heading}\n </h4>\n {group.special ? (\n <Badge variant={VARIANT_SECONDARY}>{labels.groupSpecial}</Badge>\n ) : null}\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{methodLine}</p>\n {pickupDetailLine ? (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {pickupDetailLine}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-1.5\">\n <p className=\"text-sm font-semibold tabular-nums\">\n {fee === null ? (\n labels.overviewPending\n ) : feeDiscount > 0 ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"text-xs font-normal text-muted-foreground line-through\">\n {money(baseFee, data)}\n </span>\n <span>{fee === 0 ? labels.groupFree : money(fee, data)}</span>\n </span>\n ) : fee === 0 ? (\n labels.groupFree\n ) : (\n money(fee, data)\n )}\n </p>\n {canChange ? (\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_OUTLINE}\n aria-expanded={editing}\n aria-controls={panelId}\n onClick={() => setOpenPanel(editing ? '' : group.id)}\n >\n {labels.changeAction}\n </Button>\n ) : null}\n </div>\n </div>\n\n {editing && canChange ? (\n <div id={panelId} className=\"border-t border-border bg-muted/30 px-4 py-3\">\n {bothModes ? (\n <div className=\"mb-3\">\n <OptionGroup\n legend={labels.modeTitle}\n options={modeChoices}\n selectedId={state.mode}\n onSelect={(mode) => selectMode(group, mode)}\n className=\"grid gap-1.5 sm:grid-cols-2\"\n />\n </div>\n ) : null}\n {panelMode === 'shipping' ? (\n rateError ? (\n <p className=\"text-xs text-destructive\">{labels.rateError}</p>\n ) : ratePending ? (\n <p className=\"text-xs text-muted-foreground\">\n {labels.groupRatePending}\n </p>\n ) : noCoverage ? (\n <p className=\"text-xs text-muted-foreground\">\n {labels.groupNoCoverage}\n </p>\n ) : (\n <OptionGroup\n legend={labels.groupShippingOptions}\n options={shippingChoices}\n selectedId={state.shippingOptionId}\n onSelect={(id) => chooseShippingOption(group, id)}\n className=\"grid gap-1.5\"\n />\n )\n ) : (\n <div>\n <OptionGroup\n legend={labels.groupPickupPoints}\n options={pickupChoices}\n selectedId={state.pickupPointId}\n onSelect={(id) => choosePickupPoint(group, id)}\n className=\"grid gap-1.5\"\n />\n {point?.note ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">{point.note}</p>\n ) : null}\n </div>\n )}\n <div className=\"mt-3\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n onClick={() => setOpenPanel('')}\n >\n {labels.done}\n </Button>\n </div>\n </div>\n ) : null}\n\n {needsAddress ? (\n <p className=\"px-4 pb-3 text-xs text-muted-foreground\">\n {labels.groupNoAddress}\n </p>\n ) : ratePending ? (\n <p aria-live=\"polite\" className=\"px-4 pb-3 text-xs text-muted-foreground\">\n {labels.groupRatePending}\n </p>\n ) : rateError ? (\n <div className=\"mx-4 mb-3 rounded-md border border-destructive/40 bg-destructive/10 p-2.5\">\n <p className=\"text-xs text-destructive\">{labels.rateError}</p>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_OUTLINE}\n className=\"mt-1.5\"\n onClick={() => recalc(group)}\n >\n {labels.groupRetryRate}\n </Button>\n </div>\n ) : noCoverage ? (\n <div className=\"mx-4 mb-3 rounded-md border border-warning/40 bg-warning/10 p-2.5\">\n <p className=\"text-xs font-medium\">{labels.groupNoCoverage}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {labels.groupNoCoverageHint}\n </p>\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {group.modes.includes('pickup') ? (\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_OUTLINE}\n onClick={() => selectMode(group, 'pickup')}\n >\n {labels.groupPickupAvailable}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n onClick={openAddressEditor}\n >\n {labels.groupChangeAddress}\n </Button>\n </div>\n </div>\n ) : null}\n {group.note ? (\n <p className=\"mx-4 mb-3 rounded-md bg-muted/50 p-2 text-xs text-muted-foreground\">\n {group.note}\n </p>\n ) : null}\n\n <ul className=\"divide-y divide-border border-t border-border\">\n {groupLines.map((line) => {\n const unitPrice = unitPriceFor(line, line.quantity)\n const tiers = line.tiers ?? []\n const currentTier = currentTierFor(line, line.quantity)\n const nextTier = nextTierFor(line, line.quantity)\n const tierOpen = openTiers.includes(line.lineId)\n const nextReachable =\n nextTier !== null &&\n line.stock >= nextTier.minQuantity &&\n nextTier.unitCents < unitPrice\n const detailLine = [\n line.variant,\n fill(labels.each, { amount: money(unitPrice, data) }),\n ].join(' · ')\n const unavailable = line.stock < 1\n const isAssociate = line.isAssociate === true\n const mainQty = isAssociate ? mainQuantityFor(line) : line.quantity\n const maxQty = isAssociate ? associateMaxFor(line, mainQty) : line.stock\n const minQty = isAssociate ? (line.minQuantity ?? 1) : 1\n const parentLine = line.parentLineId\n ? lines.find((entry) => entry.lineId === line.parentLineId)\n : undefined\n const parentNote =\n parentLine && parentLine.groupId !== line.groupId\n ? fill(labels.associateOf, { name: parentLine.title })\n : ''\n const relatedInGroup = Boolean(\n isAssociate && parentLine && parentLine.groupId === line.groupId,\n )\n const associateDiscount = isAssociate\n ? associateDiscountFor(unitPrice, line.regularCents)\n : null\n const regularTotal = (line.regularCents ?? 0) * line.quantity\n const lineNet = lineNetTotal(line)\n const totalSavingCents = associateDiscount\n ? Math.max(0, regularTotal - lineNet)\n : 0\n const totalSavingPercent =\n associateDiscount && regularTotal > 0\n ? Math.round((totalSavingCents / regularTotal) * 100)\n : 0\n const associateDefs = isAssociate ? [] : associatesFor(line.lineId)\n const associateLines = isAssociate\n ? []\n : lines.filter((entry) => entry.parentLineId === line.lineId)\n const availableAssociates = associateDefs.filter(\n (def) => !lines.some((entry) => entry.lineId === def.lineId),\n )\n const addableAssociates = availableAssociates.filter(\n (def) =>\n def.eligible !== false &&\n def.stock > 0 &&\n associateDefMax(def, line.quantity) > 0,\n )\n const rowNotice =\n associateNotice && associateNotice.mainLineId === line.lineId\n ? associateNotice\n : null\n const confirmingMain = confirmRemoveMain === line.lineId\n const rowRemoving =\n removingLine === line.lineId ||\n (isAssociate && removingLine === line.parentLineId)\n const atLimit = maxQty > 0 && line.quantity >= maxQty\n const canDecrease =\n !unavailable &&\n (isAssociate\n ? minQty === 0 || line.quantity > minQty\n : line.quantity > 1)\n const canIncrease = !unavailable && maxQty > 0 && line.quantity < maxQty\n const addingAny = addingAssociate !== ''\n return (\n <li\n key={line.lineId}\n aria-busy={priceUpdating === line.lineId || rowRemoving}\n className=\"px-4 py-3\"\n >\n <div\n className={\n relatedInGroup\n ? 'flex flex-col gap-2 border-l border-border pl-3 sm:flex-row sm:items-start sm:gap-3'\n : 'flex flex-col gap-2 sm:flex-row sm:items-start sm:gap-3'\n }\n >\n <div className=\"flex min-w-0 flex-1 gap-3\">\n <img\n src={line.image ?? PRODUCT_IMAGE_FALLBACK}\n alt={line.title}\n width={48}\n height={48}\n className=\"h-12 w-12 shrink-0 rounded-md border border-border object-cover\"\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <p className=\"text-sm font-medium\">{line.title}</p>\n <p className=\"text-xs text-muted-foreground\">{detailLine}</p>\n {isAssociate && associateDiscount ? (\n <p className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs\">\n <span className=\"text-muted-foreground line-through tabular-nums\">\n {fill(labels.associatePreviousUnit, {\n amount: money(line.regularCents ?? 0, data),\n })}\n </span>\n <span className=\"text-success\">\n {fill(labels.associateTotalSaving, {\n amount: money(totalSavingCents, data),\n percent: totalSavingPercent,\n })}\n </span>\n </p>\n ) : null}\n {parentNote ? (\n <p className=\"text-xs text-muted-foreground\">{parentNote}</p>\n ) : null}\n {relatedInGroup && parentLine ? (\n <span className=\"sr-only\">\n {fill(labels.associateOf, { name: parentLine.title })}\n </span>\n ) : null}\n {(line.lineDiscountCents ?? 0) > 0 ? (\n <p className=\"text-xs text-success\">\n {fill(labels.lineDiscount, {\n label: line.lineDiscountLabel ?? '',\n amount: money(line.lineDiscountCents ?? 0, data),\n })}\n </p>\n ) : null}\n {isAssociate ? (\n <p\n className={\n atLimit\n ? 'text-xs font-medium text-foreground'\n : 'text-xs text-muted-foreground'\n }\n >\n {atLimit\n ? labels.associateLimitReached\n : fill(labels.associateMax, { count: maxQty })}\n </p>\n ) : unavailable ? (\n <p className=\"text-xs text-destructive\">{labels.outOfStock}</p>\n ) : line.stock <= 3 ? (\n <p className=\"text-xs text-muted-foreground\">\n {fill(labels.stockLeft, { count: line.stock })}\n </p>\n ) : null}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between gap-3 sm:w-28 sm:flex-col sm:items-end sm:gap-1.5\">\n <div className=\"sm:text-right\">\n <p className=\"text-xs text-muted-foreground\">\n {labels.subtotal}\n </p>\n <p\n className={\n priceUpdating === line.lineId\n ? 'text-sm font-semibold tabular-nums text-muted-foreground'\n : 'text-sm font-semibold tabular-nums'\n }\n >\n {money(lineNetTotal(line), data)}\n {priceUpdating === line.lineId ? (\n <span aria-hidden=\"true\">{labels.ellipsis}</span>\n ) : null}\n </p>\n </div>\n <span aria-live=\"polite\" className=\"sr-only\">\n {priceUpdating === line.lineId ? labels.priceUpdating : ''}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant={VARIANT_OUTLINE}\n aria-label={fill(labels.decrease, { name: line.title })}\n disabled={!canDecrease || rowRemoving}\n onClick={() => changeQuantity(line.lineId, line.quantity - 1)}\n >\n {labels.decreaseSymbol}\n </Button>\n <span className=\"min-w-8 text-center text-sm tabular-nums\">\n {line.quantity}\n </span>\n <Button\n type=\"button\"\n size=\"icon\"\n variant={VARIANT_OUTLINE}\n aria-label={fill(labels.increase, { name: line.title })}\n disabled={!canIncrease || rowRemoving}\n onClick={() => changeQuantity(line.lineId, line.quantity + 1)}\n >\n {labels.increaseSymbol}\n </Button>\n </div>\n </div>\n </div>\n\n {tiers.length > 1 ? (\n <div className=\"mt-2 rounded-lg bg-muted/40 px-3 py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-1\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n {labels.tierBadge}\n </p>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n className=\"px-0\"\n aria-expanded={tierOpen}\n aria-controls={`${uid}-tiers-${line.lineId}`}\n onClick={() => toggleTiers(line.lineId)}\n >\n {tierOpen ? labels.tierHide : labels.tierSee}\n </Button>\n </div>\n {nextReachable && nextTier ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {fill(labels.tierNext, {\n count: nextTier.minQuantity - line.quantity,\n price: money(nextTier.unitCents, data),\n })}\n </p>\n ) : null}\n {tierOpen ? (\n <div\n id={`${uid}-tiers-${line.lineId}`}\n className=\"mt-2 divide-y divide-border border-t border-border\"\n >\n {tiers.map((tier) => {\n const tierIsCurrent =\n currentTier?.minQuantity === tier.minQuantity\n return (\n <div\n key={tier.minQuantity}\n aria-current={tierIsCurrent ? 'true' : undefined}\n className={\n tierIsCurrent\n ? 'flex items-center justify-between gap-2 py-1.5 text-xs font-medium'\n : 'flex items-center justify-between gap-2 py-1.5 text-xs text-muted-foreground'\n }\n >\n <span>{tierRangeLabel(tier, data)}</span>\n <span className=\"flex items-center gap-1.5\">\n <span className=\"tabular-nums\">\n {money(tier.unitCents, data)}\n </span>\n {tierIsCurrent ? (\n <span className=\"text-xs font-normal text-muted-foreground\">\n {labels.tierCurrent}\n </span>\n ) : null}\n </span>\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {associateDefs.length > 0 &&\n (associateLines.length > 0 || addableAssociates.length > 0) ? (\n <div className=\"mt-2 rounded-lg bg-muted/40 px-3 py-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-1\">\n <p className=\"text-xs text-muted-foreground\">\n {associateLines.length > 0\n ? fill(\n associateLines.length === 1\n ? labels.associatesSummaryOne\n : labels.associatesSummary,\n { count: associateLines.length },\n )\n : labels.associatesTitle}\n </p>\n {addableAssociates.length > 0 ||\n assocOpen === line.lineId ? (\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n className=\"px-0\"\n aria-expanded={assocOpen === line.lineId}\n aria-controls={`${uid}-associates-${line.lineId}`}\n onClick={() =>\n setAssocOpen(assocOpen === line.lineId ? '' : line.lineId)\n }\n >\n {assocOpen === line.lineId\n ? labels.associatesHide\n : labels.associatesAddMore}\n </Button>\n ) : null}\n </div>\n {rowNotice ? (\n <p\n aria-live=\"polite\"\n className={\n rowNotice.error\n ? 'mt-1.5 text-xs text-destructive'\n : 'mt-1.5 text-xs text-muted-foreground'\n }\n >\n {rowNotice.text}\n </p>\n ) : null}\n {assocOpen === line.lineId ? (\n <div\n id={`${uid}-associates-${line.lineId}`}\n className=\"mt-2 divide-y divide-border border-t border-border\"\n >\n {availableAssociates.length === 0 ? (\n <p className=\"py-2 text-xs text-muted-foreground\">\n {labels.associateOptionsNone}\n </p>\n ) : (\n availableAssociates.map((def) => {\n const defMax = associateDefMax(def, line.quantity)\n const defDiscount = associateDiscountFor(\n def.unitCents,\n def.regularCents,\n )\n const blocked =\n def.eligible === false || def.stock < 1 || defMax < 1\n const adding = addingAssociate === def.id\n const status =\n def.stock < 1\n ? labels.associateNoStock\n : def.eligible === false\n ? `${labels.associateNotEligible} · ${def.reason ?? ''}`\n : defMax < 1\n ? labels.associateLimitReached\n : ''\n return (\n <div key={def.id} className=\"flex items-start gap-2.5 py-2\">\n <img\n src={def.image ?? PRODUCT_IMAGE_FALLBACK}\n alt={def.title}\n width={36}\n height={36}\n className=\"h-9 w-9 shrink-0 rounded-md border border-border object-cover\"\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <p className=\"text-xs font-medium\">{def.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {def.variant}\n </p>\n <p className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs\">\n <span className=\"tabular-nums\">\n {money(def.unitCents, data)}\n </span>\n {defDiscount ? (\n <span className=\"text-muted-foreground line-through tabular-nums\">\n {money(def.regularCents ?? 0, data)}\n </span>\n ) : null}\n {defDiscount ? (\n <span className=\"text-success\">\n {fill(labels.associateSavings, {\n amount: money(defDiscount.amountCents, data),\n percent: defDiscount.percent,\n })}\n </span>\n ) : null}\n {defMax > 0 ? (\n <span className=\"text-muted-foreground\">\n {fill(labels.associateMax, { count: defMax })}\n </span>\n ) : null}\n </p>\n {status ? (\n <p className=\"text-xs text-muted-foreground\">\n {status}\n </p>\n ) : null}\n </div>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_OUTLINE}\n disabled={blocked || addingAny || rowRemoving}\n onClick={() => addAssociate(line, def)}\n >\n {adding ? labels.associateAdding : labels.associateAdd}\n </Button>\n </div>\n )\n })\n )}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {confirmingMain ? (\n <div className=\"mt-2 rounded-md border border-border bg-muted/40 px-3 py-2\">\n <p className=\"text-xs text-destructive\">\n {fill(labels.removeMainWarning, {\n name: line.title,\n count: associateLines.length,\n })}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_DESTRUCTIVE}\n disabled={rowRemoving}\n onClick={() => confirmRemoveMainLine(line)}\n >\n {labels.removeMainConfirm}\n </Button>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n onClick={() => setConfirmRemoveMain('')}\n >\n {labels.associateKeep}\n </Button>\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n className=\"px-0 text-muted-foreground hover:text-destructive\"\n aria-label={fill(labels.removeNamed, { name: line.title })}\n disabled={rowRemoving}\n onClick={() => requestRemoveLine(line)}\n >\n {rowRemoving ? labels.associateRemoving : labels.remove}\n </Button>\n </div>\n </li>\n )\n })}\n </ul>\n\n </section>\n )\n })}\n </div>\n </section>\n\n <div className=\"rounded-xl border border-border bg-card\">\n <section aria-labelledby={`${uid}-payment`} className=\"px-4 py-3\">\n <h3\n id={`${uid}-payment`}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {labels.paymentTitle}\n </h3>\n <div className=\"mt-2 flex flex-wrap items-center justify-between gap-2 rounded-lg bg-muted/40 px-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {activeMethod ? activeMethod.label : labels.paymentUnavailable}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {activeMethod ? activeMethod.detail : labels.paymentChoose}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_OUTLINE}\n aria-expanded={paymentOpen}\n aria-controls={`${uid}-payment-panel`}\n onClick={() => setPaymentOpen(!paymentOpen)}\n >\n {labels.changeAction}\n </Button>\n </div>\n {paymentNotice ? (\n <p className=\"mt-1 text-xs text-destructive\">{paymentNotice}</p>\n ) : null}\n {paymentOpen ? (\n <div id={`${uid}-payment-panel`} className=\"mt-2\">\n <OptionGroup\n legend={labels.paymentChoose}\n options={paymentOptions}\n selectedId={activePaymentId}\n onSelect={(id) => {\n setPaymentId(id)\n setPaymentError(false)\n setPaymentOpen(false)\n }}\n className=\"grid gap-1.5\"\n />\n </div>\n ) : null}\n <p className=\"mt-2 text-xs text-muted-foreground\">{labels.paymentProviderNote}</p>\n {paymentError ? (\n <div role=\"alert\" className=\"mt-3 rounded-md border border-destructive/40 bg-destructive/10 p-3\">\n <p className=\"text-sm font-medium text-destructive\">{labels.paymentErrorTitle}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.paymentErrorBody}</p>\n <div className=\"mt-2\">\n <Button type=\"button\" size=\"sm\" variant={VARIANT_OUTLINE} onClick={retryPayment}>\n {labels.paymentRetry}\n </Button>\n </div>\n </div>\n ) : null}\n </section>\n\n {addressBook.length > 0 ? (\n <section\n aria-labelledby={`${uid}-billing`}\n className=\"border-t border-border px-4 py-3\"\n >\n <h3\n id={`${uid}-billing`}\n className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {labels.billingTitle}\n </h3>\n <div className=\"mt-2\">\n <Button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={billingSame}\n variant={VARIANT_GHOST}\n size=\"sm\"\n onClick={() => setBillingSame(!billingSame)}\n className=\"w-full justify-start whitespace-normal px-0 text-left\"\n >\n <span\n aria-hidden=\"true\"\n className=\"flex size-4 shrink-0 items-center justify-center rounded-sm border border-input text-xs\"\n >\n {billingSame ? labels.checkSymbol : null}\n </span>\n <span className=\"text-sm font-normal\">{labels.billingSame}</span>\n </Button>\n </div>\n {!billingSame ? (\n <div className=\"mt-2\">\n <OptionGroup\n legend={labels.billingChoose}\n options={addressBook.map((address) => ({\n id: address.id,\n title: address.label,\n detail: addressSummary(address),\n meta: address.isDefault ? labels.addressDefaultBadge : '',\n disabled: false,\n reason: '',\n }))}\n selectedId={billingId}\n onSelect={setBillingId}\n className=\"grid gap-2\"\n />\n </div>\n ) : null}\n </section>\n ) : null}\n </div>\n\n <p className=\"text-xs text-muted-foreground\">{data.meta.footerNote}</p>\n </div>\n\n <aside className=\"md:col-span-2 md:sticky md:top-6\" aria-label={labels.summaryTitle}>\n <Card className=\"gap-3 py-0 shadow-none\">\n <CardHeader className=\"border-b border-border px-4 py-3\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <h3 className=\"text-sm font-semibold\">{labels.summaryTitle}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {countLabel(unitCount, labels.summaryItemOne, fill(labels.summaryItems, { count: unitCount }))}\n </p>\n </div>\n </CardHeader>\n <CardContent className=\"px-4 py-3\">\n <dl className=\"space-y-2\">\n <SummaryRow label={labels.subtotal} value={money(subtotal, data)} emphasis={false} />\n {promotions.map((promotion) => (\n <SummaryRow\n key={promotion.id}\n label={promotion.label}\n value={`- ${money(promotion.amountCents, data)}`}\n emphasis={false}\n />\n ))}\n <SummaryRow\n label={fill(labels.tax, { rate: String(scenario.taxRateBps / 100) })}\n value={money(tax, data)}\n emphasis={false}\n />\n {pending ? null : (\n <>\n {shippingFees > 0 ? (\n <SummaryRow\n label={labels.shippingCost}\n value={money(shippingFees, data)}\n emphasis={false}\n />\n ) : null}\n {pickupFees > 0 ? (\n <SummaryRow\n label={labels.pickupCost}\n value={money(pickupFees, data)}\n emphasis={false}\n />\n ) : null}\n {scenario.extraCents > 0 ? (\n <SummaryRow\n label={scenario.extraLabel || labels.extraCost}\n value={money(scenario.extraCents, data)}\n emphasis={false}\n />\n ) : null}\n </>\n )}\n </dl>\n\n <div className=\"mt-3 border-t border-border pt-3\">\n <dl>\n <div className=\"flex items-baseline justify-between gap-3\">\n <dt className=\"text-sm font-semibold\">\n {pending ? labels.totalPending : labels.total}\n </dt>\n <dd className=\"text-base font-semibold tabular-nums\">\n {pending ? labels.overviewPending : money(total, data)}\n </dd>\n </div>\n </dl>\n {pending ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.totalPendingNote}</p>\n ) : (\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.totalDemoNote}</p>\n )}\n </div>\n\n <div className=\"mt-3\">\n {appliedCoupon ? (\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs text-success\">\n {fill(labels.promoApplied, { code: appliedCoupon.code })}\n </p>\n <Button\n type=\"button\"\n size=\"xs\"\n variant={VARIANT_GHOST}\n onClick={removeCoupon}\n >\n {labels.remove}\n </Button>\n </div>\n ) : couponOpen ? (\n <div>\n <label htmlFor={`${uid}-coupon`} className=\"text-xs font-medium\">\n {labels.promoLabel}\n </label>\n <div className=\"mt-1 flex gap-2\">\n <input\n id={`${uid}-coupon`}\n value={couponCode}\n placeholder={labels.promoPlaceholder}\n onChange={(event) => {\n setCouponCode(event.target.value)\n setCouponNotice(null)\n }}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm\"\n />\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_OUTLINE}\n onClick={applyCoupon}\n >\n {labels.promoApply}\n </Button>\n </div>\n {couponNotice && couponNotice.status !== 'applied' ? (\n <p role=\"alert\" className=\"mt-1 text-xs text-destructive\">\n {couponNotice.message}\n </p>\n ) : null}\n </div>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={VARIANT_GHOST}\n onClick={() => setCouponOpen(true)}\n >\n {labels.promoOpen}\n </Button>\n )}\n </div>\n </CardContent>\n <CardFooter className=\"px-4 pb-4\">\n <div className=\"w-full\">\n <Button\n type=\"button\"\n className=\"hidden w-full md:inline-flex\"\n size=\"lg\"\n disabled={!canConfirm || creatingOrder}\n aria-describedby={`${uid}-confirm-note`}\n onClick={handleConfirm}\n >\n {creatingOrder ? labels.confirmationCreating : labels.confirm}\n </Button>\n <p id={`${uid}-confirm-note`} className=\"mt-2 text-xs text-muted-foreground\">\n {creatingOrder\n ? labels.confirmationCreatingNote\n : canConfirm\n ? labels.confirmNote\n : blockedMessage}\n </p>\n </div>\n </CardFooter>\n </Card>\n </aside>\n </div>\n </div>\n )\n}\n\nexport default function CheckoutCommerceV1({ data, ...props }: CheckoutCommerceV1Props) {\n return (\n <BlockDataProvider data={data}>\n <CheckoutCommerceV1Content data={data} {...props} />\n </BlockDataProvider>\n )\n}\n"],"mappings":"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","names":[]}
|