efficient-storefront-blocks 0.75.0 → 0.77.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.
- package/CHANGELOG.md +46 -0
- package/dist/chunks/EditorPreviewCheckout-GNQP4MQ4.js +4 -0
- package/dist/chunks/{SiteEditorProvider-N4T55FAV.js → SiteEditorProvider-R3HXJAPW.js} +1 -1
- package/dist/chunks/chunk-BOJGJXIU.js +311 -0
- package/dist/chunks/chunk-CAULWKXR.js +1 -0
- package/dist/chunks/chunk-GDR5GGVW.js +1 -0
- package/dist/chunks/chunk-OWYNZAAY.js +1 -0
- package/dist/chunks/chunk-ZIZWJZ5T.js +1 -0
- package/dist/chunks/{fitment-data-5ZSHENM3.js → fitment-data-JNQKYQIB.js} +1 -1
- package/dist/contract.js +2 -2
- package/dist/editor/components/BlogSource.js +1 -1
- package/dist/editor/components/CategoryProductFields.d.ts +22 -0
- package/dist/editor/components/CategoryProductFields.js +1 -0
- package/dist/editor/components/CategorySource.d.ts +12 -0
- package/dist/editor/components/CategorySource.js +1 -1
- package/dist/editor/components/CollectionPicker.js +1 -1
- package/dist/editor/components/CountryShowAsTiles.js +1 -1
- package/dist/editor/components/EditorPreviewChat.js +1 -11
- package/dist/editor/components/EditorPreviewSurface.js +1 -1
- package/dist/editor/components/GalleryProductBinding.js +1 -1
- package/dist/editor/components/GalleryShowcaseSource.js +1 -1
- package/dist/editor/components/HeaderSettingsPanel.d.ts +8 -4
- package/dist/editor/components/HeaderSettingsPanel.js +1 -1
- package/dist/editor/components/MenuPicker.js +1 -1
- package/dist/editor/components/PreviewProductPicker.js +1 -1
- package/dist/editor/components/ProductHeroSource.js +1 -1
- package/dist/editor/components/ProductPicker.js +1 -1
- package/dist/editor/components/SocialLinksDoor.js +1 -1
- package/dist/editor/components/SpecTableSource.js +1 -1
- package/dist/editor/lib/document/block-align-row.d.ts +2 -0
- package/dist/editor/lib/document/block-align-row.js +1 -0
- package/dist/editor/lib/document/blocks/commerce/AccountBlock/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/AlloyWheelsListing/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/BundleOffer/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CartBlock/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CatalogFilterBar/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CheckoutCTA/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CollectionCard/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/Collections/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CompatibleTyres/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/CountrySwitchBlock/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/DeliveryOptions/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/DetailRows/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/EuTyreLabel/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/FitmentFinder/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/FitmentTable/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/Gallery/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/GalleryB/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/GalleryItem/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductGallery/fields.d.ts +2 -2
- package/dist/editor/lib/document/blocks/commerce/ProductGallery/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductHero/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/RelatedProducts/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/SearchBlock/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/SpecTable/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/TyreFitment/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/TyreSizes/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/shared-fields.d.ts +1 -0
- package/dist/editor/lib/document/blocks/commerce/shared-fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/AppointmentBooking/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/BookingBox/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/ContactCards/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/ContactRouting/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/Events/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/Footer/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterDivider/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterEmailSignup/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterGroup/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterLogo/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterMenu/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterMessaging/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterPayment/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterSocial/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/FooterText/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/Form/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/MessagingCards/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/OpeningHours/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/RateTable/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/RatingBlock/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/ReviewForm/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/Reviews/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/SiteHeader/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/SubmitBox/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/SubmitBuild/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/Subscribe/fields.js +1 -1
- package/dist/editor/lib/document/blocks/service/SubscribeBlogs/fields.js +1 -1
- package/dist/editor/lib/document/box-header.js +1 -1
- package/dist/editor/lib/document/config.d.ts +16 -16
- package/dist/editor/lib/document/config.js +1 -1
- package/dist/editor/lib/editor-currency-source.js +1 -1
- package/dist/editor/lib/storefront-editor-words.d.ts +10 -13
- package/dist/editor/lib/storefront-editor-words.js +1 -1
- package/dist/editor.css +1 -1
- package/dist/index.js +214 -724
- package/dist/links.js +1 -1
- package/dist/render/app/globals.css +45 -79
- package/dist/render/built-with.json +1 -1
- package/dist/render/components/BoxHeaderBar.js +1 -1
- package/dist/render/components/CartContext.d.ts +1 -0
- package/dist/render/components/CartContext.js +1 -1
- package/dist/render/components/CartDrawer.js +2 -2
- package/dist/render/components/CatalogFilterBarSection.d.ts +1 -1
- package/dist/render/components/CatalogFilterBarSection.js +1 -1
- package/dist/render/components/ChatWidget.js +1 -1
- package/dist/render/components/Collections.js +1 -1
- package/dist/render/components/CompatibleTyres.js +1 -1
- package/dist/render/components/ConsentPanel.js +1 -1
- package/dist/render/components/ContactRouting.js +1 -1
- package/dist/render/components/CouponField.js +1 -1
- package/dist/render/components/CurrencyContext.js +1 -1
- package/dist/render/components/Events.d.ts +2 -1
- package/dist/render/components/Events.js +1 -1
- package/dist/render/components/FitmentTable.js +1 -1
- package/dist/render/components/FooterGroup.d.ts +3 -2
- package/dist/render/components/FooterGroup.js +1 -1
- package/dist/render/components/FooterLogo.d.ts +2 -1
- package/dist/render/components/FooterMenu.js +1 -1
- package/dist/render/components/FooterPayment.d.ts +1 -2
- package/dist/render/components/FooterPayment.js +1 -1
- package/dist/render/components/FooterSocial.d.ts +1 -2
- package/dist/render/components/FooterSocial.js +1 -1
- package/dist/render/components/FormBlock.js +1 -1
- package/dist/render/components/GalleryGrid.d.ts +2 -1
- package/dist/render/components/GalleryGrid.js +1 -1
- package/dist/render/components/GalleryItem.js +1 -1
- package/dist/render/components/GalleryShowcase.js +1 -1
- package/dist/render/components/Header.js +1 -1
- package/dist/render/components/HeaderTools.js +1 -1
- package/dist/render/components/Lightbox.d.ts +2 -2
- package/dist/render/components/Lightbox.js +1 -1
- package/dist/render/components/LinkedProductHero.d.ts +2 -0
- package/dist/render/components/Notice.d.ts +6 -0
- package/dist/render/components/Notice.js +1 -0
- package/dist/render/components/PopupFrame.d.ts +17 -4
- package/dist/render/components/PopupFrame.js +1 -1
- package/dist/render/components/ProductGallery.js +1 -1
- package/dist/render/components/ProductGridSection.d.ts +2 -1
- package/dist/render/components/ProductGridSection.js +1 -1
- package/dist/render/components/ProductHeroPanel.d.ts +3 -1
- package/dist/render/components/ProductHeroPanel.js +1 -1
- package/dist/render/components/ProductLightbox.js +1 -1
- package/dist/render/components/ReviewForm.js +1 -1
- package/dist/render/components/SpecTable.d.ts +2 -1
- package/dist/render/components/SpecTable.js +1 -1
- package/dist/render/components/SubscribePopup.js +2 -2
- package/dist/render/components/TyreFitVerdicts.d.ts +2 -1
- package/dist/render/components/TyreFitVerdicts.js +1 -1
- package/dist/render/components/TyreRenderSvg.js +1 -1
- package/dist/render/components/TyreVehicleFitment.js +1 -1
- package/dist/render/components/WheelCardFrame.d.ts +3 -0
- package/dist/render/components/WheelCardFrame.js +1 -1
- package/dist/render/components/booking/BookingRegions.js +1 -1
- package/dist/render/components/catalog/CatalogFilterBar.d.ts +4 -4
- package/dist/render/components/catalog/CatalogFilterBar.js +1 -1
- package/dist/render/components/catalog/CatalogFilterContext.d.ts +5 -3
- package/dist/render/components/catalog/CatalogFilterContext.js +1 -1
- package/dist/render/components/catalog/FilterPill.d.ts +3 -1
- package/dist/render/components/catalog/FilterPill.js +1 -1
- package/dist/render/components/checkout/CheckoutPageClient.d.ts +4 -0
- package/dist/render/components/checkout/CheckoutPageClient.js +1 -1
- package/dist/render/components/checkout/checkout-parts.js +1 -1
- package/dist/render/components/checkout/checkout-state.d.ts +25 -1
- package/dist/render/components/checkout/checkout-state.js +3 -3
- package/dist/render/components/fitment/StockFitmentCard.js +1 -1
- package/dist/render/components/pdp-dynamic/DynamicProductGallery.js +1 -1
- package/dist/render/components/pdp-dynamic/DynamicProductHero.d.ts +2 -0
- package/dist/render/components/pdp-dynamic/DynamicRelatedProducts.js +1 -1
- package/dist/render/components/pdp-dynamic/DynamicSpecTable.js +1 -1
- package/dist/render/components/pdp-dynamic/RecordPhotoGallery.js +1 -1
- package/dist/render/components/product-hero/TyreHeroFitment.d.ts +2 -1
- package/dist/render/components/product-hero/TyreHeroFitment.js +1 -1
- package/dist/render/components/product-hero/VehicleQuestion.d.ts +1 -6
- package/dist/render/components/product-hero/VehicleQuestion.js +1 -1
- package/dist/render/components/product-hero/WheelHeroFitment.js +1 -1
- package/dist/render/components/product-hero/trust-bullets.d.ts +5 -0
- package/dist/render/components/product-hero/trust-bullets.js +1 -0
- package/dist/render/components/useModalDismiss.d.ts +2 -1
- package/dist/render/components/useModalDismiss.js +1 -1
- package/dist/render/components/useTyreFitAnswer.d.ts +1 -0
- package/dist/render/components/useTyreFitAnswer.js +1 -1
- package/dist/render/components/wheels-plp/AlloyWheelsListing.js +1 -1
- package/dist/render/components/wheels-plp/PlpNotifyMeDialog.js +1 -1
- package/dist/render/lib/api/index.d.ts +6 -3
- package/dist/render/lib/api/index.js +1 -1
- package/dist/render/lib/api/types.d.ts +3 -0
- package/dist/render/lib/booking/appointment-time.d.ts +2 -0
- package/dist/render/lib/booking/appointment-time.js +1 -0
- package/dist/render/lib/catalog/from-wheel.js +1 -1
- package/dist/render/lib/catalog/plp-item.js +1 -1
- package/dist/render/lib/checkout/pay-first.d.ts +34 -0
- package/dist/render/lib/checkout/pay-first.js +1 -0
- package/dist/render/lib/checkout/stripe-appearance.d.ts +10 -0
- package/dist/render/lib/checkout/stripe-appearance.js +1 -0
- package/dist/render/lib/checkout/wallet-return.d.ts +1 -1
- package/dist/render/lib/commerce.d.ts +1 -0
- package/dist/render/lib/commerce.js +1 -1
- package/dist/render/lib/content/legacy-block-align.d.ts +2 -0
- package/dist/render/lib/content/legacy-block-align.js +1 -0
- package/dist/render/lib/content/menu-row.d.ts +0 -3
- package/dist/render/lib/content/menu-row.js +1 -1
- package/dist/render/lib/document/blocks/commerce/AlloyWheelsListing/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/BundleOffer/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/CheckoutCTA/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/Collections/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/CompatibleTyres/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/DeliveryOptions/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/DetailRows/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/EuTyreLabel/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/FitmentFinder/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/FitmentTable/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/GalleryB/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductGrid/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductGrid/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductHero/meta.d.ts +6 -0
- package/dist/render/lib/document/blocks/commerce/ProductHero/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductHero/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/RelatedProducts/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/SpecTable/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/SpecTable/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/TyreFitment/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/TyreSizes/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/ContactCards/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/ContactRouting/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/Events/render.js +1 -1
- package/dist/render/lib/document/blocks/service/FooterGroup/render.js +1 -1
- package/dist/render/lib/document/blocks/service/FooterPayment/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/FooterSocial/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/MessagingCards/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/OpeningHours/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/RateTable/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/SubmitBuild/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/Subscribe/meta.js +1 -1
- package/dist/render/lib/document/blocks/service/SubscribeBlogs/meta.js +1 -1
- package/dist/render/lib/document/lazy-draws.js +1 -1
- package/dist/render/lib/document/render-client.d.ts +8 -3
- package/dist/render/lib/document/render-client.js +1 -1
- package/dist/render/lib/document/section-to-box-rows-reviews.js +1 -1
- package/dist/render/lib/document/storefront-root.d.ts +0 -2
- package/dist/render/lib/document/storefront-root.js +1 -1
- package/dist/render/lib/field-input.d.ts +1 -0
- package/dist/render/lib/field-input.js +1 -0
- package/dist/render/lib/sections/content-cap-gutter.d.ts +1 -0
- package/dist/render/lib/sections/content-cap-gutter.js +1 -0
- package/dist/render/lib/sections/hero-trust-bullets.d.ts +2 -0
- package/dist/render/lib/sections/hero-trust-bullets.js +1 -0
- package/dist/render/lib/tyres/spec-sheet.d.ts +17 -0
- package/dist/render/lib/tyres/spec-sheet.js +1 -1
- package/dist/render/lib/tyres/tyre-fit-copy.js +1 -1
- package/dist/render/lib/tyres/tyre-vehicle-fitment.d.ts +3 -1
- package/dist/render/lib/tyres/tyre-vehicle-fitment.js +1 -1
- package/dist/render/lib/use-scope-class.d.ts +1 -0
- package/dist/render/lib/use-scope-class.js +1 -0
- package/dist/render/lib/wheels/catalog-default-layout.d.ts +3 -3
- package/dist/render/lib/wheels/catalog-default-layout.js +1 -1
- package/dist/render/lib/wheels/catalog-filters.d.ts +2 -2
- package/dist/render/lib/wheels/catalog-filters.js +1 -1
- package/dist/render/lib/wheels/grid-source.d.ts +7 -1
- package/dist/render/lib/wheels/grid-source.js +1 -1
- package/dist/render/lib/wheels/plp-hydrate.js +1 -1
- package/dist/words.d.ts +46 -50
- package/dist/words.js +6 -6
- package/package.json +4 -4
- package/dist/chunks/EditorPreviewCheckout-27GNLSNR.js +0 -4
- package/dist/chunks/chunk-3TBLX25X.js +0 -1
- package/dist/chunks/chunk-4V6BLJSG.js +0 -1
- package/dist/chunks/chunk-K26JUDGZ.js +0 -1
- package/dist/chunks/chunk-SJODSVWU.js +0 -1
- package/dist/chunks/chunk-WPHE7RI4.js +0 -246
- package/dist/render/components/product-hero/hero-content.d.ts +0 -7
- package/dist/render/components/product-hero/hero-content.js +0 -1
- package/dist/render/components/useIsLightTheme.d.ts +0 -1
- package/dist/render/components/useIsLightTheme.js +0 -1
- package/dist/render/lib/content/product-hero.d.ts +0 -14
- package/dist/render/lib/content/product-hero.js +0 -1
- package/dist/render/lib/wheels/collections.d.ts +0 -22
- package/dist/render/lib/wheels/collections.js +0 -1
- /package/dist/chunks/{chunk-WPHE7RI4.js.LEGAL.txt → chunk-BOJGJXIU.js.LEGAL.txt} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
2
|
-
`);return
|
|
3
|
-
${
|
|
1
|
+
"use client";import{jsx as N}from"react/jsx-runtime";import{createContext as an,useContext as sn,useEffect as p,useMemo as wt,useRef as y,useState as r}from"react";import{isOrderable as kt,useCart as un}from"../CartContext.js";import{useCurrency as ln}from"../CurrencyContext.js";import{getClickIds as dn}from"../../lib/click-ids.js";import{adConsentForOrder as pn}from"../../lib/consent/choice.js";import{trackBeginCheckout as mn,trackPurchase as fn}from"../../lib/google-tag.js";import{trackMetaPurchase as yn}from"../../lib/meta-pixel.js";import{ApiError as ye,api as X,products as m}from"../../lib/api/index.js";import{uuid as Ie}from"../../lib/uuid.js";import{orderLinesForSets as hn}from"../../lib/commerce.js";import{canPersist as gn,safeSessionStorage as k}from"efficient-web-builder/format/lib/safe-storage";import{AFTERPAY_CONTEXT_KEY as wn,AFTERPAY_RETURN as kn,GOCARDLESS_CONTEXT_KEY as Te,KLARNA_CONTEXT_KEY as Ke,ZIP_CONTEXT_KEY as Cn,ZIP_RETURN as bn,runWalletReturn as Ct}from"../../lib/checkout/wallet-return.js";import{matchSubdivision as Nn}from"../../lib/checkout/match-subdivision.js";import{checkoutGone as bt,DROPPABLE_INTENT as Pn,NOT_CHECKED as Sn,PAY_FIRST_FLOW as An,paysFirst as vn,readIntentStatus as xn,settlePayFirst as En}from"../../lib/checkout/pay-first.js";import{couponCodeForOrder as Nt,couponRefusedByOrder as On}from"../../lib/cart/coupon-preview.js";function Pt(c){const d=c.indexOf(`
|
|
2
|
+
`);return d===-1?[c,""]:[c.slice(0,d),c.slice(d+1)]}function St(c,{canParkContext:d}={canParkContext:!0}){const u=c.paymentMethods,i=[];return u.includes("card")&&i.push({key:"card",title:"Card",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"VISA · MC · AMEX"})}),u.includes("paypal")&&c.paypalClientId&&i.push({key:"paypal",title:"PayPal",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAYPAL · CARDS"})}),u.includes("afterpay")&&i.push({key:"afterpay",title:"Afterpay",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"4 × INTEREST-FREE"})}),u.includes("square")&&c.squareApplicationId&&c.squareLocationId&&i.push({key:"square",title:"Card (Square)",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"VISA · MC · AMEX"})}),u.includes("gocardless")&&d&&i.push({key:"gocardless",title:"Bank Direct Debit",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY BY BANK"})}),u.includes("zip")&&i.push({key:"zip",title:"Zip",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY IN 4"})}),u.includes("klarna")&&d&&i.push({key:"klarna",title:"Klarna",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-accent",children:"PAY LATER"})}),u.includes("bank")&&i.push({key:"bank",title:"Bank transfer",body:null,price:N("span",{className:"font-mono text-[12px] uppercase tracking-[0.2em] text-fg-dim",children:"Invoiced"})}),i}const Zn="This shop does not take payment online yet. Please contact the shop to order.";function In(c,d){if(!c.orderNumber&&bt(d))return d.message;const u=d instanceof ye?` (${d.message})`:"";return c.orderNumber?`Your order ${c.orderNumber} is saved, but the payment did not start${u}. Try the payment again — your order will not be placed twice.`:`Your items are held under ${c.checkoutNumber}, but the payment did not start${u}. Try the payment again — you will not be charged twice.`}const Wn="Shipping cannot be calculated right now. Please try again.";function Tn({site:c,logo:d,preview:u=!1}){const{items:i,totals:P,coupon:T,refuseCoupon:vt,deliveryOptions:Re,shippingMethodId:Z,setShippingMethodId:xt,setQuoteDestination:W,courier:Et,requote:Ot,identify:_e,clearCapturedCart:K,replaceItems:Me,removeCoupon:Le}=un(),It=Re.find(e=>e.id===Z)?.pickupLocation??null,{country:$e,countries:B,activeCountry:Ye,formatMoney:Tt}=ln(),[g,he]=r(()=>St(c)[0]?.key??null),[Ue,Kt]=r(!0);p(()=>{Kt(gn(k))},[]);const[j,S]=r(!1),[F,ge]=r(""),[O,we]=r(""),[z,ke]=r(""),[Q,V]=r(""),[Ce,ee]=r(""),[R,te]=r(""),[I,ne]=r(""),[D,re]=r(""),[s,oe]=r(()=>$e||B[0]?.code||""),[A,ce]=r(""),[H,qe]=r([]),[be,Ne]=r(null),[ae,J]=r(null),Be=wt(()=>B.find(e=>e.code===s)??Ye,[B,s,Ye]),Rt=Be?.postalLabel||"Postal Code",_t=H[0]?.divisionType||"State / Province";p(()=>{if(!s){qe([]),Ne(s);return}Ne(null);let e=!1;return m.listCountrySubdivisions(s).then(t=>{e||(qe(t),Ne(s),ce(""))}),()=>{e=!0}},[s]);const Fe=Q.trim()!==""&&R.trim()!==""&&I.trim()!==""&&be===s&&(H.length===0||A!=="")?I.trim():"";p(()=>{W(s?{country:s,subdivision:A,postcode:Fe}:null)},[s,A,Fe,W]),p(()=>()=>W(null),[W]);const Mt=Et?.status==="unavailable",Lt=Ot,[se,ze]=r(null),[$t,De]=r([]),[He,Pe]=r("new"),[Je,Ge]=r(!1),[Se,Yt]=r("Home"),[Ut,Xe]=r(null),[f,Ze]=r(()=>Ie()),We=y(null),[je,w]=r(null),[qt,C]=r(null),[Qe,ie]=r(null),[Ve,Bt]=r(!1),[et,Ft]=r(!1),[v,_]=r(null),[zt,M]=r(!1),[h,L]=r(null),[Dt,b]=r(null),[Ht,Jt]=r(!1),[Gt,tt]=r(!1),[Xt,Zt]=r(!1),[Wt,nt]=r(!1),[rt,jt]=r(!1),[Qt,Ae]=r(!1),[ve,ot]=r(null),ue=y(null),xe=y(i),ct=!!(je||ve&&ve.kind!=="processing"||rt||Ve||et||Qe&&v?.orderNumber);p(()=>{ct&&(Me([]),Le())},[ct,Me,Le]);const at=y(!1);p(()=>{u||at.current||!i.some(kt)||(at.current=!0,mn({lines:i,currency:P.currency,value:P.subtotal-P.discount,coupon:T?.valid?T.code:void 0}))},[i,P,T,u]),p(()=>{_e(F,O.trim()||void 0)},[F,O,_e]);const st=y(null),[le,Vt]=r(null);p(()=>{const e=st.current;if(!le||!e)return;const t=()=>e.style.setProperty("--sf-checkout-header-h",`${le.offsetHeight}px`);t();const n=new ResizeObserver(t);return n.observe(le),()=>n.disconnect()},[le]),p(()=>{const e=n=>({setConfirming:n,land:w,markPaid:()=>M(!0),note:b,fail:C,clearCart:K}),t={search:window.location.search,storage:k,scrubQuery:()=>window.history.replaceState(null,"",window.location.pathname)};Ct(kn,{...t,capture:m.captureAfterpayPayment,page:e(Jt)}),Ct(bn,{...t,capture:m.captureZipPayment,page:e(Zt)})},[]),p(()=>{const t=new URLSearchParams(window.location.search).get("gocardless");if(t!=="confirm"&&t!=="cancel")return;const n=k.getItem(Te);if(k.removeItem(Te),window.history.replaceState(null,"",window.location.pathname),!n)return;let o;try{o=JSON.parse(n)}catch{return}if(K(),t==="cancel"){b("The direct debit was not set up — our team will follow up on payment."),w(o.confirmation);return}tt(!0),m.completeGocardlessPayment({idempotencyKey:o.idempotencyKey}).then(a=>{a.status==="paid"?M(!0):a.status==="declined"?b("The direct debit was declined — our team will follow up on payment."):b("Your direct debit is set up — the payment is collecting and will clear in a few days.")}).catch(()=>{b("We could not confirm the direct debit — our team will follow up on payment.")}).finally(()=>{w(o.confirmation),tt(!1)})},[]),p(()=>{const e=new URLSearchParams(window.location.search),t=e.get("klarna");if(t!=="confirm"&&t!=="cancel")return;const n=k.getItem(Ke);k.removeItem(Ke);const o=e.get("authorization_token");if(window.history.replaceState(null,"",window.location.pathname),!n)return;let a;try{a=JSON.parse(n)}catch{return}if(K(),t==="cancel"||!o){b("The Klarna payment was not completed — our team will follow up on payment."),w(a.confirmation);return}nt(!0),m.captureKlarnaPayment({idempotencyKey:a.idempotencyKey,authorizationToken:o}).then(l=>{l.status==="paid"?M(!0):l.status==="declined"?b("Klarna declined the payment — our team will follow up on payment."):b("Your Klarna payment is being reviewed — we'll confirm the outcome shortly.")}).catch(()=>{b("We could not confirm the Klarna payment — our team will follow up on payment.")}).finally(()=>{w(a.confirmation),nt(!1)})},[]);function it(e){const[t,n]=Pt(e.address);V(t),ee(n),te(e.city),ne(e.zip_code),e.country&&oe(e.country),e.phone&&re(e.phone),J({country:e.country||null,state:e.state??""})}p(()=>{if(ae){if((ae.country||s)!==s){J(null);return}be===s&&(ce(Nn(s,ae.state,H)),J(null))}},[ae,s,be,H]),p(()=>{let e=!1;return(async()=>{try{const[t,n,o]=await Promise.all([X.me(),X.myProfile().catch(()=>null),X.myAddresses().catch(()=>[])]);if(e)return;ze(t);const a=o.filter(G=>G.is_active);De(a),ge(t.email);const l=(n?.contact_name??"").split(/\s+/);we(t.first_name||l[0]||""),ke(t.last_name||l.slice(1).join(" "));const gt=t.phone||n?.phone;gt&&re(gt);const Oe=a.find(G=>G.id===t.default_delivery_location)??a[0];if(Oe)Pe(Oe.id),it(Oe);else if(n){const[G,cn]=Pt(n.address??"");V(G),ee(cn),te(n.city??""),ne(n.zip_code??""),n.country&&oe(n.country),J({country:n.country||null,state:n.state??""})}}catch{}})(),()=>{e=!0}},[]);function en(){X.logout(),ze(null),De([]),Pe("new"),Ge(!1),ge(""),we(""),ke(""),V(""),ee(""),te(""),ne(""),re(""),oe($e||B[0]?.code||""),ce(""),J(null)}const $=wt(()=>St(c,{canParkContext:Ue}),[c,Ue]);p(()=>{$.some(e=>e.key===g)||he($[0]?.key??null)},[$,g]);const tn=$.length===0,de=Ce.trim()?`${Q}
|
|
3
|
+
${Ce.trim()}`:Q,x=JSON.stringify([F,O,z,D,de,R,A,I,s,i.map(e=>[e.id,e.qty]),Z,Nt(T),g,P.currency,se?.id??null]),pe=y(null),E=y(!1),Y=y(null),me=y(!1),Ee=y(x);Ee.current=x;const ut=y(j);ut.current=j;const lt=()=>E.current&&Ee.current!==pe.current,U=y(null);p(()=>{ut.current||(x!==U.current&&(U.current=null),!(!E.current||!h||h.orderNumber)&&(x===pe.current||x===U.current||fe(h)))},[x,h]);async function fe(e){if(!me.current){me.current=!0,S(!0);try{const t=Y.current?await xn(Y.current):"none";if(t==="succeeded"||t==="processing"){E.current=!1,L(null),t==="succeeded"?await q(void 0,e):pt(e);return}if(t===void 0||!Pn.has(t)){U.current=Ee.current,L(e),C(Sn);return}E.current=!1,Y.current=null,U.current=null,C(null),L(null),Ze(Ie())}finally{me.current=!1,S(!1)}}}async function nn(){if(u||j||me.current)return;if(h){if(E.current&&!h.orderNumber&&x!==pe.current){await fe(h);return}S(!0),C(null),await mt();const n=h.orderNumber?g:"card";n!==g&&he(n),await ft(h,n,!h.orderNumber);return}if(i.length===0||P.repricing||!g||!$.some(n=>n.key===g))return;const e=i.filter(kt).flatMap(n=>hn(n.components,n.qty));if(e.length===0){C("Pick a size on each wheel's product page before checking out.");return}S(!0),C(null);let t;try{const n=se?m.createOrderAuthed:m.createOrder,o=pn(),a={customer:{email:F,name:`${O} ${z}`.trim(),phone:D.trim()||void 0,address:de,city:R,state:A||void 0,zipCode:I,country:s},items:e,currency:P.currency,idempotencyKey:f,shippingMethodId:Z??void 0,couponCode:Nt(T),...o==="denied"?{}:dn(),...o?{adConsent:o}:{},...vn(g)?{checkoutFlow:An}:{}};ue.current=()=>n(a),Y.current=null,E.current=!1,U.current=null,pe.current=x,xe.current=i,t=await n(a),t.orderNumber&&(dt(t),K()),await mt()}catch(n){const o=On(n);o?(vt(o),C(`${o} Your order has not been placed. Place it again to continue without the code.`)):C(n instanceof ye?n.message:"Could not place the order. Please try again."),S(!1);return}await ft(t)}function dt(e){fn({confirmation:e,lines:xe.current,adsSendTo:c.googleAdsId&&c.googleAdsConversionLabel?`${c.googleAdsId}/${c.googleAdsConversionLabel}`:null}),yn({confirmation:e,lines:xe.current})}async function q(e,t=v){if(!t)return;const n=e?async()=>e:ue.current;if(t.orderNumber||!n){M(!0),w(t);return}K(),await En({checkoutNumber:t.checkoutNumber,resend:n,page:{setConfirming:jt,land:w,markPaid:()=>M(!0),track:dt,unplaced:ot}})}function pt(e=v){if(e){if(e.orderNumber){w(e);return}K(),ot({kind:"processing",checkoutNumber:e.checkoutNumber})}}async function mt(){const e=JSON.stringify([Se.trim(),O,z,D.trim(),de,R,A,I,s]);if(!(!se||!Je||He!=="new"||We.current===e))try{await X.createAddress({label:Se.trim()||"Home",contact_name:`${O} ${z}`.trim(),phone:D.trim(),address:de,city:R,zip_code:I,state:A,country:s}),We.current=e,Xe("Address saved to your account.")}catch{Xe("We couldn't save the address to your account — you can add it under Account → Addresses.")}}async function ft(e,t=g,n=!1){L(null);try{if(t==="card"&&c.paymentMethods.includes("card")){const o=await m.createPaymentIntent({idempotencyKey:f});if(Y.current=o,n&<()){await fe(e);return}let a=e;if(n){const l=await ue.current?.().catch(()=>null);if(l?.orderNumber){await q(l,e);return}if(a=yt(e,l)??{...e,expiresAt:null},lt()){await fe(e);return}}_(a),Ae(!1),ie(o)}else if(t==="paypal"&&c.paymentMethods.includes("paypal"))_(e),Bt(!0);else if(t==="afterpay"&&c.paymentMethods.includes("afterpay")){const o=window.location.origin,a=await m.createAfterpayCheckout({idempotencyKey:f,confirmUrl:`${o}/checkout?afterpay=confirm`,cancelUrl:`${o}/checkout?afterpay=cancel`}),l={idempotencyKey:f,confirmation:e};k.setItem(wn,JSON.stringify(l)),window.location.assign(a.redirectCheckoutUrl);return}else if(t==="square"&&c.paymentMethods.includes("square"))_(e),Ft(!0);else if(t==="gocardless"&&c.paymentMethods.includes("gocardless")){const o=window.location.origin,a=await m.createGocardlessBillingRequest({idempotencyKey:f,confirmUrl:`${o}/checkout?gocardless=confirm`,cancelUrl:`${o}/checkout?gocardless=cancel`}),l={idempotencyKey:f,confirmation:e};k.setItem(Te,JSON.stringify(l)),window.location.assign(a.authorisationUrl);return}else if(t==="zip"&&c.paymentMethods.includes("zip")){const o=window.location.origin,a=await m.createZipCheckout({idempotencyKey:f,redirectUrl:`${o}/checkout?zip=return`}),l={idempotencyKey:f,confirmation:e};k.setItem(Cn,JSON.stringify(l)),window.location.assign(a.redirectUrl);return}else if(t==="klarna"&&c.paymentMethods.includes("klarna")){const o=window.location.origin,a=await m.createKlarnaCheckout({idempotencyKey:f,confirmUrl:`${o}/checkout?klarna=confirm`,cancelUrl:`${o}/checkout?klarna=cancel`}),l={idempotencyKey:f,confirmation:e};k.setItem(Ke,JSON.stringify(l)),window.location.assign(a.redirectUrl);return}else w(e)}catch(o){if(n&&o instanceof ye&&o.status===409){await q(void 0,e);return}ht(e,o),S(!1)}}function yt(e,t){return t&&!t.orderNumber&&t.status==="open"&&t.checkoutNumber===e.checkoutNumber?t:null}function ht(e,t){C(In(e,t)),!e.orderNumber&&bt(t)?(E.current=!1,Ze(Ie())):L(e)}async function rn(e){if(!v)return;const t=v;try{const n=await m.createPaymentIntent({idempotencyKey:f}),o=await ue.current?.().catch(()=>null);if(o?.orderNumber){await q(o);return}const a=yt(t,o);_(a??{...t,expiresAt:null}),Ae(e&&a!==null),Y.current=n,ie(n)}catch(n){if(n instanceof ye&&n.status===409){await q();return}ie(null),_(null),ht(t,n),S(!1)}}function on(){v&&(E.current=!0,L(v),ie(null),_(null),Ae(!1),S(!1))}return{site:c,logo:d,items:i,totals:P,coupon:T,deliveryOptions:Re,courierUnavailable:Mt,retryCourier:Lt,shippingMethodId:Z,setShippingMethodId:xt,pickupLocation:It,servedCountries:B,formatMoney:Tt,payChoice:g,setPayChoice:he,placing:j,email:F,setEmail:ge,firstName:O,setFirstName:we,lastName:z,setLastName:ke,address1:Q,setAddress1:V,address2:Ce,setAddress2:ee,city:R,setCity:te,postcode:I,setPostcode:ne,phone:D,setPhone:re,country:s,setCountry:oe,subdivision:A,setSubdivision:ce,subdivisions:H,destination:Be,postcodeLabel:Rt,subdivisionLabel:_t,me:se,savedAddresses:$t,selectedAddressId:He,setSelectedAddressId:Pe,saveAddress:Je,setSaveAddress:Ge,saveLabel:Se,setSaveLabel:Yt,addressSaveNote:Ut,idemKey:f,confirmation:je,setConfirmation:w,orderError:qt,payment:Qe,paypalStep:Ve,squareStep:et,pendingConf:v,paid:zt,setPaid:M,unpaidOrder:h,payNote:Dt,afterpayConfirming:Ht,gocardlessConfirming:Gt,zipConfirming:Xt,klarnaConfirming:Wt,cardConfirming:rt,checkoutResult:ve,confirmCardPayment:q,cardStillProcessing:pt,renewCardPayment:rn,holdRenewed:Qt,leaveCardPayment:on,checkoutRootRef:st,setCheckoutHeaderEl:Vt,fillFromAddress:it,checkoutSignOut:en,payOptions:$,noPaymentMethod:tn,placeOrder:nn}}const At=an(null);function jn({children:c,...d}){const u=Tn(d);return N(At.Provider,{value:u,children:c})}function Qn(){const c=sn(At);if(!c)throw new Error("useCheckout must be used inside CheckoutStateProvider");return c}export{jn as CheckoutStateProvider,Zn as NO_PAYMENT_METHOD_NOTE,Wn as SHIPPING_RETRY_NOTE,St as buildPayOptions,In as paymentNotStartedMessage,Qn as useCheckout};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as l,jsxs as
|
|
1
|
+
"use client";import{jsx as l,jsxs as a}from"react/jsx-runtime";const t={body:"text-[length:var(--size-body,17px)]",labelSmall:"text-[length:var(--size-label,11px)]",labelLarge:"text-[length:var(--size-label,13px)]"};function s({loading:o,error:n,data:e}){return o?l("div",{className:`mt-10 border border-line bg-bg p-6 font-mono ${t.labelLarge} uppercase tracking-[0.24em] text-fg-dim`,children:"Loading stock fitment…"}):n?a("div",{className:`mt-10 border border-line bg-bg p-6 font-mono ${t.labelLarge} uppercase tracking-[0.22em] text-fg-dim`,children:["Couldn't load stock fitment — ",l("span",{className:"text-accent",children:n})]}):e?a("div",{className:"mt-10 grid grid-cols-4 gap-[2px] border border-line bg-line max-[1100px]:grid-cols-2 max-[700px]:grid-cols-1",children:[l(r,{label:"Bolt pattern",value:e.boltPattern??"—"}),l(r,{label:"PCD",value:e.pcd??"—"}),l(r,{label:"Hub bore",value:e.centreBore?`${e.centreBore} mm`:"—"}),l(r,{label:"ET range",value:e.etRange&&e.etRange.length===2?`${e.etRange[0]} – ${e.etRange[1]}`:"—"}),l(r,{label:"OEM front",value:e.frontWheels.length?e.frontWheels.join(" · "):"—"}),l(r,{label:"OEM rear",value:e.rearWheels.length?e.rearWheels.join(" · "):"—"}),l(r,{label:"OEM front tyres",value:e.frontTyres.length?e.frontTyres.join(" · "):"—"}),l(r,{label:"OEM rear tyres",value:e.rearTyres.length?e.rearTyres.join(" · "):"—"})]}):null}function r({label:o,value:n}){return a("div",{className:"flex min-h-[96px] flex-col gap-2 bg-bg px-5 py-5",children:[l("span",{className:`font-mono ${t.labelSmall} uppercase tracking-[0.26em] text-fg-dim`,children:o}),l("span",{className:`mt-auto font-display ${t.body} font-medium tracking-[-0.01em] text-fg`,children:n})]})}export{s as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,Fragment as
|
|
1
|
+
"use client";import{jsx as e,Fragment as m,jsxs as c}from"react/jsx-runtime";import l from"../ProductGallery.js";import a from"../ProductLightbox.js";import{SECTION_NOTICE_TEXT_CLASS as p}from"../SectionNotice.js";import{heroView as d}from"../product-hero/hero-view.js";import{useRootIsDark as f}from"efficient-shell/theme";import{useLightbox as g}from"../useLightbox.js";import{useProductSelection as x}from"../useProductSelection.js";import{useCurrentProduct as h}from"../../lib/document/current-product.js";import{say as L}from"efficient-web-builder/format/lib/editor-words";import{useSampleProduct as S}from"./useSampleProduct.js";function b({editing:o=!1,...t}){const r=h();return r?e(i,{product:r.product,selection:r.selection,onLightbox:r.openLightbox,editing:o,...t}):o?e(y,{...t}):null}function i({product:o,selection:t,onLightbox:r,editing:n,...u}){const s=!f({whenUnset:!0});return e(l,{product:o,view:d(o,t,n),angleIdx:t.angleIdx,onSelect:t.setAngleIdx,isLight:s,onLightbox:r,...u})}function y(o){const t=S(!0);return t?e(I,{product:t,...o}):e("p",{className:p,children:L("Loading sample product…")})}function I({product:o,...t}){const r=x(o,{editing:!0}),n=g();return c(m,{children:[e(i,{product:o,selection:r,onLightbox:n.open,editing:!0,...t}),e(a,{item:n.item,onClose:n.close})]})}export{b as default};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
1
2
|
import type { StoreProduct } from "../../lib/catalog/store-product.js";
|
|
2
3
|
import type { HeroPricePlacement } from "../../lib/sections/hero-price-placement.js";
|
|
3
4
|
import type { HeroLayout, HeroTextAlign } from "../../lib/sections/hero-arrangement.js";
|
|
@@ -10,6 +11,7 @@ interface HeroArrangement {
|
|
|
10
11
|
showPriceQuote?: boolean;
|
|
11
12
|
galleryMode?: HeroGalleryMode;
|
|
12
13
|
imageFit?: HeroImageFit;
|
|
14
|
+
trustBullets?: ReactNode;
|
|
13
15
|
}
|
|
14
16
|
export declare const supportedKinds: readonly ("alloy-wheel" | "tyre")[];
|
|
15
17
|
export default function DynamicProductHero({ editing, pricePlacement, showVehicleFitment, ...arrangement }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as O}from"react/jsx-runtime";import
|
|
1
|
+
"use client";import{jsx as e,jsxs as O}from"react/jsx-runtime";import I from"../SectionBand.js";import{useScopeClass as W}from"../../lib/use-scope-class.js";import{GRID_CARD_SHOW as k}from"../../lib/sections/card-show-defaults.js";import{useEffect as V,useState as X}from"react";import{resolveCardImageBackground as Z,THEME_CARD_IMAGE_BG as q}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as B}from"efficient-web-builder/format/lib/content/card-image-shape";import{DEFAULT_COVER_INDEX as J}from"../../lib/wheels/cover-rendering.js";import{DEFAULT_CARD_INDEX_FORMAT as Q,DEFAULT_CARD_OUTLINE as Y,cardIndexCss as ee}from"efficient-web-builder/format/lib/sections/product-card-style";import re from"../CompatibleTyres.js";import oe from"../ProductCard.js";import{CARD_ROWS_GRID_CLASS as te,cardRowsGridStyle as ie}from"../WheelCardFrame.js";import{ProductCardChromeProvider as se}from"../ProductCardChrome.js";import{gridClassImageSizes as ne}from"../../lib/sections/card-image-sizes.js";import{fillRowCss as ae}from"../../lib/sections/fill-row.js";import le from"efficient-web-builder/render/components/SectionHeader";import de from"../ViewMoreLink.js";import{useSiteMenuLinks as ce}from"../catalog/SiteMenuLinks.js";import{renderGold as F,renderHeadline as me}from"efficient-web-builder/render/components/goldPhrases";import pe from"./KindGate.js";import{loadProductCatalog as ue}from"../useProductCatalog.js";import{PLP_KINDS as fe}from"../../lib/catalog/plp-item.js";import{relatedCardCount as he,relatedViewMore as ge}from"../../lib/catalog/related-cards.js";import{DEFAULT_RELATIONSHIP as xe,relationshipApplies as Ce,relationshipByKey as ye}from"../../lib/catalog/relationships.js";import{useCurrentProduct as we}from"../../lib/document/current-product.js";import{PLACEHOLDER_RELATED as H}from"../../lib/wheels/placeholder-wheel.js";import{say as T}from"efficient-web-builder/format/lib/editor-words";const G={label:"text-[length:var(--size-label,13px)]"},be=fe,$={2:"grid-cols-2 max-[800px]:grid-cols-1",3:"grid-cols-3 max-[1100px]:grid-cols-2 max-[800px]:grid-cols-1",4:"grid-cols-4 max-[1100px]:grid-cols-2 max-[800px]:grid-cols-1"};function Se(r){return e(pe,{kinds:be,type:"RelatedProducts",editing:r.editing,children:e(_e,{...r})})}function _e({num:r,title:t,description:c,columns:n=3,cardCount:S,relationship:_=xe,footnote:E,footnoteLinkText:R,footnoteLinkHref:D,editing:o=!1,omitHead:x=!1,cardImage:i,outline:m,indexBadge:p,showBadge:C,showCardPrice:y,showCardFinishes:a,showCardSizes:l,showCardBuy:u,showCardPage:f,coverIndex:h,imageBackground:g,spinOnHover:w}){const d=we(),U=ce(),L=he(S),[j,N]=X([]);V(()=>{if(d||!o)return;let A=!1;return ue().then(M=>{const K=M.length>0?M:H;A||N(K)}).catch(()=>{A||N(H)}),()=>{A=!0}},[d,o]);const s=ye(_);if(!s)return null;const P=ge(s,U),v=x?null:e(le,{num:r?F(r):void 0,title:me(t||s.heading,!1),description:c?F(c):void 0,accent:!0});if(!d)return o?e(z,{header:v,wheels:j.slice(0,L),columns:n,viewMore:P,cardImage:i,outline:m,indexBadge:p,showBadge:C,showCardPrice:y,showCardFinishes:a,showCardSizes:l,showCardBuy:u,showCardPage:f,coverIndex:h,imageBackground:g,spinOnHover:w}):null;if(!Ce(s,d.product.kind))return o?e(I,{className:"border-b border-line py-14 max-[1100px]:py-10",style:B(i),children:e("p",{className:`font-mono ${G.label} uppercase tracking-[0.18em] text-fg-dim`,children:T("“{relationship}” does not apply to this product. It is hidden on the live page.",{relationship:T(s.label)})})}):null;const b=s.resolve(d.product,d.relatedWheels);return b.kind==="tyre"?e(re,{omitHead:x,columns:n,cardImage:i,outline:m,indexBadge:p,num:r,title:t||s.heading,description:c,tyres:[...b.tyres].slice(0,L),footnote:E,footnoteLinkText:R,footnoteLinkHref:D,viewMore:P,editing:o}):b.wheels.length===0?o?O(I,{className:"border-b border-line py-[120px] max-[1100px]:py-20",style:B(i),children:[v,e("p",{className:`border-t border-line py-6 font-mono ${G.label} uppercase tracking-[0.18em] text-fg-dim`,children:T("Related products appear here on a product page.")})]}):null:e(z,{header:v,wheels:[...b.wheels].slice(0,L),columns:n,viewMore:P,cardImage:i,outline:m,indexBadge:p,showBadge:C,showCardPrice:y,showCardFinishes:a,showCardSizes:l,showCardBuy:u,showCardPage:f,coverIndex:h,imageBackground:g,spinOnHover:w})}function z({header:r,wheels:t,columns:c,viewMore:n,cardImage:S,outline:_,indexBadge:E,showBadge:R,showCardPrice:D,showCardFinishes:o,showCardSizes:x,showCardBuy:i,showCardPage:m,coverIndex:p,imageBackground:C,spinOnHover:y}){const a=W("rp");if(t.length===0)return null;const l=$[Math.min(4,Math.max(2,c))]??$[3],u=E??Q,f=ee(a,u),h=ae(a,l,{cards:t.length});return O(I,{className:"border-b border-line py-[120px] max-[1100px]:py-20",style:B(S),children:[f&&e("style",{children:f}),h&&e("style",{children:h}),r,e(se,{imageSizes:ne(l,t.length),imageBackgroundFill:Z(C,q),spinOnHover:y??!0,coverIndex:p??J,outline:_??Y,indexBadge:u,showBadge:R??!0,showCardPrice:D??!0,showCardFinishes:o??!0,showCardSizes:x??k.showCardSizes,showCardBuy:i??k.showCardBuy,showCardPage:m??k.showCardPage,children:e("div",{className:`${a} grid gap-[2px] ${te} bg-[var(--catalog-grid-bg)] ${l}`,style:ie("2px"),children:t.map((g,w)=>e(oe,{wheel:g,variant:"catalog"},`${g.slug}-${w}`))})}),e("div",{className:"mt-10 flex",children:e(de,{href:n.href,label:n.label})})]})}export{_e as RelatedProductsBody,Se as default,be as supportedKinds};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as c}from"react/jsx-runtime";import
|
|
1
|
+
"use client";import{jsx as c}from"react/jsx-runtime";import b from"../SpecTable.js";import L from"./KindGate.js";import{useEuTyreLabels as v}from"../useEuTyreLabels.js";import{buildSpecSheet as A,sourceFromWheel as E}from"../../lib/wheels/spec-sheet.js";import{buildTyreSpecSheet as I}from"../../lib/tyres/spec-sheet.js";import{partVariant as P}from"../../lib/catalog/from-wheel.js";import{useCurrentProduct as k}from"../../lib/document/current-product.js";import{applySpecAnswers as h}from"../../lib/content/field-usage.js";import{useSampleProduct as V}from"./useSampleProduct.js";const _=["alloy-wheel","tyre"],j=[],G=[];function K(n,r,s){const i=n.variants??[];return(r?i.find(t=>t.sku===r):void 0)??(s?i.find(t=>t.size===s):void 0)??i[0]??null}function M(n){return c(L,{kinds:_,type:"SpecTable",editing:n.editing,children:c(N,{...n})})}function N({num:n,title:r,description:s,showDiagram:i=!0,editing:t=!1,nodeId:u,omitHead:d=!1}){const e=k(),w=V(t&&!e),a=e?.product??w,l=a?.kind==="tyre"?a.source:null,y=v(l?.variants??j),p=e?.fieldUsage??G;if(l){const f=K(l,e?.selection.part?.id,e?.selection.shown.size),g=y.find(z=>z.size===f?.size)??null,x=I({brand:l.brand,variant:f,euLabel:g});return c(b,{capped:!1,builtInLabels:!0,num:n,title:r,description:s,rows:h(x.rows,p),diagram:null,editing:t,nodeId:u,omitHead:d})}const o=a?.kind==="alloy-wheel"?a.source:null,S=e?e.selection.shown.finish:o?.finishes[0]?.name,T=e&&o?P(o,e.selection.part)?.size??void 0:void 0,m=o?A(E(o),S,T):{rows:[],diagram:null};return c(b,{capped:!1,builtInLabels:!0,num:n,title:r,description:s,rows:h(m.rows,p),diagram:i?m.diagram:null,editing:t,nodeId:u,omitHead:d})}export{M as default,_ as supportedKinds};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as t,Fragment as
|
|
1
|
+
"use client";import{jsx as t,Fragment as m,jsxs as c}from"react/jsx-runtime";import{useCallback as B,useRef as C,useState as E}from"react";import{sizedImage as M}from"efficient-web-builder/format/lib/sized-image";import P from"efficient-web-builder/render/components/Placeholder";import A,{LightboxClose as U,LIGHTBOX_CLOSE_TINT as z}from"../Lightbox.js";import{GALLERY_GRID_ATTR as L}from"../GalleryItem.js";const R="(max-width: 1600px) 100vw, 1600px",G="(max-width: 1100px) 100vw, 50vw",D="(max-width: 800px) 30vw, 200px",H="100vw";function b(r,l){return r.video?l?`Play video of ${l}`:"Play video":l?`Open photo of ${l}`:"Open photo"}function Z({small:r=!1}){return t("span",{"aria-hidden":!0,"data-play-badge":"",className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:t("span",{className:`flex items-center justify-center rounded-full bg-bg/75 text-fg ${r?"h-8 w-8 text-[length:12px]":"h-16 w-16 text-[length:22px]"}`,children:"▶"})})}const F="relative block w-full overflow-hidden bg-surface-2",X="block h-[min(78vh,820px)] w-full object-cover max-[800px]:h-[min(70vh,560px)]",W="block aspect-[4/5] max-h-[80vh] w-full object-cover",q="grid grid-cols-4 gap-2",Y="relative block aspect-square w-full overflow-hidden bg-surface-2",I="block h-full w-full object-cover",J="grid grid-cols-6 gap-2 max-[800px]:grid-cols-4",K={3:"grid grid-cols-3 gap-2 max-[800px]:grid-cols-2",4:"grid grid-cols-4 gap-2 max-[800px]:grid-cols-2"},Q="relative block aspect-[4/5] w-full overflow-hidden bg-surface-2",V="(max-width: 800px) 50vw, 25vw",ee="cursor-pointer text-left focus:outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2",$="absolute top-1/2 z-[2] flex h-14 w-14 -translate-y-1/2 cursor-pointer items-center justify-center border border-fg-dim/40 bg-overlay-scrim/40 font-mono text-[length:var(--size-label,22px)] text-fg-dim transition-colors hover:border-accent hover:text-accent max-[700px]:h-11 max-[700px]:w-11";function te({pictures:r,name:l,editing:g=!1,fit:v="section",across:S=4}){const[j,w]=E(!1),[i,f]=E(0),x=C(null),O=B(e=>{e?x.current=e:(x.current?.pause(),x.current=null)},[]),o=r.length,y=v==="column";if(o===0)return null;const _=()=>f(e=>(e-1+o)%o),N=()=>f(e=>(e+1)%o),T=e=>{f(e),w(!0)},a=r[Math.min(i,o-1)],d=(e,s,n,p)=>e.url?t("span",{className:`${n} relative`,children:t(P,{label:e.alt||l||"photo",src:e.url,alt:e.alt||l,sizes:s,objectFit:"cover",showBackground:!1})}):t("span",{"aria-hidden":!0,className:`${n} bg-surface-2`}),u=v==="tiles",h=(e,s,n)=>{const p=c(m,{children:[u?d(e,V,I,800):n?y?d(e,G,W,1200):d(e,R,X,1600):d(e,D,I,400),e.video&&t(Z,{small:!n&&!u})]}),k=u?Q:n?F:Y;return g?t("div",{className:k,children:p}):t("button",{type:"button","aria-label":b(e,l),onClick:()=>T(s),className:`${k} ${ee}`,children:p})};return c(m,{children:[u?t("ul",{[L]:"","data-record-gallery":"tiles",className:K[S===3?3:4],children:r.map((e,s)=>t("li",{children:h(e,s,!1)},`${e.url}-${s}`))}):c("div",{[L]:"","data-record-gallery":"",className:"flex flex-col gap-2",children:[h(r[0],0,!0),o>1&&t("ul",{className:y?q:J,children:r.slice(1).map((e,s)=>t("li",{children:h(e,s+1,!1)},`${e.url}-${s+1}`))})]}),!g&&t(A,{open:j,onClose:()=>w(!1),label:b(a,l),onPrev:o>1?_:void 0,onNext:o>1?N:void 0,className:"flex items-center justify-center p-6 max-[700px]:p-3",children:c("div",{onClick:e=>e.stopPropagation(),className:"relative flex h-full w-full items-center justify-center",children:[t(U,{className:"absolute right-0 top-0 z-[3] flex h-12 w-12 cursor-pointer items-center justify-center border border-line font-mono text-[length:var(--size-label,18px)] text-fg-dim transition-colors hover:border-accent hover:text-fg",style:{background:z},children:"✕"}),a.video?t("video",{ref:O,controls:!0,playsInline:!0,preload:"metadata",poster:a.url,src:a.video,"aria-label":b(a,l),className:"block max-h-[calc(100vh-120px)] max-w-full bg-bg"},`video-${i}`):t("img",{...M(a.url,{fallbackWidth:1600}),sizes:H,alt:`${a.alt||l||"Photo"} — ${i+1} of ${o}`,className:"block max-h-[calc(100vh-120px)] max-w-full object-contain"},`photo-${i}`),o>1&&c(m,{children:[t("button",{type:"button","aria-label":"Previous photo",onClick:_,className:`${$} left-0`,children:"◁"}),t("button",{type:"button","aria-label":"Next photo",onClick:N,className:`${$} right-0`,children:"▷"}),c("span",{"data-gallery-counter":"",className:"absolute bottom-0 left-1/2 -translate-x-1/2 border border-fg-dim/30 bg-overlay-scrim/50 px-4 py-1.5 font-mono text-[length:var(--size-label,14px)] uppercase tracking-[0.22em] text-fg-dim backdrop-blur-[4px]",children:[i+1," / ",o]})]})]})})]})}export{te as default,b as pictureLabel};
|
|
@@ -8,10 +8,11 @@ export default function TyreHeroFitment({ slug, variants, vehicle, manualMode, s
|
|
|
8
8
|
manualMode: boolean;
|
|
9
9
|
setManualMode: (fn: (m: boolean) => boolean) => void;
|
|
10
10
|
}): import("react").JSX.Element;
|
|
11
|
-
export declare function TyreHeroVerdict({ answer, loading, car, variants, onChange, }: {
|
|
11
|
+
export declare function TyreHeroVerdict({ answer, loading, car, variants, onChange, onRetry, }: {
|
|
12
12
|
answer: TyreFitAnswer | null;
|
|
13
13
|
loading: boolean;
|
|
14
14
|
car: string;
|
|
15
15
|
variants: readonly TyreVariant[];
|
|
16
16
|
onChange: () => void;
|
|
17
|
+
onRetry?: () => void;
|
|
17
18
|
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as t,Fragment as
|
|
1
|
+
"use client";import{jsx as e,jsxs as t,Fragment as p}from"react/jsx-runtime";import g from"next/link";import{Notice as f}from"../Notice.js";import b from"./VehicleQuestion.js";import{useTyreFitAnswer as k}from"../useTyreFitAnswer.js";import{TYRE_FIT_LABEL as x,tyreFitHeadline as N}from"../../lib/tyres/tyre-fit-copy.js";import{TYRE_FIT_CHIP as y,tyreFitSizeChips as F}from"../../lib/tyres/tyre-size-fit.js";import{tyreFitQuery as v}from"../../lib/tyres/tyre-vehicle-fitment.js";function C({slug:r,variants:u,vehicle:n,manualMode:o,setManualMode:m}){const{answer:l,loading:s,retry:i}=k(r,o?null:v(n.applied?.vehicle)),a=n.appliedName;return e(b,{vehicle:n,escape:e("button",{type:"button",className:"cursor-pointer text-right text-accent hover:underline",onClick:()=>m(d=>!d),children:o?"← Find by vehicle":"Select by specs instead →"}),override:o?t(f,{tone:"quiet",children:[e("strong",{className:"font-semibold text-fg",children:"You are choosing by size."}),t("span",{className:"mt-2 block",children:["Pick the size above. We have not checked it against any car — make sure it matches the placard on your door."," ",e(g,{href:"/contact",className:"text-accent hover:underline",children:"Ask us if you are unsure →"})]})]}):null,verdict:e(z,{answer:l,loading:s,car:a,variants:u,onChange:n.clear,onRetry:i}),showChangeCar:!1,cascadeErrorNote:t(p,{children:["Vehicle data is unavailable right now. Pick your size above, or"," ",e(g,{href:"/contact",className:"text-accent hover:underline",children:"ask us to check it →"})]})})}function z({answer:r,loading:u,car:n,variants:o,onChange:m,onRetry:l}){if(u||!r)return t(f,{tone:"quiet",children:[e("strong",{className:"font-semibold text-fg",children:"Checking your car…"})," ",t("span",{children:["Reading the factory tyre sizes for your ",n,"."]})]});const s=F(r,o),i=r.status==="doesNotFit"?"You can still order any size here — check it suits your car first.":"",a=s.length===0?N(r):"",d=a&&i?`${a} ${i}`:a||i;return t(f,{tone:r.status==="fits"?"good":"quiet",children:[t("span",{className:"block",children:[r.status==="fits"?t("strong",{className:"font-semibold text-accent",children:["✓ Made in a size your ",n," takes"]}):r.status==="doesNotFit"?t("strong",{className:"font-semibold text-fg",children:["Not made in a size your ",n," takes"]}):r.failed?t("strong",{className:"font-semibold text-fg",children:["We couldn’t check this tyre against your ",n]}):t("strong",{className:"font-semibold text-fg",children:["We cannot check this tyre against your ",n]}),t("span",{className:"whitespace-nowrap",children:[" · ",e("button",{type:"button",onClick:m,"aria-label":`Change car - forget ${n} and ask again`,className:"cursor-pointer font-mono uppercase tracking-[0.16em] text-accent underline underline-offset-4 hover:text-fg",children:"Change car"})]})]}),d?e("span",{className:"mt-2 block",children:d}):null,r.failed&&l?e("button",{type:"button",onClick:l,className:"mt-2 cursor-pointer font-mono uppercase tracking-[0.16em] text-accent underline underline-offset-4 hover:text-fg",children:"Try again"}):null,s.length>0?t(p,{children:[e("span",{className:"mt-2 block",children:"Your car takes:"}),e("ul",{className:"mt-2 flex flex-wrap gap-2",children:s.map(c=>{const h=c.made?y.fits:y.doesNotFit;return e("li",{className:"border border-line px-2 py-1 font-mono text-[11px] uppercase tracking-[0.14em] text-fg-dim",style:h.color?{color:h.color,borderColor:h.color}:void 0,children:c.made?`${c.size} · ${x.fits}`:c.size},c.size)})})]}):null]})}export{z as TyreHeroVerdict,C as default};
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import type { VehicleControl } from "../fitment/vehicle-control.js";
|
|
3
|
-
export default function VehicleQuestion({ vehicle, escape, override, verdict, showChangeCar, cascadeErrorNote,
|
|
3
|
+
export default function VehicleQuestion({ vehicle, escape, override, verdict, showChangeCar, cascadeErrorNote, }: {
|
|
4
4
|
vehicle: VehicleControl;
|
|
5
5
|
escape: ReactNode;
|
|
6
6
|
override: ReactNode | null;
|
|
7
7
|
verdict: ReactNode;
|
|
8
8
|
showChangeCar: boolean;
|
|
9
9
|
cascadeErrorNote: ReactNode;
|
|
10
|
-
askNote: string;
|
|
11
10
|
}): import("react").JSX.Element;
|
|
12
11
|
export declare function HeroVehicleMemory({ vehicle }: {
|
|
13
12
|
vehicle: VehicleControl;
|
|
14
13
|
}): import("react").JSX.Element | null;
|
|
15
|
-
export declare function Box({ tone, children }: {
|
|
16
|
-
tone: "good" | "bad" | "quiet";
|
|
17
|
-
children: React.ReactNode;
|
|
18
|
-
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as a,jsxs as t}from"react/jsx-runtime";import s from"../fitment/FitmentPickerGrid.js";function
|
|
1
|
+
"use client";import{jsx as a,jsxs as t}from"react/jsx-runtime";import s from"../fitment/FitmentPickerGrid.js";function d({vehicle:e,escape:r,override:n,verdict:c,showChangeCar:i,cascadeErrorNote:l}){const o=e.appliedName!=="";return t("div",{className:"pb-2",children:[t("div",{className:"mb-3 flex items-center justify-between gap-4 font-mono text-[13px] font-semibold uppercase tracking-[0.2em] text-fg",children:[a("span",{children:"Vehicle Fitment"}),r]}),n?a("div",{className:"flex flex-col gap-3",children:n}):o?t("div",{className:"flex flex-col gap-3",children:[c,i&&a("div",{children:a("button",{type:"button",onClick:e.clear,"aria-label":`Change car - forget ${e.appliedName} and ask again`,className:"cursor-pointer font-mono text-[12px] uppercase tracking-[0.16em] text-accent underline underline-offset-4 hover:text-fg",children:"Change car"})})]}):t("div",{className:"flex flex-col gap-3",children:[a(s,{cascade:e.cascade,compact:!0}),e.cascade.cascadeError&&a("p",{className:"font-mono text-[12px] leading-relaxed tracking-[0.1em] text-fg-dim",children:l})]})]})}function f({vehicle:e}){return e.appliedName?t("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 border border-accent px-3 py-2 font-mono text-[12px] tracking-[0.1em] text-fg-dim",style:{background:"color-mix(in oklab, var(--accent) 8%, transparent)"},children:[t("span",{children:["Showing fitment for your"," ",a("strong",{className:"font-semibold text-fg",children:e.appliedName})]}),a("button",{type:"button",onClick:e.clear,"aria-label":`Change car - forget ${e.appliedName} and ask again`,className:"ml-auto cursor-pointer uppercase tracking-[0.16em] text-accent underline underline-offset-4 hover:text-fg",children:"Change car"})]}):null}export{f as HeroVehicleMemory,d as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as n,Fragment as g}from"react/jsx-runtime";import o from"next/link";import
|
|
1
|
+
"use client";import{jsx as e,jsxs as n,Fragment as g}from"react/jsx-runtime";import o from"next/link";import{Notice as s}from"../Notice.js";import b from"./VehicleQuestion.js";import{resolvingRowsAnswered as w}from"../../lib/catalog/product-options.js";import{fitRefusal as h,pdpFitVerdict as x}from"../../lib/wheels/pdp-fit-verdict.js";import{variantIsDually as k}from"../../lib/wheels/set-mode.js";function N({selection:a,spec:r,vehicle:t,wheel:l}){const{manualMode:c,setManualMode:d}=a,m=w(a.rows,a.preOrder),u=t.appliedName!=="",f=(l?.variants??[]).some(k),i=x({wheel:l,applied:u,fit:t.fit,resolving:t.resolving});return e(b,{vehicle:t,escape:e("button",{type:"button",className:"cursor-pointer text-right text-accent hover:underline",onClick:()=>d(p=>!p),children:c?"← Find by vehicle":"Select by specs instead →"}),override:c?n(s,{tone:"quiet",children:[e("strong",{className:"font-semibold text-fg",children:"You are choosing by the numbers."}),n("span",{className:"mt-2 block",children:[r?`${f?"The set is":"All four wheels are"} ${r}. We have not checked that against any car — make sure it matches yours.`:m?"Answer the bolt pattern and the offset below. We will not check them against a car.":"Pick a finish and a size below. The bolt pattern and the offset come next, and we will not check them against a car."," ",e(o,{href:"/fitment",className:"text-accent hover:underline",children:"Talk to an engineer →"})]})]}):null,verdict:e(y,{verdict:i,car:t.appliedName}),showChangeCar:i.state!=="fits"&&i.state!=="checking",cascadeErrorNote:n(g,{children:["Vehicle data is unavailable right now. Pick your wheel by its specs instead, or"," ",e(o,{href:"/contact",className:"text-accent hover:underline",children:"ask us to check it →"})]})})}function y({verdict:a,car:r}){switch(a.state){case"checking":return n(s,{tone:"quiet",children:[e("strong",{className:"font-semibold text-fg",children:"Checking fitment…"})," ",n("span",{children:["Reading the factory wheel specs for your ",r,"."]})]});case"fits":return n(s,{tone:"good",children:[n("strong",{className:"font-semibold text-accent",children:["✓ Fits your ",r]}),e("ul",{className:"mt-2 flex flex-wrap gap-2",children:a.checks.map(t=>e("li",{className:["px-2 py-1 font-mono text-[11px] uppercase tracking-[0.14em] text-fg-dim",t.value!==null?"border border-line":"border border-dashed border-line"].join(" "),children:t.value??`${t.name} not published, not checked`},t.key))})]});case"fits-with-warning":return n(s,{tone:"good",children:[n("strong",{className:"font-semibold text-accent",children:["✓ Fits your ",r]}),e("ul",{className:"mt-2 flex flex-wrap gap-2",children:a.checks.map(t=>e("li",{className:["px-2 py-1 font-mono text-[11px] uppercase tracking-[0.14em] text-fg-dim",t.value!==null?"border border-line":"border border-dashed border-line"].join(" "),children:t.value??`${t.name} not published, not checked`},t.key))}),n("span",{className:"mt-2 block border-l-2 border-alert pl-3",children:[e("strong",{className:"font-semibold text-fg",children:"Check the offset. "}),h(a.warning)," An offset this far out is what an aftermarket wheel is for, but it changes how far the wheel sits from the guard."," ",e(o,{href:"/contact",className:"text-accent hover:underline",children:"Ask us if you are unsure →"})]})]});case"no-fit":return n(s,{tone:"bad",children:[n("strong",{className:"font-semibold",style:{color:"var(--alert)"},children:["✗ Does not fit your ",r]}),e("span",{className:"mt-2 block",children:h(a.failure)})]});case"unknown":return n(s,{tone:"quiet",children:[e("strong",{className:"font-semibold text-fg",children:a.missing==="vehicle"?`We cannot check this wheel against your ${r}`:"We cannot check this wheel"}),n("span",{className:"mt-2 block",children:[a.missing==="vehicle"?`We have no factory wheel data for the ${r}, and we will not guess at a fit.`:"We do not hold a bolt pattern for this wheel, and we will not guess at a fit."," ",e(o,{href:"/contact",className:"text-accent hover:underline",children:"Ask us before you order →"})]})]});default:return null}}export{N as default};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { SlotComponent } from "efficient-easel/blocks";
|
|
3
|
+
export declare const TRUST_BULLETS_ROW_CLASS = "border-t border-line pt-5";
|
|
4
|
+
export declare function trustBulletsSlot(stored: unknown): SlotComponent | undefined;
|
|
5
|
+
export declare function trustBulletsRow(Slot: SlotComponent | undefined, editing: boolean): ReactNode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{jsx as s}from"react/jsx-runtime";const r="border-t border-line pt-5";function i(t){return t&&!Array.isArray(t)?t:void 0}function o(t,e){if(!t)return null;const n=e?r:`${r} empty:hidden`;return s(t,{className:n,minEmptyHeight:40})}export{r as TRUST_BULLETS_ROW_CLASS,o as trustBulletsRow,i as trustBulletsSlot};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type RefObject } from "react";
|
|
2
|
-
export declare function useModalDismiss({ active, onDismiss, focusRef, lockScroll, scopeRef, }: {
|
|
2
|
+
export declare function useModalDismiss({ active, onDismiss, focusRef, lockScroll, scopeRef, trapRef, }: {
|
|
3
3
|
active: boolean;
|
|
4
4
|
onDismiss: () => void;
|
|
5
5
|
focusRef?: RefObject<HTMLElement | null>;
|
|
6
6
|
lockScroll?: boolean;
|
|
7
7
|
scopeRef?: RefObject<HTMLElement | null>;
|
|
8
|
+
trapRef?: RefObject<HTMLElement | null>;
|
|
8
9
|
}): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as d}from"react";function D({active:n,onDismiss:f,focusRef:y,lockScroll:a=!0,scopeRef:r,trapRef:i}){d(()=>{if(!n)return;const t=r?.current?.ownerDocument??document,e=u=>{u.key==="Escape"&&f()};return t.addEventListener("keydown",e),()=>t.removeEventListener("keydown",e)},[n,f,r]),d(()=>{if(!n||!a)return;const t=(r?.current?.ownerDocument??document).body,e=t.style.overflow;return t.style.overflow="hidden",()=>{t.style.overflow=e}},[n,a,r]),d(()=>{if(!n)return;const t=(r?.current?.ownerDocument??document).documentElement,e=u=>{const o=Number(t.getAttribute(m)||0)+u;o>0?t.setAttribute(m,String(o)):t.removeAttribute(m)};return e(1),()=>e(-1)},[n,r]),d(()=>{if(!n||!i)return;const t=i.current?.ownerDocument??r?.current?.ownerDocument??document,e=t.activeElement,u=o=>{const s=i.current;if(o.key!=="Tab"||!s)return;const c=Array.from(s.querySelectorAll(E)).filter(A=>!A.hasAttribute("hidden")&&A.getAttribute("aria-hidden")!=="true");if(c.length===0){o.preventDefault(),s.focus();return}const b=c[0],w=c[c.length-1],l=t.activeElement;(!(l&&s.contains(l)&&l!==s)||l===(o.shiftKey?b:w))&&(o.preventDefault(),(o.shiftKey?w:b).focus())};return t.addEventListener("keydown",u),()=>{t.removeEventListener("keydown",u),e&&e!==t.body&&e.isConnected&&e.focus()}},[n,i,r]),d(()=>{n&&y?.current?.focus()},[n,y])}const E="a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex='-1'])",m="data-sf-overlay";export{D as useModalDismiss};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useCallback as A,useEffect as F,useState as u}from"react";import{loadTyreVehicleFitment as T}from"../lib/tyres/tyre-vehicle-fitment.js";function E(c,t){const[d,s]=u(null),[y,r]=u(!1),[k,p]=u(0),w=A(()=>p(n=>n+1),[]),l=t?.make??"",a=t?.model??"",e=t?.year??null,i=t?.modification??"",m=t!==null;return F(()=>{if(!m||e===null){s(null),r(!1);return}let n=!0;return s(null),r(!0),T(c,{make:l,model:a,year:e,modification:i}).then(f=>{if(!n)return;const o=f.vehicle;o.make!==l||o.model!==a||o.year!==e||o.modification!==i||(s(f),r(!1))}),()=>{n=!1}},[c,l,a,e,i,m,k]),{answer:d,loading:y,retry:w}}export{E as useTyreFitAnswer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as r,jsxs as s,Fragment as se}from"react/jsx-runtime";import{LISTING_CARD_SHOW as B}from"../../lib/sections/card-show-defaults.js";import{useCallback as d,useEffect as Qe,useId as Ze,useMemo as l,useRef as et,useState as tt}from"react";import{CARD_IMAGE_BG_OFF as ot,resolveCardImageBackground as rt}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as nt}from"efficient-web-builder/format/lib/content/card-image-shape";import{cardIndexCss as st,DEFAULT_CARD_INDEX_FORMAT as it,DEFAULT_CARD_OUTLINE as lt}from"efficient-web-builder/format/lib/sections/product-card-style";import{answersForKind as ie}from"../../lib/content/field-usage.js";import{useCurrency as at}from"../CurrencyContext.js";import ct from"../NoCurrencyNote.js";import{usePreviewDevice as pt}from"efficient-easel/screen/components/PreviewDeviceContext";import{renderGold as dt,renderHeadline as mt}from"efficient-web-builder/render/components/goldPhrases";import{useUnifiedProductCatalog as ht}from"../useProductCatalog.js";import{scrollBehavior as ut}from"efficient-web-builder/render/components/useReducedMotion";import{normalizePlpColumns as ft,PLP_GRID_GAP_VAR as gt,plpGridVars as yt}from"../../lib/wheels/plp-grid.js";import{plpCardImageSizes as xt}from"../../lib/sections/card-image-sizes.js";import{CARD_ROWS_GRID_CLASS as St,cardRowsGridStyle as wt}from"../WheelCardFrame.js";import{applyPlpFilters as bt,asPlpSortKey as Ct,buildPlpFacets as Nt,buildPlpTypeOptions as vt,buildTyreSizeBoxes as Pt,EMPTY_PLP_FILTERS as le,hasActivePlpFilters as kt,paginatePlp as _t,pickTyreSize as Tt,plpTyreSizeBoxesShown as At,plpInStockCount as zt,plpOpeningSort as Ft,plpPriceBounds as It,plpShownKinds as Ot,plpSortKeysFor as Bt,PLP_SORT_LABELS as Lt}from"../../lib/wheels/plp-filters.js";import{itemKind as z,itemSlug as L,itemTyreSizes as Vt,plpBrandVaries as Rt,plpProcessVaries as Et,plpItemsOfKinds as Dt,plpKindNoun as V,resolvePlpKinds as Kt}from"../../lib/catalog/plp-item.js";import{plpGateWords as jt,plpVehicleCopy as Gt}from"../../lib/catalog/plp-vehicle-copy.js";import{oemBadgeSize as Mt,oemTyreSizes as $t}from"../../lib/tyres/tyre-vehicle-fitment.js";import Wt from"../TyreSummaryCard.js";import{wheelsFittingVehicle as Ht}from"../../lib/wheels/plp-fitment-match.js";import Ut from"./PlpActiveChips.js";import{DEFAULT_COVER_INDEX as Xt}from"../../lib/wheels/cover-rendering.js";import Yt from"./PlpCard.js";import qt from"./PlpPagination.js";import Jt from"./PlpSidebar.js";import Qt from"./PlpVehicleBar.js";import Zt from"./PlpVehicleGate.js";import{useVehicleCatalog as eo}from"./useVehicleCatalog.js";import{useVehicleFit as to}from"../fitment/useVehicleFit.js";import{usePlpFiltersInUrl as oo}from"./usePlpFiltersInUrl.js";import{say as R}from"efficient-web-builder/format/lib/editor-words";const Ko={heading:"Let's find wheels that fit your car.",intro:"Tell us what you drive and we'll show you every set that bolts straight on — bolt pattern, offset and hub bore checked for you."};function ro({level:C,className:N,children:v}){return r(C===2?"h2":"h1",{className:N,children:v})}const no=[];function so({heading:C="",intro:N="",askForCar:v=!0,gateHeading:E="",gateIntro:ae="",perPage:D=24,columns:ce,defaultSort:pe="recommended",hiddenFacets:de=[],fieldUsage:g=no,showPrice:K=!0,showInStock:me=!0,kinds:he,products:ue,wheels:fe,requestQuery:ge,editing:m=!1,coverIndex:ye=Xt,cardImage:xe,spinOnHover:Se=!1,imageBackground:we,showBadge:be=!0,showCardSizes:Ce,showCardBuy:Ne,showCardPage:ve,showCardPrice:Pe,showCardFinishes:ke,outline:_e=lt,indexBadge:j=it,titleLevel:Te}){const{currency:a}=at(),Ae=rt(we,ot),h=Kt(he),G=pt(),M=ft(ce),ze=yt(M,m?G:null),Fe=xt(M,m?G:null),$=`plp-${Ze().replace(/:/g,"")}`,F=st($,j),Ie=ht(),W=ue??fe??Ie??[],H=l(()=>Dt(W,h),[W,h.join(",")]),o=to({editing:m,enabled:v,autoApply:!0}),[Oe,I]=tt(!1),Be=Ft(pe,h),y=o.applied?.vehicle??null,[t,w]=oo({editing:m,openingSort:Be,appliedVehicle:y,vehicleRestored:o.restored,requestQuery:ge}),p=Ot(h,t.kind),i=d(e=>w(e),[w]),U=d((e,u)=>{const c=t[e],qe=c.map(String).includes(u)?c.filter(Je=>String(Je)!==u):[...c,e==="diameters"?Number(u):u];i({...t,[e]:qe,page:1})},[t,i]),X=d(e=>i({...t,priceMax:e,page:1}),[t,i]),Y=d(e=>i({...t,inStockOnly:e,page:1}),[t,i]),q=d(e=>i({...le,kind:e,inStockOnly:t.inStockOnly,priceMax:t.priceMax,sort:t.sort}),[t.inStockOnly,t.priceMax,t.sort,i]),Le=d(e=>i({...t,sort:e,page:1}),[t,i]),Ve=d(e=>{i({...t,page:e}),typeof window<"u"&&window.scrollTo({top:0,behavior:ut()})},[t,i]),J=d(()=>i({...le,sort:t.sort}),[t.sort,i]),{clear:k}=o,Q=d(()=>{k(),I(!0),w(e=>({...e,page:1}))},[k]),Re=d(()=>{k(),I(!1),w(e=>({...e,page:1}))},[k]),_=y?[y.make,y.model,y.year,y.modification].join("|"):"",T=et(null);Qe(()=>{if(o.restored){if(T.current===null){T.current=_;return}T.current!==_&&(T.current=_,w(e=>e.page===1?e:{...e,page:1}))}},[o.restored,_,w]);const A=eo({catalog:H,shownKinds:h,vehicle:y,editing:m}),n=l(()=>{if(!o.fit)return A;const e=A.filter(c=>z(c)==="alloy-wheel"),u=new Set(Ht(e,o.fit).map(c=>c.slug));return A.filter(c=>z(c)!=="alloy-wheel"||u.has(L(c)))},[A,o.fit]),b=de.join(","),Ee=l(()=>{const e=new Set(b?b.split(","):[]);return Nt(n,t,a,p,g).filter(u=>!e.has(u.key))},[n,t,a,b,p.join(","),g]),x=l(()=>bt(n,t,a),[n,t,a]),Z=p.length>1,De=l(()=>ie(g,"alloy-wheel"),[g]),Ke=l(()=>ie(g,"tyre"),[g]),ee=l(()=>Rt(x),[x]),je=l(()=>Et(x),[x]),Ge=l(()=>K?It(n,a):null,[n,a,K]),Me=l(()=>zt(n,t,a),[n,t,a]),$e=l(()=>vt(n,h,t,a),[n,h.join(","),t,a]),We=d((e,u)=>{const c=Tt(n.flatMap(Vt),t.tyreSizes[0]??"",e,u);i({...t,tyreSizes:c?[c]:[],page:1})},[n,t,i]),He=l(()=>{const e=new Set(b?b.split(","):[]);return!At(n,p)||e.has("tyreSizes")?null:Pt(n,t,a)},[n,t,a,b,p.join(","),g]),f=l(()=>_t(x,t.page,D),[x,t.page,D]),S=V(p),O=Gt(p),te=jt(E,ae,p,h),oe=p.length===1&&p[0]==="tyre",re=o.applied?.stock??null,P=l(()=>$t(re),[re]),Ue=l(()=>n.filter(e=>p.includes(z(e))).length,[n,p.join(",")]),ne=H.length===0,Xe=!ne&&n.length===0,Ye=v&&!m&&!o.applied&&!Oe;return h.length===0?null:s("section",{style:nt(xe),children:[v&&r(Qt,{cascade:o.cascade,appliedName:o.appliedName,fit:o.fit,fitSummary:oe&&P.length>0?`Takes ${P.join(" · ")}`:null,resolving:o.resolving,unresolved:oe?!!o.applied&&!o.resolving&&P.length===0:o.unresolved,matchCount:Ue,copy:O,onAmend:Re,onClear:Q}),Ye&&r(Zt,{cascade:o.cascade,heading:te.heading,intro:te.intro,ready:o.restored,copy:O,onSkip:()=>I(!0)}),s("div",{className:"px-5 py-10 md:px-[max(2.5rem,calc((100%_-_var(--sf-content-cap,100%))/2_+_2.5rem))]",children:[(C||N)&&s("header",{className:"mb-6",children:[C&&r(ro,{level:Te,className:"font-display text-[clamp(28px,4vw,40px)] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[1.05] tracking-[-0.02em]",children:mt(C,!1)}),N&&r("p",{className:"mt-2 max-w-[60ch] text-[15px] text-fg-dim",children:dt(N)})]}),s("div",{className:"flex flex-col gap-8 lg:flex-row lg:items-start",children:[r(Jt,{facets:Ee,filters:t,typeOptions:$e,sizeBoxes:He,sizeMatches:t.tyreSizes.length>0?x.length:null,noun:S,priceBounds:Ge,inStockCount:me?Me:null,onToggle:U,onPickType:q,onPickSize:We,onPriceMax:X,onInStockOnly:Y,onClearAll:J}),s("div",{className:"min-w-0 flex-1",children:[s("div",{className:"mb-4 flex min-h-[34px] flex-wrap items-center justify-between gap-x-4 gap-y-2 border-b border-line pb-3",children:[s("div",{className:"flex min-w-0 flex-1 flex-wrap items-center gap-x-4 gap-y-2",children:[r("p",{className:"font-mono text-[12px] tabular-nums tracking-[0.08em]",children:f.total===0?s("span",{className:"text-fg-dim",children:["No ",S.many]}):s(se,{children:[s("span",{children:[f.from,"–",f.to]}),s("span",{className:"text-fg-dim",children:[" of ",f.total," ",S.many]})]})}),r(Ut,{filters:t,onToggle:U,onPriceMax:X,onInStockOnly:Y,onPickType:q})]}),s("label",{className:"flex items-center gap-2 font-mono text-[11px] uppercase tracking-[0.16em] text-fg-dim",children:["Sort by",r("select",{value:t.sort,onChange:e=>Le(Ct(e.target.value)),className:"cursor-pointer border border-line bg-transparent px-2 py-2 font-mono text-[12px] normal-case tracking-normal text-fg",children:Bt(h).map(e=>r("option",{value:e,children:Lt[e]},e))})]})]}),ne?r("div",{className:"border border-dashed border-line p-10",children:r("p",{className:"font-mono text-[12px] uppercase tracking-[0.16em] text-fg-dim",children:m?S.many==="wheels"?R("No wheels in this website's catalog yet — curate products to see them here."):S.many==="tyres"?R("No tyres in this website's catalog yet — curate products to see them here."):R("No products in this website's catalog yet — curate products to see them here."):"Our catalog is being updated. Please check back shortly."})}):Xe?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No confirmed fit for your ",o.appliedName]}),r("p",{className:"mt-2 max-w-[52ch] text-[14px] text-fg-dim",children:O.nothingFits}),s("button",{type:"button",onClick:Q,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:["Show all ",S.many]})]}):f.total===0?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No ",S.many," match those filters"]}),r("p",{className:"mt-2 max-w-[46ch] text-[14px] text-fg-dim",children:"Try widening the price range or clearing a filter."}),kt(t)&&r("button",{type:"button",onClick:J,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:"Clear all filters"})]}):s(se,{children:[F&&r("style",{children:F}),r("div",{className:`${F?`${$} plp-card-grid`:"plp-card-grid"} ${St}`,style:{...ze,...wt(`var(${gt})`)},children:f.items.map(e=>z(e)==="tyre"?r(Wt,{item:e,currency:a,fitSize:P.length>0?Mt(e.sizes,P):null,kindLabel:Z?V(["tyre"]).one:null,showBrand:ee,editing:m,fieldUsage:Ke},`tyre:${L(e)}`):r(Yt,{wheel:e,colours:t.finishes,fit:o.fit,editing:m,kindLabel:Z?V(["alloy-wheel"]).one:null,showBrand:ee,coverIndex:ye,fieldUsage:De,showProcess:je,spinOnHover:Se,imageBackgroundFill:Ae,showBadge:be,outline:_e,indexBadge:j,showCardSizes:Ce??B.showCardSizes,showCardBuy:Ne??B.showCardBuy,showCardPage:ve??B.showCardPage,showCardPrice:Pe??!0,showCardFinishes:ke??!0,imageSizes:Fe},`wheel:${L(e)}`))})]}),r(qt,{page:f.page,pageCount:f.pageCount,onPage:Ve}),r(ct,{editing:m})]})]})]})]})}export{Ko as PLP_GATE_DEFAULTS,so as default};
|
|
1
|
+
"use client";import{jsx as r,jsxs as s,Fragment as se}from"react/jsx-runtime";import{LISTING_CARD_SHOW as I}from"../../lib/sections/card-show-defaults.js";import{useScopeClass as Qe}from"../../lib/use-scope-class.js";import{useCallback as m,useEffect as Ze,useMemo as l,useRef as et,useState as tt}from"react";import{CARD_IMAGE_BG_OFF as ot,resolveCardImageBackground as rt}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as nt}from"efficient-web-builder/format/lib/content/card-image-shape";import{cardIndexCss as st,DEFAULT_CARD_INDEX_FORMAT as it,DEFAULT_CARD_OUTLINE as lt}from"efficient-web-builder/format/lib/sections/product-card-style";import{answersForKind as ie}from"../../lib/content/field-usage.js";import{useCurrency as at}from"../CurrencyContext.js";import ct from"../NoCurrencyNote.js";import{usePreviewDevice as pt}from"efficient-easel/screen/components/PreviewDeviceContext";import{renderGold as mt,renderHeadline as dt}from"efficient-web-builder/render/components/goldPhrases";import{useUnifiedProductCatalog as ht}from"../useProductCatalog.js";import{scrollBehavior as ut}from"efficient-web-builder/render/components/useReducedMotion";import{normalizePlpColumns as ft,PLP_GRID_GAP_VAR as gt,plpGridVars as yt}from"../../lib/wheels/plp-grid.js";import{plpCardImageSizes as xt}from"../../lib/sections/card-image-sizes.js";import{CARD_ROWS_GRID_CLASS as St,cardRowsGridStyle as wt}from"../WheelCardFrame.js";import{applyPlpFilters as bt,asPlpSortKey as Ct,buildPlpFacets as Nt,buildPlpTypeOptions as vt,buildTyreSizeBoxes as Pt,EMPTY_PLP_FILTERS as le,hasActivePlpFilters as kt,paginatePlp as _t,pickTyreSize as Tt,plpTyreSizeBoxesShown as At,plpInStockCount as zt,plpOpeningSort as Ft,plpPriceBounds as Ot,plpShownKinds as Bt,plpSortKeysFor as It,PLP_SORT_LABELS as Lt}from"../../lib/wheels/plp-filters.js";import{itemKind as z,itemSlug as L,itemTyreSizes as Vt,plpBrandVaries as Rt,plpProcessVaries as Et,plpItemsOfKinds as Dt,plpKindNoun as V,resolvePlpKinds as Kt}from"../../lib/catalog/plp-item.js";import{plpGateWords as jt,plpVehicleCopy as Gt}from"../../lib/catalog/plp-vehicle-copy.js";import{oemBadgeSize as Mt,oemTyreSizes as $t}from"../../lib/tyres/tyre-vehicle-fitment.js";import Wt from"../TyreSummaryCard.js";import{wheelsFittingVehicle as Ht}from"../../lib/wheels/plp-fitment-match.js";import Ut from"./PlpActiveChips.js";import{DEFAULT_COVER_INDEX as Xt}from"../../lib/wheels/cover-rendering.js";import Yt from"./PlpCard.js";import qt from"./PlpPagination.js";import Jt from"./PlpSidebar.js";import Qt from"./PlpVehicleBar.js";import Zt from"./PlpVehicleGate.js";import{useVehicleCatalog as eo}from"./useVehicleCatalog.js";import{useVehicleFit as to}from"../fitment/useVehicleFit.js";import{usePlpFiltersInUrl as oo}from"./usePlpFiltersInUrl.js";import{say as R}from"efficient-web-builder/format/lib/editor-words";const jo={heading:"Let's find wheels that fit your car.",intro:"Tell us what you drive and we'll show you every set that bolts straight on — bolt pattern, offset and hub bore checked for you."};function ro({level:C,className:N,children:v}){return r(C===2?"h2":"h1",{className:N,children:v})}const no=[];function so({heading:C="",intro:N="",askForCar:v=!0,gateHeading:E="",gateIntro:ae="",perPage:D=24,columns:ce,defaultSort:pe="recommended",hiddenFacets:me=[],fieldUsage:g=no,showPrice:K=!0,showInStock:de=!0,kinds:he,products:ue,wheels:fe,requestQuery:ge,editing:d=!1,coverIndex:ye=Xt,cardImage:xe,spinOnHover:Se=!1,imageBackground:we,showBadge:be=!0,showCardSizes:Ce,showCardBuy:Ne,showCardPage:ve,showCardPrice:Pe,showCardFinishes:ke,outline:_e=lt,indexBadge:j=it,titleLevel:Te}){const{currency:a}=at(),Ae=rt(we,ot),h=Kt(he),G=pt(),M=ft(ce),ze=yt(M,d?G:null),Fe=xt(M,d?G:null),$=Qe("plp"),F=st($,j),Oe=ht(),W=ue??fe??Oe??[],H=l(()=>Dt(W,h),[W,h.join(",")]),o=to({editing:d,enabled:v,autoApply:!0}),[Be,O]=tt(!1),Ie=Ft(pe,h),y=o.applied?.vehicle??null,[t,w]=oo({editing:d,openingSort:Ie,appliedVehicle:y,vehicleRestored:o.restored,requestQuery:ge}),p=Bt(h,t.kind),i=m(e=>w(e),[w]),U=m((e,u)=>{const c=t[e],qe=c.map(String).includes(u)?c.filter(Je=>String(Je)!==u):[...c,e==="diameters"?Number(u):u];i({...t,[e]:qe,page:1})},[t,i]),X=m(e=>i({...t,priceMax:e,page:1}),[t,i]),Y=m(e=>i({...t,inStockOnly:e,page:1}),[t,i]),q=m(e=>i({...le,kind:e,inStockOnly:t.inStockOnly,priceMax:t.priceMax,sort:t.sort}),[t.inStockOnly,t.priceMax,t.sort,i]),Le=m(e=>i({...t,sort:e,page:1}),[t,i]),Ve=m(e=>{i({...t,page:e}),typeof window<"u"&&window.scrollTo({top:0,behavior:ut()})},[t,i]),J=m(()=>i({...le,sort:t.sort}),[t.sort,i]),{clear:k}=o,Q=m(()=>{k(),O(!0),w(e=>({...e,page:1}))},[k]),Re=m(()=>{k(),O(!1),w(e=>({...e,page:1}))},[k]),_=y?[y.make,y.model,y.year,y.modification].join("|"):"",T=et(null);Ze(()=>{if(o.restored){if(T.current===null){T.current=_;return}T.current!==_&&(T.current=_,w(e=>e.page===1?e:{...e,page:1}))}},[o.restored,_,w]);const A=eo({catalog:H,shownKinds:h,vehicle:y,editing:d}),n=l(()=>{if(!o.fit)return A;const e=A.filter(c=>z(c)==="alloy-wheel"),u=new Set(Ht(e,o.fit).map(c=>c.slug));return A.filter(c=>z(c)!=="alloy-wheel"||u.has(L(c)))},[A,o.fit]),b=me.join(","),Ee=l(()=>{const e=new Set(b?b.split(","):[]);return Nt(n,t,a,p,g).filter(u=>!e.has(u.key))},[n,t,a,b,p.join(","),g]),x=l(()=>bt(n,t,a),[n,t,a]),Z=p.length>1,De=l(()=>ie(g,"alloy-wheel"),[g]),Ke=l(()=>ie(g,"tyre"),[g]),ee=l(()=>Rt(x),[x]),je=l(()=>Et(x),[x]),Ge=l(()=>K?Ot(n,a):null,[n,a,K]),Me=l(()=>zt(n,t,a),[n,t,a]),$e=l(()=>vt(n,h,t,a),[n,h.join(","),t,a]),We=m((e,u)=>{const c=Tt(n.flatMap(Vt),t.tyreSizes[0]??"",e,u);i({...t,tyreSizes:c?[c]:[],page:1})},[n,t,i]),He=l(()=>{const e=new Set(b?b.split(","):[]);return!At(n,p)||e.has("tyreSizes")?null:Pt(n,t,a)},[n,t,a,b,p.join(","),g]),f=l(()=>_t(x,t.page,D),[x,t.page,D]),S=V(p),B=Gt(p),te=jt(E,ae,p,h),oe=p.length===1&&p[0]==="tyre",re=o.applied?.stock??null,P=l(()=>$t(re),[re]),Ue=l(()=>n.filter(e=>p.includes(z(e))).length,[n,p.join(",")]),ne=H.length===0,Xe=!ne&&n.length===0,Ye=v&&!d&&!o.applied&&!Be;return h.length===0?null:s("section",{style:nt(xe),children:[v&&r(Qt,{cascade:o.cascade,appliedName:o.appliedName,fit:o.fit,fitSummary:oe&&P.length>0?`Takes ${P.join(" · ")}`:null,resolving:o.resolving,unresolved:oe?!!o.applied&&!o.resolving&&P.length===0:o.unresolved,matchCount:Ue,copy:B,onAmend:Re,onClear:Q}),Ye&&r(Zt,{cascade:o.cascade,heading:te.heading,intro:te.intro,ready:o.restored,copy:B,onSkip:()=>O(!0)}),s("div",{className:"px-5 py-10 md:px-[max(2.5rem,calc((100%_-_var(--sf-content-cap,100%))/2_+_2.5rem))]",children:[(C||N)&&s("header",{className:"mb-6",children:[C&&r(ro,{level:Te,className:"font-display text-[clamp(28px,4vw,40px)] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[1.05] tracking-[-0.02em]",children:dt(C,!1)}),N&&r("p",{className:"mt-2 max-w-[60ch] text-[15px] text-fg-dim",children:mt(N)})]}),s("div",{className:"flex flex-col gap-8 lg:flex-row lg:items-start",children:[r(Jt,{facets:Ee,filters:t,typeOptions:$e,sizeBoxes:He,sizeMatches:t.tyreSizes.length>0?x.length:null,noun:S,priceBounds:Ge,inStockCount:de?Me:null,onToggle:U,onPickType:q,onPickSize:We,onPriceMax:X,onInStockOnly:Y,onClearAll:J}),s("div",{className:"min-w-0 flex-1",children:[s("div",{className:"mb-4 flex min-h-[34px] flex-wrap items-center justify-between gap-x-4 gap-y-2 border-b border-line pb-3",children:[s("div",{className:"flex min-w-0 flex-1 flex-wrap items-center gap-x-4 gap-y-2",children:[r("p",{className:"font-mono text-[12px] tabular-nums tracking-[0.08em]",children:f.total===0?s("span",{className:"text-fg-dim",children:["No ",S.many]}):s(se,{children:[s("span",{children:[f.from,"–",f.to]}),s("span",{className:"text-fg-dim",children:[" of ",f.total," ",S.many]})]})}),r(Ut,{filters:t,onToggle:U,onPriceMax:X,onInStockOnly:Y,onPickType:q})]}),s("label",{className:"flex items-center gap-2 font-mono text-[11px] uppercase tracking-[0.16em] text-fg-dim",children:["Sort by",r("select",{value:t.sort,onChange:e=>Le(Ct(e.target.value)),className:"cursor-pointer border border-line bg-transparent px-2 py-2 font-mono text-[12px] normal-case tracking-normal text-fg",children:It(h).map(e=>r("option",{value:e,children:Lt[e]},e))})]})]}),ne?r("div",{className:"border border-dashed border-line p-10",children:r("p",{className:"font-mono text-[12px] uppercase tracking-[0.16em] text-fg-dim",children:d?S.many==="wheels"?R("No wheels in this website's catalog yet — curate products to see them here."):S.many==="tyres"?R("No tyres in this website's catalog yet — curate products to see them here."):R("No products in this website's catalog yet — curate products to see them here."):"Our catalog is being updated. Please check back shortly."})}):Xe?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No confirmed fit for your ",o.appliedName]}),r("p",{className:"mt-2 max-w-[52ch] text-[14px] text-fg-dim",children:B.nothingFits}),s("button",{type:"button",onClick:Q,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:["Show all ",S.many]})]}):f.total===0?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No ",S.many," match those filters"]}),r("p",{className:"mt-2 max-w-[46ch] text-[14px] text-fg-dim",children:"Try widening the price range or clearing a filter."}),kt(t)&&r("button",{type:"button",onClick:J,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:"Clear all filters"})]}):s(se,{children:[F&&r("style",{children:F}),r("div",{className:`${F?`${$} plp-card-grid`:"plp-card-grid"} ${St}`,style:{...ze,...wt(`var(${gt})`)},children:f.items.map(e=>z(e)==="tyre"?r(Wt,{item:e,currency:a,fitSize:P.length>0?Mt(e.sizes,P):null,kindLabel:Z?V(["tyre"]).one:null,showBrand:ee,editing:d,fieldUsage:Ke},`tyre:${L(e)}`):r(Yt,{wheel:e,colours:t.finishes,fit:o.fit,editing:d,kindLabel:Z?V(["alloy-wheel"]).one:null,showBrand:ee,coverIndex:ye,fieldUsage:De,showProcess:je,spinOnHover:Se,imageBackgroundFill:Ae,showBadge:be,outline:_e,indexBadge:j,showCardSizes:Ce??I.showCardSizes,showCardBuy:Ne??I.showCardBuy,showCardPage:ve??I.showCardPage,showCardPrice:Pe??!0,showCardFinishes:ke??!0,imageSizes:Fe},`wheel:${L(e)}`))})]}),r(qt,{page:f.page,pageCount:f.pageCount,onPage:Ve}),r(ct,{editing:d})]})]})]})]})}export{jo as PLP_GATE_DEFAULTS,so as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,jsxs as
|
|
1
|
+
"use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useId as y,useRef as S,useState as m}from"react";import{useCurrency as P}from"../CurrencyContext.js";import{formatPrice as _}from"../../lib/commerce.js";import{withRMark as k}from"efficient-web-builder/render/components/RMark";import I from"../PopupFrame.js";import{useStockAlertSignup as E}from"../useStockAlertSignup.js";import{UNPRICED_LABEL as A,resolveSetPrice as D}from"../../lib/wheels/price-display.js";function K({wheelName:p,productSlug:N,finishName:h,variants:i,initialSize:w,onClose:o,editing:C=!1}){const s=y(),f=y(),l=S(null),{currency:u}=P(),n=E(),[z,M]=m(()=>w??i[0]?.size??""),[c,W]=m(""),[x,j]=m(!1),a=i.find(r=>r.size===z)??i[0];if(!a)return null;const B=n.status==="sent",d=n.status==="sending",g=n.status==="invalid"?"Please enter a valid email address.":n.status==="error"?"Couldn't save that — please try again.":null;function R(){a&&n.submit({partNumbers:a.components.map(r=>r.partNumber),email:c,productSlug:N,subscribeToOffers:x,dryRun:C})}return e(I,{site:{blur:6,scroll:!0,focusRef:l,trapRef:l},labelledBy:s,onClose:o,children:t("div",{ref:l,tabIndex:-1,className:"relative w-[420px] max-w-full border-2 border-accent bg-surface text-left shadow-[0_24px_60px_rgba(0,0,0,0.55)] outline-none",children:[e("button",{type:"button",onClick:o,"aria-label":"Close",className:"absolute right-[10px] top-[10px] z-[2] flex h-9 w-9 cursor-pointer items-center justify-center text-fg-dim transition-colors hover:text-accent",children:e("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,children:e("path",{d:"M6 6l12 12M18 6 6 18"})})}),B?t("div",{className:"px-6 py-8 text-center",children:[e("span",{className:"mx-auto mb-4 grid h-16 w-16 place-items-center rounded-full border-[1.5px] border-accent bg-accent/15",children:e("svg",{width:"30",height:"30",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent)",strokeWidth:"2.5","aria-hidden":!0,children:e("path",{d:"M20 6 9 17l-5-5"})})}),e("h3",{id:s,className:"font-display text-[22px] font-medium uppercase leading-tight tracking-[-0.02em]",children:"You're on the list"}),t("p",{className:"mx-auto mt-2 max-w-[34ch] text-[13px] leading-[1.6] text-fg-dim",children:["We'll alert ",e("strong",{className:"font-normal text-fg",children:c.trim()})," as soon as the ",k(p)," in ",a.size," is back. Keep an eye on your inbox."]}),e("button",{type:"button",onClick:o,className:"mt-6 w-full cursor-pointer border border-line px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-fg transition-colors hover:border-accent hover:text-accent",children:"Continue browsing"})]}):t("form",{className:"p-6",noValidate:!0,onSubmit:r=>{r.preventDefault(),R()},children:[t("div",{className:"mb-2 flex items-center gap-3",children:[e("span",{className:"grid h-11 w-11 flex-none place-items-center border-[1.5px] border-accent bg-accent/15",children:t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"var(--accent)",strokeWidth:"2","aria-hidden":!0,children:[e("path",{d:"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"}),e("path",{d:"M13.7 21a2 2 0 0 1-3.4 0"})]})}),t("div",{children:[e("div",{className:"font-mono text-[10px] uppercase tracking-[0.3em] text-accent",children:"Back-in-stock alert"}),e("h3",{id:s,className:"mt-0.5 font-display text-[22px] font-medium uppercase leading-tight tracking-[-0.02em]",children:"Notify me"})]})]}),t("p",{className:"mb-5 text-[13px] leading-[1.6] text-fg-dim",children:["We'll email you the moment the"," ",e("strong",{className:"font-normal text-fg",children:k(p)}),h?` in ${h}`:""," ","is back in stock. No spam — one alert, then we're done."]}),t("fieldset",{className:"mb-4 border-0 p-0",children:[e("legend",{className:"mb-2 font-mono text-[10px] uppercase tracking-[0.16em] text-fg-dim",children:"Which fitment?"}),e("div",{className:"flex flex-wrap gap-2",children:i.map(r=>{const b=r.size===a.size;return t("button",{type:"button","aria-pressed":b,onClick:()=>M(r.size),className:["flex min-w-[calc(50%-4px)] flex-1 cursor-pointer flex-col items-start gap-0.5 border-[1.5px] px-3 py-3 text-left transition-colors",b?"border-accent bg-accent/15":"border-line hover:border-accent/60"].join(" "),children:[e("span",{className:"font-mono text-[12px] font-bold tracking-[0.08em] text-fg",children:r.size}),e("span",{className:"font-mono text-[10px] tracking-[0.08em] text-fg-dim",children:(()=>{const v=D(r.components,u);return v.setTotal!=null?_(v.setTotal,u):A})()})]},r.size)})})]}),t("div",{className:"mb-4",children:[e("label",{htmlFor:f,className:"mb-2 block font-mono text-[10px] uppercase tracking-[0.16em] text-fg-dim",children:"Email address"}),e("input",{id:f,type:"email",value:c,onChange:r=>{W(r.target.value),(n.status==="invalid"||n.status==="error")&&n.reset()},placeholder:"you@example.com",disabled:d,className:"w-full border-2 border-line bg-bg px-4 py-3 font-display text-[15px] text-fg outline-none transition-colors placeholder:text-fg-dim hover:border-fg-dim focus:border-accent disabled:opacity-60"})]}),t("label",{className:"mb-5 flex cursor-pointer items-start gap-3 text-[12px] leading-[1.5] text-fg-dim",children:[e("input",{type:"checkbox",checked:x,onChange:r=>j(r.target.checked),className:"mt-0.5 h-[18px] w-[18px] flex-none cursor-pointer accent-[var(--accent)]"}),e("span",{children:"Also send me fitment tips and occasional offers for my vehicle."})]}),t("button",{type:"submit",disabled:d,className:"flex h-[50px] w-full cursor-pointer items-center justify-center gap-2 bg-btn px-4 font-mono text-[12px] font-bold uppercase tracking-[0.24em] text-btn-ink transition-colors hover:bg-fg disabled:cursor-not-allowed disabled:opacity-60 disabled:hover:bg-btn",children:[t("svg",{width:"17",height:"17",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,children:[e("path",{d:"m22 2-7 20-4-9-9-4Z"}),e("path",{d:"M22 2 11 13"})]}),d?"Sending…":"Notify me when available"]}),g&&e("p",{role:"alert",className:"mt-3 text-[12px] leading-[1.5]",style:{color:"var(--alert)"},children:g}),t("div",{className:"mt-3 flex items-center justify-center gap-2 text-[11px] text-fg-dim",children:[t("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,children:[e("rect",{x:"3",y:"11",width:"18",height:"11",rx:"1"}),e("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]}),"We never share your details."]})]})]})})}export{K as default};
|
|
@@ -309,6 +309,9 @@ export type CouponFreeUnit = components["schemas"]["CouponFreeUnit"];
|
|
|
309
309
|
export type BlogPostSummary = components["schemas"]["BlogPostStub"];
|
|
310
310
|
export type BlogPostDetail = components["schemas"]["BlogPost"];
|
|
311
311
|
export { PRODUCT_API_BASE } from "./origins.js";
|
|
312
|
+
export type ListReadOpts = {
|
|
313
|
+
throwOnFailure?: boolean;
|
|
314
|
+
};
|
|
312
315
|
export declare function resolveSiteHost(): Promise<string | null>;
|
|
313
316
|
export declare function resolveSiteHostSource(): Promise<{
|
|
314
317
|
host: string | null;
|
|
@@ -327,11 +330,11 @@ export declare const fitment: {
|
|
|
327
330
|
getStockFitment: (make: string, model: string, year: number, modification: string, region?: string) => Promise<StockFitment | null>;
|
|
328
331
|
};
|
|
329
332
|
export declare const products: {
|
|
330
|
-
listWheels: (process?: string | null) => Promise<WheelSummary[]>;
|
|
333
|
+
listWheels: (process?: string | null, opts?: ListReadOpts) => Promise<WheelSummary[]>;
|
|
331
334
|
listCatalog: (kinds: readonly ProductKind[], vehicle?: TyreFitVehicleQuery | null) => Promise<ProductSummary[]>;
|
|
332
335
|
getWheel: (slug: string) => Promise<Wheel>;
|
|
333
336
|
getTyre: (slug: string) => Promise<Tyre>;
|
|
334
|
-
listBundles: () => Promise<Bundle[]>;
|
|
337
|
+
listBundles: (opts?: ListReadOpts) => Promise<Bundle[]>;
|
|
335
338
|
getBundle: (slug: string) => Promise<Bundle>;
|
|
336
339
|
listGalleryBuilds: (opts?: {
|
|
337
340
|
process?: Process | null;
|
|
@@ -351,7 +354,7 @@ export declare const products: {
|
|
|
351
354
|
revalidate?: number;
|
|
352
355
|
record?: string;
|
|
353
356
|
}) => Promise<Page>;
|
|
354
|
-
listBlogPosts: (opts?: NonNullable<operations["listBlogPosts"]["parameters"]["query"]
|
|
357
|
+
listBlogPosts: (opts?: NonNullable<operations["listBlogPosts"]["parameters"]["query"]>, { throwOnFailure }?: ListReadOpts) => Promise<BlogPostSummary[]>;
|
|
355
358
|
getBlogPost: (slug: string) => Promise<BlogPostDetail>;
|
|
356
359
|
createOrder: (body: OrderRequest) => Promise<OrderConfirmation>;
|
|
357
360
|
createOrderAuthed: (body: OrderRequest) => Promise<OrderConfirmation>;
|