@asteby/storefront-react 0.12.0 → 0.13.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/checkout/fields.tsx","../src/checkout/address-fields.tsx","../src/checkout/order-summary.tsx","../src/checkout/recommend.ts","../src/checkout/delivery.ts","../src/checkout/delivery-options.tsx"],"names":["ES","EN","jsxs","jsx","useState","useRef","fill","useEffect","costOf","daysOf","norm","formatMoney","Fragment"],"mappings":"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","file":"checkout.js","sourcesContent":["/**\n * Form fields of a checkout with inline validation: a labelled field that shows its own error under it, a focusable\n * error summary for the submit, and one hook that reads the browser's own constraint validation (`required`, `type`,\n * `pattern`, `minLength`...) so the rules stay in the HTML and the page keeps working without JavaScript (then the\n * browser explains the errors itself).\n *\n * WCAG 2.2: errors are identified in text next to the field (3.3.1), linked with `aria-describedby` and `aria-invalid`,\n * and the summary takes focus and links to every field (3.3.1 / 2.4.3). Validation runs when the buyer leaves a field\n * that has a value, and clears as soon as it is fixed: it never nags while typing.\n */\nimport { useEffect, useRef, useState, type InputHTMLAttributes, type ReactNode, type RefObject, type SelectHTMLAttributes } from 'react'\n\nexport type FieldMessages = {\n valueMissing: string\n /** Required radio group (delivery, payment). */\n choiceMissing: string\n email: string\n tel: string\n pattern: string\n /** `{n}` = minimum length. */\n tooShort: string\n /** A field the server rejected. */\n server: string\n /** Error summary title, `{n}` = number of fields. */\n summaryOne: string\n summaryMany: string\n optional: string\n}\n\nconst ES: FieldMessages = {\n valueMissing: 'Completa este campo.',\n choiceMissing: 'Elige una opción.',\n email: 'Escribe un correo válido, por ejemplo nombre@correo.com.',\n tel: 'Escribe un teléfono válido.',\n pattern: 'Revisa el formato.',\n tooShort: 'Escribe al menos {n} caracteres.',\n server: 'Revisa este campo.',\n summaryOne: 'Revisa 1 campo para continuar',\n summaryMany: 'Revisa {n} campos para continuar',\n optional: '(opcional)',\n}\n\nconst EN: FieldMessages = {\n valueMissing: 'Fill in this field.',\n choiceMissing: 'Choose an option.',\n email: 'Enter a valid email, like name@example.com.',\n tel: 'Enter a valid phone number.',\n pattern: 'Check the format.',\n tooShort: 'Enter at least {n} characters.',\n server: 'Check this field.',\n summaryOne: 'Check 1 field to continue',\n summaryMany: 'Check {n} fields to continue',\n optional: '(optional)',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function fieldMessages(locale?: string | null, overrides?: Partial<FieldMessages> | null): FieldMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n/** Field name -> error text. */\nexport type FieldErrors = Record<string, string>\n\nexport type ErrorSummaryItem = { name: string; id: string; label: string; message: string }\n\ntype Control = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n\nconst isControl = (el: EventTarget | null): el is Control =>\n !!el && typeof (el as Element).tagName === 'string' && ['INPUT', 'SELECT', 'TEXTAREA'].includes((el as Element).tagName) && !!(el as Control).name\n\n/**\n * The error text for a control, from its validity. A control can bring its own text with `data-sf-error` (any\n * failure) or `title` (pattern mismatch, the HTML convention).\n */\nexport function validationMessage(el: Control, m: FieldMessages = ES): string | null {\n const v = el.validity\n if (!v || v.valid) return null\n const own = el.getAttribute('data-sf-error')\n if (own) return own\n if (v.valueMissing) return el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox') ? m.choiceMissing : m.valueMissing\n if (v.typeMismatch && el instanceof HTMLInputElement) return el.type === 'email' ? m.email : el.type === 'tel' ? m.tel : m.pattern\n if (v.patternMismatch) return el.getAttribute('title') || (el instanceof HTMLInputElement && el.type === 'tel' ? m.tel : m.pattern)\n if (v.tooShort && el instanceof HTMLInputElement) return m.tooShort.replace('{n}', String(el.minLength))\n return el.validationMessage || m.pattern\n}\n\n/** Visible name of a control: its `<label>`, `aria-label`, or the legend of its group (radios). */\nfunction labelOf(el: Control): string {\n if (el instanceof HTMLInputElement && el.type === 'radio') {\n const legend = el.closest('fieldset')?.querySelector('legend')\n if (legend?.textContent) return legend.textContent.trim()\n }\n const text = el.labels?.[0]?.getAttribute('data-sf-label') ?? el.labels?.[0]?.textContent ?? el.getAttribute('aria-label') ?? el.name\n return text.trim()\n}\n\nexport type UseFieldErrorsOptions = {\n locale?: string\n messages?: Partial<FieldMessages>\n /** Fields the server rejected (e.g. from the action), shown with `serverMessages[name]` or the generic text. */\n serverFields?: Iterable<string> | null\n serverMessages?: Record<string, string> | null\n}\n\nexport type FieldErrorsState = {\n errors: FieldErrors\n /** Non-null after a submit with problems (or with server errors): render it in `<ErrorSummary>`. */\n summary: ErrorSummaryItem[] | null\n /** Changes every time a new summary appears, so `<ErrorSummary>` focuses it again. */\n summaryKey: number\n clear: () => void\n}\n\n/**\n * Inline validation for the page `<form>`. Listens to the form (no wrapping component): leaving a field with a value\n * checks it; typing in a field with an error clears it when fixed; a submit or `reportValidity()` with problems\n * collects them (the browser's bubbles are replaced by the inline texts) for the summary.\n */\nexport function useFieldErrors(formRef: RefObject<HTMLFormElement | null>, options: UseFieldErrorsOptions = {}): FieldErrorsState {\n const m = fieldMessages(options.locale, options.messages)\n const live = useRef(m)\n live.current = m\n const server = [...(options.serverFields ?? [])]\n const serverKey = server.join('|')\n const [errors, setErrors] = useState<FieldErrors>(() => Object.fromEntries(server.map((n) => [n, options.serverMessages?.[n] ?? m.server])))\n const [summary, setSummary] = useState<ErrorSummaryItem[] | null>(null)\n const [summaryKey, setSummaryKey] = useState(0)\n\n // Server errors (a new action result): inline texts plus a summary.\n useEffect(() => {\n if (!server.length) return\n const form = formRef.current\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const name of server) {\n const msg = options.serverMessages?.[name] ?? live.current.server\n next[name] = msg\n const el = form?.elements.namedItem(name)\n const ctl = el && 'length' in el && !(el instanceof HTMLSelectElement) ? ((el as RadioNodeList)[0] as Control | undefined) : (el as Control | null)\n if (ctl) items.push({ name, id: ctl.id || name, label: labelOf(ctl), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n if (items.length) {\n setSummary(items)\n setSummaryKey((k) => k + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [serverKey])\n\n useEffect(() => {\n const form = formRef.current\n if (!form) return\n let batch: Control[] | null = null\n const set = (name: string, msg: string | null) =>\n setErrors((e) => {\n if (msg === null) {\n if (!(name in e)) return e\n const { [name]: _gone, ...rest } = e\n return rest\n }\n return e[name] === msg ? e : { ...e, [name]: msg }\n })\n const onBlur = (ev: FocusEvent) => {\n const el = ev.target\n if (!isControl(el) || (el instanceof HTMLInputElement && (el.type === 'radio' || el.type === 'checkbox' || el.type === 'hidden'))) return\n // Leaving an empty field you only tabbed through is not an error yet; it is at submit.\n if (!el.value) return\n set(el.name, validationMessage(el, live.current))\n }\n const onInput = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n setErrors((e) => {\n if (!(el.name in e)) return e\n const msg = el.validity.valid ? null : validationMessage(el, live.current)\n if (msg !== null) return e // keep the text until the field is fixed (no flicker while typing)\n const { [el.name]: _gone, ...rest } = e\n return rest\n })\n }\n const onInvalid = (ev: Event) => {\n const el = ev.target\n if (!isControl(el)) return\n ev.preventDefault() // the inline text replaces the browser bubble\n if (!batch) {\n batch = []\n queueMicrotask(() => {\n const list = batch ?? []\n batch = null\n const seen = new Set<string>()\n const items: ErrorSummaryItem[] = []\n const next: FieldErrors = {}\n for (const c of list) {\n if (seen.has(c.name)) continue\n seen.add(c.name)\n const msg = validationMessage(c, live.current) ?? live.current.valueMissing\n next[c.name] = msg\n items.push({ name: c.name, id: c.id || c.name, label: labelOf(c), message: msg })\n }\n setErrors((e) => ({ ...e, ...next }))\n setSummary(items)\n setSummaryKey((k) => k + 1)\n })\n }\n batch.push(el)\n }\n form.addEventListener('focusout', onBlur)\n form.addEventListener('input', onInput)\n form.addEventListener('change', onInput)\n form.addEventListener('invalid', onInvalid, true)\n return () => {\n form.removeEventListener('focusout', onBlur)\n form.removeEventListener('input', onInput)\n form.removeEventListener('change', onInput)\n form.removeEventListener('invalid', onInvalid, true)\n }\n }, [formRef])\n\n // The summary follows the fixes: a field fixed after the submit leaves the list.\n const shown = summary ? summary.filter((s) => s.name in errors).map((s) => ({ ...s, message: errors[s.name]! })) : null\n return {\n errors,\n summary: shown && shown.length ? shown : null,\n summaryKey,\n clear: () => {\n setErrors({})\n setSummary(null)\n },\n }\n}\n\nexport type ErrorSummaryProps = {\n items: readonly ErrorSummaryItem[] | null\n /** Changes when a new summary must take focus (`useFieldErrors().summaryKey`). */\n focusKey?: number\n locale?: string\n messages?: Partial<FieldMessages>\n title?: ReactNode\n className?: string\n classNames?: Partial<Record<'title' | 'list' | 'link', string>>\n}\n\n/**\n * The list of problems after a submit, above the form: `role=\"alert\"`, takes focus, one link per field (moves the\n * focus to it). Renders nothing without items.\n */\nexport function ErrorSummary({ items, focusKey, locale, messages, title, className, classNames: cx = {} }: ErrorSummaryProps) {\n const ref = useRef<HTMLDivElement>(null)\n const m = fieldMessages(locale, messages)\n const has = !!items && items.length > 0\n useEffect(() => {\n if (has) ref.current?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusKey])\n if (!has) return null\n const n = items!.length\n return (\n <div ref={ref} role=\"alert\" tabIndex={-1} className={className} data-sf-error-summary aria-labelledby=\"sf-error-summary-title\">\n <p id=\"sf-error-summary-title\" className={cx.title} data-sf-error-summary-title>\n {title ?? (n === 1 ? m.summaryOne : m.summaryMany.replace('{n}', String(n)))}\n </p>\n <ul className={cx.list}>\n {items!.map((it) => (\n <li key={it.name}>\n <a\n href={`#${it.id}`}\n className={cx.link}\n onClick={(e) => {\n const el = document.getElementById(it.id)\n if (!el) return\n e.preventDefault()\n el.focus()\n el.scrollIntoView?.({ block: 'center' })\n }}\n >\n {it.label}: {it.message}\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport type CheckoutFieldClassNames = Partial<Record<'root' | 'label' | 'optional' | 'input' | 'hint' | 'error', string>>\n\ntype BaseFieldProps = {\n name: string\n label: string\n /** Field id. Default: the name. */\n id?: string\n /** Error text (from `useFieldErrors().errors[name]` or the server). */\n error?: string | null\n /** Help under the label (\"we only use it for the delivery\"). */\n hint?: ReactNode\n /** Marks the label \"(optional)\" and drops `required`. */\n optional?: boolean\n classNames?: CheckoutFieldClassNames\n locale?: string\n messages?: Partial<FieldMessages>\n}\n\nexport type CheckoutFieldProps = BaseFieldProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'name' | 'id'> & { as?: 'input' }\nexport type CheckoutSelectProps = BaseFieldProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'name' | 'id'> & { as: 'select'; children: ReactNode }\n\n/**\n * One labelled field: label (with \"(optional)\"), hint, the control and its error text, wired with `aria-describedby`\n * and `aria-invalid`. Required unless `optional`. `as=\"select\"` renders a `<select>` with the given options.\n */\nexport function CheckoutField(props: CheckoutFieldProps | CheckoutSelectProps) {\n const { name, label, id = name, error, hint, optional = false, classNames: cx = {}, locale, messages, ...rest } = props\n const m = fieldMessages(locale, messages)\n const hintId = hint ? `${id}-hint` : undefined\n const errorId = `${id}-error`\n const describedBy = [hintId, error ? errorId : undefined].filter(Boolean).join(' ') || undefined\n const common = {\n id,\n name,\n required: !optional,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': describedBy,\n className: cx.input,\n 'data-sf-field-control': '',\n } as const\n return (\n <div className={cx.root} data-sf-field data-invalid={error ? '' : undefined}>\n <label htmlFor={id} className={cx.label} data-sf-label={label}>\n {label}\n {optional ? (\n <span className={cx.optional} data-sf-field-optional>\n {' '}\n {m.optional}\n </span>\n ) : null}\n </label>\n {hint ? (\n <p id={hintId} className={cx.hint} data-sf-field-hint>\n {hint}\n </p>\n ) : null}\n {rest.as === 'select' ? (\n (() => {\n const { as: _as, children, ...select } = rest\n return (\n <select {...select} {...common}>\n {children}\n </select>\n )\n })()\n ) : (\n (() => {\n const { as: _as, ...input } = rest as CheckoutFieldProps\n return <input {...input} {...common} />\n })()\n )}\n {/* Reserved only when there is an error: the text sits right under its field. */}\n {error ? (\n <p id={errorId} className={cx.error} data-sf-field-error>\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","/**\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 address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: 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 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}\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 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}\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 /** 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 /** 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 */\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, 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 lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\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 || lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) 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 el.dispatchEvent(new Event('input', { bubbles: true }))\n return true\n }\n const a = fill(n('province'), info.province)\n const b = fill(n('city'), info.city)\n setColonias(info.neighborhoods ?? [])\n setFilled(a || b)\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\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 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 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')}>\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')} />\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 ? (\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 ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length ? (\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'\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. */\n renderLineMedia?: (line: CartLine) => ReactNode\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\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, renderLineMedia, 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 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","/**\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}\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}\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}\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 { 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 | '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 /** 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.\n */\n layout?: 'list' | 'recommended'\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 } = 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 firstValue = rates[0] ? rateValue(rates[0]) : 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\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 {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 {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 {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"]}
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"],"names":["fill","ES","EN","jsxs","jsx","costOf","daysOf","norm","formatMoney","Fragment"],"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 address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: 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 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}\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 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}\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 /** 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 /** 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 */\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, 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 lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\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 || lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) 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 el.dispatchEvent(new Event('input', { bubbles: true }))\n return true\n }\n const a = fill(n('province'), info.province)\n const b = fill(n('city'), info.city)\n setColonias(info.neighborhoods ?? [])\n setFilled(a || b)\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\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 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 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')}>\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')} />\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 ? (\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 ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length ? (\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'\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. */\n renderLineMedia?: (line: CartLine) => ReactNode\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\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, renderLineMedia, 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 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","/**\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}\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}\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}\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 { 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 | '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 /** 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.\n */\n layout?: 'list' | 'recommended'\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 } = 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 firstValue = rates[0] ? rateValue(rates[0]) : 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\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 {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 {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 {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"]}