@asteby/storefront-react 0.26.1 → 0.28.1
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/README.md +7 -2
- package/dist/account-server.cjs +533 -83
- package/dist/account-server.cjs.map +1 -1
- package/dist/account-server.d.cts +13 -2
- package/dist/account-server.d.ts +13 -2
- package/dist/account-server.js +23 -6
- package/dist/account-server.js.map +1 -1
- package/dist/account.cjs +572 -96
- package/dist/account.cjs.map +1 -1
- package/dist/account.d.cts +82 -45
- package/dist/account.d.ts +82 -45
- package/dist/account.js +53 -14
- package/dist/account.js.map +1 -1
- package/dist/checkout.cjs +114 -38
- package/dist/checkout.cjs.map +1 -1
- package/dist/checkout.d.cts +24 -1
- package/dist/checkout.d.ts +24 -1
- package/dist/checkout.js +114 -38
- package/dist/checkout.js.map +1 -1
- package/dist/{chunk-MNLROALF.js → chunk-4DZW3R33.js} +19 -2
- package/dist/chunk-4DZW3R33.js.map +1 -0
- package/dist/chunk-BXKV2KWZ.js +291 -0
- package/dist/chunk-BXKV2KWZ.js.map +1 -0
- package/dist/chunk-LIUEQENV.js +156 -0
- package/dist/chunk-LIUEQENV.js.map +1 -0
- package/dist/payments-server.cjs +17 -0
- package/dist/payments-server.cjs.map +1 -1
- package/dist/payments-server.js +2 -2
- package/dist/payments.cjs +17 -0
- package/dist/payments.cjs.map +1 -1
- package/dist/payments.js +2 -2
- package/dist/voucher-document-FWH4DQ5N.js +72 -0
- package/dist/voucher-document-FWH4DQ5N.js.map +1 -0
- package/dist/voucher-pdf-LQC333AB.js +213 -0
- package/dist/voucher-pdf-LQC333AB.js.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-MNLROALF.js.map +0 -1
- package/dist/chunk-TXEYBDFG.js +0 -182
- package/dist/chunk-TXEYBDFG.js.map +0 -1
- package/dist/voucher-document-SFWJCLTN.js +0 -124
- package/dist/voucher-document-SFWJCLTN.js.map +0 -1
package/dist/checkout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/checkout/address-fields.tsx","../src/checkout/order-summary.tsx","../src/checkout/recommend.ts","../src/checkout/delivery.ts","../src/checkout/delivery-options.tsx","../src/checkout/auto-quote.ts"],"names":["fill","el","ES","EN","jsx","jsxs","costOf","daysOf","norm","formatMoney","Fragment","useState","useRef","useEffect","useMemo"],"mappings":"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","file":"checkout.js","sourcesContent":["/**\n * Contact and shipping address fields of a checkout, in the order and with the autofill tokens buyers expect:\n * contact (e-mail, phone, given and family name) and address (postal code first, so it can fill state and city, then\n * state, city, colonia, street, interior and delivery references). One column on phones; the shop lays out the grid\n * with `classNames`.\n *\n * Nothing here knows a country: the postal-code format, the list of states and the postal-code lookup come from the\n * shop (region config, a same-origin route). Without them the fields are plain text and nothing is invented.\n */\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { Address } from '@asteby/storefront'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors, type FieldMessages } from './fields.js'\n\nexport type AddressFieldKey = 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'\nexport type ContactFieldKey = 'email' | 'phone' | 'first_name' | 'last_name'\n\nexport type AddressFieldsMessages = Record<AddressFieldKey | ContactFieldKey, string> & {\n provincePlaceholder: string\n neighborhoodPlaceholder: string\n address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: string\n /** Tooltip and note of a state the postal code defined (locked). */\n provinceLocked: string\n /** Discreet action that releases the locked state so the buyer can fix the postal code. */\n changePostalCode: string\n}\n\nconst ES: AddressFieldsMessages = {\n email: 'Correo',\n phone: 'Teléfono',\n first_name: 'Nombre',\n last_name: 'Apellidos',\n zip: 'Código postal',\n province: 'Estado',\n city: 'Ciudad o municipio',\n neighborhood: 'Colonia',\n address1: 'Calle y número',\n address2: 'Número interior o departamento',\n reference: 'Referencias para la entrega',\n provincePlaceholder: 'Elige tu estado',\n neighborhoodPlaceholder: 'Elige tu colonia',\n address1Hint: 'Por ejemplo: Av. Insurgentes Sur 1234',\n referenceHint: 'Entre qué calles, color de la fachada…',\n emailHint: 'Te enviamos aquí la confirmación y el seguimiento.',\n phoneHint: 'Solo para la paquetería, por si necesita contactarte.',\n lookupFilled: 'Completamos estado y ciudad con tu código postal.',\n provinceLocked: 'Definido por tu código postal',\n changePostalCode: 'Cambiar código postal',\n}\n\nconst EN: AddressFieldsMessages = {\n email: 'Email',\n phone: 'Phone',\n first_name: 'First name',\n last_name: 'Last name',\n zip: 'Postal code',\n province: 'State',\n city: 'City',\n neighborhood: 'Neighborhood',\n address1: 'Street and number',\n address2: 'Apartment, suite',\n reference: 'Delivery notes',\n provincePlaceholder: 'Choose your state',\n neighborhoodPlaceholder: 'Choose your neighborhood',\n address1Hint: 'For example: 1234 Main St',\n referenceHint: 'Cross streets, building color…',\n emailHint: 'We send the confirmation and tracking here.',\n phoneHint: 'Only for the carrier, in case they need to reach you.',\n lookupFilled: 'We filled in state and city from your postal code.',\n provinceLocked: 'Set by your postal code',\n changePostalCode: 'Change postal code',\n}\n\nexport function addressFieldsMessages(locale?: string | null, overrides?: Partial<AddressFieldsMessages> | null): AddressFieldsMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type FieldLayoutClassNames = CheckoutFieldClassNames & {\n /** Extra class of a field that should span the whole row in a two-column grid. */\n wide?: string\n /** Extra class of a field that fits half a row. */\n half?: string\n}\n\ntype Common = {\n /** Inline errors by field name (`useFieldErrors().errors`). */\n errors?: FieldErrors\n locale?: string\n messages?: Partial<AddressFieldsMessages>\n fieldMessages?: Partial<FieldMessages>\n classNames?: FieldLayoutClassNames\n}\n\nconst join = (...c: Array<string | undefined>) => c.filter(Boolean).join(' ') || undefined\nconst field = (cx: FieldLayoutClassNames, span: 'wide' | 'half'): CheckoutFieldClassNames => ({ ...cx, root: join(cx.root, cx[span]) })\n\nexport type ContactFieldsProps = Common & {\n defaults?: Partial<Record<ContactFieldKey, string | null>>\n /** Form names. Default: the keys. */\n names?: Partial<Record<ContactFieldKey, string>>\n /** Phone format from the shop or region (e.g. `{ pattern: '[0-9 +()-]{10,}', title: '10 dígitos' }`). */\n phone?: { pattern?: string; title?: string; minLength?: number }\n /** Explain why e-mail and phone are needed (default true). */\n hints?: boolean\n}\n\n/** E-mail, phone, given and family name with their autofill tokens and the right mobile keyboards. */\nexport function ContactFields({ defaults = {}, names = {}, errors = {}, phone, hints = true, locale, messages, fieldMessages: fm, classNames: cx = {} }: ContactFieldsProps) {\n const m = addressFieldsMessages(locale, messages)\n const n = (k: ContactFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n return (\n <>\n <CheckoutField {...common} name={n('email')} label={m.email} type=\"email\" autoComplete=\"email\" inputMode=\"email\" autoCapitalize=\"none\" spellCheck={false} defaultValue={defaults.email ?? ''} error={errors[n('email')] ?? null} hint={hints ? m.emailHint : undefined} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('phone')} label={m.phone} type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" defaultValue={defaults.phone ?? ''} error={errors[n('phone')] ?? null} hint={hints ? m.phoneHint : undefined} classNames={field(cx, 'wide')} {...(phone?.pattern ? { pattern: phone.pattern } : {})} {...(phone?.title ? { title: phone.title } : {})} {...(phone?.minLength ? { minLength: phone.minLength } : {})} />\n <CheckoutField {...common} name={n('first_name')} label={m.first_name} autoComplete=\"given-name\" defaultValue={defaults.first_name ?? ''} error={errors[n('first_name')] ?? null} classNames={field(cx, 'half')} />\n <CheckoutField {...common} name={n('last_name')} label={m.last_name} autoComplete=\"family-name\" defaultValue={defaults.last_name ?? ''} error={errors[n('last_name')] ?? null} classNames={field(cx, 'half')} />\n </>\n )\n}\n\n/** What a postal-code lookup answers. Every field optional: only what the source knows. */\nexport type PostalCodeInfo = { province?: string | null; city?: string | null; neighborhoods?: readonly string[] | null }\n\nexport type AddressFieldsProps = Common & {\n defaults?: Partial<Pick<Address, 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'>> | null\n /** Form names. Default: the keys (the `AddressInput` fields of the Storefront API). */\n names?: Partial<Record<AddressFieldKey, string>>\n /** ISO country of the address (hidden field `country_code`). */\n countryCode: string\n /** States of the country (from the region config). With them, \"State\" is a `<select>`; the value sent is `name`. */\n provinces?: ReadonlyArray<{ code?: string | null; name: string }> | null\n /** Postal-code format of the country (from the region config), e.g. `{ pattern: '[0-9]{5}', maxLength: 5, inputMode: 'numeric', title: '5 dígitos' }`. */\n postalCode?: { pattern?: string; maxLength?: number; inputMode?: 'numeric' | 'text'; title?: string }\n /**\n * Fills state and city (and suggests colonias) from the postal code, when the shop has a source (a same-origin\n * route over a postal-code catalog). Called once the code matches `postalCode.pattern` (or on leaving the field).\n * Never overwrites what the buyer typed.\n */\n lookupPostalCode?: (zip: string) => Promise<PostalCodeInfo | null>\n /**\n * How to offer the colonias when the postal code has SEVERAL: `'datalist'` (default, suggestions on a text field) or\n * `'select'` (a real list; the field becomes a `<select>` of those colonias, unless the buyer already typed one that\n * is not in the list, which is kept as text). With exactly one colonia it is filled in either mode.\n */\n neighborhoodList?: 'datalist' | 'select'\n /** Show the colonia field: `true` (default, optional), `'required'`, or `false`. */\n neighborhood?: boolean | 'required'\n /** Show the delivery references field (default true, optional). */\n reference?: boolean\n /**\n * Once `lookupPostalCode` fills the state field (never over what the buyer already typed), lock it: a plain\n * `<input>` turns read-only; a `<select>` (from `provinces`) turns disabled with a hidden field that keeps\n * submitting its value. The state is the postal code's: the field shows a lock, the tooltip `provinceLocked` and a\n * discreet `changePostalCode` action; editing the postal code releases the lock and clears what the lookup filled\n * (also when the new code resolves nothing), so a stale state is never left behind. Default TRUE (the server\n * validates the pair again; set `false` to keep the filled state as editable as any field). Marked with\n * `data-sf-locked=\"1\"` for the shop's own styling.\n */\n lockProvinceOnFill?: boolean\n /** Rendered after the fields (e.g. \"save this address\"). */\n children?: ReactNode\n}\n\n/**\n * Shipping address in the order buyers fill it: postal code, state, city, colonia, street and number, interior and\n * references. Autofill tokens: `postal-code`, `address-level1/2/3`, `address-line1/2`. The postal code uses the\n * numeric keyboard when the country format is numeric.\n */\n/** Locks a field the lookup just filled: read-only for an `<input>`, disabled + a hidden mirror for a `<select>`. */\nfunction lockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked === '1') return\n el.dataset.sfLocked = '1'\n el.setAttribute('aria-readonly', 'true')\n if (el instanceof HTMLSelectElement) {\n // A disabled `<select>` would stop submitting its value: a hidden sibling keeps it in the form.\n const name = el.getAttribute('name')\n if (name) {\n el.dataset.sfName = name\n const hidden = document.createElement('input')\n hidden.type = 'hidden'\n hidden.dataset.sfLockMirror = '1'\n hidden.name = name\n hidden.value = el.value\n el.insertAdjacentElement('afterend', hidden)\n el.removeAttribute('name')\n }\n el.disabled = true\n } else {\n el.readOnly = true\n }\n}\n\n/** Undoes `lockField`: the field is editable again and, when the lookup filled it, empty (its value belonged to the old postal code). */\nfunction unlockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked !== '1') return\n delete el.dataset.sfLocked\n el.removeAttribute('aria-readonly')\n el.removeAttribute('title')\n if (el instanceof HTMLSelectElement) {\n const mirror = el.nextElementSibling\n if (mirror instanceof HTMLInputElement && mirror.dataset.sfLockMirror === '1') mirror.remove()\n if (el.dataset.sfName) el.setAttribute('name', el.dataset.sfName)\n delete el.dataset.sfName\n el.disabled = false\n } else {\n el.readOnly = false\n }\n}\n\n/** Name of the property set to `true` on every event the lookup dispatches when it fills a field. */\nexport const ADDRESS_FILL_EVENT_FLAG = 'sfSynthetic'\n\n/**\n * Was this `input` event dispatched by `AddressFields` itself (a postal-code fill) and not typed by the buyer? The shop's\n * own listeners (validation, autosave, delivery re-quote...) can ignore these. Real typing has `isTrusted: true`.\n */\nexport function isAddressFillEvent(event: Event): boolean {\n return (event as unknown as Record<string, unknown>)[ADDRESS_FILL_EVENT_FLAG] === true\n}\n\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, lockProvinceOnFill = true, locale, messages, fieldMessages: fm, classNames: cx = {}, children } = props\n const showNeighborhood = props.neighborhood ?? true\n const showReference = props.reference ?? true\n const m = addressFieldsMessages(locale, messages)\n const n = (k: AddressFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n const listId = useId()\n const [colonias, setColonias] = useState<readonly string[]>([])\n const [filled, setFilled] = useState(false)\n const [provinceLocked, setProvinceLocked] = useState(false)\n const [coloniaSelect, setColoniaSelect] = useState(false)\n const coloniaSelectRef = useRef(false)\n // Switching the colonia between text and list remounts the field: what it should hold is carried to the new element.\n const coloniaCarry = useRef<{ value: string; autofilled: boolean; userEdited: boolean } | null>(null)\n const lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\n // ONE writer: lookup results are applied one after another, never interleaved (two lookups answering close together\n // would otherwise write the same fields and fire their events at the same time).\n const writer = useRef<Promise<void>>(Promise.resolve())\n const enqueue = (task: () => void) => {\n writer.current = writer.current.then(task).catch(() => {})\n }\n\n // A field the buyer edited is theirs: only REAL input (`isTrusted`) marks it, not the events this component dispatches.\n useEffect(() => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const mark = (e: Event) => {\n if (!e.isTrusted) return\n const el = e.target as HTMLElement | null\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement) {\n el.dataset.sfUserEdited = '1'\n delete el.dataset.sfAutofilled\n }\n }\n form.addEventListener('input', mark, true)\n form.addEventListener('change', mark, true)\n return () => {\n form.removeEventListener('input', mark, true)\n form.removeEventListener('change', mark, true)\n }\n }, [])\n\n // The state was the old postal code's: free it and drop what the lookup filled (state, city, colonia) so nothing stale stays.\n const releaseLookup = () => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const locked = form.querySelector<HTMLInputElement | HTMLSelectElement>('[data-sf-locked=\"1\"]')\n const touched: Array<HTMLInputElement | HTMLSelectElement> = []\n if (locked) {\n unlockField(locked)\n touched.push(locked)\n }\n for (const key of ['province', 'city', 'neighborhood'] as const) {\n const el = form.elements.namedItem(n(key)) as HTMLInputElement | HTMLSelectElement | null\n if (el && !('length' in el && !(el instanceof HTMLSelectElement)) && !touched.includes(el)) touched.push(el)\n }\n for (const el of touched) {\n if (el.dataset.sfAutofilled !== '1') continue\n el.value = ''\n delete el.dataset.sfAutofilled\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n }\n lastZip.current = null\n setProvinceLocked(false)\n setFilled(false)\n }\n\n const runLookup = (zip: string) => {\n const lookup = lookupRef.current\n if (!lookup || !zip || zip === lastZip.current) return\n if (postalCode?.pattern && !new RegExp(`^(?:${postalCode.pattern})$`).test(zip)) return\n lastZip.current = zip\n const form = zipRef.current?.closest('form')\n void lookup(zip).then(\n (info) => {\n if (!info) return\n enqueue(() => {\n if (lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined, lock?: boolean) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) return false\n // Already locked from a previous lookup: leave it (the buyer corrects the postal code instead).\n if (el.dataset.sfLocked === '1') return false\n // Never over what they edited, nor over text in the field they are typing in. A focused field that is still\n // empty (Tab from the postal code lands on the next one) is filled: nothing of theirs is overwritten.\n if (el.dataset.sfUserEdited === '1' || (el.ownerDocument.activeElement === el && el.value)) return false\n // Only an empty field, or one this lookup filled before: never what the buyer typed.\n if (el.value && el.dataset.sfAutofilled !== '1') return false\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === value)) return false\n el.value = value\n el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n if (lock) {\n lockField(el)\n el.title = m.provinceLocked\n setProvinceLocked(true)\n }\n return true\n }\n const a = fill(n('province'), info.province, lockProvinceOnFill)\n const b = fill(n('city'), info.city)\n // Colonia only when the code has exactly ONE: with several the buyer chooses (the list is offered, not applied).\n const only = info.neighborhoods?.length === 1 ? info.neighborhoods[0] : null\n const c = showNeighborhood ? fill(n('neighborhood'), only) : false\n setColonias(info.neighborhoods ?? [])\n const list = info.neighborhoods ?? []\n const nameEl = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n const el = nameEl && !('length' in nameEl && !(nameEl instanceof HTMLSelectElement)) ? nameEl : null\n const typed = el ? el.value : ''\n const wantSelect = props.neighborhoodList === 'select' && showNeighborhood !== false && list.length > 1 && (!typed || list.includes(typed))\n let carried = false\n if (showNeighborhood && wantSelect !== coloniaSelectRef.current) {\n const userEdited = el?.dataset.sfUserEdited === '1'\n // The single colonia of the new code wins over a previous autofill, never over what the buyer chose.\n const value = only && !userEdited ? only : wantSelect ? (list.includes(typed) ? typed : '') : typed\n coloniaCarry.current = { value, autofilled: !userEdited && (!!only || el?.dataset.sfAutofilled === '1'), userEdited }\n carried = !!only && !userEdited\n }\n coloniaSelectRef.current = wantSelect\n setColoniaSelect(wantSelect)\n setFilled(a || b || c || carried)\n })\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\n\n // Applies the carried colonia to the field that replaced the old one (text <-> list), like any fill.\n useEffect(() => {\n const carry = coloniaCarry.current\n coloniaCarry.current = null\n if (!carry || !carry.value) return\n const form = zipRef.current?.closest('form')\n const el = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n if (!el || ('length' in el && !(el instanceof HTMLSelectElement))) return\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === carry.value)) return\n el.value = carry.value\n if (carry.userEdited) el.dataset.sfUserEdited = '1'\n else if (carry.autofilled) el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [coloniaSelect])\n\n useEffect(() => {\n const zip = defaults?.zip\n if (zip) runLookup(zip)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const hasLock = (root: HTMLElement | null) => !!root?.closest('form')?.querySelector('[data-sf-locked=\"1\"]')\n const changeZip = () => {\n releaseLookup()\n const zipEl = zipRef.current?.querySelector('input')\n zipEl?.focus()\n zipEl?.select()\n }\n const provinceHint = provinceLocked ? (\n <span data-sf-province-locked=\"\" title={m.provinceLocked}>\n <svg aria-hidden=\"true\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ display: 'inline-block', verticalAlign: '-1px', marginRight: 4 }}>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </svg>\n {m.provinceLocked}\n {' · '}\n <button type=\"button\" data-sf-change-zip=\"\" onClick={changeZip} style={{ background: 'none', border: 0, padding: 0, font: 'inherit', color: 'inherit', textDecoration: 'underline', cursor: 'pointer' }}>\n {m.changePostalCode}\n </button>\n </span>\n ) : undefined\n const numericZip = postalCode?.inputMode === 'numeric'\n return (\n <>\n <div ref={zipRef} className={join(cx.half)} data-sf-zip>\n <CheckoutField\n {...common}\n name={n('zip')}\n label={m.zip}\n autoComplete=\"postal-code\"\n inputMode={postalCode?.inputMode ?? 'text'}\n {...(postalCode?.pattern ? { pattern: postalCode.pattern } : {})}\n {...(postalCode?.maxLength ? { maxLength: postalCode.maxLength } : {})}\n {...(postalCode?.title ? { title: postalCode.title } : {})}\n {...(numericZip ? { autoCapitalize: 'none' } : {})}\n defaultValue={defaults?.zip ?? ''}\n error={errors[n('zip')] ?? null}\n classNames={{ ...cx, root: cx.root }}\n onInput={(e) => {\n const v = e.currentTarget.value.trim()\n // Editing the code that defined the state frees it (and what the lookup filled) before anything else.\n if (v !== lastZip.current && hasLock(zipRef.current)) releaseLookup()\n if (postalCode?.maxLength && v.length === postalCode.maxLength) runLookup(v)\n }}\n onBlur={(e) => runLookup(e.currentTarget.value.trim())}\n />\n </div>\n {provinces && provinces.length ? (\n <CheckoutField {...common} as=\"select\" name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} hint={provinceHint}>\n <option value=\"\" disabled>\n {m.provincePlaceholder}\n </option>\n {provinces.map((p) => (\n <option key={p.code ?? p.name} value={p.name}>\n {p.name}\n </option>\n ))}\n </CheckoutField>\n ) : (\n <CheckoutField {...common} name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} hint={provinceHint} />\n )}\n <CheckoutField {...common} name={n('city')} label={m.city} autoComplete=\"address-level2\" defaultValue={defaults?.city ?? ''} error={errors[n('city')] ?? null} classNames={field(cx, 'half')} />\n {showNeighborhood && coloniaSelect ? (\n <CheckoutField\n {...common}\n as=\"select\"\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={colonias.includes(defaults?.neighborhood ?? '') ? (defaults?.neighborhood ?? '') : ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n >\n <option value=\"\" disabled={showNeighborhood === 'required'}>\n {m.neighborhoodPlaceholder}\n </option>\n {colonias.map((c) => (\n <option key={c} value={c}>\n {c}\n </option>\n ))}\n </CheckoutField>\n ) : showNeighborhood ? (\n <CheckoutField\n {...common}\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={defaults?.neighborhood ?? ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n {...(colonias.length && !coloniaSelect ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length && !coloniaSelect ? (\n <datalist id={listId}>\n {colonias.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n ) : null}\n {/* The lookup result, announced once (not on every keystroke). */}\n <p role=\"status\" aria-live=\"polite\" data-sf-zip-status style={filled ? undefined : { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }} className={filled ? join(cx.hint, cx.wide) : undefined}>\n {filled ? m.lookupFilled : ''}\n </p>\n <CheckoutField {...common} name={n('address1')} label={m.address1} autoComplete=\"address-line1\" defaultValue={defaults?.address1 ?? ''} error={errors[n('address1')] ?? null} hint={m.address1Hint} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('address2')} label={m.address2} autoComplete=\"address-line2\" optional defaultValue={defaults?.address2 ?? ''} error={errors[n('address2')] ?? null} classNames={field(cx, 'half')} />\n {showReference ? (\n <CheckoutField {...common} name={n('reference')} label={m.reference} optional defaultValue={defaults?.reference ?? ''} error={errors[n('reference')] ?? null} hint={m.referenceHint} classNames={field(cx, 'wide')} maxLength={200} />\n ) : null}\n <input type=\"hidden\" name=\"country_code\" value={countryCode} />\n {children}\n </>\n )\n}\n","/**\n * Order summary of a checkout: lines and the server totals (subtotal, discounts, shipping, taxes, total) exactly as\n * `cart.cost` sends them; nothing is added or recalculated. `OrderSummaryDisclosure` wraps it for phones: a collapsed\n * bar with the total at the top of the page (native `<details>`, no JavaScript, no layout shift on hydration).\n */\nimport type { ReactNode } from 'react'\nimport { formatMoney, type CartCost, type CartLine, type Money } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { ProductThumb } from '../ui/product-preview.js'\n\nexport type OrderSummaryMessages = {\n title: string\n subtotal: string\n discount: string\n shipping: string\n /** Shipping not chosen yet. */\n shippingPending: string\n /** Shipping being saved / re-read. */\n updating: string\n free: string\n taxes: string\n /** Taxes already inside the prices, `{amount}`. */\n taxesIncluded: string\n total: string\n /** `{n}` = quantity. */\n quantity: string\n show: string\n hide: string\n}\n\nconst ES: OrderSummaryMessages = {\n title: 'Tu pedido',\n subtotal: 'Subtotal',\n discount: 'Descuento',\n shipping: 'Envío',\n shippingPending: 'Al elegir la entrega',\n updating: 'Actualizando…',\n free: 'Gratis',\n taxes: 'Impuestos',\n taxesIncluded: 'Incluye {amount} de impuestos',\n total: 'Total',\n quantity: 'Cantidad: {n}',\n show: 'Ver resumen del pedido',\n hide: 'Ocultar resumen del pedido',\n}\n\nconst EN: OrderSummaryMessages = {\n title: 'Your order',\n subtotal: 'Subtotal',\n discount: 'Discount',\n shipping: 'Shipping',\n shippingPending: 'Calculated at delivery',\n updating: 'Updating…',\n free: 'Free',\n taxes: 'Taxes',\n taxesIncluded: 'Includes {amount} in taxes',\n total: 'Total',\n quantity: 'Quantity: {n}',\n show: 'Show order summary',\n hide: 'Hide order summary',\n}\n\nexport function orderSummaryMessages(locale?: string | null, overrides?: Partial<OrderSummaryMessages> | null): OrderSummaryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type OrderSummaryClassNames = Partial<\n Record<'root' | 'title' | 'lines' | 'line' | 'media' | 'qty' | 'lineTitle' | 'variant' | 'linePrice' | 'totals' | 'row' | 'discount' | 'muted' | 'free' | 'total' | 'note', string>\n>\n\nexport type OrderSummaryProps = {\n lines: readonly CartLine[]\n /** `cart.cost` as the server sends it. */\n cost: CartCost\n /** The delivery is being saved and the cart re-read: shipping and total say so (`aria-busy`). */\n updating?: boolean\n /** Picture of a line (e.g. `<ProductImage>`), 48-64 px. The quantity badge sits on it. Default: `<ProductThumb>` of the line's image (fallback initial when it has none). */\n renderLineMedia?: (line: CartLine) => ReactNode\n /** Show the default picture of each line. Default true; `false` gives the text-only \"2 × Name\" list. */\n media?: boolean\n renderAmount?: (amount: Money) => ReactNode\n /** Heading. `false` hides it (the disclosure already names the block). */\n title?: ReactNode | false\n /** Heading level. Default 2. */\n headingLevel?: 2 | 3\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n classNames?: OrderSummaryClassNames\n /** Rendered between the lines and the totals (e.g. a discount code form). */\n children?: ReactNode\n}\n\n/** The line's own picture, else the product's; `decorative` because the name is right beside it. */\nfunction defaultLineMedia(l: CartLine): ReactNode {\n const img = l.merchandise.image ?? l.merchandise.product.featured_image ?? null\n return <ProductThumb image={img} name={l.merchandise.product.title} size={56} decorative zoom={false} />\n}\n\nconst isZero = (m: Money | null | undefined) => !!m && Number(m.amount) === 0\nconst positive = (m: Money | null | undefined): m is Money => !!m && Number(m.amount) > 0\n\n/** Lines and totals of the order. The total row is `aria-live`, so a new total after choosing delivery is announced. */\nexport function OrderSummary(props: OrderSummaryProps) {\n const { lines, cost, updating = false, media = true, renderAmount, title, headingLevel = 2, classNames: cx = {}, children } = props\n const locale = useResolvedLocale(props.locale)\n const m = orderSummaryMessages(locale, props.messages)\n const money = (v: Money) => (renderAmount ? renderAmount(v) : formatMoney(v, locale))\n const renderLineMedia = props.renderLineMedia ?? (media ? defaultLineMedia : undefined)\n const H = headingLevel === 3 ? 'h3' : 'h2'\n const discounts = cost.discounts?.filter((d) => positive(d.amount)) ?? []\n return (\n <div className={cx.root} data-sf-summary>\n {title === false ? null : (\n <H className={cx.title} data-sf-summary-title>\n {title ?? m.title}\n </H>\n )}\n <ul className={cx.lines} data-sf-summary-lines>\n {lines.map((l) => {\n const variant = l.merchandise.title && !/^default( title)?$/i.test(l.merchandise.title) ? l.merchandise.title : null\n return (\n <li key={l.id} className={cx.line} data-sf-summary-line>\n {renderLineMedia ? (\n <span className={cx.media} data-sf-summary-media>\n {renderLineMedia(l)}\n {l.quantity > 1 ? (\n <span className={cx.qty} data-sf-summary-qty aria-hidden=\"true\">\n {l.quantity}\n </span>\n ) : null}\n </span>\n ) : null}\n <span data-sf-summary-line-body>\n <span className={cx.lineTitle} data-sf-summary-line-title>\n {!renderLineMedia && l.quantity > 1 ? `${l.quantity} × ` : null}\n {l.merchandise.product.title}\n </span>\n {variant ? (\n <span className={cx.variant} data-sf-summary-variant>\n {variant}\n </span>\n ) : null}\n {renderLineMedia || l.quantity > 1 ? (\n <span style={{ position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }}>{m.quantity.replace('{n}', String(l.quantity))}</span>\n ) : null}\n </span>\n <span className={cx.linePrice} data-sf-summary-line-price>\n {money(l.cost.total)}\n </span>\n </li>\n )\n })}\n </ul>\n {children}\n <dl className={cx.totals} data-sf-summary-totals aria-busy={updating || undefined}>\n <div className={cx.row} data-sf-summary-row=\"subtotal\">\n <dt>{m.subtotal}</dt>\n <dd>{money(cost.subtotal)}</dd>\n </div>\n {discounts.length\n ? discounts.map((d) => (\n <div key={d.id} className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{d.code ? `${m.discount} (${d.code})` : d.title || m.discount}</dt>\n <dd>−{money(d.amount)}</dd>\n </div>\n ))\n : positive(cost.discount) ? (\n <div className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{m.discount}</dt>\n <dd>−{money(cost.discount)}</dd>\n </div>\n ) : null}\n <div className={cx.row} data-sf-summary-row=\"shipping\">\n <dt>{m.shipping}</dt>\n <dd className={updating || !cost.shipping ? cx.muted : undefined}>\n {updating ? m.updating : !cost.shipping ? m.shippingPending : isZero(cost.shipping) ? <span className={cx.free}>{m.free}</span> : money(cost.shipping)}\n </dd>\n </div>\n {positive(cost.tax) && !cost.tax_included ? (\n <div className={cx.row} data-sf-summary-row=\"tax\">\n <dt>{m.taxes}</dt>\n <dd>{money(cost.tax)}</dd>\n </div>\n ) : null}\n <div className={cx.total} data-sf-summary-row=\"total\">\n <dt>{m.total}</dt>\n <dd aria-live=\"polite\" data-updating={updating || undefined}>\n {money(cost.total)}\n </dd>\n </div>\n </dl>\n {positive(cost.tax) && cost.tax_included ? (\n <p className={cx.note} data-sf-summary-tax-note>\n {m.taxesIncluded.split('{amount}').flatMap((part, i) => (i === 0 ? [part] : [<span key={i}>{money(cost.tax!)}</span>, part]))}\n </p>\n ) : null}\n </div>\n )\n}\n\nexport type OrderSummaryDisclosureProps = {\n /** Total shown on the collapsed bar (`cart.cost.total`). */\n total: Money\n updating?: boolean\n renderAmount?: (amount: Money) => ReactNode\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n /** Start open (default closed). */\n defaultOpen?: boolean\n className?: string\n classNames?: Partial<Record<'summary' | 'label' | 'total' | 'panel', string>>\n /** Usually an `<OrderSummary title={false} … />`. */\n children: ReactNode\n}\n\n/**\n * Phones: the order summary as a collapsed bar at the top (\"Show order summary · $1,234.00\"). Native `<details>`:\n * works without JavaScript, the server HTML is already the final layout (no shift on hydration). Show it only on\n * narrow screens and the full summary on wide ones (the shop's CSS).\n */\nexport function OrderSummaryDisclosure({ total, updating, renderAmount, locale: loc, messages, defaultOpen = false, className, classNames: cx = {}, children }: OrderSummaryDisclosureProps) {\n const locale = useResolvedLocale(loc)\n const m = orderSummaryMessages(locale, messages)\n return (\n <details className={className} data-sf-summary-disclosure {...(defaultOpen ? { open: true } : {})}>\n <summary className={cx.summary} data-sf-summary-toggle>\n <span className={cx.label} data-sf-summary-toggle-label>\n <span data-sf-summary-show>{m.show}</span>\n <span data-sf-summary-hide>{m.hide}</span>\n </span>\n <span className={cx.total} data-sf-summary-toggle-total data-updating={updating || undefined}>\n {renderAmount ? renderAmount(total) : formatMoney(total, locale)}\n </span>\n </summary>\n <div className={cx.panel} data-sf-summary-panel>\n {children}\n </div>\n </details>\n )\n}\n","/**\n * Which carrier rates to show first. Pure: no DOM, no amounts computed (costs are only compared, as the server sends\n * them). A long quote (10+ services, several per carrier) becomes up to three recommended rows (the cheapest, the\n * fastest and the best balance of both) plus the rest grouped by carrier, so the buyer compares three things instead of\n * scanning a flat list.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandKey } from './brands.js'\n\n/** Why a rate is recommended. `best_value` balances price and arrival time. */\nexport type RateTag = 'cheapest' | 'fastest' | 'best_value'\n\nexport type RecommendedRate<R extends ShippingRate = ShippingRate> = { rate: R; tags: RateTag[] }\n\nexport type RateGroup<R extends ShippingRate = ShippingRate> = {\n /** Brand key of the carrier (`fedex`), or `''` for rates without one. */\n key: string\n /** Carrier as the server sends it (first rate of the group), for `BrandMark` and the group name. */\n carrier: string | null\n rates: R[]\n}\n\nexport type RecommendRatesOptions = {\n /** How many rates to recommend. Default 3. */\n count?: number\n /**\n * With this many rates or fewer every rate is recommended (no \"more options\"): hiding one or two rates behind a\n * toggle costs more than it saves. Default `count + 1`.\n */\n collapseAfter?: number\n /** Drop repeated services (same carrier and service, e.g. quoted by two providers), keeping the cheapest. Default true. */\n dedupe?: boolean\n}\n\nexport type RecommendedRates<R extends ShippingRate = ShippingRate> = {\n recommended: RecommendedRate<R>[]\n /** Everything else, grouped by carrier; groups ordered by their cheapest rate, rates by cost. */\n more: RateGroup<R>[]\n /** Number of rates in `more`. */\n moreCount: number\n}\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\nconst norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\nconst carrierKey = (r: ShippingRate) => (r.carrier ? brandKey(r.carrier) : r.provider ? brandKey(r.provider) : '')\n\n/** Repeated services (same carrier, same service code or title, same arrival): only the cheapest stays. Order kept. */\nexport function dedupeRates<R extends ShippingRate>(rates: readonly R[]): R[] {\n const best = new Map<string, R>()\n const keyOf = (r: R) => `${carrierKey(r)}|${norm(r.service_code) || norm(r.title)}|${daysOf(r) ?? ''}|${r.cost.currency_code}`\n for (const r of rates) {\n const k = keyOf(r)\n const prev = best.get(k)\n const c = costOf(r)\n if (!prev || (c !== null && (costOf(prev) === null || c < costOf(prev)!))) best.set(k, r)\n }\n const keep = new Set(best.values())\n return rates.filter((r) => keep.has(r))\n}\n\n/**\n * Up to `count` recommended rates and the rest by carrier.\n * - **cheapest**: lowest cost (only when every rate shares the currency); a tie goes to the faster one.\n * - **fastest**: fewest business days; a tie goes to the cheaper one. Only when some rate is strictly faster than the\n * cheapest, so the tag always tells the buyer something.\n * - **best_value**: the remaining rate with the best combined position in price and in time (sum of ranks), a tie goes\n * to the cheaper one. Fills the remaining slots.\n * Recommended rows come back cheapest first. Pickup is not a rate and is never hidden (the component shows it apart).\n */\nexport function recommendRates<R extends ShippingRate>(input: readonly R[], options: RecommendRatesOptions = {}): RecommendedRates<R> {\n const count = Math.max(1, options.count ?? 3)\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const collapseAfter = options.collapseAfter ?? count + 1\n const sameCurrency = new Set(rates.map((r) => r.cost.currency_code)).size <= 1\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n const byDays = (a: R, b: R) => (daysOf(a) ?? Infinity) - (daysOf(b) ?? Infinity)\n const tags = new Map<R, RateTag[]>()\n const tag = (r: R, t: RateTag) => tags.set(r, [...(tags.get(r) ?? []), t])\n\n const cheapest = sameCurrency && rates.length > 1 ? [...rates].sort((a, b) => byCost(a, b) || byDays(a, b))[0] : undefined\n if (cheapest && costOf(cheapest) !== null) tag(cheapest, 'cheapest')\n const fastest = rates.length > 1 ? [...rates].sort((a, b) => byDays(a, b) || byCost(a, b))[0] : undefined\n if (fastest && daysOf(fastest) !== null && (!cheapest || fastest === cheapest || (daysOf(cheapest) ?? Infinity) > daysOf(fastest)!)) tag(fastest, 'fastest')\n\n const chosen: R[] = []\n for (const r of [cheapest, fastest]) if (r && tags.has(r) && !chosen.includes(r)) chosen.push(r)\n\n if (rates.length > collapseAfter) {\n // Rank in price and in time (ties share a rank); the best sum fills the remaining slots.\n const rank = (sorted: R[], val: (r: R) => number | null) => {\n const out = new Map<R, number>()\n let pos = 0\n let last: number | null | undefined\n sorted.forEach((r, i) => {\n const v = val(r)\n if (v !== last) pos = i\n last = v\n out.set(r, v === null ? sorted.length : pos)\n })\n return out\n }\n const priceRank = rank([...rates].sort(byCost), costOf)\n const timeRank = rank([...rates].sort(byDays), daysOf)\n const rest = rates\n .filter((r) => !chosen.includes(r))\n .sort((a, b) => priceRank.get(a)! + timeRank.get(a)! - (priceRank.get(b)! + timeRank.get(b)!) || byCost(a, b))\n let first = true\n for (const r of rest) {\n if (chosen.length >= count) break\n chosen.push(r)\n if (first) tag(r, 'best_value')\n first = false\n }\n } else {\n for (const r of rates) if (!chosen.includes(r)) chosen.push(r)\n }\n\n const recommended = chosen.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n const groups = new Map<string, RateGroup<R>>()\n for (const r of [...rates].sort(byCost)) {\n if (chosen.includes(r)) continue\n const key = carrierKey(r)\n const g = groups.get(key) ?? { key, carrier: r.carrier ?? r.provider ?? null, rates: [] }\n g.rates.push(r)\n groups.set(key, g)\n }\n const more = [...groups.values()]\n return { recommended, more, moreCount: more.reduce((n, g) => n + g.rates.length, 0) }\n}\n\nexport type FlatRatesOptions = {\n /** Count used to decide the `best_value` tag, as in `recommendRates` (default 3: only with more than 4 services). */\n count?: number\n /** Drop repeated services keeping the cheapest. Default true. */\n dedupe?: boolean\n /** Id of the chosen rate: it stays in the list even if it is a repeated service. */\n keepId?: string | null\n}\n\n/**\n * ONE flat list for `layout=\"flat\"`: every service (repeated ones dropped, the cheapest stays), ordered from the\n * lowest to the highest price, with the same tags `recommendRates` assigns (cheapest, fastest and, on long quotes,\n * best_value) on the rows that earn them. Nothing is hidden or grouped.\n */\nexport function flatRates<R extends ShippingRate>(input: readonly R[], options: FlatRatesOptions = {}): RecommendedRate<R>[] {\n const count = options.count ?? 3\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const tags = new Map<R, RateTag[]>()\n for (const { rate, tags: t } of recommendRates(rates, { count, dedupe: false }).recommended) tags.set(rate, t)\n const list = [...rates]\n const kept = options.keepId ? input.find((r) => r.id === options.keepId) : undefined\n if (kept && !list.includes(kept)) list.push(kept)\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n // Array.prototype.sort is stable: equal prices keep the server order.\n return list.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n}\n","/**\n * Pure helpers for the \"Delivery\" step: how to name a carrier rate, its arrival time, which rate is the cheapest or the\n * fastest, and one human note for the quote deadline. No amounts are computed: `cost` is shown as the server sends it;\n * comparing two costs to flag the cheapest is the only arithmetic.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandName } from './brands.js'\n\nexport type DeliveryMessages = {\n /** `{n}` = business days. */\n etaOne: string\n etaMany: string\n /** `{min}` / `{max}` = business days. */\n etaRange: string\n etaUpTo: string\n etaFrom: string\n cheapest: string\n fastest: string\n free: string\n pickupTitle: string\n /** Quote deadline, `{time}` = local time. */\n quoteToday: string\n quoteTomorrow: string\n /** `{date}` = short date + time. */\n quoteLater: string\n quoteSoon: string\n partial: string\n loading: string\n /** The quote expired or changed and the rates were reloaded. */\n requoted: string\n /** Tag of the recommended rate that balances price and arrival time (`layout=\"recommended\"`). */\n bestValue: string\n /** Toggle of the other rates, `{n}` = how many. */\n moreOptions: string\n /** Title of the group of rates without a carrier. */\n otherCarriers: string\n /** The rates could not be quoted (`error`). */\n error: string\n retry: string\n /** The order reaches the free-shipping minimum: nothing to choose. */\n freeShipping: string\n freeShippingNote: string\n /** Screen-reader status when the rates are ready (`{n}` = how many). */\n ratesReady: string\n}\n\nconst ES: DeliveryMessages = {\n etaOne: 'Llega en 1 día hábil',\n etaMany: 'Llega en {n} días hábiles',\n etaRange: 'Llega en {min} a {max} días hábiles',\n etaUpTo: 'Llega en máximo {max} días hábiles',\n etaFrom: 'Llega en {min} días hábiles o más',\n cheapest: 'Más económico',\n fastest: 'Más rápido',\n free: 'Gratis',\n pickupTitle: 'Recoger en {name}',\n quoteToday: 'Precios de envío vigentes hasta las {time}.',\n quoteTomorrow: 'Precios de envío vigentes hasta mañana a las {time}.',\n quoteLater: 'Precios de envío vigentes hasta el {date}.',\n quoteSoon: 'Los precios de envío vencen pronto ({time}).',\n partial: 'Algunas paqueterías no respondieron a tiempo; estas son las opciones disponibles.',\n loading: 'Buscando opciones de envío…',\n requoted: 'Las tarifas de envío cambiaron y ya están actualizadas. Revisa tu envío antes de pagar.',\n bestValue: 'Recomendado',\n moreOptions: 'Ver más opciones ({n})',\n otherCarriers: 'Otras opciones',\n error: 'No pudimos consultar las opciones de envío en este momento.',\n retry: 'Intentar de nuevo',\n freeShipping: 'Envío gratis',\n freeShippingNote: 'Tu pedido ya incluye el envío: no tienes que elegir paquetería.',\n ratesReady: 'Opciones de envío listas ({n}).',\n}\n\nconst EN: DeliveryMessages = {\n etaOne: 'Arrives in 1 business day',\n etaMany: 'Arrives in {n} business days',\n etaRange: 'Arrives in {min} to {max} business days',\n etaUpTo: 'Arrives in up to {max} business days',\n etaFrom: 'Arrives in {min}+ business days',\n cheapest: 'Cheapest',\n fastest: 'Fastest',\n free: 'Free',\n pickupTitle: 'Pick up at {name}',\n quoteToday: 'Shipping prices valid until {time}.',\n quoteTomorrow: 'Shipping prices valid until tomorrow at {time}.',\n quoteLater: 'Shipping prices valid until {date}.',\n quoteSoon: 'Shipping prices expire soon ({time}).',\n partial: \"We couldn't reach every carrier. These are the options available now.\",\n loading: 'Looking for delivery options…',\n requoted: 'Shipping rates changed and are now up to date. Check your delivery before paying.',\n bestValue: 'Recommended',\n moreOptions: 'Show more options ({n})',\n otherCarriers: 'Other options',\n error: \"We couldn't get delivery options right now.\",\n retry: 'Try again',\n freeShipping: 'Free shipping',\n freeShippingNote: 'Shipping is included in your order: there is no carrier to choose.',\n ratesReady: 'Delivery options ready ({n}).',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function deliveryMessages(locale?: string | null, overrides?: Partial<DeliveryMessages> | null): DeliveryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n// A value that already ends in a period (\"9:39 p.m.\") does not get a second one from the template.\nconst fill = (tpl: string, vars: Record<string, string | number>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k: string) => String(vars[k] ?? '')).replace(/\\.\\.$/, '.')\n\n/** Commercial carrier name of a rate (`fedex` → \"FedEx\"); `null` without carrier. */\nexport function rateCarrier(rate: Pick<ShippingRate, 'carrier'>): string | null {\n return brandName(rate.carrier)\n}\n\n/**\n * Service name without the carrier repeated: \"FedEx Express Saver\" with carrier `fedex` → \"Express Saver\". Falls back\n * to the title when stripping would leave nothing.\n */\nexport function rateService(rate: Pick<ShippingRate, 'title' | 'carrier'>): string {\n const title = rate.title.trim()\n const carrier = rateCarrier(rate)\n if (!carrier) return title\n for (const prefix of [carrier, rate.carrier ?? '']) {\n if (!prefix) continue\n if (title.toLowerCase().startsWith(prefix.toLowerCase())) {\n const rest = title.slice(prefix.length).replace(/^[\\s·:|-]+/, '')\n if (rest) return rest\n }\n }\n return title\n}\n\n/** Arrival time of a rate: business days from the provider, else the server `eta` text as is. */\nexport function rateEta(\n rate: Pick<ShippingRate, 'eta' | 'eta_days_min' | 'eta_days_max'>,\n messages: DeliveryMessages = ES,\n): string | null {\n const { eta_days_min: min, eta_days_max: max } = rate\n if (typeof min === 'number' && typeof max === 'number') {\n if (min === max) return min === 1 ? messages.etaOne : fill(messages.etaMany, { n: min })\n return fill(messages.etaRange, { min, max })\n }\n if (typeof max === 'number') return max === 1 ? messages.etaOne : fill(messages.etaUpTo, { max })\n if (typeof min === 'number') return min === 1 ? messages.etaOne : fill(messages.etaFrom, { min })\n return rate.eta ?? null\n}\n\nexport type RateBadge = 'cheapest' | 'fastest'\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\n\n/**\n * Badges per rate id. Only with two or more rates, only when one rate is strictly the cheapest (same currency) or\n * strictly the fastest: a tie gets no badge, so the badge always tells the buyer something.\n */\nexport function rateBadges(rates: readonly ShippingRate[]): Map<string, RateBadge[]> {\n const out = new Map<string, RateBadge[]>()\n if (rates.length < 2) return out\n const add = (id: string, b: RateBadge) => out.set(id, [...(out.get(id) ?? []), b])\n const unique = (values: Array<[string, number | null]>) => {\n const known = values.filter((v): v is [string, number] => v[1] !== null)\n if (known.length < 2) return null\n const min = Math.min(...known.map((v) => v[1]))\n const winners = known.filter((v) => v[1] === min)\n return winners.length === 1 ? winners[0]![0] : null\n }\n const currencies = new Set(rates.map((r) => r.cost.currency_code))\n if (currencies.size === 1) {\n const id = unique(rates.map((r) => [r.id, costOf(r)]))\n if (id) add(id, 'cheapest')\n }\n const fast = unique(rates.map((r) => [r.id, daysOf(r)]))\n if (fast) add(fast, 'fastest')\n return out\n}\n\n/** Earliest `expires_at` of the rates (the deadline of the whole list), or `null`. */\nexport function quoteDeadline(rates: readonly Pick<ShippingRate, 'expires_at'>[]): Date | null {\n let best: Date | null = null\n for (const r of rates) {\n if (!r.expires_at) continue\n const d = new Date(r.expires_at)\n if (Number.isNaN(d.getTime())) continue\n if (!best || d < best) best = d\n }\n return best\n}\n\nexport type QuoteNote = { text: string; soon: boolean }\n\n/**\n * One human note for the quote deadline, in the buyer's time zone (or `timeZone`): \"valid until 9:39 p.m.\", \"until\n * tomorrow at…\", \"until Oct 24, …\", or \"expire soon\" within `soonMinutes` (default 15). `null` when already past.\n */\nexport function quoteNote(\n deadline: Date | null,\n opts: { locale?: string; now?: Date; timeZone?: string; soonMinutes?: number; messages?: DeliveryMessages } = {},\n): QuoteNote | null {\n if (!deadline) return null\n const now = opts.now ?? new Date()\n const left = deadline.getTime() - now.getTime()\n if (left <= 0) return null\n const m = opts.messages ?? ES\n const locale = opts.locale ?? 'es-MX'\n const tz = opts.timeZone ? { timeZone: opts.timeZone } : {}\n const time = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n if (left <= (opts.soonMinutes ?? 15) * 60_000) return { text: fill(m.quoteSoon, { time }), soon: true }\n const day = (d: Date) => new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', ...tz }).format(d)\n if (day(deadline) === day(now)) return { text: fill(m.quoteToday, { time }), soon: false }\n if (day(deadline) === day(new Date(now.getTime() + 86_400_000))) return { text: fill(m.quoteTomorrow, { time }), soon: false }\n const date = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n return { text: fill(m.quoteLater, { date }), soon: false }\n}\n\n/** Error codes a server uses (or will use) when the chosen rate is no longer quotable. */\nconst QUOTE_CODES = new Set(['quote_expired', 'rate_expired', 'rate_changed', 'rate_unavailable', 'rate_not_found', 'stale_rate', 'invalid_rate'])\n\n/**\n * `true` when saving a shipping rate failed because the quote expired or the rates changed, so the shop should reload\n * the rates (and keep the address) instead of showing a generic failure. Recognizes the explicit codes\n * (`quote_expired`, `rate_expired`…, any status), a `409`, and the generic `422` on the rate field that older servers\n * answer when the provider re-quoted with new ids. 5xx and other 4xx stay real failures.\n */\nexport function isQuoteChange(err: { status?: number; code?: string | null; field?: string | null } | null | undefined): boolean {\n if (!err) return false\n if (err.code && QUOTE_CODES.has(err.code)) return true\n if (err.status === 409) return true\n return err.status === 422 && (err.field === 'rate_id' || err.field === 'delivery' || err.field === 'delivery.rate_id' || !err.field)\n}\n\n/**\n * The rate of a fresh quote that matches the one the buyer had chosen (same carrier and service), so a re-quote keeps\n * the choice even though the provider issued new ids. `null` when that service is no longer offered.\n */\nexport function matchRate<R extends Pick<ShippingRate, 'id' | 'carrier' | 'service_code' | 'title'>>(previous: Pick<ShippingRate, 'carrier' | 'service_code' | 'title'> | null | undefined, rates: readonly R[]): R | null {\n if (!previous) return null\n const norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\n const sameCarrier = (r: R) => norm(r.carrier) === norm(previous.carrier)\n if (previous.service_code) {\n const hit = rates.find((r) => sameCarrier(r) && norm(r.service_code) === norm(previous.service_code))\n if (hit) return hit\n }\n return rates.find((r) => sameCarrier(r) && norm(r.title) === norm(previous.title)) ?? null\n}\n","import { useMemo, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react'\nimport { formatMoney, type Money, type PickupOption, type ShippingRate } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { BrandMark } from './brand-mark.js'\nimport { flatRates, recommendRates, type RateTag } from './recommend.js'\nimport {\n deliveryMessages,\n quoteDeadline,\n quoteNote,\n rateBadges,\n rateCarrier,\n rateEta,\n rateService,\n type DeliveryMessages,\n type RateBadge,\n} from './delivery.js'\n\nexport type DeliveryOptionsClassNames = Partial<\n Record<\n | 'root'\n | 'option'\n | 'radio'\n | 'mark'\n | 'body'\n | 'title'\n | 'carrier'\n | 'service'\n | 'eta'\n | 'badges'\n | 'badge'\n | 'price'\n | 'free'\n | 'freeBanner'\n | 'note'\n | 'partial'\n | 'skeleton'\n | 'more'\n | 'moreSummary'\n | 'group'\n | 'groupTitle'\n | 'error'\n | 'retry',\n string\n >\n>\n\nexport type DeliveryOptionsProps = {\n rates: readonly ShippingRate[]\n pickup?: readonly PickupOption[]\n /** Radio group name. Default `delivery_choice`. */\n name?: string\n /** Form value of a rate. Default `rate:<id>`. */\n rateValue?: (rate: ShippingRate) => string\n /** Form value of a pickup branch. Default `pickup:<branch_id>`. */\n pickupValue?: (branch: PickupOption) => string\n /** Uncontrolled preselection. Default: the first rate. `null`: nothing preselected. */\n defaultValue?: string | null\n /** Controlled value (use with `onValueChange`). */\n value?: string\n onValueChange?: (value: string) => void\n /** Some provider did not answer (`DeliveryOptions.partial`): one neutral note above the list. */\n partial?: boolean\n /** The previous quote expired or changed and these rates are fresh: one status note above the list. */\n requoted?: boolean\n /** Rates are being quoted again: skeleton rows (no rates yet) or the current rows dimmed, `aria-busy`. */\n loading?: boolean\n /**\n * The order reaches the free-shipping minimum (`DeliveryOptions.free`, configured by the organization): no carrier\n * selector, just \"Free shipping\" and the rate is submitted by itself so the buyer goes straight to payment.\n * With pickup branches the plain rows stay (delivery or pickup is still a real choice).\n */\n free?: boolean\n /** Rates just arrived by themselves (auto quote): a polite screen-reader status says how many. */\n announceReady?: boolean\n /** Quote deadline note: `always` (default), only when it is `soon`, or `never`. */\n quoteNote?: 'always' | 'soon' | 'never'\n /** Time zone of the note. Default: the buyer's browser. */\n timeZone?: string\n /** Show the carrier marks. Default true. */\n marks?: boolean\n /** Cheapest / fastest badges. Default true. */\n badges?: boolean\n required?: boolean\n locale?: string\n messages?: Partial<DeliveryMessages>\n renderAmount?: (amount: Money) => ReactNode\n classNames?: DeliveryOptionsClassNames\n /**\n * `list` (default): every rate, as the server orders them. `recommended`: up to `recommendedCount` rates (cheapest,\n * fastest and the best balance, tagged) and the rest under \"Show more options (N)\", grouped by carrier so the carrier\n * name is not repeated on every row. Repeated services are dropped (the cheapest stays). Works without JavaScript\n * (`<details>`); it opens by itself when the chosen rate is inside. `flat`: ONE plain list like most online shops:\n * every service ordered from the lowest to the highest price, repeated services dropped (the cheapest stays), the\n * cheapest / fastest / recommended tags on the rows that earn them, no `<details>` and no groups. The chosen rate is\n * always listed, and with no explicit default the preselected row is the first one (the cheapest).\n */\n layout?: 'list' | 'recommended' | 'flat'\n /** Rates recommended in `layout=\"recommended\"`. Default 3. */\n recommendedCount?: number\n /**\n * The rates could not be quoted (provider down, timeout): one friendly alert instead of the list, with a retry button\n * when `onRetry` is set. `true` uses the default text; a string replaces it.\n */\n error?: boolean | string\n onRetry?: () => void\n /** `data-testid` of every radio. */\n testId?: string\n /** Rows the shop renders before the rates (e.g. \"home delivery, rates after the address\"). */\n children?: ReactNode\n}\n\nconst SR_ONLY: CSSProperties = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }\n\nconst useHydrated = () =>\n useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n )\n\nfunction PickupGlyph({ size = 24 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 48 32\" width={Math.round(size * 1.5)} height={size} aria-hidden=\"true\" focusable=\"false\" style={{ flex: 'none' }} data-sf-brand-mark=\"pickup\">\n <rect x=\"0.5\" y=\"0.5\" width=\"47\" height=\"31\" rx=\"5\" fill=\"var(--sf-brand-mark-bg, #E7E9EE)\" stroke=\"var(--sf-brand-mark-ring, rgb(127 127 127 / 0.35))\" />\n <path d=\"M15 13.5 17 9h14l2 4.5M15 13.5h18M15 13.5V23h18v-9.5M21 23v-5h6v5\" fill=\"none\" stroke=\"var(--sf-brand-mark-fg, #2B2F38)\" strokeWidth=\"1.8\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/**\n * The rates and pickup branches of \"Delivery\" as native radios: carrier mark and commercial name, readable service,\n * arrival time, cheapest / fastest badges, price as the server sends it, and ONE note for the quote deadline in the\n * buyer's time zone. Works without JavaScript (plain radios in the page form); the note appears after hydration in a\n * reserved line, so it never shifts the layout.\n *\n * Wrap it in the shop's own `<fieldset><legend>`. Style it with `classNames` and/or the default sheet\n * `@asteby/storefront-react/checkout.css`.\n */\nexport function DeliveryOptions(props: DeliveryOptionsProps) {\n const {\n rates,\n pickup = [],\n name = 'delivery_choice',\n rateValue = (r) => `rate:${r.id}`,\n pickupValue = (b) => `pickup:${b.branch_id}`,\n value,\n onValueChange,\n partial = false,\n requoted = false,\n loading = false,\n timeZone,\n marks = true,\n badges: showBadges = true,\n required = true,\n renderAmount,\n classNames: cx = {},\n testId,\n children,\n layout = 'list',\n error,\n onRetry,\n free = false,\n } = props\n const locale = useResolvedLocale(props.locale)\n const m = useMemo(() => deliveryMessages(locale, props.messages), [locale, props.messages])\n const hydrated = useHydrated()\n const badges = useMemo(() => (showBadges ? rateBadges(rates) : new Map<string, RateBadge[]>()), [rates, showBadges])\n const flat = useMemo(\n () => (layout === 'flat' ? flatRates(rates, { count: props.recommendedCount ?? 3, keepId: value ? rates.find((r) => rateValue(r) === value)?.id ?? null : null }) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layout, rates, props.recommendedCount, value],\n )\n const firstRate = flat ? flat[0]?.rate : rates[0]\n const firstValue = firstRate ? rateValue(firstRate) : null\n const defaultValue = props.defaultValue === undefined ? firstValue : props.defaultValue\n const amount = (money: Money) => (Number(money.amount) === 0 ? <span className={cx.free} data-sf-delivery-free>{m.free}</span> : renderAmount ? renderAmount(money) : formatMoney(money, locale))\n const mode = props.quoteNote ?? 'always'\n const deadline = mode === 'never' ? null : quoteDeadline(rates)\n const note = hydrated && deadline ? quoteNote(deadline, { locale, messages: m, ...(timeZone ? { timeZone } : {}) }) : null\n const shownNote = note && (mode === 'always' || note.soon) ? note : null\n\n const current = value ?? defaultValue ?? null\n const plan = useMemo(\n () => (layout === 'recommended' ? recommendRates(rates, { count: props.recommendedCount ?? 3 }) : null),\n [layout, rates, props.recommendedCount],\n )\n const inMore = plan ? plan.more.some((g) => g.rates.some((r) => rateValue(r) === current)) : false\n\n const radio = (v: string, describedBy?: string) => (\n <input\n type=\"radio\"\n name={name}\n value={v}\n required={required}\n className={cx.radio}\n {...(describedBy ? { 'aria-describedby': describedBy } : {})}\n {...(value !== undefined ? { checked: value === v, onChange: () => onValueChange?.(v) } : { defaultChecked: v === defaultValue, ...(onValueChange ? { onChange: () => onValueChange(v) } : {}) })}\n {...(testId ? { 'data-testid': testId } : {})}\n />\n )\n\n const tagText = (t: RateTag | RateBadge) => (t === 'cheapest' ? m.cheapest : t === 'fastest' ? m.fastest : m.bestValue)\n\n /** One row: [radio] [mark] carrier + service / arrival / tags ........ price. In a carrier group the mark and the carrier name live in the group title. */\n const rateRow = (rate: ShippingRate, opts: { tags: readonly (RateTag | RateBadge)[]; grouped?: boolean }) => {\n const carrier = rateCarrier(rate)\n const service = rateService(rate)\n const eta = rateEta(rate, m)\n return (\n <label key={rate.id} className={cx.option} data-sf-delivery-option data-loading={loading || undefined} data-grouped={opts.grouped || undefined}>\n {radio(rateValue(rate))}\n {marks && !opts.grouped ? (\n // Fixed slot: logos of different widths do not push the text column out of line.\n <span data-sf-delivery-mark aria-hidden=\"true\">\n <BrandMark brand={rate.carrier ?? rate.provider ?? rate.title} size={28} {...(cx.mark ? { className: cx.mark } : {})} />\n </span>\n ) : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n {carrier ? (\n opts.grouped ? (\n <>\n {/* The group title already shows the carrier: only screen readers hear it again (each radio keeps a full name). */}\n <span style={SR_ONLY}>{carrier} </span>\n <span className={cx.carrier} data-sf-delivery-carrier data-sf-delivery-service-only>\n {service}\n </span>\n </>\n ) : (\n <>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {carrier}\n </span>{' '}\n <span className={cx.service} data-sf-delivery-service>\n {service}\n </span>\n </>\n )\n ) : (\n <span className={cx.carrier} data-sf-delivery-carrier>\n {service}\n </span>\n )}\n </span>\n {eta ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {eta}\n </span>\n ) : null}\n {opts.tags.length ? (\n <span className={cx.badges} data-sf-delivery-badges>\n {opts.tags.map((b) => (\n <span key={b} className={cx.badge} data-sf-delivery-badge={b}>\n {tagText(b)}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n {amount(rate.cost)}\n </span>\n </label>\n )\n }\n\n const errorText = error ? (typeof error === 'string' ? error : m.error) : null\n // Free shipping: the only thing left to say. The cheapest non-pickup rate travels as a hidden value.\n const freeRate = free && !loading && pickup.length === 0 ? (rates.find((r) => !r.pickup) ?? null) : null\n\n return (\n <div className={cx.root} data-sf-delivery data-layout={layout} aria-busy={loading || undefined}>\n {partial && !errorText ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-partial>\n {m.partial}\n </p>\n ) : null}\n {requoted ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-requoted>\n {m.requoted}\n </p>\n ) : null}\n {loading ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-loading>\n {m.loading}\n </span>\n ) : null}\n {props.announceReady && !loading && rates.length > 0 ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-ready>\n {freeRate ? m.freeShipping : m.ratesReady.replace('{n}', String(rates.length))}\n </span>\n ) : null}\n {errorText && rates.length === 0 && !loading ? (\n <div role=\"alert\" className={cx.error} data-sf-delivery-error>\n <p>{errorText}</p>\n {onRetry ? (\n <button type=\"button\" className={cx.retry} onClick={onRetry} data-sf-delivery-retry>\n {m.retry}\n </button>\n ) : null}\n </div>\n ) : null}\n {freeRate ? (\n <div className={cx.freeBanner} role={props.announceReady ? undefined : 'status'} data-sf-delivery-free-banner>\n <input type=\"hidden\" name={name} value={rateValue(freeRate)} {...(testId ? { 'data-testid': testId } : {})} />\n <p className={cx.free} data-sf-delivery-free-title>\n <strong>{m.freeShipping}</strong>\n </p>\n <p className={cx.note}>{m.freeShippingNote}</p>\n </div>\n ) : null}\n {children}\n {loading && rates.length === 0\n ? [0, 1, 2].map((i) => <div key={i} className={cx.skeleton} data-sf-delivery-skeleton aria-hidden=\"true\" />)\n : null}\n {freeRate ? null : flat\n ? flat.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : plan\n ? plan.recommended.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : rates.map((rate) => rateRow(rate, { tags: badges.get(rate.id) ?? [] }))}\n {plan && plan.moreCount > 0 ? (\n <details className={cx.more} data-sf-delivery-more {...(inMore ? { open: true } : {})}>\n <summary className={cx.moreSummary} data-sf-delivery-more-summary>\n {m.moreOptions.replace('{n}', String(plan.moreCount))}\n </summary>\n <div data-sf-delivery-groups>\n {plan.more.map((g) => {\n const carrierName = g.carrier ? rateCarrier({ carrier: g.carrier }) : null\n const id = `${name}-group-${g.key || 'other'}`\n return (\n <div key={g.key || 'other'} role=\"group\" aria-labelledby={id} className={cx.group} data-sf-delivery-group={g.key || 'other'}>\n <p id={id} className={cx.groupTitle} data-sf-delivery-group-title>\n {marks && g.carrier ? <BrandMark brand={g.carrier} size={22} /> : null}\n <span>{carrierName ?? m.otherCarriers}</span>\n </p>\n {g.rates.map((rate) => rateRow(rate, { tags: [], grouped: Boolean(carrierName) }))}\n </div>\n )\n })}\n </div>\n </details>\n ) : null}\n {pickup.map((b) => (\n <label key={b.branch_id} className={cx.option} data-sf-delivery-option data-sf-delivery-pickup>\n {radio(pickupValue(b))}\n {marks ? <PickupGlyph size={28} /> : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {m.pickupTitle.replace('{name}', b.name)}\n </span>\n </span>\n {b.address || b.city ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {[b.address, b.city].filter(Boolean).join(', ')}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n <span className={cx.free} data-sf-delivery-free>\n {m.free}\n </span>\n </span>\n </label>\n ))}\n {deadline ? (\n <p className={cx.note} data-sf-delivery-note data-soon={shownNote?.soon || undefined} aria-live=\"polite\">\n {shownNote?.text ?? ''}\n </p>\n ) : null}\n </div>\n )\n}\n","'use client'\n/**\n * One-step delivery: as soon as the address is complete the shipping rates load by themselves (debounced), the default\n * rate is preselected and payment is ready. No \"continue\" button, no choosing again.\n *\n * The hook is transport-agnostic: the shop gives `quote(address)` (save the address in the cart, read the delivery\n * options) and renders the result with `<DeliveryOptions>`. Only the fields that change the price re-quote (country,\n * postal code, state, city): editing the street number, the phone or the reference does not. Free shipping and fixed\n * prices come from the server (`DeliveryOptions.free` / `.fixed`, configured per organization): nothing here knows an\n * amount.\n */\nimport type { DeliveryOptions, ShippingRate } from '@asteby/storefront'\nimport { type RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { matchRate } from './delivery.js'\n\n/** What the shop reads from the address fields of the form. Keys follow the `name` of each input. */\nexport type QuoteAddress = {\n country_code: string\n zip: string\n province: string\n city: string\n neighborhood: string\n address1: string\n [key: string]: string\n}\n\nexport type AutoQuoteStatus =\n /** Address incomplete: nothing is quoted yet. */\n | 'idle'\n /** Complete address, waiting for the buyer to stop typing. */\n | 'waiting'\n | 'loading'\n | 'ready'\n | 'error'\n\nexport type UseAutoQuoteOptions = {\n /** The form that holds the address inputs (events are listened to on it). */\n formRef: RefObject<HTMLFormElement | null>\n /**\n * Saves the address and returns the delivery options for it. Receives an `AbortSignal` that fires when a newer\n * quote replaces this one: ignore its result then (the hook already does).\n *\n * Only price fields re-quote, so the address saved here can lag behind the form (street, number, reference): the\n * shop's submit must save the full address again before choosing the delivery and paying. The server validates the\n * chosen rate against the saved address (a rate of another postal code is refused), so a stale quote never sets a price.\n */\n quote: (address: QuoteAddress, signal: AbortSignal) => Promise<DeliveryOptions>\n /** `name` of each address input. Default: `country_code`, `zip`, `province`, `city`, `neighborhood`, `address1`. */\n names?: Partial<Record<'country_code' | 'zip' | 'province' | 'city' | 'neighborhood' | 'address1', string>>\n /** Fields that must be filled to quote. Default: all of the six names above except `country_code`. */\n required?: ReadonlyArray<keyof QuoteAddress>\n /** A postal code is valid to quote. Default: 5 digits. */\n validPostalCode?: (zip: string) => boolean\n /** Country used when the form has no country input. Default `MX`. */\n defaultCountry?: string\n /** Quiet time after the last keystroke. Default 600 ms. */\n debounceMs?: number\n /** Picks the preselected rate. Default: {@link defaultRate} (the cheapest). */\n pickDefault?: (delivery: DeliveryOptions) => ShippingRate | null\n /** The rate (`rate:<id>`) already saved in the cart: kept when the quote still offers it. */\n savedValue?: string | null\n enabled?: boolean\n /** Fires with the options of every successful quote. */\n onQuoted?: (delivery: DeliveryOptions) => void\n}\n\nexport type UseAutoQuoteResult = {\n status: AutoQuoteStatus\n /** The last good quote (kept while a new one loads, so the list does not flash). `null` before the first. */\n delivery: DeliveryOptions | null\n /** `rate:<id>` to preselect (the saved rate if still offered, else the default), `null` when none. */\n defaultValue: string | null\n /** The address the current `delivery` was quoted for. */\n quotedFor: QuoteAddress | null\n /** Quote again now (retry button). */\n retry: () => void\n /** Plain-language status for a live region (\"Buscando…\", \"Listo\", …) keys, not text. */\n announce: 'searching' | 'ready' | 'free' | 'error' | null\n}\n\nexport const DEFAULT_QUOTE_NAMES = {\n country_code: 'country_code',\n zip: 'zip',\n province: 'province',\n city: 'city',\n neighborhood: 'neighborhood',\n address1: 'address1',\n} as const\n\nconst DEFAULT_REQUIRED = ['zip', 'province', 'city', 'neighborhood', 'address1'] as const\n\n/** Only these change the price of a shipment; any other field of the form (street, phone, reference…) never re-quotes. */\nexport const QUOTE_KEYS = ['country_code', 'zip', 'province', 'city'] as const\n\nconst norm = (v: string) => v.normalize('NFD').replace(/[̀-ͯ]/g, '').trim().toLowerCase()\n\n/** Identity of a quote: equal fingerprints share the same rates. */\nexport function quoteFingerprint(a: Pick<QuoteAddress, (typeof QUOTE_KEYS)[number]>): string {\n return QUOTE_KEYS.map((k) => norm(a[k] ?? '')).join('|')\n}\n\n/** The default rate: the cheapest one that is not a pickup (ties keep the server order, which already puts the best first). */\nexport function defaultRate(delivery: Pick<DeliveryOptions, 'rates'>): ShippingRate | null {\n let best: ShippingRate | null = null\n for (const r of delivery.rates) {\n if (r.pickup) continue\n if (!best || Number(r.cost.amount) < Number(best.cost.amount)) best = r\n }\n return best\n}\n\n/** Reads the address from the form; `null` when it is not complete yet. */\nexport function readQuoteAddress(\n form: HTMLFormElement | null,\n opts: Pick<UseAutoQuoteOptions, 'names' | 'required' | 'validPostalCode' | 'defaultCountry'> = {},\n): QuoteAddress | null {\n if (!form) return null\n const names = { ...DEFAULT_QUOTE_NAMES, ...opts.names }\n const data = new FormData(form)\n const get = (name: string) => String(data.get(name) ?? '').trim()\n const address: QuoteAddress = {\n country_code: get(names.country_code) || opts.defaultCountry || 'MX',\n zip: get(names.zip),\n province: get(names.province),\n city: get(names.city),\n neighborhood: get(names.neighborhood),\n address1: get(names.address1),\n }\n const valid = opts.validPostalCode ?? ((z: string) => /^\\d{5}$/.test(z))\n if (!valid(address.zip)) return null\n for (const k of opts.required ?? DEFAULT_REQUIRED) if (!address[k]) return null\n return address\n}\n\nexport function useAutoQuote(options: UseAutoQuoteOptions): UseAutoQuoteResult {\n const { formRef, debounceMs = 600, enabled = true } = options\n const [status, setStatus] = useState<AutoQuoteStatus>('idle')\n const [delivery, setDelivery] = useState<DeliveryOptions | null>(null)\n const [quotedFor, setQuotedFor] = useState<QuoteAddress | null>(null)\n const opts = useRef(options)\n opts.current = options\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inflight = useRef<AbortController | null>(null)\n const quotedFp = useRef<string | null>(null)\n const pendingFp = useRef<string | null>(null)\n\n const run = useCallback((address: QuoteAddress, fp: string) => {\n inflight.current?.abort()\n const ctl = new AbortController()\n inflight.current = ctl\n pendingFp.current = fp\n setStatus('loading')\n opts.current\n .quote(address, ctl.signal)\n .then((d) => {\n if (ctl.signal.aborted) return\n quotedFp.current = fp\n pendingFp.current = null\n setDelivery(d)\n setQuotedFor(address)\n setStatus('ready')\n opts.current.onQuoted?.(d)\n })\n .catch(() => {\n if (ctl.signal.aborted) return\n pendingFp.current = null\n // The next change of the address (or the retry button) quotes again.\n quotedFp.current = null\n setStatus('error')\n })\n }, [])\n\n const evaluate = useCallback(\n (force: boolean) => {\n const address = readQuoteAddress(formRef.current, opts.current)\n if (!address) {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n inflight.current?.abort()\n pendingFp.current = null\n // The last quote no longer describes what the form says (e.g. the postal code is being edited): not ready to\n // pay. Completing the same address again is `ready` at once (same fingerprint, nothing is asked).\n setStatus('idle')\n return\n }\n const fp = quoteFingerprint(address)\n // Same price-relevant fields as the quote we have (or are getting): nothing to ask again.\n if (!force && (fp === quotedFp.current || fp === pendingFp.current)) {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n if (fp === quotedFp.current) setStatus('ready')\n return\n }\n if (timer.current) clearTimeout(timer.current)\n if (force) {\n timer.current = null\n run(address, fp)\n return\n }\n setStatus('waiting')\n timer.current = setTimeout(() => {\n timer.current = null\n // The form may have changed while we waited.\n const latest = readQuoteAddress(formRef.current, opts.current)\n if (latest) run(latest, quoteFingerprint(latest))\n }, debounceMs)\n },\n [debounceMs, formRef, run],\n )\n\n useEffect(() => {\n const form = formRef.current\n if (!enabled || !form) return\n const onChange = () => evaluate(false)\n form.addEventListener('input', onChange)\n form.addEventListener('change', onChange)\n // Autofill and the postal-code lookup fill fields without typing: look once at mount and on the SDK's fill event.\n const first = setTimeout(onChange, 0)\n return () => {\n clearTimeout(first)\n form.removeEventListener('input', onChange)\n form.removeEventListener('change', onChange)\n if (timer.current) clearTimeout(timer.current)\n inflight.current?.abort()\n }\n }, [enabled, evaluate, formRef])\n\n const retry = useCallback(() => evaluate(true), [evaluate])\n\n const defaultValue = useMemo(() => {\n if (!delivery) return null\n const saved = opts.current.savedValue\n if (saved?.startsWith('rate:')) {\n const hit = delivery.rates.find((r) => `rate:${r.id}` === saved)\n if (hit) return `rate:${hit.id}`\n }\n const pick = (opts.current.pickDefault ?? defaultRate)(delivery)\n return pick ? `rate:${pick.id}` : null\n }, [delivery, options.savedValue])\n\n const announce: UseAutoQuoteResult['announce'] =\n status === 'loading' || status === 'waiting' ? 'searching' : status === 'error' ? 'error' : status === 'ready' ? (delivery?.free ? 'free' : 'ready') : null\n\n return { status, delivery, defaultValue, quotedFor, retry, announce }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/checkout/address-fields.tsx","../src/checkout/order-summary.tsx","../src/checkout/recommend.ts","../src/checkout/delivery.ts","../src/checkout/delivery-options.tsx","../src/checkout/auto-quote.ts"],"names":["fill","el","ES","EN","jsx","jsxs","costOf","daysOf","norm","SR_ONLY","formatMoney","Fragment","useState","useRef","useEffect","useMemo"],"mappings":"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","file":"checkout.js","sourcesContent":["/**\n * Contact and shipping address fields of a checkout, in the order and with the autofill tokens buyers expect:\n * contact (e-mail, phone, given and family name) and address (postal code first, so it can fill state and city, then\n * state, city, colonia, street, interior and delivery references). One column on phones; the shop lays out the grid\n * with `classNames`.\n *\n * Nothing here knows a country: the postal-code format, the list of states and the postal-code lookup come from the\n * shop (region config, a same-origin route). Without them the fields are plain text and nothing is invented.\n */\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { Address } from '@asteby/storefront'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors, type FieldMessages } from './fields.js'\n\nexport type AddressFieldKey = 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'\nexport type ContactFieldKey = 'email' | 'phone' | 'first_name' | 'last_name'\n\nexport type AddressFieldsMessages = Record<AddressFieldKey | ContactFieldKey, string> & {\n provincePlaceholder: string\n neighborhoodPlaceholder: string\n address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: string\n /** Tooltip and note of a state the postal code defined (locked). */\n provinceLocked: string\n /** Discreet action that releases the locked state so the buyer can fix the postal code. */\n changePostalCode: string\n /** Visually hidden prefix of the one-line place summary (what a screen reader hears before \"Miguel Hidalgo, Ciudad de México\"). */\n resolvedPlace: string\n}\n\nconst ES: AddressFieldsMessages = {\n email: 'Correo',\n phone: 'Teléfono',\n first_name: 'Nombre',\n last_name: 'Apellidos',\n zip: 'Código postal',\n province: 'Estado',\n city: 'Ciudad o municipio',\n neighborhood: 'Colonia',\n address1: 'Calle y número',\n address2: 'Número interior o departamento',\n reference: 'Referencias para la entrega',\n provincePlaceholder: 'Elige tu estado',\n neighborhoodPlaceholder: 'Elige tu colonia',\n address1Hint: 'Por ejemplo: Av. Insurgentes Sur 1234',\n referenceHint: 'Entre qué calles, color de la fachada…',\n emailHint: 'Te enviamos aquí la confirmación y el seguimiento.',\n phoneHint: 'Solo para la paquetería, por si necesita contactarte.',\n lookupFilled: 'Completamos estado y ciudad con tu código postal.',\n provinceLocked: 'Definido por tu código postal',\n changePostalCode: 'Cambiar código postal',\n resolvedPlace: 'Entrega en',\n}\n\nconst EN: AddressFieldsMessages = {\n email: 'Email',\n phone: 'Phone',\n first_name: 'First name',\n last_name: 'Last name',\n zip: 'Postal code',\n province: 'State',\n city: 'City',\n neighborhood: 'Neighborhood',\n address1: 'Street and number',\n address2: 'Apartment, suite',\n reference: 'Delivery notes',\n provincePlaceholder: 'Choose your state',\n neighborhoodPlaceholder: 'Choose your neighborhood',\n address1Hint: 'For example: 1234 Main St',\n referenceHint: 'Cross streets, building color…',\n emailHint: 'We send the confirmation and tracking here.',\n phoneHint: 'Only for the carrier, in case they need to reach you.',\n lookupFilled: 'We filled in state and city from your postal code.',\n provinceLocked: 'Set by your postal code',\n changePostalCode: 'Change postal code',\n resolvedPlace: 'Delivering to',\n}\n\nexport function addressFieldsMessages(locale?: string | null, overrides?: Partial<AddressFieldsMessages> | null): AddressFieldsMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type FieldLayoutClassNames = CheckoutFieldClassNames & {\n /** Extra class of a field that should span the whole row in a two-column grid. */\n wide?: string\n /** Extra class of a field that fits half a row. */\n half?: string\n}\n\ntype Common = {\n /** Inline errors by field name (`useFieldErrors().errors`). */\n errors?: FieldErrors\n locale?: string\n messages?: Partial<AddressFieldsMessages>\n fieldMessages?: Partial<FieldMessages>\n classNames?: FieldLayoutClassNames\n}\n\nconst join = (...c: Array<string | undefined>) => c.filter(Boolean).join(' ') || undefined\nconst field = (cx: FieldLayoutClassNames, span: 'wide' | 'half'): CheckoutFieldClassNames => ({ ...cx, root: join(cx.root, cx[span]) })\n\nexport type ContactFieldsProps = Common & {\n defaults?: Partial<Record<ContactFieldKey, string | null>>\n /** Form names. Default: the keys. */\n names?: Partial<Record<ContactFieldKey, string>>\n /** Phone format from the shop or region (e.g. `{ pattern: '[0-9 +()-]{10,}', title: '10 dígitos' }`). */\n phone?: { pattern?: string; title?: string; minLength?: number }\n /** Explain why e-mail and phone are needed (default true). */\n hints?: boolean\n}\n\n/** E-mail, phone, given and family name with their autofill tokens and the right mobile keyboards. */\nexport function ContactFields({ defaults = {}, names = {}, errors = {}, phone, hints = true, locale, messages, fieldMessages: fm, classNames: cx = {} }: ContactFieldsProps) {\n const m = addressFieldsMessages(locale, messages)\n const n = (k: ContactFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n return (\n <>\n <CheckoutField {...common} name={n('email')} label={m.email} type=\"email\" autoComplete=\"email\" inputMode=\"email\" autoCapitalize=\"none\" spellCheck={false} defaultValue={defaults.email ?? ''} error={errors[n('email')] ?? null} hint={hints ? m.emailHint : undefined} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('phone')} label={m.phone} type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" defaultValue={defaults.phone ?? ''} error={errors[n('phone')] ?? null} hint={hints ? m.phoneHint : undefined} classNames={field(cx, 'wide')} {...(phone?.pattern ? { pattern: phone.pattern } : {})} {...(phone?.title ? { title: phone.title } : {})} {...(phone?.minLength ? { minLength: phone.minLength } : {})} />\n <CheckoutField {...common} name={n('first_name')} label={m.first_name} autoComplete=\"given-name\" defaultValue={defaults.first_name ?? ''} error={errors[n('first_name')] ?? null} classNames={field(cx, 'half')} />\n <CheckoutField {...common} name={n('last_name')} label={m.last_name} autoComplete=\"family-name\" defaultValue={defaults.last_name ?? ''} error={errors[n('last_name')] ?? null} classNames={field(cx, 'half')} />\n </>\n )\n}\n\n/** What a postal-code lookup answers. Every field optional: only what the source knows. */\nexport type PostalCodeInfo = {\n province?: string | null\n city?: string | null\n neighborhoods?: readonly string[] | null\n /**\n * Every municipality the code covers, when the catalog knows more than one. With two or more the code is ambiguous:\n * `hideResolvedFields` keeps the city field editable instead of choosing for the buyer.\n */\n cities?: readonly string[] | null\n /**\n * Municipality to SHOW in the one-line summary (`hideResolvedFields`) when it differs from `city`, the value that is\n * submitted (and may feed the delivery quote). Display only: never sent.\n */\n municipality?: string | null\n}\n\nexport type AddressFieldsProps = Common & {\n defaults?: Partial<Pick<Address, 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'>> | null\n /** Form names. Default: the keys (the `AddressInput` fields of the Storefront API). */\n names?: Partial<Record<AddressFieldKey | 'province_code', string>>\n /** ISO country of the address (hidden field `country_code`). */\n countryCode: string\n /** States of the country (from the region config). With them, \"State\" is a `<select>`; the value sent is `name`. */\n provinces?: ReadonlyArray<{ code?: string | null; name: string }> | null\n /** Postal-code format of the country (from the region config), e.g. `{ pattern: '[0-9]{5}', maxLength: 5, inputMode: 'numeric', title: '5 dígitos' }`. */\n postalCode?: { pattern?: string; maxLength?: number; inputMode?: 'numeric' | 'text'; title?: string }\n /**\n * Fills state and city (and suggests colonias) from the postal code, when the shop has a source (a same-origin\n * route over a postal-code catalog). Called once the code matches `postalCode.pattern` (or on leaving the field).\n * Never overwrites what the buyer typed.\n */\n lookupPostalCode?: (zip: string) => Promise<PostalCodeInfo | null>\n /**\n * How to offer the colonias when the postal code has SEVERAL: `'datalist'` (default, suggestions on a text field) or\n * `'select'` (a real list; the field becomes a `<select>` of those colonias, unless the buyer already typed one that\n * is not in the list, which is kept as text). With exactly one colonia it is filled in either mode.\n */\n neighborhoodList?: 'datalist' | 'select'\n /** Show the colonia field: `true` (default, optional), `'required'`, or `false`. */\n neighborhood?: boolean | 'required'\n /** Show the delivery references field (default true, optional). */\n reference?: boolean\n /**\n * Once `lookupPostalCode` fills the state field (never over what the buyer already typed), lock it: a plain\n * `<input>` turns read-only; a `<select>` (from `provinces`) turns disabled with a hidden field that keeps\n * submitting its value. The state is the postal code's: the field shows a lock, the tooltip `provinceLocked` and a\n * discreet `changePostalCode` action; editing the postal code releases the lock and clears what the lookup filled\n * (also when the new code resolves nothing), so a stale state is never left behind. Default TRUE (the server\n * validates the pair again; set `false` to keep the filled state as editable as any field). Marked with\n * `data-sf-locked=\"1\"` for the shop's own styling.\n */\n lockProvinceOnFill?: boolean\n /**\n * When the postal-code lookup resolves BOTH state and city/municipality (and the catalog does not return several\n * municipalities), they are not shown as inputs: one read-only line under the postal code (\"Miguel Hidalgo, Ciudad de\n * México\" plus a discreet `changePostalCode` link) and the values travel in hidden fields with the usual names\n * (`province`, `province_code` when the `provinces` list knows it, `city`), so the server still validates state against\n * postal code. If the code resolves nothing, is unknown, the lookup fails, the municipality is ambiguous, the state is\n * not in `provinces`, the buyer already typed a different value, or the server reports an error on state/city, the\n * inputs are shown editable (the buyer can always complete the address). Without JavaScript the form is the plain\n * inputs. Default TRUE; `false` keeps the previous behavior (inputs filled, state locked per `lockProvinceOnFill`).\n */\n hideResolvedFields?: boolean\n /** Rendered after the fields (e.g. \"save this address\"). */\n children?: ReactNode\n}\n\n/**\n * Shipping address in the order buyers fill it: postal code, state, city, colonia, street and number, interior and\n * references. Autofill tokens: `postal-code`, `address-level1/2/3`, `address-line1/2`. The postal code uses the\n * numeric keyboard when the country format is numeric.\n */\n/** Locks a field the lookup just filled: read-only for an `<input>`, disabled + a hidden mirror for a `<select>`. */\nfunction lockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked === '1') return\n el.dataset.sfLocked = '1'\n el.setAttribute('aria-readonly', 'true')\n if (el instanceof HTMLSelectElement) {\n // A disabled `<select>` would stop submitting its value: a hidden sibling keeps it in the form.\n const name = el.getAttribute('name')\n if (name) {\n el.dataset.sfName = name\n const hidden = document.createElement('input')\n hidden.type = 'hidden'\n hidden.dataset.sfLockMirror = '1'\n hidden.name = name\n hidden.value = el.value\n el.insertAdjacentElement('afterend', hidden)\n el.removeAttribute('name')\n }\n el.disabled = true\n } else {\n el.readOnly = true\n }\n}\n\n/** Undoes `lockField`: the field is editable again and, when the lookup filled it, empty (its value belonged to the old postal code). */\nfunction unlockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked !== '1') return\n delete el.dataset.sfLocked\n el.removeAttribute('aria-readonly')\n el.removeAttribute('title')\n if (el instanceof HTMLSelectElement) {\n const mirror = el.nextElementSibling\n if (mirror instanceof HTMLInputElement && mirror.dataset.sfLockMirror === '1') mirror.remove()\n if (el.dataset.sfName) el.setAttribute('name', el.dataset.sfName)\n delete el.dataset.sfName\n el.disabled = false\n } else {\n el.readOnly = false\n }\n}\n\n/** Name of the property set to `true` on every event the lookup dispatches when it fills a field. */\nexport const ADDRESS_FILL_EVENT_FLAG = 'sfSynthetic'\n\n/**\n * Was this `input` event dispatched by `AddressFields` itself (a postal-code fill) and not typed by the buyer? The shop's\n * own listeners (validation, autosave, delivery re-quote...) can ignore these. Real typing has `isTrusted: true`.\n */\nexport function isAddressFillEvent(event: Event): boolean {\n return (event as unknown as Record<string, unknown>)[ADDRESS_FILL_EVENT_FLAG] === true\n}\n\nconst SR_ONLY = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' } as const\nconst sameText = (a: string, b: string) => fold(a) === fold(b)\nconst fold = (v: string) => v.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').trim().toLowerCase()\n\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, lockProvinceOnFill = true, hideResolvedFields = true, locale, messages, fieldMessages: fm, classNames: cx = {}, children } = props\n const showNeighborhood = props.neighborhood ?? true\n const showReference = props.reference ?? true\n const m = addressFieldsMessages(locale, messages)\n const n = (k: AddressFieldKey | 'province_code') => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n const listId = useId()\n const [colonias, setColonias] = useState<readonly string[]>([])\n const [filled, setFilled] = useState(false)\n const [provinceLocked, setProvinceLocked] = useState(false)\n const [coloniaSelect, setColoniaSelect] = useState(false)\n // State and city the postal code defined, shown as one line (not as inputs) while it holds.\n const [resolved, setResolved] = useState<{ province: string; provinceCode: string | null; city: string; place: string } | null>(null)\n const resolvedRef = useRef(false)\n // Once the lookup has decided (or released) them, the saved defaults no longer describe the address.\n const [defaultsStale, setDefaultsStale] = useState(false)\n const coloniaSelectRef = useRef(false)\n // Switching the colonia between text and list remounts the field: what it should hold is carried to the new element.\n const coloniaCarry = useRef<{ value: string; autofilled: boolean; userEdited: boolean } | null>(null)\n const lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\n // ONE writer: lookup results are applied one after another, never interleaved (two lookups answering close together\n // would otherwise write the same fields and fire their events at the same time).\n const writer = useRef<Promise<void>>(Promise.resolve())\n const enqueue = (task: () => void) => {\n writer.current = writer.current.then(task).catch(() => {})\n }\n\n // A field the buyer edited is theirs: only REAL input (`isTrusted`) marks it, not the events this component dispatches.\n useEffect(() => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const mark = (e: Event) => {\n if (!e.isTrusted) return\n const el = e.target as HTMLElement | null\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement) {\n el.dataset.sfUserEdited = '1'\n delete el.dataset.sfAutofilled\n }\n }\n form.addEventListener('input', mark, true)\n form.addEventListener('change', mark, true)\n return () => {\n form.removeEventListener('input', mark, true)\n form.removeEventListener('change', mark, true)\n }\n }, [])\n\n // The state was the old postal code's: free it and drop what the lookup filled (state, city, colonia) so nothing stale stays.\n const releaseLookup = () => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const locked = form.querySelector<HTMLInputElement | HTMLSelectElement>('[data-sf-locked=\"1\"]')\n const touched: Array<HTMLInputElement | HTMLSelectElement> = []\n if (resolvedRef.current) setDefaultsStale(true)\n if (locked) {\n unlockField(locked)\n touched.push(locked)\n }\n for (const key of ['province', 'city', 'neighborhood'] as const) {\n const el = form.elements.namedItem(n(key)) as HTMLInputElement | HTMLSelectElement | null\n if (el && !('length' in el && !(el instanceof HTMLSelectElement)) && !touched.includes(el)) touched.push(el)\n }\n for (const el of touched) {\n if (el.dataset.sfAutofilled !== '1') continue\n el.value = ''\n delete el.dataset.sfAutofilled\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n }\n lastZip.current = null\n resolvedRef.current = false\n setResolved(null)\n setProvinceLocked(false)\n setFilled(false)\n }\n\n // Can the lookup answer replace the state and city inputs? Only when it is complete and unambiguous, and nothing the\n // buyer wrote would be lost: otherwise the inputs stay (degradation: never leave the address impossible to complete).\n const resolveHidden = (info: PostalCodeInfo, form: HTMLFormElement | null | undefined) => {\n if (!form || !info.province || !info.city) return null\n if ((info.cities?.length ?? 0) > 1) return null\n let province = info.province.trim()\n let provinceCode: string | null = null\n if (provinces && provinces.length) {\n const hit = provinces.find((p) => sameText(p.name, province) || (!!p.code && sameText(p.code, province)))\n if (!hit) return null\n province = hit.name\n provinceCode = hit.code ?? null\n }\n const city = info.city.trim()\n if (!province || !city) return null\n const theirs = (name: string, value: string) => {\n const el = form.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || ('length' in el && !(el instanceof HTMLSelectElement))) return false\n // Something typed that the code does not say: the buyer's, not ours to replace.\n return !!el.value && el.dataset.sfAutofilled !== '1' && !sameText(el.value, value)\n }\n if (theirs(n('province'), province) || theirs(n('city'), city)) return null\n return { province, provinceCode, city, place: info.municipality?.trim() || city }\n }\n\n const runLookup = (zip: string) => {\n const lookup = lookupRef.current\n if (!lookup || !zip || zip === lastZip.current) return\n if (postalCode?.pattern && !new RegExp(`^(?:${postalCode.pattern})$`).test(zip)) return\n lastZip.current = zip\n const form = zipRef.current?.closest('form')\n void lookup(zip).then(\n (info) => {\n if (!info) return\n enqueue(() => {\n if (lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined, lock?: boolean) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) return false\n // Already locked from a previous lookup: leave it (the buyer corrects the postal code instead).\n if (el.dataset.sfLocked === '1') return false\n // Never over what they edited, nor over text in the field they are typing in. A focused field that is still\n // empty (Tab from the postal code lands on the next one) is filled: nothing of theirs is overwritten.\n if (el.dataset.sfUserEdited === '1' || (el.ownerDocument.activeElement === el && el.value)) return false\n // Only an empty field, or one this lookup filled before: never what the buyer typed.\n if (el.value && el.dataset.sfAutofilled !== '1') return false\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === value)) return false\n el.value = value\n el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n if (lock) {\n lockField(el)\n el.title = m.provinceLocked\n setProvinceLocked(true)\n }\n return true\n }\n const resolution = hideResolvedFields ? resolveHidden(info, form) : null\n if (resolution) {\n resolvedRef.current = true\n setDefaultsStale(true)\n setResolved(resolution)\n }\n const a = resolution ? false : fill(n('province'), info.province, lockProvinceOnFill)\n const b = resolution ? false : fill(n('city'), info.city)\n // Colonia only when the code has exactly ONE: with several the buyer chooses (the list is offered, not applied).\n const only = info.neighborhoods?.length === 1 ? info.neighborhoods[0] : null\n const c = showNeighborhood ? fill(n('neighborhood'), only) : false\n setColonias(info.neighborhoods ?? [])\n const list = info.neighborhoods ?? []\n const nameEl = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n const el = nameEl && !('length' in nameEl && !(nameEl instanceof HTMLSelectElement)) ? nameEl : null\n const typed = el ? el.value : ''\n const wantSelect = props.neighborhoodList === 'select' && showNeighborhood !== false && list.length > 1 && (!typed || list.includes(typed))\n let carried = false\n if (showNeighborhood && wantSelect !== coloniaSelectRef.current) {\n const userEdited = el?.dataset.sfUserEdited === '1'\n // The single colonia of the new code wins over a previous autofill, never over what the buyer chose.\n const value = only && !userEdited ? only : wantSelect ? (list.includes(typed) ? typed : '') : typed\n coloniaCarry.current = { value, autofilled: !userEdited && (!!only || el?.dataset.sfAutofilled === '1'), userEdited }\n carried = !!only && !userEdited\n }\n coloniaSelectRef.current = wantSelect\n setColoniaSelect(wantSelect)\n setFilled(!resolution && (a || b || c || carried))\n })\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\n\n // Applies the carried colonia to the field that replaced the old one (text <-> list), like any fill.\n useEffect(() => {\n const carry = coloniaCarry.current\n coloniaCarry.current = null\n if (!carry || !carry.value) return\n const form = zipRef.current?.closest('form')\n const el = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n if (!el || ('length' in el && !(el instanceof HTMLSelectElement))) return\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === carry.value)) return\n el.value = carry.value\n if (carry.userEdited) el.dataset.sfUserEdited = '1'\n else if (carry.autofilled) el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [coloniaSelect])\n\n useEffect(() => {\n const zip = defaults?.zip\n if (zip) runLookup(zip)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // After the fields are swapped (lookup resolved / released) the form says so, so listeners (the delivery re-quote) look again.\n const firstRender = useRef(true)\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false\n return\n }\n const form = zipRef.current?.closest('form')\n const el = (resolved ? form?.querySelector<HTMLElement>('input[type=\"hidden\"][data-sf-resolved-field=\"city\"]') : null) ?? zipRef.current?.querySelector('input')\n if (!el) return\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n }, [resolved])\n\n const hasLock = (root: HTMLElement | null) => resolvedRef.current || !!root?.closest('form')?.querySelector('[data-sf-locked=\"1\"]')\n const changeZip = () => {\n releaseLookup()\n const zipEl = zipRef.current?.querySelector('input')\n zipEl?.focus()\n zipEl?.select()\n }\n const provinceHint = provinceLocked ? (\n <span data-sf-province-locked=\"\" title={m.provinceLocked}>\n <svg aria-hidden=\"true\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ display: 'inline-block', verticalAlign: '-1px', marginRight: 4 }}>\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </svg>\n {m.provinceLocked}\n {' · '}\n <button type=\"button\" data-sf-change-zip=\"\" onClick={changeZip} style={{ background: 'none', border: 0, padding: 0, font: 'inherit', color: 'inherit', textDecoration: 'underline', cursor: 'pointer' }}>\n {m.changePostalCode}\n </button>\n </span>\n ) : undefined\n const numericZip = postalCode?.inputMode === 'numeric'\n // A server error on state/city must be seen next to a field the buyer can fix: inputs come back (with what was resolved).\n const showResolved = !!resolved && !errors[n('province')] && !errors[n('city')]\n const startOf = (key: 'province' | 'city') => (resolved ? resolved[key] : defaultsStale ? '' : (defaults?.[key] ?? ''))\n return (\n <>\n <div ref={zipRef} className={join(cx.half)} data-sf-zip>\n <CheckoutField\n {...common}\n name={n('zip')}\n label={m.zip}\n autoComplete=\"postal-code\"\n inputMode={postalCode?.inputMode ?? 'text'}\n {...(postalCode?.pattern ? { pattern: postalCode.pattern } : {})}\n {...(postalCode?.maxLength ? { maxLength: postalCode.maxLength } : {})}\n {...(postalCode?.title ? { title: postalCode.title } : {})}\n {...(numericZip ? { autoCapitalize: 'none' } : {})}\n defaultValue={defaults?.zip ?? ''}\n error={errors[n('zip')] ?? null}\n classNames={{ ...cx, root: cx.root }}\n onInput={(e) => {\n const v = e.currentTarget.value.trim()\n // Editing the code that defined the state frees it (and what the lookup filled) before anything else.\n if (v !== lastZip.current && hasLock(zipRef.current)) releaseLookup()\n if (postalCode?.maxLength && v.length === postalCode.maxLength) runLookup(v)\n }}\n onBlur={(e) => runLookup(e.currentTarget.value.trim())}\n />\n {/* The lookup result, announced once (not on every keystroke): the one-line place, or the fill note. */}\n <div data-sf-resolved={showResolved ? '' : undefined} className={showResolved || filled ? join(cx.hint) : undefined}>\n <p role=\"status\" aria-live=\"polite\" data-sf-zip-status style={showResolved || filled ? (showResolved ? { display: 'inline', margin: 0 } : undefined) : SR_ONLY}>\n {showResolved && resolved ? (\n <>\n <span style={SR_ONLY}>{m.resolvedPlace} </span>\n <span data-sf-resolved-place>\n {resolved.place}, {resolved.province}\n </span>\n </>\n ) : filled ? (\n m.lookupFilled\n ) : (\n ''\n )}\n </p>\n {showResolved ? (\n <>\n {' · '}\n <button type=\"button\" data-sf-change-zip=\"\" onClick={changeZip} style={{ background: 'none', border: 0, padding: 0, font: 'inherit', color: 'inherit', textDecoration: 'underline', cursor: 'pointer' }}>\n {m.changePostalCode}\n </button>\n </>\n ) : null}\n </div>\n </div>\n {showResolved && resolved ? (\n <>\n <input type=\"hidden\" name={n('province')} value={resolved.province} data-sf-resolved-field=\"province\" />\n {resolved.provinceCode ? <input type=\"hidden\" name={n('province_code')} value={resolved.provinceCode} data-sf-resolved-field=\"province_code\" /> : null}\n <input type=\"hidden\" name={n('city')} value={resolved.city} data-sf-resolved-field=\"city\" />\n </>\n ) : null}\n {showResolved ? null : provinces && provinces.length ? (\n <CheckoutField {...common} as=\"select\" name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={startOf('province')} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} hint={provinceHint}>\n <option value=\"\" disabled>\n {m.provincePlaceholder}\n </option>\n {provinces.map((p) => (\n <option key={p.code ?? p.name} value={p.name}>\n {p.name}\n </option>\n ))}\n </CheckoutField>\n ) : (\n <CheckoutField {...common} name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={startOf('province')} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} hint={provinceHint} />\n )}\n {showResolved ? null : <CheckoutField {...common} name={n('city')} label={m.city} autoComplete=\"address-level2\" defaultValue={startOf('city')} error={errors[n('city')] ?? null} classNames={field(cx, 'half')} />}\n {showNeighborhood && coloniaSelect ? (\n <CheckoutField\n {...common}\n as=\"select\"\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={colonias.includes(defaults?.neighborhood ?? '') ? (defaults?.neighborhood ?? '') : ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n >\n <option value=\"\" disabled={showNeighborhood === 'required'}>\n {m.neighborhoodPlaceholder}\n </option>\n {colonias.map((c) => (\n <option key={c} value={c}>\n {c}\n </option>\n ))}\n </CheckoutField>\n ) : showNeighborhood ? (\n <CheckoutField\n {...common}\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={defaults?.neighborhood ?? ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n {...(colonias.length && !coloniaSelect ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length && !coloniaSelect ? (\n <datalist id={listId}>\n {colonias.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n ) : null}\n <CheckoutField {...common} name={n('address1')} label={m.address1} autoComplete=\"address-line1\" defaultValue={defaults?.address1 ?? ''} error={errors[n('address1')] ?? null} hint={m.address1Hint} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('address2')} label={m.address2} autoComplete=\"address-line2\" optional defaultValue={defaults?.address2 ?? ''} error={errors[n('address2')] ?? null} classNames={field(cx, 'half')} />\n {showReference ? (\n <CheckoutField {...common} name={n('reference')} label={m.reference} optional defaultValue={defaults?.reference ?? ''} error={errors[n('reference')] ?? null} hint={m.referenceHint} classNames={field(cx, 'wide')} maxLength={200} />\n ) : null}\n <input type=\"hidden\" name=\"country_code\" value={countryCode} />\n {children}\n </>\n )\n}\n","/**\n * Order summary of a checkout: lines and the server totals (subtotal, discounts, shipping, taxes, total) exactly as\n * `cart.cost` sends them; nothing is added or recalculated. `OrderSummaryDisclosure` wraps it for phones: a collapsed\n * bar with the total at the top of the page (native `<details>`, no JavaScript, no layout shift on hydration).\n */\nimport type { ReactNode } from 'react'\nimport { formatMoney, type CartCost, type CartLine, type Money } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { ProductThumb } from '../ui/product-preview.js'\n\nexport type OrderSummaryMessages = {\n title: string\n subtotal: string\n discount: string\n shipping: string\n /** Shipping not chosen yet. */\n shippingPending: string\n /** Shipping being saved / re-read. */\n updating: string\n free: string\n taxes: string\n /** Taxes already inside the prices, `{amount}`. */\n taxesIncluded: string\n total: string\n /** `{n}` = quantity. */\n quantity: string\n show: string\n hide: string\n}\n\nconst ES: OrderSummaryMessages = {\n title: 'Tu pedido',\n subtotal: 'Subtotal',\n discount: 'Descuento',\n shipping: 'Envío',\n shippingPending: 'Al elegir la entrega',\n updating: 'Actualizando…',\n free: 'Gratis',\n taxes: 'Impuestos',\n taxesIncluded: 'Incluye {amount} de impuestos',\n total: 'Total',\n quantity: 'Cantidad: {n}',\n show: 'Ver resumen del pedido',\n hide: 'Ocultar resumen del pedido',\n}\n\nconst EN: OrderSummaryMessages = {\n title: 'Your order',\n subtotal: 'Subtotal',\n discount: 'Discount',\n shipping: 'Shipping',\n shippingPending: 'Calculated at delivery',\n updating: 'Updating…',\n free: 'Free',\n taxes: 'Taxes',\n taxesIncluded: 'Includes {amount} in taxes',\n total: 'Total',\n quantity: 'Quantity: {n}',\n show: 'Show order summary',\n hide: 'Hide order summary',\n}\n\nexport function orderSummaryMessages(locale?: string | null, overrides?: Partial<OrderSummaryMessages> | null): OrderSummaryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type OrderSummaryClassNames = Partial<\n Record<'root' | 'title' | 'lines' | 'line' | 'media' | 'qty' | 'lineTitle' | 'variant' | 'linePrice' | 'totals' | 'row' | 'discount' | 'muted' | 'free' | 'total' | 'note', string>\n>\n\nexport type OrderSummaryProps = {\n lines: readonly CartLine[]\n /** `cart.cost` as the server sends it. */\n cost: CartCost\n /** The delivery is being saved and the cart re-read: shipping and total say so (`aria-busy`). */\n updating?: boolean\n /** Picture of a line (e.g. `<ProductImage>`), 48-64 px. The quantity badge sits on it. Default: `<ProductThumb>` of the line's image (fallback initial when it has none). */\n renderLineMedia?: (line: CartLine) => ReactNode\n /** Show the default picture of each line. Default true; `false` gives the text-only \"2 × Name\" list. */\n media?: boolean\n renderAmount?: (amount: Money) => ReactNode\n /** Heading. `false` hides it (the disclosure already names the block). */\n title?: ReactNode | false\n /** Heading level. Default 2. */\n headingLevel?: 2 | 3\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n classNames?: OrderSummaryClassNames\n /** Rendered between the lines and the totals (e.g. a discount code form). */\n children?: ReactNode\n}\n\n/** The line's own picture, else the product's; `decorative` because the name is right beside it. */\nfunction defaultLineMedia(l: CartLine): ReactNode {\n const img = l.merchandise.image ?? l.merchandise.product.featured_image ?? null\n return <ProductThumb image={img} name={l.merchandise.product.title} size={56} decorative zoom={false} />\n}\n\nconst isZero = (m: Money | null | undefined) => !!m && Number(m.amount) === 0\nconst positive = (m: Money | null | undefined): m is Money => !!m && Number(m.amount) > 0\n\n/** Lines and totals of the order. The total row is `aria-live`, so a new total after choosing delivery is announced. */\nexport function OrderSummary(props: OrderSummaryProps) {\n const { lines, cost, updating = false, media = true, renderAmount, title, headingLevel = 2, classNames: cx = {}, children } = props\n const locale = useResolvedLocale(props.locale)\n const m = orderSummaryMessages(locale, props.messages)\n const money = (v: Money) => (renderAmount ? renderAmount(v) : formatMoney(v, locale))\n const renderLineMedia = props.renderLineMedia ?? (media ? defaultLineMedia : undefined)\n const H = headingLevel === 3 ? 'h3' : 'h2'\n const discounts = cost.discounts?.filter((d) => positive(d.amount)) ?? []\n return (\n <div className={cx.root} data-sf-summary>\n {title === false ? null : (\n <H className={cx.title} data-sf-summary-title>\n {title ?? m.title}\n </H>\n )}\n <ul className={cx.lines} data-sf-summary-lines>\n {lines.map((l) => {\n const variant = l.merchandise.title && !/^default( title)?$/i.test(l.merchandise.title) ? l.merchandise.title : null\n return (\n <li key={l.id} className={cx.line} data-sf-summary-line>\n {renderLineMedia ? (\n <span className={cx.media} data-sf-summary-media>\n {renderLineMedia(l)}\n {l.quantity > 1 ? (\n <span className={cx.qty} data-sf-summary-qty aria-hidden=\"true\">\n {l.quantity}\n </span>\n ) : null}\n </span>\n ) : null}\n <span data-sf-summary-line-body>\n <span className={cx.lineTitle} data-sf-summary-line-title>\n {!renderLineMedia && l.quantity > 1 ? `${l.quantity} × ` : null}\n {l.merchandise.product.title}\n </span>\n {variant ? (\n <span className={cx.variant} data-sf-summary-variant>\n {variant}\n </span>\n ) : null}\n {renderLineMedia || l.quantity > 1 ? (\n <span style={{ position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }}>{m.quantity.replace('{n}', String(l.quantity))}</span>\n ) : null}\n </span>\n <span className={cx.linePrice} data-sf-summary-line-price>\n {money(l.cost.total)}\n </span>\n </li>\n )\n })}\n </ul>\n {children}\n <dl className={cx.totals} data-sf-summary-totals aria-busy={updating || undefined}>\n <div className={cx.row} data-sf-summary-row=\"subtotal\">\n <dt>{m.subtotal}</dt>\n <dd>{money(cost.subtotal)}</dd>\n </div>\n {discounts.length\n ? discounts.map((d) => (\n <div key={d.id} className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{d.code ? `${m.discount} (${d.code})` : d.title || m.discount}</dt>\n <dd>−{money(d.amount)}</dd>\n </div>\n ))\n : positive(cost.discount) ? (\n <div className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{m.discount}</dt>\n <dd>−{money(cost.discount)}</dd>\n </div>\n ) : null}\n <div className={cx.row} data-sf-summary-row=\"shipping\">\n <dt>{m.shipping}</dt>\n <dd className={updating || !cost.shipping ? cx.muted : undefined}>\n {updating ? m.updating : !cost.shipping ? m.shippingPending : isZero(cost.shipping) ? <span className={cx.free}>{m.free}</span> : money(cost.shipping)}\n </dd>\n </div>\n {positive(cost.tax) && !cost.tax_included ? (\n <div className={cx.row} data-sf-summary-row=\"tax\">\n <dt>{m.taxes}</dt>\n <dd>{money(cost.tax)}</dd>\n </div>\n ) : null}\n <div className={cx.total} data-sf-summary-row=\"total\">\n <dt>{m.total}</dt>\n <dd aria-live=\"polite\" data-updating={updating || undefined}>\n {money(cost.total)}\n </dd>\n </div>\n </dl>\n {positive(cost.tax) && cost.tax_included ? (\n <p className={cx.note} data-sf-summary-tax-note>\n {m.taxesIncluded.split('{amount}').flatMap((part, i) => (i === 0 ? [part] : [<span key={i}>{money(cost.tax!)}</span>, part]))}\n </p>\n ) : null}\n </div>\n )\n}\n\nexport type OrderSummaryDisclosureProps = {\n /** Total shown on the collapsed bar (`cart.cost.total`). */\n total: Money\n updating?: boolean\n renderAmount?: (amount: Money) => ReactNode\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n /** Start open (default closed). */\n defaultOpen?: boolean\n className?: string\n classNames?: Partial<Record<'summary' | 'label' | 'total' | 'panel', string>>\n /** Usually an `<OrderSummary title={false} … />`. */\n children: ReactNode\n}\n\n/**\n * Phones: the order summary as a collapsed bar at the top (\"Show order summary · $1,234.00\"). Native `<details>`:\n * works without JavaScript, the server HTML is already the final layout (no shift on hydration). Show it only on\n * narrow screens and the full summary on wide ones (the shop's CSS).\n */\nexport function OrderSummaryDisclosure({ total, updating, renderAmount, locale: loc, messages, defaultOpen = false, className, classNames: cx = {}, children }: OrderSummaryDisclosureProps) {\n const locale = useResolvedLocale(loc)\n const m = orderSummaryMessages(locale, messages)\n return (\n <details className={className} data-sf-summary-disclosure {...(defaultOpen ? { open: true } : {})}>\n <summary className={cx.summary} data-sf-summary-toggle>\n <span className={cx.label} data-sf-summary-toggle-label>\n <span data-sf-summary-show>{m.show}</span>\n <span data-sf-summary-hide>{m.hide}</span>\n </span>\n <span className={cx.total} data-sf-summary-toggle-total data-updating={updating || undefined}>\n {renderAmount ? renderAmount(total) : formatMoney(total, locale)}\n </span>\n </summary>\n <div className={cx.panel} data-sf-summary-panel>\n {children}\n </div>\n </details>\n )\n}\n","/**\n * Which carrier rates to show first. Pure: no DOM, no amounts computed (costs are only compared, as the server sends\n * them). A long quote (10+ services, several per carrier) becomes up to three recommended rows (the cheapest, the\n * fastest and the best balance of both) plus the rest grouped by carrier, so the buyer compares three things instead of\n * scanning a flat list.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandKey } from './brands.js'\n\n/** Why a rate is recommended. `best_value` balances price and arrival time. */\nexport type RateTag = 'cheapest' | 'fastest' | 'best_value'\n\nexport type RecommendedRate<R extends ShippingRate = ShippingRate> = { rate: R; tags: RateTag[] }\n\nexport type RateGroup<R extends ShippingRate = ShippingRate> = {\n /** Brand key of the carrier (`fedex`), or `''` for rates without one. */\n key: string\n /** Carrier as the server sends it (first rate of the group), for `BrandMark` and the group name. */\n carrier: string | null\n rates: R[]\n}\n\nexport type RecommendRatesOptions = {\n /** How many rates to recommend. Default 3. */\n count?: number\n /**\n * With this many rates or fewer every rate is recommended (no \"more options\"): hiding one or two rates behind a\n * toggle costs more than it saves. Default `count + 1`.\n */\n collapseAfter?: number\n /** Drop repeated services (same carrier and service, e.g. quoted by two providers), keeping the cheapest. Default true. */\n dedupe?: boolean\n}\n\nexport type RecommendedRates<R extends ShippingRate = ShippingRate> = {\n recommended: RecommendedRate<R>[]\n /** Everything else, grouped by carrier; groups ordered by their cheapest rate, rates by cost. */\n more: RateGroup<R>[]\n /** Number of rates in `more`. */\n moreCount: number\n}\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\nconst norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\nconst carrierKey = (r: ShippingRate) => (r.carrier ? brandKey(r.carrier) : r.provider ? brandKey(r.provider) : '')\n\n/** Repeated services (same carrier, same service code or title, same arrival): only the cheapest stays. Order kept. */\nexport function dedupeRates<R extends ShippingRate>(rates: readonly R[]): R[] {\n const best = new Map<string, R>()\n const keyOf = (r: R) => `${carrierKey(r)}|${norm(r.service_code) || norm(r.title)}|${daysOf(r) ?? ''}|${r.cost.currency_code}`\n for (const r of rates) {\n const k = keyOf(r)\n const prev = best.get(k)\n const c = costOf(r)\n if (!prev || (c !== null && (costOf(prev) === null || c < costOf(prev)!))) best.set(k, r)\n }\n const keep = new Set(best.values())\n return rates.filter((r) => keep.has(r))\n}\n\n/**\n * Up to `count` recommended rates and the rest by carrier.\n * - **cheapest**: lowest cost (only when every rate shares the currency); a tie goes to the faster one.\n * - **fastest**: fewest business days; a tie goes to the cheaper one. Only when some rate is strictly faster than the\n * cheapest, so the tag always tells the buyer something.\n * - **best_value**: the remaining rate with the best combined position in price and in time (sum of ranks), a tie goes\n * to the cheaper one. Fills the remaining slots.\n * Recommended rows come back cheapest first. Pickup is not a rate and is never hidden (the component shows it apart).\n */\nexport function recommendRates<R extends ShippingRate>(input: readonly R[], options: RecommendRatesOptions = {}): RecommendedRates<R> {\n const count = Math.max(1, options.count ?? 3)\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const collapseAfter = options.collapseAfter ?? count + 1\n const sameCurrency = new Set(rates.map((r) => r.cost.currency_code)).size <= 1\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n const byDays = (a: R, b: R) => (daysOf(a) ?? Infinity) - (daysOf(b) ?? Infinity)\n const tags = new Map<R, RateTag[]>()\n const tag = (r: R, t: RateTag) => tags.set(r, [...(tags.get(r) ?? []), t])\n\n const cheapest = sameCurrency && rates.length > 1 ? [...rates].sort((a, b) => byCost(a, b) || byDays(a, b))[0] : undefined\n if (cheapest && costOf(cheapest) !== null) tag(cheapest, 'cheapest')\n const fastest = rates.length > 1 ? [...rates].sort((a, b) => byDays(a, b) || byCost(a, b))[0] : undefined\n if (fastest && daysOf(fastest) !== null && (!cheapest || fastest === cheapest || (daysOf(cheapest) ?? Infinity) > daysOf(fastest)!)) tag(fastest, 'fastest')\n\n const chosen: R[] = []\n for (const r of [cheapest, fastest]) if (r && tags.has(r) && !chosen.includes(r)) chosen.push(r)\n\n if (rates.length > collapseAfter) {\n // Rank in price and in time (ties share a rank); the best sum fills the remaining slots.\n const rank = (sorted: R[], val: (r: R) => number | null) => {\n const out = new Map<R, number>()\n let pos = 0\n let last: number | null | undefined\n sorted.forEach((r, i) => {\n const v = val(r)\n if (v !== last) pos = i\n last = v\n out.set(r, v === null ? sorted.length : pos)\n })\n return out\n }\n const priceRank = rank([...rates].sort(byCost), costOf)\n const timeRank = rank([...rates].sort(byDays), daysOf)\n const rest = rates\n .filter((r) => !chosen.includes(r))\n .sort((a, b) => priceRank.get(a)! + timeRank.get(a)! - (priceRank.get(b)! + timeRank.get(b)!) || byCost(a, b))\n let first = true\n for (const r of rest) {\n if (chosen.length >= count) break\n chosen.push(r)\n if (first) tag(r, 'best_value')\n first = false\n }\n } else {\n for (const r of rates) if (!chosen.includes(r)) chosen.push(r)\n }\n\n const recommended = chosen.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n const groups = new Map<string, RateGroup<R>>()\n for (const r of [...rates].sort(byCost)) {\n if (chosen.includes(r)) continue\n const key = carrierKey(r)\n const g = groups.get(key) ?? { key, carrier: r.carrier ?? r.provider ?? null, rates: [] }\n g.rates.push(r)\n groups.set(key, g)\n }\n const more = [...groups.values()]\n return { recommended, more, moreCount: more.reduce((n, g) => n + g.rates.length, 0) }\n}\n\nexport type FlatRatesOptions = {\n /** Count used to decide the `best_value` tag, as in `recommendRates` (default 3: only with more than 4 services). */\n count?: number\n /** Drop repeated services keeping the cheapest. Default true. */\n dedupe?: boolean\n /** Id of the chosen rate: it stays in the list even if it is a repeated service. */\n keepId?: string | null\n}\n\n/**\n * ONE flat list for `layout=\"flat\"`: every service (repeated ones dropped, the cheapest stays), ordered from the\n * lowest to the highest price, with the same tags `recommendRates` assigns (cheapest, fastest and, on long quotes,\n * best_value) on the rows that earn them. Nothing is hidden or grouped.\n */\nexport function flatRates<R extends ShippingRate>(input: readonly R[], options: FlatRatesOptions = {}): RecommendedRate<R>[] {\n const count = options.count ?? 3\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const tags = new Map<R, RateTag[]>()\n for (const { rate, tags: t } of recommendRates(rates, { count, dedupe: false }).recommended) tags.set(rate, t)\n const list = [...rates]\n const kept = options.keepId ? input.find((r) => r.id === options.keepId) : undefined\n if (kept && !list.includes(kept)) list.push(kept)\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n // Array.prototype.sort is stable: equal prices keep the server order.\n return list.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n}\n","/**\n * Pure helpers for the \"Delivery\" step: how to name a carrier rate, its arrival time, which rate is the cheapest or the\n * fastest, and one human note for the quote deadline. No amounts are computed: `cost` is shown as the server sends it;\n * comparing two costs to flag the cheapest is the only arithmetic.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandName } from './brands.js'\n\nexport type DeliveryMessages = {\n /** `{n}` = business days. */\n etaOne: string\n etaMany: string\n /** `{min}` / `{max}` = business days. */\n etaRange: string\n etaUpTo: string\n etaFrom: string\n cheapest: string\n fastest: string\n free: string\n pickupTitle: string\n /** Quote deadline, `{time}` = local time. */\n quoteToday: string\n quoteTomorrow: string\n /** `{date}` = short date + time. */\n quoteLater: string\n quoteSoon: string\n partial: string\n loading: string\n /** The quote expired or changed and the rates were reloaded. */\n requoted: string\n /** Tag of the recommended rate that balances price and arrival time (`layout=\"recommended\"`). */\n bestValue: string\n /** Toggle of the other rates, `{n}` = how many. */\n moreOptions: string\n /** Title of the group of rates without a carrier. */\n otherCarriers: string\n /** The rates could not be quoted (`error`). */\n error: string\n retry: string\n /** The order reaches the free-shipping minimum: nothing to choose. */\n freeShipping: string\n freeShippingNote: string\n /** Screen-reader status when the rates are ready (`{n}` = how many). */\n ratesReady: string\n}\n\nconst ES: DeliveryMessages = {\n etaOne: 'Llega en 1 día hábil',\n etaMany: 'Llega en {n} días hábiles',\n etaRange: 'Llega en {min} a {max} días hábiles',\n etaUpTo: 'Llega en máximo {max} días hábiles',\n etaFrom: 'Llega en {min} días hábiles o más',\n cheapest: 'Más económico',\n fastest: 'Más rápido',\n free: 'Gratis',\n pickupTitle: 'Recoger en {name}',\n quoteToday: 'Precios de envío vigentes hasta las {time}.',\n quoteTomorrow: 'Precios de envío vigentes hasta mañana a las {time}.',\n quoteLater: 'Precios de envío vigentes hasta el {date}.',\n quoteSoon: 'Los precios de envío vencen pronto ({time}).',\n partial: 'Algunas paqueterías no respondieron a tiempo; estas son las opciones disponibles.',\n loading: 'Buscando opciones de envío…',\n requoted: 'Las tarifas de envío cambiaron y ya están actualizadas. Revisa tu envío antes de pagar.',\n bestValue: 'Recomendado',\n moreOptions: 'Ver más opciones ({n})',\n otherCarriers: 'Otras opciones',\n error: 'No pudimos consultar las opciones de envío en este momento.',\n retry: 'Intentar de nuevo',\n freeShipping: 'Envío gratis',\n freeShippingNote: 'Tu pedido ya incluye el envío: no tienes que elegir paquetería.',\n ratesReady: 'Opciones de envío listas ({n}).',\n}\n\nconst EN: DeliveryMessages = {\n etaOne: 'Arrives in 1 business day',\n etaMany: 'Arrives in {n} business days',\n etaRange: 'Arrives in {min} to {max} business days',\n etaUpTo: 'Arrives in up to {max} business days',\n etaFrom: 'Arrives in {min}+ business days',\n cheapest: 'Cheapest',\n fastest: 'Fastest',\n free: 'Free',\n pickupTitle: 'Pick up at {name}',\n quoteToday: 'Shipping prices valid until {time}.',\n quoteTomorrow: 'Shipping prices valid until tomorrow at {time}.',\n quoteLater: 'Shipping prices valid until {date}.',\n quoteSoon: 'Shipping prices expire soon ({time}).',\n partial: \"We couldn't reach every carrier. These are the options available now.\",\n loading: 'Looking for delivery options…',\n requoted: 'Shipping rates changed and are now up to date. Check your delivery before paying.',\n bestValue: 'Recommended',\n moreOptions: 'Show more options ({n})',\n otherCarriers: 'Other options',\n error: \"We couldn't get delivery options right now.\",\n retry: 'Try again',\n freeShipping: 'Free shipping',\n freeShippingNote: 'Shipping is included in your order: there is no carrier to choose.',\n ratesReady: 'Delivery options ready ({n}).',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function deliveryMessages(locale?: string | null, overrides?: Partial<DeliveryMessages> | null): DeliveryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n// A value that already ends in a period (\"9:39 p.m.\") does not get a second one from the template.\nconst fill = (tpl: string, vars: Record<string, string | number>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k: string) => String(vars[k] ?? '')).replace(/\\.\\.$/, '.')\n\n/** Commercial carrier name of a rate (`fedex` → \"FedEx\"); `null` without carrier. */\nexport function rateCarrier(rate: Pick<ShippingRate, 'carrier'>): string | null {\n return brandName(rate.carrier)\n}\n\n/**\n * Service name without the carrier repeated: \"FedEx Express Saver\" with carrier `fedex` → \"Express Saver\". Falls back\n * to the title when stripping would leave nothing.\n */\nexport function rateService(rate: Pick<ShippingRate, 'title' | 'carrier'>): string {\n const title = rate.title.trim()\n const carrier = rateCarrier(rate)\n if (!carrier) return title\n for (const prefix of [carrier, rate.carrier ?? '']) {\n if (!prefix) continue\n if (title.toLowerCase().startsWith(prefix.toLowerCase())) {\n const rest = title.slice(prefix.length).replace(/^[\\s·:|-]+/, '')\n if (rest) return rest\n }\n }\n return title\n}\n\n/** Arrival time of a rate: business days from the provider, else the server `eta` text as is. */\nexport function rateEta(\n rate: Pick<ShippingRate, 'eta' | 'eta_days_min' | 'eta_days_max'>,\n messages: DeliveryMessages = ES,\n): string | null {\n const { eta_days_min: min, eta_days_max: max } = rate\n if (typeof min === 'number' && typeof max === 'number') {\n if (min === max) return min === 1 ? messages.etaOne : fill(messages.etaMany, { n: min })\n return fill(messages.etaRange, { min, max })\n }\n if (typeof max === 'number') return max === 1 ? messages.etaOne : fill(messages.etaUpTo, { max })\n if (typeof min === 'number') return min === 1 ? messages.etaOne : fill(messages.etaFrom, { min })\n return rate.eta ?? null\n}\n\nexport type RateBadge = 'cheapest' | 'fastest'\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\n\n/**\n * Badges per rate id. Only with two or more rates, only when one rate is strictly the cheapest (same currency) or\n * strictly the fastest: a tie gets no badge, so the badge always tells the buyer something.\n */\nexport function rateBadges(rates: readonly ShippingRate[]): Map<string, RateBadge[]> {\n const out = new Map<string, RateBadge[]>()\n if (rates.length < 2) return out\n const add = (id: string, b: RateBadge) => out.set(id, [...(out.get(id) ?? []), b])\n const unique = (values: Array<[string, number | null]>) => {\n const known = values.filter((v): v is [string, number] => v[1] !== null)\n if (known.length < 2) return null\n const min = Math.min(...known.map((v) => v[1]))\n const winners = known.filter((v) => v[1] === min)\n return winners.length === 1 ? winners[0]![0] : null\n }\n const currencies = new Set(rates.map((r) => r.cost.currency_code))\n if (currencies.size === 1) {\n const id = unique(rates.map((r) => [r.id, costOf(r)]))\n if (id) add(id, 'cheapest')\n }\n const fast = unique(rates.map((r) => [r.id, daysOf(r)]))\n if (fast) add(fast, 'fastest')\n return out\n}\n\n/** Earliest `expires_at` of the rates (the deadline of the whole list), or `null`. */\nexport function quoteDeadline(rates: readonly Pick<ShippingRate, 'expires_at'>[]): Date | null {\n let best: Date | null = null\n for (const r of rates) {\n if (!r.expires_at) continue\n const d = new Date(r.expires_at)\n if (Number.isNaN(d.getTime())) continue\n if (!best || d < best) best = d\n }\n return best\n}\n\nexport type QuoteNote = { text: string; soon: boolean }\n\n/**\n * One human note for the quote deadline, in the buyer's time zone (or `timeZone`): \"valid until 9:39 p.m.\", \"until\n * tomorrow at…\", \"until Oct 24, …\", or \"expire soon\" within `soonMinutes` (default 15). `null` when already past.\n */\nexport function quoteNote(\n deadline: Date | null,\n opts: { locale?: string; now?: Date; timeZone?: string; soonMinutes?: number; messages?: DeliveryMessages } = {},\n): QuoteNote | null {\n if (!deadline) return null\n const now = opts.now ?? new Date()\n const left = deadline.getTime() - now.getTime()\n if (left <= 0) return null\n const m = opts.messages ?? ES\n const locale = opts.locale ?? 'es-MX'\n const tz = opts.timeZone ? { timeZone: opts.timeZone } : {}\n const time = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n if (left <= (opts.soonMinutes ?? 15) * 60_000) return { text: fill(m.quoteSoon, { time }), soon: true }\n const day = (d: Date) => new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', ...tz }).format(d)\n if (day(deadline) === day(now)) return { text: fill(m.quoteToday, { time }), soon: false }\n if (day(deadline) === day(new Date(now.getTime() + 86_400_000))) return { text: fill(m.quoteTomorrow, { time }), soon: false }\n const date = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n return { text: fill(m.quoteLater, { date }), soon: false }\n}\n\n/** Error codes a server uses (or will use) when the chosen rate is no longer quotable. */\nconst QUOTE_CODES = new Set(['quote_expired', 'rate_expired', 'rate_changed', 'rate_unavailable', 'rate_not_found', 'stale_rate', 'invalid_rate'])\n\n/**\n * `true` when saving a shipping rate failed because the quote expired or the rates changed, so the shop should reload\n * the rates (and keep the address) instead of showing a generic failure. Recognizes the explicit codes\n * (`quote_expired`, `rate_expired`…, any status), a `409`, and the generic `422` on the rate field that older servers\n * answer when the provider re-quoted with new ids. 5xx and other 4xx stay real failures.\n */\nexport function isQuoteChange(err: { status?: number; code?: string | null; field?: string | null } | null | undefined): boolean {\n if (!err) return false\n if (err.code && QUOTE_CODES.has(err.code)) return true\n if (err.status === 409) return true\n return err.status === 422 && (err.field === 'rate_id' || err.field === 'delivery' || err.field === 'delivery.rate_id' || !err.field)\n}\n\n/**\n * The rate of a fresh quote that matches the one the buyer had chosen (same carrier and service), so a re-quote keeps\n * the choice even though the provider issued new ids. `null` when that service is no longer offered.\n */\nexport function matchRate<R extends Pick<ShippingRate, 'id' | 'carrier' | 'service_code' | 'title'>>(previous: Pick<ShippingRate, 'carrier' | 'service_code' | 'title'> | null | undefined, rates: readonly R[]): R | null {\n if (!previous) return null\n const norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\n const sameCarrier = (r: R) => norm(r.carrier) === norm(previous.carrier)\n if (previous.service_code) {\n const hit = rates.find((r) => sameCarrier(r) && norm(r.service_code) === norm(previous.service_code))\n if (hit) return hit\n }\n return rates.find((r) => sameCarrier(r) && norm(r.title) === norm(previous.title)) ?? null\n}\n","import { useMemo, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react'\nimport { formatMoney, type Money, type PickupOption, type ShippingRate } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { BrandMark } from './brand-mark.js'\nimport { flatRates, recommendRates, type RateTag } from './recommend.js'\nimport {\n deliveryMessages,\n quoteDeadline,\n quoteNote,\n rateBadges,\n rateCarrier,\n rateEta,\n rateService,\n type DeliveryMessages,\n type RateBadge,\n} from './delivery.js'\n\nexport type DeliveryOptionsClassNames = Partial<\n Record<\n | 'root'\n | 'option'\n | 'radio'\n | 'mark'\n | 'body'\n | 'title'\n | 'carrier'\n | 'service'\n | 'eta'\n | 'badges'\n | 'badge'\n | 'price'\n | 'free'\n | 'freeBanner'\n | 'note'\n | 'partial'\n | 'skeleton'\n | 'more'\n | 'moreSummary'\n | 'group'\n | 'groupTitle'\n | 'error'\n | 'retry',\n string\n >\n>\n\nexport type DeliveryOptionsProps = {\n rates: readonly ShippingRate[]\n pickup?: readonly PickupOption[]\n /** Radio group name. Default `delivery_choice`. */\n name?: string\n /** Form value of a rate. Default `rate:<id>`. */\n rateValue?: (rate: ShippingRate) => string\n /** Form value of a pickup branch. Default `pickup:<branch_id>`. */\n pickupValue?: (branch: PickupOption) => string\n /** Uncontrolled preselection. Default: the first rate. `null`: nothing preselected. */\n defaultValue?: string | null\n /** Controlled value (use with `onValueChange`). */\n value?: string\n onValueChange?: (value: string) => void\n /** Some provider did not answer (`DeliveryOptions.partial`): one neutral note above the list. */\n partial?: boolean\n /** The previous quote expired or changed and these rates are fresh: one status note above the list. */\n requoted?: boolean\n /** Rates are being quoted again: skeleton rows (no rates yet) or the current rows dimmed, `aria-busy`. */\n loading?: boolean\n /**\n * The order reaches the free-shipping minimum (`DeliveryOptions.free`, configured by the organization): no carrier\n * selector, just \"Free shipping\" and the rate is submitted by itself so the buyer goes straight to payment.\n * With pickup branches the plain rows stay (delivery or pickup is still a real choice).\n */\n free?: boolean\n /** Rates just arrived by themselves (auto quote): a polite screen-reader status says how many. */\n announceReady?: boolean\n /** Quote deadline note: `always` (default), only when it is `soon`, or `never`. */\n quoteNote?: 'always' | 'soon' | 'never'\n /** Time zone of the note. Default: the buyer's browser. */\n timeZone?: string\n /** Show the carrier marks. Default true. */\n marks?: boolean\n /** Cheapest / fastest badges. Default true. */\n badges?: boolean\n required?: boolean\n locale?: string\n messages?: Partial<DeliveryMessages>\n renderAmount?: (amount: Money) => ReactNode\n classNames?: DeliveryOptionsClassNames\n /**\n * `list` (default): every rate, as the server orders them. `recommended`: up to `recommendedCount` rates (cheapest,\n * fastest and the best balance, tagged) and the rest under \"Show more options (N)\", grouped by carrier so the carrier\n * name is not repeated on every row. Repeated services are dropped (the cheapest stays). Works without JavaScript\n * (`<details>`); it opens by itself when the chosen rate is inside. `flat`: ONE plain list like most online shops:\n * every service ordered from the lowest to the highest price, repeated services dropped (the cheapest stays), the\n * cheapest / fastest / recommended tags on the rows that earn them, no `<details>` and no groups. The chosen rate is\n * always listed, and with no explicit default the preselected row is the first one (the cheapest).\n */\n layout?: 'list' | 'recommended' | 'flat'\n /** Rates recommended in `layout=\"recommended\"`. Default 3. */\n recommendedCount?: number\n /**\n * The rates could not be quoted (provider down, timeout): one friendly alert instead of the list, with a retry button\n * when `onRetry` is set. `true` uses the default text; a string replaces it.\n */\n error?: boolean | string\n onRetry?: () => void\n /** `data-testid` of every radio. */\n testId?: string\n /** Rows the shop renders before the rates (e.g. \"home delivery, rates after the address\"). */\n children?: ReactNode\n}\n\nconst SR_ONLY: CSSProperties = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }\n\nconst useHydrated = () =>\n useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n )\n\nfunction PickupGlyph({ size = 24 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 48 32\" width={Math.round(size * 1.5)} height={size} aria-hidden=\"true\" focusable=\"false\" style={{ flex: 'none' }} data-sf-brand-mark=\"pickup\">\n <rect x=\"0.5\" y=\"0.5\" width=\"47\" height=\"31\" rx=\"5\" fill=\"var(--sf-brand-mark-bg, #E7E9EE)\" stroke=\"var(--sf-brand-mark-ring, rgb(127 127 127 / 0.35))\" />\n <path d=\"M15 13.5 17 9h14l2 4.5M15 13.5h18M15 13.5V23h18v-9.5M21 23v-5h6v5\" fill=\"none\" stroke=\"var(--sf-brand-mark-fg, #2B2F38)\" strokeWidth=\"1.8\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/**\n * The rates and pickup branches of \"Delivery\" as native radios: carrier mark and commercial name, readable service,\n * arrival time, cheapest / fastest badges, price as the server sends it, and ONE note for the quote deadline in the\n * buyer's time zone. Works without JavaScript (plain radios in the page form); the note appears after hydration in a\n * reserved line, so it never shifts the layout.\n *\n * Wrap it in the shop's own `<fieldset><legend>`. Style it with `classNames` and/or the default sheet\n * `@asteby/storefront-react/checkout.css`.\n */\nexport function DeliveryOptions(props: DeliveryOptionsProps) {\n const {\n rates,\n pickup = [],\n name = 'delivery_choice',\n rateValue = (r) => `rate:${r.id}`,\n pickupValue = (b) => `pickup:${b.branch_id}`,\n value,\n onValueChange,\n partial = false,\n requoted = false,\n loading = false,\n timeZone,\n marks = true,\n badges: showBadges = true,\n required = true,\n renderAmount,\n classNames: cx = {},\n testId,\n children,\n layout = 'list',\n error,\n onRetry,\n free = false,\n } = props\n const locale = useResolvedLocale(props.locale)\n const m = useMemo(() => deliveryMessages(locale, props.messages), [locale, props.messages])\n const hydrated = useHydrated()\n const badges = useMemo(() => (showBadges ? rateBadges(rates) : new Map<string, RateBadge[]>()), [rates, showBadges])\n const flat = useMemo(\n () => (layout === 'flat' ? flatRates(rates, { count: props.recommendedCount ?? 3, keepId: value ? rates.find((r) => rateValue(r) === value)?.id ?? null : null }) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layout, rates, props.recommendedCount, value],\n )\n const firstRate = flat ? flat[0]?.rate : rates[0]\n const firstValue = firstRate ? rateValue(firstRate) : null\n const defaultValue = props.defaultValue === undefined ? firstValue : props.defaultValue\n const amount = (money: Money) => (Number(money.amount) === 0 ? <span className={cx.free} data-sf-delivery-free>{m.free}</span> : renderAmount ? renderAmount(money) : formatMoney(money, locale))\n const mode = props.quoteNote ?? 'always'\n const deadline = mode === 'never' ? null : quoteDeadline(rates)\n const note = hydrated && deadline ? quoteNote(deadline, { locale, messages: m, ...(timeZone ? { timeZone } : {}) }) : null\n const shownNote = note && (mode === 'always' || note.soon) ? note : null\n\n const current = value ?? defaultValue ?? null\n const plan = useMemo(\n () => (layout === 'recommended' ? recommendRates(rates, { count: props.recommendedCount ?? 3 }) : null),\n [layout, rates, props.recommendedCount],\n )\n const inMore = plan ? plan.more.some((g) => g.rates.some((r) => rateValue(r) === current)) : false\n\n const radio = (v: string, describedBy?: string) => (\n <input\n type=\"radio\"\n name={name}\n value={v}\n required={required}\n className={cx.radio}\n {...(describedBy ? { 'aria-describedby': describedBy } : {})}\n {...(value !== undefined ? { checked: value === v, onChange: () => onValueChange?.(v) } : { defaultChecked: v === defaultValue, ...(onValueChange ? { onChange: () => onValueChange(v) } : {}) })}\n {...(testId ? { 'data-testid': testId } : {})}\n />\n )\n\n const tagText = (t: RateTag | RateBadge) => (t === 'cheapest' ? m.cheapest : t === 'fastest' ? m.fastest : m.bestValue)\n\n /** One row: [radio] [mark] carrier + service / arrival / tags ........ price. In a carrier group the mark and the carrier name live in the group title. */\n const rateRow = (rate: ShippingRate, opts: { tags: readonly (RateTag | RateBadge)[]; grouped?: boolean }) => {\n const carrier = rateCarrier(rate)\n const service = rateService(rate)\n const eta = rateEta(rate, m)\n return (\n <label key={rate.id} className={cx.option} data-sf-delivery-option data-loading={loading || undefined} data-grouped={opts.grouped || undefined}>\n {radio(rateValue(rate))}\n {marks && !opts.grouped ? (\n // Fixed slot: logos of different widths do not push the text column out of line.\n <span data-sf-delivery-mark aria-hidden=\"true\">\n <BrandMark brand={rate.carrier ?? rate.provider ?? rate.title} size={28} {...(cx.mark ? { className: cx.mark } : {})} />\n </span>\n ) : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n {carrier ? (\n opts.grouped ? (\n <>\n {/* The group title already shows the carrier: only screen readers hear it again (each radio keeps a full name). */}\n <span style={SR_ONLY}>{carrier} </span>\n <span className={cx.carrier} data-sf-delivery-carrier data-sf-delivery-service-only>\n {service}\n </span>\n </>\n ) : (\n <>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {carrier}\n </span>{' '}\n <span className={cx.service} data-sf-delivery-service>\n {service}\n </span>\n </>\n )\n ) : (\n <span className={cx.carrier} data-sf-delivery-carrier>\n {service}\n </span>\n )}\n </span>\n {eta ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {eta}\n </span>\n ) : null}\n {opts.tags.length ? (\n <span className={cx.badges} data-sf-delivery-badges>\n {opts.tags.map((b) => (\n <span key={b} className={cx.badge} data-sf-delivery-badge={b}>\n {tagText(b)}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n {amount(rate.cost)}\n </span>\n </label>\n )\n }\n\n const errorText = error ? (typeof error === 'string' ? error : m.error) : null\n // Free shipping: the only thing left to say. The cheapest non-pickup rate travels as a hidden value.\n const freeRate = free && !loading && pickup.length === 0 ? (rates.find((r) => !r.pickup) ?? null) : null\n\n return (\n <div className={cx.root} data-sf-delivery data-layout={layout} aria-busy={loading || undefined}>\n {partial && !errorText ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-partial>\n {m.partial}\n </p>\n ) : null}\n {requoted ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-requoted>\n {m.requoted}\n </p>\n ) : null}\n {loading ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-loading>\n {m.loading}\n </span>\n ) : null}\n {props.announceReady && !loading && rates.length > 0 ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-ready>\n {freeRate ? m.freeShipping : m.ratesReady.replace('{n}', String(rates.length))}\n </span>\n ) : null}\n {errorText && rates.length === 0 && !loading ? (\n <div role=\"alert\" className={cx.error} data-sf-delivery-error>\n <p>{errorText}</p>\n {onRetry ? (\n <button type=\"button\" className={cx.retry} onClick={onRetry} data-sf-delivery-retry>\n {m.retry}\n </button>\n ) : null}\n </div>\n ) : null}\n {freeRate ? (\n <div className={cx.freeBanner} role={props.announceReady ? undefined : 'status'} data-sf-delivery-free-banner>\n <input type=\"hidden\" name={name} value={rateValue(freeRate)} {...(testId ? { 'data-testid': testId } : {})} />\n <p className={cx.free} data-sf-delivery-free-title>\n <strong>{m.freeShipping}</strong>\n </p>\n <p className={cx.note}>{m.freeShippingNote}</p>\n </div>\n ) : null}\n {children}\n {loading && rates.length === 0\n ? [0, 1, 2].map((i) => <div key={i} className={cx.skeleton} data-sf-delivery-skeleton aria-hidden=\"true\" />)\n : null}\n {freeRate ? null : flat\n ? flat.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : plan\n ? plan.recommended.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : rates.map((rate) => rateRow(rate, { tags: badges.get(rate.id) ?? [] }))}\n {plan && plan.moreCount > 0 ? (\n <details className={cx.more} data-sf-delivery-more {...(inMore ? { open: true } : {})}>\n <summary className={cx.moreSummary} data-sf-delivery-more-summary>\n {m.moreOptions.replace('{n}', String(plan.moreCount))}\n </summary>\n <div data-sf-delivery-groups>\n {plan.more.map((g) => {\n const carrierName = g.carrier ? rateCarrier({ carrier: g.carrier }) : null\n const id = `${name}-group-${g.key || 'other'}`\n return (\n <div key={g.key || 'other'} role=\"group\" aria-labelledby={id} className={cx.group} data-sf-delivery-group={g.key || 'other'}>\n <p id={id} className={cx.groupTitle} data-sf-delivery-group-title>\n {marks && g.carrier ? <BrandMark brand={g.carrier} size={22} /> : null}\n <span>{carrierName ?? m.otherCarriers}</span>\n </p>\n {g.rates.map((rate) => rateRow(rate, { tags: [], grouped: Boolean(carrierName) }))}\n </div>\n )\n })}\n </div>\n </details>\n ) : null}\n {pickup.map((b) => (\n <label key={b.branch_id} className={cx.option} data-sf-delivery-option data-sf-delivery-pickup>\n {radio(pickupValue(b))}\n {marks ? <PickupGlyph size={28} /> : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {m.pickupTitle.replace('{name}', b.name)}\n </span>\n </span>\n {b.address || b.city ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {[b.address, b.city].filter(Boolean).join(', ')}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n <span className={cx.free} data-sf-delivery-free>\n {m.free}\n </span>\n </span>\n </label>\n ))}\n {deadline ? (\n <p className={cx.note} data-sf-delivery-note data-soon={shownNote?.soon || undefined} aria-live=\"polite\">\n {shownNote?.text ?? ''}\n </p>\n ) : null}\n </div>\n )\n}\n","'use client'\n/**\n * One-step delivery: as soon as the address is complete the shipping rates load by themselves (debounced), the default\n * rate is preselected and payment is ready. No \"continue\" button, no choosing again.\n *\n * The hook is transport-agnostic: the shop gives `quote(address)` (save the address in the cart, read the delivery\n * options) and renders the result with `<DeliveryOptions>`. Only the fields that change the price re-quote (country,\n * postal code, state, city): editing the street number, the phone or the reference does not. Free shipping and fixed\n * prices come from the server (`DeliveryOptions.free` / `.fixed`, configured per organization): nothing here knows an\n * amount.\n */\nimport type { DeliveryOptions, ShippingRate } from '@asteby/storefront'\nimport { type RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { matchRate } from './delivery.js'\n\n/** What the shop reads from the address fields of the form. Keys follow the `name` of each input. */\nexport type QuoteAddress = {\n country_code: string\n zip: string\n province: string\n city: string\n neighborhood: string\n address1: string\n [key: string]: string\n}\n\nexport type AutoQuoteStatus =\n /** Address incomplete: nothing is quoted yet. */\n | 'idle'\n /** Complete address, waiting for the buyer to stop typing. */\n | 'waiting'\n | 'loading'\n | 'ready'\n | 'error'\n\nexport type UseAutoQuoteOptions = {\n /** The form that holds the address inputs (events are listened to on it). */\n formRef: RefObject<HTMLFormElement | null>\n /**\n * Saves the address and returns the delivery options for it. Receives an `AbortSignal` that fires when a newer\n * quote replaces this one: ignore its result then (the hook already does).\n *\n * Only price fields re-quote, so the address saved here can lag behind the form (street, number, reference): the\n * shop's submit must save the full address again before choosing the delivery and paying. The server validates the\n * chosen rate against the saved address (a rate of another postal code is refused), so a stale quote never sets a price.\n */\n quote: (address: QuoteAddress, signal: AbortSignal) => Promise<DeliveryOptions>\n /** `name` of each address input. Default: `country_code`, `zip`, `province`, `city`, `neighborhood`, `address1`. */\n names?: Partial<Record<'country_code' | 'zip' | 'province' | 'city' | 'neighborhood' | 'address1', string>>\n /** Fields that must be filled to quote. Default: all of the six names above except `country_code`. */\n required?: ReadonlyArray<keyof QuoteAddress>\n /** A postal code is valid to quote. Default: 5 digits. */\n validPostalCode?: (zip: string) => boolean\n /** Country used when the form has no country input. Default `MX`. */\n defaultCountry?: string\n /** Quiet time after the last keystroke. Default 600 ms. */\n debounceMs?: number\n /** Picks the preselected rate. Default: {@link defaultRate} (the cheapest). */\n pickDefault?: (delivery: DeliveryOptions) => ShippingRate | null\n /** The rate (`rate:<id>`) already saved in the cart: kept when the quote still offers it. */\n savedValue?: string | null\n enabled?: boolean\n /** Fires with the options of every successful quote. */\n onQuoted?: (delivery: DeliveryOptions) => void\n}\n\nexport type UseAutoQuoteResult = {\n status: AutoQuoteStatus\n /** The last good quote (kept while a new one loads, so the list does not flash). `null` before the first. */\n delivery: DeliveryOptions | null\n /** `rate:<id>` to preselect (the saved rate if still offered, else the default), `null` when none. */\n defaultValue: string | null\n /** The address the current `delivery` was quoted for. */\n quotedFor: QuoteAddress | null\n /** Quote again now (retry button). */\n retry: () => void\n /** Plain-language status for a live region (\"Buscando…\", \"Listo\", …) keys, not text. */\n announce: 'searching' | 'ready' | 'free' | 'error' | null\n}\n\nexport const DEFAULT_QUOTE_NAMES = {\n country_code: 'country_code',\n zip: 'zip',\n province: 'province',\n city: 'city',\n neighborhood: 'neighborhood',\n address1: 'address1',\n} as const\n\nconst DEFAULT_REQUIRED = ['zip', 'province', 'city', 'neighborhood', 'address1'] as const\n\n/** Only these change the price of a shipment; any other field of the form (street, phone, reference…) never re-quotes. */\nexport const QUOTE_KEYS = ['country_code', 'zip', 'province', 'city'] as const\n\nconst norm = (v: string) => v.normalize('NFD').replace(/[̀-ͯ]/g, '').trim().toLowerCase()\n\n/** Identity of a quote: equal fingerprints share the same rates. */\nexport function quoteFingerprint(a: Pick<QuoteAddress, (typeof QUOTE_KEYS)[number]>): string {\n return QUOTE_KEYS.map((k) => norm(a[k] ?? '')).join('|')\n}\n\n/** The default rate: the cheapest one that is not a pickup (ties keep the server order, which already puts the best first). */\nexport function defaultRate(delivery: Pick<DeliveryOptions, 'rates'>): ShippingRate | null {\n let best: ShippingRate | null = null\n for (const r of delivery.rates) {\n if (r.pickup) continue\n if (!best || Number(r.cost.amount) < Number(best.cost.amount)) best = r\n }\n return best\n}\n\n/** Reads the address from the form; `null` when it is not complete yet. */\nexport function readQuoteAddress(\n form: HTMLFormElement | null,\n opts: Pick<UseAutoQuoteOptions, 'names' | 'required' | 'validPostalCode' | 'defaultCountry'> = {},\n): QuoteAddress | null {\n if (!form) return null\n const names = { ...DEFAULT_QUOTE_NAMES, ...opts.names }\n const data = new FormData(form)\n const get = (name: string) => String(data.get(name) ?? '').trim()\n const address: QuoteAddress = {\n country_code: get(names.country_code) || opts.defaultCountry || 'MX',\n zip: get(names.zip),\n province: get(names.province),\n city: get(names.city),\n neighborhood: get(names.neighborhood),\n address1: get(names.address1),\n }\n const valid = opts.validPostalCode ?? ((z: string) => /^\\d{5}$/.test(z))\n if (!valid(address.zip)) return null\n for (const k of opts.required ?? DEFAULT_REQUIRED) if (!address[k]) return null\n return address\n}\n\nexport function useAutoQuote(options: UseAutoQuoteOptions): UseAutoQuoteResult {\n const { formRef, debounceMs = 600, enabled = true } = options\n const [status, setStatus] = useState<AutoQuoteStatus>('idle')\n const [delivery, setDelivery] = useState<DeliveryOptions | null>(null)\n const [quotedFor, setQuotedFor] = useState<QuoteAddress | null>(null)\n const opts = useRef(options)\n opts.current = options\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inflight = useRef<AbortController | null>(null)\n const quotedFp = useRef<string | null>(null)\n const pendingFp = useRef<string | null>(null)\n\n const run = useCallback((address: QuoteAddress, fp: string) => {\n inflight.current?.abort()\n const ctl = new AbortController()\n inflight.current = ctl\n pendingFp.current = fp\n setStatus('loading')\n opts.current\n .quote(address, ctl.signal)\n .then((d) => {\n if (ctl.signal.aborted) return\n quotedFp.current = fp\n pendingFp.current = null\n setDelivery(d)\n setQuotedFor(address)\n setStatus('ready')\n opts.current.onQuoted?.(d)\n })\n .catch(() => {\n if (ctl.signal.aborted) return\n pendingFp.current = null\n // The next change of the address (or the retry button) quotes again.\n quotedFp.current = null\n setStatus('error')\n })\n }, [])\n\n const evaluate = useCallback(\n (force: boolean) => {\n const address = readQuoteAddress(formRef.current, opts.current)\n if (!address) {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n inflight.current?.abort()\n pendingFp.current = null\n // The last quote no longer describes what the form says (e.g. the postal code is being edited): not ready to\n // pay. Completing the same address again is `ready` at once (same fingerprint, nothing is asked).\n setStatus('idle')\n return\n }\n const fp = quoteFingerprint(address)\n // Same price-relevant fields as the quote we have (or are getting): nothing to ask again.\n if (!force && (fp === quotedFp.current || fp === pendingFp.current)) {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n if (fp === quotedFp.current) setStatus('ready')\n return\n }\n if (timer.current) clearTimeout(timer.current)\n if (force) {\n timer.current = null\n run(address, fp)\n return\n }\n setStatus('waiting')\n timer.current = setTimeout(() => {\n timer.current = null\n // The form may have changed while we waited.\n const latest = readQuoteAddress(formRef.current, opts.current)\n if (latest) run(latest, quoteFingerprint(latest))\n }, debounceMs)\n },\n [debounceMs, formRef, run],\n )\n\n useEffect(() => {\n const form = formRef.current\n if (!enabled || !form) return\n const onChange = () => evaluate(false)\n form.addEventListener('input', onChange)\n form.addEventListener('change', onChange)\n // Autofill and the postal-code lookup fill fields without typing: look once at mount and on the SDK's fill event.\n const first = setTimeout(onChange, 0)\n return () => {\n clearTimeout(first)\n form.removeEventListener('input', onChange)\n form.removeEventListener('change', onChange)\n if (timer.current) clearTimeout(timer.current)\n inflight.current?.abort()\n }\n }, [enabled, evaluate, formRef])\n\n const retry = useCallback(() => evaluate(true), [evaluate])\n\n const defaultValue = useMemo(() => {\n if (!delivery) return null\n const saved = opts.current.savedValue\n if (saved?.startsWith('rate:')) {\n const hit = delivery.rates.find((r) => `rate:${r.id}` === saved)\n if (hit) return `rate:${hit.id}`\n }\n const pick = (opts.current.pickDefault ?? defaultRate)(delivery)\n return pick ? `rate:${pick.id}` : null\n }, [delivery, options.savedValue])\n\n const announce: UseAutoQuoteResult['announce'] =\n status === 'loading' || status === 'waiting' ? 'searching' : status === 'error' ? 'error' : status === 'ready' ? (delivery?.free ? 'free' : 'ready') : null\n\n return { status, delivery, defaultValue, quotedFor, retry, announce }\n}\n\n"]}
|