efficient-storefront-blocks 0.84.0 → 0.86.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 (146) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/chunks/{EditorPreviewCheckout-3NVDTH56.js → EditorPreviewCheckout-4LNXFNN7.js} +1 -1
  3. package/dist/chunks/{SiteEditorProvider-77K7CGYZ.js → SiteEditorProvider-A2HMVDKS.js} +1 -1
  4. package/dist/chunks/{chunk-F3MB7QCR.js → chunk-ALMIS7CK.js} +1 -1
  5. package/dist/chunks/{chunk-VYOK2XBF.js → chunk-EUKK2IN6.js} +1 -1
  6. package/dist/chunks/chunk-FJRKNPNN.js +340 -0
  7. package/dist/chunks/chunk-SLRULFYY.js +1 -0
  8. package/dist/chunks/{chunk-VJLQXB7I.js → chunk-TGBNREUJ.js} +1 -1
  9. package/dist/chunks/{fitment-data-PWXEDMOA.js → fitment-data-TSYW6AFA.js} +1 -1
  10. package/dist/contract.js +2 -2
  11. package/dist/editor/lib/document/blocks/commerce/DetailRows/fields.js +1 -1
  12. package/dist/editor/lib/document/blocks/commerce/FitmentPicker/fields.d.ts +2 -0
  13. package/dist/editor/lib/document/blocks/commerce/FitmentPicker/fields.js +1 -0
  14. package/dist/editor/lib/document/blocks/commerce/FitmentTable/fields.js +1 -1
  15. package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
  16. package/dist/editor/lib/document/blocks/commerce/SpecTable/fields.js +1 -1
  17. package/dist/editor/lib/document/blocks/commerce/StockFitment/fields.d.ts +2 -0
  18. package/dist/editor/lib/document/blocks/commerce/StockFitment/fields.js +1 -0
  19. package/dist/editor/lib/document/blocks/commerce/index.d.ts +1 -1
  20. package/dist/editor/lib/document/blocks/commerce/index.js +1 -1
  21. package/dist/editor/lib/document/blocks/commerce/page-rules.d.ts +5 -0
  22. package/dist/editor/lib/document/blocks/commerce/page-rules.js +1 -1
  23. package/dist/editor/lib/document/blocks/service/ArticleBody/fields.d.ts +2 -0
  24. package/dist/editor/lib/document/blocks/service/ArticleBody/fields.js +1 -0
  25. package/dist/editor/lib/document/blocks/service/SiteFooter/fields.js +1 -1
  26. package/dist/editor/lib/document/blocks/service/SiteHeader/fields.js +1 -1
  27. package/dist/editor/lib/document/blocks/service/index.d.ts +1 -1
  28. package/dist/editor/lib/document/blocks/service/index.js +1 -1
  29. package/dist/editor/lib/document/box-header.d.ts +1 -1
  30. package/dist/editor/lib/document/box-header.js +1 -1
  31. package/dist/editor/lib/document/config.d.ts +1 -0
  32. package/dist/editor/lib/document/config.js +1 -1
  33. package/dist/editor/lib/document/popup-look-fields.d.ts +4 -0
  34. package/dist/editor/lib/document/popup-look-fields.js +1 -0
  35. package/dist/editor/lib/efficient-backend.js +1 -1
  36. package/dist/editor/lib/efficient-block-sources.js +1 -1
  37. package/dist/editor/lib/storefront-editor-words.d.ts +21 -1
  38. package/dist/editor/lib/storefront-editor-words.js +1 -1
  39. package/dist/editor.css +1 -1
  40. package/dist/index.js +134 -58
  41. package/dist/render/app/globals.css +156 -0
  42. package/dist/render/built-with.json +1 -1
  43. package/dist/render/components/ArticleBody.d.ts +7 -0
  44. package/dist/render/components/ArticleBody.js +1 -0
  45. package/dist/render/components/BoxHeaderBar.d.ts +2 -1
  46. package/dist/render/components/BoxHeaderBar.js +1 -1
  47. package/dist/render/components/CartContext.d.ts +1 -0
  48. package/dist/render/components/CartContext.js +1 -1
  49. package/dist/render/components/CartDrawer.d.ts +4 -3
  50. package/dist/render/components/CartDrawer.js +1 -4
  51. package/dist/render/components/DetailRows.d.ts +6 -1
  52. package/dist/render/components/DetailRows.js +1 -1
  53. package/dist/render/components/PopupFrame.d.ts +10 -1
  54. package/dist/render/components/PopupFrame.js +5 -1
  55. package/dist/render/components/ProductGridSection.d.ts +2 -1
  56. package/dist/render/components/ProductGridSection.js +1 -1
  57. package/dist/render/components/PublishedHeader.js +1 -1
  58. package/dist/render/components/Reviews.d.ts +1 -0
  59. package/dist/render/components/Reviews.js +1 -1
  60. package/dist/render/components/SectionBand.d.ts +2 -1
  61. package/dist/render/components/SectionBand.js +1 -1
  62. package/dist/render/components/SectionBandChoice.d.ts +2 -1
  63. package/dist/render/components/SectionBandChoice.js +1 -1
  64. package/dist/render/components/SectionGroupBody.d.ts +2 -2
  65. package/dist/render/components/SectionGroupBody.js +1 -1
  66. package/dist/render/components/SpecTable.d.ts +3 -1
  67. package/dist/render/components/SpecTable.js +1 -1
  68. package/dist/render/components/TyreSizeGrid.d.ts +17 -0
  69. package/dist/render/components/TyreSizeGrid.js +1 -0
  70. package/dist/render/components/fitment/FitmentPickerGrid.d.ts +5 -1
  71. package/dist/render/components/fitment/FitmentPickerGrid.js +1 -1
  72. package/dist/render/components/fitment/FitmentPickerPart.d.ts +8 -0
  73. package/dist/render/components/fitment/FitmentPickerPart.js +1 -0
  74. package/dist/render/components/fitment/StockFitmentPart.d.ts +4 -0
  75. package/dist/render/components/fitment/StockFitmentPart.js +1 -0
  76. package/dist/render/components/fitment/useVehicleFit.d.ts +2 -1
  77. package/dist/render/components/fitment/useVehicleFit.js +1 -1
  78. package/dist/render/components/pdp-dynamic/DynamicDetailRows.d.ts +2 -0
  79. package/dist/render/components/pdp-dynamic/DynamicDetailRows.js +1 -1
  80. package/dist/render/components/pdp-dynamic/DynamicFitmentTable.d.ts +5 -0
  81. package/dist/render/components/pdp-dynamic/DynamicFitmentTable.js +1 -1
  82. package/dist/render/components/pdp-dynamic/DynamicSpecTable.d.ts +1 -0
  83. package/dist/render/components/pdp-dynamic/DynamicSpecTable.js +1 -1
  84. package/dist/render/components/pdp-dynamic/DynamicTyreSizes.js +1 -1
  85. package/dist/render/components/pdp-dynamic/FitmentTableBlock.d.ts +3 -1
  86. package/dist/render/components/pdp-dynamic/FitmentTableBlock.js +1 -1
  87. package/dist/render/lib/content/article-body-seed.d.ts +9 -0
  88. package/dist/render/lib/content/article-body-seed.js +1 -0
  89. package/dist/render/lib/content/article-body.d.ts +8 -0
  90. package/dist/render/lib/content/article-body.js +5 -0
  91. package/dist/render/lib/content/article-page-seed.d.ts +12 -0
  92. package/dist/render/lib/content/article-page-seed.js +1 -0
  93. package/dist/render/lib/document/blocks/commerce/DetailRows/meta.d.ts +6 -0
  94. package/dist/render/lib/document/blocks/commerce/DetailRows/meta.js +1 -1
  95. package/dist/render/lib/document/blocks/commerce/DetailRows/render.js +1 -1
  96. package/dist/render/lib/document/blocks/commerce/FitmentPicker/meta.d.ts +2 -0
  97. package/dist/render/lib/document/blocks/commerce/FitmentPicker/meta.js +1 -0
  98. package/dist/render/lib/document/blocks/commerce/FitmentPicker/render.d.ts +2 -0
  99. package/dist/render/lib/document/blocks/commerce/FitmentPicker/render.js +1 -0
  100. package/dist/render/lib/document/blocks/commerce/FitmentTable/meta.js +1 -1
  101. package/dist/render/lib/document/blocks/commerce/FitmentTable/render.js +1 -1
  102. package/dist/render/lib/document/blocks/commerce/ProductGrid/render.js +1 -1
  103. package/dist/render/lib/document/blocks/commerce/SpecTable/render.js +1 -1
  104. package/dist/render/lib/document/blocks/commerce/StockFitment/meta.d.ts +2 -0
  105. package/dist/render/lib/document/blocks/commerce/StockFitment/meta.js +1 -0
  106. package/dist/render/lib/document/blocks/commerce/StockFitment/render.d.ts +2 -0
  107. package/dist/render/lib/document/blocks/commerce/StockFitment/render.js +1 -0
  108. package/dist/render/lib/document/blocks/commerce/metas.d.ts +2 -0
  109. package/dist/render/lib/document/blocks/commerce/metas.js +1 -1
  110. package/dist/render/lib/document/blocks/commerce/renders.d.ts +2 -0
  111. package/dist/render/lib/document/blocks/commerce/renders.js +1 -1
  112. package/dist/render/lib/document/blocks/service/ArticleBody/meta.d.ts +8 -0
  113. package/dist/render/lib/document/blocks/service/ArticleBody/meta.js +1 -0
  114. package/dist/render/lib/document/blocks/service/ArticleBody/render.d.ts +2 -0
  115. package/dist/render/lib/document/blocks/service/ArticleBody/render.js +1 -0
  116. package/dist/render/lib/document/blocks/service/SiteFooter/render.js +1 -1
  117. package/dist/render/lib/document/blocks/service/SiteHeader/render.js +1 -1
  118. package/dist/render/lib/document/blocks/service/metas.d.ts +1 -0
  119. package/dist/render/lib/document/blocks/service/metas.js +1 -1
  120. package/dist/render/lib/document/blocks/service/renders.d.ts +1 -0
  121. package/dist/render/lib/document/blocks/service/renders.js +1 -1
  122. package/dist/render/lib/document/card-templates.js +1 -1
  123. package/dist/render/lib/document/current-record.d.ts +4 -15
  124. package/dist/render/lib/document/current-record.js +1 -1
  125. package/dist/render/lib/document/lazy-draws.js +1 -1
  126. package/dist/render/lib/document/render-config.d.ts +1 -0
  127. package/dist/render/lib/document/render-config.js +1 -1
  128. package/dist/render/lib/document/section-to-box-rows-detail.d.ts +2 -0
  129. package/dist/render/lib/document/section-to-box-rows-detail.js +1 -0
  130. package/dist/render/lib/document/section-to-box-rows-reviews.js +1 -1
  131. package/dist/render/lib/document/section-to-box-rows-spec.js +1 -1
  132. package/dist/render/lib/document/storefront-root.js +1 -1
  133. package/dist/render/lib/sections/product-grid-columns.d.ts +5 -0
  134. package/dist/render/lib/sections/product-grid-columns.js +1 -0
  135. package/dist/render/lib/sections/section-band.d.ts +6 -0
  136. package/dist/render/lib/sections/section-band.js +1 -1
  137. package/dist/render/lib/sections/spec-table-band.d.ts +4 -0
  138. package/dist/render/lib/sections/spec-table-band.js +1 -0
  139. package/dist/render/lib/wheels/vehicle-memory.d.ts +13 -0
  140. package/dist/render/lib/wheels/vehicle-memory.js +1 -1
  141. package/dist/words.d.ts +58 -12
  142. package/dist/words.js +5 -5
  143. package/package.json +5 -4
  144. package/dist/chunks/chunk-5EQD5D3L.js +0 -340
  145. package/dist/chunks/chunk-DQFD2BJD.js +0 -1
  146. /package/dist/chunks/{chunk-5EQD5D3L.js.LEGAL.txt → chunk-FJRKNPNN.js.LEGAL.txt} +0 -0
@@ -859,6 +859,32 @@
859
859
  [data-sf-card-shadow="soft"], [data-sf-box-shadow="soft"] { --sf-shadow-step: 0 1px 2px color-mix(in srgb, var(--sf-shadow-color, #141416) 7%, transparent), 0 4px 12px -4px color-mix(in srgb, var(--sf-shadow-color, #141416) 10%, transparent); }
860
860
  [data-sf-card-shadow="lifted"], [data-sf-box-shadow="lifted"] { --sf-shadow-step: 0 2px 4px color-mix(in srgb, var(--sf-shadow-color, #141416) 6%, transparent), 0 14px 30px -10px color-mix(in srgb, var(--sf-shadow-color, #141416) 22%, transparent); }
861
861
  [data-sf-box-shadow] { box-shadow: var(--sf-shadow-step); }
862
+ /* A Box's own Shadow per view (three-views plan 5e, part B2): the builder writes
863
+ `data-sf-box-shadow-tablet` / `-phone` = `on` | `off` only where a view's
864
+ answer differs from the desktop's. Same widths as the Block spacing views. */
865
+ @media (min-width: 720px) and (max-width: 1099.98px) {
866
+ [data-sf-box-shadow-tablet="on"] { box-shadow: var(--sf-shadow-step); }
867
+ [data-sf-box-shadow-tablet="off"] { box-shadow: none; }
868
+ }
869
+ @media not all and (min-width: 720px) {
870
+ [data-sf-box-shadow-phone="on"] { box-shadow: var(--sf-shadow-step); }
871
+ [data-sf-box-shadow-phone="off"] { box-shadow: none; }
872
+ }
873
+ /* A Box's Fill colour and Darken per view (three-views plan 5e, part B3). The
874
+ desktop answer stays INLINE (`background-color` on the Box or its card layer,
875
+ `background` on its Darken wash layer); the builder adds
876
+ `sf-fill-tablet` / `-phone` + `--sf-fill-tablet` / `-phone`, and
877
+ `sf-wash-tablet` / `-phone` + `--sf-wash-tablet` / `-phone`, only where a
878
+ view's answer differs (a phone that follows the tablet carries the phone
879
+ pair too). `!important` so the view beats the inline desktop style. */
880
+ @media (min-width: 720px) and (max-width: 1099.98px) {
881
+ .sf-fill-tablet { background-color: var(--sf-fill-tablet) !important; }
882
+ .sf-wash-tablet { background: var(--sf-wash-tablet) !important; }
883
+ }
884
+ @media not all and (min-width: 720px) {
885
+ .sf-fill-phone { background-color: var(--sf-fill-phone) !important; }
886
+ .sf-wash-phone { background: var(--sf-wash-phone) !important; }
887
+ }
862
888
 
863
889
  /* ─── Heading compression ──────────────────────────────────────────────
864
890
  The Appearance panel's "Headings" compression rung, applied to real headings
@@ -3363,6 +3389,136 @@ em.text-accent {
3363
3389
  padding-block: 0;
3364
3390
  }
3365
3391
 
3392
+ /* A Box's own Block spacing per view (three-views plan 5e, part B2). The
3393
+ builder (efficient-web-builder Flex) writes the desktop answer as above and,
3394
+ only where a view's answer differs from the desktop's, `sf-box-each-tablet` /
3395
+ `sf-box-gap-only-tablet` (and `-phone`; a phone that follows the tablet
3396
+ carries its class too). Each: `revert-layer`, because the rule above is
3397
+ unlayered, so this hands every block shape its own layered `py-*` back.
3398
+ Gap only: `0`, as above. The block shapes are the ones above, each one.
3399
+ Widths: the Tablet view's (720 up to, not including, 1100; the builder's
3400
+ `TABLET_MEDIA`) and the phone's below 720, as the section border's. After the
3401
+ desktop rule, so it wins at equal specificity.
3402
+ scripts/test-box-views-sheet.ts, scripts/browser-box-views.tsx. */
3403
+ @media (min-width: 720px) and (max-width: 1099.98px) {
3404
+ .sf-box-each-tablet > *,
3405
+ .sf-box-each-tablet > .sf-entrance > *,
3406
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > *,
3407
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > *,
3408
+ .sf-box-each-tablet > .sf-section-pad > *,
3409
+ .sf-box-each-tablet > .sf-entrance > .sf-section-pad > *,
3410
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > *,
3411
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > *,
3412
+ .sf-box-each-tablet > .sf-block-size > *,
3413
+ .sf-box-each-tablet > .sf-block-size > .sf-entrance > *,
3414
+ .sf-box-each-tablet > .sf-block-size > .sf-section-pad > *,
3415
+ .sf-box-each-tablet > .sf-block-size > .sf-entrance > .sf-section-pad > *,
3416
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > *,
3417
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > *,
3418
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > *,
3419
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > * {
3420
+ padding-block: revert-layer;
3421
+ }
3422
+ /* …but `revert-layer` also drops a nested Box's own Overlap padding (its
3423
+ unlayered `.sf-gap-overlap-*` rule, above), which an Each Box draws: so a
3424
+ block shape that IS an Overlap Box takes its overlap padding back here. */
3425
+ .sf-box-each-tablet > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3426
+ .sf-box-each-tablet > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3427
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3428
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3429
+ .sf-box-each-tablet > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3430
+ .sf-box-each-tablet > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3431
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3432
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3433
+ .sf-box-each-tablet > .sf-block-size > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3434
+ .sf-box-each-tablet > .sf-block-size > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3435
+ .sf-box-each-tablet > .sf-block-size > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3436
+ .sf-box-each-tablet > .sf-block-size > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3437
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3438
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3439
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3440
+ .sf-box-each-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both) {
3441
+ padding-block: var(--sf-gap-overlap-eff);
3442
+ }
3443
+ .sf-box-gap-only-tablet > *,
3444
+ .sf-box-gap-only-tablet > .sf-entrance > *,
3445
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > *,
3446
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > *,
3447
+ .sf-box-gap-only-tablet > .sf-section-pad > *,
3448
+ .sf-box-gap-only-tablet > .sf-entrance > .sf-section-pad > *,
3449
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > *,
3450
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > *,
3451
+ .sf-box-gap-only-tablet > .sf-block-size > *,
3452
+ .sf-box-gap-only-tablet > .sf-block-size > .sf-entrance > *,
3453
+ .sf-box-gap-only-tablet > .sf-block-size > .sf-section-pad > *,
3454
+ .sf-box-gap-only-tablet > .sf-block-size > .sf-entrance > .sf-section-pad > *,
3455
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > *,
3456
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > *,
3457
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > *,
3458
+ .sf-box-gap-only-tablet > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > * {
3459
+ padding-block: 0;
3460
+ }
3461
+ }
3462
+ @media not all and (min-width: 720px) {
3463
+ .sf-box-each-phone > *,
3464
+ .sf-box-each-phone > .sf-entrance > *,
3465
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > *,
3466
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > *,
3467
+ .sf-box-each-phone > .sf-section-pad > *,
3468
+ .sf-box-each-phone > .sf-entrance > .sf-section-pad > *,
3469
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > *,
3470
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > *,
3471
+ .sf-box-each-phone > .sf-block-size > *,
3472
+ .sf-box-each-phone > .sf-block-size > .sf-entrance > *,
3473
+ .sf-box-each-phone > .sf-block-size > .sf-section-pad > *,
3474
+ .sf-box-each-phone > .sf-block-size > .sf-entrance > .sf-section-pad > *,
3475
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > *,
3476
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > *,
3477
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > *,
3478
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > * {
3479
+ padding-block: revert-layer;
3480
+ }
3481
+ /* …but `revert-layer` also drops a nested Box's own Overlap padding (its
3482
+ unlayered `.sf-gap-overlap-*` rule, above), which an Each Box draws: so a
3483
+ block shape that IS an Overlap Box takes its overlap padding back here. */
3484
+ .sf-box-each-phone > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3485
+ .sf-box-each-phone > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3486
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3487
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3488
+ .sf-box-each-phone > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3489
+ .sf-box-each-phone > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3490
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3491
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3492
+ .sf-box-each-phone > .sf-block-size > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3493
+ .sf-box-each-phone > .sf-block-size > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3494
+ .sf-box-each-phone > .sf-block-size > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3495
+ .sf-box-each-phone > .sf-block-size > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3496
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3497
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3498
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both),
3499
+ .sf-box-each-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > :is(.sf-gap-overlap-block, .sf-gap-overlap-both) {
3500
+ padding-block: var(--sf-gap-overlap-eff);
3501
+ }
3502
+ .sf-box-gap-only-phone > *,
3503
+ .sf-box-gap-only-phone > .sf-entrance > *,
3504
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > *,
3505
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > *,
3506
+ .sf-box-gap-only-phone > .sf-section-pad > *,
3507
+ .sf-box-gap-only-phone > .sf-entrance > .sf-section-pad > *,
3508
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-section-pad > *,
3509
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-entrance > .sf-section-pad > *,
3510
+ .sf-box-gap-only-phone > .sf-block-size > *,
3511
+ .sf-box-gap-only-phone > .sf-block-size > .sf-entrance > *,
3512
+ .sf-box-gap-only-phone > .sf-block-size > .sf-section-pad > *,
3513
+ .sf-box-gap-only-phone > .sf-block-size > .sf-entrance > .sf-section-pad > *,
3514
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > *,
3515
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > *,
3516
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-section-pad > *,
3517
+ .sf-box-gap-only-phone > [data-easel-block] > [data-sf-part-host] > .sf-block-size > .sf-entrance > .sf-section-pad > * {
3518
+ padding-block: 0;
3519
+ }
3520
+ }
3521
+
3366
3522
  /* ── THE VISITOR'S OWN "REDUCE MOTION" SETTING ──────────────────────────────
3367
3523
  [ADD] The Site Respects Reduce Motion.
3368
3524
 
@@ -1,3 +1,3 @@
1
1
  {
2
- "efficient-web-builder": "52.0.0"
2
+ "efficient-web-builder": "55.0.0"
3
3
  }
@@ -0,0 +1,7 @@
1
+ import type { SlotComponent } from "efficient-easel/blocks";
2
+ export interface ArticleBodyProps {
3
+ id: string;
4
+ template?: SlotComponent;
5
+ editing?: boolean;
6
+ }
7
+ export default function ArticleBody({ id, template, editing }: ArticleBodyProps): import("react").JSX.Element | null;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o}from"react/jsx-runtime";import{CardTemplateRows as i}from"efficient-web-builder/render/components/CardRowContext";import{useCurrentRecordOf as n}from"../lib/document/current-record.js";import{ARTICLE_BODY_FIELD as f,BLOG_POST_RECORD_TYPE as m,articleRows as a,sampleArticleRows as d}from"../lib/content/article-body.js";function p({id:l,template:t,editing:s}){const e=n(m),r=e?a(e.fields[f]):s?d():[];return r.length?o(i,{ownerId:l,ownerType:"ArticleBody",Template:t,rows:r,fallback:null,children:c=>o("div",{className:"flex flex-col",children:c})}):null}export{p as default};
@@ -1,10 +1,11 @@
1
1
  import { type ReactNode } from "react";
2
2
  import { type HeaderStickyMode } from "./useHeaderBar.js";
3
3
  export declare const resolveStickyMode: (v: unknown) => HeaderStickyMode;
4
- export default function BoxHeaderBar({ sticky, topTextColor, heightPx, theme, children, }: {
4
+ export default function BoxHeaderBar({ sticky, topTextColor, heightPx, theme, bandCapped, children, }: {
5
5
  sticky?: unknown;
6
6
  topTextColor?: unknown;
7
7
  heightPx?: unknown;
8
8
  theme?: unknown;
9
+ bandCapped?: boolean;
9
10
  children: ReactNode;
10
11
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{jsx as k}from"react/jsx-runtime";import{useEffect as H,useState as v}from"react";import{useRootIsDark as E}from"efficient-shell/theme";import{usePathname as _}from"next/navigation";import{useHeaderBar as y}from"./useHeaderBar.js";import{headerSolidBackground as R,isProductPage as D,resolveHeaderHeightPx as I}from"../lib/content/header-bar.js";import{headerThemeWrap as P}from"../lib/content/header-theme.js";import{HEADER_SET_HEIGHT_VAR as S}from"efficient-web-builder/render/lib/document/header-clearance";import{HEADER_INK_OVERRIDE_ATTR as T,resolveHeaderInkMode as A}from"efficient-web-builder/render/lib/document/header-ink";const B=["none","always","on_scroll_up"],j=e=>B.includes(e)?e:"always";function w({sticky:e,topTextColor:i,heightPx:u,theme:f,children:m}){const t=j(e),n=I(u),{headerRef:o,scrolled:a,navHidden:h}=y({stickyMode:t,heightPx:n}),s=A(i),p=s==="auto"?null:{[T]:s},r=P(f),d=D(_()),[g,b]=v(null);H(()=>b(o.current?.ownerDocument??null),[o]);const x=!E({doc:g,whenUnset:!0}),l=a||d,c=R(x,d);return k("header",{ref:o,"data-scrolled":a||void 0,"data-box-header":"",...p,className:["sf-site-header",...r?[r.className]:[],"flex flex-col justify-center",t==="none"?"absolute":"fixed","inset-x-0 top-0 z-50",l?"border-b border-line backdrop-blur-md":"border-b border-transparent","transition-[background,border-color,transform] duration-300 ease-out"].join(" "),style:{...r?r.style:null,minHeight:`var(${S}, ${n}px)`,...h?{transform:"translateY(-100%)"}:null,...l?{background:c,color:"var(--fg)","--sf-header-ground":c}:{color:"var(--sf-header-overlay-fg)","--sf-header-ground":"var(--sf-header-overlay-ground)"}},children:m})}export{w as default,j as resolveStickyMode};
1
+ "use client";import{jsx as _}from"react/jsx-runtime";import{useEffect as k,useState as E}from"react";import{useRootIsDark as v}from"efficient-shell/theme";import{usePathname as y}from"next/navigation";import{useHeaderBar as D}from"./useHeaderBar.js";import{headerSolidBackground as I,isProductPage as R,resolveHeaderHeightPx as T}from"../lib/content/header-bar.js";import{headerThemeWrap as P}from"../lib/content/header-theme.js";import{HEADER_SET_HEIGHT_VAR as S}from"efficient-web-builder/render/lib/document/header-clearance";import{HEADER_INK_OVERRIDE_ATTR as A,resolveHeaderInkMode as B}from"efficient-web-builder/render/lib/document/header-ink";import{centredCap as j,SITE_WIDTH_CAP as w}from"efficient-web-builder/format/lib/content/page-width";const M=["none","always","on_scroll_up"],C=e=>M.includes(e)?e:"always";function N({sticky:e,topTextColor:i,heightPx:u,theme:f,bandCapped:m=!1,children:h}){const t=C(e),n=T(u),{headerRef:o,scrolled:a,navHidden:p}=D({stickyMode:t,heightPx:n}),s=B(i),g=s==="auto"?null:{[A]:s},r=P(f),d=R(y()),[b,x]=E(null);k(()=>x(o.current?.ownerDocument??null),[o]);const H=!v({doc:b,whenUnset:!0}),l=a||d,c=I(H,d);return _("header",{ref:o,"data-scrolled":a||void 0,"data-box-header":"",...g,className:["sf-site-header",...r?[r.className]:[],"flex flex-col justify-center",t==="none"?"absolute":"fixed","inset-x-0 top-0 z-50",l?"border-b border-line backdrop-blur-md":"border-b border-transparent","transition-[background,border-color,transform] duration-300 ease-out"].join(" "),style:{...r?r.style:null,minHeight:`var(${S}, ${n}px)`,...m?j(w):null,...p?{transform:"translateY(-100%)"}:null,...l?{background:c,color:"var(--fg)","--sf-header-ground":c}:{color:"var(--sf-header-overlay-fg)","--sf-header-ground":"var(--sf-header-overlay-ground)"}},children:h})}export{N as default,C as resolveStickyMode};
@@ -54,6 +54,7 @@ interface CartCtx {
54
54
  warmCatalog: (kind?: ProductKind) => void;
55
55
  add: (line: CartLine) => void;
56
56
  addAndOpen: (line: CartLine) => void;
57
+ setAutoOpen: (on: boolean) => void;
57
58
  remove: (id: string) => void;
58
59
  setQty: (id: string, qty: number) => void;
59
60
  replaceItems: (lines: CartLine[]) => void;
@@ -1 +1 @@
1
- "use client";import{jsx as Ft}from"react/jsx-runtime";import{createContext as vt,useCallback as u,useContext as zt,useEffect as y,useMemo as gt,useRef as M,useState as i}from"react";import{usePathname as Jt}from"next/navigation";import{products as E}from"../lib/api/index.js";import{couponDeferredToCheckout as Xt}from"../lib/cart/coupon-preview.js";import{snapshotCartLines as Yt}from"../lib/cart/snapshot-lines.js";import{MAX_QTY_PER_LINE as Et,orderLinesForSets as Gt,setPrice as Kt}from"../lib/commerce.js";import{UNPRICED_LABEL as Zt}from"../lib/wheels/price-display.js";import{isValidEmail as $t}from"../lib/email-shape.js";import{trackAddToCart as te}from"../lib/google-tag.js";import{shippingStatus as ee}from"../lib/cart/shipping-status.js";import{useCurrency as ne}from"./CurrencyContext.js";const oe=400,se=400,re=1500;function Nt(a){return(a.components?.length??0)>0}function Tt(a,s){return{code:a,valid:s.valid,deferred:Xt(s,s.askedAsShopper),message:s.message||void 0,effects:s.effects??void 0}}function bt(a,s){return Kt(a.components,s)}function W(a,s){const r=bt(a,s);return r===null?null:r*a.qty}function qt(a){return a!=="tyre"}const Bt=vt(null);function ge({children:a,preview:s=!1}){const{currency:r,country:Q,formatMoney:Mt}=ne(),[H,U]=i(s),[l,I]=i([]),[V,It]=i([]),[j,xt]=i([]),[F,Ot]=i(!1),[v,St]=i(!1),[_t,At]=i(!1),[Pt,Dt]=i(!1),[m,z]=i(null),[Ut,kt]=i(0),J=u(()=>kt(t=>t+1),[]),[X,Y]=i(void 0),[N,Rt]=i(null),[c,C]=i(null),[G,x]=i(!1),[p,K]=i(null),O=M(void 0),T=u(()=>U(!0),[]),S=u(()=>U(!1),[]),Z=u(()=>U(t=>!t),[]);y(()=>{s||typeof window>"u"||new URLSearchParams(window.location.search).get("cart")==="open"&&T()},[T,s]);const _=Jt(),$=M(_);y(()=>{$.current!==_&&($.current=_,s||S())},[_,s,S]);const tt=u(t=>{Rt(e=>e?.country===t?.country&&e?.subdivision===t?.subdivision&&e?.postcode===t?.postcode?e:t)},[]),et=u(t=>{Dt(!0),qt(t)&&At(!0)},[]),nt=_t||l.some(t=>qt(t.kind)),ot=Pt||l.length>0;y(()=>{if(s||!nt||F)return;let t=!0;return E.listWheels().then(e=>{t&&(It(e),Ot(!0))}),()=>{t=!1}},[s,nt,F]),y(()=>{if(s||!ot||v)return;let t=!0;return E.listBundles().then(e=>{t&&(xt(e),St(!0))}),()=>{t=!1}},[s,ot,v]);const g=m?.deliveryOptions??[],st=m?.courier??null;y(()=>{m&&K(t=>t&&g.some(e=>e.id===t)?t:g[0]?.id??null)},[m]);const A=u(()=>l.filter(Nt).flatMap(t=>Gt(t.components,t.qty)),[l]),rt=u(async(t,e)=>{const o=t.trim().toUpperCase();if(!o)return;const n=A();if(n.length===0){C({code:o,valid:!1,message:"Add a wheel to the cart first."});return}x(!0),O.current=e;try{const d=await E.validateCoupon({code:o,items:n,currency:r,shippingMethodId:p??void 0,customerEmail:e});C(Tt(o,d))}catch{C({code:o,valid:!1,unchecked:!0,message:"Could not check that code. Please try again."})}finally{x(!1)}},[A,r,p]),ut=u(()=>{C(null),O.current=void 0},[]),ct=u(t=>{if(!c)return;const{code:e}=c;C(o=>o&&o.code===e?{code:e,valid:!1,refused:!0,message:t}:o)},[c]);y(()=>{if(!c||c.refused)return;const t=c.code,e=n=>n!==null&&n.code===t&&!n.refused,o=setTimeout(async()=>{const n=A();if(n.length===0){C(d=>e(d)?{code:t,valid:!1,message:"Add a wheel to the cart first."}:d);return}x(!0);try{const d=await E.validateCoupon({code:t,items:n,currency:r,shippingMethodId:p??void 0,customerEmail:O.current});C(B=>e(B)?Tt(t,d):B)}catch{}finally{x(!1)}},oe);return()=>clearTimeout(o)},[l,r,p]);const k=c&&!c.refused?c.code:void 0;y(()=>{if(s)return;let t=!0;const e=setTimeout(async()=>{const o=A();if(o.length===0){z(null),Y(void 0);return}try{const n=await E.quoteCart({items:o,currency:r,shippingMethodId:p??void 0,couponCode:k,customerEmail:O.current||void 0,country:N?.country||Q||void 0,subdivision:N?.country&&N.subdivision||void 0,postcode:N?.country&&N.postcode||void 0});if(!t)return;z(n)}catch{if(!t)return}Y(k)},se);return()=>{t=!1,clearTimeout(e)}},[l,r,p,k,Q,N,Ut]);const P=u(t=>{I(e=>{const o=e.findIndex(n=>n.id===t.id);return o===-1?[...e,t]:e.map((n,d)=>d===o?{...n,qty:Math.min(Et,n.qty+t.qty)}:n)}),te(t,r)},[r]),it=u(t=>{I(e=>e.filter(o=>o.id!==t))},[]),at=u((t,e)=>{const o=Math.max(1,Math.min(Et,e));I(n=>n.map(d=>d.id===t?{...d,qty:o}:d))},[]),lt=u(t=>{I(t)},[]),[q,wt]=i(null),dt=M(null);dt.current=q;const h=M(null),R=M(""),ft=u((t,e)=>{const o=t.trim().toLowerCase();$t(o)&&wt(n=>n&&n.email===o&&n.firstName===(e??"")?n:{email:o,firstName:e??""})},[]);y(()=>{if(s||!q)return;const t=Yt(l.filter(Nt),n=>W(n,r)===null?Zt:Mt(W(n,r),r)),e={email:q.email,firstName:q.firstName,currency:r,items:t},o=JSON.stringify(e);if(o!==R.current)return h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,R.current=o,E.captureCart(e).catch(n=>{process.env.NODE_ENV!=="production"&&console.warn("abandoned-cart capture failed",n)})},re),()=>{h.current&&(clearTimeout(h.current),h.current=null)}},[l,q,r,s]);const mt=u(()=>{h.current&&(clearTimeout(h.current),h.current=null);const t=dt.current;t&&(R.current="",E.captureCart({email:t.email,firstName:t.firstName,currency:r,items:[]}).catch(e=>{process.env.NODE_ENV!=="production"&&console.warn("abandoned-cart clear failed",e)}))},[r]),pt=gt(()=>{const t=l.reduce((f,b)=>{const D=W(b,r);return D===null?f:f+D},0),e=l.some(f=>bt(f,r)===null),o=l.reduce((f,b)=>f+b.qty,0),n=c?.valid?c.effects:void 0,d=n?Math.min(t,Number(n.discountAmount)):0,B=m?.bundleDiscount??0,Wt=m?.appliedBundles??[],w=!!n?.freeShipping,yt=g.find(f=>f.id===p),Ct=w?0:m?.shipping??yt?.amount??0,Qt=ee({quoted:m!==null,optionCount:g.length,chosenAmount:yt?.amount,couponWaivesFreight:w}),L={};for(const f of n?.freeUnits??[])L[f.partNumber]=(L[f.partNumber]??0)+f.quantity;const Ht=m?.tax??null,Vt=m?m.grandTotal:t-d-B+Ct;return{sets:o,units:l.reduce((f,b)=>f+(b.components??[]).reduce((D,jt)=>D+jt.wheels*b.qty,0),0),subtotal:t,hasUnpricedLine:e,discount:d,bundleDiscount:B,appliedBundles:Wt,shipping:Ct,freeShipping:w,shippingStatus:Qt,freeUnitsByPartNumber:L,tax:Ht,grand:Vt,repricing:!!c?.refused&&m!==null&&X===c?.code,currency:r}},[l,r,c,g,p,m,X]),ht=u(t=>{P(t),T()},[P,T]),Lt=gt(()=>({isOpen:H,preview:s,open:T,close:S,toggle:Z,items:l,catalog:V,bundles:j,warmCatalog:et,add:P,addAndOpen:ht,remove:it,setQty:at,replaceItems:lt,identify:ft,clearCapturedCart:mt,coupon:c,applyCoupon:rt,removeCoupon:ut,refuseCoupon:ct,couponBusy:G,deliveryOptions:g,setQuoteDestination:tt,courier:st,requote:J,shippingMethodId:p,setShippingMethodId:K,totals:pt}),[H,s,T,S,Z,l,V,j,et,P,ht,it,at,lt,ft,mt,c,rt,ut,ct,G,g,tt,st,J,p,pt]);return Ft(Bt.Provider,{value:Lt,children:a})}function Ee(){const a=zt(Bt);if(!a)throw new Error("useCart() must be called inside <CartProvider>. Mount the provider in app/layout.tsx.");return a}export{ge as CartProvider,Nt as isOrderable,W as lineTotal,Ee as useCart};
1
+ "use client";import{jsx as zt}from"react/jsx-runtime";import{createContext as Jt,useCallback as u,useContext as Xt,useEffect as y,useMemo as Nt,useRef as q,useState as i}from"react";import{usePathname as Yt}from"next/navigation";import{products as E}from"../lib/api/index.js";import{couponDeferredToCheckout as Gt}from"../lib/cart/coupon-preview.js";import{snapshotCartLines as Kt}from"../lib/cart/snapshot-lines.js";import{MAX_QTY_PER_LINE as Tt,orderLinesForSets as Zt,setPrice as $t}from"../lib/commerce.js";import{UNPRICED_LABEL as te}from"../lib/wheels/price-display.js";import{isValidEmail as ee}from"../lib/email-shape.js";import{trackAddToCart as ne}from"../lib/google-tag.js";import{shippingStatus as oe}from"../lib/cart/shipping-status.js";import{useCurrency as se}from"./CurrencyContext.js";const re=400,ue=400,ce=1500;function bt(a){return(a.components?.length??0)>0}function qt(a,s){return{code:a,valid:s.valid,deferred:Gt(s,s.askedAsShopper),message:s.message||void 0,effects:s.effects??void 0}}function Bt(a,s){return $t(a.components,s)}function W(a,s){const r=Bt(a,s);return r===null?null:r*a.qty}function Mt(a){return a!=="tyre"}const Ot=Jt(null);function Ne({children:a,preview:s=!1}){const{currency:r,country:Q,formatMoney:It}=se(),[H,R]=i(s),[l,O]=i([]),[V,xt]=i([]),[j,At]=i([]),[F,St]=i(!1),[v,_t]=i(!1),[Pt,Dt]=i(!1),[Rt,Ut]=i(!1),[m,z]=i(null),[kt,wt]=i(0),J=u(()=>wt(t=>t+1),[]),[X,Y]=i(void 0),[N,Lt]=i(null),[c,C]=i(null),[G,I]=i(!1),[p,K]=i(null),x=q(void 0),T=u(()=>R(!0),[]),A=u(()=>R(!1),[]),Z=u(()=>R(t=>!t),[]);y(()=>{s||typeof window>"u"||new URLSearchParams(window.location.search).get("cart")==="open"&&T()},[T,s]);const S=Yt(),$=q(S);y(()=>{$.current!==S&&($.current=S,s||A())},[S,s,A]);const tt=u(t=>{Lt(e=>e?.country===t?.country&&e?.subdivision===t?.subdivision&&e?.postcode===t?.postcode?e:t)},[]),et=u(t=>{Ut(!0),Mt(t)&&Dt(!0)},[]),nt=Pt||l.some(t=>Mt(t.kind)),ot=Rt||l.length>0;y(()=>{if(s||!nt||F)return;let t=!0;return E.listWheels().then(e=>{t&&(xt(e),St(!0))}),()=>{t=!1}},[s,nt,F]),y(()=>{if(s||!ot||v)return;let t=!0;return E.listBundles().then(e=>{t&&(At(e),_t(!0))}),()=>{t=!1}},[s,ot,v]);const g=m?.deliveryOptions??[],st=m?.courier??null;y(()=>{m&&K(t=>t&&g.some(e=>e.id===t)?t:g[0]?.id??null)},[m]);const _=u(()=>l.filter(bt).flatMap(t=>Zt(t.components,t.qty)),[l]),rt=u(async(t,e)=>{const o=t.trim().toUpperCase();if(!o)return;const n=_();if(n.length===0){C({code:o,valid:!1,message:"Add a wheel to the cart first."});return}I(!0),x.current=e;try{const d=await E.validateCoupon({code:o,items:n,currency:r,shippingMethodId:p??void 0,customerEmail:e});C(qt(o,d))}catch{C({code:o,valid:!1,unchecked:!0,message:"Could not check that code. Please try again."})}finally{I(!1)}},[_,r,p]),ut=u(()=>{C(null),x.current=void 0},[]),ct=u(t=>{if(!c)return;const{code:e}=c;C(o=>o&&o.code===e?{code:e,valid:!1,refused:!0,message:t}:o)},[c]);y(()=>{if(!c||c.refused)return;const t=c.code,e=n=>n!==null&&n.code===t&&!n.refused,o=setTimeout(async()=>{const n=_();if(n.length===0){C(d=>e(d)?{code:t,valid:!1,message:"Add a wheel to the cart first."}:d);return}I(!0);try{const d=await E.validateCoupon({code:t,items:n,currency:r,shippingMethodId:p??void 0,customerEmail:x.current});C(M=>e(M)?qt(t,d):M)}catch{}finally{I(!1)}},re);return()=>clearTimeout(o)},[l,r,p]);const U=c&&!c.refused?c.code:void 0;y(()=>{if(s)return;let t=!0;const e=setTimeout(async()=>{const o=_();if(o.length===0){z(null),Y(void 0);return}try{const n=await E.quoteCart({items:o,currency:r,shippingMethodId:p??void 0,couponCode:U,customerEmail:x.current||void 0,country:N?.country||Q||void 0,subdivision:N?.country&&N.subdivision||void 0,postcode:N?.country&&N.postcode||void 0});if(!t)return;z(n)}catch{if(!t)return}Y(U)},ue);return()=>{t=!1,clearTimeout(e)}},[l,r,p,U,Q,N,kt]);const P=u(t=>{O(e=>{const o=e.findIndex(n=>n.id===t.id);return o===-1?[...e,t]:e.map((n,d)=>d===o?{...n,qty:Math.min(Tt,n.qty+t.qty)}:n)}),ne(t,r)},[r]),it=u(t=>{O(e=>e.filter(o=>o.id!==t))},[]),at=u((t,e)=>{const o=Math.max(1,Math.min(Tt,e));O(n=>n.map(d=>d.id===t?{...d,qty:o}:d))},[]),lt=u(t=>{O(t)},[]),[B,Wt]=i(null),dt=q(null);dt.current=B;const h=q(null),k=q(""),ft=u((t,e)=>{const o=t.trim().toLowerCase();ee(o)&&Wt(n=>n&&n.email===o&&n.firstName===(e??"")?n:{email:o,firstName:e??""})},[]);y(()=>{if(s||!B)return;const t=Kt(l.filter(bt),n=>W(n,r)===null?te:It(W(n,r),r)),e={email:B.email,firstName:B.firstName,currency:r,items:t},o=JSON.stringify(e);if(o!==k.current)return h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,k.current=o,E.captureCart(e).catch(n=>{process.env.NODE_ENV!=="production"&&console.warn("abandoned-cart capture failed",n)})},ce),()=>{h.current&&(clearTimeout(h.current),h.current=null)}},[l,B,r,s]);const mt=u(()=>{h.current&&(clearTimeout(h.current),h.current=null);const t=dt.current;t&&(k.current="",E.captureCart({email:t.email,firstName:t.firstName,currency:r,items:[]}).catch(e=>{process.env.NODE_ENV!=="production"&&console.warn("abandoned-cart clear failed",e)}))},[r]),pt=Nt(()=>{const t=l.reduce((f,b)=>{const D=W(b,r);return D===null?f:f+D},0),e=l.some(f=>Bt(f,r)===null),o=l.reduce((f,b)=>f+b.qty,0),n=c?.valid?c.effects:void 0,d=n?Math.min(t,Number(n.discountAmount)):0,M=m?.bundleDiscount??0,Ht=m?.appliedBundles??[],w=!!n?.freeShipping,gt=g.find(f=>f.id===p),Et=w?0:m?.shipping??gt?.amount??0,Vt=oe({quoted:m!==null,optionCount:g.length,chosenAmount:gt?.amount,couponWaivesFreight:w}),L={};for(const f of n?.freeUnits??[])L[f.partNumber]=(L[f.partNumber]??0)+f.quantity;const jt=m?.tax??null,Ft=m?m.grandTotal:t-d-M+Et;return{sets:o,units:l.reduce((f,b)=>f+(b.components??[]).reduce((D,vt)=>D+vt.wheels*b.qty,0),0),subtotal:t,hasUnpricedLine:e,discount:d,bundleDiscount:M,appliedBundles:Ht,shipping:Et,freeShipping:w,shippingStatus:Vt,freeUnitsByPartNumber:L,tax:jt,grand:Ft,repricing:!!c?.refused&&m!==null&&X===c?.code,currency:r}},[l,r,c,g,p,m,X]),ht=q(!0),yt=u(t=>{ht.current=t},[]),Ct=u(t=>{P(t),ht.current&&T()},[P,T]),Qt=Nt(()=>({isOpen:H,preview:s,open:T,close:A,toggle:Z,items:l,catalog:V,bundles:j,warmCatalog:et,add:P,addAndOpen:Ct,setAutoOpen:yt,remove:it,setQty:at,replaceItems:lt,identify:ft,clearCapturedCart:mt,coupon:c,applyCoupon:rt,removeCoupon:ut,refuseCoupon:ct,couponBusy:G,deliveryOptions:g,setQuoteDestination:tt,courier:st,requote:J,shippingMethodId:p,setShippingMethodId:K,totals:pt}),[H,s,T,A,Z,l,V,j,et,P,Ct,yt,it,at,lt,ft,mt,c,rt,ut,ct,G,g,tt,st,J,p,pt]);return zt(Ot.Provider,{value:Qt,children:a})}function Te(){const a=Xt(Ot);if(!a)throw new Error("useCart() must be called inside <CartProvider>. Mount the provider in app/layout.tsx.");return a}export{Ne as CartProvider,bt as isOrderable,W as lineTotal,Te as useCart};
@@ -1,4 +1,5 @@
1
- import { type CartDrawerContent } from "efficient-web-builder/format/lib/content/cart-drawer";
2
- export default function CartDrawer({ content, }: {
1
+ import { type CartDrawerContent, type CartDrawerLook } from "efficient-web-builder/format/lib/content/cart-drawer";
2
+ export default function CartDrawer({ content, look, }: {
3
3
  content?: CartDrawerContent;
4
- }): import("react").JSX.Element | null;
4
+ look?: CartDrawerLook;
5
+ }): import("react").JSX.Element;
@@ -1,4 +1 @@
1
- "use client";import{jsx as r,jsxs as a,Fragment as p}from"react/jsx-runtime";import{useEffect as d,useRef as l}from"react";import{useCart as u}from"./CartContext.js";import{isTyreLine as x}from"../lib/tyres/tyre-purchase.js";import{useTyreCatalog as b}from"./useTyreCatalog.js";import{useModalDismiss as y}from"./useModalDismiss.js";import{CartActions as C,CartCouponRow as g,CartDrawerHeader as h,CartLines as w,CartStatusRail as R,CartTotals as k,CartTrustMarkers as v,CartUpsell as D}from"./cart/drawer-parts.js";import{CART_DRAWER_DEFAULTS as T}from"efficient-web-builder/format/lib/content/cart-drawer";function _({content:e=T}){const{isOpen:t,preview:n,close:o,items:c}=u(),s=l(null),i=l(null),f=b(c.some(x));return y({active:t,onDismiss:o,lockScroll:!n,trapRef:i}),d(()=>{t&&s.current?.focus({preventScroll:!0})},[t]),t?a(p,{children:[r("div",{onClick:o,className:"fixed inset-0 z-[60] backdrop-blur-[4px]",style:{background:"rgba(0,0,0,0.68)",animation:"storefront-cart-fade 350ms ease both"},"aria-hidden":"true"}),a("aside",{ref:i,role:"dialog","aria-label":"Your cart","aria-modal":"true",className:"fixed inset-y-0 right-0 z-[61] flex w-[520px] max-w-[100vw] flex-col border-l border-line bg-bg max-[640px]:w-screen max-[640px]:border-l-0",style:{animation:"storefront-cart-slide 450ms cubic-bezier(.2,.7,.2,1) both",boxShadow:"-30px 0 80px rgba(0,0,0,.5)"},onClick:m=>m.stopPropagation(),children:[r("style",{children:`
2
- @keyframes storefront-cart-fade { from { opacity: 0 } to { opacity: 1 } }
3
- @keyframes storefront-cart-slide { from { transform: translateX(40px); opacity: 0 } to { transform: translateX(0); opacity: 1 } }
4
- `}),r(h,{content:e,closeRef:s}),r(R,{content:e}),a("div",{className:"flex-1 overflow-y-auto [scrollbar-color:var(--site-line)_transparent] [scrollbar-width:thin]",children:[r(w,{content:e,tyres:f}),r(D,{}),r(g,{}),r(v,{content:e})]}),r(k,{}),r(C,{})]})]}):null}export{_ as default};
1
+ "use client";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useEffect as p,useRef as f}from"react";import{useCart as u}from"./CartContext.js";import{isTyreLine as C}from"../lib/tyres/tyre-purchase.js";import{useTyreCatalog as d}from"./useTyreCatalog.js";import R from"./PopupFrame.js";import{CartActions as w,CartCouponRow as T,CartDrawerHeader as x,CartLines as O,CartStatusRail as _,CartTotals as v,CartTrustMarkers as y,CartUpsell as A}from"./cart/drawer-parts.js";import{CART_DRAWER_DEFAULTS as D,resolveCartDrawerLook as L}from"efficient-web-builder/format/lib/content/cart-drawer";const h=L(void 0);function j({content:e=D,look:o=h}){const{isOpen:l,preview:n,close:i,items:c,setAutoOpen:t}=u(),s=f(null),m=d(c.some(C));return p(()=>{t(o.autoOpen)},[o.autoOpen,t]),a(R,{look:o,drawer:{closeRef:s,lockScroll:!n},open:l,onClose:i,label:"Your cart",children:[r(x,{content:e,closeRef:s}),r(_,{content:e}),a("div",{className:"flex-1 overflow-y-auto [scrollbar-color:var(--site-line)_transparent] [scrollbar-width:thin]",children:[r(O,{content:e,tyres:m}),r(A,{}),r(T,{}),r(y,{content:e})]}),r(v,{}),r(w,{})]})}export{j as default};
@@ -1,4 +1,5 @@
1
1
  import type { ReactNode } from "react";
2
+ import type { SourceRow } from "efficient-web-builder/format/lib/content/block-sources";
2
3
  export interface DetailSpec {
3
4
  label?: string;
4
5
  value?: string;
@@ -20,5 +21,9 @@ export interface DetailRowsProps {
20
21
  padTop?: number;
21
22
  padBottom?: number;
22
23
  editing?: boolean;
24
+ template?: unknown;
25
+ nodeId?: string;
23
26
  }
24
- export default function DetailRows({ rows, startLeft, layout, padTop, padBottom, editing, }: DetailRowsProps): import("react").JSX.Element | null;
27
+ export declare function detailCardRow(row: DetailRow): SourceRow;
28
+ export declare function templateCanDraw(rows: readonly DetailRow[]): boolean;
29
+ export default function DetailRows({ rows, startLeft, layout, padTop, padBottom, editing, template, nodeId, }: DetailRowsProps): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- import{jsx as t,jsxs as r}from"react/jsx-runtime";import j from"./SectionBand.js";import z from"efficient-web-builder/render/components/Placeholder";import{withRMark as s}from"efficient-web-builder/render/components/RMark";import{renderGold as x}from"efficient-web-builder/render/components/goldPhrases";import{say as d}from"efficient-web-builder/format/lib/editor-words";import{stripMarkup as $}from"efficient-web-builder/format/lib/markup";import{finiteNumber as h}from"efficient-web-builder/format/lib/finite-number";const m={body:"text-[length:var(--size-body,15px)]",labelSmall:"text-[length:var(--size-label,11px)]",label:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"};function R({rows:b,startLeft:u=!1,layout:v="even",padTop:w,padBottom:N,editing:y=!1}){const i=v==="narrow",o=h(w),c=h(N),p=(b??[]).filter(e=>(e?.eyebrow??"").trim()||(e?.title??"").trim()||(e?.copy??"").trim()||(e?.tag??"").trim()||(e?.image??"").trim()),g=p.length>0?p:y?[{tag:d("Row {n}",{n:1})},{tag:d("Row {n}",{n:2})},{tag:d("Row {n}",{n:3})}]:[];return g.length===0?null:t(j,{className:"relative z-[2] border-b border-line bg-bg",style:{...o===void 0?{}:{paddingTop:o},...c===void 0?{}:{paddingBottom:c}},defaults:{paddingTop:100,paddingBottom:100},children:g.map((e,l)=>{const n=l%2===1!==u;return r("div",{className:["grid items-center py-[60px]",i?"grid-cols-[1fr_460px] gap-[72px]":"grid-cols-2 gap-12","max-view-desktop:grid-cols-1",n?"[direction:rtl] max-view-desktop:[direction:ltr]":"",l>0?"border-t border-line":""].join(" "),children:[r("div",{className:["[direction:ltr] flex flex-col gap-4",i?"max-w-[560px]":"",i&&!n?"ml-auto max-view-desktop:ml-0":""].join(" "),children:[e.eyebrow?.trim()&&t("div",{className:`font-mono ${m.labelLarge} uppercase tracking-[0.2em] text-accent`,children:s(e.eyebrow)}),e.title?.trim()&&t("h2",{className:"font-heading2 text-[length:min(var(--size-headingMedium,clamp(28px,3vw,42px)),var(--sf-heading-max,9999px))] [font-weight:var(--sf-heading-weight,500)] [&_em]:[font-weight:var(--sf-heading-weight-strong,inherit)] leading-[1.1] tracking-[-0.02em]",children:x(e.title,!0)}),e.copy?.trim()&&t("p",{className:`${m.body} leading-[1.6] text-fg-dim`,children:x(e.copy,!1)}),(()=>{const f=(e.specs??[]).filter(a=>(a?.label??"").trim()||(a?.value??"").trim());return f.length===0?null:t("dl",{className:`mt-2 border-t border-line pt-3 font-mono ${m.label} uppercase tracking-[0.1em] leading-[2.1]`,children:f.map((a,k)=>r("div",{className:"flex items-baseline justify-between gap-6",children:[t("dt",{className:"text-fg-dim",children:s(a.label??"")}),t("dd",{className:"text-fg",children:s(a.value??"")})]},k))})})()]}),r("div",{className:["[direction:ltr] flex flex-col gap-3",i?n?"items-end":"items-start":"",i?"max-view-desktop:items-start":""].join(" "),children:[e.media?t("div",{className:"w-full",children:e.media}):t("div",{className:["relative overflow-hidden max-w-full",i?e.imageShape==="wide"?"w-[460px] aspect-[16/9]":"w-[360px] aspect-square":"aspect-square"].join(" "),children:t(z,{label:e.tag?.trim()||e.title?.trim()||`row-${l+1}`,src:e.image||void 0,alt:$(e.title?.trim()||e.tag?.trim()||""),showBackground:!e.image,objectFit:"contain",sizes:i?"(max-width: 1100px) 100vw, 460px":"(max-width: 1100px) 100vw, 50vw"})}),e.tag?.trim()&&t("span",{className:`font-mono ${m.labelSmall} uppercase tracking-[0.2em] text-fg-dim ${n?"text-left":"text-right"}`,children:s(e.tag)})]})]},l)})})}export{R as default};
1
+ import{jsx as i,jsxs as o}from"react/jsx-runtime";import z from"./SectionBand.js";import T from"efficient-web-builder/render/components/Placeholder";import{withRMark as c}from"efficient-web-builder/render/components/RMark";import{renderGold as u}from"efficient-web-builder/render/components/goldPhrases";import{say as g}from"efficient-web-builder/format/lib/editor-words";import{stripMarkup as _}from"efficient-web-builder/format/lib/markup";import{finiteNumber as v}from"efficient-web-builder/format/lib/finite-number";import{CardTemplateRows as $}from"efficient-web-builder/render/components/CardRowContext";const p={body:"text-[length:var(--size-body,15px)]",labelSmall:"text-[length:var(--size-label,11px)]",label:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"};function C(t){return{eyebrow:t.eyebrow?.trim()?t.eyebrow:"",title:t.title?.trim()?t.title:"",copy:t.copy?.trim()?t.copy:"",image:t.image?.trim()?t.image:"",tag:t.tag?.trim()?t.tag:""}}function S(t){return t.every(r=>!r.media&&!(r.specs??[]).some(n=>(n?.label??"").trim()||(n?.value??"").trim()))}const B="[&:not(:first-child)]:border-t [&:not(:first-child)]:border-line";function D({rows:t,startLeft:r=!1,layout:n="even",padTop:y,padBottom:w,editing:N=!1,template:k,nodeId:j}){const a=n==="narrow",f=v(y),x=v(w),h=(t??[]).filter(e=>(e?.eyebrow??"").trim()||(e?.title??"").trim()||(e?.copy??"").trim()||(e?.tag??"").trim()||(e?.image??"").trim()),m=h.length>0?h:N?[{tag:g("Row {n}",{n:1})},{tag:g("Row {n}",{n:2})},{tag:g("Row {n}",{n:3})}]:[];return m.length===0?null:i(z,{className:"relative z-[2] border-b border-line bg-bg",style:{...f===void 0?{}:{paddingTop:f},...x===void 0?{}:{paddingBottom:x}},defaults:{paddingTop:100,paddingBottom:100},children:i($,{ownerId:j??"",ownerType:"DetailRows",Template:S(m)?k:void 0,rows:m.map(C),fallback:m.map((e,s)=>{const d=s%2===1!==r;return o("div",{className:["grid items-center py-[60px]",a?"grid-cols-[1fr_460px] gap-[72px]":"grid-cols-2 gap-12","max-view-desktop:grid-cols-1",d?"[direction:rtl] max-view-desktop:[direction:ltr]":"",s>0?"border-t border-line":""].join(" "),children:[o("div",{className:["[direction:ltr] flex flex-col gap-4",a?"max-w-[560px]":"",a&&!d?"ml-auto max-view-desktop:ml-0":""].join(" "),children:[e.eyebrow?.trim()&&i("div",{className:`font-mono ${p.labelLarge} uppercase tracking-[0.2em] text-accent`,children:c(e.eyebrow)}),e.title?.trim()&&i("h2",{className:"font-heading2 text-[length:min(var(--size-headingMedium,clamp(28px,3vw,42px)),var(--sf-heading-max,9999px))] [font-weight:var(--sf-heading-weight,500)] [&_em]:[font-weight:var(--sf-heading-weight-strong,inherit)] leading-[1.1] tracking-[-0.02em]",children:u(e.title,!0)}),e.copy?.trim()&&i("p",{className:`${p.body} leading-[1.6] text-fg-dim`,children:u(e.copy,!1)}),(()=>{const b=(e.specs??[]).filter(l=>(l?.label??"").trim()||(l?.value??"").trim());return b.length===0?null:i("dl",{className:`mt-2 border-t border-line pt-3 font-mono ${p.label} uppercase tracking-[0.1em] leading-[2.1]`,children:b.map((l,R)=>o("div",{className:"flex items-baseline justify-between gap-6",children:[i("dt",{className:"text-fg-dim",children:c(l.label??"")}),i("dd",{className:"text-fg",children:c(l.value??"")})]},R))})})()]}),o("div",{className:["[direction:ltr] flex flex-col gap-3",a?d?"items-end":"items-start":"",a?"max-view-desktop:items-start":""].join(" "),children:[e.media?i("div",{className:"w-full",children:e.media}):i("div",{className:["relative overflow-hidden max-w-full",a?e.imageShape==="wide"?"w-[460px] aspect-[16/9]":"w-[360px] aspect-square":"aspect-square"].join(" "),children:i(T,{label:e.tag?.trim()||e.title?.trim()||`row-${s+1}`,src:e.image||void 0,alt:_(e.title?.trim()||e.tag?.trim()||""),showBackground:!e.image,objectFit:"contain",sizes:a?"(max-width: 1100px) 100vw, 460px":"(max-width: 1100px) 100vw, 50vw"})}),e.tag?.trim()&&i("span",{className:`font-mono ${p.labelSmall} uppercase tracking-[0.2em] text-fg-dim ${d?"text-left":"text-right"}`,children:c(e.tag)})]})]},s)}),wrapCopy:e=>i("div",{className:B,children:e}),children:e=>e})})}export{D as default,C as detailCardRow,S as templateCanDraw};
@@ -11,10 +11,19 @@ export interface SiteScrim {
11
11
  animation?: string;
12
12
  }
13
13
  export declare const SITE_BLUR: Record<SiteScrim["blur"], string>;
14
+ export interface DrawerFrame {
15
+ closeRef: RefObject<HTMLElement | null>;
16
+ lockScroll?: boolean;
17
+ }
14
18
  export declare function tintOf(hex: string, opacity: number): string;
15
- export default function PopupFrame({ look, site, open, inline, modal, onClose, label, labelledBy, children, }: {
19
+ export declare function closeButtonPlace(look: Pick<PopupLook, "closeButton" | "fullWidth" | "height" | "width">): {
20
+ place: PopupLook["closeButton"];
21
+ until?: number;
22
+ };
23
+ export default function PopupFrame({ look, site, drawer, open, inline, modal, onClose, label, labelledBy, children, }: {
16
24
  look?: PopupLook;
17
25
  site?: SiteScrim;
26
+ drawer?: DrawerFrame;
18
27
  open?: boolean;
19
28
  inline?: boolean;
20
29
  modal?: boolean;
@@ -1 +1,5 @@
1
- "use client";import{jsx as f,jsxs as h}from"react/jsx-runtime";import{useCallback as y,useRef as j}from"react";import{useModalDismiss as v}from"./useModalDismiss.js";const C="color-mix(in oklab, var(--bg) 78%, transparent)",I={6:"backdrop-blur-[6px]",8:"backdrop-blur-[8px]"},R={popup:"z-[90]",consent:"z-[95]"},N={"top-left":{justifyContent:"flex-start",alignItems:"flex-start"},"top-center":{justifyContent:"center",alignItems:"flex-start"},"top-right":{justifyContent:"flex-end",alignItems:"flex-start"},left:{justifyContent:"flex-start",alignItems:"center"},center:{justifyContent:"center",alignItems:"center"},right:{justifyContent:"flex-end",alignItems:"center"},"bottom-left":{justifyContent:"flex-start",alignItems:"flex-end"},"bottom-center":{justifyContent:"center",alignItems:"flex-end"},"bottom-right":{justifyContent:"flex-end",alignItems:"flex-end"}};function T(t,e){const r=Number.parseInt(t.slice(1),16),n=r>>16&255,a=r>>8&255,s=r&255;return`rgba(${n}, ${a}, ${s}, ${Math.round(e)/100})`}function w({look:t,site:e,open:r=!0,inline:n=!1,modal:a=!0,onClose:s,label:c,labelledBy:m,children:p}){const d=j(null),o=y(()=>s?.(),[s]),i=a&&!n;if(v({active:i&&r,onDismiss:o,focusRef:e?e.focusRef:d,trapRef:e?.trapRef}),!n&&!r)return null;if(e){const l=["fixed inset-0",R[e.layer??"popup"],"flex items-center justify-center",e.scroll?"overflow-y-auto":"","p-6",I[e.blur],e.sheetOnPhone?"max-[880px]:items-end max-[880px]:p-0":""].filter(Boolean).join(" ");return f("div",{role:"dialog","aria-modal":"true","aria-label":c,"aria-labelledby":m,"data-popup-frame":"site",onClick:x=>{x.target===x.currentTarget&&o()},className:l,style:{background:C,animation:e.animation},children:p})}if(!t)return null;const g=l=>{!i||!t.outsideClick||l.target===l.currentTarget&&o()},u=t.height==="full",b=h("div",{ref:d,tabIndex:-1,"data-popup-panel":"",className:"relative bg-bg text-fg outline-none",style:{width:t.fullWidth?"100%":`min(${t.width}px, 100%)`,height:u?"100%":void 0,maxHeight:"100%",overflow:"auto",borderRadius:t.fullWidth||u?0:"var(--sf-section-radius, 0px)",...a||n?null:{pointerEvents:"auto"}},children:[t.closeButton!=="none"?f("button",{type:"button","aria-label":"Close",onClick:n?void 0:o,"data-popup-close":t.closeButton,className:"absolute z-[5] flex h-[38px] w-[38px] items-center justify-center border border-line bg-bg font-mono text-[14px] text-fg-dim transition-colors hover:border-accent hover:text-fg",style:t.closeButton==="outside"?{top:-46,right:0}:{top:12,right:12},children:"×"}):null,p]});return f("div",{role:a||n?"dialog":"region","aria-modal":i?!0:void 0,"aria-label":c,"data-popup-frame":n?"inline":"live",onClick:g,className:n?"relative flex min-h-[100vh] w-full":"fixed inset-0 z-[90] flex",style:{...N[t.placement],background:T(t.tintColor,t.tintOpacity),padding:t.fullWidth||u?0:24,...a||n?null:{pointerEvents:"none"}},children:b})}export{I as SITE_BLUR,C as SITE_TINT,w as default,T as tintOf};
1
+ "use client";import{jsx as l,jsxs as b,Fragment as T}from"react/jsx-runtime";import{useCallback as N,useEffect as E,useRef as _}from"react";import{resolveCartDrawerLook as S}from"efficient-web-builder/format/lib/content/cart-drawer";import{useModalDismiss as W}from"./useModalDismiss.js";const D="color-mix(in oklab, var(--bg) 78%, transparent)",O={6:"backdrop-blur-[6px]",8:"backdrop-blur-[8px]"},z={popup:"z-[90]",consent:"z-[95]"},B=S(void 0).width,A="rgba(0,0,0,.5)",L={"top-left":{justifyContent:"flex-start",alignItems:"flex-start"},"top-center":{justifyContent:"center",alignItems:"flex-start"},"top-right":{justifyContent:"flex-end",alignItems:"flex-start"},left:{justifyContent:"flex-start",alignItems:"center"},center:{justifyContent:"center",alignItems:"center"},right:{justifyContent:"flex-end",alignItems:"center"},"bottom-left":{justifyContent:"flex-start",alignItems:"flex-end"},"bottom-center":{justifyContent:"center",alignItems:"flex-end"},"bottom-right":{justifyContent:"flex-end",alignItems:"flex-end"}};function v(t,e){const n=Number.parseInt(t.slice(1),16),s=n>>16&255,a=n>>8&255,o=n&255;return`rgba(${s}, ${a}, ${o}, ${Math.round(e)/100})`}function w(t,e){const n=e||t.closeButton!=="none";return t.outsideClick||!n}const g=48,P=46;function F(t){const e=t.height==="full";return t.closeButton==="inside"||!e&&!t.fullWidth?{place:t.closeButton}:t.closeButton==="outside"?{place:"inside"}:e&&t.fullWidth?{place:"inside"}:e?{place:"inside",until:t.width+g}:{place:"none"}}function H({look:t,site:e,drawer:n,open:s=!0,inline:a=!1,modal:o=!0,onClose:y,label:d,labelledBy:I,children:m}){const p=_(null),f=N(()=>y?.(),[y]),c=o&&!a;W({active:c&&s,onDismiss:f,focusRef:e?e.focusRef:n?void 0:p,trapRef:e?e.trapRef:n?p:void 0,lockScroll:n?.lockScroll});const x=n?.closeRef;if(E(()=>{!x||!c||!s||x.current?.focus({preventScroll:!0})},[x,c,s]),!a&&!s)return null;if(e){const r=["fixed inset-0",z[e.layer??"popup"],"flex items-center justify-center",e.scroll?"overflow-y-auto":"","p-6",O[e.blur],e.sheetOnPhone?"max-[880px]:items-end max-[880px]:p-0":""].filter(Boolean).join(" ");return l("div",{role:"dialog","aria-modal":"true","aria-label":d,"aria-labelledby":I,"data-popup-frame":"site",onClick:u=>{u.target===u.currentTarget&&f()},className:r,style:{background:D,animation:e.animation},children:m})}if(!t)return null;if(n){const r=t.placement==="left",u=t.width!==B;return b(T,{children:[l("div",{onClick:c&&w(t,!0)?f:void 0,className:"fixed inset-0 z-[60] backdrop-blur-[4px]",style:{background:v(t.tintColor,t.tintOpacity).replaceAll(" ",""),animation:"storefront-cart-fade 350ms ease both"},"aria-hidden":"true"}),b("aside",{ref:p,role:"dialog","aria-label":d,"aria-modal":"true",className:`fixed inset-y-0 ${r?"left-0":"right-0"} z-[61] flex ${u?"w-[var(--sf-cart-drawer-width)]":"w-[520px]"} max-w-[100vw] flex-col ${r?"border-r":"border-l"} border-line bg-bg max-[640px]:w-screen ${r?"max-[640px]:border-r-0":"max-[640px]:border-l-0"}`,style:{...u?{"--sf-cart-drawer-width":`${t.width}px`}:null,animation:`${r?"storefront-cart-slide-left":"storefront-cart-slide"} 450ms cubic-bezier(.2,.7,.2,1) both`,boxShadow:`${r?"":"-"}30px 0 80px ${A}`},onClick:R=>R.stopPropagation(),children:[l("style",{children:`
2
+ @keyframes storefront-cart-fade { from { opacity: 0 } to { opacity: 1 } }
3
+ @keyframes storefront-cart-slide { from { transform: translateX(40px); opacity: 0 } to { transform: translateX(0); opacity: 1 } }
4
+ ${r?` @keyframes storefront-cart-slide-left { from { transform: translateX(-40px); opacity: 0 } to { transform: translateX(0); opacity: 1 } }
5
+ `:""}`}),m]})]})}const $=r=>{!c||!w(t,!1)||r.target===r.currentTarget&&f()},h=t.height==="full",C=t.fullWidth||h,i=F(t),j=b("div",{ref:p,tabIndex:-1,"data-popup-panel":"",className:"relative flex flex-col bg-bg text-fg outline-none",style:{width:t.fullWidth?"100%":`min(${t.width}px, 100%)`,height:h?"100%":void 0,maxHeight:t.fullWidth&&!h||i.place==="outside"?`calc(100% - ${g}px)`:"100%",borderRadius:C?0:"var(--sf-section-radius, 0px)",...o||a?null:{pointerEvents:"auto"}},children:[i.place!=="none"?l("button",{type:"button","aria-label":"Close",onClick:a?void 0:f,"data-popup-close":i.place,"data-popup-close-until":i.until,className:"absolute z-[5] flex h-[38px] w-[38px] items-center justify-center border border-line bg-bg font-mono text-[14px] text-fg-dim transition-colors hover:border-accent hover:text-fg",style:i.place==="outside"?{top:-P,right:0}:{top:12,right:12},children:"×"}):null,i.until?l("style",{children:`@container popup-frame (min-width: ${i.until+1}px){[data-popup-close-until="${i.until}"]{display:none}}`}):null,l("div",{"data-popup-scroll":"",className:"min-h-0 flex-1",style:{overflow:"auto"},children:m})]});return l("div",{role:o||a?"dialog":"region","aria-modal":c?!0:void 0,"aria-label":d,"data-popup-frame":a?"inline":"live",onClick:$,className:a?"relative flex min-h-[100vh] w-full":"fixed inset-0 z-[90] flex",style:{...L[t.placement],background:v(t.tintColor,t.tintOpacity),padding:C?0:i.place==="outside"&&t.placement.startsWith("top")?`${24+g}px 24px 24px`:24,...i.until?{containerType:"inline-size",containerName:"popup-frame"}:null,...o||a?null:{pointerEvents:"none"}},children:j})}export{O as SITE_BLUR,D as SITE_TINT,F as closeButtonPlace,H as default,v as tintOf};
@@ -45,6 +45,7 @@ interface Props {
45
45
  catalog?: ProductSummary[];
46
46
  kinds?: string[];
47
47
  columns?: number;
48
+ columnsPhone?: unknown;
48
49
  limit?: number;
49
50
  editing?: boolean;
50
51
  contentCapped?: boolean;
@@ -62,5 +63,5 @@ interface Props {
62
63
  showCardBuy?: boolean;
63
64
  showCardPage?: boolean;
64
65
  }
65
- export default function ProductGridSection({ num, catalog, kinds, title, titleSize, padTop, description, link, products: Products, wheels, source, columns, limit, editing, contentCapped, imageBackground, hover, coverIndex, indexBadge, outline, showBadge, fieldUsage, showCardPrice, showCardFinishes, showCardSizes, showCardBuy, showCardPage, cardImage, gap: gapProp, gapPhone, }: Props): import("react").JSX.Element | null;
66
+ export default function ProductGridSection({ num, catalog, kinds, title, titleSize, padTop, description, link, products: Products, wheels, source, columns, columnsPhone, limit, editing, contentCapped, imageBackground, hover, coverIndex, indexBadge, outline, showBadge, fieldUsage, showCardPrice, showCardFinishes, showCardSizes, showCardBuy, showCardPage, cardImage, gap: gapProp, gapPhone, }: Props): import("react").JSX.Element | null;
66
67
  export {};
@@ -1 +1 @@
1
- "use client";import{jsx as r,jsxs as x,Fragment as Oe}from"react/jsx-runtime";import{GRID_CARD_SHOW as H}from"../lib/sections/card-show-defaults.js";import{useScopeClass as De}from"../lib/use-scope-class.js";import{useEffect as _,useMemo as p,useState as He}from"react";import{CARD_IMAGE_BG_OFF as Ge,resolveCardImageBackground as Ue}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as je}from"efficient-web-builder/format/lib/content/card-image-shape";import{containerGapProps as We,GAP_ZONE_CLASS as Xe}from"efficient-web-builder/format/lib/content/container-gap";import Ke from"next/link";import Ze from"./ProductCard.js";import{CARD_ROWS_GRID_CLASS as qe,cardRowsGap as Ve,cardRowsGridStyle as Ye}from"./WheelCardFrame.js";import{ProductCardChromeProvider as Je}from"./ProductCardChrome.js";import{gridClassImageSizes as Qe}from"../lib/sections/card-image-sizes.js";import{fillRowCss as er}from"../lib/sections/fill-row.js";import{noHoleBands as re,noHoleCss as te,showsASetCard as se}from"../lib/sections/grid-no-hole.js";import{setIsWide as rr,summarySetBuild as tr}from"../lib/wheels/set-mode.js";import{answersForKind as ie}from"../lib/content/field-usage.js";import{wheelCardEyebrowShows as sr}from"./ProductCardEyebrow.js";import ir from"./NoCurrencyNote.js";import{DEFAULT_CARD_OUTLINE as nr,cardIndexCss as or,parseCardIndexFormat as ar}from"efficient-web-builder/format/lib/sections/product-card-style";import{DEFAULT_COVER_INDEX as lr}from"../lib/wheels/cover-rendering.js";import{SITE_WIDTH_CAP as dr,centredCap as mr}from"efficient-web-builder/format/lib/content/page-width";import{ProductCatalogProvider as cr,SectionWheelsProvider as pr}from"./ProductRef.js";import{useCurrency as gr}from"./CurrencyContext.js";import{COLLECTION_ATTR as ur,useCatalogFilter as hr}from"./catalog/CatalogFilterContext.js";import fr from"./SectionBand.js";import{useInsideSiteGutter as xr}from"efficient-web-builder/render/components/SiteGutterFrame";import{renderGold as G,renderHeadline as wr}from"efficient-web-builder/render/components/goldPhrases";import{applyCatalogFilters as vr}from"../lib/wheels/catalog-filters.js";import{normalizeCatalogRows as yr}from"../lib/wheels/wheel-summary-casing.js";import Cr from"./TyreSummaryCard.js";import{itemKind as U,plpKindNoun as br}from"../lib/catalog/plp-item.js";import{filterBarCategoryOf as Sr,gridKindsOf as Mr,gridRowsOf as $r}from"../lib/wheels/grid-source.js";import{useUnifiedProductCatalog as Nr}from"./useProductCatalog.js";import{STICKY_UNDERHEADER_CLASS as _r}from"efficient-web-builder/render/lib/document/header-clearance";import{finishFamiliesOf as Er}from"../lib/wheels/finish-defaults.js";import{lugCountsOf as Tr}from"../lib/wheels/lug-count.js";import{diametersOf as zr}from"../lib/wheels/size-range.js";import{say as Lr}from"efficient-web-builder/format/lib/editor-words";import{DEFAULT_TITLE_SIZE as Ir}from"../lib/sections/product-grid-title.js";const i={headingMediumUpTo800Xs:"max-view-wide:text-[length:var(--size-headingMedium,28px)]",headingMediumUpTo800Small:"max-view-wide:text-[length:var(--size-headingMedium,32px)]",headingMediumUpTo800Large:"max-view-wide:text-[length:var(--size-headingMedium,36px)]",headingMediumUpTo800Xl:"max-view-wide:text-[length:var(--size-headingMedium,40px)]",body:"text-[length:var(--size-body,13px)]",headingMedium1:"text-[length:var(--size-headingMedium,40px)]",headingMedium2:"text-[length:var(--size-headingMedium,48px)]",headingMedium3:"text-[length:var(--size-headingMedium,56px)]",headingMedium4:"text-[length:var(--size-headingMedium,64px)]",labelSmall:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"},ne={1:"grid-cols-1",2:"grid-cols-2 max-view-wide:grid-cols-1",3:"grid-cols-3 max-view-wide:grid-cols-1",4:"grid-cols-4 max-view-desktop:grid-cols-2 max-view-wide:grid-cols-1",5:"grid-cols-5 max-view-desktop:grid-cols-2 max-view-wide:grid-cols-1",6:"grid-cols-6 max-view-desktop:grid-cols-3 max-view-wide:grid-cols-1"},oe=[{value:"para",label:"Paragraph size — 13px",cls:`font-mono font-normal uppercase tracking-[0.22em] ${i.labelLarge}`},{value:"sm",label:"Small — 40px",cls:`font-heading2 font-medium tracking-[-0.03em] ${i.headingMedium1} ${i.headingMediumUpTo800Xs}`},{value:"md",label:"Medium — 48px",cls:`font-heading2 font-medium tracking-[-0.03em] ${i.headingMedium2} ${i.headingMediumUpTo800Small}`},{value:"lg",label:"Large — 56px",cls:`font-heading2 font-medium tracking-[-0.03em] ${i.headingMedium3} ${i.headingMediumUpTo800Large}`},{value:"xl",label:"Extra large — 64px",cls:`font-heading2 font-medium tracking-[-0.03em] ${i.headingMedium4} ${i.headingMediumUpTo800Xl}`}];function Pr(w){return(oe.find(g=>g.value===w)??oe.find(g=>g.value===Ir)).cls}function Ar({num:w,catalog:g,kinds:E,title:T,titleSize:ae,padTop:j,description:C,link:v,products:le,wheels:de,source:d,columns:me,limit:n,editing:y,contentCapped:ce=!1,imageBackground:pe,hover:ge,coverIndex:ue,indexBadge:he,outline:fe,showBadge:xe,fieldUsage:u,showCardPrice:we,showCardFinishes:ve,showCardSizes:ye,showCardBuy:Ce,showCardPage:be,cardImage:Se,gap:Me,gapPhone:$e}){const z=p(()=>u?ie(u,"alloy-wheel"):void 0,[u]),Ne=p(()=>u?ie(u,"tyre"):void 0,[u]),e=De("pg"),m=ne[Math.min(6,Math.max(1,me??4))]??ne[4],W=typeof n=="number"&&n>0,X=ce,_e=xr(),K=Nr(y===!0&&!!d),a=p(()=>d?yr($r(d,E,K??g??[])):null,[g,K,d,E]),c=Sr(d),h=c!==null,{filters:b,reportCount:L,reportLugs:I,reportSizes:P,reportFinishes:A,reportCategories:R,vehicle:Z}=hr(),{currency:B}=gr(),k=h&&!!b.process&&b.process!==c,t=p(()=>a?h?vr(a,b,B,Z.fit):a:null,[a,h,b,B,Z.fit]);_(()=>(R(e,c===null?[]:[c]),()=>R(e,[])),[c,R,e]),_(()=>{if(h)return L(e,k?0:t?.length??0),()=>L(e,0)},[h,k,t,L,e]);const Ee=p(()=>{const s=(t??[]).filter(l=>U(l)!=="tyre");if(s.length===0)return!1;const o=s.some(l=>!!l.process);return s.some(l=>!!l.setWords)||sr({kind:!1,brand:!1,process:o},z??[])},[t,z]),S=p(()=>({lugs:Tr(a??[]),sizes:zr(a??[]),finishes:Er(a??[])}),[a]);_(()=>(I(e,S.lugs),P(e,S.sizes),A(e,S.finishes),()=>{I(e,[]),P(e,[]),A(e,[])}),[S,I,P,A,e]);const f=We("ProductGrid",Me,"both",$e),q=f.className.includes(Xe),F=`${e} grid${f.className} bg-[var(--catalog-grid-bg)] ${m}`,Te=q?`${F} ${qe}`:F,ze=q?{...f.style,...Ye(Ve(f))}:f.style,Le=t?t.length>0?r("div",{className:Te,style:ze,children:t.map((s,o)=>U(s)==="tyre"?r(Cr,{item:s,currency:B,editing:y,fieldUsage:Ne},`tyre:${s.slug}-${o}`):r(Ze,{wheel:s,variant:"catalog"},`${s.slug}-${o}`))}):y?r("div",{className:"flex min-h-[320px] items-center justify-center rounded bg-surface-2 p-4 text-center",children:r("span",{className:`font-mono ${i.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:Lr("No products in “{name}” yet",{name:d?.name??""})})}):null:r(le,{className:F,style:f.style,minEmptyHeight:320}),M=t?t.length:null,V=br(Mr(d,E)),Ie=w||T||C||v?x("div",{className:`${_r} sticky top-[var(--sf-header-h,88px)] z-30 mb-5 flex items-center justify-between gap-4 max-view-wide:flex-wrap max-view-wide:gap-y-2 border-b border-line bg-bg/95 py-3 backdrop-blur-md ${X||_e?"":"-mx-[var(--sf-site-gutter,40px)] px-[var(--sf-site-gutter,40px)] max-view-wide:-mx-[min(20px,var(--sf-site-gutter,40px))] max-view-wide:px-[min(20px,var(--sf-site-gutter,40px))]"}`,children:[x("div",{className:"flex min-w-0 items-end gap-6 max-view-wide:flex-col max-view-wide:items-stretch max-view-wide:gap-3",children:[w&&r("span",{className:`font-mono ${i.labelLarge} leading-none uppercase tracking-[0.22em] text-fg-dim`,children:G(w)}),T&&r("h2",{className:`${Pr(ae)} leading-none text-fg max-view-wide:leading-[1] [&>span]:block`,children:wr(T,!1)})]}),(C||v||M!==null)&&x("div",{className:"flex items-center gap-5 max-view-wide:gap-3 view-wide:grow view-wide:justify-end",children:[C&&r("span",{className:`max-w-[340px] truncate font-display ${i.body} leading-[1.4] text-fg-dim max-view-wide:hidden view-wide:w-0 view-wide:grow view-wide:text-right`,children:G(C)}),v&&x(Ke,{href:v.href,className:`inline-flex items-center gap-2 whitespace-nowrap font-mono ${i.labelLarge} uppercase tracking-[0.2em] text-fg-dim transition-colors hover:text-fg`,children:[G(v.text),r("span",{"aria-hidden":!0,children:"→"})]}),M!==null&&x("span",{className:`whitespace-nowrap font-mono ${i.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:[M," ",M===1?V.one:V.many]})]})]}):null,Pe=typeof j=="number"?{"--pg-pt":`${j}px`}:{},Y=ar(he),$=p(()=>{if(!t)return null;const s=t.map(o=>U(o)!=="tyre"&&rr(tr(o))?2:1);return se(s,n)?re(m,s,n):null},[t,m,n]),[Ae,Re]=He("");_(()=>{if(t)return;const s=document.querySelector(`.${e}`);if(!s)return;const o=()=>{const l=[...s.children].map(Fe=>Fe.classList.contains("col-span-2")?2:1);Re(se(l,n)?te(e,re(m,l,n,!1),l.length):"")};o();const D=new MutationObserver(o);return D.observe(s,{childList:!0}),()=>D.disconnect()},[t,e,m,n]);const Be=$?$[0].tracks:t?W?Math.min(t.length,n):t.length:void 0,N=$?te(e,$,t.length):Ae,J=N?"":er(e,m,{limit:n,cards:t?.length}),Q=or(e,Y),ee=x(Oe,{children:[W&&!N&&r("style",{children:`.${e} > *:nth-child(n+${n+1}){display:none}`}),N&&r("style",{children:N}),J&&r("style",{children:J}),Q&&r("style",{children:Q}),Ie,Le,r(ir,{editing:y})]});if(k)return null;const O=r(fr,{attrs:h&&c!==null?{[ur]:c}:void 0,className:"relative z-[2] bg-bg px-[var(--sf-site-gutter,40px)] pt-[var(--pg-pt)] pb-[120px] max-view-wide:px-[min(20px,var(--sf-site-gutter,40px))] max-view-wide:pt-[70px] max-view-wide:pb-[70px]",column:null,style:{...Pe,...je(Se)},defaults:{"--pg-pt":"120px"},children:X?r("div",{style:mr(dr),children:ee}):ee}),ke=a?O:y?r(cr,{children:O}):r(pr,{wheels:de,children:O});return r(Je,{imageSizes:Qe(m,Be),imageBackgroundFill:Ue(pe,Ge),hover:ge,coverIndex:ue??lr,indexBadge:Y,outline:fe??nr,showBadge:xe??!0,fieldUsage:z,reserveEyebrow:Ee,showCardPrice:we??!0,showCardFinishes:ve??!0,showCardSizes:ye??H.showCardSizes,showCardBuy:Ce??H.showCardBuy,showCardPage:be??H.showCardPage,children:ke})}export{oe as TITLE_SIZES,Ar as default};
1
+ "use client";import{jsx as r,jsxs as x,Fragment as De}from"react/jsx-runtime";import{GRID_CARD_SHOW as D}from"../lib/sections/card-show-defaults.js";import{useScopeClass as He}from"../lib/use-scope-class.js";import{useEffect as _,useMemo as p,useState as Ue}from"react";import{CARD_IMAGE_BG_OFF as je,resolveCardImageBackground as We}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as Xe}from"efficient-web-builder/format/lib/content/card-image-shape";import{containerGapProps as Ke,GAP_ZONE_CLASS as Ze}from"efficient-web-builder/format/lib/content/container-gap";import qe from"next/link";import Ve from"./ProductCard.js";import{CARD_ROWS_GRID_CLASS as Ye,cardRowsGap as Je,cardRowsGridStyle as Qe}from"./WheelCardFrame.js";import{ProductCardChromeProvider as er}from"./ProductCardChrome.js";import{gridClassImageSizes as rr}from"../lib/sections/card-image-sizes.js";import{fillRowCss as tr}from"../lib/sections/fill-row.js";import{noHoleBands as re,noHoleCss as te,showsASetCard as ne}from"../lib/sections/grid-no-hole.js";import{setIsWide as nr,summarySetBuild as sr}from"../lib/wheels/set-mode.js";import{answersForKind as se}from"../lib/content/field-usage.js";import{wheelCardEyebrowShows as or}from"./ProductCardEyebrow.js";import ar from"./NoCurrencyNote.js";import{DEFAULT_CARD_OUTLINE as ir,cardIndexCss as lr,parseCardIndexFormat as dr}from"efficient-web-builder/format/lib/sections/product-card-style";import{DEFAULT_COVER_INDEX as mr}from"../lib/wheels/cover-rendering.js";import{SITE_WIDTH_CAP as cr,centredCap as pr}from"efficient-web-builder/format/lib/content/page-width";import{ProductCatalogProvider as ur,SectionWheelsProvider as gr}from"./ProductRef.js";import{useCurrency as hr}from"./CurrencyContext.js";import{COLLECTION_ATTR as fr,useCatalogFilter as xr}from"./catalog/CatalogFilterContext.js";import wr from"./SectionBand.js";import{useInsideBox as vr,useInsideSiteGutter as yr}from"efficient-web-builder/render/components/SiteGutterFrame";import{productGridColumnsClass as Cr}from"../lib/sections/product-grid-columns.js";import{renderGold as H,renderHeadline as br}from"efficient-web-builder/render/components/goldPhrases";import{applyCatalogFilters as Sr}from"../lib/wheels/catalog-filters.js";import{normalizeCatalogRows as $r}from"../lib/wheels/wheel-summary-casing.js";import Mr from"./TyreSummaryCard.js";import{itemKind as U,plpKindNoun as Nr}from"../lib/catalog/plp-item.js";import{filterBarCategoryOf as _r,gridKindsOf as Er,gridRowsOf as Tr}from"../lib/wheels/grid-source.js";import{useUnifiedProductCatalog as zr}from"./useProductCatalog.js";import{STICKY_UNDERHEADER_CLASS as Ir}from"efficient-web-builder/render/lib/document/header-clearance";import{finishFamiliesOf as Lr}from"../lib/wheels/finish-defaults.js";import{lugCountsOf as Ar}from"../lib/wheels/lug-count.js";import{diametersOf as Br}from"../lib/wheels/size-range.js";import{say as Pr}from"efficient-web-builder/format/lib/editor-words";import{DEFAULT_TITLE_SIZE as Rr}from"../lib/sections/product-grid-title.js";const s={headingMediumUpTo800Xs:"max-view-wide:text-[length:var(--size-headingMedium,28px)]",headingMediumUpTo800Small:"max-view-wide:text-[length:var(--size-headingMedium,32px)]",headingMediumUpTo800Large:"max-view-wide:text-[length:var(--size-headingMedium,36px)]",headingMediumUpTo800Xl:"max-view-wide:text-[length:var(--size-headingMedium,40px)]",body:"text-[length:var(--size-body,13px)]",headingMedium1:"text-[length:var(--size-headingMedium,40px)]",headingMedium2:"text-[length:var(--size-headingMedium,48px)]",headingMedium3:"text-[length:var(--size-headingMedium,56px)]",headingMedium4:"text-[length:var(--size-headingMedium,64px)]",labelSmall:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"},oe=[{value:"para",label:"Paragraph size — 13px",cls:`font-mono font-normal uppercase tracking-[0.22em] ${s.labelLarge}`},{value:"sm",label:"Small — 40px",cls:`font-heading2 font-medium tracking-[-0.03em] ${s.headingMedium1} ${s.headingMediumUpTo800Xs}`},{value:"md",label:"Medium — 48px",cls:`font-heading2 font-medium tracking-[-0.03em] ${s.headingMedium2} ${s.headingMediumUpTo800Small}`},{value:"lg",label:"Large — 56px",cls:`font-heading2 font-medium tracking-[-0.03em] ${s.headingMedium3} ${s.headingMediumUpTo800Large}`},{value:"xl",label:"Extra large — 64px",cls:`font-heading2 font-medium tracking-[-0.03em] ${s.headingMedium4} ${s.headingMediumUpTo800Xl}`}];function Fr(w){return(oe.find(u=>u.value===w)??oe.find(u=>u.value===Rr)).cls}function Or({num:w,catalog:u,kinds:E,title:T,titleSize:ae,padTop:j,description:C,link:v,products:ie,wheels:le,source:d,columns:de,columnsPhone:me,limit:o,editing:y,contentCapped:ce=!1,imageBackground:pe,hover:ue,coverIndex:ge,indexBadge:he,outline:fe,showBadge:xe,fieldUsage:g,showCardPrice:we,showCardFinishes:ve,showCardSizes:ye,showCardBuy:Ce,showCardPage:be,cardImage:Se,gap:$e,gapPhone:Me}){const z=p(()=>g?se(g,"alloy-wheel"):void 0,[g]),Ne=p(()=>g?se(g,"tyre"):void 0,[g]),e=He("pg"),m=Cr(de,me),W=typeof o=="number"&&o>0,X=ce,_e=yr(),Ee=vr(),Te=_e||Ee,K=zr(y===!0&&!!d),i=p(()=>d?$r(Tr(d,E,K??u??[])):null,[u,K,d,E]),c=_r(d),h=c!==null,{filters:b,reportCount:I,reportLugs:L,reportSizes:A,reportFinishes:B,reportCategories:P,vehicle:Z}=xr(),{currency:R}=hr(),F=h&&!!b.process&&b.process!==c,t=p(()=>i?h?Sr(i,b,R,Z.fit):i:null,[i,h,b,R,Z.fit]);_(()=>(P(e,c===null?[]:[c]),()=>P(e,[])),[c,P,e]),_(()=>{if(h)return I(e,F?0:t?.length??0),()=>I(e,0)},[h,F,t,I,e]);const ze=p(()=>{const n=(t??[]).filter(l=>U(l)!=="tyre");if(n.length===0)return!1;const a=n.some(l=>!!l.process);return n.some(l=>!!l.setWords)||or({kind:!1,brand:!1,process:a},z??[])},[t,z]),S=p(()=>({lugs:Ar(i??[]),sizes:Br(i??[]),finishes:Lr(i??[])}),[i]);_(()=>(L(e,S.lugs),A(e,S.sizes),B(e,S.finishes),()=>{L(e,[]),A(e,[]),B(e,[])}),[S,L,A,B,e]);const f=Ke("ProductGrid",$e,"both",Me),q=f.className.includes(Ze),O=`${e} grid${f.className} bg-[var(--catalog-grid-bg)] ${m}`,Ie=q?`${O} ${Ye}`:O,Le=q?{...f.style,...Qe(Je(f))}:f.style,Ae=t?t.length>0?r("div",{className:Ie,style:Le,children:t.map((n,a)=>U(n)==="tyre"?r(Mr,{item:n,currency:R,editing:y,fieldUsage:Ne},`tyre:${n.slug}-${a}`):r(Ve,{wheel:n,variant:"catalog"},`${n.slug}-${a}`))}):y?r("div",{className:"flex min-h-[320px] items-center justify-center rounded bg-surface-2 p-4 text-center",children:r("span",{className:`font-mono ${s.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:Pr("No products in “{name}” yet",{name:d?.name??""})})}):null:r(ie,{className:O,style:f.style,minEmptyHeight:320}),$=t?t.length:null,V=Nr(Er(d,E)),Be=w||T||C||v?x("div",{className:`${Ir} sticky top-[var(--sf-header-h,88px)] z-30 mb-5 flex items-center justify-between gap-4 max-view-wide:flex-wrap max-view-wide:gap-y-2 border-b border-line bg-bg/95 py-3 backdrop-blur-md ${X||Te?"":"-mx-[var(--sf-site-gutter,40px)] px-[var(--sf-site-gutter,40px)] max-view-wide:-mx-[min(20px,var(--sf-site-gutter,40px))] max-view-wide:px-[min(20px,var(--sf-site-gutter,40px))]"}`,children:[x("div",{className:"flex min-w-0 items-end gap-6 max-view-wide:flex-col max-view-wide:items-stretch max-view-wide:gap-3",children:[w&&r("span",{className:`font-mono ${s.labelLarge} leading-none uppercase tracking-[0.22em] text-fg-dim`,children:H(w)}),T&&r("h2",{className:`${Fr(ae)} leading-none text-fg max-view-wide:leading-[1] [&>span]:block`,children:br(T,!1)})]}),(C||v||$!==null)&&x("div",{className:"flex items-center gap-5 max-view-wide:gap-3 view-wide:grow view-wide:justify-end",children:[C&&r("span",{className:`max-w-[340px] truncate font-display ${s.body} leading-[1.4] text-fg-dim max-view-wide:hidden view-wide:w-0 view-wide:grow view-wide:text-right`,children:H(C)}),v&&x(qe,{href:v.href,className:`inline-flex items-center gap-2 whitespace-nowrap font-mono ${s.labelLarge} uppercase tracking-[0.2em] text-fg-dim transition-colors hover:text-fg`,children:[H(v.text),r("span",{"aria-hidden":!0,children:"→"})]}),$!==null&&x("span",{className:`whitespace-nowrap font-mono ${s.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:[$," ",$===1?V.one:V.many]})]})]}):null,Pe=typeof j=="number"?{"--pg-pt":`${j}px`}:{},Y=dr(he),M=p(()=>{if(!t)return null;const n=t.map(a=>U(a)!=="tyre"&&nr(sr(a))?2:1);return ne(n,o)?re(m,n,o):null},[t,m,o]),[Re,Fe]=Ue("");_(()=>{if(t)return;const n=document.querySelector(`.${e}`);if(!n)return;const a=()=>{const l=[...n.children].map(ke=>ke.classList.contains("col-span-2")?2:1);Fe(ne(l,o)?te(e,re(m,l,o,!1),l.length):"")};a();const k=new MutationObserver(a);return k.observe(n,{childList:!0}),()=>k.disconnect()},[t,e,m,o]);const Oe=M?M[0].tracks:t?W?Math.min(t.length,o):t.length:void 0,N=M?te(e,M,t.length):Re,J=N?"":tr(e,m,{limit:o,cards:t?.length}),Q=lr(e,Y),ee=x(De,{children:[W&&!N&&r("style",{children:`.${e} > *:nth-child(n+${o+1}){display:none}`}),N&&r("style",{children:N}),J&&r("style",{children:J}),Q&&r("style",{children:Q}),Be,Ae,r(ar,{editing:y})]});if(F)return null;const G=r(wr,{attrs:h&&c!==null?{[fr]:c}:void 0,className:"relative z-[2] bg-bg px-[var(--sf-site-gutter,40px)] pt-[var(--pg-pt)] pb-[120px] max-view-wide:px-[min(20px,var(--sf-site-gutter,40px))] max-view-wide:pt-[70px] max-view-wide:pb-[70px]",column:null,inAnyBox:!0,style:{...Pe,...Xe(Se)},defaults:{"--pg-pt":"120px"},children:X?r("div",{style:pr(cr),children:ee}):ee}),Ge=i?G:y?r(ur,{children:G}):r(gr,{wheels:le,children:G});return r(er,{imageSizes:rr(m,Oe),imageBackgroundFill:We(pe,je),hover:ue,coverIndex:ge??mr,indexBadge:Y,outline:fe??ir,showBadge:xe??!0,fieldUsage:z,reserveEyebrow:ze,showCardPrice:we??!0,showCardFinishes:ve??!0,showCardSizes:ye??D.showCardSizes,showCardBuy:Ce??D.showCardBuy,showCardPage:be??D.showCardPage,children:Ge})}export{oe as TITLE_SIZES,Or as default};
@@ -1 +1 @@
1
- "use client";import{jsx as t}from"react/jsx-runtime";import{Render as i}from"efficient-easel/render";import n from"./BoxHeaderBar.js";import{headerRenderConfig as s}from"../lib/document/render-config.js";import{migrateRenamedProps as p}from"efficient-web-builder/format/lib/document/renamed-props";function m({group:e}){const r=p({root:{props:{}},content:[e],zones:{}}),o=e.props??{};return t(n,{sticky:o.sticky,topTextColor:o.topTextColor,heightPx:o.heightPx,theme:o.sectionAccent,children:t(i,{config:s(),data:r})})}export{m as default};
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{Render as n}from"efficient-easel/render";import i from"./BoxHeaderBar.js";import{headerRenderConfig as p}from"../lib/document/render-config.js";import{migrateRenamedProps as m}from"efficient-web-builder/format/lib/document/renamed-props";import{chromeOwnWidth as s}from"efficient-web-builder/format/lib/content/section-width";function a({group:e}){const r=m({root:{props:{}},content:[e],zones:{}}),o=e.props??{};return t(i,{sticky:o.sticky,topTextColor:o.topTextColor,heightPx:o.heightPx,theme:o.sectionAccent,bandCapped:s(e.props??{}).background==="content",children:t(n,{config:p(),data:r})})}export{a as default};
@@ -19,4 +19,5 @@ export interface ReviewsProps {
19
19
  cards?: ReactNode;
20
20
  omitHead?: boolean;
21
21
  }
22
+ export declare const FRAME_OWN_BOX = "mx-auto max-w-[var(--sf-site-width,1600px)] px-[var(--sf-site-gutter,40px)] pt-0 pb-[84px] max-[960px]:px-[min(24px,var(--sf-site-gutter,40px))]";
22
23
  export default function Reviews({ look, eyebrow, title, columns, rows, editing, sample, cards, omitHead, }: ReviewsProps): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- import{jsx as e,Fragment as h,jsxs as i}from"react/jsx-runtime";import u from"efficient-web-builder/render/components/SectionEyebrow";import{renderHeadline as b,splitParagraphs as v}from"efficient-web-builder/render/components/goldPhrases";import N from"./RatingStars.js";import y from"./SectionBand.js";const t={headingMediumUpTo800:"max-view-wide:text-[length:min(var(--size-headingMedium,32px),var(--sf-heading-max,9999px))]",headingMedium:"text-[length:min(var(--size-headingMedium,44px),var(--sf-heading-max,9999px))]",bodySmall:"text-[length:var(--size-body,15px)]",bodyLarge:"text-[length:var(--size-body,19px)]",label:"text-[length:var(--size-label,12px)]"},w="mx-auto max-w-[var(--sf-site-width,1600px)] px-[var(--sf-site-gutter,40px)] py-[84px] max-[960px]:px-[min(24px,var(--sf-site-gutter,40px))]",M="mx-auto max-w-[var(--sf-site-width,1600px)] px-[var(--sf-site-gutter,40px)] pt-0 pb-[84px] max-[960px]:px-[min(24px,var(--sf-site-gutter,40px))]";function k({look:d,eyebrow:n,title:r,columns:p,rows:s=[],editing:o=!1,sample:x=!1,cards:g,omitHead:l=!1}){const c=Math.min(3,Math.max(1,p??3));return!o&&s.length===0?null:i(y,{className:"relative z-[2] border-t border-line bg-surface",column:l?M:w,children:[l?null:i(h,{children:[(n??"").trim()&&e(u,{text:n??"",look:d,className:"mb-4 block"}),(r??"").trim()&&e("h2",{className:`mb-12 font-heading2 ${t.headingMedium} font-medium uppercase leading-none tracking-[-0.02em] text-fg max-view-wide:mb-8 ${t.headingMediumUpTo800}`,children:b(r??"",!1)})]}),e("div",{className:"sf-card grid grid-cols-1 gap-px border border-line bg-line min-[700px]:[grid-template-columns:repeat(var(--rv-cols),minmax(0,1fr))]",style:{"--rv-cols":String(c)},children:g??s.map(a=>i("article",{className:["flex flex-col gap-4 bg-bg p-10 max-view-wide:p-8",x?"opacity-60":""].join(" "),children:[a.rating!==void 0&&e(N,{rating:a.rating}),(a.title??"").trim()&&e("h3",{className:`font-display ${t.bodyLarge} font-medium uppercase leading-[1.2] tracking-[-0.01em] text-fg`,children:a.title}),e("div",{className:`flex-1 font-serif ${t.bodySmall} leading-[1.65] text-fg-dim`,children:v(a.quote).map((f,m)=>e("p",{className:m?"mt-3":"",children:f},m))}),i("footer",{className:"flex items-baseline justify-between gap-4 border-t border-line pt-5",children:[e("span",{className:`font-mono ${t.label} uppercase tracking-[0.22em] text-fg`,children:a.name}),e("span",{className:`font-mono ${t.label} uppercase tracking-[0.18em] text-fg-dim`,children:a.meta??""})]})]},a.key))})]})}export{k as default};
1
+ import{jsx as e,Fragment as h,jsxs as i}from"react/jsx-runtime";import u from"efficient-web-builder/render/components/SectionEyebrow";import{renderHeadline as b,splitParagraphs as v}from"efficient-web-builder/render/components/goldPhrases";import N from"./RatingStars.js";import y from"./SectionBand.js";const t={headingMediumUpTo800:"max-view-wide:text-[length:min(var(--size-headingMedium,32px),var(--sf-heading-max,9999px))]",headingMedium:"text-[length:min(var(--size-headingMedium,44px),var(--sf-heading-max,9999px))]",bodySmall:"text-[length:var(--size-body,15px)]",bodyLarge:"text-[length:var(--size-body,19px)]",label:"text-[length:var(--size-label,12px)]"},w="mx-auto max-w-[var(--sf-site-width,1600px)] px-[var(--sf-site-gutter,40px)] py-[84px] max-[960px]:px-[min(24px,var(--sf-site-gutter,40px))]",M="mx-auto max-w-[var(--sf-site-width,1600px)] px-[var(--sf-site-gutter,40px)] pt-0 pb-[84px] max-[960px]:px-[min(24px,var(--sf-site-gutter,40px))]";function k({look:d,eyebrow:n,title:r,columns:p,rows:s=[],editing:o=!1,sample:x=!1,cards:g,omitHead:l=!1}){const c=Math.min(3,Math.max(1,p??3));return!o&&s.length===0?null:i(y,{className:"relative z-[2] border-t border-line bg-surface",column:l?M:w,children:[l?null:i(h,{children:[(n??"").trim()&&e(u,{text:n??"",look:d,className:"mb-4 block"}),(r??"").trim()&&e("h2",{className:`mb-12 font-heading2 ${t.headingMedium} font-medium uppercase leading-none tracking-[-0.02em] text-fg max-view-wide:mb-8 ${t.headingMediumUpTo800}`,children:b(r??"",!1)})]}),e("div",{className:"sf-card grid grid-cols-1 gap-px border border-line bg-line min-[700px]:[grid-template-columns:repeat(var(--rv-cols),minmax(0,1fr))]",style:{"--rv-cols":String(c)},children:g??s.map(a=>i("article",{className:["flex flex-col gap-4 bg-bg p-10 max-view-wide:p-8",x?"opacity-60":""].join(" "),children:[a.rating!==void 0&&e(N,{rating:a.rating}),(a.title??"").trim()&&e("h3",{className:`font-display ${t.bodyLarge} font-medium uppercase leading-[1.2] tracking-[-0.01em] text-fg`,children:a.title}),e("div",{className:`flex-1 font-serif ${t.bodySmall} leading-[1.65] text-fg-dim`,children:v(a.quote).map((f,m)=>e("p",{className:m?"mt-3":"",children:f},m))}),i("footer",{className:"flex items-baseline justify-between gap-4 border-t border-line pt-5",children:[e("span",{className:`font-mono ${t.label} uppercase tracking-[0.22em] text-fg`,children:a.name}),e("span",{className:`font-mono ${t.label} uppercase tracking-[0.18em] text-fg-dim`,children:a.meta??""})]})]},a.key))})]})}export{M as FRAME_OWN_BOX,k as default};
@@ -1,6 +1,6 @@
1
1
  import type { CSSProperties, ReactNode } from "react";
2
2
  export { BAND_CAP } from "../lib/sections/section-band.js";
3
- export default function SectionBand({ className, capped, column, style, defaults, id, attrs, children, }: {
3
+ export default function SectionBand({ className, capped, column, style, defaults, id, attrs, inAnyBox, children, }: {
4
4
  className: string;
5
5
  capped?: boolean;
6
6
  column?: string | null;
@@ -8,5 +8,6 @@ export default function SectionBand({ className, capped, column, style, defaults
8
8
  defaults?: CSSProperties;
9
9
  id?: string;
10
10
  attrs?: Record<string, string>;
11
+ inAnyBox?: boolean;
11
12
  children?: ReactNode;
12
13
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- import{jsx as o}from"react/jsx-runtime";import{EDITORIAL_COLUMN as B}from"efficient-web-builder/format/lib/content/page-width";import{BAND_CAP as A,bandClassesInBox as d}from"../lib/sections/section-band.js";import C from"./SectionBandChoice.js";import{BAND_CAP as j}from"../lib/sections/section-band.js";function N({className:i,capped:p=!1,column:n=B,style:e,defaults:s,id:r,attrs:a,children:t}){const f=d(i),c=n===null?"":d(n),m=o("section",{...a,className:f||void 0,style:e,id:r,children:c?o("div",{className:c,children:t}):t}),l=s?{...s,...e}:e,x=o("section",{...a,className:p?`${A} ${i}`:i,style:l,id:r,children:n===null?t:o("div",{className:n,children:t})});return o(C,{inBox:m,atTop:x})}export{j as BAND_CAP,N as default};
1
+ import{jsx as o}from"react/jsx-runtime";import{EDITORIAL_COLUMN as A}from"efficient-web-builder/format/lib/content/page-width";import{BAND_CAP as C,bandClassesInBox as d}from"../lib/sections/section-band.js";import N from"./SectionBandChoice.js";import{BAND_CAP as v}from"../lib/sections/section-band.js";function _({className:e,capped:f=!1,column:n=A,style:i,defaults:s,id:a,attrs:r,inAnyBox:p=!1,children:t}){const l=d(e),c=n===null?"":d(n),m=o("section",{...r,className:l||void 0,style:i,id:a,children:c?o("div",{className:c,children:t}):t}),x=s?{...s,...i}:i,B=o("section",{...r,className:f?`${C} ${e}`:e,style:x,id:a,children:n===null?t:o("div",{className:n,children:t})});return o(N,{inBox:m,atTop:B,anyBox:p})}export{v as BAND_CAP,_ as default};
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
- export default function SectionBandChoice({ inBox, atTop }: {
2
+ export default function SectionBandChoice({ inBox, atTop, anyBox }: {
3
3
  inBox: ReactNode;
4
4
  atTop: ReactNode;
5
+ anyBox?: boolean;
5
6
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{Fragment as r,jsx as n}from"react/jsx-runtime";import{useInsideSiteGutter as i}from"efficient-web-builder/render/components/SiteGutterFrame";function o({inBox:e,atTop:t}){return n(r,{children:i()?e:t})}export{o as default};
1
+ "use client";import{Fragment as o,jsx as r}from"react/jsx-runtime";import{useInsideBox as u,useInsideSiteGutter as a}from"efficient-web-builder/render/components/SiteGutterFrame";function c({inBox:e,atTop:t,anyBox:n=!1}){const i=a(),s=u();return r(o,{children:i||n&&s?e:t})}export{c as default};
@@ -1,9 +1,9 @@
1
1
  import type { SlotComponent } from "efficient-easel/blocks";
2
- export default function SectionGroupBody({ place, sections: Sections, editing, fullWidth, navTextCase, menuRow, }: {
2
+ export default function SectionGroupBody({ place, sections: Sections, editing, widths, navTextCase, menuRow, }: {
3
3
  place: "header" | "footer";
4
4
  sections: SlotComponent;
5
5
  editing?: boolean;
6
- fullWidth?: unknown;
6
+ widths: Readonly<Record<string, unknown>>;
7
7
  navTextCase?: unknown;
8
8
  menuRow?: unknown;
9
9
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{jsx as o}from"react/jsx-runtime";import{PhoneMenuToolsProvider as i}from"efficient-web-builder/render/components/PhoneMenuTools";import{resolveMenuRow as f,resolveNavTextCase as u}from"../lib/content/header-bar.js";function m({place:e,sections:r,editing:s=!1,fullWidth:n=!1,navTextCase:a,menuRow:d}){const t=o(e==="footer"?"footer":"div",{"data-section-group":e,...e==="header"?{"data-header-nav-case":u(a),"data-header-menu-row":f(d)??"top"}:null,className:s&&e==="footer"?"sf-theme-surfaces bg-bg text-fg":void 0,style:n===!0?{"--sf-site-width":"100vw"}:void 0,children:o(r,{minEmptyHeight:120})});return e==="header"?o(i,{children:t}):t}export{m as default};
1
+ "use client";import{jsx as e}from"react/jsx-runtime";import{PhoneMenuToolsProvider as m}from"efficient-web-builder/render/components/PhoneMenuTools";import{SectionGroupWidthsProvider as h}from"efficient-web-builder/render/components/SiteGutterFrame";import{chromeOwnWidth as p}from"efficient-web-builder/format/lib/content/section-width";import{centredCap as g,SITE_WIDTH_CAP as v}from"efficient-web-builder/format/lib/content/page-width";import{resolveMenuRow as x,resolveNavTextCase as b}from"../lib/content/header-bar.js";function w({place:o,sections:d,editing:l=!1,widths:c,navTextCase:u,menuRow:i}){const a=o==="footer"?"footer":"div",n=p(c),t=n.content==="full"?"100vw":n.contentMax===null?null:`${n.contentMax}px`,r=o==="footer"&&n.background==="content"?g(v):null,f=t===null&&r===null?void 0:{...r,...t===null?null:{"--sf-site-width":t}},s=e(a,{"data-section-group":o,...o==="header"?{"data-header-nav-case":b(u),"data-header-menu-row":x(i)??"top"}:null,className:l&&o==="footer"?"sf-theme-surfaces bg-bg text-fg":void 0,style:f,children:e(h,{value:{background:n.background,content:n.content==="content"?"content":null},children:e(d,{minEmptyHeight:120})})});return o==="header"?e(m,{children:s}):s}export{w as default};