@aparte/plugin-cards 0.0.0-stage → 0.29.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/carousel-DwgHvriV.js +63 -0
- package/dist/carousel-DwgHvriV.js.map +1 -0
- package/dist/controls-BYUm4aRV.js +62 -0
- package/dist/controls-BYUm4aRV.js.map +1 -0
- package/dist/format-BFq79ydr.js +728 -0
- package/dist/format-BFq79ydr.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/items/icons.d.ts +12 -0
- package/dist/items/icons.d.ts.map +1 -0
- package/dist/items/index.d.ts +100 -0
- package/dist/items/index.d.ts.map +1 -0
- package/dist/items.js +698 -0
- package/dist/items.js.map +1 -0
- package/dist/kit/carousel.d.ts +17 -0
- package/dist/kit/carousel.d.ts.map +1 -0
- package/dist/kit/controls.d.ts +51 -0
- package/dist/kit/controls.d.ts.map +1 -0
- package/dist/kit/define.d.ts +201 -0
- package/dist/kit/define.d.ts.map +1 -0
- package/dist/kit/dom.d.ts +40 -0
- package/dist/kit/dom.d.ts.map +1 -0
- package/dist/kit/fence.d.ts +39 -0
- package/dist/kit/fence.d.ts.map +1 -0
- package/dist/kit/format.d.ts +49 -0
- package/dist/kit/format.d.ts.map +1 -0
- package/dist/kit/rating.d.ts +19 -0
- package/dist/kit/rating.d.ts.map +1 -0
- package/dist/kit/sparkline.d.ts +19 -0
- package/dist/kit/sparkline.d.ts.map +1 -0
- package/dist/kit/strings.d.ts +139 -0
- package/dist/kit/strings.d.ts.map +1 -0
- package/dist/link/icons.d.ts +16 -0
- package/dist/link/icons.d.ts.map +1 -0
- package/dist/link/index.d.ts +98 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link.js +387 -0
- package/dist/link.js.map +1 -0
- package/dist/media/icons.d.ts +28 -0
- package/dist/media/icons.d.ts.map +1 -0
- package/dist/media/index.d.ts +107 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media.js +610 -0
- package/dist/media.js.map +1 -0
- package/dist/order/icons.d.ts +49 -0
- package/dist/order/icons.d.ts.map +1 -0
- package/dist/order/index.d.ts +204 -0
- package/dist/order/index.d.ts.map +1 -0
- package/dist/order.js +1843 -0
- package/dist/order.js.map +1 -0
- package/dist/place/icons.d.ts +18 -0
- package/dist/place/icons.d.ts.map +1 -0
- package/dist/place/index.d.ts +207 -0
- package/dist/place/index.d.ts.map +1 -0
- package/dist/place.js +1456 -0
- package/dist/place.js.map +1 -0
- package/dist/plan/icons.d.ts +25 -0
- package/dist/plan/icons.d.ts.map +1 -0
- package/dist/plan/index.d.ts +153 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan.js +1191 -0
- package/dist/plan.js.map +1 -0
- package/dist/product/icons.d.ts +16 -0
- package/dist/product/icons.d.ts.map +1 -0
- package/dist/product/index.d.ts +133 -0
- package/dist/product/index.d.ts.map +1 -0
- package/dist/product.js +1245 -0
- package/dist/product.js.map +1 -0
- package/dist/rating-CHVajQ2b.js +35 -0
- package/dist/rating-CHVajQ2b.js.map +1 -0
- package/dist/score/icons.d.ts +35 -0
- package/dist/score/icons.d.ts.map +1 -0
- package/dist/score/index.d.ts +185 -0
- package/dist/score/index.d.ts.map +1 -0
- package/dist/score.js +1843 -0
- package/dist/score.js.map +1 -0
- package/dist/sparkline-C-cA9obz.js +56 -0
- package/dist/sparkline-C-cA9obz.js.map +1 -0
- package/dist/stats/icons.d.ts +19 -0
- package/dist/stats/icons.d.ts.map +1 -0
- package/dist/stats/index.d.ts +137 -0
- package/dist/stats/index.d.ts.map +1 -0
- package/dist/stats.js +1085 -0
- package/dist/stats.js.map +1 -0
- package/dist/stock/chart.d.ts +135 -0
- package/dist/stock/chart.d.ts.map +1 -0
- package/dist/stock/icons.d.ts +15 -0
- package/dist/stock/icons.d.ts.map +1 -0
- package/dist/stock/index.d.ts +195 -0
- package/dist/stock/index.d.ts.map +1 -0
- package/dist/stock.js +1013 -0
- package/dist/stock.js.map +1 -0
- package/dist/weather/conditions.d.ts +25 -0
- package/dist/weather/conditions.d.ts.map +1 -0
- package/dist/weather/icons.d.ts +12 -0
- package/dist/weather/icons.d.ts.map +1 -0
- package/dist/weather/index.d.ts +146 -0
- package/dist/weather/index.d.ts.map +1 -0
- package/dist/weather.js +1162 -0
- package/dist/weather.js.map +1 -0
- package/package.json +137 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.js","sources":["../src/order/icons.ts","../src/order/order.css?raw","../src/order/index.ts"],"sourcesContent":["/**\n * The order card's glyphs: the bag and the calendar that say which kind of record it is,\n * the box a line shows without a photo, the small marks before a fact (card, van, pin,\n * people, person, house, info), the chevron of a row that links out, and the seal of the\n * confirmation — a disc with a mark drawn on it.\n *\n * Drawn on a 24 × 24 grid in `currentColor` strokes (the seal on 64 × 64), so the sheet\n * colours them through `color` and a theme follows. Constants of this package — the only\n * markup the card parses.\n */\n\nconst svg = (body: string) =>\n `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">${body}</svg>`; // safe-text: this package's own SVG, built from its glyph constants\n\n/** A shopping bag: an order, and the card's glyph on its one-line states. */\nexport const BAG = svg('<path d=\"M5.5 8h13l-1 11.2a1.8 1.8 0 0 1-1.8 1.6H8.3a1.8 1.8 0 0 1-1.8-1.6z\"/><path d=\"M9 10.5V6.8a3 3 0 0 1 6 0v3.7\"/>');\n\n/** A calendar page: a booking. */\nexport const CALENDAR = svg('<rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15.5\" rx=\"2.2\"/><path d=\"M3.5 9.8h17M8 3v4M16 3v4\"/><path d=\"M7.5 13.6h2M11 13.6h2M14.5 13.6h2M7.5 16.8h2M11 16.8h2\"/>');\n\n/** A parcel: the thumbnail of a line that has no photo, or whose photo failed. */\nexport const BOX = svg('<path d=\"M3.8 7.6 12 3.5l8.2 4.1v8.8L12 20.5l-8.2-4.1z\"/><path d=\"M3.8 7.6 12 11.7l8.2-4.1M12 11.7v8.8\"/>');\n\n/** A delivery van, before the delivery row. */\nexport const TRUCK = svg('<path d=\"M2.8 6.5h10.4v9.3H2.8z\"/><path d=\"M13.2 9.5h4.1l3 3.2v3.1h-7.1\"/><circle cx=\"7\" cy=\"17.3\" r=\"1.7\"/><circle cx=\"17\" cy=\"17.3\" r=\"1.7\"/>');\n\n/** A bank card, before the payment row. */\nexport const CARD = svg('<rect x=\"2.8\" y=\"5.5\" width=\"18.4\" height=\"13\" rx=\"2\"/><path d=\"M2.8 9.6h18.4M6.5 15h3.5\"/>');\n\n/** A pin, before where a booking takes place. */\nexport const PIN = svg('<path d=\"M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0c0 5.4-6.5 11-6.5 11z\"/><circle cx=\"12\" cy=\"10\" r=\"2.3\"/>');\n\n/** Two people, before the number of guests. */\nexport const PEOPLE = svg('<circle cx=\"9\" cy=\"8.5\" r=\"3\"/><path d=\"M3.5 19c.6-3.2 2.8-5 5.5-5s4.9 1.8 5.5 5\"/><circle cx=\"16.8\" cy=\"9.3\" r=\"2.4\"/><path d=\"M15.8 14.2c2.4-.3 4.3 1.3 4.8 4.3\"/>');\n\n/** One person, before the customer. */\nexport const PERSON = svg('<circle cx=\"12\" cy=\"8.5\" r=\"3.5\"/><path d=\"M5 20c.8-3.7 3.6-5.8 7-5.8s6.2 2.1 7 5.8\"/>');\n\n/** A house, before the delivery address. */\nexport const HOUSE = svg('<path d=\"M4 10.5 12 4l8 6.5V20H4z\"/><path d=\"M9.5 20v-5.5h5V20\"/>');\n\n/** A dot in a circle, before a fact of the tool's own. */\nexport const INFO = svg('<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5\"/><circle cx=\"12\" cy=\"8\" r=\".6\" fill=\"currentColor\"/>');\n\n/** A chevron at the end of a row that opens the order. Mirrored by the sheet in RTL. */\nexport const CHEVRON = svg('<path d=\"M9.5 6l6 6-6 6\"/>');\n\n/** The arrow between a stay's two dates. Mirrored by the sheet in RTL. */\nexport const ARROW = svg('<path d=\"M4.5 12h15M14 6.5l5.5 5.5-5.5 5.5\"/>');\n\n/** The marks a seal can carry, by its tone. Each is one path, drawn on in the sheet. */\nconst MARKS = {\n success: 'M22 32.5l7 7 13.5-14.5',\n info: 'M32 22v10.5l7 4.5',\n danger: 'M24.5 24.5l15 15M39.5 24.5l-15 15',\n neutral: 'M25.5 27.5h9.5a6.5 6.5 0 0 1 0 13h-8M30 22.5l-5 5 5 5',\n} as const;\n\nexport type SealTone = keyof typeof MARKS;\n\n/**\n * The confirmation's seal: a soft halo, a disc in the status' tone, and its mark. The mark\n * has `pathLength=\"1\"` so the sheet draws it on with one dash, whatever its real length.\n */\nexport function seal(tone: SealTone): string {\n return `<svg viewBox=\"0 0 64 64\" xmlns=\"http://www.w3.org/2000/svg\"><circle class=\"aparte-order__seal-halo\" cx=\"32\" cy=\"32\" r=\"31\"/><circle class=\"aparte-order__seal-disc\" cx=\"32\" cy=\"32\" r=\"22\"/><path class=\"aparte-order__seal-mark\" pathLength=\"1\" d=\"${MARKS[tone]}\"/></svg>`; // safe-attr: one of this file's four constant paths, never data\n}\n","export default \"/* =========================================\\n The order card — @aparte/plugin-cards/order\\n =========================================\\n Three variants of one card, chosen by `data-variant` on its root:\\n receipt the whole record, in bands: the header (kind, name, date, status),\\n the booking's dates, the lines, the totals under a rule, then the\\n facts — payment, delivery, address — and the order's page.\\n compact one row: the kind, the name over \\\"3 items · €129.90\\\", the pill, a\\n chevron when it opens a page. Several in a list stay one line each.\\n confirmation the moment it is placed: a seal drawn on, a headline, the number,\\n the facts that matter as tiles, what to do next.\\n Every colour is a theme token or derived from one, so light and dark follow the chat.\\n */\\n\\n.aparte-order-card {\\n --aparte-order-kind-size: 2.25rem;\\n --aparte-order-thumb-size: 2.75rem;\\n --aparte-order-kind-bg: color-mix(in oklab, var(--aparte-primary) 14%, var(--aparte-surface-1));\\n --aparte-order-kind-ink: var(--aparte-primary-ink);\\n --aparte-order-rule: var(--aparte-border);\\n --aparte-order-soft-rule: color-mix(in oklab, var(--aparte-border) 60%, transparent);\\n --aparte-order-tile-bg: color-mix(in oklab, var(--aparte-surface-2) 55%, var(--aparte-surface-1));\\n /* A product photo is shot on white: the thumbnail's plate is near-white in both\\n schemes, and the photo is multiplied into it (the product card's rule). */\\n --aparte-order-thumb-bg: color-mix(in oklab, var(--aparte-text) 5%, #fff);\\n --aparte-order-placeholder: var(--aparte-surface-2);\\n --aparte-order-placeholder-ink: color-mix(in oklab, var(--aparte-text) 32%, transparent);\\n --aparte-order-saving: var(--aparte-success-ink);\\n --aparte-order-seal-size: 4.5rem;\\n}\\n\\n/* ── Widths: each variant asks for its own; the bubble's limit caps them all ── */\\n\\n.aparte-order-card[data-variant=\\\"receipt\\\"] { --aparte-rich-card-max-inline-size: 26rem; }\\n.aparte-order-card[data-variant=\\\"compact\\\"] { --aparte-rich-card-max-inline-size: 26rem; }\\n.aparte-order-card[data-variant=\\\"confirmation\\\"] { --aparte-rich-card-max-inline-size: 24rem; }\\n\\n/* On the drawn card only: a one-line state shrinks to its words, and a size container\\n cannot. */\\n.aparte-order-card[data-state=\\\"ready\\\"] {\\n container: aparte-order / inline-size;\\n}\\n\\n/* ── The header ──────────────────────────────────────────────────────── */\\n\\n.aparte-order__head {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-4);\\n padding: var(--aparte-space-5) var(--aparte-rich-card-padding);\\n}\\n\\n/* The kind's glyph on a tile of the accent: the bag of an order, the calendar of a booking. */\\n.aparte-order__kind {\\n --aparte-rich-card-glyph-size: var(--aparte-order-kind-size);\\n box-sizing: border-box;\\n padding: calc(var(--aparte-order-kind-size) * 0.22);\\n border-radius: var(--aparte-radius-lg);\\n background: var(--aparte-order-kind-bg);\\n color: var(--aparte-order-kind-ink);\\n}\\n\\n.aparte-order__heading {\\n display: flex;\\n flex: 1;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n}\\n\\n.aparte-order__title {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-base);\\n font-weight: var(--aparte-font-weight-semibold);\\n line-height: 1.3;\\n overflow-wrap: anywhere;\\n}\\n\\n.aparte-order__date {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n}\\n\\n/* The pill: the badge recipe, with a dot in its tone before the word. */\\n.aparte-order__status {\\n flex: none;\\n gap: var(--aparte-space-2);\\n margin-inline-start: auto;\\n}\\n\\n.aparte-order__status-dot {\\n inline-size: 0.375rem;\\n block-size: 0.375rem;\\n border-radius: var(--aparte-radius-full);\\n background: var(--aparte-badge-intent, currentColor);\\n}\\n\\n/* ── Bands ───────────────────────────────────────────────────────────── */\\n\\n.aparte-order__section {\\n margin: 0;\\n padding: var(--aparte-space-5) var(--aparte-rich-card-padding);\\n border-block-start: var(--aparte-border-width) solid var(--aparte-order-rule);\\n}\\n\\n/* ── The lines ───────────────────────────────────────────────────────── */\\n\\n.aparte-order__items { padding-block: var(--aparte-space-2); }\\n\\n/* One grid for the list, each line a subgrid of it: the quantities line up in one column\\n and the totals in another, whatever the names' lengths. A browser without subgrid keeps\\n the first declaration and lays each line out alone — the totals still end-aligned. */\\n.aparte-order__lines {\\n display: grid;\\n grid-template-columns: minmax(0, 1fr) auto auto;\\n column-gap: var(--aparte-space-4);\\n margin: 0;\\n padding: 0;\\n list-style: none;\\n}\\n\\n.aparte-order__lines[data-thumbs] {\\n grid-template-columns: var(--aparte-order-thumb-size) minmax(0, 1fr) auto auto;\\n}\\n\\n.aparte-order__line {\\n display: grid;\\n grid-column: 1 / -1;\\n grid-template-columns: minmax(0, 1fr) auto auto;\\n grid-template-columns: subgrid;\\n align-items: center;\\n column-gap: var(--aparte-space-4);\\n padding-block: var(--aparte-space-3);\\n}\\n\\n[data-thumbs] > .aparte-order__line {\\n grid-template-columns: var(--aparte-order-thumb-size) minmax(0, 1fr) auto auto;\\n grid-template-columns: subgrid;\\n}\\n\\n.aparte-order__line + .aparte-order__line {\\n border-block-start: var(--aparte-border-width) solid var(--aparte-order-soft-rule);\\n}\\n\\n.aparte-order__qty { grid-column: -3 / -2; }\\n.aparte-order__line-total { grid-column: -2 / -1; }\\n\\n.aparte-order__thumb {\\n position: relative;\\n display: grid;\\n place-items: center;\\n inline-size: var(--aparte-order-thumb-size);\\n aspect-ratio: 1;\\n overflow: hidden;\\n border: var(--aparte-border-width) solid var(--aparte-order-soft-rule);\\n border-radius: var(--aparte-radius-md);\\n background: var(--aparte-order-thumb-bg);\\n isolation: isolate;\\n}\\n\\n.aparte-order__thumb[data-empty] { background: var(--aparte-order-placeholder); }\\n\\n.aparte-order__thumb-glyph {\\n grid-area: 1 / 1;\\n --aparte-rich-card-glyph-size: 45%;\\n color: var(--aparte-order-placeholder-ink);\\n}\\n\\n.aparte-order__thumb:not([data-empty]) .aparte-order__thumb-glyph { visibility: hidden; }\\n\\n.aparte-order__image {\\n grid-area: 1 / 1;\\n box-sizing: border-box;\\n inline-size: 100%;\\n block-size: 100%;\\n padding: 6%;\\n object-fit: contain;\\n mix-blend-mode: multiply;\\n}\\n\\n.aparte-order__image[hidden] { display: none; }\\n\\n.aparte-order__line-main {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n}\\n\\n.aparte-order__line-title {\\n display: -webkit-box;\\n overflow: hidden;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 2;\\n line-clamp: 2;\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n font-weight: var(--aparte-font-weight-medium);\\n line-height: 1.3;\\n overflow-wrap: anywhere;\\n}\\n\\n.aparte-order__line-meta {\\n display: flex;\\n flex-wrap: wrap;\\n gap: 0 var(--aparte-space-2);\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-xs);\\n}\\n\\n.aparte-order__line-meta > * + *::before,\\n.aparte-order__row-part + .aparte-order__row-part::before {\\n content: \\\"·\\\";\\n margin-inline-end: var(--aparte-space-2);\\n}\\n\\n.aparte-order__qty {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n white-space: nowrap;\\n}\\n\\n.aparte-order__line-total {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n font-weight: var(--aparte-font-weight-medium);\\n text-align: end;\\n white-space: nowrap;\\n}\\n\\n/* \\\"and 4 more\\\": a summary that reads as a link, the chevron turning as it opens. */\\n.aparte-order__more > .aparte-order__lines {\\n border-block-start: var(--aparte-border-width) solid var(--aparte-order-soft-rule);\\n}\\n\\n.aparte-order__more-toggle {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n margin-block: var(--aparte-space-1) var(--aparte-space-2);\\n padding: var(--aparte-space-1) var(--aparte-space-2);\\n margin-inline-start: calc(var(--aparte-space-2) * -1);\\n border-radius: var(--aparte-radius-sm);\\n color: var(--aparte-primary-ink);\\n font-size: var(--aparte-font-size-sm);\\n font-weight: var(--aparte-font-weight-medium);\\n list-style: none;\\n cursor: pointer;\\n transition: background-color var(--aparte-duration-fast) ease;\\n --aparte-rich-card-glyph-size: 0.875rem;\\n}\\n\\n.aparte-order__more-toggle::-webkit-details-marker { display: none; }\\n.aparte-order__more-toggle:hover { background: var(--aparte-surface-2); }\\n\\n.aparte-order__more-toggle:focus-visible {\\n outline: var(--aparte-focus-outline-width) solid var(--aparte-border-focus);\\n outline-offset: var(--aparte-focus-outline-offset);\\n}\\n\\n.aparte-order__more-chevron { transition: rotate var(--aparte-duration-base) ease; }\\n.aparte-order__more-chevron:dir(rtl) { transform: scaleX(-1); }\\n.aparte-order__more[open] .aparte-order__more-chevron { rotate: 90deg; }\\n/* Mirrored first, then turned: a quarter turn the other way also ends pointing down. */\\n.aparte-order__more[open] .aparte-order__more-chevron:dir(rtl) { rotate: -90deg; }\\n\\n.aparte-order__dropped {\\n padding-block: var(--aparte-space-2) var(--aparte-space-3);\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-xs);\\n}\\n\\n/* ── The totals ──────────────────────────────────────────────────────── */\\n\\n.aparte-order__totals {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-2);\\n background: var(--aparte-order-tile-bg);\\n}\\n\\n.aparte-order__sum {\\n display: flex;\\n align-items: baseline;\\n justify-content: space-between;\\n gap: var(--aparte-space-4);\\n}\\n\\n.aparte-order__sum-label {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-md);\\n}\\n\\n.aparte-order__sum-value {\\n margin: 0;\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n text-align: end;\\n white-space: nowrap;\\n}\\n\\n.aparte-order__sum--discount .aparte-order__sum-value,\\n.aparte-order__sum--free .aparte-order__sum-value {\\n color: var(--aparte-order-saving);\\n font-weight: var(--aparte-font-weight-medium);\\n}\\n\\n.aparte-order__sum--total {\\n align-items: center;\\n margin-block-start: var(--aparte-space-2);\\n padding-block-start: var(--aparte-space-4);\\n border-block-start: var(--aparte-border-width) solid var(--aparte-order-rule);\\n}\\n\\n.aparte-order__sum--total .aparte-order__sum-label {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-base);\\n font-weight: var(--aparte-font-weight-semibold);\\n}\\n\\n.aparte-order__sum--total .aparte-order__sum-value {\\n font-size: var(--aparte-font-size-xl);\\n font-weight: var(--aparte-font-weight-bold);\\n letter-spacing: -0.01em;\\n}\\n\\n/* A total alone needs no rule above it. */\\n.aparte-order__sum--total:first-child {\\n margin-block-start: 0;\\n padding-block-start: 0;\\n border-block-start: 0;\\n}\\n\\n/* ── The facts: payment, delivery, address, the tool's own ───────────── */\\n\\n.aparte-order__infos {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-4);\\n}\\n\\n.aparte-order__info {\\n display: grid;\\n grid-template-columns: minmax(6.5rem, 38%) minmax(0, 1fr);\\n align-items: start;\\n gap: var(--aparte-space-1) var(--aparte-space-4);\\n}\\n\\n.aparte-order__info-label {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n min-inline-size: 0;\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n line-height: 1.45;\\n --aparte-rich-card-glyph-size: 1rem;\\n}\\n\\n.aparte-order__info-glyph { opacity: 0.85; }\\n\\n.aparte-order__info-value {\\n display: flex;\\n flex-wrap: wrap;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--aparte-space-2) var(--aparte-space-3);\\n min-inline-size: 0;\\n margin: 0;\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n line-height: 1.45;\\n overflow-wrap: anywhere;\\n}\\n\\n.aparte-order__multiline { white-space: pre-line; }\\n\\n.aparte-order__delivery-text {\\n display: flex;\\n flex-direction: column;\\n min-inline-size: 0;\\n}\\n\\n.aparte-order__estimate { font-weight: var(--aparte-font-weight-medium); }\\n\\n.aparte-order__carrier {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n}\\n\\n.aparte-order__track { flex: none; }\\n\\n/* On a narrow card a fact's label goes over its value rather than squeeze it. */\\n@container aparte-order (max-width: 22rem) {\\n .aparte-order__info { grid-template-columns: minmax(0, 1fr); }\\n}\\n\\n.aparte-order__foot {\\n display: flex;\\n justify-content: flex-end;\\n padding: var(--aparte-space-4) var(--aparte-rich-card-padding);\\n border-block-start: var(--aparte-border-width) solid var(--aparte-order-rule);\\n}\\n\\n/* ── The booking: its dates as calendar leaves, then where and for whom ─ */\\n\\n.aparte-order__leaf {\\n display: inline-flex;\\n flex: none;\\n flex-direction: column;\\n align-items: center;\\n inline-size: 3.5rem;\\n overflow: hidden;\\n border: var(--aparte-border-width) solid var(--aparte-order-rule);\\n border-radius: var(--aparte-radius-lg);\\n background: var(--aparte-surface-1);\\n box-shadow: 0 1px 2px color-mix(in oklab, var(--aparte-text) 8%, transparent);\\n line-height: 1.1;\\n text-align: center;\\n}\\n\\n.aparte-order__leaf-month {\\n align-self: stretch;\\n padding-block: var(--aparte-space-1);\\n background: var(--aparte-order-kind-bg);\\n color: var(--aparte-order-kind-ink);\\n font-size: var(--aparte-font-size-2xs);\\n font-weight: var(--aparte-font-weight-bold);\\n letter-spacing: 0.06em;\\n text-transform: uppercase;\\n}\\n\\n.aparte-order__leaf-day {\\n padding-block-start: var(--aparte-space-2);\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-xl);\\n font-weight: var(--aparte-font-weight-bold);\\n}\\n\\n.aparte-order__leaf-weekday {\\n padding-block: var(--aparte-space-1) var(--aparte-space-2);\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-2xs);\\n}\\n\\n.aparte-order__day {\\n display: flex;\\n align-items: center;\\n gap: var(--aparte-space-5);\\n}\\n\\n.aparte-order__day-text {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n}\\n\\n.aparte-order__day-name {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-base);\\n font-weight: var(--aparte-font-weight-semibold);\\n}\\n\\n.aparte-order__day-hours {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-md);\\n}\\n\\n.aparte-order__stay {\\n display: grid;\\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\\n align-items: center;\\n gap: var(--aparte-space-3);\\n}\\n\\n.aparte-order__stay-side {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n}\\n\\n.aparte-order__stay-time {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n}\\n\\n.aparte-order__stay-span {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n color: var(--aparte-text-muted);\\n --aparte-rich-card-glyph-size: 1.25rem;\\n}\\n\\n.aparte-order__stay-arrow:dir(rtl) { transform: scaleX(-1); }\\n\\n.aparte-order__nights {\\n padding: var(--aparte-space-1) var(--aparte-space-3);\\n border-radius: var(--aparte-radius-full);\\n background: var(--aparte-surface-2);\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-xs);\\n font-weight: var(--aparte-font-weight-medium);\\n white-space: nowrap;\\n}\\n\\n.aparte-order__places {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-2);\\n margin: 0;\\n}\\n\\n.aparte-order__day + .aparte-order__places,\\n.aparte-order__stay + .aparte-order__places {\\n margin-block-start: var(--aparte-space-5);\\n}\\n\\n.aparte-order__place {\\n display: flex;\\n align-items: flex-start;\\n gap: var(--aparte-space-3);\\n}\\n\\n.aparte-order__place-label {\\n display: inline-flex;\\n flex: none;\\n color: var(--aparte-text-muted);\\n --aparte-rich-card-glyph-size: 1.125rem;\\n}\\n\\n.aparte-order__place-value {\\n min-inline-size: 0;\\n margin: 0;\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n line-height: 1.4;\\n overflow-wrap: anywhere;\\n}\\n\\n/* ── compact: one row ────────────────────────────────────────────────── */\\n\\n.aparte-order__row {\\n position: relative;\\n display: grid;\\n grid-template-columns: auto minmax(0, 1fr) auto auto;\\n align-items: center;\\n column-gap: var(--aparte-space-4);\\n padding: var(--aparte-space-4) var(--aparte-space-5);\\n transition: background-color var(--aparte-duration-fast) ease;\\n --aparte-order-kind-size: 2rem;\\n}\\n\\n.aparte-order__row-main {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n}\\n\\n.aparte-order__row .aparte-order__title {\\n overflow: hidden;\\n font-size: var(--aparte-font-size-md);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.aparte-order__row-meta {\\n display: flex;\\n flex-wrap: wrap;\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-sm);\\n}\\n\\n.aparte-order__row-part { white-space: nowrap; }\\n.aparte-order__row-part + .aparte-order__row-part { margin-inline-start: var(--aparte-space-2); }\\n\\n.aparte-order__row .aparte-order__status { margin-inline-start: 0; }\\n\\n.aparte-order__link {\\n color: inherit;\\n text-decoration: none;\\n outline: none;\\n}\\n\\n/* The title's link covers the row: one link, read once. */\\n.aparte-order__link::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n}\\n\\n.aparte-order__row[data-linked]:hover { background: var(--aparte-surface-2); }\\n\\n.aparte-order__row[data-linked]:hover .aparte-order__link {\\n text-decoration: underline;\\n text-decoration-thickness: 1px;\\n text-underline-offset: 0.18em;\\n}\\n\\n/* The row reaches the card's clipped edges: its ring is drawn inside. */\\n.aparte-order__row:has(.aparte-order__link:focus-visible) {\\n outline: var(--aparte-focus-outline-width) solid var(--aparte-border-focus);\\n outline-offset: calc(var(--aparte-focus-outline-width) * -1);\\n}\\n\\n.aparte-order__chevron {\\n color: var(--aparte-text-muted);\\n transition: translate var(--aparte-duration-base) ease;\\n --aparte-rich-card-glyph-size: 1rem;\\n}\\n\\n.aparte-order__chevron:dir(rtl) { transform: scaleX(-1); }\\n.aparte-order__row[data-linked]:hover .aparte-order__chevron { translate: 2px 0; }\\n.aparte-order__row[data-linked]:hover .aparte-order__chevron:dir(rtl) { translate: -2px 0; }\\n\\n/* ── confirmation: the seal, the headline, the tiles ─────────────────── */\\n\\n.aparte-order__confirm {\\n --aparte-order-tone: var(--aparte-success);\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: var(--aparte-space-2);\\n padding: var(--aparte-space-8) var(--aparte-rich-card-padding) var(--aparte-space-6);\\n background: radial-gradient(\\n 120% 70% at 50% 0%,\\n color-mix(in oklab, var(--aparte-order-tone) 13%, transparent) 0%,\\n transparent 70%\\n );\\n text-align: center;\\n}\\n\\n.aparte-order__confirm[data-tone=\\\"info\\\"] { --aparte-order-tone: var(--aparte-info); }\\n.aparte-order__confirm[data-tone=\\\"danger\\\"] { --aparte-order-tone: var(--aparte-error); }\\n.aparte-order__confirm[data-tone=\\\"neutral\\\"] { --aparte-order-tone: var(--aparte-neutral); }\\n\\n.aparte-order__seal {\\n display: inline-flex;\\n inline-size: var(--aparte-order-seal-size);\\n block-size: var(--aparte-order-seal-size);\\n margin-block-end: var(--aparte-space-3);\\n}\\n\\n.aparte-order__seal > svg {\\n inline-size: 100%;\\n block-size: 100%;\\n overflow: visible;\\n}\\n\\n/* Each part rests in its final state; the animations only say where it came from, so\\n with motion turned off (the kit stops every animation) the seal is simply there. */\\n.aparte-order__seal-halo {\\n fill: color-mix(in oklab, var(--aparte-order-tone) 16%, transparent);\\n transform-box: fill-box;\\n transform-origin: center;\\n animation: aparte-order-halo 0.7s cubic-bezier(0.2, 0.8, 0.2, 1) backwards;\\n}\\n\\n.aparte-order__seal-disc {\\n fill: var(--aparte-order-tone);\\n transform-box: fill-box;\\n transform-origin: center;\\n animation: aparte-order-pop 0.45s cubic-bezier(0.2, 0.9, 0.25, 1.3) backwards;\\n}\\n\\n/* The mark in the card's own surface: light on the disc in a light theme, dark in a dark one. */\\n.aparte-order__seal-mark {\\n fill: none;\\n stroke: var(--aparte-surface-1);\\n stroke-width: 4.5;\\n stroke-linecap: round;\\n stroke-linejoin: round;\\n stroke-dasharray: 1;\\n stroke-dashoffset: 0;\\n animation: aparte-order-draw 0.4s 0.25s ease-out backwards;\\n}\\n\\n@keyframes aparte-order-pop {\\n from { opacity: 0; transform: scale(0.4); }\\n}\\n\\n@keyframes aparte-order-halo {\\n from { opacity: 0; transform: scale(0.55); }\\n}\\n\\n@keyframes aparte-order-draw {\\n from { stroke-dashoffset: 1; }\\n}\\n\\n.aparte-order__headline {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-xl);\\n font-weight: var(--aparte-font-weight-semibold);\\n letter-spacing: -0.01em;\\n line-height: 1.25;\\n text-wrap: balance;\\n}\\n\\n.aparte-order__ref {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-md);\\n overflow-wrap: anywhere;\\n}\\n\\n.aparte-order__confirm > .aparte-order__status { margin: var(--aparte-space-1) 0 0; }\\n\\n.aparte-order__keyfacts {\\n display: grid;\\n grid-template-columns: repeat(auto-fit, minmax(8.5rem, 1fr));\\n gap: var(--aparte-space-3);\\n align-self: stretch;\\n margin: var(--aparte-space-5) 0 0;\\n text-align: start;\\n}\\n\\n.aparte-order__keyfact {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n min-inline-size: 0;\\n padding: var(--aparte-space-4);\\n border: var(--aparte-border-width) solid var(--aparte-order-soft-rule);\\n border-radius: var(--aparte-radius-lg);\\n background: var(--aparte-order-tile-bg);\\n}\\n\\n.aparte-order__keyfact-label {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-xs);\\n font-weight: var(--aparte-font-weight-medium);\\n}\\n\\n.aparte-order__keyfact-value {\\n display: flex;\\n flex-direction: column;\\n gap: var(--aparte-space-1);\\n margin: 0;\\n}\\n\\n.aparte-order__keyfact-text {\\n color: var(--aparte-text);\\n font-size: var(--aparte-font-size-md);\\n font-weight: var(--aparte-font-weight-semibold);\\n line-height: 1.3;\\n overflow-wrap: anywhere;\\n}\\n\\n.aparte-order__keyfact--total .aparte-order__keyfact-text {\\n font-size: var(--aparte-font-size-lg);\\n font-weight: var(--aparte-font-weight-bold);\\n letter-spacing: -0.01em;\\n}\\n\\n.aparte-order__keyfact-note {\\n color: var(--aparte-text-muted);\\n font-size: var(--aparte-font-size-xs);\\n}\\n\\n.aparte-order__confirm-actions {\\n display: flex;\\n flex-wrap: wrap;\\n gap: var(--aparte-space-3);\\n align-self: stretch;\\n margin-block-start: var(--aparte-space-5);\\n}\\n\\n.aparte-order__confirm-actions > .aparte-rich-card__action {\\n flex: 1 1 8rem;\\n justify-content: center;\\n}\\n\\n/* ── Loading ─────────────────────────────────────────────────────────── */\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-title { inline-size: 8rem; block-size: 1rem; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-date { inline-size: 6rem; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-meta { inline-size: 9rem; }\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-pill {\\n flex: none;\\n inline-size: 4.5rem;\\n block-size: 1.25rem;\\n border-radius: var(--aparte-radius-full);\\n}\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-thumb {\\n inline-size: var(--aparte-order-thumb-size);\\n block-size: var(--aparte-order-thumb-size);\\n}\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-line--short { inline-size: 55%; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-price { inline-size: 3.5rem; margin: 0; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-label { inline-size: 5rem; }\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-seal {\\n inline-size: var(--aparte-order-seal-size);\\n block-size: var(--aparte-order-seal-size);\\n margin-block-end: var(--aparte-space-3);\\n}\\n\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-headline { inline-size: 11rem; block-size: 1.375rem; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-ref { inline-size: 6rem; margin: 0; }\\n.aparte-order-card[data-state=\\\"loading\\\"] .aparte-skeleton.aparte-order__sk-fact { block-size: 4rem; border-radius: var(--aparte-radius-lg); }\\n\\n.aparte-order__line > .aparte-order__sk-price { grid-column: -2 / -1; justify-self: end; }\\n.aparte-order__line--skeleton + .aparte-order__line--skeleton { border-block-start: 0; }\\n\\n/* ── Small screens, motion ───────────────────────────────────────────── */\\n\\n@media (max-width: 380px) {\\n .aparte-order-card {\\n --aparte-order-thumb-size: 2.5rem;\\n --aparte-order-kind-size: 2rem;\\n --aparte-rich-card-padding: var(--aparte-space-5);\\n }\\n\\n .aparte-order__row { column-gap: var(--aparte-space-3); padding-inline: var(--aparte-space-4); }\\n .aparte-order__keyfacts { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }\\n .aparte-order__leaf { inline-size: 3.125rem; }\\n}\\n\\n/* The kit stops every animation and transition under reduced motion; the chevron's nudge\\n on hover is an end state, not a transition, so it is taken out here. */\\n@media (prefers-reduced-motion: reduce) {\\n .aparte-order__row[data-linked]:hover .aparte-order__chevron,\\n .aparte-order__row[data-linked]:hover .aparte-order__chevron:dir(rtl) { translate: none; }\\n\\n .aparte-order__seal-halo,\\n .aparte-order__seal-disc,\\n .aparte-order__seal-mark { animation: none; }\\n}\\n\"","/**\n * @aparte/plugin-cards/order — an order or a booking, drawn as its receipt.\n *\n * import { setupOrderCard } from '@aparte/plugin-cards/order';\n *\n * setupOrderCard({ tool: 'get_order', variant: 'receipt' });\n *\n * The summary every messaging platform settled on for a purchase or a reservation: what\n * was bought (or booked), what it cost, where it stands, and where it is going. Three\n * variants of one card: `receipt` (the whole record — lines, totals, payment, delivery,\n * address), `compact` (one row, for a list of past orders) and `confirmation` (the moment\n * it is placed — a seal, a headline, the few facts that matter, the next step).\n *\n * Your tool keeps its own fields: `readOrder` already reads the usual spellings — a\n * Shopify or WooCommerce order (`line_items`, `order_number`, `financial_status`,\n * `shipping_address`), a Stripe Checkout session (`amount_total`, `total_details`; its\n * amounts are in cents, so say `minorUnits: true` — the card does not guess) — and `map`\n * covers the rest.\n */\nimport type { AparteConfig } from '@aparte/core';\nimport { defineCard, type CardContext, type CardSetupOptions } from '../kit/define.js';\nimport { el, glyph, num, str, webUrl } from '../kit/dom.js';\nimport { currencyCode, formatNumber, formatPrice, readPriceText, toDate } from '../kit/format.js';\nimport { intlTag, word, type CardWord } from '../kit/strings.js';\nimport { ARROW, BAG, BOX, CALENDAR, CARD, CHEVRON, HOUSE, INFO, PEOPLE, PERSON, PIN, TRUCK, seal, type SealTone } from './icons.js';\nimport orderStyles from './order.css?raw';\n\nexport type OrderVariant = 'receipt' | 'compact' | 'confirmation';\nexport type OrderKind = 'order' | 'booking';\n\n/** Where an order or a booking stands; anything else a tool writes is shown as it wrote it. */\nexport type OrderStatus = 'pending' | 'confirmed' | 'processing' | 'shipped' | 'delivered' | 'cancelled' | 'refunded' | 'failed';\n\n/** A moment a tool gave: an ISO string, an epoch, a `Date`. */\nexport type OrderDateInput = string | number | Date;\n\n/** One line as `map` returns it. Only `title` is needed. */\nexport interface OrderLineInput {\n title: string;\n /** The variant: \"Blue · M\". */\n subtitle?: string;\n /** An `http(s)` URL, or `{ src, alt }`. */\n image?: string | { src: string; alt?: string };\n /** 1 when missing. 0 is kept — a line no longer bought — and left out of the subtotal. */\n quantity?: number;\n /** The unit price: `12`, `\"12.00\"`, `\"12,00 €\"`. */\n price?: number | string;\n /** The line's total, before the order's discount; `quantity × price` when missing. */\n total?: number | string;\n}\n\n/** What `map` returns. Every field adds a part when it is there and nothing when it is not. */\nexport interface OrderInput {\n /** `order` by default. */\n kind?: OrderKind;\n title?: string;\n /**\n * The `confirmation` variant's headline, when the status's own sentence (\"Order being\n * prepared\") is not what happened: \"Return started\", \"Exchange requested\".\n */\n headline?: string;\n /** The order or booking number. */\n reference?: string | number;\n status?: OrderStatus | string;\n /**\n * When it was placed. For a booking with no start of its own, it is the booking's day —\n * with a `time` beside it (`'19:30'`) when the tool gives one apart.\n */\n date?: OrderDateInput;\n items?: OrderLineInput[];\n /** An ISO 4217 code (`EUR`) or a usual symbol (`€`). */\n currency?: string;\n /** Summed from the lines when missing (and every line has a total). */\n subtotal?: number | string;\n /** Shown taken off: `10` reads \"−€10.00\". */\n discount?: number | string;\n /** `0` reads \"Free\". */\n shipping?: number | string;\n tax?: number | string;\n /** Computed when missing: subtotal − discount + shipping + tax. A tool's own total always wins. */\n total?: number | string;\n /** \"Visa •••• 4242\", or `{ brand, last4 }`. */\n payment?: string | { brand?: string; last4?: string };\n /** Several lines; `\\n` keeps them apart. Or `{ name, email }`. */\n customer?: string | Record<string, unknown>;\n /** Several lines, or an address object (`address1`, `city`, `zip`, `country`…). */\n shippingAddress?: string | Record<string, unknown>;\n delivery?: {\n /** A date, a range `{ from, to }`, or words (\"2–4 business days\"). */\n estimate?: OrderDateInput | { from: OrderDateInput; to?: OrderDateInput };\n carrier?: string;\n trackingNumber?: string;\n /** `http(s)` only: the \"Track\" button opens it. */\n trackingUrl?: string;\n };\n /** Rows of your own: `{ label: 'Room', value: 'Deluxe' }`. */\n facts?: Array<{ label: string; value: string | number }>;\n /** For `kind: 'booking'`. */\n booking?: {\n start?: OrderDateInput;\n end?: OrderDateInput;\n location?: string;\n guests?: number;\n };\n /** The order's page; `http(s)` only. */\n url?: string;\n /** Every amount is in the currency's minor unit (Stripe's cents): divided before it is shown. */\n minorUnits?: boolean;\n}\n\n/** A moment, and whether it carries a time — a hotel's \"2026-11-07\" is a day, not midnight. */\nexport interface OrderWhen {\n date: Date;\n allDay: boolean;\n}\n\nexport interface OrderLine {\n title: string;\n subtitle?: string;\n image?: { src: string; alt?: string };\n quantity: number;\n price?: number;\n total?: number;\n}\n\nexport interface OrderFact {\n label: string;\n value: string;\n}\n\n/** The data as the card draws it, once read. */\nexport interface OrderData {\n kind: OrderKind;\n title?: string;\n headline?: string;\n reference?: string;\n status?: { status: OrderStatus } | { text: string };\n date?: Date;\n /** At most fifty; `lineCount` says how many the tool gave. */\n items: OrderLine[];\n lineCount: number;\n /** The quantities added up — \"3 items\" for one line of two and one of one. */\n itemCount: number;\n currency?: string;\n subtotal?: number;\n /** Positive: what was taken off. */\n discount?: number;\n shipping?: number;\n tax?: number;\n total?: number;\n payment?: string;\n customer?: string;\n shippingAddress?: string;\n delivery?: {\n estimate?: { from: OrderWhen; to?: OrderWhen } | { text: string };\n carrier?: string;\n trackingNumber?: string;\n trackingUrl?: string;\n };\n facts: OrderFact[];\n booking?: {\n start?: OrderWhen;\n end?: OrderWhen;\n location?: string;\n guests?: number;\n };\n url?: string;\n}\n\nconst P = {\n cardsOrderOrder: { en: 'Order', fr: 'Commande', de: 'Bestellung', es: 'Pedido', it: 'Ordine', ja: '注文', ko: '주문', pt: 'Pedido', ru: 'Заказ', zh: '订单' },\n cardsOrderBooking: { en: 'Booking', fr: 'Réservation', de: 'Buchung', es: 'Reserva', it: 'Prenotazione', ja: '予約', ko: '예약', pt: 'Reserva', ru: 'Бронирование', zh: '预订' },\n cardsOrderNumbered: { en: 'Order {reference}', fr: 'Commande {reference}', de: 'Bestellung {reference}', es: 'Pedido {reference}', it: 'Ordine {reference}', ja: '注文 {reference}', ko: '주문 {reference}', pt: 'Pedido {reference}', ru: 'Заказ {reference}', zh: '订单 {reference}' },\n cardsOrderBookingNumbered: { en: 'Booking {reference}', fr: 'Réservation {reference}', de: 'Buchung {reference}', es: 'Reserva {reference}', it: 'Prenotazione {reference}', ja: '予約 {reference}', ko: '예약 {reference}', pt: 'Reserva {reference}', ru: 'Бронирование {reference}', zh: '预订 {reference}' },\n\n cardsOrderStatus_pending: { en: 'Pending', fr: 'En attente', de: 'Ausstehend', es: 'Pendiente', it: 'In attesa', ja: '保留中', ko: '대기 중', pt: 'Pendente', ru: 'Ожидает', zh: '待处理' },\n cardsOrderStatus_confirmed: { en: 'Confirmed', fr: 'Confirmée', de: 'Bestätigt', es: 'Confirmado', it: 'Confermato', ja: '確定済み', ko: '확인됨', pt: 'Confirmado', ru: 'Подтверждён', zh: '已确认' },\n cardsOrderStatus_processing: { en: 'Processing', fr: 'En préparation', de: 'In Bearbeitung', es: 'En preparación', it: 'In preparazione', ja: '準備中', ko: '처리 중', pt: 'Em preparação', ru: 'В обработке', zh: '处理中' },\n cardsOrderStatus_shipped: { en: 'Shipped', fr: 'Expédiée', de: 'Versandt', es: 'Enviado', it: 'Spedito', ja: '発送済み', ko: '배송 중', pt: 'Enviado', ru: 'Отправлен', zh: '已发货' },\n cardsOrderStatus_delivered: { en: 'Delivered', fr: 'Livrée', de: 'Zugestellt', es: 'Entregado', it: 'Consegnato', ja: '配達済み', ko: '배송 완료', pt: 'Entregue', ru: 'Доставлен', zh: '已送达' },\n cardsOrderStatus_cancelled: { en: 'Cancelled', fr: 'Annulée', de: 'Storniert', es: 'Cancelado', it: 'Annullato', ja: 'キャンセル済み', ko: '취소됨', pt: 'Cancelado', ru: 'Отменён', zh: '已取消' },\n cardsOrderStatus_refunded: { en: 'Refunded', fr: 'Remboursée', de: 'Erstattet', es: 'Reembolsado', it: 'Rimborsato', ja: '返金済み', ko: '환불됨', pt: 'Reembolsado', ru: 'Деньги возвращены', zh: '已退款' },\n cardsOrderStatus_failed: { en: 'Failed', fr: 'Échouée', de: 'Fehlgeschlagen', es: 'Fallido', it: 'Non riuscito', ja: '失敗', ko: '실패', pt: 'Falhou', ru: 'Не выполнен', zh: '失败' },\n\n // A booking is feminine where an order is masculine (es, it, pt) and neuter in Russian:\n // the words that agree with it are its own.\n cardsOrderBookingStatus_pending: { en: 'Pending', fr: 'En attente', de: 'Ausstehend', es: 'Pendiente', it: 'In attesa', ja: '保留中', ko: '대기 중', pt: 'Pendente', ru: 'Ожидает', zh: '待确认' },\n cardsOrderBookingStatus_confirmed: { en: 'Confirmed', fr: 'Confirmée', de: 'Bestätigt', es: 'Confirmada', it: 'Confermata', ja: '確定済み', ko: '확정됨', pt: 'Confirmada', ru: 'Подтверждено', zh: '已确认' },\n cardsOrderBookingStatus_cancelled: { en: 'Cancelled', fr: 'Annulée', de: 'Storniert', es: 'Cancelada', it: 'Annullata', ja: 'キャンセル済み', ko: '취소됨', pt: 'Cancelada', ru: 'Отменено', zh: '已取消' },\n cardsOrderBookingStatus_refunded: { en: 'Refunded', fr: 'Remboursée', de: 'Erstattet', es: 'Reembolsada', it: 'Rimborsata', ja: '返金済み', ko: '환불됨', pt: 'Reembolsada', ru: 'Деньги возвращены', zh: '已退款' },\n cardsOrderBookingStatus_failed: { en: 'Failed', fr: 'Échouée', de: 'Fehlgeschlagen', es: 'Fallida', it: 'Non riuscita', ja: '失敗', ko: '실패', pt: 'Falhou', ru: 'Не выполнено', zh: '失败' },\n\n cardsOrderHeadline_pending: { en: 'Order placed', fr: 'Commande passée', de: 'Bestellung aufgegeben', es: 'Pedido realizado', it: 'Ordine effettuato', ja: 'ご注文を受け付けました', ko: '주문이 접수되었습니다', pt: 'Pedido realizado', ru: 'Заказ оформлен', zh: '订单已提交' },\n cardsOrderHeadline_confirmed: { en: 'Order confirmed', fr: 'Commande confirmée', de: 'Bestellung bestätigt', es: 'Pedido confirmado', it: 'Ordine confermato', ja: 'ご注文が確定しました', ko: '주문이 확인되었습니다', pt: 'Pedido confirmado', ru: 'Заказ подтверждён', zh: '订单已确认' },\n cardsOrderHeadline_processing: { en: 'Order being prepared', fr: 'Commande en préparation', de: 'Bestellung wird bearbeitet', es: 'Pedido en preparación', it: 'Ordine in preparazione', ja: 'ご注文を準備中です', ko: '주문을 준비 중입니다', pt: 'Pedido em preparação', ru: 'Заказ собирается', zh: '订单处理中' },\n cardsOrderHeadline_shipped: { en: 'Order shipped', fr: 'Commande expédiée', de: 'Bestellung versandt', es: 'Pedido enviado', it: 'Ordine spedito', ja: 'ご注文を発送しました', ko: '주문이 발송되었습니다', pt: 'Pedido enviado', ru: 'Заказ отправлен', zh: '订单已发货' },\n cardsOrderHeadline_delivered: { en: 'Order delivered', fr: 'Commande livrée', de: 'Bestellung zugestellt', es: 'Pedido entregado', it: 'Ordine consegnato', ja: 'ご注文が配達されました', ko: '주문이 배송 완료되었습니다', pt: 'Pedido entregue', ru: 'Заказ доставлен', zh: '订单已送达' },\n cardsOrderHeadline_cancelled: { en: 'Order cancelled', fr: 'Commande annulée', de: 'Bestellung storniert', es: 'Pedido cancelado', it: 'Ordine annullato', ja: 'ご注文はキャンセルされました', ko: '주문이 취소되었습니다', pt: 'Pedido cancelado', ru: 'Заказ отменён', zh: '订单已取消' },\n cardsOrderHeadline_refunded: { en: 'Order refunded', fr: 'Commande remboursée', de: 'Bestellung erstattet', es: 'Pedido reembolsado', it: 'Ordine rimborsato', ja: 'ご注文は返金されました', ko: '주문이 환불되었습니다', pt: 'Pedido reembolsado', ru: 'Деньги за заказ возвращены', zh: '订单已退款' },\n cardsOrderHeadline_failed: { en: 'Order failed', fr: 'Échec de la commande', de: 'Bestellung fehlgeschlagen', es: 'Error en el pedido', it: 'Ordine non riuscito', ja: 'ご注文を完了できませんでした', ko: '주문에 실패했습니다', pt: 'Falha no pedido', ru: 'Не удалось оформить заказ', zh: '订单失败' },\n\n cardsOrderBookingHeadline_pending: { en: 'Booking requested', fr: 'Réservation demandée', de: 'Buchung angefragt', es: 'Reserva solicitada', it: 'Prenotazione richiesta', ja: '予約をリクエストしました', ko: '예약이 요청되었습니다', pt: 'Reserva solicitada', ru: 'Запрос на бронирование отправлен', zh: '预订已提交' },\n cardsOrderBookingHeadline_confirmed: { en: 'Booking confirmed', fr: 'Réservation confirmée', de: 'Buchung bestätigt', es: 'Reserva confirmada', it: 'Prenotazione confermata', ja: '予約が確定しました', ko: '예약이 확정되었습니다', pt: 'Reserva confirmada', ru: 'Бронирование подтверждено', zh: '预订已确认' },\n cardsOrderBookingHeadline_cancelled: { en: 'Booking cancelled', fr: 'Réservation annulée', de: 'Buchung storniert', es: 'Reserva cancelada', it: 'Prenotazione annullata', ja: '予約はキャンセルされました', ko: '예약이 취소되었습니다', pt: 'Reserva cancelada', ru: 'Бронирование отменено', zh: '预订已取消' },\n cardsOrderBookingHeadline_refunded: { en: 'Booking refunded', fr: 'Réservation remboursée', de: 'Buchung erstattet', es: 'Reserva reembolsada', it: 'Prenotazione rimborsata', ja: '予約は返金されました', ko: '예약이 환불되었습니다', pt: 'Reserva reembolsada', ru: 'Деньги за бронирование возвращены', zh: '预订已退款' },\n cardsOrderBookingHeadline_failed: { en: 'Booking failed', fr: 'Échec de la réservation', de: 'Buchung fehlgeschlagen', es: 'Error en la reserva', it: 'Prenotazione non riuscita', ja: '予約を完了できませんでした', ko: '예약에 실패했습니다', pt: 'Falha na reserva', ru: 'Не удалось забронировать', zh: '预订失败' },\n\n cardsOrderPlaced: { en: 'Placed {date}', fr: 'Passée le {date}', de: 'Bestellt am {date}', es: 'Realizado el {date}', it: 'Effettuato il {date}', ja: '注文日 {date}', ko: '주문일 {date}', pt: 'Feito em {date}', ru: 'Оформлен {date}', zh: '下单于 {date}' },\n cardsOrderBooked: { en: 'Booked {date}', fr: 'Réservée le {date}', de: 'Gebucht am {date}', es: 'Reservada el {date}', it: 'Prenotata il {date}', ja: '予約日 {date}', ko: '예약일 {date}', pt: 'Reservada em {date}', ru: 'Забронировано {date}', zh: '预订于 {date}' },\n cardsOrderItem: { en: '{n} item', fr: '{n} article', de: '{n} Artikel', es: '{n} artículo', it: '{n} articolo', ja: '{n}点', ko: '상품 {n}개', pt: '{n} item', ru: '{n} товар', zh: '{n} 件商品' },\n cardsOrderItems: { en: '{n} items', fr: '{n} articles', de: '{n} Artikel', es: '{n} artículos', it: '{n} articoli', ja: '{n}点', ko: '상품 {n}개', pt: '{n} itens', ru: 'Товаров: {n}', zh: '{n} 件商品' },\n cardsOrderLines: { en: 'Items', fr: 'Articles', de: 'Artikel', es: 'Artículos', it: 'Articoli', ja: '商品', ko: '상품', pt: 'Itens', ru: 'Товары', zh: '商品' },\n cardsOrderMore: { en: 'and {n} more', fr: 'et {n} de plus', de: 'und {n} weitere', es: 'y {n} más', it: 'e altri {n}', ja: 'ほか{n}件', ko: '외 {n}개', pt: 'e mais {n}', ru: 'и ещё {n}', zh: '还有 {n} 件' },\n cardsOrderEach: { en: '{price} each', fr: '{price} l’unité', de: 'je {price}', es: '{price} c/u', it: '{price} cad.', ja: '単価 {price}', ko: '개당 {price}', pt: '{price} cada', ru: '{price} за шт.', zh: '单价 {price}' },\n\n cardsOrderSubtotal: { en: 'Subtotal', fr: 'Sous-total', de: 'Zwischensumme', es: 'Subtotal', it: 'Subtotale', ja: '小計', ko: '소계', pt: 'Subtotal', ru: 'Подытог', zh: '小计' },\n cardsOrderDiscount: { en: 'Discount', fr: 'Remise', de: 'Rabatt', es: 'Descuento', it: 'Sconto', ja: '割引', ko: '할인', pt: 'Desconto', ru: 'Скидка', zh: '折扣' },\n cardsOrderShipping: { en: 'Shipping', fr: 'Livraison', de: 'Versand', es: 'Envío', it: 'Spedizione', ja: '送料', ko: '배송비', pt: 'Frete', ru: 'Доставка', zh: '运费' },\n cardsOrderFree: { en: 'Free', fr: 'Gratuite', de: 'Kostenlos', es: 'Gratis', it: 'Gratuita', ja: '無料', ko: '무료', pt: 'Grátis', ru: 'Бесплатно', zh: '免费' },\n cardsOrderTax: { en: 'Tax', fr: 'Taxes', de: 'Steuern', es: 'Impuestos', it: 'Imposte', ja: '税', ko: '세금', pt: 'Impostos', ru: 'Налог', zh: '税费' },\n cardsOrderTotal: { en: 'Total', fr: 'Total', de: 'Gesamt', es: 'Total', it: 'Totale', ja: '合計', ko: '합계', pt: 'Total', ru: 'Итого', zh: '合计' },\n cardsOrderFallbackTotal: { en: 'total {amount}', fr: 'total {amount}', de: 'gesamt {amount}', es: 'total {amount}', it: 'totale {amount}', ja: '合計 {amount}', ko: '합계 {amount}', pt: 'total {amount}', ru: 'итого {amount}', zh: '合计 {amount}' },\n\n cardsOrderPayment: { en: 'Payment', fr: 'Paiement', de: 'Zahlung', es: 'Pago', it: 'Pagamento', ja: 'お支払い', ko: '결제', pt: 'Pagamento', ru: 'Оплата', zh: '付款方式' },\n cardsOrderDelivery: { en: 'Estimated delivery', fr: 'Livraison prévue', de: 'Voraussichtliche Lieferung', es: 'Entrega estimada', it: 'Consegna prevista', ja: 'お届け予定', ko: '도착 예정', pt: 'Entrega prevista', ru: 'Ожидаемая доставка', zh: '预计送达' },\n cardsOrderTrack: { en: 'Track', fr: 'Suivre', de: 'Verfolgen', es: 'Seguir', it: 'Traccia', ja: '追跡', ko: '배송 조회', pt: 'Rastrear', ru: 'Отследить', zh: '查看物流' },\n cardsOrderAddress: { en: 'Delivery address', fr: 'Adresse de livraison', de: 'Lieferadresse', es: 'Dirección de entrega', it: 'Indirizzo di consegna', ja: 'お届け先', ko: '배송지', pt: 'Endereço de entrega', ru: 'Адрес доставки', zh: '收货地址' },\n cardsOrderCustomer: { en: 'Customer', fr: 'Client', de: 'Kunde', es: 'Cliente', it: 'Cliente', ja: 'お客様', ko: '고객', pt: 'Cliente', ru: 'Покупатель', zh: '客户' },\n cardsOrderView: { en: 'View order', fr: 'Voir la commande', de: 'Bestellung ansehen', es: 'Ver pedido', it: 'Vedi ordine', ja: '注文を見る', ko: '주문 보기', pt: 'Ver pedido', ru: 'Открыть заказ', zh: '查看订单' },\n cardsOrderViewBooking: { en: 'View booking', fr: 'Voir la réservation', de: 'Buchung ansehen', es: 'Ver reserva', it: 'Vedi prenotazione', ja: '予約を見る', ko: '예약 보기', pt: 'Ver reserva', ru: 'Открыть бронирование', zh: '查看预订' },\n\n cardsOrderWhen: { en: 'When', fr: 'Quand', de: 'Wann', es: 'Cuándo', it: 'Quando', ja: '日時', ko: '일시', pt: 'Quando', ru: 'Когда', zh: '时间' },\n cardsOrderWhere: { en: 'Where', fr: 'Où', de: 'Wo', es: 'Dónde', it: 'Dove', ja: '場所', ko: '장소', pt: 'Onde', ru: 'Где', zh: '地点' },\n cardsOrderGuestsLabel: { en: 'Guests', fr: 'Personnes', de: 'Gäste', es: 'Personas', it: 'Ospiti', ja: '人数', ko: '인원', pt: 'Pessoas', ru: 'Гости', zh: '人数' },\n cardsOrderStart: { en: 'Start', fr: 'Début', de: 'Beginn', es: 'Inicio', it: 'Inizio', ja: '開始', ko: '시작', pt: 'Início', ru: 'Начало', zh: '开始' },\n cardsOrderEnd: { en: 'End', fr: 'Fin', de: 'Ende', es: 'Fin', it: 'Fine', ja: '終了', ko: '종료', pt: 'Fim', ru: 'Конец', zh: '结束' },\n cardsOrderNight: { en: '{n} night', fr: '{n} nuit', de: '{n} Nacht', es: '{n} noche', it: '{n} notte', ja: '{n}泊', ko: '{n}박', pt: '{n} noite', ru: '{n} ночь', zh: '{n} 晚' },\n cardsOrderNights: { en: '{n} nights', fr: '{n} nuits', de: '{n} Nächte', es: '{n} noches', it: '{n} notti', ja: '{n}泊', ko: '{n}박', pt: '{n} noites', ru: 'Ночей: {n}', zh: '{n} 晚' },\n cardsOrderGuest: { en: '{n} guest', fr: '{n} personne', de: '{n} Gast', es: '{n} persona', it: '{n} ospite', ja: '{n}名', ko: '{n}명', pt: '{n} pessoa', ru: '{n} гость', zh: '{n} 位' },\n cardsOrderGuests: { en: '{n} guests', fr: '{n} personnes', de: '{n} Gäste', es: '{n} personas', it: '{n} ospiti', ja: '{n}名', ko: '{n}명', pt: '{n} pessoas', ru: 'Гостей: {n}', zh: '{n} 位' },\n} satisfies Record<string, CardWord>;\n\ntype WordKey = keyof typeof P;\n\n/** What a status means as a badge's intent. Every pill also carries its word. */\nconst INTENT: Record<OrderStatus, string> = {\n pending: 'warning',\n confirmed: 'success',\n processing: 'info',\n shipped: 'info',\n delivered: 'success',\n cancelled: 'neutral',\n refunded: 'neutral',\n failed: 'danger',\n};\n\n/** The confirmation's seal: a check for what went through, a clock for what waits, a cross for what did not. */\nconst TONE: Record<OrderStatus, SealTone> = {\n pending: 'info',\n confirmed: 'success',\n processing: 'info',\n shipped: 'success',\n delivered: 'success',\n cancelled: 'danger',\n refunded: 'neutral',\n failed: 'danger',\n};\n\n/** A booking is not shipped: what is under way reads as requested, what arrived as confirmed. */\nconst BOOKING_HEADLINE: Partial<Record<OrderStatus, OrderStatus>> = { processing: 'pending', shipped: 'confirmed', delivered: 'confirmed' };\n\n/** Fifty: past that a receipt is an export. Six show; the rest are one click away. */\nconst LINES_KEPT = 50;\nconst LINES_SHOWN = 6;\nconst FACTS_KEPT = 12;\n/** The confirmation keeps to what matters at that moment: the tool's first two facts. */\nconst FACTS_IN_CONFIRMATION = 2;\n\n// ── Reading ──────────────────────────────────────────────────────────────────\n\ntype Raw = Record<string, unknown>;\n\nconst isObject = (value: unknown): value is Raw => !!value && typeof value === 'object' && !Array.isArray(value);\nconst notNull = <T>(value: T | null | undefined | false): value is T => value !== null && value !== undefined && value !== false;\n\n/** The first of `keys` that `r` has a value for. */\nfunction pick(r: unknown, keys: readonly string[]): unknown {\n if (!isObject(r)) return undefined;\n for (const key of keys) if (r[key] !== undefined && r[key] !== null && r[key] !== '') return r[key];\n return undefined;\n}\n\n/** Letters only, lower case: `on-hold`, `On Hold` and `ON_HOLD` are one key. */\nconst squeeze = (value: unknown) => (typeof value === 'string' ? value.toLowerCase().replace(/[^a-z]/g, '') : '');\n\n/** A Stripe object id (`cus_…`, `pm_…`) is a key into Stripe, not words to show. */\nconst isStripeId = (value: string) => /^(?:cus|pm|card|src|pi|ch|cs|in)_[A-Za-z0-9]{6,}$/.test(value);\n\n/** An amount and the currency it was written in, from a number, a shop's text or `{ amount, currency }`. */\nfunction moneyOf(value: unknown, divisor: number): { amount?: number; currency?: string } {\n if (typeof value === 'number') return Number.isFinite(value) ? { amount: value / divisor } : {};\n if (typeof value === 'string') {\n const { amount, currency } = readPriceText(value);\n return { ...(amount !== undefined ? { amount: amount / divisor } : {}), ...(currency ? { currency } : {}) };\n }\n if (isObject(value)) {\n // `{ amount, currency }`, Stripe's `{ unit_amount }`, Shopify's `{ shop_money: { amount } }`.\n const inner = moneyOf(pick(value, ['amount', 'value', 'unit_amount', 'cents', 'shop_money', 'shopMoney', 'price']), divisor);\n const currency = currencyCode(pick(value, ['currency', 'currency_code', 'currencyCode'])) ?? inner.currency;\n return { ...(inner.amount !== undefined ? { amount: inner.amount } : {}), ...(currency ? { currency } : {}) };\n }\n return {};\n}\n\n/** How much one unit of the currency is in its minor unit: 100 for the euro, 1 for the yen. */\nfunction minorDivisor(currency: string | undefined): number {\n if (!currency) return 100;\n try {\n const digits = new Intl.NumberFormat('en', { style: 'currency', currency }).resolvedOptions().maximumFractionDigits ?? 2;\n return 10 ** digits;\n } catch {\n return 100;\n }\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst DATE_TIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{1,2}:\\d{2}/;\n\n/**\n * A moment from what a tool wrote — or `undefined`. Strict on purpose: `new Date('Nov 7')`\n * reads 2001 in V8, so a string is a date only when it is ISO. A bare day (`2026-11-07`)\n * is that day in the reader's calendar, not midnight in London, and carries no time.\n */\nexport function readWhen(value: unknown): OrderWhen | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n const day = DATE_ONLY.exec(v);\n if (day) {\n const date = new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]));\n // `2026-13-45` would roll over into 2027: a day that does not exist is no day.\n return date.getMonth() === Number(day[2]) - 1 && date.getDate() === Number(day[3]) ? { date, allDay: true } : undefined;\n }\n if (!DATE_TIME.test(v)) return undefined;\n const date = toDate(v.replace(' ', 'T'));\n return date ? { date, allDay: false } : undefined;\n }\n if (typeof value === 'number' || value instanceof Date) {\n const date = toDate(value);\n if (!date) return undefined;\n // A `Date` at midnight sharp is a day someone picked, not a dinner at 00:00.\n return { date, allDay: date.getHours() === 0 && date.getMinutes() === 0 && date.getSeconds() === 0 };\n }\n return undefined;\n}\n\n/** `2026-11-07T00:00:00Z`, `…T00:00:00.000+00:00`: midnight in London, to the second. */\nconst MIDNIGHT_UTC = /^(\\d{4}-\\d{2}-\\d{2})T00:00(?::00(?:\\.0+)?)?(?:Z|[+-]00:?00)$/i;\n\n/**\n * A day a booking or a delivery falls on. A server that keeps days as timestamps writes\n * `2026-11-07` as midnight UTC, which is the evening of the 6th anywhere west of London: a\n * stamp at exactly midnight UTC is that day, read as a day. Any other moment is as `readWhen` reads it.\n */\nfunction readDay(value: unknown): OrderWhen | undefined {\n const day = typeof value === 'string' ? MIDNIGHT_UTC.exec(value.trim()) : null;\n return readWhen(day ? day[1] : value);\n}\n\n/** `19:30`, `7:30 PM`, `07:30:00` — a time of day with no date. */\nconst TIME_OF_DAY = /^(\\d{1,2}):(\\d{2})(?::\\d{2})?\\s*(?:([ap])\\.?\\s?m\\.?)?$/i;\n\n/** A day and a time a tool gave apart (`date: '2026-11-07', time: '19:30'`), as one moment. */\nfunction dayAndTime(r: Raw): OrderWhen | undefined {\n const day = readDay(r['date']);\n const time = typeof r['time'] === 'string' ? TIME_OF_DAY.exec(r['time'].trim()) : null;\n if (!day || !time || !day.allDay) return day;\n let hours = Number(time[1]);\n const minutes = Number(time[2]);\n const half = time[3]?.toLowerCase();\n if (half) hours = (hours % 12) + (half === 'p' ? 12 : 0);\n if (hours > 23 || minutes > 59) return day;\n const date = new Date(day.date);\n date.setHours(hours, minutes, 0, 0);\n return { date, allDay: false };\n}\n\n/** schema.org's, Shopify's, WooCommerce's and Stripe's words for a state, squeezed to letters. */\nconst STATUS_WORDS: Record<string, OrderStatus> = {\n pending: 'pending', onhold: 'pending', awaitingpayment: 'pending', unpaid: 'pending', open: 'pending',\n requested: 'pending', tentative: 'pending', placed: 'pending', orderpaymentdue: 'pending',\n confirmed: 'confirmed', paid: 'confirmed', booked: 'confirmed', reserved: 'confirmed', accepted: 'confirmed',\n // WooCommerce's `completed` is \"fulfilled and complete\": paid and done on the shop's side —\n // a download, a service, a parcel handed over or not. `delivered` would claim the parcel\n // arrived and `shipped` that there was one; `confirmed` claims neither, like Stripe's `complete`.\n complete: 'confirmed', completed: 'confirmed', succeeded: 'confirmed', approved: 'confirmed',\n processing: 'processing', preparing: 'processing', inprogress: 'processing', packed: 'processing', orderprocessing: 'processing',\n shipped: 'shipped', fulfilled: 'shipped', intransit: 'shipped', dispatched: 'shipped', outfordelivery: 'shipped', orderintransit: 'shipped',\n delivered: 'delivered', orderdelivered: 'delivered',\n cancelled: 'cancelled', canceled: 'cancelled', voided: 'cancelled', void: 'cancelled', expired: 'cancelled', ordercancelled: 'cancelled',\n refunded: 'refunded', orderreturned: 'refunded',\n failed: 'failed', declined: 'failed', paymentfailed: 'failed', rejected: 'failed', orderproblem: 'failed',\n};\n\n/**\n * Where it stands. The tool's own status first, as a known state or as its words; else what\n * a shop's two half-statuses say when they say it plainly — Shopify's `cancelled_at`, a\n * refund, a fulfilled order (shipped), a paid one (confirmed). A partial refund or a partial\n * fulfilment says nothing a pill could, so it draws none.\n */\nfunction readStatus(r: Raw): OrderData['status'] {\n const own = pick(r, ['status', 'state', 'order_status', 'orderStatus', 'booking_status', 'bookingStatus']);\n if (typeof own === 'string' && own.trim()) {\n const key = squeeze(own.replace(/^https?:\\/\\/schema\\.org\\//, ''));\n const status = STATUS_WORDS[key];\n return status ? { status } : { text: own.trim() };\n }\n if (pick(r, ['cancelled_at', 'canceled_at', 'cancelledAt', 'canceledAt'])) return { status: 'cancelled' };\n const paid = squeeze(pick(r, ['financial_status', 'financialStatus', 'displayFinancialStatus']));\n const sent = squeeze(pick(r, ['fulfillment_status', 'fulfillmentStatus', 'displayFulfillmentStatus']));\n const stripe = squeeze(pick(r, ['payment_status', 'paymentStatus']));\n if (paid === 'refunded') return { status: 'refunded' };\n if (paid === 'voided') return { status: 'cancelled' };\n if (sent === 'delivered') return { status: 'delivered' };\n if (sent === 'fulfilled') return { status: 'shipped' };\n if (paid === 'paid' || stripe === 'paid') return { status: 'confirmed' };\n if (paid === 'pending' || stripe === 'unpaid') return { status: 'pending' };\n return undefined;\n}\n\n/** A list from an array, a Stripe list (`{ data }`) or a GraphQL connection (`{ nodes }`, `{ edges }`). */\nfunction listOf(value: unknown): unknown[] | undefined {\n if (Array.isArray(value)) return value;\n if (!isObject(value)) return undefined;\n if (Array.isArray(value['data'])) return value['data'];\n if (Array.isArray(value['nodes'])) return value['nodes'];\n if (Array.isArray(value['edges'])) return value['edges'].map((e) => (isObject(e) ? e['node'] : undefined));\n return undefined;\n}\n\nfunction readImage(value: unknown): OrderLine['image'] {\n if (Array.isArray(value)) return value.length ? readImage(value[0]) : undefined;\n if (isObject(value)) {\n const src = webUrl(pick(value, ['src', 'url', 'href', 'thumbnail']));\n const alt = str(pick(value, ['alt', 'altText', 'alt_text']));\n return src ? { src, ...(alt ? { alt } : {}) } : undefined;\n }\n const src = webUrl(value);\n return src ? { src } : undefined;\n}\n\nfunction readSubtitle(r: Raw): string | undefined {\n const value = pick(r, ['subtitle', 'variant_title', 'variantTitle', 'variant', 'variation', 'options']);\n if (Array.isArray(value)) {\n const parts = value.map((v) => (isObject(v) ? str(pick(v, ['value', 'name', 'title'])) : str(v))).filter(notNull);\n return parts.length ? parts.join(' · ') : undefined;\n }\n return isObject(value) ? str(pick(value, ['title', 'name'])) : str(value);\n}\n\nfunction readLine(raw: unknown, read: (value: unknown) => number | undefined): OrderLine | null {\n if (typeof raw === 'string') return raw.trim() ? { title: raw.trim(), quantity: 1 } : null;\n if (!isObject(raw)) return null;\n const title = str(pick(raw, ['title', 'name', 'description', 'product_name', 'productName', 'label']));\n if (!title) return null;\n const qty = num(pick(raw, ['quantity', 'qty', 'count']));\n // 0 is a line the order no longer buys (removed, refunded, out of stock): shown as ×0, never as one.\n const quantity = qty !== undefined && qty >= 0 ? qty : 1;\n const price = read(pick(raw, ['unit_price', 'unitPrice', 'price', 'amount', 'unit_amount']));\n // The line before the order's discount when the tool gives it (WooCommerce's `subtotal`,\n // Stripe's `amount_subtotal`): its `total` is after the coupon, and the receipt's discount\n // row would then take the coupon off a second time.\n const given = read(pick(raw, ['subtotal', 'amount_subtotal', 'line_subtotal']))\n ?? read(pick(raw, ['total', 'total_price', 'totalPrice', 'amount_total', 'line_total', 'lineTotal']));\n const total = given ?? (price !== undefined ? price * quantity : undefined);\n const subtitle = readSubtitle(raw);\n const image = readImage(pick(raw, ['image', 'image_url', 'imageUrl', 'thumbnail', 'images', 'photo', 'picture']));\n return {\n title,\n ...(subtitle ? { subtitle } : {}),\n ...(image ? { image } : {}),\n quantity,\n ...(price !== undefined ? { price } : {}),\n ...(total !== undefined ? { total } : {}),\n };\n}\n\n/** \"Visa •••• 4242\" from `{ brand, last4 }` (or Stripe's `{ card: { … } }`), or the tool's own words. */\nfunction readPayment(value: unknown): string | undefined {\n if (Array.isArray(value)) {\n const parts = value.map(readPayment).filter(notNull);\n return parts.length ? parts.join(', ') : undefined;\n }\n if (isObject(value)) {\n const card = isObject(value['card']) ? value['card'] : value;\n const brand = str(pick(card, ['brand', 'network', 'type']));\n const last4 = str(pick(card, ['last4', 'last_4', 'lastFour', 'last_digits']));\n if (last4) return `${brand ? brand.charAt(0).toUpperCase() + brand.slice(1) : ''} •••• ${last4}`.trim();\n return str(pick(value, ['label', 'title', 'description', 'name'])) ?? brand;\n }\n const text = str(value);\n return text && !isStripeId(text) ? text : undefined;\n}\n\n/** A person's name from `name`, or first and last. */\nfunction nameOf(r: Raw): string | undefined {\n const name = str(pick(r, ['name', 'full_name', 'fullName']));\n if (name) return name;\n const parts = [pick(r, ['first_name', 'firstName', 'given_name']), pick(r, ['last_name', 'lastName', 'family_name'])].map(str).filter(notNull);\n return parts.length ? parts.join(' ') : undefined;\n}\n\nconst ADDRESS_KEYS = ['address1', 'address_1', 'line1', 'street', 'street1', 'city', 'postal_code', 'postcode', 'zip'];\n\n/** Countries that write \"City, ST 12345\" rather than \"12345 City\". */\nconst CITY_FIRST = new Set(['us', 'usa', 'unitedstates', 'ca', 'canada', 'au', 'australia', 'gb', 'uk', 'unitedkingdom']);\n\n/** An address as lines: a string as written, or an object's parts in the usual order. */\nfunction readAddress(value: unknown): string | undefined {\n if (typeof value === 'string') return value.trim() ? value.trim().replace(/\\s*\\n\\s*/g, '\\n') : undefined;\n if (!isObject(value)) return undefined;\n // Stripe nests the address under the name: `{ name, address: { line1, … } }`.\n const inner = isObject(value['address']) ? value['address'] : value;\n const s = (keys: string[]) => str(pick(inner, keys));\n const city = s(['city', 'locality', 'town']);\n const postal = s(['zip', 'postal_code', 'postalCode', 'postcode']);\n const region = s(['province_code', 'state', 'province', 'region']);\n const country = s(['country', 'country_code', 'countryCode']);\n const cityFirst = CITY_FIRST.has(squeeze(country));\n const locality = cityFirst\n ? [[city, region].filter(notNull).join(', '), postal].filter((p) => p).join(' ')\n : [postal, city].filter(notNull).join(' ');\n const lines = [\n nameOf(value) ?? nameOf(inner),\n s(['company']),\n s(['address1', 'address_1', 'line1', 'street', 'street1']),\n s(['address2', 'address_2', 'line2', 'street2']),\n locality || undefined,\n country,\n ].filter(notNull);\n return lines.length ? lines.join('\\n') : undefined;\n}\n\n/** The customer as a name and a way to reach them — never their whole billing address. */\nfunction readCustomer(value: unknown): string | undefined {\n if (typeof value === 'string') return value.trim() && !isStripeId(value.trim()) ? value.trim() : undefined;\n if (!isObject(value)) return undefined;\n const lines = [nameOf(value), str(pick(value, ['email'])), str(pick(value, ['phone']))].filter(notNull);\n return lines.length ? lines.join('\\n') : undefined;\n}\n\nfunction readFacts(value: unknown): OrderFact[] {\n const out: OrderFact[] = [];\n if (Array.isArray(value)) {\n for (const item of value) {\n const label = str(pick(item, ['label', 'name', 'key', 'title']));\n const fact = str(pick(item, ['value', 'text']));\n if (label && fact) out.push({ label, value: fact });\n }\n } else if (isObject(value)) {\n for (const [label, raw] of Object.entries(value)) {\n const fact = str(raw);\n if (label.trim() && fact) out.push({ label: label.trim(), value: fact });\n }\n }\n return out.slice(0, FACTS_KEPT);\n}\n\nfunction readEstimate(value: unknown): NonNullable<OrderData['delivery']>['estimate'] {\n if (Array.isArray(value)) value = { from: value[0], to: value[1] };\n // A Date is an object too: it is one day, not a range with no ends.\n if (isObject(value) && !(value instanceof Date)) {\n const from = readDay(pick(value, ['from', 'start', 'earliest', 'min']));\n const to = readDay(pick(value, ['to', 'end', 'latest', 'max']));\n if (from) return to && to.date > from.date ? { from, to } : { from };\n return to ? { from: to } : undefined;\n }\n const when = readDay(value);\n if (when) return { from: when };\n const text = str(value);\n return text ? { text } : undefined;\n}\n\nfunction readDelivery(r: Raw): OrderData['delivery'] {\n const fulfillments = listOf(r['fulfillments']);\n const nested = [r['delivery'], r['shipment'], r['fulfillment'], fulfillments?.[0], r['tracking']].find(isObject);\n const first = (value: unknown) => (Array.isArray(value) ? value[0] : value);\n const estimate = readEstimate(\n pick(nested, ['estimate', 'estimatedDelivery', 'estimated_delivery', 'eta', 'expected', 'expectedDate', 'expected_date', 'date'])\n ?? pick(r, ['estimatedDelivery', 'estimated_delivery', 'deliveryEstimate', 'delivery_estimate', 'deliveryDate', 'delivery_date', 'eta'])\n ?? (typeof r['delivery'] === 'string' ? r['delivery'] : undefined),\n );\n const carrier = str(pick(nested, ['carrier', 'company', 'tracking_company', 'trackingCompany', 'service'])\n ?? pick(r, ['carrier', 'tracking_company', 'trackingCompany', 'shippingCarrier', 'shipping_carrier']));\n const trackingNumber = str(first(pick(nested, ['trackingNumber', 'tracking_number', 'tracking_numbers', 'number'])\n ?? pick(r, ['trackingNumber', 'tracking_number'])));\n const trackingUrl = webUrl(first(pick(nested, ['trackingUrl', 'tracking_url', 'tracking_urls', 'trackingLink', 'tracking_link', 'url'])\n ?? pick(r, ['trackingUrl', 'tracking_url', 'trackingLink', 'tracking_link'])));\n if (!estimate && !carrier && !trackingNumber && !trackingUrl) return undefined;\n return {\n ...(estimate ? { estimate } : {}),\n ...(carrier ? { carrier } : {}),\n ...(trackingNumber ? { trackingNumber } : {}),\n ...(trackingUrl ? { trackingUrl } : {}),\n };\n}\n\nconst START_KEYS = ['start', 'startTime', 'start_time', 'startDate', 'start_date', 'checkIn', 'check_in', 'checkin', 'from', 'datetime', 'dateTime', 'time'];\nconst END_KEYS = ['end', 'endTime', 'end_time', 'endDate', 'end_date', 'checkOut', 'check_out', 'checkout', 'to', 'until'];\n\n/**\n * The booking, and whether its start was the order's own `date` — which then is not also the\n * day it was placed: `{ kind: 'booking', date: '2026-11-07', time: '19:30' }` is a dinner on\n * the 7th, not a booking made that day with no when.\n */\nfunction readBooking(r: Raw): { booking: OrderData['booking']; tookDate: boolean } {\n const b = [r['booking'], r['reservation']].find(isObject) ?? r;\n const own = readDay(pick(b, START_KEYS));\n const fromDate = own ? undefined : dayAndTime(b);\n const start = own ?? fromDate;\n const tookDate = fromDate !== undefined && b === r;\n const endRead = readDay(pick(b, END_KEYS));\n // An end before its start is a typo; the start alone is still true.\n const end = endRead && (!start || endRead.date >= start.date) ? endRead : undefined;\n const place = pick(b, ['location', 'venue', 'place', 'address', 'where']);\n const location = isObject(place)\n ? [str(pick(place, ['name', 'title'])), str(pick(place, ['address', 'formatted_address']))].filter(notNull).join(', ') || undefined\n : str(place);\n const people = pick(b, ['guests', 'partySize', 'party_size', 'people', 'persons', 'covers', 'attendees']);\n const count = Array.isArray(people) ? people.length : num(people);\n const guests = count !== undefined && count > 0 ? Math.floor(count) : undefined;\n if (!start && !location && guests === undefined) return { booking: undefined, tookDate };\n return {\n booking: {\n ...(start ? { start } : {}),\n ...(end ? { end } : {}),\n ...(location ? { location } : {}),\n ...(guests !== undefined ? { guests } : {}),\n },\n tookDate,\n };\n}\n\nfunction readKind(r: Raw): OrderKind {\n const said = squeeze(pick(r, ['kind', 'type', 'object']));\n if (['booking', 'reservation', 'appointment', 'lodgingreservation', 'foodestablishmentreservation', 'eventreservation'].includes(said)) return 'booking';\n if (['order', 'purchase', 'checkoutsession'].includes(said)) return 'order';\n if (isObject(r['booking']) || isObject(r['reservation'])) return 'booking';\n return pick(r, ['checkIn', 'check_in', 'startTime', 'start_time', 'startDate', 'start_date']) !== undefined ? 'booking' : 'order';\n}\n\n/**\n * The card's data from the loose shape `map` returns, or `null` when it has nothing to\n * draw — no line, no number, no total, no booking date, no title.\n */\nexport function readOrder(raw: unknown): OrderData | null {\n if (!isObject(raw)) return null;\n const r = raw;\n const kind = readKind(r);\n const minor = r['minorUnits'] === true || r['minor_units'] === true;\n\n let currency = currencyCode(pick(r, ['currency', 'currency_code', 'currencyCode', 'presentment_currency']));\n const divisor = minor ? minorDivisor(currency) : 1;\n // A currency written only in an amount (`\"€12.00\"`) is still the order's.\n const read = (value: unknown) => {\n const money = moneyOf(value, divisor);\n currency ??= money.currency;\n return money.amount;\n };\n /** The first of `keys` that holds an amount — WooCommerce's `shipping` is an address, its cost is `shipping_total`. */\n const amount = (from: unknown, keys: readonly string[]) => {\n if (!isObject(from)) return undefined;\n for (const key of keys) {\n const value = from[key] === undefined || from[key] === null ? undefined : read(from[key]);\n if (value !== undefined) return value;\n }\n return undefined;\n };\n\n const all = (['items', 'line_items', 'lineItems', 'products', 'lines'].map((key) => listOf(r[key])).find(notNull) ?? [])\n .map((line) => readLine(line, read))\n .filter(notNull);\n const items = all.slice(0, LINES_KEPT);\n\n const details = isObject(r['total_details']) ? r['total_details'] : undefined;\n const shippingLines = listOf(r['shipping_lines']);\n let subtotal = amount(r, ['subtotal', 'sub_total', 'subtotal_price', 'subtotalPrice', 'amount_subtotal', 'items_total', 'itemsTotal']);\n const discountRaw = amount(r, ['discount', 'total_discount', 'total_discounts', 'totalDiscounts', 'discount_total', 'discountTotal']) ?? amount(details, ['amount_discount']);\n let shipping = amount(r, ['shipping', 'shipping_total', 'shippingTotal', 'shipping_cost', 'shippingCost', 'shipping_price', 'shippingPrice', 'total_shipping', 'delivery_fee', 'deliveryFee'])\n ?? amount(details, ['amount_shipping']) ?? amount(r['shipping_cost'], ['amount_total']);\n if (shipping === undefined && shippingLines?.length) {\n const costs = shippingLines.map((l) => amount(l, ['price', 'amount'])).filter(notNull);\n if (costs.length) shipping = costs.reduce((a, b) => a + b, 0);\n }\n const tax = amount(r, ['tax', 'taxes', 'total_tax', 'totalTax', 'tax_total', 'taxTotal', 'vat']) ?? amount(details, ['amount_tax']);\n let total = amount(r, ['total', 'total_price', 'totalPrice', 'amount_total', 'amountTotal', 'grand_total', 'grandTotal', 'amount']);\n\n // Sums only from lines that all have one: a subtotal over half the lines would be a lie.\n // A line of quantity 0 is bought by no one, whatever total the tool left on it.\n const bought = all.filter((l) => l.quantity !== 0);\n if (subtotal === undefined && bought.length && bought.every((l) => l.total !== undefined)) {\n subtotal = bought.reduce((sum, l) => sum + l.total!, 0);\n }\n const discount = discountRaw !== undefined ? Math.abs(discountRaw) : undefined;\n if (total === undefined && subtotal !== undefined) total = subtotal - (discount ?? 0) + (shipping ?? 0) + (tax ?? 0);\n\n const reference = str(pick(r, [\n 'reference', 'order_number', 'orderNumber', 'number', 'confirmation_number', 'confirmationNumber', 'confirmation_code',\n 'confirmationCode', 'booking_reference', 'bookingReference', 'booking_id', 'bookingId', 'order_id', 'orderId', 'id',\n ]))?.replace(/^#\\s*/, '') || undefined;\n const title = str(pick(r, ['title', 'heading']));\n const ownHeadline = str(r['headline']);\n const status = readStatus(r);\n const { booking, tookDate } = kind === 'booking' ? readBooking(r) : { booking: undefined, tookDate: false };\n const placedKeys = ['date', 'created_at', 'createdAt', 'placed_at', 'placedAt', 'order_date', 'orderDate', 'date_created', 'dateCreated', 'processed_at', 'created'];\n const date = readWhen(pick(r, tookDate ? placedKeys.slice(1) : placedKeys))?.date;\n const delivery = readDelivery(r);\n const payment = readPayment(pick(r, ['payment', 'paymentMethod', 'payment_method', 'payment_method_title', 'paymentMethodTitle', 'payment_method_details', 'card', 'payment_gateway_names']));\n const customer = readCustomer(pick(r, ['customer_details', 'customerDetails', 'customer', 'customer_name', 'customerName', 'buyer', 'contact']));\n const shippingAddress = kind === 'order'\n ? readAddress(pick(r, ['shippingAddress', 'shipping_address', 'shipping_details', 'shippingDetails', 'deliveryAddress', 'delivery_address', 'address'])\n ?? (isObject(r['shipping']) && ADDRESS_KEYS.some((k) => k in (r['shipping'] as Raw)) ? r['shipping'] : undefined))\n : undefined;\n const url = webUrl(pick(r, ['url', 'orderUrl', 'order_url', 'order_status_url', 'orderStatusUrl', 'statusUrl', 'status_url', 'receipt_url', 'receiptUrl', 'manageUrl', 'manage_url', 'link', 'href']));\n\n if (!items.length && !reference && total === undefined && !booking && !title) return null;\n\n const whole = all.every((l) => Number.isInteger(l.quantity));\n return {\n kind,\n ...(title ? { title } : {}),\n ...(ownHeadline ? { headline: ownHeadline } : {}),\n ...(reference ? { reference } : {}),\n ...(status ? { status } : {}),\n ...(date ? { date } : {}),\n items,\n lineCount: all.length,\n itemCount: whole ? all.reduce((n, l) => n + l.quantity, 0) : all.length,\n ...(currency ? { currency } : {}),\n ...(subtotal !== undefined ? { subtotal } : {}),\n ...(discount !== undefined ? { discount } : {}),\n ...(shipping !== undefined ? { shipping } : {}),\n ...(tax !== undefined ? { tax } : {}),\n ...(total !== undefined ? { total } : {}),\n ...(payment ? { payment } : {}),\n ...(customer ? { customer } : {}),\n ...(shippingAddress ? { shippingAddress } : {}),\n ...(delivery ? { delivery } : {}),\n facts: readFacts(pick(r, ['facts', 'details', 'extra', 'extras', 'note_attributes'])),\n ...(booking ? { booking } : {}),\n ...(url ? { url } : {}),\n };\n}\n\n// ── Words and numbers ────────────────────────────────────────────────────────\n\nconst say = (config: AparteConfig, key: WordKey, vars?: Record<string, string>) => word(config, key, P[key], vars);\nconst money = (config: AparteConfig, data: Pick<OrderData, 'currency'>, amount: number) => formatPrice(config, amount, data.currency);\n\n/** \"1 item\" or \"3 items\", as the language counts. */\nfunction counted(config: AparteConfig, one: WordKey, other: WordKey, n: number): string {\n const rule = new Intl.PluralRules(intlTag(config)).select(n);\n return say(config, rule === 'one' ? one : other, { n: formatNumber(config, n) });\n}\n\n/** A number written alone reads better with its sign: \"Order #1042\", but \"Booking K7F2Q\". */\nconst shownReference = (reference: string) => (/^\\d+$/.test(reference) ? `#${reference}` : reference);\n\n/** The card's name, as its header shows it. `hash` writes a bare number as \"#1042\". */\nfunction headText(config: AparteConfig, data: Partial<OrderData> | null, hash: boolean): string {\n if (data?.title) return data.title;\n const booking = data?.kind === 'booking';\n if (data?.reference) {\n const reference = hash ? shownReference(data.reference) : data.reference;\n return say(config, booking ? 'cardsOrderBookingNumbered' : 'cardsOrderNumbered', { reference });\n }\n return say(config, booking ? 'cardsOrderBooking' : 'cardsOrderOrder');\n}\n\nfunction statusWord(config: AparteConfig, data: Pick<OrderData, 'kind' | 'status'>): string {\n const status = data.status;\n if (!status) return '';\n if ('text' in status) return status.text;\n const own = `cardsOrderBookingStatus_${status.status}`;\n const key = (data.kind === 'booking' && own in P ? own : `cardsOrderStatus_${status.status}`) as WordKey;\n return say(config, key);\n}\n\n/** The confirmation's headline: the status said as a sentence, or \"confirmed\" when it says nothing. */\nfunction headline(config: AparteConfig, data: OrderData): string {\n if (data.headline) return data.headline;\n const status = data.status && 'status' in data.status ? data.status.status : 'confirmed';\n if (data.kind !== 'booking') return say(config, `cardsOrderHeadline_${status}` as WordKey);\n const own = BOOKING_HEADLINE[status] ?? status;\n return say(config, `cardsOrderBookingHeadline_${own}` as WordKey);\n}\n\nconst dateFormat = (config: AparteConfig, options: Intl.DateTimeFormatOptions) => new Intl.DateTimeFormat(intlTag(config), options);\n\n/** \"Oct 31, 2026\": the day an order was placed. */\nconst placedOn = (config: AparteConfig, date: Date) => dateFormat(config, { dateStyle: 'medium' }).format(date);\n\n/** The day's fields, with the year only when it is not this one. */\nfunction dayOptions(date: Date, now = new Date()): Intl.DateTimeFormatOptions {\n return { weekday: 'short', day: 'numeric', month: 'short', ...(date.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}) };\n}\n\nconst TIME: Intl.DateTimeFormatOptions = { hour: 'numeric', minute: '2-digit' };\n\n/** Two moments as the language joins them, or each written and joined with a dash where `formatRange` is missing. */\nfunction range(format: Intl.DateTimeFormat, from: Date, to: Date): string {\n return typeof format.formatRange === 'function' ? format.formatRange(from, to) : `${format.format(from)} – ${format.format(to)}`;\n}\n\n/** \"Fri, Nov 7, 7:30 – 10:00 PM\", \"Fri 7 Nov – Sun 9 Nov\": a span written in one go, in the chat's language. */\nfunction whenText(config: AparteConfig, from: OrderWhen, to?: OrderWhen): string {\n const timed = !from.allDay || (to !== undefined && !to.allDay);\n const format = dateFormat(config, { ...dayOptions(from.date), ...(timed ? TIME : {}) });\n return to && to.date.getTime() !== from.date.getTime() ? range(format, from.date, to.date) : format.format(from.date);\n}\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n\n/** Nights between two days; 0 for a booking that starts and ends on the same one. */\nexport function nightsOf(from: Date, to: Date): number {\n return Math.max(0, Math.round((startOfDay(to) - startOfDay(from)) / 86_400_000));\n}\n\n// ── Drawing ──────────────────────────────────────────────────────────────────\n\nconst sr = (ctx: CardContext, key: WordKey) => {\n const node = el('span', { class: 'aparte-sr-only' });\n ctx.word(node, key, P[key]);\n return node;\n};\n\nconst bound = (ctx: CardContext, tag: 'span' | 'div' | 'dd' | 'dt' | 'strong', className: string, compute: () => string) => {\n const node = el(tag, { class: className });\n ctx.bind(node, compute);\n return node;\n};\n\nfunction kindGlyph(data: Partial<OrderData> | null): HTMLElement {\n return glyph(data?.kind === 'booking' ? CALENDAR : BAG, 'aparte-rich-card__glyph aparte-order__kind');\n}\n\n/** The status as a pill: a dot in its tone and its word — the word carries it, not the colour. */\nfunction statusPill(ctx: CardContext, data: OrderData): HTMLElement | null {\n if (!data.status) return null;\n const status = 'status' in data.status ? data.status.status : undefined;\n const pill = el('span', {\n class: `aparte-badge aparte-badge--${status ? INTENT[status] : 'neutral'} aparte-badge--sm aparte-order__status`,\n attrs: { 'data-status': status ?? 'other' },\n }, el('span', { class: 'aparte-order__status-dot', attrs: { 'aria-hidden': 'true' } }));\n pill.append(bound(ctx, 'span', 'aparte-order__status-text', () => statusWord(ctx.config, data)));\n return pill;\n}\n\n/** A link out to the order's page, through the kit's action so the app hears of it. */\nfunction viewButton(ctx: CardContext, data: OrderData, primary = false): HTMLButtonElement | null {\n if (!data.url) return null;\n const key: WordKey = data.kind === 'booking' ? 'cardsOrderViewBooking' : 'cardsOrderView';\n const button = ctx.action({ label: say(ctx.config, key), url: data.url, id: 'view', primary }, data, 'aparte-order__view');\n if (button) ctx.word(button, key, P[key]);\n return button;\n}\n\nfunction trackButton(ctx: CardContext, data: OrderData): HTMLButtonElement | null {\n const url = data.delivery?.trackingUrl;\n if (!url) return null;\n const button = ctx.action({ label: say(ctx.config, 'cardsOrderTrack'), url, id: 'track' }, data, 'aparte-order__track');\n if (button) ctx.word(button, 'cardsOrderTrack', P.cardsOrderTrack);\n return button;\n}\n\n/** The header every full variant opens with: the kind, the name, when it was placed, the pill. */\nfunction header(ctx: CardContext, data: OrderData): HTMLElement {\n const heading = el('div', { class: 'aparte-order__heading' },\n bound(ctx, 'div', 'aparte-order__title', () => headText(ctx.config, data, true)));\n if (data.date) {\n const date = data.date;\n const time = el('time', { class: 'aparte-order__date', attrs: { datetime: date.toISOString() } });\n ctx.bind(time, () => say(ctx.config, data.kind === 'booking' ? 'cardsOrderBooked' : 'cardsOrderPlaced', { date: placedOn(ctx.config, date) }));\n heading.append(time);\n }\n return el('div', { class: 'aparte-order__head' }, kindGlyph(data), heading, statusPill(ctx, data));\n}\n\n/**\n * The line's thumbnail, over a parcel glyph that stays underneath: a missing photo shows\n * the parcel, and one that fails to load is hidden to show it — no node comes or goes.\n */\nfunction thumb(line: OrderLine): HTMLElement {\n const frame = el('div', { class: 'aparte-order__thumb' }, glyph(BOX, 'aparte-rich-card__glyph aparte-order__thumb-glyph'));\n if (!line.image) {\n frame.setAttribute('data-empty', '');\n return frame;\n }\n const image = el('img', {\n class: 'aparte-order__image',\n attrs: { src: line.image.src, alt: line.image.alt ?? line.title, loading: 'lazy', decoding: 'async', referrerpolicy: 'no-referrer' },\n });\n image.addEventListener('error', () => {\n image.hidden = true;\n frame.setAttribute('data-empty', '');\n }, { once: true });\n frame.append(image);\n return frame;\n}\n\nfunction lineNode(ctx: CardContext, data: OrderData, line: OrderLine, thumbs: boolean): HTMLElement {\n const meta = el('div', { class: 'aparte-order__line-meta' },\n line.subtitle ? el('span', { class: 'aparte-order__line-variant', text: line.subtitle }) : null,\n line.quantity !== 1 && line.price !== undefined\n ? bound(ctx, 'span', 'aparte-order__line-each', () => say(ctx.config, 'cardsOrderEach', { price: money(ctx.config, data, line.price!) }))\n : null);\n return el('li', { class: 'aparte-order__line' },\n thumbs ? thumb(line) : null,\n el('div', { class: 'aparte-order__line-main' },\n el('div', { class: 'aparte-order__line-title', text: line.title }),\n meta.childNodes.length ? meta : null),\n line.quantity !== 1 ? bound(ctx, 'span', 'aparte-order__qty', () => `×\\u2009${formatNumber(ctx.config, line.quantity)}`) : null,\n line.total !== undefined ? bound(ctx, 'span', 'aparte-order__line-total', () => money(ctx.config, data, line.total!)) : null);\n}\n\n/** Six lines, then the rest behind \"and 4 more\" — a `<details>`, so it opens with no script. */\nfunction linesBlock(ctx: CardContext, data: OrderData): HTMLElement | null {\n if (!data.items.length) return null;\n const thumbs = data.items.some((l) => l.image);\n const list = (lines: OrderLine[]) => {\n const ul = el('ul', { class: 'aparte-order__lines', attrs: { role: 'list', 'data-thumbs': thumbs } },\n ...lines.map((line) => lineNode(ctx, data, line, thumbs)));\n ctx.bind(ul, () => say(ctx.config, 'cardsOrderLines'), 'aria-label');\n return ul;\n };\n const block = el('div', { class: 'aparte-order__section aparte-order__items' }, list(data.items.slice(0, LINES_SHOWN)));\n const hidden = data.lineCount - LINES_SHOWN;\n if (hidden > 0) {\n const summary = el('summary', { class: 'aparte-order__more-toggle' },\n glyph(CHEVRON, 'aparte-rich-card__glyph aparte-order__more-chevron'),\n bound(ctx, 'span', 'aparte-order__more-text', () => say(ctx.config, 'cardsOrderMore', { n: formatNumber(ctx.config, hidden) })));\n const more = el('details', { class: 'aparte-order__more' }, summary, list(data.items.slice(LINES_SHOWN)));\n // Past fifty the lines were not kept: say how many, rather than let the list end as if complete.\n const dropped = data.lineCount - data.items.length;\n if (dropped > 0) more.append(bound(ctx, 'div', 'aparte-order__dropped', () => say(ctx.config, 'cardsOrderMore', { n: formatNumber(ctx.config, dropped) })));\n block.append(more);\n }\n return block;\n}\n\nfunction sumRow(ctx: CardContext, key: WordKey, value: () => string, kind: string): HTMLElement {\n return el('div', { class: `aparte-order__sum aparte-order__sum--${kind}` },\n bound(ctx, 'dt', 'aparte-order__sum-label', () => say(ctx.config, key)),\n bound(ctx, 'dd', 'aparte-order__sum-value', value));\n}\n\n/**\n * Subtotal, discount, shipping, tax, then the total under a rule. The subtotal shows only\n * when something stands between it and the total — alone it would repeat it.\n */\nfunction totalsBlock(ctx: CardContext, data: OrderData): HTMLElement | null {\n const { config } = ctx;\n const between = data.discount !== undefined || data.shipping !== undefined || data.tax !== undefined;\n const rows = [\n data.subtotal !== undefined && between ? sumRow(ctx, 'cardsOrderSubtotal', () => money(config, data, data.subtotal!), 'subtotal') : null,\n data.discount ? sumRow(ctx, 'cardsOrderDiscount', () => `−${money(config, data, data.discount!)}`, 'discount') : null,\n data.shipping !== undefined\n ? sumRow(ctx, 'cardsOrderShipping', () => (data.shipping === 0 ? say(config, 'cardsOrderFree') : money(config, data, data.shipping!)), data.shipping === 0 ? 'free' : 'shipping')\n : null,\n data.tax !== undefined ? sumRow(ctx, 'cardsOrderTax', () => money(config, data, data.tax!), 'tax') : null,\n data.total !== undefined ? sumRow(ctx, 'cardsOrderTotal', () => money(config, data, data.total!), 'total') : null,\n ].filter(notNull);\n return rows.length ? el('dl', { class: 'aparte-order__section aparte-order__totals' }, ...rows) : null;\n}\n\n/** One row of the facts under the totals: a glyph and its label, then the value. */\nfunction infoRow(ctx: CardContext, icon: string, label: () => string, ...value: Array<Node | null>): HTMLElement {\n const dt = el('dt', { class: 'aparte-order__info-label' }, glyph(icon, 'aparte-rich-card__glyph aparte-order__info-glyph'));\n dt.append(bound(ctx, 'span', 'aparte-order__info-label-text', label));\n return el('div', { class: 'aparte-order__info' }, dt, el('dd', { class: 'aparte-order__info-value' }, ...value));\n}\n\nfunction estimateText(config: AparteConfig, estimate: NonNullable<NonNullable<OrderData['delivery']>['estimate']>): string {\n if ('text' in estimate) return estimate.text;\n const format = dateFormat(config, dayOptions(estimate.from.date));\n return estimate.to ? range(format, estimate.from.date, estimate.to.date) : format.format(estimate.from.date);\n}\n\nfunction deliveryRow(ctx: CardContext, data: OrderData): HTMLElement | null {\n const delivery = data.delivery;\n if (!delivery) return null;\n const estimate = delivery.estimate;\n const carrier = [delivery.carrier, delivery.trackingNumber].filter(notNull).join(' · ');\n const text = el('div', { class: 'aparte-order__delivery-text' },\n estimate ? bound(ctx, 'div', 'aparte-order__estimate', () => estimateText(ctx.config, estimate)) : null,\n carrier ? el('div', { class: 'aparte-order__carrier', text: carrier }) : null);\n return infoRow(ctx, TRUCK, () => say(ctx.config, 'cardsOrderDelivery'), text, trackButton(ctx, data));\n}\n\nfunction infoBlock(ctx: CardContext, data: OrderData): HTMLElement | null {\n const text = (value: string, className = '') => el('span', { class: `aparte-order__info-text${className ? ` ${className}` : ''}`, text: value });\n const rows = [\n data.payment ? infoRow(ctx, CARD, () => say(ctx.config, 'cardsOrderPayment'), text(data.payment)) : null,\n deliveryRow(ctx, data),\n data.shippingAddress ? infoRow(ctx, HOUSE, () => say(ctx.config, 'cardsOrderAddress'), text(data.shippingAddress, 'aparte-order__multiline')) : null,\n data.customer ? infoRow(ctx, PERSON, () => say(ctx.config, 'cardsOrderCustomer'), text(data.customer, 'aparte-order__multiline')) : null,\n ...data.facts.map((fact) => infoRow(ctx, INFO, () => fact.label, text(fact.value))),\n ].filter(notNull);\n return rows.length ? el('dl', { class: 'aparte-order__section aparte-order__infos' }, ...rows) : null;\n}\n\n/** A day as a calendar leaf: the month over the day's number, the weekday under it. */\nfunction leaf(ctx: CardContext, when: OrderWhen): HTMLElement {\n const node = el('time', { class: 'aparte-order__leaf', attrs: { datetime: when.date.toISOString() } },\n bound(ctx, 'span', 'aparte-order__leaf-month', () => dateFormat(ctx.config, { month: 'short' }).format(when.date)),\n bound(ctx, 'span', 'aparte-order__leaf-day', () => dateFormat(ctx.config, { day: 'numeric' }).format(when.date)),\n bound(ctx, 'span', 'aparte-order__leaf-weekday', () => dateFormat(ctx.config, { weekday: 'short' }).format(when.date)));\n return node;\n}\n\n/**\n * The booking's when, where and for how many. One day: its leaf beside the weekday and the\n * hours. Several: two leaves with an arrow and the nights between them — the shape every\n * hotel and rental confirmation takes.\n */\nfunction bookingBlock(ctx: CardContext, data: OrderData): HTMLElement | null {\n const booking = data.booking;\n if (!booking) return null;\n const { config } = ctx;\n const out = el('div', { class: 'aparte-order__section aparte-order__booking' });\n const { start, end } = booking;\n if (start) {\n const multiDay = end !== undefined && nightsOf(start.date, end.date) > 0;\n if (multiDay) {\n const nights = nightsOf(start.date, end.date);\n const side = (when: OrderWhen, key: WordKey) => el('div', { class: 'aparte-order__stay-side' },\n sr(ctx, key),\n leaf(ctx, when),\n when.allDay ? null : bound(ctx, 'span', 'aparte-order__stay-time', () => dateFormat(config, TIME).format(when.date)));\n out.append(el('div', { class: 'aparte-order__stay' },\n side(start, 'cardsOrderStart'),\n el('div', { class: 'aparte-order__stay-span' },\n glyph(ARROW, 'aparte-rich-card__glyph aparte-order__stay-arrow'),\n bound(ctx, 'span', 'aparte-order__nights', () => counted(config, 'cardsOrderNight', 'cardsOrderNights', nights))),\n side(end!, 'cardsOrderEnd')));\n } else {\n const hours = start.allDay ? null : bound(ctx, 'span', 'aparte-order__day-hours', () => (end && !end.allDay && end.date > start.date\n ? range(dateFormat(config, TIME), start.date, end.date)\n : dateFormat(config, TIME).format(start.date)));\n out.append(el('div', { class: 'aparte-order__day' },\n leaf(ctx, start),\n el('div', { class: 'aparte-order__day-text' },\n bound(ctx, 'span', 'aparte-order__day-name', () => {\n const text = dateFormat(config, { weekday: 'long', day: 'numeric', month: 'long', ...(start.date.getFullYear() !== new Date().getFullYear() ? { year: 'numeric' } : {}) }).format(start.date);\n return text.charAt(0).toLocaleUpperCase(intlTag(config)) + text.slice(1);\n }),\n hours)));\n }\n }\n const facts = [\n booking.location ? el('div', { class: 'aparte-order__place' },\n el('dt', { class: 'aparte-order__place-label' }, glyph(PIN, 'aparte-rich-card__glyph aparte-order__info-glyph'), sr(ctx, 'cardsOrderWhere')),\n el('dd', { class: 'aparte-order__place-value', text: booking.location })) : null,\n booking.guests !== undefined ? el('div', { class: 'aparte-order__place' },\n el('dt', { class: 'aparte-order__place-label' }, glyph(PEOPLE, 'aparte-rich-card__glyph aparte-order__info-glyph'), sr(ctx, 'cardsOrderGuestsLabel')),\n bound(ctx, 'dd', 'aparte-order__place-value', () => counted(config, 'cardsOrderGuest', 'cardsOrderGuests', booking.guests!))) : null,\n ].filter(notNull);\n if (facts.length) out.append(el('dl', { class: 'aparte-order__places' }, ...facts));\n return out.childNodes.length ? out : null;\n}\n\n/** The whole record: header, booking, lines, totals, the facts, the order's page. */\nfunction receipt(ctx: CardContext, data: OrderData): Node[] {\n const view = viewButton(ctx, data);\n return [\n header(ctx, data),\n bookingBlock(ctx, data),\n linesBlock(ctx, data),\n totalsBlock(ctx, data),\n infoBlock(ctx, data),\n view ? el('div', { class: 'aparte-order__foot' }, view) : null,\n ].filter(notNull);\n}\n\n/** \"3 items · €129.90\", or the booking's when and party: the row's second line. */\nfunction summaryParts(ctx: CardContext, data: OrderData): HTMLElement[] {\n const { config } = ctx;\n const part = (compute: () => string) => bound(ctx, 'span', 'aparte-order__row-part', compute);\n const booking = data.booking;\n return [\n booking?.start ? part(() => whenText(config, booking.start!, booking.end)) : null,\n booking?.guests !== undefined ? part(() => counted(config, 'cardsOrderGuest', 'cardsOrderGuests', booking.guests!)) : null,\n data.itemCount > 0 ? part(() => counted(config, 'cardsOrderItem', 'cardsOrderItems', data.itemCount)) : null,\n data.total !== undefined ? part(() => money(config, data, data.total!)) : null,\n ].filter(notNull);\n}\n\n/** One row: the kind, the name over its summary, the pill, and a chevron when it opens a page. */\nfunction compact(ctx: CardContext, data: OrderData): Node[] {\n const title = el('div', { class: 'aparte-order__title' });\n if (data.url) {\n const link = el('a', { class: 'aparte-order__link', attrs: { href: data.url, target: '_blank', rel: 'noopener noreferrer' } });\n ctx.bind(link, () => headText(ctx.config, data, true));\n title.append(link);\n } else {\n ctx.bind(title, () => headText(ctx.config, data, true));\n }\n const parts = summaryParts(ctx, data);\n return [el('div', { class: 'aparte-order__row', attrs: { 'data-linked': data.url !== undefined } },\n kindGlyph(data),\n el('div', { class: 'aparte-order__row-main' }, title, parts.length ? el('div', { class: 'aparte-order__row-meta' }, ...parts) : null),\n statusPill(ctx, data),\n data.url ? glyph(CHEVRON, 'aparte-rich-card__glyph aparte-order__chevron') : null)];\n}\n\nfunction keyFact(ctx: CardContext, key: WordKey | (() => string), value: () => string, kind: string, note?: () => string): HTMLElement {\n const label = typeof key === 'function' ? key : () => say(ctx.config, key);\n return el('div', { class: `aparte-order__keyfact aparte-order__keyfact--${kind}` },\n bound(ctx, 'dt', 'aparte-order__keyfact-label', label),\n el('dd', { class: 'aparte-order__keyfact-value' },\n bound(ctx, 'span', 'aparte-order__keyfact-text', value),\n note ? bound(ctx, 'span', 'aparte-order__keyfact-note', note) : null));\n}\n\n/**\n * The moment it is placed: a seal drawn on, the headline, its number, then the two or three\n * facts a person checks before they close the chat — the total, when it arrives or when to\n * be there — and what to do next.\n */\nfunction confirmation(ctx: CardContext, data: OrderData): Node[] {\n const { config } = ctx;\n const status = data.status && 'status' in data.status ? data.status.status : undefined;\n const tone = status ? TONE[status] : 'success';\n const sub = [\n data.title && data.reference ? data.title : null,\n data.reference ? shownReference(data.reference) : data.title ?? null,\n ].filter(notNull);\n const booking = data.booking;\n const estimate = data.delivery?.estimate;\n const facts = [\n data.total !== undefined\n ? keyFact(ctx, 'cardsOrderTotal', () => money(config, data, data.total!), 'total',\n data.itemCount > 0 ? () => counted(config, 'cardsOrderItem', 'cardsOrderItems', data.itemCount) : undefined)\n : null,\n estimate ? keyFact(ctx, 'cardsOrderDelivery', () => estimateText(config, estimate), 'delivery', data.delivery?.carrier ? () => data.delivery!.carrier! : undefined) : null,\n booking?.start\n ? keyFact(ctx, 'cardsOrderWhen', () => whenText(config, booking.start!, booking.end), 'when',\n booking.end && nightsOf(booking.start.date, booking.end.date) > 0\n ? () => counted(config, 'cardsOrderNight', 'cardsOrderNights', nightsOf(booking.start!.date, booking.end!.date))\n : undefined)\n : null,\n booking?.location ? keyFact(ctx, 'cardsOrderWhere', () => booking.location!, 'where') : null,\n booking?.guests !== undefined ? keyFact(ctx, 'cardsOrderGuestsLabel', () => counted(config, 'cardsOrderGuest', 'cardsOrderGuests', booking.guests!), 'guests') : null,\n ...data.facts.slice(0, FACTS_IN_CONFIRMATION).map((fact) => keyFact(ctx, () => fact.label, () => fact.value, 'own')),\n ].filter(notNull);\n const buttons = [viewButton(ctx, data, true), trackButton(ctx, data)].filter(notNull);\n const free = data.status && 'text' in data.status ? statusPill(ctx, data) : null;\n return [el('div', { class: 'aparte-order__confirm', attrs: { 'data-tone': tone } },\n glyph(seal(tone), 'aparte-order__seal'),\n bound(ctx, 'div', 'aparte-order__headline', () => headline(config, data)),\n sub.length ? el('div', { class: 'aparte-order__ref', text: sub.join(' · ') }) : null,\n free,\n facts.length ? el('dl', { class: 'aparte-order__keyfacts' }, ...facts) : null,\n buttons.length ? el('div', { class: 'aparte-order__confirm-actions' }, ...buttons) : null)];\n}\n\nfunction render(data: OrderData, ctx: CardContext<OrderVariant>): Node[] {\n if (ctx.variant === 'compact') return compact(ctx, data);\n if (ctx.variant === 'confirmation') return confirmation(ctx, data);\n return receipt(ctx, data);\n}\n\nfunction skeleton(partial: Partial<OrderData> | null, ctx: CardContext<OrderVariant>): Node[] {\n const block = (cls: string, kind: 'text' | 'rect' | 'circle' = 'text') =>\n el('span', { class: `aparte-skeleton aparte-skeleton--${kind} ${cls}`, attrs: { 'aria-hidden': 'true' } });\n // The number the call already names is shown, not shimmered: it is known.\n const name = partial?.reference || partial?.title\n ? bound(ctx, 'div', 'aparte-order__title', () => headText(ctx.config, partial, true))\n : block('aparte-order__sk-title');\n\n if (ctx.variant === 'compact') {\n return [el('div', { class: 'aparte-order__row' },\n kindGlyph(partial),\n el('div', { class: 'aparte-order__row-main' }, name, block('aparte-order__sk-meta')),\n block('aparte-order__sk-pill', 'rect'))];\n }\n if (ctx.variant === 'confirmation') {\n return [el('div', { class: 'aparte-order__confirm aparte-order__confirm--skeleton' },\n block('aparte-order__sk-seal', 'circle'),\n block('aparte-order__sk-headline'),\n partial?.reference ? el('div', { class: 'aparte-order__ref', text: shownReference(partial.reference) }) : block('aparte-order__sk-ref'),\n el('div', { class: 'aparte-order__keyfacts' }, block('aparte-order__sk-fact', 'rect'), block('aparte-order__sk-fact', 'rect')))];\n }\n const line = () => el('div', { class: 'aparte-order__line aparte-order__line--skeleton' },\n block('aparte-order__sk-thumb', 'rect'),\n el('div', { class: 'aparte-order__line-main' }, block('aparte-order__sk-line'), block('aparte-order__sk-line aparte-order__sk-line--short')),\n block('aparte-order__sk-price'));\n return [\n el('div', { class: 'aparte-order__head' },\n kindGlyph(partial),\n el('div', { class: 'aparte-order__heading' }, name, block('aparte-order__sk-date')),\n block('aparte-order__sk-pill', 'rect')),\n el('div', { class: 'aparte-order__section aparte-order__items' }, el('div', { class: 'aparte-order__lines', attrs: { 'data-thumbs': '' } }, line(), line(), line())),\n el('div', { class: 'aparte-order__section aparte-order__totals' },\n el('div', { class: 'aparte-order__sum' }, block('aparte-order__sk-label'), block('aparte-order__sk-price')),\n el('div', { class: 'aparte-order__sum aparte-order__sum--total' }, block('aparte-order__sk-label'), block('aparte-order__sk-price'))),\n ];\n}\n\n/** \"Order 1042 — 3 items, total €129.90, shipped\": what a model or a text-only reader is told. */\nfunction fallback(data: OrderData, ctx: CardContext<OrderVariant>): string {\n const { config } = ctx;\n const booking = data.booking;\n const status = data.status\n ? ('status' in data.status ? statusWord(config, data).toLocaleLowerCase(intlTag(config)) : data.status.text)\n : undefined;\n const parts = [\n booking?.start ? whenText(config, booking.start, booking.end) : undefined,\n booking?.location,\n booking?.guests !== undefined ? counted(config, 'cardsOrderGuest', 'cardsOrderGuests', booking.guests) : undefined,\n data.itemCount > 0 ? counted(config, 'cardsOrderItem', 'cardsOrderItems', data.itemCount) : undefined,\n data.total !== undefined ? say(config, 'cardsOrderFallbackTotal', { amount: money(config, data, data.total) }) : undefined,\n status,\n ].filter(notNull);\n const head = headText(config, data, false);\n return parts.length ? `${head} — ${parts.join(', ')}` : head;\n}\n\nexport const orderCard = defineCard<OrderData, OrderVariant>({\n name: 'order',\n variants: ['receipt', 'compact', 'confirmation'],\n styles: orderStyles,\n icon: BAG,\n normalize: readOrder,\n render,\n skeleton,\n label: (data, ctx) => headText(ctx.config, data, false),\n fallback,\n partial: (input) => {\n const reference = str(input['reference'] ?? input['orderNumber'] ?? input['order_number'] ?? input['orderId'] ?? input['order_id']\n ?? input['bookingId'] ?? input['booking_id'] ?? input['confirmation'] ?? input['number'] ?? input['id'])?.replace(/^#\\s*/, '');\n const booking = ['bookingId', 'booking_id', 'reservationId', 'reservation_id'].some((k) => input[k] !== undefined) || squeeze(input['kind']) === 'booking';\n if (!reference && !booking) return null;\n return { kind: booking ? 'booking' : 'order', ...(reference ? { reference } : {}) };\n },\n});\n\n/** Draw a tool's order or booking as this card — returns the function that stops it. */\nexport function setupOrderCard(options: CardSetupOptions<OrderData, OrderVariant> = {}): () => void {\n return orderCard.setup(options);\n}\n"],"names":["date","src","money"],"mappings":";AAWA,MAAM,MAAM,CAAC,SACT,mKAAmK,IAAI;AAGpK,MAAM,MAAM,IAAI,yHAAyH;AAGzI,MAAM,WAAW,IAAI,+JAA+J;AAGpL,MAAM,MAAM,IAAI,2GAA2G;AAG3H,MAAM,QAAQ,IAAI,iJAAiJ;AAGnK,MAAM,OAAO,IAAI,6FAA6F;AAG9G,MAAM,MAAM,IAAI,6GAA6G;AAG7H,MAAM,SAAS,IAAI,sKAAsK;AAGzL,MAAM,SAAS,IAAI,wFAAwF;AAG3G,MAAM,QAAQ,IAAI,mEAAmE;AAGrF,MAAM,OAAO,IAAI,0GAA0G;AAG3H,MAAM,UAAU,IAAI,4BAA4B;AAGhD,MAAM,QAAQ,IAAI,+CAA+C;AAGxE,MAAM,QAAQ;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AACb;AAQO,SAAS,KAAK,MAAwB;AACzC,SAAO,uPAAuP,MAAM,IAAI,CAAC;AAC7Q;AClEA,MAAA,cAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The place card's glyphs: one 24 × 24 line drawing each, in `currentColor`, so the sheet
|
|
3
|
+
* colours them with the text around them — the pin, the three actions' signs, and one
|
|
4
|
+
* glyph per kind of place for the placeholder and the badge.
|
|
5
|
+
*
|
|
6
|
+
* They live here and not in core's `icons/`: core draws no place. They are constants of
|
|
7
|
+
* the package, the only markup the card parses.
|
|
8
|
+
*/
|
|
9
|
+
/** The kinds of place a glyph (and a word) exists for; anything else is a `place`. */
|
|
10
|
+
export type PlaceKind = 'restaurant' | 'cafe' | 'bar' | 'hotel' | 'shop' | 'museum' | 'park' | 'gym' | 'pharmacy' | 'place';
|
|
11
|
+
export declare const PIN: string;
|
|
12
|
+
export declare const PHONE: string;
|
|
13
|
+
export declare const GLOBE: string;
|
|
14
|
+
export declare const DIRECTIONS: string;
|
|
15
|
+
export declare const CLOCK: string;
|
|
16
|
+
/** The glyph for a kind of place. */
|
|
17
|
+
export declare function kindGlyph(kind: PlaceKind): string;
|
|
18
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/place/icons.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sFAAsF;AACtF,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC;AAK5H,eAAO,MAAM,GAAG,QAAqH,CAAC;AACtI,eAAO,MAAM,KAAK,QAAqI,CAAC;AACxJ,eAAO,MAAM,KAAK,QAA2J,CAAC;AAC9K,eAAO,MAAM,UAAU,QAA8H,CAAC;AACtJ,eAAO,MAAM,KAAK,QAAqE,CAAC;AAexF,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEjD"}
|