efficient-storefront-blocks 0.61.0 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/CHANGELOG.md +70 -1
  2. package/dist/chunks/{EditorPreviewCheckout-55ERZEPV.js → EditorPreviewCheckout-6776GNNO.js} +1 -1
  3. package/dist/chunks/{SiteEditorProvider-XF374NLZ.js → SiteEditorProvider-GTIZ4RNX.js} +1 -1
  4. package/dist/chunks/chunk-A3PXLZZP.js +1 -0
  5. package/dist/chunks/chunk-JBLNH3P5.js +1 -0
  6. package/dist/chunks/chunk-VDYPGGK3.js +250 -0
  7. package/dist/chunks/{fitment-data-RORHKBID.js → fitment-data-DGKKOAWL.js} +1 -1
  8. package/dist/editor/components/EditorPreviewChat.js +4 -4
  9. package/dist/editor/components/PreviewHeader.d.ts +1 -1
  10. package/dist/editor/components/PreviewHeader.js +4 -4
  11. package/dist/editor/lib/efficient-backend.d.ts +1 -0
  12. package/dist/editor/lib/efficient-backend.js +1 -1
  13. package/dist/editor/lib/efficient-block-sources.d.ts +2 -0
  14. package/dist/editor/lib/efficient-block-sources.js +1 -0
  15. package/dist/editor/lib/puck/blocks/commerce/EuTyreLabelBlock/fields.d.ts +2 -0
  16. package/dist/editor/lib/puck/blocks/commerce/EuTyreLabelBlock/fields.js +1 -0
  17. package/dist/editor/lib/puck/blocks/commerce/ProductGallery/fields.d.ts +6 -0
  18. package/dist/editor/lib/puck/blocks/commerce/ProductGallery/fields.js +1 -0
  19. package/dist/editor/lib/puck/blocks/commerce/ProductHero/fields.js +1 -1
  20. package/dist/editor/lib/puck/blocks/commerce/index.d.ts +1 -1
  21. package/dist/editor/lib/puck/blocks/commerce/index.js +1 -1
  22. package/dist/editor/lib/puck/blocks/service/RatingBlock/fields.d.ts +2 -0
  23. package/dist/editor/lib/puck/blocks/service/RatingBlock/fields.js +1 -0
  24. package/dist/editor/lib/puck/blocks/service/index.d.ts +1 -1
  25. package/dist/editor/lib/puck/blocks/service/index.js +1 -1
  26. package/dist/editor/lib/puck/config.js +1 -1
  27. package/dist/editor/lib/storefront-editor-words.d.ts +1 -0
  28. package/dist/editor/lib/storefront-editor-words.js +1 -1
  29. package/dist/editor.css +1 -1
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.js +103 -82
  32. package/dist/render/app/globals.css +70 -14
  33. package/dist/render/built-with.json +1 -1
  34. package/dist/render/components/CartContext.d.ts +1 -0
  35. package/dist/render/components/CartContext.js +1 -1
  36. package/dist/render/components/CartDrawer.d.ts +0 -8
  37. package/dist/render/components/CartDrawer.js +2 -2
  38. package/dist/render/components/ChatWidget.js +1 -1
  39. package/dist/render/components/EuTyreLabels.d.ts +3 -0
  40. package/dist/render/components/EuTyreLabels.js +1 -1
  41. package/dist/render/components/FooterMenu.js +1 -1
  42. package/dist/render/components/FormBlock.js +1 -1
  43. package/dist/render/components/GalleryItem.js +1 -1
  44. package/dist/render/components/Header.js +1 -1
  45. package/dist/render/components/LegalLine.js +1 -1
  46. package/dist/render/components/PopupFrame.d.ts +2 -1
  47. package/dist/render/components/PopupFrame.js +1 -1
  48. package/dist/render/components/PopupHost.d.ts +17 -0
  49. package/dist/render/components/PopupHost.js +1 -0
  50. package/dist/render/components/ProductCard.js +1 -1
  51. package/dist/render/components/ProductGallery.d.ts +15 -0
  52. package/dist/render/components/ProductGallery.js +1 -0
  53. package/dist/render/components/ProductHeroPanel.js +1 -1
  54. package/dist/render/components/RatingStars.d.ts +4 -0
  55. package/dist/render/components/RatingStars.js +1 -0
  56. package/dist/render/components/Reviews.js +1 -1
  57. package/dist/render/components/StorefrontProviders.d.ts +1 -3
  58. package/dist/render/components/StorefrontProviders.js +1 -1
  59. package/dist/render/components/SubscribePopupContext.d.ts +3 -15
  60. package/dist/render/components/SubscribePopupContext.js +1 -1
  61. package/dist/render/components/TyrePlpCard.js +1 -1
  62. package/dist/render/components/WheelCardFrame.d.ts +3 -27
  63. package/dist/render/components/WheelCardFrame.js +1 -1
  64. package/dist/render/components/card-pieces/CardBuyButton.d.ts +7 -0
  65. package/dist/render/components/card-pieces/CardBuyButton.js +1 -0
  66. package/dist/render/components/card-pieces/CardFinishSwatches.d.ts +5 -0
  67. package/dist/render/components/card-pieces/CardFinishSwatches.js +1 -0
  68. package/dist/render/components/card-pieces/CardPrice.d.ts +7 -0
  69. package/dist/render/components/card-pieces/CardPrice.js +1 -0
  70. package/dist/render/components/card-pieces/CardProductBadge.d.ts +7 -0
  71. package/dist/render/components/card-pieces/CardProductBadge.js +1 -0
  72. package/dist/render/components/card-pieces/CardSizes.d.ts +9 -0
  73. package/dist/render/components/card-pieces/CardSizes.js +1 -0
  74. package/dist/render/components/card-pieces/ProductCardState.d.ts +53 -0
  75. package/dist/render/components/card-pieces/ProductCardState.js +1 -0
  76. package/dist/render/components/card-pieces/card-row.d.ts +20 -0
  77. package/dist/render/components/card-pieces/card-row.js +1 -0
  78. package/dist/render/components/cart/drawer-parts.d.ts +28 -0
  79. package/dist/render/components/cart/drawer-parts.js +1 -0
  80. package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.d.ts +3 -0
  81. package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.js +1 -1
  82. package/dist/render/components/pdp-dynamic/DynamicProductGallery.d.ts +9 -0
  83. package/dist/render/components/pdp-dynamic/DynamicProductGallery.js +1 -0
  84. package/dist/render/components/useHeaderBar.js +1 -1
  85. package/dist/render/components/useIsLightTheme.d.ts +1 -0
  86. package/dist/render/components/useIsLightTheme.js +1 -0
  87. package/dist/render/components/wheels-plp/PlpCard.d.ts +3 -2
  88. package/dist/render/components/wheels-plp/PlpCard.js +1 -1
  89. package/dist/render/components/wheels-plp/usePlpCardSelection.d.ts +1 -1
  90. package/dist/render/components/wheels-plp/usePlpCardSelection.js +1 -1
  91. package/dist/render/lib/api/index.d.ts +4 -2
  92. package/dist/render/lib/api/index.js +1 -1
  93. package/dist/render/lib/api/types.d.ts +48 -1
  94. package/dist/render/lib/chrome-load.d.ts +1 -1
  95. package/dist/render/lib/chrome-load.js +1 -1
  96. package/dist/render/lib/content/product-hero.d.ts +1 -0
  97. package/dist/render/lib/content/product-hero.js +1 -1
  98. package/dist/render/lib/header-fit.d.ts +2 -0
  99. package/dist/render/lib/header-fit.js +1 -0
  100. package/dist/render/lib/popup/popup-stores.d.ts +2 -0
  101. package/dist/render/lib/popup/popup-stores.js +1 -0
  102. package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/meta.d.ts +2 -0
  103. package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/meta.js +1 -0
  104. package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/render.d.ts +2 -0
  105. package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/render.js +1 -0
  106. package/dist/render/lib/puck/blocks/commerce/ProductGallery/meta.d.ts +2 -0
  107. package/dist/render/lib/puck/blocks/commerce/ProductGallery/meta.js +1 -0
  108. package/dist/render/lib/puck/blocks/commerce/ProductGallery/render.d.ts +2 -0
  109. package/dist/render/lib/puck/blocks/commerce/ProductGallery/render.js +1 -0
  110. package/dist/render/lib/puck/blocks/commerce/metas.d.ts +2 -0
  111. package/dist/render/lib/puck/blocks/commerce/metas.js +1 -1
  112. package/dist/render/lib/puck/blocks/commerce/renders.d.ts +2 -0
  113. package/dist/render/lib/puck/blocks/commerce/renders.js +1 -1
  114. package/dist/render/lib/puck/blocks/service/RatingBlock/meta.d.ts +3 -0
  115. package/dist/render/lib/puck/blocks/service/RatingBlock/meta.js +1 -0
  116. package/dist/render/lib/puck/blocks/service/RatingBlock/render.d.ts +2 -0
  117. package/dist/render/lib/puck/blocks/service/RatingBlock/render.js +1 -0
  118. package/dist/render/lib/puck/blocks/service/metas.d.ts +1 -0
  119. package/dist/render/lib/puck/blocks/service/metas.js +1 -1
  120. package/dist/render/lib/puck/blocks/service/renders.d.ts +1 -0
  121. package/dist/render/lib/puck/blocks/service/renders.js +1 -1
  122. package/dist/render/lib/puck/lazy-draws.js +1 -1
  123. package/dist/render/lib/storefront-page-groups.js +1 -1
  124. package/dist/render/lib/wheels/plp-fitment-match.d.ts +4 -0
  125. package/dist/render/lib/wheels/plp-fitment-match.js +1 -1
  126. package/dist/render/lib/wheels/spec-sheet.js +1 -1
  127. package/dist/words.d.ts +2 -2
  128. package/dist/words.js +3 -3
  129. package/package.json +4 -4
  130. package/dist/chunks/chunk-FCCEAXMM.js +0 -1
  131. package/dist/chunks/chunk-VVQ7KFQO.js +0 -1
  132. package/dist/chunks/chunk-YNI65Q6Z.js +0 -250
  133. package/dist/render/components/wheels-plp/useWheelCardBottom.d.ts +0 -20
  134. package/dist/render/components/wheels-plp/useWheelCardBottom.js +0 -1
  135. package/dist/render/lib/popup/popup-rules.d.ts +0 -25
  136. package/dist/render/lib/popup/popup-rules.js +0 -1
  137. /package/dist/chunks/{chunk-I6VNNXUI.js → chunk-IT33OG3G.js} +0 -0
  138. /package/dist/chunks/{chunk-YNI65Q6Z.js.LEGAL.txt → chunk-VDYPGGK3.js.LEGAL.txt} +0 -0
  139. /package/dist/chunks/{chunk-VT346MLP.js → chunk-XKTD3BPL.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,6 +1,75 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.63.0 - 2026-10-25
4
+
5
+ **A major for hosts (major version zero, so a minor number):** the peers move to `efficient-web-builder` `^40.0.0` and `efficient-easel` `^20.2.0` (both narrowed). A host moves to those with this release.
6
+
7
+ - **On website builder 40 and easel 20.2:** the top bar is regrouped (Media library, undo and redo on the left; the device switch, Refresh and the website's Preview as an icon in the centre; the save icon before a host's own button on the right; no vertical line), and the left panel hides from the first control of its tab row (easel #357, builder #304). The builder also tells a host what each custom row stores (#303).
8
+ - `test-shell-peer-range` holds the new ranges; `test-web-host-contract` reads the left panel's tabs as Pages and Layers (Media library is the bar's button).
9
+
10
+ ## 0.62.0 - 2026-10-24
11
+
12
+ **A major for hosts (major version zero, so a minor number):** the peers move to `efficient-web-builder` `^39.0.0`, `efficient-easel` `^20.1.0` and `efficient-shell` `^9.1.0` (all three narrowed). A host moves to those with this release.
13
+
14
+ - **A host can put its own button in the editor's top bar and its own panel in the right panel's place** (JARVIS in the Storefront editor, Victor Mau 2026-10-24). `createEditorHost` takes `panels` (`EditorHostPanels`, easel's `EaselHostPanels`): `Toolbar`, and `useRight`, whose result stands in the inspector's place while it returns something (efficient-easel 20.1.0, #355). It also declares `claimEscape`, which easel's host has taken since 0.105.0 and the published type left out. The new host messages for page edits (`selection`, `request-document`, `apply-page-edits`, `undo-page-edits`, `set-right-panel`) arrive with easel 20's types, re-exported as before, and the website builder 39 answers them (its #301). `types.check.ts` pairs `EditorHostPanels`, `panels` and `claimEscape`.
15
+ - **On website builder 39:** the canvas accent is `CANVAS_ACCENT` (`format/lib/canvas-accent`) in `EditorPreviewChat` and `PreviewHeader` (builder 39 deleted `floating-editor/tokens`); `words.public.d.ts` is regenerated (`scripts/write-editor-words.ts`). Guards follow the builder: `test-logos-label-alignment` finds the hoisted part-style sheet by `data-precedence="sf-part-styles"` (builder #299), `test-section-groups` reads a section's own level-2 heading as a band and counts 3 rebuilt headings (builder #272: a heading is a fold marker from the start), and `test-shell-peer-range` holds the new ranges.
16
+
17
+ - **The journal list can ask for one category** (GG 2026-10-24). `products.listBlogPosts({ category })` sends `GET /api/v1/blog-posts?category=<name>` (efficient-backend `feat/blog-posts-category-filter`): the posts a Category Bar tab (`/journal?category=<name>`) opens. The name is sent as given; the backend matches it by its own rule (case kept, spaces round it ignored). No category, or an empty one, is the same request as before. `src/render/lib/api/types.ts` is regenerated from the storefront's `openapi.yml`, which gains the `category` query param.
18
+ - Guard: new `scripts/test-blog-posts-category-read.ts` (red first: the request carried no `?category`; mutation: an unescaped name fails §2).
19
+
20
+ - **Three parts of three sections are real blocks: Product Gallery, EU Tyre Label and Rating** (card [ADD] Product Gallery, EU Tyre Label And Rating Blocks; plan 2026-10-23 §4.1, §5 B11; Lewis 2026-10-23: no virtual parts). Each is registered (`ProductGallery`, `EuTyreLabelBlock`, `RatingBlock`) so a Box can hold it. None is a section and none is in an Add menu yet: the Box menu takes them with efficient-web-builder 40.0.0 (`registerNestableContentSections`, efficient-web-builder #281). Nothing stored changes, and the three old sections draw the same bytes.
21
+ - **Product Gallery** draws this page's product pictures (the page's product and its one selection, a stand-in product in the editor, nothing live off a product page). The stage, thumbs and zoom MOVED out of `ProductHeroPanel` into new `components/ProductGallery.tsx`; the Product Hero draws it. Its rows `Gallery` and `Image fit` are the gallery's own (`PRODUCT_GALLERY_ROWS`); the Product Hero's panel shows the same two rows from there until it moves onto a Box. New `useIsLightTheme` (moved out of the panel).
22
+ - **EU Tyre Label** draws this page's tyre grades with new `EuTyreLabelGrades` (the grid and the registry's source line, moved out of `EuTyreLabels`, which draws it). Read live, never stored, as the section. No row edits a word: the words are the regulator's.
23
+ - **Rating** draws stars from a number with new `components/RatingStars.tsx` (the Reviews section's star row, moved; Reviews draws it). Its one row is `Rating` (0 to 5; 0 shows none on a live page). The review list's card will give it the review's number (efficient-backend #3778).
24
+ - Guard: new `scripts/test-data-bound-blocks.tsx` (red first: 12 of 15 failed), against `scripts/fixtures/data-bound-sections-before.json` (26 stored shapes, captured on main `8728ee06`). New `scripts/registered-not-catalogued.ts`: the three types' sets until efficient-web-builder rules them.
25
+
26
+ - **One cart action adds a line and opens the drawer: `useCart().addAndOpen`** (popups and cart drawer plan, PR 10 groundwork). The product page's buy panel, the tyre card and the wheel card each called `add` and then `open`; they call `addAndOpen` now, so the drawer page's `Auto open` row will reach every surface from one place. Nothing a shopper sees changes: every add still opens the drawer.
27
+ - `test-basket-controls-marked` and `test-cart-catalog-gate` find a surface that adds by `add` or `addAndOpen`.
28
+ - Guard: new `scripts/test-cart-add-and-open.tsx` (red first: 8 failures).
29
+
30
+ - **Shopper colours read the site theme** (colour plan S6; owner ruling 2026-10-23, every colour reads a role). The shopper's own chat bubble (`ChatWidget`) drew its words in fixed black on the accent, so on a dark accent they disappeared: it takes the accent's own ink (`text-accent-ink`). A lifted gallery card's shadow (`GalleryItem`) was pure black; it reads the merchant's shadow colour (`--sf-shadow-color`, with the built-in default every shadow rule uses). The editor's note over a system page's inline preview drops two hex fallbacks for site tokens the canvas always has (`ui-kit.baseline.json` hex 5 → 3).
31
+ - Guard: new `scripts/test-colour-reads-the-theme.ts` (red first: 3 of 3 failed).
32
+
33
+
34
+ - **Fix: the header shows at exactly 800px** (duplicate audit 2026-10-23, D01). The phone band was `max-[800px]` (width < 800) and the desktop bands `min-[801px]` (width ≥ 801), so at 800px — the editor's Tablet view — no band showed: no logo, no menu. The same off-by-one sat between the stacked band's `max-[1500px]` and the wide band's `min-[1501px]`. The site's sheet now names easel's view tiers as Tailwind breakpoints (`--breakpoint-view-tablet: 720px`, `--breakpoint-view-desktop: 1100px`, = `VIEW_TABLET_MIN` / `VIEW_DESKTOP_MIN`), and the header and the footer's legal line use `view-tablet:` / `max-view-tablet:` — one number, two halves that always meet. **Visible:** from 720px to 799px the header now draws the stacked desktop band (logo and tools, menu below) instead of the phone band, and the legal line stays on one row; this is the tablet tier everywhere else. The Box header moves with it (Lewis 2026-10-12: a switched site looks the same as the old header at every width): its phone bar, its mid-width rows and its menu alignment (`app/globals.css`) switch at 720px, and the one-row Menu (`FooterMenu`) shows its links from `view-tablet:`. First step of D06 (one set of breakpoints).
35
+ - Guards: new `scripts/test-header-bands-cover-every-width.tsx` (red first: 0 bands at 800px in every layout, 0 at 1500px in the stacked ones); the same guard holds the Box header's media queries to the `view-tablet` breakpoint (red first: 801px / 800px); `test-view-tier-breakpoints` pins the two theme breakpoints to easel; `test-header-inline-row`, `test-box-header-phone` and `test-box-header-bar-settings` read the new values.
36
+
37
+ - **The product card is made of pieces** (section parts plan B6, part 1 of 2; GG 2026-10-24: a restructure keeps the same look). The price, the finish swatches, the sizes, the product badge and the buy button left `WheelCardFrame` and are one component each in new `src/render/components/card-pieces/`: `CardPrice`, `CardFinishSwatches`, `CardSizes`, `CardProductBadge` and `CardBuyButton` (with `CardBuyDialog`, the back-in-stock dialog). Each draws its own rows (`card-row.tsx`: `CardRow`, the one copy of the nine-row rule) and takes only its own settings. The product and what the shopper chose on the card are ONE state per card, `ProductCardState.tsx` (`WheelCardStateProvider`, `TyreCardStateProvider`), which every piece reads: a swatch click moves the picture, the price and what the buy button adds together. `ProductCard`, `PlpCard` and `TyrePlpCard` mount it and compose the pieces. Every card draws the same bytes as before.
38
+ - **Fixed: the buy button adds the finish the shopper selected** (GG 2026-10-24: what you see is what you buy). The Product Grid card ran two finish selections, one for the picture and one for the buy button, so with Buy button on, "Add to basket" added the default finish whatever swatch was shown. The card now has one selection. No markup changes.
39
+ - Removed: `wheels-plp/useWheelCardBottom.tsx` (now `CardBuyButton`), and from `WheelCardFrame` the props `was`, `metaLine`, `showPrice`, `reserveSwatches`, `chips`, `actions` (the frame takes the pieces as `price`, `swatches`, `sizes`, `buy`) and the exports `WheelCardBadge`, `WheelCardCorners`, `CARD_BADGE_ANCHOR_*`, `CARD_CTA_*` and `CARD_CHIP_*` (the chip classes are `CardSizes`'s now). No host app code uses them; the storefront's `scripts/test-card-price-line.tsx` and `scripts/harness/plp-spec-line.tsx` draw the frame with the old props and move with the sync.
40
+ - Guards: new `scripts/test-product-card-same-look.tsx` (580 cards, sha256 of each, captured on main by `scripts/capture-product-card-before.tsx` before the split) and `scripts/test-product-card-pieces.tsx` (each piece drawn alone draws what its card drew; red first: the pieces did not exist). `test-card-shows-what-it-is-told` and `test-product-card-shape` draw the frame with the pieces; four source guards read the buy button's new file, and `test-basket-controls-marked` counts two basket files, not three (the tyre and the wheel buttons are one piece); `test-heading-outline-covers-catalog` skips the back-in-stock dialog's heading (a modal, which it now reaches).
41
+
42
+ - **Fix: the header folds to its phone bar when its row does not fit — measured, not a fixed width** (GG 2026-10-24, before the D01 header fix). hartesmetal.com puts its logo and five links on one row; the row needs 810px and the bar had 690px at an 810px screen, so from 801px to about 930px "Contact" ran off the edge. New `src/render/lib/header-fit.ts` (`fitHeaderToRow`): every desktop band `components/Header` shows is measured at its natural width against its room; when one does not fit, the header carries `data-header-fit="phone"` and the site sheet (THE HEADER FOLDS) hides the bands and draws the phone bar and its menu. `components/useHeaderBar` runs it after each render, on every resize of the bar, and when an image or the fonts load, so the Box header shares the rule (it marks no band yet). The header marks its bands (`data-header-band`), its phone row (`data-header-phone`) and its menu (`data-header-phone-menu`, whose layout classes no longer need a breakpoint). Below the breakpoint nothing changes: the server's markup carries no fold.
43
+ - Guard: new `scripts/test-header-folds-when-menu-overflows.tsx` (red first: the module did not exist; the hartesmetal row at 760, 810 and 900px folds, at 1100px it stays, in every header layout).
44
+
45
+ - **The cart drawer is drawn from named parts; nothing a shopper sees changes** (popups and cart drawer plan, PR 9 groundwork; design final 2026-10-23, option B). New `src/render/components/cart/drawer-parts.tsx`: `CartDrawerHeader`, `CartStatusRail`, `CartLines` (lines or the empty state), `CartUpsell`, `CartCouponRow`, `CartTrustMarkers`, `CartTotals`, `CartActions`, and the row parts they use (`CartLineRow` moved here). `components/CartDrawer` keeps the frame, the dismiss and focus hooks and the tyre read (they must run while it is closed) and draws the parts in today's order. The drawer page's blocks (Header Box, Cart List, Trust Markers Strip, Related Products) will reuse the parts. The drawer's markup was compared byte for byte before and after.
46
+ - Guards that read the drawer's file now read the parts' file (`test-checkout-money-decimals`, `test-every-button-follows-the-button-colour`, `test-one-quantity-stepper`, `test-cart-drawer-thumbnail`); `test-no-brand-story-in-cart-checkout` reads both.
47
+ - Guard: new `scripts/test-cart-drawer-parts.tsx` (red first: the parts module did not exist).
48
+
49
+ - **The popup frame can draw a region that does not block the page** (cookie banner build, PR 5 groundwork; design final 2026-10-23). `components/PopupFrame` takes `modal` (default true, every popup as before). `modal={false}` is for the cookie banner, which is drawn in the same frame (one structure) and never blocked: role `region` (not a modal dialog), no scroll lock, Escape does not close it, focus stays where the visitor had it, and clicks pass through the frame around the panel.
50
+ - Guard: new `scripts/test-popup-frame-region.tsx` (red first: 7 of 11 checks failed; a popup still blocks as before).
51
+
52
+ - **Fix: the spec sheet's PCD drops the inches restatement** (duplicate audit 2026-10-23, D05). The diagram's PCD was read by a second, smaller parser: "6x139.7 (6x5.5)" showed as "139.7 (6x5.5)", and "6X139.7" or "5*120" kept their stud count. New `splitBoltPattern` in `src/render/lib/wheels/plp-fitment-match.ts` is the one split of a bolt-pattern string (stud count, circle text as written); `parseBoltPattern` reads its circles from it, and the spec sheet shows its circle text, so "114.30" keeps its trailing zero.
53
+ - Guard: `scripts/test-spec-sheet.ts` (red first: "139.7 (6x5.5)").
54
+
55
+ - **One list of shadow steps for a card and a Box** (cookie banner build, PR 3; design final 2026-10-23). The site sheet (`src/render/app/globals.css`) writes each step's value once, `--sf-shadow-step`, for `[data-sf-card-shadow=…]` (Site styles' Card shadow) and `[data-sf-box-shadow=…]` (a Box's own Shadow row, efficient-web-builder `lib/content/box-shadow`). `[data-sf-box-shadow]` draws the step, after `.sf-card`, so a picture card's own step wins. Nothing changes until a Box names a step (the builder release with the row).
56
+ - Guard: new `scripts/test-box-shadow-steps.ts` (red first: the Box had no step).
57
+
58
+ - **MAJOR for hosts: the live site draws every popup a site has, and at most ONE opens by itself on a page** (popups and cart drawer plan, PR 6; design final 2026-10-23). New `src/render/components/PopupHost.tsx`: the host app hands in the site's popups (`GET /api/v1/popups`, in the merchant's order) with each popup page's canvas, drawn by the host; the part opens the first popup whose rules allow it (web-builder `lib/popup/rules` `pickAutoPopup`) after that popup's own trigger, opens the popup a `#popup:<slug>` link names, frames it in `PopupFrame`, and remembers a close per popup. New `usePopupScope()`: a Form block inside an open popup records a sent form for After submit.
59
+ - The old site popup (`subscribe-popup`) is in the same list. When it is the pick, the host opens it through its provider (new `openByItself()`); `SubscribePopupProvider` arms no trigger of its own and takes no behaviour props (`autoOpen`, `trigger`, … and `disableAutoTrigger` are removed). Its close and send use the builder's per-popup keys, which are the keys it always wrote; a sent form now keeps it away as After submit says (default Stop).
60
+ - For hosts: `StorefrontProviders` has no `subscribe` prop. Mount `<PopupHost popups={…} />` beside `<SubscribePopup />`, inside the theme carrier.
61
+ - A popup page (`kind: "popup"`) no longer answers at its own address (`pageAnswersAtOwnSlug`).
62
+ - Removed: `src/render/lib/popup/popup-rules.ts`, a copy of web-builder `lib/popup/rules`. New `lib/popup/popup-stores.ts` is the one pair of browser stores.
63
+ - Guard: new `scripts/test-popup-host.tsx` (red first: the host did not exist). `test-popup-rules.ts` keeps the content tests; the rules are tested in web-builder.
64
+
65
+ - **The product hero prints no trust bullets the merchant did not type** (owner ruling 2026-10-23: nothing a shop did not switch on or type is shown). `PRODUCT_HERO_DEFAULTS` was "Free shipping · USA, UK, AUS" and "Lifetime warranty · structural" on every site that had not authored `root.props.heroBullets`; it is now an empty list, so an un-authored page draws no bullet row. **This removes both lines from every live product page that never set its own bullets.** A merchant whose promises are true types them in Page settings → Product hero → Trust bullets; the editor hint still shows the format (`HERO_BULLET_EXAMPLE`).
66
+ - Guard: `scripts/test-product-hero-bullets.tsx` (red first: 4 of 9 failed on main) and `test-product-hero-kinds` (the wheel hero's words no longer end with the two bullets).
67
+
68
+ - **Fix: a "Gap only" Box draws the same on the editor's canvas as on the page, from ONE rule** (GG 2026-10-23, the hartesmetal.com Home name Box: its four text lines stood apart on the canvas and on top of each other live, at Gap -24). The site's sheet (`src/render/app/globals.css`) names both shapes of a Box's block: its child on the page, and the child of the builder's part host inside the editor's item on the canvas. The canvas reads the page's rule, so no copy of it can lag behind; the builder's canvas copy (`components/storefront-editor.css`, builder 37 and later) goes in efficient-web-builder #280. The published page draws the same.
69
+ - Guard: new `scripts/test-gap-only-one-rule.tsx` (red first: the canvas kept 24px and 16px frames with this sheet alone).
70
+
71
+ - **The editor offers the group's office list to the Locations Map** (Hartes office list, option A, Lewis 2026-10-23). New `src/editor/lib/efficient-block-sources.ts` declares the block sources the EFFICIENT backend fills, once, for every host that edits through this package's backend (the admin portal, the storefront's /edit): `group-offices`, labelled "Group offices", for `Footprint`. `lib/efficient-backend` loads it. The Source row shows it with efficient-web-builder's Footprint change (efficient-web-builder #254); the rows come from efficient-backend #3733. A backend that does not answer the source yet fills nothing, and the section keeps its typed offices.
72
+ - Guard: new `scripts/test-efficient-block-sources.ts` (red first: the module did not exist).
4
73
 
5
74
  ## 0.61.0 — 2026-10-23
6
75
 
@@ -1,4 +1,4 @@
1
- "use client";import{$ as zt,K as qt,L as _t,M as Dt,N as Ft,O as Mt,P as ie,R as we,S as Ut,T as Wt,U as Ze,V as $t,X as Qe,Z as Kt,_ as Yt,a as Lt,b as Ot,c as Tt,d as jt,ea as Bt,ja as Ht,ka as Gt,na as et,pa as K,w as _e}from"./chunk-VVQ7KFQO.js";import{i as qe,o as de,v as T}from"./chunk-FCCEAXMM.js";import{a as Rt,c as ne,za as It}from"./chunk-I6VNNXUI.js";import{k as At,l as Se,m as H}from"./chunk-VT346MLP.js";import{a as Xe,b as ir}from"./chunk-Y6SLVHK3.js";var Jt=Xe((ra,Vt)=>{"use strict";var sr="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";Vt.exports=sr});var en=Xe((aa,Qt)=>{"use strict";var cr=Jt();function Xt(){}function Zt(){}Zt.resetWarningCache=Xt;Qt.exports=function(){function t(a,o,s,l,d,p){if(p!==cr){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}t.isRequired=t;function e(){return t}var n={array:t,bigint:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:e,element:t,elementType:t,instanceOf:e,node:t,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:Zt,resetWarningCache:Xt};return n.PropTypes=n,n}});var nn=Xe((sa,tn)=>{"use strict";tn.exports=en()();var oa,ia});import{useEffect as z,useMemo as ze,useRef as ce,useState as g}from"react";var N=ir(nn(),1);import x from"react";function rn(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,a=Array(e);n<e;n++)a[n]=t[n];return a}function lr(t){if(Array.isArray(t))return t}function ln(t,e,n){return(e=gr(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function ur(t,e){var n=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(n!=null){var a,o,s,l,d=[],p=!0,u=!1;try{if(s=(n=n.call(t)).next,e!==0)for(;!(p=(a=s.call(n)).done)&&(d.push(a.value),d.length!==e);p=!0);}catch(v){u=!0,o=v}finally{try{if(!p&&n.return!=null&&(l=n.return(),Object(l)!==l))return}finally{if(u)throw o}}return d}}function pr(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
1
+ "use client";import{$ as zt,K as qt,L as _t,M as Dt,N as Ft,O as Mt,P as ie,R as we,S as Ut,T as Wt,U as Ze,V as $t,X as Qe,Z as Kt,_ as Yt,a as Lt,b as Ot,c as Tt,d as jt,ea as Bt,ja as Ht,ka as Gt,na as et,pa as K,w as _e}from"./chunk-JBLNH3P5.js";import{i as qe,o as de,v as T}from"./chunk-A3PXLZZP.js";import{a as Rt,c as ne,za as It}from"./chunk-IT33OG3G.js";import{k as At,l as Se,m as H}from"./chunk-XKTD3BPL.js";import{a as Xe,b as ir}from"./chunk-Y6SLVHK3.js";var Jt=Xe((ra,Vt)=>{"use strict";var sr="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";Vt.exports=sr});var en=Xe((aa,Qt)=>{"use strict";var cr=Jt();function Xt(){}function Zt(){}Zt.resetWarningCache=Xt;Qt.exports=function(){function t(a,o,s,l,d,p){if(p!==cr){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}t.isRequired=t;function e(){return t}var n={array:t,bigint:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:e,element:t,elementType:t,instanceOf:e,node:t,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:Zt,resetWarningCache:Xt};return n.PropTypes=n,n}});var nn=Xe((sa,tn)=>{"use strict";tn.exports=en()();var oa,ia});import{useEffect as z,useMemo as ze,useRef as ce,useState as g}from"react";var N=ir(nn(),1);import x from"react";function rn(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,a=Array(e);n<e;n++)a[n]=t[n];return a}function lr(t){if(Array.isArray(t))return t}function ln(t,e,n){return(e=gr(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function ur(t,e){var n=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(n!=null){var a,o,s,l,d=[],p=!0,u=!1;try{if(s=(n=n.call(t)).next,e!==0)for(;!(p=(a=s.call(n)).done)&&(d.push(a.value),d.length!==e);p=!0);}catch(v){u=!0,o=v}finally{try{if(!p&&n.return!=null&&(l=n.return(),Object(l)!==l))return}finally{if(u)throw o}}return d}}function pr(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
2
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function an(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,a)}return n}function on(t){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?an(Object(n),!0).forEach(function(a){ln(t,a,n[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):an(Object(n)).forEach(function(a){Object.defineProperty(t,a,Object.getOwnPropertyDescriptor(n,a))})}return t}function dr(t,e){if(t==null)return{};var n,a,o=mr(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(a=0;a<s.length;a++)n=s[a],e.indexOf(n)===-1&&{}.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function mr(t,e){if(t==null)return{};var n={};for(var a in t)if({}.hasOwnProperty.call(t,a)){if(e.indexOf(a)!==-1)continue;n[a]=t[a]}return n}function un(t,e){return lr(t)||ur(t,e)||yr(t,e)||pr()}function fr(t,e){if(typeof t!="object"||!t)return t;var n=t[Symbol.toPrimitive];if(n!==void 0){var a=n.call(t,e);if(typeof a!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(t)}function gr(t){var e=fr(t,"string");return typeof e=="symbol"?e:e+""}function tt(t){"@babel/helpers - typeof";return tt=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},tt(t)}function yr(t,e){if(t){if(typeof t=="string")return rn(t,e);var n={}.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?rn(t,e):void 0}}var j=function(e,n,a){var o=!!a,s=x.useRef(a);x.useEffect(function(){s.current=a},[a]),x.useEffect(function(){if(!o||!e)return function(){};var l=function(){if(s.current)return s.current.apply(s,arguments)};return e.on(n,l),function(){e.off(n,l)}},[o,n,e,s])},nt=function(e){var n=x.useRef(e);return x.useEffect(function(){n.current=e},[e]),n.current},me=function(e){return e!==null&&tt(e)==="object"},hr=function(e){return me(e)&&typeof e.then=="function"},vr=function(e){return me(e)&&typeof e.elements=="function"&&typeof e.createToken=="function"&&typeof e.createPaymentMethod=="function"&&typeof e.confirmCardPayment=="function"},sn="[object Object]",br=function t(e,n){if(e===n)return!0;if(!me(e)||!me(n))return e===n;var a=Array.isArray(e),o=Array.isArray(n);if(a!==o)return!1;var s=Object.prototype.toString.call(e)===sn,l=Object.prototype.toString.call(n)===sn;if(s!==l)return!1;if(!s&&!a)return e===n;var d=Object.keys(e),p=Object.keys(n);if(d.length!==p.length)return!1;for(var u={},v=0;v<d.length;v+=1)u[d[v]]=!0;for(var b=0;b<p.length;b+=1)u[p[b]]=!0;var f=Object.keys(u);if(f.length!==d.length)return!1;var y=e,A=n,k=function(S){return t(y[S],A[S])};return f.every(k)},pn=function(e,n,a){return me(e)?Object.keys(e).reduce(function(o,s){var l=!me(n)||!br(e[s],n[s]);return a.includes(s)?(l&&console.warn("Unsupported prop change: options.".concat(s," is not a mutable property.")),o):l?on(on({},o||{}),{},ln({},s,e[s])):o},null):null},dn="Invalid prop `stripe` supplied to `Elements`. We recommend using the `loadStripe` utility from `@stripe/stripe-js`. See https://stripe.com/docs/stripe-js/react#elements-props-stripe for details.",cn=function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:dn;if(e===null||vr(e))return e;throw new Error(n)},xr=function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:dn;if(hr(e))return{tag:"async",stripePromise:Promise.resolve(e).then(function(o){return cn(o,n)})};var a=cn(e,n);return a===null?{tag:"empty"}:{tag:"sync",stripe:a}},kr=function(e){!e||!e._registerWrapper||!e.registerAppInfo||(e._registerWrapper({name:"react-stripe-js",version:"6.12.0"}),e.registerAppInfo({name:"react-stripe-js",version:"6.12.0",url:"https://stripe.com/docs/stripe-js/react"}))},De=x.createContext(null);De.displayName="ElementsContext";var mn=function(e,n){if(!e)throw new Error("Could not find Elements context; You need to wrap the part of your app that ".concat(n," in an <Elements> provider."));return e},at=function(e){var n=e.stripe,a=e.options,o=e.children,s=x.useMemo(function(){return xr(n)},[n]),l=x.useState(function(){return{stripe:s.tag==="sync"?s.stripe:null,elements:s.tag==="sync"?s.stripe.elements(a):null}}),d=un(l,2),p=d[0],u=d[1];x.useEffect(function(){var f=!0,y=function(k){u(function(C){return C.stripe?C:{stripe:k,elements:k.elements(a)}})};return s.tag==="async"&&!p.stripe?s.stripePromise.then(function(A){A&&f&&y(A)}):s.tag==="sync"&&!p.stripe&&y(s.stripe),function(){f=!1}},[s,p,a]);var v=nt(n);x.useEffect(function(){v!==null&&v!==n&&console.warn("Unsupported prop change on Elements: You cannot change the `stripe` prop after setting it.")},[v,n]);var b=nt(a);return x.useEffect(function(){if(p.elements){var f=pn(a,b,["clientSecret","fonts"]);f&&p.elements.update(f)}},[a,b,p.elements]),x.useEffect(function(){kr(p.stripe)},[p.stripe]),x.createElement(De.Provider,{value:p},o)};at.propTypes={stripe:N.default.any,options:N.default.object};var fn=function(e){var n=x.useContext(De);return mn(n,e)},gn=function(){var e=fn("calls useElements()"),n=e.elements;return n},Cr=function(e){var n=e.children,a=fn("mounts <ElementsConsumer>");return n(a)};Cr.propTypes={children:N.default.func.isRequired};var Sr=x.createContext(null);Sr.displayName="CheckoutContext";var yn=x.createContext(null);yn.displayName="CheckoutSdkContext";var rt=function(e){var n=x.useContext(yn),a=x.useContext(De);if(n){if(a)throw new Error("You cannot wrap the part of your app that ".concat(e," in both a checkout provider and <Elements> provider."));return n}else return mn(a,e)},wr=["mode"],Pr=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},E=function(e,n,a){var o="".concat(Pr(e),"Element"),s=function(u){var v=u.id,b=u.className,f=u.options,y=f===void 0?{}:f,A=u.onBlur,k=u.onFocus,C=u.onReady,S=u.onChange,F=u.onEscape,O=u.onClick,X=u.onLoadError,G=u.onLoaderStart,fe=u.onNetworksChange,re=u.onConfirm,Ee=u.onCancel,ae=u.onShippingAddressChange,Re=u.onShippingRateChange,ge=u.onSavedPaymentMethodRemove,Ie=u.onSavedPaymentMethodUpdate,ye=u.onAvailablePaymentMethodsChange,ee=rt("mounts <".concat(o,">")),te="elements"in ee?ee.elements:null,M="checkoutSdk"in ee?ee.checkoutSdk:null,he=x.useState(null),le=un(he,2),I=le[0],ve=le[1],_=x.useRef(null),oe=x.useRef(null);j(I,"blur",A),j(I,"focus",k),j(I,"escape",F),j(I,"click",O),j(I,"loaderror",X),j(I,"loaderstart",G),j(I,"networkschange",fe),j(I,"confirm",re),j(I,"cancel",Ee),j(I,"shippingaddresschange",ae),j(I,"shippingratechange",Re),j(I,"savedpaymentmethodremove",ge),j(I,"savedpaymentmethodupdate",Ie),j(I,"availablepaymentmethodschange",ye),j(I,"change",S);var U;C&&(e==="expressCheckout"?U=C:U=function(){C(I)}),j(I,"ready",U),x.useLayoutEffect(function(){if(_.current===null&&oe.current!==null&&(te||M)){var w=null;if(M){var B=M,be=M;switch(e){case"paymentForm":w=be.createForm(y);break;case"payment":w=B.createPaymentElement(y);break;case"address":if("mode"in y){var xe=y.mode,He=dr(y,wr);if(xe==="shipping")w=B.createShippingAddressElement(He);else if(xe==="billing")w=B.createBillingAddressElement(He);else throw new Error("Invalid options.mode. mode must be 'billing' or 'shipping'.")}else throw new Error("You must supply options.mode. mode must be 'billing' or 'shipping'.");break;case"expressCheckout":w=B.createExpressCheckoutElement(y);break;case"currencySelector":w=M.createCurrencySelectorElement();break;case"taxId":w=B.createTaxIdElement(y);break;case"contactDetails":w=B.createContactDetailsElement();break;case"linkSignup":if("createLinkSignupElement"in M)w=M.createLinkSignupElement(y);else throw new Error("<LinkSignupElement> requires <CheckoutElementsProvider> and is not supported inside <CheckoutFormProvider>.");break;case"terms":w=B.createTermsElement(y);break;default:throw new Error("<".concat(o,"> is not supported inside a checkout provider. Use an <Elements> provider instead."))}}else te&&(w=te.create(e,y));_.current=w,ve(w),w&&w.mount(oe.current)}},[te,M,y]);var ue=nt(y);return x.useEffect(function(){if(_.current){var w=pn(y,ue,["paymentRequest"]);w&&"update"in _.current&&_.current.update(w)}},[y,ue]),x.useLayoutEffect(function(){return function(){if(_.current&&typeof _.current.destroy=="function")try{_.current.destroy(),_.current=null}catch{}}},[]),x.createElement("div",{id:v,className:b,ref:oe})},l=function(u){rt("mounts <".concat(o,">"));var v=u.id,b=u.className;return x.createElement("div",{id:v,className:b})},d=n?l:s;return d.propTypes={id:N.default.string,className:N.default.string,onChange:N.default.func,onBlur:N.default.func,onFocus:N.default.func,onReady:N.default.func,onEscape:N.default.func,onClick:N.default.func,onLoadError:N.default.func,onLoaderStart:N.default.func,onNetworksChange:N.default.func,onConfirm:N.default.func,onCancel:N.default.func,onShippingAddressChange:N.default.func,onShippingRateChange:N.default.func,onSavedPaymentMethodRemove:N.default.func,onSavedPaymentMethodUpdate:N.default.func,onAvailablePaymentMethodsChange:N.default.func,options:N.default.object},d.displayName=o,d.__elementType=e,d},R=typeof window>"u",Nr=x.createContext(null);Nr.displayName="EmbeddedCheckoutProviderContext";var hn=function(){var e=rt("calls useStripe()"),n=e.stripe;return n},la=E("auBankAccount",R),ua=E("card",R),pa=E("cardNumber",R),da=E("cardExpiry",R),ma=E("cardCvc",R),fa=E("currencySelector",R),ga=E("iban",R),vn=E("payment",R),ya=E("expressCheckout",R),ha=E("paymentRequestButton",R),va=E("linkAuthentication",R),ba=E("linkSignup",R),xa=E("contactDetails",R),ka=E("address",R),Ca=E("shippingAddress",R),Sa=E("paymentMethodMessaging",R),wa=E("taxId",R),Pa=E("issuingCardNumberDisplay",R),Na=E("issuingCardCvcDisplay",R),Ea=E("issuingCardExpiryDisplay",R),Ra=E("issuingCardPinDisplay",R),Ia=E("issuingCardCopyButton",R),Aa=E("terms",R);function Ue(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ue=function(e){return typeof e}:Ue=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ue(t)}var kn="dahlia",Er=function(e){return e===3?"v3":e},Cn="https://js.stripe.com",Rr="".concat(Cn,"/").concat(kn,"/stripe.js"),Ir=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,Ar=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,bn="loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used",Lr=function(e){return Ir.test(e)||Ar.test(e)},Or=function(){for(var e=document.querySelectorAll('script[src^="'.concat(Cn,'"]')),n=0;n<e.length;n++){var a=e[n];if(Lr(a.src))return a}return null},xn=function(e){var n=e&&!e.advancedFraudSignals?"?advancedFraudSignals=false":"",a=document.createElement("script");a.src="".concat(Rr).concat(n);var o=document.head||document.body;if(!o)throw new Error("Expected document.body not to be null. Stripe.js requires a <body> element.");return o.appendChild(a),a},Tr=function(e,n){!e||!e._registerWrapper||e._registerWrapper({name:"stripe-js",version:"9.17.0",startTime:n})},Pe=null,Fe=null,Me=null,jr=function(e){return function(n){e(new Error("Failed to load Stripe.js",{cause:n}))}},qr=function(e,n){return function(){window.Stripe?e(window.Stripe):n(new Error("Stripe.js not available"))}},_r=function(e){return Pe!==null?Pe:(Pe=new Promise(function(n,a){if(typeof window>"u"||typeof document>"u"){n(null);return}if(window.Stripe&&e&&console.warn(bn),window.Stripe){n(window.Stripe);return}try{var o=Or();if(o&&e)console.warn(bn);else if(!o)o=xn(e);else if(o&&Me!==null&&Fe!==null){var s;o.removeEventListener("load",Me),o.removeEventListener("error",Fe),(s=o.parentNode)===null||s===void 0||s.removeChild(o),o=xn(e)}Me=qr(n,a),Fe=jr(a),o.addEventListener("load",Me),o.addEventListener("error",Fe)}catch(l){a(l);return}}),Pe.catch(function(n){return Pe=null,Promise.reject(n)}))},Dr=function(e,n,a){if(e===null)return null;var o=n[0];if(typeof o!="string")throw new Error("Expected publishable key to be of type string, got type ".concat(Ue(o)," instead."));var s=o.match(/^pk_test/),l=Er(e.version),d=kn;s&&l!==d&&console.warn("Stripe.js@".concat(l," was loaded on the page, but @stripe/stripe-js@").concat("9.17.0"," expected Stripe.js@").concat(d,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var p=e.apply(void 0,n);return Tr(p,a),p},Ne,Sn=!1,wn=function(){return Ne||(Ne=_r(null).catch(function(e){return Ne=null,Promise.reject(e)}),Ne)};Promise.resolve().then(function(){return wn()}).catch(function(t){Sn||console.warn(t)});var Pn=function(){for(var e=arguments.length,n=new Array(e),a=0;a<e;a++)n[a]=arguments[a];Sn=!0;var o=Date.now();return wn().then(function(s){return Dr(s,n,o)})};var Fr="sf:gclid",Mr="sf:fbclid",Ur=2160*60*60*1e3;function Rn(){return typeof window<"u"}function Nn(t){let e=Se.getItem(t);if(!e)return"";try{let{v:n,t:a}=JSON.parse(e);return!n||typeof a!="number"||Date.now()-a>Ur?"":n}catch{return""}}function En(t){if(!Rn())return"";let e=t.replace(/([.$?*|{}()[\]\\/+^])/g,"\\$1"),n=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return n?decodeURIComponent(n[1]):""}function In(){if(!Rn())return{};let t=Nn(Fr),e=Nn(Mr),n=En("_fbp"),a=En("_fbc");!a&&e&&(a=`fb.1.${Date.now()}.${e}`);let o={};return t&&(o.gclid=t),e&&(o.fbclid=e),n&&(o.fbp=n),a&&(o.fbc=a),o}var An="sf:meta-purchases",Wr=20;function On(){return typeof window>"u"||window.parent!==window}function $r(...t){try{if(On()||typeof window.fbq!="function")return;window.fbq(...t)}catch{}}var Ln=new Set;function Kr(t){if(Ln.has(t))return!1;Ln.add(t);try{let e=JSON.parse(Se.getItem(An)??"[]");if(e.includes(t))return!1;Se.setItem(An,JSON.stringify([...e,t].slice(-Wr)))}catch{}return!0}function Yr(t){return[...new Set(t.filter(we).flatMap(e=>e.components.map(n=>n.partNumber)))]}function Tn(t){let e=t.confirmation;On()||!Kr(e.orderNumber)||$r("track","Purchase",{value:Number(e.grandTotal),currency:e.currency,content_type:"product",content_ids:Yr(t.lines)},{eventID:e.orderNumber})}var ot="checkout-afterpay-context",We="checkout-gocardless-context",it="checkout-zip-context",$e="checkout-klarna-context";function zr({evidence:t,parked:e}){return t?{action:"capture",evidence:t,parked:e}:e?{action:"settle",parked:e}:{action:"ignore"}}function Br(t,e){let n=t.getItem(e);if(t.removeItem(e),!n)return null;try{return JSON.parse(n)}catch{return null}}var jn={name:"Afterpay",legParam:"afterpay",legValues:["confirm","cancel"],storageKey:ot,evidenceFrom(t,e){return e==="cancel"||(t.get("status")??"").toUpperCase()==="CANCELLED"?null:t.get("orderToken")},requestFrom:t=>({token:t})},qn={name:"Zip",legParam:"zip",legValues:["return"],storageKey:it,evidenceFrom(t){let e=(t.get("result")??"").toLowerCase();return e==="cancelled"||e==="declined"?null:t.get("checkoutId")},requestFrom:t=>({checkoutId:t})};async function st(t,e){let n=new URLSearchParams(e.search),a=n.get(t.legParam);if(!a||!t.legValues.includes(a))return;let o=Br(e.storage,t.storageKey),s=t.evidenceFrom(n,a);e.scrubQuery();let l=zr({evidence:s,parked:o});if(l.action!=="ignore"){if(e.page.clearCart(),l.action==="settle"){e.page.note(`The ${t.name} payment was not completed \u2014 our team will follow up on payment.`),e.page.land(l.parked.confirmation);return}e.page.setConfirming(!0);try{let d=await e.capture(t.requestFrom(l.evidence));d.status==="paid"?e.page.markPaid():e.page.note(`${t.name} declined the payment \u2014 our team will follow up on payment.`),e.page.land(l.parked?.confirmation??d)}catch{l.parked?(e.page.note(`We could not confirm the ${t.name} payment \u2014 our team will follow up on payment.`),e.page.land(l.parked.confirmation)):e.page.fail(`We could not confirm your ${t.name} payment. Please contact us before trying again \u2014 your payment may already have been taken.`)}finally{e.page.setConfirming(!1)}}}import{Fragment as q,jsx as r,jsxs as c}from"react/jsx-runtime";function _n(t){let e=t.indexOf(`
3
3
  `);return e===-1?[t,""]:[t.slice(0,e),t.slice(e+1)]}function Dn(t,{canParkContext:e}={canParkContext:!0}){let n=t.paymentMethods,a=[];return n.includes("card")&&a.push({key:"card",title:"Card",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"VISA \xB7 MC \xB7 AMEX"})}),n.includes("paypal")&&t.paypalClientId&&a.push({key:"paypal",title:"PayPal",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAYPAL \xB7 CARDS"})}),n.includes("afterpay")&&a.push({key:"afterpay",title:"Afterpay",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"4 \xD7 INTEREST-FREE"})}),n.includes("square")&&t.squareApplicationId&&t.squareLocationId&&a.push({key:"square",title:"Card (Square)",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"VISA \xB7 MC \xB7 AMEX"})}),n.includes("gocardless")&&e&&a.push({key:"gocardless",title:"Bank Direct Debit",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY BY BANK"})}),n.includes("zip")&&a.push({key:"zip",title:"Zip",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY IN 4"})}),n.includes("klarna")&&e&&a.push({key:"klarna",title:"Klarna",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY LATER"})}),a.push({key:"bank",title:"Bank transfer",body:null,price:r("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Invoiced"})}),a}function ut({site:t,logo:e,preview:n=!1}){let{items:a,totals:o,coupon:s,refuseCoupon:l,deliveryOptions:d,shippingMethodId:p,setShippingMethodId:u,identify:v,clearCapturedCart:b}=Ze(),f=d.find(i=>i.id===p)?.pickupLocation??null,{country:y,countries:A,activeCountry:k,formatMoney:C}=ie(),[S,F]=g(()=>Dn(t)[0].key),[O,X]=g(!0);z(()=>{X(At(H))},[]);let[G,fe]=g(!1),[re,Ee]=g(""),[ae,Re]=g(""),[ge,Ie]=g(""),[ye,ee]=g(""),[te,M]=g(""),[he,le]=g(""),[I,ve]=g(""),[_,oe]=g(""),[U,ue]=g(()=>y||A[0]?.code||""),[w,B]=g(""),[be,xe]=g([]),$n=ze(()=>A.find(i=>i.code===U)??k,[A,U,k])?.postalLabel||"Postal Code",Kn=be[0]?.divisionType||"State / Province";z(()=>{if(!U){xe([]);return}let i=!1;return T.listCountrySubdivisions(U).then(m=>{i||(xe(m),B(""))}),()=>{i=!0}},[U]);let[Z,pt]=g(null),[dt,mt]=g([]),[Ae,Le]=g("new"),[Ge,ft]=g(!1),[gt,Yn]=g("Home"),[yt,ht]=g(null),[W]=g(()=>Gt()),[Oe,$]=g(null),[vt,ke]=g(null),[bt,zn]=g(null),[Bn,Hn]=g(!1),[Gn,Vn]=g(!1),[V,Ve]=g(null),[xt,pe]=g(!1),[kt,Q]=g(null),[Jn,Xn]=g(!1),[Zn,Ct]=g(!1),[Qn,er]=g(!1),[tr,St]=g(!1),wt=ce(!1);z(()=>{n||wt.current||!a.some(we)||(wt.current=!0,qt({lines:a,currency:o.currency,value:o.subtotal-o.discount,coupon:s?.valid?s.code:void 0}))},[a,o,s,n]),z(()=>{v(re,ae.trim()||void 0)},[re,ae,v]);let Pt=ce(null),[Te,nr]=g(null);z(()=>{let i=Pt.current;if(!Te||!i)return;let m=()=>i.style.setProperty("--sf-checkout-header-h",`${Te.offsetHeight}px`);m();let h=new ResizeObserver(m);return h.observe(Te),()=>h.disconnect()},[Te]),z(()=>{let i=h=>({setConfirming:h,land:$,markPaid:()=>pe(!0),note:Q,fail:ke,clearCart:b}),m={search:window.location.search,storage:H,scrubQuery:()=>window.history.replaceState(null,"",window.location.pathname)};st(jn,{...m,capture:T.captureAfterpayPayment,page:i(Xn)}),st(qn,{...m,capture:T.captureZipPayment,page:i(er)})},[]),z(()=>{let m=new URLSearchParams(window.location.search).get("gocardless");if(m!=="confirm"&&m!=="cancel")return;let h=H.getItem(We);if(H.removeItem(We),window.history.replaceState(null,"",window.location.pathname),!h)return;let L;try{L=JSON.parse(h)}catch{return}if(b(),m==="cancel"){Q("The direct debit was not set up \u2014 our team will follow up on payment."),$(L.confirmation);return}Ct(!0),T.completeGocardlessPayment({idempotencyKey:L.idempotencyKey}).then(P=>{P.status==="paid"?pe(!0):P.status==="declined"?Q("The direct debit was declined \u2014 our team will follow up on payment."):Q("Your direct debit is set up \u2014 the payment is collecting and will clear in a few days.")}).catch(()=>{Q("We could not confirm the direct debit \u2014 our team will follow up on payment.")}).finally(()=>{$(L.confirmation),Ct(!1)})},[]),z(()=>{let i=new URLSearchParams(window.location.search),m=i.get("klarna");if(m!=="confirm"&&m!=="cancel")return;let h=H.getItem($e);H.removeItem($e);let L=i.get("authorization_token");if(window.history.replaceState(null,"",window.location.pathname),!h)return;let P;try{P=JSON.parse(h)}catch{return}if(b(),m==="cancel"||!L){Q("The Klarna payment was not completed \u2014 our team will follow up on payment."),$(P.confirmation);return}St(!0),T.captureKlarnaPayment({idempotencyKey:P.idempotencyKey,authorizationToken:L}).then(D=>{D.status==="paid"?pe(!0):D.status==="declined"?Q("Klarna declined the payment \u2014 our team will follow up on payment."):Q("Your Klarna payment is being reviewed \u2014 we'll confirm the outcome shortly.")}).catch(()=>{Q("We could not confirm the Klarna payment \u2014 our team will follow up on payment.")}).finally(()=>{$(P.confirmation),St(!1)})},[]);function Nt(i){let[m,h]=_n(i.address);ee(m),M(h),le(i.city),ve(i.zip_code),i.country&&ue(i.country),i.phone&&oe(i.phone)}z(()=>{let i=!1;return(async()=>{try{let[m,h,L]=await Promise.all([de.me(),de.myProfile().catch(()=>null),de.myAddresses().catch(()=>[])]);if(i)return;pt(m);let P=L.filter(Ce=>Ce.is_active);mt(P),Ee(m.email);let D=(h?.contact_name??"").split(/\s+/);Re(m.first_name||D[0]||""),Ie(m.last_name||D.slice(1).join(" "));let J=m.phone||h?.phone;J&&oe(J);let Je=P.find(Ce=>Ce.id===m.default_delivery_location)??P[0];if(Je)Le(Je.id),Nt(Je);else if(h){let[Ce,or]=_n(h.address??"");ee(Ce),M(or),le(h.city??""),ve(h.zip_code??""),h.country&&ue(h.country)}}catch{}})(),()=>{i=!0}},[]);function rr(){de.logout(),pt(null),mt([]),Le("new"),ft(!1)}let je=ze(()=>Dn(t,{canParkContext:O}),[t,O]);z(()=>{je.some(i=>i.key===S)||F(je[0].key)},[je,S]);let Et=te.trim()?`${ye}
4
4
  ${te.trim()}`:ye;async function ar(){if(n||G||a.length===0||o.repricing)return;let i=a.filter(we).flatMap(m=>jt(m.components,m.qty));if(i.length===0){ke("Pick a size on each wheel's product page before checking out.");return}fe(!0),ke(null);try{let m=Z?T.createOrderAuthed:T.createOrder,h=Ht(),L=await m({customer:{email:re,name:`${ae} ${ge}`.trim(),phone:_.trim()||void 0,address:Et,city:he,state:w||void 0,zipCode:I,country:U},items:i,currency:o.currency,idempotencyKey:W,shippingMethodId:p??void 0,couponCode:Ot(s),...h==="denied"?{}:In(),...h?{adConsent:h}:{}});if(_t({confirmation:L,lines:a,adsSendTo:t.googleAdsId&&t.googleAdsConversionLabel?`${t.googleAdsId}/${t.googleAdsConversionLabel}`:null}),Tn({confirmation:L,lines:a}),b(),Z&&Ge&&Ae==="new")try{await de.createAddress({label:gt.trim()||"Home",contact_name:`${ae} ${ge}`.trim(),phone:_.trim(),address:Et,city:he,zip_code:I,country:U}),ht("Address saved to your account.")}catch{ht("We couldn't save the address to your account \u2014 you can add it under Account \u2192 Addresses.")}if(S==="card"&&t.paymentMethods.includes("card")){let P=await T.createPaymentIntent({idempotencyKey:W});Ve(L),zn(P)}else if(S==="paypal"&&t.paymentMethods.includes("paypal"))Ve(L),Hn(!0);else if(S==="afterpay"&&t.paymentMethods.includes("afterpay")){let P=window.location.origin,D=await T.createAfterpayCheckout({idempotencyKey:W,confirmUrl:`${P}/checkout?afterpay=confirm`,cancelUrl:`${P}/checkout?afterpay=cancel`}),J={idempotencyKey:W,confirmation:L};H.setItem(ot,JSON.stringify(J)),window.location.assign(D.redirectCheckoutUrl);return}else if(S==="square"&&t.paymentMethods.includes("square"))Ve(L),Vn(!0);else if(S==="gocardless"&&t.paymentMethods.includes("gocardless")){let P=window.location.origin,D=await T.createGocardlessBillingRequest({idempotencyKey:W,confirmUrl:`${P}/checkout?gocardless=confirm`,cancelUrl:`${P}/checkout?gocardless=cancel`}),J={idempotencyKey:W,confirmation:L};H.setItem(We,JSON.stringify(J)),window.location.assign(D.authorisationUrl);return}else if(S==="zip"&&t.paymentMethods.includes("zip")){let P=window.location.origin,D=await T.createZipCheckout({idempotencyKey:W,redirectUrl:`${P}/checkout?zip=return`}),J={idempotencyKey:W,confirmation:L};H.setItem(it,JSON.stringify(J)),window.location.assign(D.redirectUrl);return}else if(S==="klarna"&&t.paymentMethods.includes("klarna")){let P=window.location.origin,D=await T.createKlarnaCheckout({idempotencyKey:W,confirmUrl:`${P}/checkout?klarna=confirm`,cancelUrl:`${P}/checkout?klarna=cancel`}),J={idempotencyKey:W,confirmation:L};H.setItem($e,JSON.stringify(J)),window.location.assign(D.redirectUrl);return}else $(L)}catch(m){let h=Tt(m);h?(l(h),ke(`${h} Your order has not been placed. Place it again to continue without the code.`)):ke(m instanceof qe?m.message:"Could not place the order. Please try again."),fe(!1)}}return Oe?c("div",{className:"flex min-h-screen flex-col items-center justify-center gap-4 bg-bg px-6 text-center text-fg",children:[r("h1",{className:"font-display text-3xl",children:xt?"Payment received":"Order received"}),c("p",{className:"text-fg-dim",children:[xt?c(q,{children:["Thank you \u2014 your payment for order"," ",r("span",{className:"font-mono text-fg",children:Oe.orderNumber})," has gone through."," "]}):c(q,{children:["Thank you \u2014 your order ",r("span",{className:"font-mono text-fg",children:Oe.orderNumber})," is being reviewed by our team."," "]}),Z?c(q,{children:["Track it under"," ",r(ne,{href:"/account/orders",className:"text-accent underline",children:"your orders"}),"."]}):r(q,{children:"We\u2019ve emailed you a link to set a password and track it."})]}),kt&&r("p",{className:"text-sm text-fg-dim",children:kt}),yt&&r("p",{className:"text-sm text-fg-dim",children:yt}),!Z&&c("p",{className:"text-sm text-fg-dim",children:["You can also"," ",r(ne,{href:`/track?order=${encodeURIComponent(Oe.orderNumber)}`,className:"text-accent underline",children:"track this order"})," ","anytime with just your order number and email \u2014 no password needed."]}),r(ne,{href:"/wheels",className:"mt-2 border-2 border-line px-6 py-3 font-mono text-[12px] uppercase tracking-[0.24em] hover:border-accent",children:"Continue browsing"})]}):Jn?c("div",{className:"flex min-h-screen flex-col items-center justify-center gap-4 bg-bg px-6 text-center text-fg",children:[r("h1",{className:"font-display text-3xl",children:"Confirming your payment\u2026"}),r("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Checking with Afterpay \u2014 one moment."})]}):Zn?c("div",{className:"flex min-h-screen flex-col items-center justify-center gap-4 bg-bg px-6 text-center text-fg",children:[r("h1",{className:"font-display text-3xl",children:"Setting up your direct debit\u2026"}),r("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Confirming with GoCardless \u2014 one moment."})]}):Qn?c("div",{className:"flex min-h-screen flex-col items-center justify-center gap-4 bg-bg px-6 text-center text-fg",children:[r("h1",{className:"font-display text-3xl",children:"Confirming your payment\u2026"}),r("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Checking with Zip \u2014 one moment."})]}):tr?c("div",{className:"flex min-h-screen flex-col items-center justify-center gap-4 bg-bg px-6 text-center text-fg",children:[r("h1",{className:"font-display text-3xl",children:"Confirming your payment\u2026"}),r("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Checking with Klarna \u2014 one moment."})]}):bt?r(Hr,{payment:bt,onPaid:()=>{pe(!0),$(V)},onSkip:()=>$(V)}):Bn&&V?r(Jr,{confirmation:V,clientId:t.paypalClientId??"",idemKey:W,onPaid:()=>{pe(!0),$(V)},onSkip:()=>$(V)}):Gn&&V?r(Zr,{confirmation:V,applicationId:t.squareApplicationId??"",locationId:t.squareLocationId??"",environment:t.squareEnvironment??"production",idemKey:W,onPaid:()=>{pe(!0),$(V)},onSkip:()=>$(V)}):c("div",{ref:Pt,className:"bg-bg text-fg",children:[c("header",{ref:nr,className:"sticky top-0 z-30 grid grid-cols-[1fr_auto_1fr] items-center gap-8 border-b border-line px-[var(--sf-site-gutter,40px)] py-6 backdrop-blur-md max-[640px]:px-[min(20px,var(--sf-site-gutter,40px))] max-[640px]:py-4",style:{background:"color-mix(in oklab, var(--bg) 92%, transparent)"},children:[c(ne,{href:"/",className:"inline-flex items-center gap-3 font-mono text-[13px] uppercase tracking-[0.26em] text-fg-dim transition-colors hover:text-accent",children:["\u2190",r("span",{className:"max-[640px]:hidden",children:"Back to shop"})]}),r(ne,{href:"/","aria-label":`${t.name} home`,className:"inline-flex items-center justify-center",children:r(Kt,{variant:"header",scrolled:!0,src:e?.url??null,reverse:e?.reverse??!1,reversedSrc:e?.reversed??null,inkIsDark:e?.inkIsDark??null,size:e?.size??"medium",sizePx:e?.sizePx??null,siteName:t.name})}),t.cardPayments?c("span",{className:"flex items-center justify-end gap-3 font-mono text-[12px] uppercase tracking-[0.26em] text-fg-dim",children:[r("span",{className:"text-green",children:"\u25CF"}),r("span",{className:"max-[640px]:hidden",children:"Encrypted \xB7"})," Stripe"]}):r("span",{})]}),c("section",{className:"mx-auto flex max-w-[var(--sf-site-width,1600px)] flex-wrap items-center justify-between gap-x-8 gap-y-3 border-b border-line bg-surface px-[var(--sf-site-gutter,40px)] py-4 font-mono text-[13px] font-medium uppercase tracking-[0.24em] text-fg max-[1100px]:px-[min(24px,var(--sf-site-gutter,40px))]",children:[r("span",{className:"inline-flex items-center bg-accent px-3 py-1 font-bold text-bg",children:"Checkout"}),r("nav",{"aria-label":"Checkout steps",className:"flex flex-wrap items-center gap-5",children:[{n:"01",label:"Cart",state:"done"},{n:"02",label:"Ship & pay",state:"active"},{n:"03",label:"Confirmed",state:"pending"}].map(i=>c("span",{className:["relative flex items-center gap-2 transition-colors",i.state==="pending"?"text-fg-dim":"text-fg",i.state==="active"?"font-bold after:absolute after:inset-x-0 after:-bottom-1 after:h-[2px] after:bg-accent":""].join(" "),children:[r("span",{className:i.state==="done"?"text-accent font-bold":"",children:i.n}),r("span",{children:i.label})]},i.n))})]}),c("main",{className:"mx-auto grid max-w-[var(--sf-site-width,1600px)] grid-cols-[1fr_420px] items-start gap-16 px-[var(--sf-site-gutter,40px)] pt-10 pb-[100px] max-[1100px]:grid-cols-1 max-[1100px]:gap-10 max-[1100px]:px-[min(24px,var(--sf-site-gutter,40px))] max-[1100px]:pt-8 max-[1100px]:pb-20",children:[c("div",{children:[c(Ke,{num:"N\xB0 01",title:"Contact",children:[r(K,{label:"Email",hint:Z?c(q,{children:["Signed in \xB7"," ",r("button",{type:"button",onClick:rr,className:"underline transition-colors hover:text-accent",children:"Not you? Sign out"})]}):void 0,children:r("input",{type:"email",value:re,onChange:i=>Ee(i.target.value),placeholder:"you@example.com",readOnly:Z!==null,className:Y+(Z?" opacity-70":"")})}),c(Mn,{children:[r(K,{label:"First name",children:r("input",{type:"text",value:ae,onChange:i=>Re(i.target.value),className:Y})}),r(K,{label:"Last name",children:r("input",{type:"text",value:ge,onChange:i=>Ie(i.target.value),className:Y})})]})]}),c(Ke,{num:"N\xB0 02",title:f?"Collection":"Shipping address",children:[f?c("div",{className:"grid gap-2 text-[14px] leading-[1.6]",children:[r("span",{className:"font-medium",children:f.name}),[f.address,f.city,f.state,f.zipCode,f.country].filter(Boolean).length>0&&r("span",{className:"opacity-80",children:[f.address,f.city,f.state,f.zipCode,f.country].filter(Boolean).join(", ")}),f.openingHours&&r("span",{className:"opacity-80",children:f.openingHours}),f.instructions&&r("span",{className:"opacity-80",children:f.instructions}),r("span",{className:"mt-1 font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"No delivery address needed"})]}):c(q,{children:[Z!==null&&dt.length>0&&c("div",{className:"grid gap-3",children:[dt.map(i=>r(Ye,{active:Ae===i.id,onClick:()=>{Le(i.id),Nt(i)},title:i.label,body:i.formatted_address,price:null},i.id)),r(Ye,{active:Ae==="new",onClick:()=>Le("new"),title:"New address",body:null,price:null})]}),r(K,{label:"Address line 1",children:r("input",{type:"text",value:ye,onChange:i=>ee(i.target.value),className:Y})}),r(K,{label:"Address line 2",children:r("input",{type:"text",value:te,onChange:i=>M(i.target.value),placeholder:"Apartment, unit, garage bay\u2026",className:Y})}),c(Mn,{cols:"three",children:[r(K,{label:"City",children:r("input",{type:"text",value:he,onChange:i=>le(i.target.value),className:Y})}),r(K,{label:$n,children:r("input",{type:"text",value:I,onChange:i=>ve(i.target.value),className:Y})}),r(K,{label:"Country",separate:!0,children:r(et,{value:U,onChange:i=>ue(i.target.value),className:Y+" pr-10",style:Fn,children:A.map(i=>r("option",{value:i.code,children:i.name},i.code))})})]}),r(K,{label:Kn,separate:!0,children:be.length>0?c(et,{value:w,onChange:i=>B(i.target.value),className:Y+" pr-10",style:Fn,children:[r("option",{value:"",children:"Select\u2026"}),be.map(i=>r("option",{value:i.code||i.name,children:i.name},i.code||i.name))]}):r("input",{type:"text",value:w,onChange:i=>B(i.target.value),className:Y})})]}),r(K,{label:"Phone",children:r("input",{type:"tel",value:_,onChange:i=>oe(i.target.value),placeholder:"+44 7700 900000",className:Y})}),!f&&Z!==null&&Ae==="new"&&c(q,{children:[r(Qr,{checked:Ge,onChange:ft,label:"Save this address to my account"}),Ge&&r(K,{label:"Address label",children:r("input",{type:"text",value:gt,onChange:i=>Yn(i.target.value),placeholder:"Home",className:Y})})]})]}),r(Ke,{num:"N\xB0 03",title:"Shipping",children:c("div",{className:"grid gap-3",children:[d.map(i=>{let m=i.pickupLocation,h=m?[m.address,m.city,m.state,m.zipCode].filter(Boolean).join(", "):null;return r(Ye,{active:p===i.id,onClick:()=>u(i.id),title:m?`${i.name} \u2014 ${m.name}`:i.name,body:m?[h,m.openingHours,m.instructions,i.description].filter(Boolean).join(" \xB7 "):i.description||null,price:o.freeShipping||i.amount===0?_e:C(i.amount,o.currency),tag:i.tag||void 0},i.id)}),d.length===0&&r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"Shipping is arranged after your order is reviewed."})]})}),c(Ke,{num:"N\xB0 04",title:"Payment",children:[r("div",{className:"grid gap-3",children:je.map(i=>r(Ye,{active:S===i.key,onClick:()=>F(i.key),title:i.title,body:i.body,price:i.price,tag:i.tag},i.key))}),S==="card"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll enter card details on the secure payment step after placing the order."}):S==="paypal"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll approve the payment with PayPal on the payment step after placing the order."}):S==="afterpay"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll be taken to Afterpay to approve four interest-free payments, then brought straight back."}):S==="square"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll enter card details on the secure payment step after placing the order."}):S==="gocardless"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll set up a bank direct debit with GoCardless, then be brought straight back. Direct debits clear in a few days."}):S==="zip"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll be taken to Zip to approve four instalments, then brought straight back."}):S==="klarna"?r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"You\u2019ll be taken to Klarna to choose how to pay, then brought straight back."}):r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"Our team emails you the invoice and bank details after review."})]})]}),c("aside",{className:"sticky top-[var(--sf-checkout-header-h,88px)] border border-line max-[1100px]:static",style:{background:"linear-gradient(180deg, color-mix(in oklab, var(--site-surface) 70%, var(--bg)) 0%, var(--bg) 100%)"},children:[c("header",{className:"flex items-center justify-between border-b border-accent bg-accent px-6 py-4 font-mono text-[13px] font-bold uppercase tracking-[0.28em] text-bg",children:[r("span",{children:"Your order"}),r(ne,{href:"/wheels",className:"text-bg/80 transition-colors hover:text-bg",children:"Edit \u2197"})]}),r("div",{className:"flex flex-col px-6 py-2",children:a.length===0?c("div",{className:"py-8 text-center font-serif text-[16px] italic leading-[1.5] text-fg-dim",children:["Your cart is empty. ",r(ne,{href:"/wheels",className:"text-accent underline-offset-4 hover:underline",children:"Browse the catalog \u2192"})]}):a.map(i=>r(ea,{slug:i.slug,name:i.name,qty:i.qty,config:i.config,configSummary:ta(i.config),price:Ut(i,o.currency)??0,currency:o.currency},i.id))}),r("div",{className:"border-t border-line px-6 pt-5",children:r(Bt,{customerEmail:re})}),c("div",{className:"flex flex-col gap-2 border-t border-line mt-5 px-6 pt-5",children:[r(se,{label:"Subtotal",value:C(o.subtotal,o.currency)}),o.discount>0&&s?.valid&&r(se,{label:`Coupon \xB7 ${s.code}`,value:c("span",{className:"font-semibold text-green",children:["\u2212 ",C(o.discount,o.currency)]})}),s?.deferred&&r(se,{label:`Coupon \xB7 ${s.code}`,value:Lt}),s?.valid&&s.effects?.gift&&r(se,{label:`Free gift \xB7 ${s.effects.gift.partNumber}${s.effects.gift.quantity>1?` \xD7${s.effects.gift.quantity}`:""}`,value:r("span",{className:"font-semibold text-green",children:_e})}),r(se,{label:"Shipping",value:o.shippingStatus==="free"?r("span",{className:"font-semibold text-green",children:_e}):Ft(o.shippingStatus)??C(o.shipping,o.currency)}),o.tax&&(o.tax.charged?r(se,{label:o.tax.inclusive?`${o.tax.name} included \xB7 ${o.tax.rate}%`:o.tax.name,value:C(o.tax.amount,o.currency)}):o.tax.name?r(se,{label:o.tax.name,value:Dt}):null)]}),c("div",{className:"mt-4 flex items-end justify-between border-y-2 border-accent px-6 py-4",style:{background:"color-mix(in oklab, var(--accent) 10%, var(--bg))"},children:[r("span",{className:"font-display text-[20px] font-bold uppercase tracking-[0.04em] text-fg",children:"Total"}),r("span",{className:"text-right font-display text-[34px] font-bold leading-none tracking-[-0.025em] text-fg",children:o.repricing?"\u2026":C(o.grand,o.currency)})]}),c("div",{className:"flex flex-col gap-3 px-6 pt-5 pb-6",children:[vt&&r("p",{className:"border border-red-300 bg-red-50 px-3 py-2 text-[13px] text-red-700",children:vt}),o.hasUnpricedLine&&c("p",{className:"border border-amber-300 bg-amber-50 px-3 py-2 text-[13px] text-amber-800",children:["One or more items have no price in ",o.currency,". Remove them, or switch region, to continue."]}),r("button",{type:"button",onClick:ar,disabled:G||a.length===0||o.hasUnpricedLine||o.repricing,className:["group flex items-center justify-between border px-5 py-5 font-mono text-[14px] font-medium uppercase tracking-[0.3em] transition-all",a.length===0||G||o.hasUnpricedLine||o.repricing?"cursor-not-allowed border-line bg-surface text-fg-dim":"border-btn bg-btn text-btn-ink hover:border-fg hover:bg-fg"].join(" "),children:G?c(q,{children:["Building order\u2026 ",r("span",{children:"\xB7"})]}):o.repricing?c(q,{children:["Updating total\u2026 ",r("span",{children:"\xB7"})]}):c(q,{children:[S==="bank"?"Place order":"Continue to payment"," \xB7"," ",C(o.grand,o.currency),r("span",{className:"transition-transform group-hover:translate-x-1",children:"\u2192"})]})})]})]})]}),r("footer",{className:"flex flex-wrap items-center justify-between gap-4 border-t border-line px-[var(--sf-site-gutter,40px)] py-6 font-mono text-[12px] uppercase tracking-[0.22em] text-fg-dim max-[640px]:px-[min(20px,var(--sf-site-gutter,40px))]",children:r("span",{children:$t({legalName:t.legalName,foundedYear:t.foundedYear,siteName:t.name})})})]})}var Y="w-full border-2 border-line bg-bg px-4 py-4 font-display text-[17px] tracking-[-0.005em] text-fg outline-none transition-colors placeholder:text-fg-dim hover:border-fg-dim focus:border-accent",Fn={backgroundImage:"linear-gradient(45deg, transparent 50%, var(--accent) 50%), linear-gradient(135deg, var(--accent) 50%, transparent 50%)",backgroundPosition:"calc(100% - 18px) 50%, calc(100% - 12px) 50%",backgroundSize:"6px 6px",backgroundRepeat:"no-repeat"};function Ke({num:t,title:e,children:n}){return c("section",{className:"mb-6 border border-line bg-bg",children:[c("header",{className:"flex items-center gap-4 border-b border-line bg-surface px-6 py-4",children:[r("span",{className:"inline-flex items-center justify-center bg-accent px-3 py-1 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-bg",children:t}),r("h2",{className:"font-display text-[26px] font-medium uppercase leading-none tracking-[-0.02em] text-fg",children:e})]}),r("div",{className:"flex flex-col gap-4 px-6 py-6",children:n})]})}function Mn({cols:t="two",children:e}){return r("div",{className:["grid gap-3 max-[640px]:grid-cols-1",t==="two"?"grid-cols-2":"grid-cols-[1.2fr_1fr_1fr]"].join(" "),children:e})}function Ye({active:t,onClick:e,title:n,body:a,price:o,tag:s}){return c("button",{type:"button",onClick:e,"aria-pressed":t,className:["relative grid grid-cols-[auto_1fr_auto] items-center gap-5 border bg-bg px-6 py-5 text-left transition-colors",t?"border-accent outline outline-1 outline-accent -outline-offset-1":"border-line hover:border-[color-mix(in_oklab,var(--accent)_50%,var(--site-line))]"].join(" "),style:t?{background:"color-mix(in oklab, var(--accent) 14%, var(--bg))"}:void 0,children:[t&&r("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),r("span",{className:["flex h-[18px] w-[18px] items-center justify-center rounded-full border-2",t?"border-accent":"border-fg-dim"].join(" "),children:t&&r("span",{className:"block h-2.5 w-2.5 rounded-full bg-accent"})}),c("span",{className:"flex min-w-0 flex-col gap-1",children:[c("span",{className:"flex flex-wrap items-baseline gap-3 font-display text-[18px] font-medium tracking-[-0.01em] text-fg",children:[n,s&&r("span",{className:"border px-2 py-0.5 font-mono text-[11px] font-normal uppercase tracking-[0.24em] text-accent",style:{background:"color-mix(in oklab, var(--accent) 14%, transparent)",borderColor:"color-mix(in oklab, var(--accent) 45%, var(--site-line))"},children:s})]}),a&&r("span",{className:"font-mono text-[12px] uppercase tracking-[0.22em] text-fg-dim",children:a})]}),r("span",{className:"whitespace-nowrap font-display text-[18px] font-medium tracking-[-0.01em] text-fg",children:o})]})}function Hr({payment:t,onPaid:e,onSkip:n}){let{formatMoney:a}=ie(),o=ze(()=>Pn(t.publishableKey),[t.publishableKey]),s=ze(()=>{if(typeof document>"u")return;let l=getComputedStyle(document.documentElement),d=(u,v)=>l.getPropertyValue(u).trim()||v,p=document.documentElement.getAttribute("data-theme")!=="light";return{theme:p?"night":"stripe",variables:{colorPrimary:d("--accent",p?"#c9a461":"#8a6a2a"),colorBackground:d("--site-surface",p?"#131313":"#ffffff"),colorText:d("--fg",p?"#f5f1e8":"#0a0a0a"),borderRadius:"0px"}}},[]);return r("div",{className:"flex min-h-screen flex-col items-center justify-center gap-6 bg-bg px-6 py-16 text-fg",children:c("div",{className:"w-full max-w-xl border border-line bg-bg",children:[c("header",{className:"flex items-center justify-between gap-4 border-b border-line bg-surface px-6 py-4",children:[r("span",{className:"inline-flex items-center justify-center bg-accent px-3 py-1 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-bg",children:t.orderNumber}),r("h1",{className:"font-display text-[26px] font-medium uppercase leading-none tracking-[-0.02em] text-fg",children:"Payment"})]}),c("div",{className:"flex flex-col gap-4 px-6 py-6",children:[c("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:["Your order is placed. Pay"," ",r("span",{className:"text-fg",children:a(Number(t.amount),t.currency)})," ","by card to confirm it now."]}),r(at,{stripe:o,options:{clientSecret:t.clientSecret,appearance:s},children:r(Gr,{payment:t,onPaid:e,onSkip:n})})]})]})})}function Gr({payment:t,onPaid:e,onSkip:n}){let{formatMoney:a}=ie(),o=hn(),s=gn(),[l,d]=g(!1),[p,u]=g(null);async function v(){if(!o||!s||l)return;d(!0),u(null);let b=await o.confirmPayment({elements:s,redirect:"if_required"});if(b.error){u(b.error.message??"Payment failed. Please try again."),d(!1);return}let f=b.paymentIntent?.status;if(f==="succeeded"||f==="processing"){e();return}u("Payment did not complete. Please try again."),d(!1)}return c("div",{className:"flex flex-col gap-4",children:[r(vn,{}),p&&r("p",{className:"border border-red-300 bg-red-50 px-3 py-2 text-[13px] text-red-700",children:p}),r("button",{type:"button",onClick:v,disabled:!o||!s||l,className:["group flex items-center justify-between border px-5 py-5 font-mono text-[14px] font-medium uppercase tracking-[0.3em] transition-all",!o||!s||l?"cursor-not-allowed border-line bg-surface text-fg-dim":"border-btn bg-btn text-btn-ink hover:border-fg hover:bg-fg"].join(" "),children:l?c(q,{children:["Processing\u2026 ",r("span",{children:"\xB7"})]}):c(q,{children:["Pay ",a(Number(t.amount),t.currency),r("span",{className:"transition-transform group-hover:translate-x-1",children:"\u2192"})]})}),r("button",{type:"button",onClick:n,disabled:l,className:"self-center font-mono text-[11px] uppercase tracking-[0.24em] text-fg-dim underline-offset-4 transition-colors hover:text-accent hover:underline",children:"Pay later \u2014 our team will be in touch"})]})}var Un="paypal-sdk-js",ct=null;function Vr(t,e){let n=`${t}|${e}`;if(ct?.key===n)return ct.promise;let a=new Promise((o,s)=>{document.getElementById(Un)?.remove();let l=document.createElement("script");l.id=Un;let d=new URLSearchParams({"client-id":t,currency:e,intent:"capture"});l.src=`https://www.paypal.com/sdk/js?${d}`,l.onload=()=>{let p=window.paypal;p?o(p):s(new Error("PayPal SDK loaded without its namespace"))},l.onerror=()=>s(new Error("PayPal SDK failed to load")),document.head.appendChild(l)});return ct={key:n,promise:a},a}function Jr({confirmation:t,clientId:e,idemKey:n,onPaid:a,onSkip:o}){let{formatMoney:s}=ie(),l=ce(null),[d,p]=g(!1),[u,v]=g(null),b=ce(a);return b.current=a,z(()=>{let f=!1,y=null;return Vr(e,t.currency).then(A=>{if(!(f||!l.current))return y=A.Buttons({style:{layout:"vertical",color:"gold",shape:"rect",label:"paypal"},createOrder:async()=>(await T.createPaypalOrder({idempotencyKey:n})).paypalOrderId,onApprove:async k=>{try{if((await T.capturePaypalOrder({idempotencyKey:n,paypalOrderId:k.orderID})).status==="paid"){b.current();return}v("PayPal did not complete the payment. Please try again.")}catch(C){v(C instanceof qe?C.message:"PayPal payment failed. Please try again.")}},onError:()=>{v("PayPal could not process the payment. Please try again.")}}),y.render(l.current).then(()=>{f||p(!0)})}).catch(()=>{f||v("PayPal could not be loaded. You can pay later \u2014 your order stands either way.")}),()=>{f=!0,y?.close?.()}},[e,t.currency,n]),r("div",{className:"flex min-h-screen flex-col items-center justify-center gap-6 bg-bg px-6 py-16 text-fg",children:c("div",{className:"w-full max-w-xl border border-line bg-bg",children:[c("header",{className:"flex items-center justify-between gap-4 border-b border-line bg-surface px-6 py-4",children:[r("span",{className:"inline-flex items-center justify-center bg-accent px-3 py-1 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-bg",children:t.orderNumber}),r("h1",{className:"font-display text-[26px] font-medium uppercase leading-none tracking-[-0.02em] text-fg",children:"PayPal"})]}),c("div",{className:"flex flex-col gap-4 px-6 py-6",children:[c("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:["Your order is placed. Pay"," ",r("span",{className:"text-fg",children:s(Number(t.grandTotal),t.currency)})," ","with PayPal to confirm it now."]}),!d&&!u&&r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"Loading PayPal\u2026"}),r("div",{ref:l}),u&&r("p",{className:"border border-red-300 bg-red-50 px-3 py-2 text-[13px] text-red-700",children:u}),r("button",{type:"button",onClick:o,className:"self-center font-mono text-[11px] uppercase tracking-[0.24em] text-fg-dim underline-offset-4 transition-colors hover:text-accent hover:underline",children:"Pay later \u2014 our team will be in touch"})]})]})})}var Wn="square-web-sdk",lt=null;function Xr(t){let e=t==="sandbox"?"sandbox":"production";if(lt?.key===e)return lt.promise;let n=new Promise((a,o)=>{document.getElementById(Wn)?.remove();let s=document.createElement("script");s.id=Wn,s.src=e==="sandbox"?"https://sandbox.web.squarecdn.com/v1/square.js":"https://web.squarecdn.com/v1/square.js",s.onload=()=>{let l=window.Square;l?a(l):o(new Error("Square SDK loaded without its namespace"))},s.onerror=()=>o(new Error("Square SDK failed to load")),document.head.appendChild(s)});return lt={key:e,promise:n},n}function Zr({confirmation:t,applicationId:e,locationId:n,environment:a,idemKey:o,onPaid:s,onSkip:l}){let{formatMoney:d}=ie(),p=ce(null),u=ce(null),v=ce(null),[b,f]=g(!1),[y,A]=g(!1),[k,C]=g(null);z(()=>{let F=!1,O=null;return Xr(a).then(async X=>{if(F||!p.current)return;let G=X.payments(e,n);v.current=G,O=await G.card(),await O.attach(p.current),u.current=O,F||f(!0)}).catch(()=>{F||C("Square could not be loaded. You can pay later \u2014 your order stands either way.")}),()=>{F=!0,O?.destroy?.()}},[e,n,a]);async function S(){let F=u.current;if(!(!F||y)){A(!0),C(null);try{let O=await F.tokenize();if(O.status!=="OK"||!O.token){C(O.errors?.[0]?.message??"Please check the card details and try again."),A(!1);return}let X;try{X=(await v.current?.verifyBuyer?.(O.token,{amount:String(t.grandTotal),currencyCode:t.currency,intent:"CHARGE"}))?.token}catch{}if((await T.chargeSquare({idempotencyKey:o,sourceId:O.token,...X?{verificationToken:X}:{}})).status==="paid"){s();return}C("Square did not complete the payment. Please try again.")}catch(O){C(O instanceof qe?O.message:"Square payment failed. Please try again.")}A(!1)}}return r("div",{className:"flex min-h-screen flex-col items-center justify-center gap-6 bg-bg px-6 py-16 text-fg",children:c("div",{className:"w-full max-w-xl border border-line bg-bg",children:[c("header",{className:"flex items-center justify-between gap-4 border-b border-line bg-surface px-6 py-4",children:[r("span",{className:"inline-flex items-center justify-center bg-accent px-3 py-1 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-bg",children:t.orderNumber}),r("h1",{className:"font-display text-[26px] font-medium uppercase leading-none tracking-[-0.02em] text-fg",children:"Card"})]}),c("div",{className:"flex flex-col gap-4 px-6 py-6",children:[c("p",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:["Your order is placed. Pay"," ",r("span",{className:"text-fg",children:d(Number(t.grandTotal),t.currency)})," ","by card to confirm it now."]}),!b&&!k&&r("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-fg-dim",children:"Loading card form\u2026"}),r("div",{ref:p}),k&&r("p",{className:"border border-red-300 bg-red-50 px-3 py-2 text-[13px] text-red-700",children:k}),r("button",{type:"button",onClick:S,disabled:!b||y,className:["group flex items-center justify-between border px-5 py-5 font-mono text-[14px] font-medium uppercase tracking-[0.3em] transition-all",!b||y?"cursor-not-allowed border-line bg-surface text-fg-dim":"border-btn bg-btn text-btn-ink hover:border-fg hover:bg-fg"].join(" "),children:y?c(q,{children:["Processing\u2026 ",r("span",{children:"\xB7"})]}):c(q,{children:["Pay ",d(Number(t.grandTotal),t.currency),r("span",{className:"transition-transform group-hover:translate-x-1",children:"\u2192"})]})}),r("button",{type:"button",onClick:l,disabled:y,className:"self-center font-mono text-[11px] uppercase tracking-[0.24em] text-fg-dim underline-offset-4 transition-colors hover:text-accent hover:underline",children:"Pay later \u2014 our team will be in touch"})]})]})})}function Qr({checked:t,onChange:e,label:n,sub:a}){return c("div",{className:"flex items-start gap-3 border-t border-line py-4 first:border-t-0 first:pt-0",children:[r("button",{type:"button",onClick:()=>e(!t),"aria-pressed":t,"aria-label":n,className:["mt-px flex h-5 w-5 flex-shrink-0 items-center justify-center border transition-colors",t?"border-accent":"border-line"].join(" "),style:t?{background:"color-mix(in oklab, var(--accent) 18%, transparent)"}:void 0,children:t&&r("span",{className:"text-[13px] text-accent",children:"\u2713"})}),c("span",{className:"flex-1 font-display text-[16px] leading-[1.5] text-fg",children:[n,a&&r("small",{className:"mt-1 block font-mono text-[12px] uppercase tracking-[0.18em] text-fg-dim",children:a})]})]})}function ea({slug:t,name:e,qty:n,config:a,configSummary:o,price:s,currency:l}){let{catalog:d}=Ze(),{formatMoney:p}=ie(),u=d.find(k=>k.slug===t),v=u?.spokes??5,b=u?.mesh??!1,f=a.find(k=>k.gold)?.label,y=u?.finishes.find(k=>k.name===f&&k.src)??u?.finishes.find(k=>k.src),A=u?.finishes[0]?.color??zt;return c("div",{className:"grid grid-cols-[60px_1fr_auto] items-center gap-4 border-b border-line py-4 last:border-b-0",children:[c("div",{className:"relative flex aspect-square items-center justify-center overflow-hidden border border-line bg-surface",children:[r("span",{className:"absolute -right-1.5 -top-1.5 z-[2] flex h-[18px] w-[18px] items-center justify-center rounded-full bg-accent font-mono text-[11px] font-bold text-bg",children:n}),y?.src?r(Rt,{src:y.src,alt:`${e.lead}${e.accent} \u2014 ${y.name}`,width:120,height:120,sizes:"60px",className:"relative block h-full w-full object-contain p-2"}):r("div",{className:"block w-[78%]",style:{color:A},children:r(Yt,{spokes:v,mesh:b,className:"block w-full"})})]}),c("div",{className:"flex min-w-0 flex-col gap-0.5",children:[c("span",{className:"font-display text-[17px] font-bold uppercase leading-none tracking-[-0.005em] text-fg",children:[e.lead,r("em",{className:"font-serif font-normal italic text-accent tracking-[-0.005em] normal-case",children:e.accent})]}),r("span",{className:"font-mono text-[12px] uppercase leading-[1.5] tracking-[0.18em] text-fg-dim",children:o})]}),r("span",{className:"text-right font-display text-[17px] font-bold tracking-[-0.005em] text-fg",children:p(s,l)})]})}function se({label:t,value:e}){return c("div",{className:"flex items-center justify-between font-mono text-[13px] font-medium uppercase tracking-[0.18em] text-fg",children:[r("span",{children:t}),r("strong",{className:"font-display text-[16px] font-medium tracking-[-0.005em] normal-case text-fg",children:e})]})}function ta(t){return t.map(e=>e.label).join(" \xB7 ")}import{jsx as Be}from"react/jsx-runtime";function na(){let{settings:t,websiteName:e}=It(),n=e?{...Qe,name:e}:Qe,a=t?{url:t.logoUrl,reversed:t.logoReversed??null,inkIsDark:t.logoInkIsDark??null,reverse:t.reverseLogo,size:t.logoSize,sizePx:t.logoSizePx}:null;return Be("div",{style:{position:"fixed",inset:0,zIndex:2147482e3,overflowY:"auto",background:"var(--bg)",color:"var(--fg)"},children:Be(Mt,{children:Be(Wt,{preview:!0,children:Be(ut,{site:n,logo:a,preview:!0})})})})}export{na as default};
@@ -1 +1 @@
1
- "use client";import{Qh as r}from"./chunk-YNI65Q6Z.js";import"./chunk-I6VNNXUI.js";import"./chunk-VT346MLP.js";import"./chunk-Y6SLVHK3.js";import{jsx as o}from"react/jsx-runtime";import e from"efficient-easel/screen/components/ScreenStoreProvider";function a(t){return o(e,{...t,parts:r})}export{a as default};
1
+ "use client";import{Sh as r}from"./chunk-VDYPGGK3.js";import"./chunk-IT33OG3G.js";import"./chunk-XKTD3BPL.js";import"./chunk-Y6SLVHK3.js";import{jsx as o}from"react/jsx-runtime";import e from"efficient-easel/screen/components/ScreenStoreProvider";function a(t){return o(e,{...t,parts:r})}export{a as default};
@@ -0,0 +1 @@
1
+ import{a as V,c as T,g as z,i as $,j,l as O}from"./chunk-XKTD3BPL.js";var U="".replace(/\/+$/,"");var N="x-forwarded-for";function Z(e){let t=(e??"").split(",").map(n=>n.trim()).filter(Boolean);return t.length>0?t[t.length-1]:null}var Ee="x-forwarded-host";function Q(e,t,n){let r={};return e&&(r[Ee]=e),t&&n==="uncached"&&(r[N]=t),r}function X(e){if(e?.cache==="no-store"||e?.cache==="no-cache")return"uncached";if(e?.cache==="force-cache")return"data-cached";let t=e?.next?.revalidate;return typeof t=="number"&&t>0?"data-cached":"uncached"}var Y="x-storefront-site",ee="x-storefront-host",te="x-storefront-preview";var Fe="shop_access_token",ne="shop_refresh_token",B=null;function L(){O.removeItem(Fe),O.removeItem(ne)}var w={getAccess(){return B},takeLegacyRefresh(){let e=O.getItem(ne);return L(),e},setTokens(e){B=e,L()},clear(){B=null,L()}};import{efficientClientOpen as Ze}from"efficient-easel/screen/lib/session";function Ie(e){return!!e.src}function A(e){let t=e.finishes.filter(Ie);if(t.length===e.finishes.length)return e;let n=e.defaultFinish&&t.some(r=>r.name===e.defaultFinish)?e.defaultFinish:null;return{...e,finishes:t,defaultFinish:n}}function qe(e){return e.listable!==!1}function M(e){return e.map(A).filter(qe)}var oe=["fill","stroke","stop-color","color","flood-color","lighting-color","solid-color"],ae=new Set(["none","transparent","currentcolor","inherit","initial","unset","context-fill","context-stroke"]),v={black:[0,0,0],white:[255,255,255],gray:[128,128,128],grey:[128,128,128],darkgray:[169,169,169],darkgrey:[169,169,169],dimgray:[105,105,105],dimgrey:[105,105,105],lightgray:[211,211,211],lightgrey:[211,211,211],gainsboro:[220,220,220],silver:[192,192,192],whitesmoke:[245,245,245]},ce=12,le=/\burl\(/i,ue=new RegExp(`(?<![-\\w])(${oe.join("|")})(\\s*=\\s*)(["'])([^"']*)\\3`,"gi"),me=new RegExp(`((?:^|[;{\\s"'])(?:${oe.join("|")})\\s*:\\s*)([^;}"'<>]+)`,"gi"),$e=/<svg\b([^>]*)>/i,Ue=/\bfill\s*[=:]/i;function Ne(e){let t=e.replace(ue,(n,r,a,l,d)=>{let i=re(d);return i===null?n:`${r}${a}${l}${i}${l}`}).replace(me,(n,r,a)=>{let l=re(a);return l===null?n:`${r}${l}`});return t=t.replace($e,(n,r)=>Ue.test(r)?n:`<svg fill="#ffffff"${r}>`),t}function re(e){let t=/!important/i.test(e),n=e.replace(/!important/gi,"").trim().toLowerCase();if(!n||le.test(n)||ae.has(n))return null;let r=n in v?[...v[n],1]:pe(n);if(!r)return null;let[a,l,d,i]=r;if(Math.max(a,l,d)-Math.min(a,l,d)>ce)return null;let s=Be(255-a,255-l,255-d,i);return t?`${s} !important`:s}function Be(e,t,n,r){if(r<1)return`rgba(${e}, ${t}, ${n}, ${r})`;let a=l=>l.toString(16).padStart(2,"0");return`#${a(e)}${a(t)}${a(n)}`}function pe(e){return e.startsWith("#")?Le(e):e.startsWith("rgb")?Me(e):e.startsWith("hsl")?He(e):null}function Le(e){let t=e.slice(1),n=1;if(t.length===3||t.length===4)t.length===4&&(n=parseInt(t[3]+t[3],16)/255),t=t.slice(0,3).split("").map(r=>r+r).join("");else if(t.length===6||t.length===8)t.length===8&&(n=parseInt(t.slice(6,8),16)/255),t=t.slice(0,6);else return null;return/^[0-9a-f]{6}$/.test(t)?[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16),n]:null}function Me(e){let t=e.slice(e.indexOf("(")+1,e.lastIndexOf(")")),[n,r]=t.split("/"),a=n.split(/[\s,]+/).filter(Boolean).slice(0,3);if(a.length<3)return null;let l=a.map(i=>i.endsWith("%")?Math.round(parseFloat(i)/100*255):Math.round(parseFloat(i)));if(l.some(i=>Number.isNaN(i)))return null;let d=r?E(r):De(n);return[l[0],l[1],l[2],d]}function De(e){let t=e.split(/[\s,]+/).filter(Boolean);return t.length>=4?E(t[3]):1}function E(e){let t=e.trim().endsWith("%")?parseFloat(e)/100:parseFloat(e);return Number.isNaN(t)?1:t}function He(e){let t=e.slice(e.indexOf("(")+1,e.lastIndexOf(")")),[n,r]=t.split("/"),a=n.split(/[\s,]+/).filter(Boolean);if(a.length<3)return null;let l=parseFloat(a[0]),d=parseFloat(a[1])/100,i=parseFloat(a[2])/100;if([l,d,i].some(P=>Number.isNaN(P)))return null;let s=r?E(r):a.length>=4?E(a[3]):1,[o,u,g]=Je(l,d,i);return[o,u,g,s]}function Je(e,t,n){let r=(1-Math.abs(2*n-1))*t,a=(e%360+360)%360/60,l=r*(1-Math.abs(a%2-1)),d=0,i=0,s=0;a<1?[d,i,s]=[r,l,0]:a<2?[d,i,s]=[l,r,0]:a<3?[d,i,s]=[0,r,l]:a<4?[d,i,s]=[0,l,r]:a<5?[d,i,s]=[l,0,r]:[d,i,s]=[r,0,l];let o=n-r/2;return[Math.round((d+o)*255),Math.round((i+o)*255),Math.round((s+o)*255)]}var se=512*1024;function D(e){return/\.svg(\?|$)/i.test(e)}function We(e){return`data:image/svg+xml,${encodeURIComponent(Ne(e))}`}function Ge(e){let t=e.replace(/!important/gi,"").trim().toLowerCase();if(!t||le.test(t)||ae.has(t))return null;let n=t in v?[...v[t],1]:pe(t);if(!n)return null;let[r,a,l]=n;return Math.max(r,a,l)-Math.min(r,a,l)>ce?null:(.2126*r+.7152*a+.0722*l)/255}function Ke(e){let t=[],n=r=>{let a=Ge(r);a!==null&&t.push(a)};for(let r of e.matchAll(ue))n(r[4]);for(let r of e.matchAll(me))n(r[2]);return t.length?t.reduce((r,a)=>r+a,0)/t.length<.5:null}var ie=/^(?:\uFEFF|\s+|<\?xml[^>]*\?>|<!--[\s\S]*?-->|<!DOCTYPE\s+svg[^>[]*>)/i;function Ve(e){let t=e;for(let n=ie.exec(t);n&&n[0].length>0;n=ie.exec(t))t=t.slice(n[0].length);return/^<svg[\s>/]/i.test(t)}async function ze(e,t){if(!D(e))return null;try{let n=await fetch(e,{signal:t,redirect:"manual"});if(!n.ok)return null;let r=Number(n.headers.get("content-length"));if(Number.isFinite(r)&&r>se)return null;let a=await n.text();return a.length>se?null:Ve(a)?a:null}catch{return null}}async function de(e,t){let n=await ze(e,t);return n===null?null:{reversed:We(n),inkIsDark:Ke(n)}}import{currentEaselSession as je,setSessionBridgedSite as Mt,setSessionDocumentSite as Dt}from"efficient-easel/screen/lib/session";function ge(){return je().siteId()}var Qe="",f=class extends Error{constructor(t,n,r){super(n),this.status=t,this.data=r}},W="Unable to reach the server. This could be a problem with your internet connection, or the server may be undergoing maintenance or an upgrade. Please try again shortly.",Xe=new Set([502,503,504]),H=0,Ye="This editor runs on its host's own backend, which does not serve this request.",et=5e3,tt=15e3,nt=()=>typeof window>"u"?et:tt;function Ae(e){let t=(e.method??"GET").toUpperCase();if(!(e.body!=null||t!=="GET"&&t!=="HEAD")&&!(e.audience!=null&&e.audience!=="shop")&&typeof AbortSignal?.timeout=="function")return AbortSignal.timeout(nt())}var he=e=>e instanceof Error&&e.name==="TimeoutError",ye=(e,t)=>Xe.has(e)?W:t,rt=["admin","venue"],Re="admin";function Qt(e){Re=rt.includes(e)?e:"admin"}function st(){return Re}var it=/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8})*$/,_e=null;function Xt(e){_e=e&&it.test(e)?e:null}function ot(){return _e}function at(e){if(typeof window>"u"||!e.startsWith("/api/v1/"))return e;let t=$();return!t||/[?&]site=/.test(e)?e:q(e,`site=${encodeURIComponent(t)}`)}async function c(e,t={}){let{token:n,baseUrl:r,headers:a,audience:l,...d}=t;if(typeof window<"u"&&!Ze())throw new f(H,Ye,null);if(typeof window>"u"&&r===void 0)throw new Error(`apiFetch(${JSON.stringify(e)}) ran on the server without an explicit baseUrl. The API_URL default it would inherit is browser-only (the prod image bakes NEXT_PUBLIC_API_URL="" for same-origin use, which a Node fetch cannot resolve). Pass a base explicitly: \`await backendOpts()\` (or baseUrl: PRODUCT_FETCH_BASE) for product reads, or the server-only PRODUCT_BACKEND_URL env for other backend surfaces.`);let i=typeof FormData<"u"&&d.body instanceof FormData,s;try{s=await fetch(`${r??Qe}${at(e)}`,{...d,headers:{...i?{}:{"Content-Type":"application/json"},...n?{Authorization:`Bearer ${n}`}:{},...l===null?{}:{"X-Portal-Audience":l??"shop"},...a},signal:d.signal??Ae({...d,audience:l})})}catch(g){throw g instanceof TypeError||he(g)?new f(H,W,null):g}let o;try{o=await s.text()}catch(g){throw he(g)?new f(H,W,null):g}let u=null;if(o)try{u=JSON.parse(o)}catch{throw new f(s.status,s.ok?"Expected JSON but received a non-JSON response":ye(s.status,s.statusText),o)}if(!s.ok){let g=(u&&typeof u=="object"&&"detail"in u&&typeof u.detail=="string"?u.detail:null)??ye(s.status,s.statusText);throw new f(s.status,g,u)}return u}var R=null;async function xe(){return R||(R=ct().finally(()=>{R=null}),R)}async function ct(){let e=w.takeLegacyRefresh(),t=await lt.refresh(e??void 0);return w.setTokens(t.access),t.access}async function Ce(){return w.getAccess()??xe()}async function h(e,t={}){let n;try{n=await Ce()}catch{throw w.clear(),new f(401,"Not signed in",null)}try{return await c(e,{...t,token:n})}catch(r){if(!(r instanceof f)||r.status!==401)throw r;try{let a=await xe();return await c(e,{...t,token:a})}catch{throw w.clear(),r}}}async function fe(e,t={}){if(w.getAccess())try{return{data:await h(e,t),asShopper:!0}}catch(n){if(!(n instanceof f)||n.status!==401)throw n}return{data:await c(e,t),asShopper:!1}}async function Se(){let e=await h("/api/auth/me/");if(e.portal!=="shop")throw w.clear(),new f(403,"This session is not valid for this shop.",null);return e}var lt={login:(e,t)=>c("/api/auth/login/",{method:"POST",body:JSON.stringify({email:e,password:t,portal:"shop"}),credentials:"include"}),refresh:e=>c("/api/auth/refresh/",{method:"POST",body:JSON.stringify(e?{refresh:e,portal:"shop"}:{portal:"shop"}),credentials:"include"}),logout:async()=>{w.clear();try{await c("/api/auth/logout/",{method:"POST",body:JSON.stringify({portal:"shop"}),credentials:"include"})}catch{}},restoreSession:async()=>{let e=await Ce();return await Se(),e},me:Se,updateMe:e=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify(e)}),changePassword:(e,t)=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify({password:t,old_password:e})}),changeEmail:(e,t)=>h("/api/shop-portal/change-email/",{method:"POST",body:JSON.stringify({new_email:e,current_password:t})}),myProfile:()=>h("/api/shop-portal/profile/"),updateMyProfile:e=>h("/api/shop-portal/profile/",{method:"PATCH",body:JSON.stringify(e)}),myAddresses:()=>h("/api/shop-portal/delivery-locations/"),createAddress:e=>h("/api/shop-portal/delivery-locations/",{method:"POST",body:JSON.stringify(e)}),updateAddress:(e,t)=>h(`/api/shop-portal/delivery-locations/${e}/`,{method:"PATCH",body:JSON.stringify(t)}),deleteAddress:e=>h(`/api/shop-portal/delivery-locations/${e}/`,{method:"DELETE"}),passwordResetRequest:e=>c("/api/auth/password-reset/",{method:"POST",body:JSON.stringify({email:e})}),passwordResetConfirm:(e,t,n)=>c("/api/auth/password-reset/confirm/",{method:"POST",body:JSON.stringify({uid:e,token:t,new_password:n})}),brands:()=>h("/api/products/brands/"),myOrders:()=>h("/api/shop-portal/orders/").then(e=>e.results),myOrder:e=>h(`/api/shop-portal/orders/${e}/`),cancelOrder:e=>h(`/api/shop-portal/orders/${e}/cancel/`,{method:"POST"}),myReturns:e=>h(`/api/shop-portal/returns/${e?`?order=${encodeURIComponent(e)}`:""}`).then(t=>t.results),createReturn:e=>h("/api/shop-portal/returns/",{method:"POST",body:JSON.stringify(e)}),withdrawReturn:e=>h(`/api/shop-portal/returns/${e}/cancel/`,{method:"POST"}),uploadReturnPhoto:(e,t)=>{let n=new FormData;return n.append("claim_item",e),n.append("file",t),n.append("media_type",t.type.startsWith("video/")?"video":"image"),h("/api/shop-portal/return-media/",{method:"POST",body:n})}};function S(e){if(typeof e=="string")return e.startsWith("/media/")?V(e):e;if(Array.isArray(e))return e.map(S);if(e&&typeof e=="object"){let t={};for(let[n,r]of Object.entries(e))t[n]=n==="captions"&&r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).map(([a,l])=>[S(a),l])):S(r);return t}return e}var ke=typeof window>"u"&&U!=="",ut=ke?U:"",mt=j,b=()=>({baseUrl:mt(),audience:null});function m(e,t){let n=t?`?process=${encodeURIComponent(t)}`:"";return`/api/v1${e}${n}`}var pt=100,Pe=50;function Te(e,t,n){let r=new URLSearchParams;for(let[a,l]of Object.entries(t))l!=null&&l!==""&&r.set(a,String(l));return r.set("pageSize",String(pt)),n&&r.set("cursor",n),`/api/v1${e}?${r.toString()}`}function dt(e,t){return Te("/wheels",{process:e},t)}function gt(e,t,n){return Te("/products",{kind:e.join(","),make:t?.make,model:t?.model,year:t?.year,modification:t?.modification},n)}function ht(e){if(!e)return null;try{return new URL(e,"http://cursor.invalid").searchParams.get("cursor")}catch{return null}}async function we(e,t,n=()=>!1){let r=[],a=null;try{for(let l=0;l<Pe;l++){let d=await c(await t(a),await p());if(r.push(...d.results),a=ht(d.next),!a)break}a&&console.warn(`[${e}] stopped at ${Pe} pages (${r.length} rows); catalog may be truncated`)}catch(l){if(n(l))throw l;console.warn(`[${e}] product API unavailable, returning []`,l)}return r}var yt=e=>e instanceof f&&e.status===400;function ft(e){return e.flatMap(t=>t.kind==="alloy-wheel"?M([t]):[t])}async function Oe(){return(await St()).host}async function St(){try{let{headers:e}=await import("./headers-UYHEZDAT.js"),t=await e(),n=l=>l?.split(",")[0]?.split(":")[0]?.trim().toLowerCase()||null,r=n(t.get(ee)??t.get("x-forwarded-host")??t.get("host")),a=n(t.get("host"));return{host:r,matchesRequestHost:r!==null&&r===a}}catch{return{host:null,matchesRequestHost:!1}}}async function Pt(){try{let{headers:e}=await import("./headers-UYHEZDAT.js");return Z((await e()).get(N))}catch{return null}}async function wt(){try{let{headers:e}=await import("./headers-UYHEZDAT.js");return(await e()).get(Y)||null}catch{return null}}async function bt(){let e=await wt();if(e)return`site=${encodeURIComponent(e)}`;let t=await Oe();return t?`host=${encodeURIComponent(t)}`:""}async function y(e){if(typeof window<"u"){let t=$();return t?q(e,`site=${encodeURIComponent(t)}`):e}return q(e,await bt())}function q(e,t){return t?`${e}${e.includes("?")?"&":"?"}${t}`:e}var At="preview";async function Rt(){if(typeof window<"u")return null;try{let{headers:e}=await import("./headers-UYHEZDAT.js");return(await e()).get(te)}catch{return null}}async function _t(){try{let{headers:e}=await import("./headers-UYHEZDAT.js");return(await e()).get("user-agent")}catch{return null}}async function J(e,t){let n=await Rt();if(n===null)return[await y(e),await p(t)];let r=q(await y(e),`${At}=${encodeURIComponent(n)}`),{next:a,cache:l,...d}=t??{},i=await p({...d,cache:"no-store"}),s=await _t();return s&&(i.headers={...i.headers,"user-agent":s}),[r,i]}async function xt(e){if(!ke)return;let[t,n]=await Promise.all([Oe(),Pt()]),r=Q(t,n,e);return Object.keys(r).length>0?r:void 0}async function p(e){let t=await xt(X(e)),n={baseUrl:ut,...e};return t&&(n.headers={...t,...e?.headers}),n}var _=typeof window>"u";function x(e,t){let n=new URLSearchParams;for(let[a,l]of Object.entries(t))l!==void 0&&l!==""&&n.set(a,String(l));let r=n.toString();return`/api/v1/fitment${e}${r?`?${r}`:""}`}var rn={listMakes:async e=>{if(_){let{fitmentData:n}=await import("./fitment-data-DGKKOAWL.js");return n.makes(e)}return(await c(x("/makes",{region:e}),b())).results},listModels:async(e,t)=>{if(_){let{fitmentData:r}=await import("./fitment-data-DGKKOAWL.js");return r.models(e,t)}return(await c(x("/models",{make:e,region:t}),b())).results},listYears:async(e,t,n)=>{if(_){let{fitmentData:a}=await import("./fitment-data-DGKKOAWL.js");return a.years(e,t,n)}return(await c(x("/years",{make:e,model:t,region:n}),b())).results},listModifications:async(e,t,n,r)=>{if(_){let{fitmentData:l}=await import("./fitment-data-DGKKOAWL.js");return l.modifications(e,t,n,r)}return(await c(x("/modifications",{make:e,model:t,year:n,region:r}),b())).results},getStockFitment:async(e,t,n,r,a)=>{if(_){let{fitmentData:l}=await import("./fitment-data-DGKKOAWL.js");return l.stockFitment(e,t,n,r,a)}return c(x("/stock-fitment",{make:e,model:t,year:n,modification:r,region:a}),b())}},sn={listWheels:async e=>{let t=await we("products.listWheels",async n=>await y(dt(e,n)));return M(S(t))},listCatalog:async(e,t)=>{if(e.length===0)throw new Error("products.listCatalog() needs at least one kind. An empty list would omit `kind`, which the contract reads as `alloy-wheel` \u2014 so the call would silently return the wheel catalog instead of nothing.");let n=await we("products.listCatalog",async r=>await y(gt(e,t,r)),yt);return ft(S(n))},getWheel:async e=>A(S(await c(await y(m(`/wheels/${e}`)),await p()))),getTyre:async e=>S(await c(await y(m(`/tyres/${e}`)),await p())),listBundles:async()=>{try{return await c(await y(m("/bundles")),await p())}catch{return[]}},getBundle:async e=>c(await y(m(`/bundles/${e}`)),await p()),listGalleryBuilds:async(e={})=>{let{process:t=null,wheelSlug:n=null}=e;if(typeof window>"u"){let{listGalleryBuilds:r}=await import("./gallery-builds-data-TD3QJK7L.js");return S(r(t,n))}try{let r=new URLSearchParams;t&&r.set("process",t),n&&r.set("wheelSlug",n);let a=r.toString(),l=await c(`/api/v1/gallery-builds${a?`?${a}`:""}`,b());return S(l.results)}catch(r){return console.warn("[products.listGalleryBuilds] product API unavailable, returning []",r),[]}},getSite:async()=>c(await y(m("/site")),await p()),getSiteBySlug:async e=>c(`${m("/site")}?${new URLSearchParams({site:e})}`,typeof window>"u"?await p():void 0),listPages:async()=>S(await c(await y(m("/pages")),await p())),listPopups:async()=>c(await y(m("/popups")),await p()),listProductTemplates:async()=>{try{return await c(await y(m("/product-templates")),await p())}catch(e){return console.warn("[products.listProductTemplates] unavailable, returning []",e),[]}},listDynamicPages:async e=>{let t=e?`?recordType=${encodeURIComponent(e)}`:"";try{return await c(await y(`${m("/dynamic-pages")}${t}`),await p())}catch(n){if(n instanceof f&&n.status===404)return[];throw n}},getRecord:async(e,t)=>{try{return await c(await y(m(`/records/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)),await p())}catch(n){if(n instanceof f&&n.status===404)return null;throw n}},listRecordKeys:async e=>{try{let t=await c(await y(m(`/records/${encodeURIComponent(e)}`)),await p({cache:"no-store"}));return Array.isArray(t?.keys)?t.keys.filter(n=>typeof n=="string"&&n!==""):[]}catch(t){if(t instanceof f&&t.status===404)return[];throw t}},listProductTypeChoices:async()=>{try{return await c(await y(m("/product-type-choices")),await p())}catch(e){return console.warn("[products.listProductTypeChoices] unavailable, returning []",e),[]}},listFieldUsage:async()=>{try{return await c(await y(m("/field-usage")),await p())}catch(e){return console.warn("[products.listFieldUsage] unavailable, returning []",e),[]}},getPage:async(e,t={})=>{let n=t.record?`?record=${encodeURIComponent(t.record)}`:"",[r,a]=await J(m(`/pages/${e}`)+n,t.revalidate!==void 0?{next:{revalidate:t.revalidate}}:void 0);return S(await c(r,a))},listBlogPosts:async(e={})=>{let t=e.category?`?category=${encodeURIComponent(e.category)}`:"";try{return(await c(m("/blog-posts")+t,await p())).map(r=>({...r,coverImage:T(r.coverImage)??""}))}catch(n){return console.warn("[products.listBlogPosts] blog API unavailable, returning []",n),[]}},getBlogPost:async e=>{let t=await c(m(`/blog-posts/${e}`),await p());return{...t,coverImage:T(t.coverImage)??""}},createOrder:async e=>c(m("/orders"),await p({method:"POST",body:JSON.stringify(e)})),createOrderAuthed:async e=>h(m("/orders"),await p({method:"POST",body:JSON.stringify(e)})),lookupOrder:async e=>c(m("/orders/lookup"),await p({method:"POST",body:JSON.stringify(e)})),createPaymentIntent:async e=>c(m("/payments/intent"),await p({method:"POST",body:JSON.stringify(e)})),createPaypalOrder:async e=>c(m("/payments/paypal/order"),await p({method:"POST",body:JSON.stringify(e)})),capturePaypalOrder:async e=>c(m("/payments/paypal/capture"),await p({method:"POST",body:JSON.stringify(e)})),createAfterpayCheckout:async e=>c(m("/payments/afterpay/checkout"),await p({method:"POST",body:JSON.stringify(e)})),captureAfterpayPayment:async e=>c(m("/payments/afterpay/capture"),await p({method:"POST",body:JSON.stringify(e)})),chargeSquare:async e=>c(m("/payments/square/charge"),await p({method:"POST",body:JSON.stringify(e)})),createGocardlessBillingRequest:async e=>c(m("/payments/gocardless/billing-request"),await p({method:"POST",body:JSON.stringify(e)})),completeGocardlessPayment:async e=>c(m("/payments/gocardless/complete"),await p({method:"POST",body:JSON.stringify(e)})),createZipCheckout:async e=>c(m("/payments/zip/checkout"),await p({method:"POST",body:JSON.stringify(e)})),captureZipPayment:async e=>c(m("/payments/zip/capture"),await p({method:"POST",body:JSON.stringify(e)})),createKlarnaCheckout:async e=>c(m("/payments/klarna/checkout"),await p({method:"POST",body:JSON.stringify(e)})),captureKlarnaPayment:async e=>c(m("/payments/klarna/capture"),await p({method:"POST",body:JSON.stringify(e)})),createStockAlert:async e=>c(m("/stock-alerts"),await p({method:"POST",body:JSON.stringify(e)})),createPreOrderIntent:async e=>c(m("/pre-order-intents"),await p({method:"POST",body:JSON.stringify(e)})),createNewsletterSubscription:async e=>c(m("/newsletter-subscriptions"),await p({method:"POST",body:JSON.stringify(e)})),unsubscribeNewsletter:async e=>c(m("/newsletter-unsubscribe"),await p({method:"POST",body:JSON.stringify(e)})),captureCart:async e=>c(m("/carts"),await p({method:"POST",body:JSON.stringify(e)})),restoreCart:async e=>c(m("/carts/restore"),await p({method:"POST",body:JSON.stringify(e)})),unsubscribeCartReminders:async e=>c(m("/carts/unsubscribe"),await p({method:"POST",body:JSON.stringify(e)})),listReviews:async(e={})=>{let t=new URLSearchParams;e.limit&&t.set("limit",String(e.limit)),e.designCode&&t.set("designCode",e.designCode);let n=m("/reviews"),r=t.toString();try{return await c(await y(r?`${n}?${r}`:n),await p())}catch(a){return console.warn("[products.listReviews] product API unavailable, returning []",a),[]}},submitReview:async e=>c(m("/reviews"),await p({method:"POST",body:JSON.stringify(e)})),getForm:async e=>c(m(`/forms/${encodeURIComponent(e)}`),await p()),submitForm:async(e,t)=>c(m(`/forms/${encodeURIComponent(e)}/submissions`),await p({method:"POST",body:JSON.stringify(t)})),listShippingMethods:async()=>{try{return await c(m("/shipping-methods"),await p())}catch(e){return console.warn("[products.listShippingMethods] product API unavailable, returning []",e),[]}},listCountrySubdivisions:async e=>{try{return await c(m(`/countries/${encodeURIComponent(e)}/subdivisions`),await p())}catch(t){return console.warn("[products.listCountrySubdivisions] unavailable, returning []",t),[]}},quoteCart:async e=>{let t=m("/cart/quote"),n=await p({method:"POST",body:JSON.stringify(e)});return e.couponCode?(await fe(t,n)).data:c(t,n)},validateCoupon:async e=>{let{data:t,asShopper:n}=await fe(m("/coupons/validate"),await p({method:"POST",body:JSON.stringify(e)}));return{...t,askedAsShopper:n}},getHeaderSettings:async()=>{let e=Ae({method:"GET"}),t=await c(...await J(m("/header-settings"),{signal:e})),n=T(t.logoUrl),r=null,a=null;if(n&&D(n)){let l=await de(n,e);l&&(r=l.reversed,a=l.inkIsDark)}return{...t,logoUrl:n,logoReversed:r,logoInkIsDark:a}},getThemeSettings:async()=>c(...await J(m("/theme-settings"))),getChatSettings:async()=>c(await y(m("/chat-settings")),await p())},on={listServices:async()=>{try{return await c(m("/bookings/services"),await p())}catch(e){return console.warn("[bookings.listServices] API unavailable, returning []",e),{results:[],currency:"USD"}}},getAvailability:async(e,t)=>c(m(`/bookings/availability?service=${encodeURIComponent(e)}&date=${t}`),await p()),create:async e=>c(m("/bookings"),await p({method:"POST",body:JSON.stringify(e)})),get:async e=>c(m(`/bookings/manage/${encodeURIComponent(e)}`),await p()),cancel:async e=>c(m(`/bookings/manage/${encodeURIComponent(e)}/cancel`),await p({method:"POST"})),createPaymentIntent:async e=>c(m("/bookings/payments/intent"),await p({method:"POST",body:JSON.stringify({manageToken:e})}))},G=class extends Error{constructor(n,r){super(`Slug "${n}" exists on ${r} websites; a site is required to pick one.`);this.slug=n;this.count=r;this.name="AmbiguousPageSlugError"}},F=(e,t,n)=>{let r=new URLSearchParams({...t?{site:t}:{},...n?{draft:"1"}:{}}).toString();return`/api/storefront/${e}/${r?`?${r}`:""}`},C=e=>`/api/storefront/sites/${encodeURIComponent(e)}/`,Ct=e=>`${C(e)}currencies/`,kt="/api/storefront/media/ingest/",K=class extends Error{constructor(){super("This editor is not connected to a website, so an upload has nowhere to go. Open the page from the website the file should belong to, then try again."),this.name="MediaUploadDestinationError"}};function Tt(){let e=ge();if(!e)throw new K;return`${kt}?${new URLSearchParams({site:e})}`}var I={"X-Puck-Media-Manifest":z.contentHash},an=ve({});function ve(e){return(t,n={})=>{let r=ot(),a=e.headers||r?{...r?{"Accept-Language":r}:{},...e.headers,...n.headers}:void 0;return c(t,{...n,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...a?{headers:a}:{},audience:e.audience??st()})}}function Ot(e={}){let t=ve(e),n=e.siteDrafts===!0,r=i=>F("header-settings",i,n),a=i=>F("theme-settings",i,n),l=i=>F("chat-settings",i,n),d=i=>F("social-settings",i,n);return{findPageBySlug:async(i,s,o)=>{let u=new URLSearchParams({slug:i});o&&u.set("site",o);let g=await t(`/api/storefront/pages/?${u.toString()}`,{token:s}),P=Array.isArray(g)?g:g.results??[];if(!o&&P.length>1)throw new G(i,P.length);return P[0]??null},getPageById:(i,s)=>t(`/api/storefront/pages/${i}/`,{token:s}),saveLayout:(i,s,o,u,g)=>t(`/api/storefront/pages/${i}/`,{method:"PATCH",body:JSON.stringify({layout:s,expected_updated_at:u,...g?{client_id:g}:{}}),token:o}),duplicatePage:(i,s,o)=>t(`/api/storefront/pages/${i}/duplicate/`,{method:"POST",body:JSON.stringify({title:s.title,slug:s.slug}),token:o}),geocode:(i,s,o)=>t(`/api/storefront/geocode/?${new URLSearchParams(o?{q:i,country:o}:{q:i})}`,{token:s}),createPagePreviewLink:(i,s)=>t(`/api/storefront/pages/${i}/preview-link/`,{method:"POST",token:s}),claimPageEditLock:(i,s,o,u=!1)=>t(`/api/storefront/pages/${i}/edit-lock/`,{method:"POST",body:JSON.stringify({client_id:o,takeover:u}),token:s}),releasePageEditLock:(i,s)=>t(`/api/storefront/pages/${i}/edit-lock/`,{method:"DELETE",token:s}),createTemplate:(i,s,o)=>t("/api/storefront/page-templates/",{method:"POST",body:JSON.stringify({name:i,layout:s}),headers:I,token:o}),getTemplate:(i,s)=>t(`/api/storefront/page-templates/${i}/`,{token:s}),saveTemplateLayout:(i,s,o)=>t(`/api/storefront/page-templates/${i}/`,{method:"PATCH",body:JSON.stringify({layout:s}),headers:I,token:o}),listTemplatePages:async(i,s)=>{let o=await t(`/api/storefront/template-pages/?template=${encodeURIComponent(i)}`,{token:s});return Array.isArray(o)?o:o.results??[]},findTemplatePageBySlug:async(i,s,o)=>{let u=await t(`/api/storefront/template-pages/?template=${encodeURIComponent(i)}&slug=${encodeURIComponent(s)}`,{token:o});return(Array.isArray(u)?u:u.results??[])[0]??null},createTemplatePage:(i,s,o)=>t("/api/storefront/template-pages/",{method:"POST",body:JSON.stringify({template:i,...s}),headers:I,token:o}),saveTemplatePageLayout:(i,s,o)=>t(`/api/storefront/template-pages/${i}/`,{method:"PATCH",body:JSON.stringify({layout:s}),headers:I,token:o}),deleteTemplatePage:(i,s,o)=>t(`/api/storefront/template-pages/${i}/`,{method:"DELETE",token:s,...o?.keepalive?{keepalive:!0}:{}}),listPages:async(i,s)=>{let o=new URLSearchParams({no_page:"true"});s&&o.set("site",s);let u=await t(`/api/storefront/pages/?${o.toString()}`,{token:i});return Array.isArray(u)?u:u.results??[]},createPage:(i,s,o,u)=>t("/api/storefront/pages/",{method:"POST",body:JSON.stringify({title:i,slug:s,layout:o}),token:u}),deletePage:(i,s)=>t(`/api/storefront/pages/${i}/`,{method:"DELETE",token:s}),getHeaderSettings:(i,s)=>t(r(s),{token:i}),listMenus:async(i,s)=>{let o=new URLSearchParams({no_page:"true"});s&&o.set("site",s);let u=await t(`/api/storefront/menus/?${o}`,{token:i});return Array.isArray(u)?u:u.results??[]},listBlogPosts:async(i,s={})=>{let o=new URLSearchParams({no_page:"true"});s.visibleOnly&&o.set("is_visible","true"),s.siteId&&o.set("site",s.siteId);let u=await t(`/api/storefront/blog-posts/?${o.toString()}`,{token:i});return Array.isArray(u)?u:u.results??[]},listFieldUsage:async(i,s)=>{let o=await t(`/api/storefront/field-usage/?site=${encodeURIComponent(s)}`,{token:i});return Array.isArray(o?.entries)?o.entries:[]},listCategories:async(i,s={})=>{let o=new URLSearchParams({no_page:"true"});s.visibleOnly&&o.set("is_visible","true"),s.siteId&&o.set("site",s.siteId);let u=await t(`/api/storefront/categories/?${o.toString()}`,{token:i});return[...Array.isArray(u)?u:u.results??[]].sort((P,k)=>P.sort_order-k.sort_order||P.name.localeCompare(k.name))},listForms:async(i,s={})=>{let o=new URLSearchParams({no_page:"true"});s.siteId&&o.set("site",s.siteId);let u=await t(`/api/storefront/forms/?${o.toString()}`,{token:i});return[...Array.isArray(u)?u:u.results??[]].sort((P,k)=>P.title.localeCompare(k.title))},listWheelSummaries:async(i,s={})=>{let o=new URLSearchParams;s.siteId&&o.set("site",s.siteId);let u=o.toString(),g=await t(`/api/storefront/wheel-curations/summaries/${u?`?${u}`:""}`,{token:i});return S(g)},listProducts:async(i,s={})=>{let o=new URLSearchParams;s.kinds?.length&&o.set("kind",s.kinds.join(",")),s.siteId&&o.set("site",s.siteId);let u=o.toString(),g=await t(`/api/storefront/products/${u?`?${u}`:""}`,{token:i});return S(g)},getWheelDetail:async(i,s,o={})=>{let u=new URLSearchParams({slug:s});return o.siteId&&u.set("site",o.siteId),A(S(await t(`/api/storefront/wheel-curations/detail/?${u.toString()}`,{token:i})))},updateHeaderSettings:(i,s,o)=>t(r(o),{method:"PATCH",body:JSON.stringify(i),token:s}),getSite:(i,s)=>t(C(i),{token:s}),listSites:async i=>{let s=await t("/api/storefront/sites/?no_page=true",{token:i});return Array.isArray(s)?s:s.results??[]},listSiteCurrencies:async(i,s)=>{let o=await t(Ct(i),{token:s});return Array.isArray(o)?o:[]},publishSite:(i,s)=>t(`${C(i)}publish/`,{method:"POST",token:s}),getSiteLiveState:(i,s)=>t(`${C(i)}live-state/`,{token:s}),updateSite:(i,s,o)=>t(C(i),{method:"PATCH",body:JSON.stringify(s),token:o}),getThemeSettings:(i,s)=>t(a(s),{token:i}),updateThemeSettings:(i,s,o)=>t(a(o),{method:"PATCH",body:JSON.stringify(i),token:s}),getChatSettings:(i,s)=>t(l(s),{token:i}),updateChatSettings:(i,s,o)=>t(l(o),{method:"PATCH",body:JSON.stringify(i),token:s}),getSocialSettings:(i,s)=>t(d(s),{token:i}),updateSocialSettings:(i,s,o)=>t(d(o),{method:"PATCH",body:JSON.stringify(i),token:s}),uploadHeaderLogo:(i,s,o)=>{let u=new FormData;return u.append("logo",i),t(r(o),{method:"PATCH",body:u,token:s})},clearHeaderLogo:(i,s)=>t(r(s),{method:"PATCH",body:JSON.stringify({logo:null}),token:i}),setHeaderLogoFromAsset:(i,s,o)=>t(r(o),{method:"PATCH",body:JSON.stringify({logo_asset_id:i}),token:s}),uploadMedia:async(i,s)=>{let o=new FormData;return o.append("file",i),t(Tt(),{method:"POST",body:o,token:s})},listMedia:async(i,s)=>{let o=new URLSearchParams({no_page:"true"});s&&o.set("kind",s);let u=await t(`/api/storefront/media-assets/?${o.toString()}`,{token:i});return Array.isArray(u)?u:u.results??[]}}}var cn=Ot({siteDrafts:!0});export{U as a,Q as b,X as c,w as d,Ie as e,D as f,ge as g,Qe as h,f as i,W as j,H as k,Qt as l,Xt as m,c as n,lt as o,Oe as p,St as q,Pt as r,wt as s,Rt as t,rn as u,sn as v,on as w,G as x,an as y,cn as z};
@@ -0,0 +1 @@
1
+ import{f as dt,i as me,q as ft,s as pt,t as mt,v as B}from"./chunk-A3PXLZZP.js";import{Aa as pe,Ba as ut,Ea as $e,Fa as ct,Ia as Be,Ja as We}from"./chunk-IT33OG3G.js";import{j as lt,l as ie}from"./chunk-XKTD3BPL.js";import{createContext as un,useContext as Ct,useEffect as cn,useMemo as he,useState as yt}from"react";function gt(e,t){return e.map(n=>({partNumber:n.partNumber,quantity:n.wheels*t}))}function ae(e,t){if(e.length===0)return null;let n=0;for(let r of e){let o=r.prices?.[t];if(typeof o!="number"||!Number.isFinite(o)||o<=0)return null;n+=o*r.wheels}return n}var qe=4,wr=1,_r={unit:"set",spares:0,spareSide:"left"};function ht(e){return e.unit==="single"?1:qe+e.spares}function Rr(e,t){return[{partNumber:e.partNumber,wheels:ht(t),prices:e.prices}]}function Nr(e,t){let n=ht(t)-qe;if(n<=0||e.length===0)return e;let r=sn(e),o=r?r[t.spareSide]:0;return e.map((i,a)=>a===o?{...i,wheels:i.wheels+n}:i)}function sn(e){let t,n;for(let r=0;r<e.length;r+=1){let o=e[r].hand;if(o!=="left"&&o!=="right")continue;if((o==="left"?t:n)!==void 0)return null;o==="left"?t=r:n=r}return t!==void 0&&n!==void 0?{left:t,right:n}:null}function ln(e,t){return t.spares>0?`${e} + spare`:e}function Lr(e){return e.unit==="single"?"Single":ln(`Set of ${qe}`,e)}var Ir="data-add-to-basket",Ge=9,Ne="en";function ge(e,t,n=0){return new Intl.NumberFormat(Ne,{style:"currency",currency:t,minimumFractionDigits:0,maximumFractionDigits:n}).format(e)}function Ar(e,t){return new Intl.NumberFormat(Ne,{style:"currency",currency:t}).format(e)}import{jsx as mn}from"react/jsx-runtime";var dn="storefront-country",bt=dn,Ke=un(null);function fn(e){return xt(e,"catalogue")}function pn(e){return xt(e,"money")}function xt(e,t){let n=new Map(e.map(o=>[o.code,o.decimalPlaces])),r=new Map;return(o,i)=>{if(!i)return"";let a=r.get(i);if(!a){let s=n.get(i)??0;a=new Intl.NumberFormat(Ne,{style:"currency",currency:i,minimumFractionDigits:t==="money"?s:0,maximumFractionDigits:s}),r.set(i,a)}return a.format(o)}}function Dr({children:e,currencies:t,countries:n,defaultCurrency:r,defaultCountry:o}){let i=he(()=>t??[],[t]),a=he(()=>n??[],[n]),s=he(()=>r||i.find(y=>y.isDefault)?.code||i[0]?.code||"",[r,i]),c=he(()=>o||a.find(y=>y.isDefault)?.code||a[0]?.code||"",[o,a]),[u,f]=yt(c),[d,S]=yt(!1);cn(()=>{let y=ie.getItem(bt);y&&a.some(w=>w.code===y)&&f(y),S(!0)},[a]);function R(y){f(y),ie.setItem(bt,y)}let C=he(()=>{let y=a.find(v=>v.code===u)??null,w=y?.currency,O=w&&i.some(v=>v.code===w)?w:s,M=fn(i),I=pn(i);return{country:u,currency:O,setCountry:R,currencies:i,countries:a,activeCountry:y,formatPrice:(v,x)=>M(v,x??O),formatMoney:(v,x)=>I(v,x??O),ready:d}},[u,i,a,s,d]);return mn(Ke.Provider,{value:C,children:e})}function St(){let e=Ct(Ke);if(!e)throw new Error("useCurrency must be used within a CurrencyProvider");return e}function Fr(){return Ct(Ke)?.country??""}import{createContext as Ln,useCallback as L,useContext as In,useEffect as Q,useMemo as Ot,useRef as se,useState as k}from"react";function Et(e,t){return e.valid?!1:e.reason==="firstOrderOnly"?!0:e.reason==="notEligible"&&!t}var Pt="We'll confirm this discount when you place your order.",Br="Confirmed at checkout";function Wr(e){return e&&(e.valid||e.deferred)?e.code:void 0}var vt="coupon_code: ";function qr(e){return!(e instanceof me)||e.status!==400||!e.message.startsWith(vt)?null:e.message.slice(vt.length)}function wt(e,t){return e.map(n=>({qty:n.qty,slug:n.slug,name:`${n.name.lead}${n.name.accent}`.trim(),finish:n.finishName,size:n.size,kind:n.kind,sku:n.sku,pack:n.pack,priceLabel:t(n)}))}var Le="Price on request",hn="Request a quote",yn="from ",Xr="From ",Yr="each",_t="Free";function ze(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Xe(e,t){let n=e?.[t];return ze(n)?n:null}function Vr(e,t,n,r){let o=Xe(e,n),i=Xe(t,n);return o===null&&i===null?0:o===null?1:i===null?-1:r==="asc"?o-i:i-o}function jr(e,t,n,r){if(n==null&&r==null)return!0;let o=Xe(e,t);return!(o===null||n!=null&&o<n||r!=null&&o>r)}var bn={priced:!1,unit:null,was:null,onSale:!1,setTotal:null};function Cn(e,t,n){if(!ze(e))return bn;let r=ze(t)&&t>e?t:null;return{priced:!0,unit:e,was:r,onSale:r!==null,setTotal:n!=null?e*n:null}}function Qr(e,t,n=""){return!e.priced||e.unit==null?Le:`${n}${ge(e.unit,t)}`}function Zr(e,t){return e.was==null?null:ge(e.was,t)}function xn(e,t,n=1){let r=ae(e,t);if(r===null)return{priced:!1,unit:null,isFrom:!1,setTotal:null};let o=e.reduce((a,s)=>a+s.wheels,0),i=Math.min(...e.map(a=>a.prices[t]));return{priced:!0,unit:i,isFrom:i*o!==r,setTotal:r*n}}var Sn={priced:!1,unit:null,isFrom:!1,was:null,onSale:!1,setTotal:null};function Jr(e,t,n,r=1){let o=Cn(e.prices[n],e.msrpPrices?.[n],4),i=o.setTotal==null?null:o.setTotal*r;if(!t)return{priced:o.priced,unit:o.unit,isFrom:!0,was:o.was,onSale:o.onSale,setTotal:null,fromSetTotal:i};let a=xn(t.components,n,r);return a.priced?{priced:!0,unit:a.unit,isFrom:a.isFrom,was:null,onSale:!1,setTotal:a.setTotal,fromSetTotal:i}:{...Sn,fromSetTotal:i}}function vn(e,t){return!e.priced||e.unit==null?Le:`${e.isFrom?yn:""}${ge(e.unit,t)}`}function eo(e,t){return e.was==null?null:ge(e.was,t)}function to(e,t){return!e.priced||e.unit==null?hn:vn(e,t)}var En=/^[^@\s]+@[^@\s]+\.[^@\s]+$/;function Rt(e){return En.test(e.trim())}var Nt="sf:ga-purchases",Pn=20;function It(){return typeof window>"u"||window.parent!==window}function ye(...e){try{if(It()||typeof window.gtag!="function")return;window.gtag(...e)}catch{}}function wn(e,t){let n=e.config.find(r=>r.gold)?.label;return{item_id:`${e.slug}|${e.finishName}|${e.size}`,item_name:`${e.name.lead}${e.name.accent}`.trim(),...n?{item_variant:n}:{},price:ae(e.components,t)??0,quantity:e.qty}}function Ye(e,t){return e.filter(Ie).map(n=>wn(n,t))}function so(e){ye("event","view_item",{currency:e.currency,value:e.pricePerSet,items:[{item_id:e.itemId,item_name:e.itemName,...e.variant?{item_variant:e.variant}:{},price:e.pricePerSet,quantity:1}]})}function At(e,t){let n=Ye([e],t);n.length!==0&&ye("event","add_to_cart",{currency:t,value:n[0].price*n[0].quantity,items:n})}function lo(e){let t=Ye(e.lines,e.currency);t.length!==0&&ye("event","begin_checkout",{currency:e.currency,value:e.value,...e.coupon?{coupon:e.coupon}:{},items:t})}var Lt=new Set;function _n(e){if(Lt.has(e))return!1;Lt.add(e);try{let t=JSON.parse(ie.getItem(Nt)??"[]");if(t.includes(e))return!1;ie.setItem(Nt,JSON.stringify([...t,e].slice(-Pn)))}catch{}return!0}function uo(e){let t=e.confirmation;if(It()||!_n(t.orderNumber))return;let n=t.currency,r=Number(t.grandTotal);ye("event","purchase",{transaction_id:t.orderNumber,currency:n,value:r,shipping:Number(t.freightCharge),...t.couponCode?{coupon:t.couponCode}:{},items:Ye(e.lines,n)}),e.adsSendTo&&ye("event","conversion",{send_to:e.adsSendTo,transaction_id:t.orderNumber,currency:n,value:r})}var Rn="Arranged after review",Tt="Calculated at checkout",Nn=Tt,po=Tt;function kt({quoted:e,optionCount:t,chosenAmount:n,couponWaivesFreight:r}){return e&&t===0?"arranged":r?"free":n===void 0?"pending":n===0?"free":"charged"}function mo(e){switch(e){case"arranged":return Rn;case"pending":return Nn;case"free":return _t;case"charged":return null}}import{jsx as On}from"react/jsx-runtime";var An=400,Tn=400,kn=1500;function Ie(e){return(e.components?.length??0)>0}function Mt(e,t){return{code:e,valid:t.valid,deferred:Et(t,t.askedAsShopper),message:t.message||void 0,effects:t.effects??void 0}}function Ft(e,t){return ae(e.components,t)}function Ve(e,t){let n=Ft(e,t);return n===null?null:n*e.qty}function Dt(e){return e!=="tyre"}var Ut=Ln(null);function _o({children:e,preview:t=!1}){let{currency:n,country:r,formatMoney:o}=St(),[i,a]=k(t),[s,c]=k([]),[u,f]=k([]),[d,S]=k([]),[R,C]=k(!1),[y,w]=k(!1),[O,M]=k(!1),[I,v]=k(!1),[x,W]=k(null),[A,q]=k(void 0),b=se(r),_=se("");b.current=b.current||r;let[p,G]=k(null),[Z,F]=k(!1),[D,ve]=k(null),z=se(void 0),K=L(()=>a(!0),[]),ue=L(()=>a(!1),[]),J=L(()=>a(l=>!l),[]);Q(()=>{t||typeof window>"u"||new URLSearchParams(window.location.search).get("cart")==="open"&&K()},[K,t]);let Ee=L(l=>{v(!0),Dt(l)&&M(!0)},[]),U=O||s.some(l=>Dt(l.kind)),Pe=I||s.length>0;Q(()=>{if(t||!U||R)return;let l=!0;return B.listWheels().then(m=>{l&&(f(m),C(!0))}),()=>{l=!1}},[t,U,R]),Q(()=>{if(t||!Pe||y)return;let l=!0;return B.listBundles().then(m=>{l&&(S(m),w(!0))}),()=>{l=!1}},[t,Pe,y]);let P=x?.deliveryOptions??[];Q(()=>{P.length!==0&&ve(l=>l&&P.some(m=>m.id===l)?l:P[0]?.id??null)},[x]);let ee=L(()=>s.filter(Ie).flatMap(l=>gt(l.components,l.qty)),[s]),te=L(async(l,m)=>{let h=l.trim().toUpperCase();if(!h)return;let g=ee();if(g.length===0){G({code:h,valid:!1,message:"Add a wheel to the cart first."});return}F(!0),z.current=m;try{let N=await B.validateCoupon({code:h,items:g,currency:n,shippingMethodId:D??void 0,customerEmail:m});G(Mt(h,N))}catch{G({code:h,valid:!1,message:"Could not check that code. Please try again."})}finally{F(!1)}},[ee,n,D]),ce=L(()=>{G(null),z.current=void 0},[]),de=L(l=>{if(!p)return;let{code:m}=p;G(h=>h&&h.code===m?{code:m,valid:!1,refused:!0,message:l}:h)},[p]);Q(()=>{if(!p||p.refused)return;let l=p.code,m=g=>g!==null&&g.code===l&&!g.refused,h=setTimeout(async()=>{let g=ee();if(g.length===0){G(N=>m(N)?{code:l,valid:!1,message:"Add a wheel to the cart first."}:N);return}F(!0);try{let N=await B.validateCoupon({code:l,items:g,currency:n,shippingMethodId:D??void 0,customerEmail:z.current});G(fe=>m(fe)?Mt(l,N):fe)}catch{}finally{F(!1)}},An);return()=>clearTimeout(h)},[s,n,D]);let ne=p&&!p.refused?p.code:void 0;Q(()=>{if(t)return;let l=!0,m=setTimeout(async()=>{let h=ee();if(h.length===0){W(null),q(void 0);return}try{let g=await B.quoteCart({items:h,currency:n,shippingMethodId:D??void 0,couponCode:ne,customerEmail:z.current||void 0,country:b.current||void 0,subdivision:_.current||void 0});if(!l)return;W(g)}catch{if(!l)return}q(ne)},Tn);return()=>{l=!1,clearTimeout(m)}},[s,n,D,ne,r]);let V=L(l=>{c(m=>{let h=m.findIndex(g=>g.id===l.id);return h===-1?[...m,l]:m.map((g,N)=>N===h?{...g,qty:Math.min(Ge,g.qty+l.qty)}:g)}),At(l,n)},[n]),re=L(l=>{c(m=>m.filter(h=>h.id!==l))},[]),we=L((l,m)=>{let h=Math.max(1,Math.min(Ge,m));c(g=>g.map(N=>N.id===l?{...N,qty:h}:N))},[]),_e=L(l=>{c(l)},[]),[E,H]=k(null),j=se(null);j.current=E;let $=se(null),Fe=se(""),nt=L((l,m)=>{let h=l.trim().toLowerCase();Rt(h)&&H(g=>g&&g.email===h&&g.firstName===(m??"")?g:{email:h,firstName:m??""})},[]);Q(()=>{if(t||!E)return;let l=wt(s.filter(Ie),g=>Ve(g,n)===null?Le:o(Ve(g,n),n)),m={email:E.email,firstName:E.firstName,currency:n,items:l},h=JSON.stringify(m);if(h!==Fe.current)return $.current&&clearTimeout($.current),$.current=setTimeout(()=>{$.current=null,Fe.current=h,B.captureCart(m).catch(g=>{})},kn),()=>{$.current&&(clearTimeout($.current),$.current=null)}},[s,E,n,t]);let rt=L(()=>{$.current&&(clearTimeout($.current),$.current=null);let l=j.current;l&&(Fe.current="",B.captureCart({email:l.email,firstName:l.firstName,currency:n,items:[]}).catch(m=>{}))},[n]),ot=Ot(()=>{let l=s.reduce((T,oe)=>{let Re=Ve(oe,n);return Re===null?T:T+Re},0),m=s.some(T=>Ft(T,n)===null),h=s.reduce((T,oe)=>T+oe.qty,0),g=p?.valid?p.effects:void 0,N=g?Math.min(l,Number(g.discountAmount)):0,fe=x?.bundleDiscount??0,tn=x?.appliedBundles??[],Ue=!!g?.freeShipping,at=P.find(T=>T.id===D),st=Ue?0:x?.shipping??at?.amount??0,nn=kt({quoted:x!==null,optionCount:P.length,chosenAmount:at?.amount,couponWaivesFreight:Ue}),He={};for(let T of g?.freeUnits??[])He[T.partNumber]=(He[T.partNumber]??0)+T.quantity;let rn=x?.tax??null,on=x?x.grandTotal:l-N-fe+st;return{sets:h,units:s.reduce((T,oe)=>T+(oe.components??[]).reduce((Re,an)=>Re+an.wheels*oe.qty,0),0),subtotal:l,hasUnpricedLine:m,discount:N,bundleDiscount:fe,appliedBundles:tn,shipping:st,freeShipping:Ue,shippingStatus:nn,freeUnitsByPartNumber:He,tax:rn,grand:on,repricing:!!p?.refused&&x!==null&&A===p?.code,currency:n}},[s,n,p,P,D,x,A]),it=L(l=>{V(l),K()},[V,K]),en=Ot(()=>({isOpen:i,preview:t,open:K,close:ue,toggle:J,items:s,catalog:u,bundles:d,warmCatalog:Ee,add:V,addAndOpen:it,remove:re,setQty:we,replaceItems:_e,identify:nt,clearCapturedCart:rt,coupon:p,applyCoupon:te,removeCoupon:ce,refuseCoupon:de,couponBusy:Z,deliveryOptions:P,shippingMethodId:D,setShippingMethodId:ve,totals:ot}),[i,t,K,ue,J,s,u,d,Ee,V,it,re,we,_e,nt,rt,p,te,ce,de,Z,P,D,ot]);return On(Ut.Provider,{value:en,children:e})}function Ht(){let e=In(Ut);if(!e)throw new Error("useCart() must be called inside <CartProvider>. Mount the provider in app/layout.tsx.");return e}import{cache as Kn}from"react";function $t(e,t,n,r){for(;e.size>=t;){let o,i;for(let[s,c]of e){if(c.expiresAt<=r){o=s;break}i===void 0&&n(s)&&(i=s)}let a=o??i??e.keys().next().value;if(a===void 0)return;e.delete(a)}}var Mn=6e4,Dn=5e3,Fn=500,Ae=new Map;async function Un(e){let{host:t,matchesRequestHost:n}=await ft();if(!t)return"";let r=await pt();return r?`${e}|slug:${encodeURIComponent(t)}/${encodeURIComponent(r)}`:n?`${e}|host:${t}`:`${e}|xhost:${t}`}var Hn=e=>e.includes("|slug:")||e.includes("|xhost:");async function Bt(e,t){if(await mt()!==null)return t();let n=await Un(e);if(!n)return t();let r=Date.now(),o=Ae.get(n);if(o&&o.expiresAt>r)return o.load;let i=await t(),a=i.outcome.state==="failed",s=a?Dn:Mn,c=Ae.get(n)?.lastGood,u=i.outcome.state==="ok"?i:a?c:void 0,f=a&&u?u:i;return $t(Ae,Fn,Hn,r),Ae.set(n,{load:f,expiresAt:r+s,lastGood:u}),f}var $n=404;function Bn(e){if(e instanceof me&&e.status===$n)return{state:"absent"};let t=e instanceof me?e.status:-1,n=e instanceof Error?e.message:String(e);return{state:"failed",status:t,detail:n}}var Wn="[storefront:chrome-load-failed]";function qn(e,t){console.error(`${Wn} ${e} status=${t.status} \u2014 serving fallback chrome`,t.detail)}async function Wt(e,t,n,r){try{let o=await t();return r?.(o)?{value:o,outcome:{state:"absent"}}:{value:o,outcome:{state:"ok"}}}catch(o){let i=Bn(o);return i.state==="failed"&&qn(e,i),{value:n,outcome:i}}}function Gn(e){return e==="production"?"silent":"banner"}var Oo=Gn("production");function zn(e,t){return e?.trim()||t}function Wo({legalName:e,foundedYear:t,siteName:n},r=new Date().getFullYear()){let o=zn(e,n);return`\xA9 ${t&&t<r?`${t}\u2013${r}`:`${r}`} ${o}`}var Xn={name:pe,legalName:null,foundedYear:null,faviconUrl:null,currencies:[],defaultCurrency:null,countries:[],defaultCountry:null,commerceEnabled:!0,cardPayments:!1,paymentMethods:[],paypalClientId:null,paypalEnvironment:null,squareApplicationId:null,squareLocationId:null,squareEnvironment:null,ga4MeasurementId:null,googleAdsId:null,googleAdsConversionLabel:null,metaPixelId:null,consentEnabled:!1,consentPrivacyPage:null,consentNoticeOptOut:!1,socialLinks:$e},qo=Kn(async()=>Bt("site",()=>Wt("site",async()=>{let e=await B.getSite();return{name:ut(e.name),legalName:e.legalName?.trim()||null,foundedYear:e.foundedYear??null,faviconUrl:e.faviconUrl??null,currencies:e.currencies??[],defaultCurrency:e.defaultCurrency??null,countries:e.countries??[],defaultCountry:e.defaultCountry??null,commerceEnabled:e.commerceEnabled??!0,cardPayments:e.cardPayments??!1,paymentMethods:e.paymentMethods??(e.cardPayments?["card"]:[]),paypalClientId:e.paypalClientId??null,paypalEnvironment:e.paypalEnvironment??null,squareApplicationId:e.squareApplicationId??null,squareLocationId:e.squareLocationId??null,squareEnvironment:e.squareEnvironment??null,ga4MeasurementId:e.ga4MeasurementId??null,googleAdsId:e.googleAdsId??null,googleAdsConversionLabel:(e.googleAdsId?e.googleAdsConversionLabel:null)??null,metaPixelId:e.metaPixelId??null,consentEnabled:e.consentEnabled??!1,consentPrivacyPage:e.consentPrivacyPage??null,consentNoticeOptOut:e.consentNoticeOptOut??!1,socialLinks:ct(e.socialLinks)}},Xn)));var Go={name:pe,legalName:null,foundedYear:null,faviconUrl:null,currencies:[{code:"USD",symbol:"$",decimalPlaces:2,isDefault:!0}],defaultCurrency:"USD",countries:[{code:"US",name:"United States",currency:"USD",url:"",isDefault:!0,chargeTax:!1,taxDisplay:"none",taxName:"",taxRate:null,postalLabel:"Zip Code"}],defaultCountry:"US",commerceEnabled:!0,cardPayments:!0,paymentMethods:["card"],paypalClientId:null,paypalEnvironment:null,squareApplicationId:null,squareLocationId:null,squareEnvironment:null,ga4MeasurementId:null,googleAdsId:null,googleAdsConversionLabel:null,metaPixelId:null,consentEnabled:!1,consentPrivacyPage:null,consentNoticeOptOut:!1,socialLinks:$e};import{jsx as Ce,jsxs as je}from"react/jsx-runtime";import{useEffect as Te,useId as Qn,useRef as Gt,useState as ke}from"react";import{efficientClientOpen as Yn}from"efficient-easel/screen/lib/session";var be=new Map,Vn=64;async function jn(e){if(!Yn())return null;try{let t=await fetch(`${lt()}/logo-analysis.json?url=${encodeURIComponent(e)}`);if(!t.ok)return null;let n=await t.json();if(!n||typeof n!="object")return null;let{reversed:r,inkIsDark:o}=n;return typeof r!="string"?null:{reversed:r,inkIsDark:typeof o=="boolean"?o:null}}catch{return null}}function qt(e){let t=be.get(e);if(t)return t;let n=jn(e);if(be.set(e,n),be.size>Vn){let r=be.keys().next();r.done||be.delete(r.value)}return n}var Zn=202/22,Jn=.88,ii=16,er="invert(1)";function ai({variant:e="header",scrolled:t=!0,src:n,reverse:r=!1,color:o=null,onLightSurface:i,reversedSrc:a,inkIsDark:s,size:c="medium",sizePx:u,wordmark:f,siteName:d=pe,fitToContainer:S=!1,fitWordmarkToContainer:R=!1,fitFloorPx:C}){let y=f&&f.trim()?f.trim():d,[w,O]=ke(!1),M=Gt(null),I=E=>{M.current=E};Te(()=>{let E=M.current?.ownerDocument??document,H=()=>{O(E.documentElement.getAttribute("data-theme")==="light")};H();let j=new MutationObserver(H);return j.observe(E.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>j.disconnect()},[]);let v=n&&n.trim()?n.trim():null,x=!!v&&dt(v),W=i??(w&&t),A=o&&o.trim()?o.trim():null,q=r&&!A,b=`logo-color-${Qn().replace(/[^A-Za-z0-9_-]/g,"")}`,_=q&&x&&v&&a!=null?{reversed:a,inkIsDark:s??null}:null,p=_!==null,[G,Z]=ke(null);Te(()=>{if(!q||!v||!x||p){Z(null);return}let E=!1;return Z(null),qt(v).then(H=>{E||Z(H)}),()=>{E=!0}},[q,v,x,p]);let F=_??G,D=!!F&&F.inkIsDark!==null&&(W?!F.inkIsDark:F.inkIsDark),ve=q&&!!v&&!x&&!W,z=D&&F?F.reversed:v,K=z?[z]:[],[ue,J]=ke(0);Te(()=>{J(0)},[v,D]);let Ee=e==="footer"?We:Be[c],U=u&&u>0?u:Ee,Pe=Math.round(U*Zn),P=ue<K.length?K[ue]:null,[ee,te]=ke(z),ce=P!==null&&P===ee,de=Gt(null);Te(()=>{let E=de.current;if(!E||!E.complete)return;if(E.naturalWidth>0||E.naturalHeight>0){te(P);return}let H=!1;return E.decode().then(()=>!H&&te(P),()=>!H&&J(j=>j+1)),()=>{H=!0}},[P]);let ne=S||R,V=`calc(100cqi / ${((y.length+1)*Jn).toFixed(2)})`,re=ne&&C&&C>0?Math.min(C,U):null,we=ne?re===null?`min(${U}px, ${V})`:`clamp(${re}px, ${V}, ${U}px)`:`${U}px`,_e=je("span",{className:`font-display font-bold tracking-[0.18em] ${re===null?"whitespace-nowrap":"whitespace-normal"}`,style:{fontSize:we,lineHeight:1,...A?{color:A}:{}},"aria-label":y,children:[y,Ce("span",{className:"text-accent",style:A?{color:A}:void 0,children:"."})]});return je("span",{ref:I,className:"inline-flex items-center",children:[!ce&&_e,A&&P&&Ce("svg",{"aria-hidden":"true",focusable:"false",width:"0",height:"0",style:{position:"absolute"},children:je("filter",{id:b,colorInterpolationFilters:"sRGB",children:[Ce("feFlood",{style:{floodColor:A}}),Ce("feComposite",{in2:"SourceAlpha",operator:"in"})]})}),P&&Ce("img",{ref:de,src:P,alt:y,width:Pe,height:U,className:"shrink-0 object-contain",style:{...ce?{height:`${U}px`,width:"auto",...S?{maxWidth:"100cqi"}:{}}:{display:"none"},...ve?{filter:er}:{},...A?{filter:`url(#${b})`}:{}},onLoad:()=>te(P),onError:()=>J(E=>E+1)},P)]})}import{jsx as xe,jsxs as nr}from"react/jsx-runtime";function tr({spokes:e,mesh:t=!1,className:n}){let a=c=>Math.round(c*1e3)/1e3,s=[];for(let c=0;c<e;c++){let u=c/e*Math.PI*2-Math.PI/2;if(s.push({x1:a(100+Math.cos(u)*22),y1:a(100+Math.sin(u)*22),x2:a(100+Math.cos(u)*86),y2:a(100+Math.sin(u)*86),main:!0}),t){let f=u+Math.PI/e;s.push({x1:a(100+Math.cos(f)*22*1.4),y1:a(100+Math.sin(f)*22*1.4),x2:a(100+Math.cos(f)*78),y2:a(100+Math.sin(f)*78),main:!1})}}return nr("svg",{viewBox:"0 0 200 200",fill:"none",stroke:"currentColor",className:n??"block h-[70%] w-[70%] transition-transform duration-700 [transition-timing-function:cubic-bezier(.2,.6,.2,1)]",children:[xe("circle",{cx:100,cy:100,r:92,strokeWidth:2}),xe("circle",{cx:100,cy:100,r:84,strokeWidth:1,opacity:.4}),xe("circle",{cx:100,cy:100,r:22,strokeWidth:2}),xe("circle",{cx:100,cy:100,r:6,fill:"currentColor"}),s.map((c,u)=>xe("line",{x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,stroke:"currentColor",strokeWidth:c.main?6:3,strokeLinecap:"round",opacity:c.main?1:.5},u))]})}var ci="#c9a461",Kt=[{f:"black",label:"Black",hex:"#171717"},{f:"silver",label:"Silver",hex:"#cccccc"},{f:"bronze",label:"Bronze",hex:"#8a6438"},{f:"graphite",label:"Graphite",hex:"#3a3c3f"},{f:"red",label:"Candy Red",hex:"#7a0f14"}],di={name:"",color:"var(--fg)",family:"silver",src:""};function rr(e,t){let n=r=>{let o=Kt.findIndex(i=>i.f===r);return o===-1?Kt.length:o};return n(e)-n(t)||e.localeCompare(t)}function fi(e){let t=new Set;for(let n of e)for(let r of n.finishes??[])r?.family&&t.add(r.family);return[...t].sort(rr)}import{useState as or}from"react";import{jsx as le,jsxs as Qe}from"react/jsx-runtime";function ir({customerEmail:e}){let{coupon:t,applyCoupon:n,removeCoupon:r,couponBusy:o}=Ht(),[i,a]=or("");async function s(){o||!i.trim()||(await n(i,e),a(""))}return Qe("div",{className:"flex flex-col gap-2",children:[t===null?Qe("div",{className:"flex border border-line",children:[le("input",{type:"text",value:i,onChange:c=>a(c.target.value),onKeyDown:c=>{c.key==="Enter"&&(c.preventDefault(),s())},placeholder:"Coupon code","aria-label":"Coupon code",className:"flex-1 bg-transparent px-4 py-4 font-mono text-[11px] uppercase tracking-[0.18em] text-fg outline-none placeholder:text-fg-dim"}),le("button",{type:"button",onClick:()=>{s()},disabled:o,className:"border-l border-line px-4 font-mono text-[10px] uppercase tracking-[0.26em] text-btn transition-colors hover:bg-btn hover:text-btn-ink disabled:cursor-wait disabled:opacity-60",children:o?"\u2026":"Apply"})]}):Qe("div",{className:["flex items-center justify-between gap-3 border px-4 py-3",t.valid?"border-accent":"border-line"].join(" "),style:t.valid?{background:"color-mix(in oklab, var(--accent) 8%, transparent)"}:void 0,children:[le("span",{className:["font-mono text-[11px] uppercase tracking-[0.22em]",t.valid?"text-accent":t.deferred?"text-fg":"text-fg-dim line-through"].join(" "),children:t.code}),le("button",{type:"button",onClick:r,"aria-label":`Remove coupon ${t.code}`,className:"font-mono text-[12px] text-fg-dim transition-colors hover:text-fg",children:"\u2715"})]}),t?.deferred?le("p",{className:"font-mono text-[10px] uppercase tracking-[0.18em] text-fg-dim",children:Pt}):t&&!t.valid&&t.message&&le("p",{className:"font-mono text-[10px] uppercase tracking-[0.18em] text-alert",children:t.message})]})}var Ze="Ads on. Shopper can opt out.",Oe="Ads and analytics off until Accept",ar={us:{region:"us",name:"United States",model:"opt-out",law:"California CCPA / CPRA, other state laws",beforeChoice:Ze,footerLink:"Do Not Sell or Share My Personal Information",panelEyebrow:"Do not sell or share",adsRowName:"Sale or sharing for ads"},ca:{region:"ca",name:"Canada",model:"opt-in",law:"PIPEDA, Quebec Law 25",beforeChoice:Oe,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},au:{region:"au",name:"Australia",model:"opt-out",law:"Privacy Act 1988 (APPs)",beforeChoice:Ze,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},nz:{region:"nz",name:"New Zealand",model:"opt-out",law:"Privacy Act 2020",beforeChoice:Ze,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},uk:{region:"uk",name:"United Kingdom",model:"opt-in",law:"PECR, UK GDPR",beforeChoice:Oe,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"},eu:{region:"eu",name:"European Union",model:"opt-in",law:"ePrivacy Directive, GDPR",beforeChoice:Oe,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"},other:{region:"other",name:"All other countries",model:"opt-in",law:"Safe default",beforeChoice:Oe,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"}};function sr(e){let t=[...e.googleAds?["Google"]:[],...e.meta?["Facebook","Instagram"]:[]];return t.length<=1?t.join(""):`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`}function Ci(e,t,n){let r=sr(n),o=r?`We use cookies to count visits and to show you ${t} ads on ${r}.`:"We use cookies to count visits.";return e.model==="opt-in"?{heading:r?"Cookies and ads":"Cookies",before:`${o} Nothing loads until you choose. You can change this at any time with `,link:e.footerLink,after:" at the bottom of every page."}:{heading:r?"Cookies and ads":"Cookies",before:`${o} You can say no at any time: choose Privacy choices, or use `,link:e.footerLink,after:" at the bottom of every page."}}var xi={accept:"Accept all",reject:"Reject all",choose:"Choose",save:"Save",ok:"OK",privacyChoices:"Privacy choices",privacyPolicy:"Privacy Policy",alwaysOn:"Always on"};var lr={asked:!1,region:"other",model:"opt-in",analytics:!0,ads:!0,chosen:!0,gpc:!1};var ur=lr;function Pi(e=ur){if(e.asked)return e.ads?"granted":"denied"}function _i(){let e=typeof crypto<"u"?crypto:void 0;if(typeof e?.randomUUID=="function")return e.randomUUID();let t=new Uint8Array(16);if(typeof e?.getRandomValues=="function")e.getRandomValues(t);else for(let r=0;r<t.length;r++)t[r]=Math.floor(Math.random()*256);t[6]=t[6]&15|64,t[8]=t[8]&63|128;let n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join("");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}import{Children as dr,isValidElement as fr,useEffect as Xt,useId as pr,useLayoutEffect as jt,useRef as X,useState as Yt}from"react";var Me=(e,t)=>!!e[t]&&!e[t].disabled;function Je(e,t,n){let r=e.length;for(let o=1;o<=r;o++){let i=((t+n*o)%r+r)%r;if(Me(e,i))return i}return t}function et(e,t){return Je(e,t===1?-1:e.length,t)}function tt(e,t){return Me(e,t)?t:Math.max(et(e,1),0)}function zt(e,t,n){let{open:r,focus:o}=e,i=a=>({...e,...a});if(t.length===1&&/\S/.test(t)){let a=e.typed+t.toLowerCase(),s=n.findIndex((c,u)=>Me(n,u)&&c.label.toLowerCase().startsWith(a));return{state:i({open:!0,typed:a,focus:s>=0?s:o}),handled:!0}}if(!r)return t==="ArrowDown"||t==="ArrowUp"||t==="Enter"||t===" "?{state:i({open:!0,typed:""}),handled:!0}:{state:e,handled:!1};switch(t){case"ArrowDown":return{state:i({focus:Je(n,o,1)}),handled:!0};case"ArrowUp":return{state:i({focus:Je(n,o,-1)}),handled:!0};case"Home":return{state:i({focus:et(n,1)}),handled:!0};case"End":return{state:i({focus:et(n,-1)}),handled:!0};case"Enter":case" ":return Me(n,o)?{state:i({open:!1,typed:""}),commit:o,refocus:!0,handled:!0}:{state:e,handled:!0};case"Escape":return{state:i({open:!1,typed:""}),refocus:!0,handled:!0};case"Tab":return{state:i({open:!1,typed:""}),handled:!1};default:return{state:e,handled:!1}}}import{placeMenu as mr}from"efficient-shell/ui";import{Fragment as xr,jsx as Y,jsxs as Qt}from"react/jsx-runtime";var Vt={body:"text-[length:var(--size-body,14px)]",label:"text-[length:var(--size-label,13px)]"};function gr({items:e,value:t,onPick:n,open:r,onOpen:o,onClose:i}){let[a,s]=Yt(!1),c=r!==void 0,u=c?r:a,[f,d]=Yt(0),S=X({text:"",timer:0}),R=X(null),C=X(null),y=X(null),w=pr(),O=X(null),M=e.findIndex(b=>b.value===t),I=b=>{b!==u&&(c||s(b),b?o?.():i?.())},v=b=>{let _=e[b];!_||_.disabled||(n(_.value),I(!1),C.current?.focus())},x=b=>{let _={open:u,focus:u?f:tt(e,M),typed:S.current.text},p=zt(_,b,e);return!p.handled&&p.state.open===u?!1:(p.state.typed!==_.typed&&(S.current.text=p.state.typed,window.clearTimeout(S.current.timer),S.current.timer=window.setTimeout(()=>{S.current.text=""},500)),d(p.state.focus),p.commit!==void 0?v(p.commit):I(p.state.open),p.refocus&&C.current?.focus(),p.handled)},W=X(x);W.current=x;let A=X(()=>I(!1));A.current=()=>I(!1);let q=b=>{u||(O.current=b.nativeEvent,W.current(b.key)&&b.preventDefault())};return Xt(()=>{if(!u)return;let b=p=>{R.current?.contains(p.target)||A.current()},_=p=>{p!==O.current&&W.current(p.key)&&p.preventDefault()};return document.addEventListener("mousedown",b),document.addEventListener("keydown",_),()=>{document.removeEventListener("mousedown",b),document.removeEventListener("keydown",_)}},[u]),Xt(()=>{u&&(S.current.text||d(tt(e,M)))},[u]),jt(()=>{if(!u||!y.current)return;y.current.children.item(f)?.scrollIntoView({block:"nearest"})},[f,u]),{open:u,toggle:()=>I(!u),close:()=>I(!1),focusIdx:f,setFocusIdx:d,pick:b=>v(e.findIndex(_=>_.value===b)),wrapRef:R,triggerRef:C,listRef:y,listId:w,onTriggerKeyDown:q,activeId:u?`${w}-${f}`:void 0}}var hr={select:{list:"absolute left-0 top-full z-50 mt-1 max-h-[280px] w-max min-w-full overflow-y-auto border-2 border-accent bg-bg shadow-xl",item:(e,t,n)=>["px-3 py-3 font-mono text-[13px] font-semibold uppercase tracking-[0.1em] transition-colors whitespace-nowrap",n?"cursor-not-allowed opacity-40":"cursor-pointer",e&&!n?"bg-accent text-bg":"bg-bg text-fg"].join(" ")},cell:{list:"absolute left-0 top-full z-50 mt-1 max-h-[320px] w-max min-w-full overflow-y-auto border-2 border-accent bg-bg shadow-xl",item:e=>[`cursor-pointer whitespace-nowrap px-6 py-3 font-mono ${Vt.label} font-semibold uppercase tracking-[0.1em] transition-colors`,e?"bg-accent text-bg":"bg-bg text-fg"].join(" "),pickerMarker:!0},hairline:{list:"absolute left-0 top-full z-50 max-h-[320px] w-full overflow-y-auto border border-line bg-bg shadow-[0_6px_20px_rgba(0,0,0,0.10)]",item:(e,t)=>[`flex cursor-pointer items-center justify-between gap-4 border-b border-line px-4 py-3 text-left ${Vt.body} transition-colors last:border-b-0`,t?"border-fg font-medium text-fg":e?"border-fg text-fg":"text-fg-dim"].join(" "),pickerMarker:!0},region:{list:"absolute right-0 top-full z-[200] mt-2 flex min-w-[240px] flex-col border border-line bg-surface text-fg",item:(e,t,n,r)=>["flex w-full cursor-pointer items-center gap-3 px-4 py-3 text-left transition-colors","font-mono text-[13px] uppercase tracking-[0.18em]",e?"bg-surface-2 text-fg":"",r?"":"border-b border-line",t?"text-accent":""].join(" "),itemStyle:e=>e?void 0:{color:"color-mix(in oklab, currentColor 80%, transparent)"}}};function yr(e,t){jt(()=>{let n=e.current,r=n?.ownerDocument.defaultView;if(!n||!r)return;let o=()=>{let i=n.style;i.top=i.bottom=i.marginTop=i.marginBottom=i.maxHeight=i.overflowY=i.translate="";let a=n.offsetParent??n.parentElement;if(!a)return;let s=a.getBoundingClientRect(),c=n.getBoundingClientRect(),u=Math.abs(c.right-s.right)<Math.abs(c.left-s.left)?"end":"start",f=mr({trigger:{left:s.left,right:s.right,top:s.top,bottom:s.bottom},menu:{width:c.width,height:c.height},bounds:{left:0,top:0,right:r.innerWidth,bottom:r.innerHeight},align:u,side:"bottom"});if(f.side==="top"){i.top="auto",i.bottom="100%",i.marginTop="0px";let S=f.top+Math.min(c.height,f.maxHeight);i.marginBottom=`${Math.max(0,s.top-S)}px`}f.maxHeight<c.height&&(i.maxHeight=`${f.maxHeight}px`,i.overflowY="auto");let d=f.left-c.left;d&&(i.translate=`${d}px`)};return o(),r.addEventListener("resize",o),r.addEventListener("scroll",o,!0),()=>{r.removeEventListener("resize",o),r.removeEventListener("scroll",o,!0)}},[e,t])}function br({id:e,tone:t,items:n,value:r,focusIdx:o,onFocus:i,onPick:a,listRef:s,ariaLabel:c}){let u=hr[t],f=X(null);return yr(f,n.length),Y("ul",{ref:d=>{f.current=d,s&&(s.current=d)},id:e,role:"listbox","aria-label":c,...u.pickerMarker?{"data-picker-menu":""}:{},className:u.list,children:n.map((d,S)=>{let R=d.value===r;return Y("li",{id:`${e}-${S}`,role:"option","aria-selected":R,"aria-disabled":d.disabled||void 0,onMouseEnter:()=>!d.disabled&&i(S),onMouseDown:C=>{C.preventDefault(),d.disabled||a(d.value)},className:u.item(S===o,R&&d.value!=="",!!d.disabled,S===n.length-1),style:u.itemStyle?.(R),children:d.meta===void 0?d.label:Qt(xr,{children:[d.lead,Y("span",{className:"flex-1 whitespace-nowrap",children:d.label}),Y("span",{className:"ml-auto text-[12px] opacity-50",children:d.meta})]})},`${d.value}_${S}`)})})}function Cr({value:e,onChange:t,disabled:n,children:r,className:o,style:i,name:a,id:s,"aria-label":c}){let u=dr.toArray(r).flatMap(C=>{if(!fr(C))return[];if(C.type!=="option")return[];let w=C.props,O=w.value!==void 0?String(w.value):"",M=w.children,I=typeof M=="string"||typeof M=="number"?String(M):O;return[{value:O,label:I,disabled:!!w.disabled}]}),f=e??"",d=gr({items:u,value:f,onPick:C=>t?.({target:{value:C}})}),R=u.find(C=>C.value===f)?.label??u[0]?.label??"";return Qt("div",{ref:d.wrapRef,className:"relative",children:[a&&Y("input",{type:"hidden",name:a,value:f}),Y("button",{ref:C=>{d.triggerRef.current=C},type:"button",disabled:n,"aria-haspopup":"listbox","aria-expanded":d.open,"aria-controls":d.open?d.listId:void 0,"aria-activedescendant":d.activeId,"aria-label":c,id:s,onClick:()=>!n&&d.toggle(),onKeyDown:C=>!n&&d.onTriggerKeyDown(C),className:`block w-full ${o??""}`,style:i,children:Y("span",{className:"block w-full truncate text-left",children:R})}),d.open&&Y(br,{id:d.listId,tone:"select",items:u,value:f,focusIdx:d.focusIdx,onFocus:d.setFocusIdx,onPick:d.pick,listRef:d.listRef})]})}import{jsx as Se,jsxs as De}from"react/jsx-runtime";var Sr="font-mono text-[length:var(--size-label,12px)]",vr="font-semibold uppercase tracking-[0.22em] text-fg";function Zt(e){return`${e??Sr} ${vr}`}function Jt(){return Se("span",{className:"text-accent",children:" *"})}function Er({children:e,required:t,labelFace:n}){return De("span",{className:Zt(n),children:[e,t?Se(Jt,{}):null]})}function Pr({label:e,required:t,hint:n,separate:r,htmlFor:o,labelFace:i,className:a,children:s}){let c=a?`flex flex-col gap-2 ${a}`:"flex flex-col gap-2",u=n?Se("span",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-fg-dim",children:n}):null;return r||n?De("div",{className:c,children:[De("label",{htmlFor:o,className:Zt(i),children:[e,t?Se(Jt,{}):null]}),s,u]}):De("label",{htmlFor:o,className:c,children:[Se(Er,{required:t,labelFace:i,children:e}),s]})}export{Br as a,Wr as b,qr as c,gt as d,qe as e,wr as f,_r as g,Rr as h,Nr as i,sn as j,ln as k,Lr as l,Ir as m,Ge as n,Ne as o,ge as p,Ar as q,Le as r,hn as s,yn as t,Xr as u,Yr as v,_t as w,Xe as x,Vr as y,jr as z,Cn as A,Qr as B,Zr as C,xn as D,Jr as E,vn as F,eo as G,to as H,Rt as I,so as J,lo as K,uo as L,po as M,mo as N,Dr as O,St as P,Fr as Q,Ie as R,Ve as S,_o as T,Ht as U,Wo as V,Xn as W,Go as X,ii as Y,ai as Z,tr as _,ci as $,Kt as aa,di as ba,rr as ca,fi as da,ir as ea,ar as fa,Ci as ga,xi as ha,lr as ia,Pi as ja,_i as ka,gr as la,br as ma,Cr as na,Er as oa,Pr as pa};