efficient-storefront-blocks 0.87.0 → 0.88.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 +23 -0
- package/dist/chunks/{EditorPreviewCheckout-GD4IJ4WK.js → EditorPreviewCheckout-ZGPS3Q3X.js} +1 -1
- package/dist/chunks/{SiteEditorProvider-2UVCJZXS.js → SiteEditorProvider-HZ47WOEX.js} +1 -1
- package/dist/chunks/{chunk-H4IHUSCU.js → chunk-7C2YH2AQ.js} +1 -1
- package/dist/chunks/chunk-O7GCI2MP.js +1 -0
- package/dist/chunks/chunk-RHNDIM7Z.js +382 -0
- package/dist/chunks/chunk-VOK5N3IB.js +1 -0
- package/dist/chunks/{fitment-data-5GBUMO2O.js → fitment-data-SH4US3BV.js} +1 -1
- package/dist/contract.js +14 -2
- package/dist/editor/components/CategorySource.d.ts +8 -1
- package/dist/editor/components/CategorySource.js +1 -1
- package/dist/editor/components/CollectionPicker.js +1 -1
- package/dist/editor/components/EditProductLink.js +1 -1
- package/dist/editor/components/FinishPicker.js +1 -1
- package/dist/editor/components/FormPicker.js +1 -1
- package/dist/editor/components/GalleryShowcaseSource.js +1 -1
- package/dist/editor/components/HeaderSettingsPanel.js +1 -1
- package/dist/editor/components/ProductHeroSource.js +1 -1
- package/dist/editor/components/ProductPicker.js +1 -1
- package/dist/editor/components/ReviewsProductSource.js +1 -1
- package/dist/editor/components/SocialLinksDoor.js +1 -1
- package/dist/editor/components/SpecTableSource.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/BundleOffer/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.d.ts +2 -0
- package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.js +1 -0
- package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.d.ts +2 -0
- package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.js +1 -0
- package/dist/editor/lib/document/blocks/commerce/GalleryItem/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.d.ts +2 -0
- package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.js +1 -0
- package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductName/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/ProductPicture/fields.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/controls.d.ts +4 -0
- package/dist/editor/lib/document/blocks/commerce/controls.js +1 -1
- package/dist/editor/lib/document/blocks/commerce/index.d.ts +1 -1
- package/dist/editor/lib/document/blocks/commerce/index.js +1 -1
- package/dist/editor/lib/document/config.js +1 -1
- package/dist/editor/lib/editor-words-kept.d.ts +1 -0
- package/dist/editor/lib/editor-words-kept.js +1 -0
- package/dist/editor/lib/efficient-backend.d.ts +7 -1
- package/dist/editor/lib/efficient-backend.js +1 -1
- package/dist/editor/lib/storefront-document.js +1 -1
- package/dist/editor/lib/storefront-editor-words.d.ts +33 -4
- package/dist/editor/lib/storefront-editor-words.js +1 -1
- package/dist/editor.css +1 -1
- package/dist/index.js +134 -81
- package/dist/links.js +1 -1
- package/dist/render/app/globals.css +111 -0
- package/dist/render/built-with.json +1 -1
- package/dist/render/components/BundleCard.d.ts +2 -1
- package/dist/render/components/BundleCard.js +1 -1
- package/dist/render/components/GalleryGrid.js +1 -1
- package/dist/render/components/GalleryItem.d.ts +11 -1
- package/dist/render/components/GalleryItem.js +1 -1
- package/dist/render/components/GridCardTemplate.d.ts +7 -1
- package/dist/render/components/GridCardTemplate.js +1 -1
- package/dist/render/components/ProductGridSection.d.ts +5 -1
- package/dist/render/components/ProductGridSection.js +1 -1
- package/dist/render/components/ProductHeroPanel.js +1 -1
- package/dist/render/components/ProductRef.d.ts +8 -2
- package/dist/render/components/ProductRef.js +1 -1
- package/dist/render/components/SectionBand.d.ts +3 -2
- package/dist/render/components/SectionBand.js +1 -1
- package/dist/render/components/card-pieces/CardBuyButton.d.ts +8 -1
- package/dist/render/components/card-pieces/CardBuyButton.js +1 -1
- package/dist/render/components/card-pieces/CardName.d.ts +2 -1
- package/dist/render/components/card-pieces/CardName.js +1 -1
- package/dist/render/components/card-pieces/CardPrice.js +1 -1
- package/dist/render/components/card-pieces/CardProductBadge.d.ts +2 -1
- package/dist/render/components/card-pieces/CardProductBadge.js +1 -1
- package/dist/render/components/card-pieces/CardProductPicture.d.ts +5 -0
- package/dist/render/components/card-pieces/CardProductPicture.js +1 -1
- package/dist/render/components/card-pieces/CardSpecs.js +1 -1
- package/dist/render/components/card-pieces/HostPart.js +1 -1
- package/dist/render/components/card-pieces/ProductCardState.d.ts +25 -6
- package/dist/render/components/card-pieces/ProductCardState.js +1 -1
- package/dist/render/components/catalog/CatalogFilterContext.d.ts +4 -1
- package/dist/render/components/catalog/CatalogFilterContext.js +1 -1
- package/dist/render/components/catalog/ClearAllButton.d.ts +4 -0
- package/dist/render/components/catalog/ClearAllButton.js +1 -0
- package/dist/render/components/catalog/FilterPill.d.ts +4 -2
- package/dist/render/components/catalog/FilterPill.js +1 -1
- package/dist/render/components/catalog/ShopperChips.d.ts +13 -0
- package/dist/render/components/catalog/ShopperChips.js +1 -0
- package/dist/render/components/catalog/ShopperFilters.d.ts +20 -0
- package/dist/render/components/catalog/ShopperFilters.js +1 -0
- package/dist/render/components/catalog/ShopperScope.d.ts +72 -0
- package/dist/render/components/catalog/ShopperScope.js +3 -0
- package/dist/render/components/catalog/SortSelect.js +1 -1
- package/dist/render/components/pdp-dynamic/DynamicRelatedProducts.js +1 -1
- package/dist/render/components/wheels-plp/PlpActiveChips.js +1 -1
- package/dist/render/components/wheels-plp/PlpPagination.d.ts +2 -1
- package/dist/render/components/wheels-plp/PlpPagination.js +1 -1
- package/dist/render/components/wheels-plp/PlpSidebar.js +1 -1
- package/dist/render/components/wheels-plp/usePlpFiltersInUrl.d.ts +2 -0
- package/dist/render/components/wheels-plp/usePlpFiltersInUrl.js +1 -1
- package/dist/render/lib/api/index.d.ts +6 -0
- package/dist/render/lib/api/index.js +1 -1
- package/dist/render/lib/catalog/related-cards.d.ts +4 -1
- package/dist/render/lib/catalog/relationships.d.ts +9 -2
- package/dist/render/lib/catalog/relationships.js +1 -1
- package/dist/render/lib/commerce.d.ts +2 -0
- package/dist/render/lib/commerce.js +1 -1
- package/dist/render/lib/content/article-body.js +1 -5
- package/dist/render/lib/content/filter-card-seed.d.ts +10 -0
- package/dist/render/lib/content/filter-card-seed.js +1 -0
- package/dist/render/lib/content/product-card-seed.d.ts +5 -0
- package/dist/render/lib/content/product-card-seed.js +1 -1
- package/dist/render/lib/document/blocks/commerce/BundleOffer/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/BundleOffer/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.d.ts +8 -0
- package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.js +1 -0
- package/dist/render/lib/document/blocks/commerce/FilterBlock/render.d.ts +2 -0
- package/dist/render/lib/document/blocks/commerce/FilterBlock/render.js +1 -0
- package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.d.ts +8 -0
- package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.js +1 -0
- package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.d.ts +2 -0
- package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.js +1 -0
- package/dist/render/lib/document/blocks/commerce/GalleryB/meta.js +1 -1
- package/dist/render/lib/document/blocks/commerce/GalleryItem/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.d.ts +2 -0
- package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.js +1 -0
- package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.d.ts +2 -0
- package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.js +1 -0
- 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.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductName/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/ProductPicture/render.js +1 -1
- package/dist/render/lib/document/blocks/commerce/metas.d.ts +3 -0
- package/dist/render/lib/document/blocks/commerce/metas.js +1 -1
- package/dist/render/lib/document/blocks/commerce/renders.d.ts +3 -0
- package/dist/render/lib/document/blocks/commerce/renders.js +1 -1
- package/dist/render/lib/document/card-templates.d.ts +1 -0
- package/dist/render/lib/document/card-templates.js +1 -1
- package/dist/render/lib/document/document-nodes.d.ts +24 -0
- package/dist/render/lib/document/document-nodes.js +1 -0
- package/dist/render/lib/document/lazy-draws.js +1 -1
- package/dist/render/lib/document/render-config.js +1 -1
- package/dist/render/lib/document/storefront-root.js +1 -1
- package/dist/render/lib/links/link-rules.js +1 -1
- package/dist/render/lib/sections/bundle-to-grid.d.ts +8 -0
- package/dist/render/lib/sections/bundle-to-grid.js +1 -0
- package/dist/render/lib/sections/catalog-text-size.d.ts +2 -0
- package/dist/render/lib/sections/catalog-text-size.js +1 -1
- package/dist/render/lib/sections/filter-option-rows.d.ts +37 -0
- package/dist/render/lib/sections/filter-option-rows.js +1 -0
- package/dist/render/lib/sections/gallery-toolbar.d.ts +27 -0
- package/dist/render/lib/sections/gallery-toolbar.js +1 -0
- package/dist/render/lib/sections/grid-no-hole.d.ts +3 -0
- package/dist/render/lib/sections/grid-no-hole.js +1 -1
- package/dist/render/lib/sections/product-grid-pages.d.ts +42 -0
- package/dist/render/lib/sections/product-grid-pages.js +1 -0
- package/dist/render/lib/sections/shopper-filters.d.ts +45 -0
- package/dist/render/lib/sections/shopper-filters.js +1 -0
- package/dist/render/lib/wheels/plp-filters.d.ts +6 -3
- package/dist/render/lib/wheels/plp-filters.js +1 -1
- package/dist/render/lib/wheels/plp-hydrate.d.ts +5 -3
- package/dist/render/lib/wheels/plp-hydrate.js +1 -1
- package/dist/render/lib/wheels/selected-ranges.d.ts +16 -0
- package/dist/render/lib/wheels/selected-ranges.js +1 -0
- package/dist/render/lib/wheels/set-mode.d.ts +10 -0
- package/dist/render/lib/wheels/set-mode.js +1 -1
- package/dist/render/lib/wheels/shopper-first-paint.d.ts +28 -0
- package/dist/render/lib/wheels/shopper-first-paint.js +1 -0
- package/dist/render/lib/wheels/shopper-scope.d.ts +11 -0
- package/dist/render/lib/wheels/shopper-scope.js +1 -0
- package/dist/words.d.ts +46 -6
- package/dist/words.js +6 -6
- package/package.json +4 -4
- package/dist/chunks/chunk-QLR6IVWJ.js +0 -369
- package/dist/chunks/chunk-SYK5QPNV.js +0 -1
- package/dist/chunks/chunk-XZ46W3NV.js +0 -1
- package/dist/render/components/pdp-dynamic/DynamicBundleOffer.d.ts +0 -13
- package/dist/render/components/pdp-dynamic/DynamicBundleOffer.js +0 -1
- /package/dist/chunks/{chunk-DLWIDJS5.js → chunk-NQLVRCTI.js} +0 -0
- /package/dist/chunks/{chunk-QLR6IVWJ.js.LEGAL.txt → chunk-RHNDIM7Z.js.LEGAL.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as a,Fragment as b,jsxs as n}from"react/jsx-runtime";import Q from"next/link";import{BUY_ROW_CLASS as ye}from"./buy-row.js";import{useEffect as X,useRef as Ne,useState as Se}from"react";import{useCart as we}from"./CartContext.js";import Te from"./QuoteLink.js";import{useSiteTakesOrders as _e}from"./SiteRecordContext.js";import Re from"./EmailCaptureForm.js";import{useEnglish as I}from"./EnglishVariant.js";import Ee from"./QuantityStepper.js";import{MarkedLabel as $,heroView as Ce}from"./product-hero/hero-view.js";import Ae from"./ProductGallery.js";import{useRootIsDark as Le}from"efficient-shell/theme";import{useWishlist as Oe}from"./WishlistContext.js";import{useStockAlertSignup as ze}from"./useStockAlertSignup.js";import{SPARE_WORDS as Ie,productCartLine as $e}from"../lib/catalog/purchase.js";import{OPTION_ROW_ATTR as je}from"../lib/catalog/store-product.js";import{resolvingRowsAnswered as Me}from"../lib/catalog/product-options.js";import{STOCK_WORDS as Pe}from"../lib/content/stock-words.js";import{trackViewItem as De}from"../lib/google-tag.js";import{DEFAULT_HERO_LAYOUT as Fe,DEFAULT_HERO_RATIO as He,DEFAULT_HERO_TEXT_ALIGN as Be,parseHeroLayout as Ue,parseHeroRatio as Ve,parseHeroTextAlign as We}from"../lib/sections/hero-arrangement.js";import{DEFAULT_HERO_GALLERY_MODE as Ge,DEFAULT_HERO_IMAGE_FIT as Ke}from"../lib/sections/hero-gallery.js";import{ADD_TO_BASKET_ATTR as qe,MAX_SPARES as Ye,UNITS_PER_SET as Qe,formatPrice as J}from"../lib/commerce.js";import{UNPRICED_LABEL as Xe,formatSelectionPrice as Je,setPriceLabel as Ze}from"../lib/wheels/price-display.js";import{productIsDually as et,productIsTwoObjects as tt,setSuppressesRow as at}from"../lib/wheels/set-mode.js";import{CONTENT_CAP_GUTTER as Z}from"../lib/sections/content-cap-gutter.js";import{CardTemplateRows as nt}from"efficient-web-builder/render/components/CardRowContext";import rt from"./card-pieces/CardPrice.js";import{HeroPriceStateProvider as lt}from"./card-pieces/ProductCardState.js";const ot=4e3;function it(t){return t?[t.year,t.make,t.model,t.modification].join("-"):""}const st=[{}],ct=.72;function dt(t){const r=t.trim().split(/\s+/).filter(Boolean);if(r.length===0)return;const d=r.map((s,c)=>s.length+(r.length>1&&c===r.length-1?1:0));return`calc(100cqi / ${(Math.max(...d)*ct).toFixed(2)})`}function mt({product:t,selection:r,onLightbox:d,editing:s=!1,pricePlacement:c="top",showVehicleFitment:l=!0,heroLayout:p=Fe,imageRatio:w=He,textAlign:te=Be,showSpecTable:ae=!0,showPriceQuote:T=!0,galleryMode:ne=Ge,imageFit:re=Ke,trustBullets:le,nodeId:oe,priceTemplate:j}){const ie=I(),v=Ue(p),M=We(te),y=Ve(w),se=v==="imageRight"?`${100-y}fr ${y}fr`:`${y}fr ${100-y}fr`,{picked:ce,pick:P,qty:D,setQty:de,choice:h,setChoice:N,angleIdx:me,setAngleIdx:pe,showValidation:ue,setShowValidation:_,manualMode:F,vehicle:R,rows:H,facts:fe,part:x,outOfStock:B,offer:m,preOrder:E,canAddToCart:S,currency:k,price:f,set:U,msrpLabel:be}=r,i=Ce(t,r,s),C=et(t),he=tt(t),A=l?i.vehicle:null,ge=l?i.vehicleMemory:null,L=!Le({whenUnset:!0}),{addAndOpen:xe,warmCatalog:V}=we(),g=_e();X(()=>{!s&&g&&V(t.kind)},[s,g,t.kind,V]);const W=H.filter(e=>!E||e.values.length>0),G=W.filter(e=>e.role==="resolves"),O=W.filter(e=>e.role==="describes"&&!at(he,e.key)),K=O.findIndex(e=>e.chosen===null),q=(!A||!i.vehicleAnswersSpecs||r.fitmentSet)&&Me(H,E)?K===-1?O:O.slice(0,K+1):[],ve=[...G,...q],z=a(lt,{value:{kind:"hero",msrpLabel:be||null,amount:C?Ze(f,k):Je(f,k),unitLabel:f.priced?i.unitLabel:null,packBadge:f.setTotal!=null?`${m.quantityLabel}: ${J(U,k)}`:null},children:j?a(nt,{ownerId:oe??"",ownerType:"ProductHero",Template:j,rows:st,fallback:null,children:e=>e}):a(rt,{})}),Y=Ne(null);return X(()=>{s||Y.current===t.slug||(Y.current=t.slug,De({itemId:x?`${t.slug}|${x.id}`:t.slug,itemName:t.name,variant:i.metaValue,pricePerSet:f.setTotal??f.fromSetTotal??0,currency:k}))},[s,t.slug,t.name,i.metaValue,x,f,k]),n(b,{children:[a("nav",{className:`border-b border-line ${Z} pt-4 pb-4 font-mono text-[length:var(--size-label,13px)] uppercase tracking-[0.2em] text-fg-dim max-view-tablet:px-[min(20px,var(--sf-site-gutter,40px))]`,style:L?void 0:{background:"var(--section-bg)"},children:t.crumbs.map((e,o)=>n("span",{children:[o>0&&n(b,{children:[a("span",{className:"mx-3 text-accent",children:"/"}),a("wbr",{})]}),e.href?a(Q,{href:e.href,className:"hover:text-fg",children:a($,{text:e.label})}):a("span",{className:"text-fg",children:a($,{text:e.label})})]},`${e.label}-${o}`))}),n("section",{"data-hero-layout":v,"data-hero-align":M,className:[`grid gap-10 ${Z} py-14 max-view-tablet:px-[min(20px,var(--sf-site-gutter,40px))] max-view-tablet:py-8`,v==="stacked"?"grid-cols-1":"[grid-template-columns:var(--hero-cols)] max-view-desktop:[grid-template-columns:minmax(0,1fr)]"].join(" "),style:{...L?{}:{background:"var(--section-bg)"},...v==="stacked"?{}:{"--hero-cols":se}},children:[a(Ae,{product:t,view:i,angleIdx:me,onSelect:pe,isLight:L,onLightbox:d,galleryMode:ne,imageFit:re,style:v==="imageRight"?{order:2}:void 0}),n("div",{className:["flex flex-col gap-7",M==="center"?"items-center text-center":""].filter(Boolean).join(" "),style:v==="imageRight"?{order:1}:void 0,children:[n("div",{className:"w-full [container-type:inline-size]",children:[n("div",{className:"mb-2.5 flex items-center gap-2.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.2em] text-accent",children:[a("span",{children:a($,{text:t.eyebrow})}),t.badge&&n(b,{children:[a("span",{children:"·"}),a("span",{children:t.badge})]})]}),a("h1",{className:"font-heading2 text-[length:min(min(var(--size-headingMedium,clamp(48px,5.5vw,84px)),var(--hero-name-fit,9999px)),var(--sf-heading-max,9999px))] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[0.92] tracking-[-0.035em]",style:{"--hero-name-fit":dt(i.heading)},children:(()=>{const e=i.heading.lastIndexOf(" ");if(e===-1)return i.heading;const o=i.heading.slice(0,e),u=i.heading.slice(e+1);return n(b,{children:[o," ",n("em",{className:"font-normal italic text-accent",children:[u,"."]})]})})()})]}),c!=="belowSpecs"&&T&&z,ge,G.map(e=>a(ee,{row:e,onPick:P},e.key)),E&&i.preOrder?n(b,{children:[c==="belowSpecs"&&T&&z,i.preOrder]}):n(b,{children:[A,q.map(e=>a(ee,{row:e,onPick:P},e.key)),ae&&a(pt,{facts:fe}),(m.packs.length>0||g&&(m.extra||m.spareCounts.length>0))&&n("div",{className:"border-b border-line pb-[26px]",children:[m.packs.length>0&&n(b,{children:[a("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:"How many"}),a("div",{className:"flex flex-wrap gap-1.5",children:m.packs.map(e=>n("button",{type:"button",onClick:()=>N(o=>({...o,unit:e.value})),"aria-pressed":h.unit===e.value,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",h.unit===e.value?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:h.unit===e.value?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[h.unit===e.value&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:e.label})]},e.value))})]}),g&&m.extra&&n("label",{className:`${m.packs.length>0?"mt-3.5 ":""}flex cursor-pointer items-center gap-3 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.16em] text-fg`,children:[a("input",{type:"checkbox",checked:h.spares>0,onChange:e=>N(o=>({...o,spares:e.target.checked?Ye:0})),className:"h-4 w-4 cursor-pointer accent-[var(--accent)]"}),m.extra.label]}),g&&m.spareCounts.length>0&&n(b,{children:[a("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:Ie.howMany}),a("div",{className:"flex flex-col gap-1.5 sm:flex-row sm:flex-wrap",children:m.spareCounts.map(e=>{const o=e.value-Qe,u=h.spares===o;return n("button",{type:"button",onClick:()=>N(ke=>({...ke,spares:o})),"aria-pressed":u,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",u?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:u?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[u&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),n("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:[e.value," · ",e.label]})]},e.value)})})]}),g&&m.spareSide&&n(b,{children:[a("div",{className:"mb-3.5 mt-[26px] font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:m.spareSide.label}),a("div",{className:"flex flex-wrap gap-1.5",children:m.spareSide.options.map(e=>{const o=h.spareSide===e.value;return n("button",{type:"button",onClick:()=>N(u=>({...u,spareSide:e.value})),"aria-pressed":o,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",o?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:o?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[o&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:e.label})]},e.value)})})]})]}),c==="belowSpecs"&&T&&z,n("div",{className:ye,children:[g&&!(C&&!f.priced)&&a(Ee,{value:D,onChange:de,size:"large"}),!g||C&&!f.priced?a(Te,{className:"flex-1 cursor-pointer bg-btn px-6 py-4 text-center font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-btn-ink transition-colors hover:bg-fg"}):f.priced?B?a("button",{type:"button",disabled:!0,"aria-disabled":!0,className:"flex-1 cursor-not-allowed border-2 border-dashed border-fg-dim/20 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-fg-dim/40",children:Pe.outOfStock}):n("button",{type:"button",[qe]:"",onClick:()=>{if(!S){_(!0),window.setTimeout(()=>_(!1),ot);return}if(_(!1),s)return;const e=$e(t,x,ce,{choice:h,qty:D},{fitmentLabel:F?i.specCaption:R.appliedName?`For ${R.appliedName}`:"",fitmentKey:F?`manual|${i.specCaption}`:`vehicle|${it(R.applied?.vehicle)}`});e&&xe(e)},"aria-disabled":!S,className:["flex-1 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] transition-colors",S?"cursor-pointer bg-btn text-btn-ink hover:bg-fg hover:text-bg":"cursor-pointer border-2 border-dashed border-accent/50 text-accent/80 hover:border-accent hover:text-accent"].join(" "),style:S?void 0:{background:"color-mix(in oklab, var(--accent) 6%, transparent)"},children:["Add to Cart",f.setTotal!=null?` · ${J(U,k)}`:""]}):a("button",{type:"button",disabled:!0,"aria-disabled":!0,className:"flex-1 cursor-not-allowed border-2 border-dashed border-fg-dim/20 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-fg-dim/40",children:Xe}),a(ut,{slug:t.slug,name:t.name})]}),B&&x&&a(ft,{partNumbers:x.components.map(e=>e.partNumber),productSlug:t.slug},x.id),ue&&(()=>{const e=ve.filter(u=>u.chosen===null).map(u=>ie(u.prompt).replace(/^Select\s+/i,""));if(A&&i.vehicleAnswersSpecs&&!r.fitmentSet&&e.push("vehicle fitment"),e.length===0)return null;const o=e.length===1?e[0]:e.length===2?`${e[0]} and ${e[1]}`:`${e.slice(0,-1).join(", ")}, and ${e.at(-1)}`;return n("p",{role:"alert",className:"-mt-1 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.18em]",style:{color:"var(--alert)"},children:["Please select ",o," first."]})})()]}),le]})]})]})}function pt({facts:t}){const r=I();return t.length===0?null:a("div",{className:"border-b border-line pb-[26px]",children:a("dl",{className:"flex flex-col gap-2",children:t.map(d=>n("div",{className:"flex flex-wrap items-baseline gap-x-2 font-mono text-[length:var(--size-label,13px)] uppercase tracking-[0.22em]",children:[n("dt",{className:"text-fg-dim",children:[r(d.label)," ·"]}),a("dd",{className:"font-semibold text-fg",children:d.value.label})]},d.key))})})}function ee({row:t,onPick:r}){const d=I();if(t.values.length===0&&!t.empty)return null;const s=t.values.find(l=>l.value===t.chosen),c=s&&[s.label,s.note].filter(Boolean).join(" · ");return n("div",{className:"border-b border-line pb-[26px]",[je]:t.key,children:[n("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:[d(t.label)," · ",a("span",{className:"text-accent",children:c??d(t.prompt)})]}),t.values.length===0?n("p",{className:"font-mono text-[length:var(--size-body,12px)] leading-relaxed tracking-[0.1em] text-fg-dim",children:[t.empty.text," ",a(Q,{href:t.empty.href,className:"text-accent hover:underline",children:t.empty.linkText})]}):t.display==="swatch"?a("div",{className:"flex flex-wrap gap-2",children:t.values.map(l=>{const p=l.value===t.chosen;return n("button",{type:"button",onClick:()=>r(t.key,l.value),"aria-pressed":p,className:["relative flex max-w-full items-center gap-3 border-2 px-3 py-3 text-left transition-colors",p?"border-accent outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 hover:border-accent"].join(" "),style:p?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[p&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block h-5 w-5 shrink-0 rounded-full border border-fg-dim",style:{background:l.swatch}}),a("span",{className:"block min-w-0 break-words font-mono text-[length:var(--size-label,12px)] font-bold uppercase tracking-[0.18em] text-fg",children:l.label})]},l.value)})}):a("div",{className:"flex flex-wrap gap-1.5",children:t.values.map(l=>{const p=l.value===t.chosen;return n("button",{type:"button",onClick:()=>r(t.key,l.value),"aria-pressed":p,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",p?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:p?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[p&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:l.label}),l.note&&a("span",{className:"mt-1 block text-[length:var(--size-label,11px)] tracking-[0.12em] text-fg-dim",children:l.note})]},l.value)})})]})}function ut({slug:t,name:r}){const{has:d,toggle:s}=Oe(),c=d(t);return a("button",{type:"button",title:c?"Saved":"Save","aria-label":c?`Remove ${r} from wishlist`:`Save ${r} to wishlist`,"aria-pressed":c,onClick:()=>s(t),className:["h-12 w-12 cursor-pointer border-2 bg-transparent transition-colors",c?"border-accent text-accent":"border-fg-dim/50 text-fg hover:border-accent hover:text-accent"].join(" "),children:c?"♥":"♡"})}function ft({partNumbers:t,productSlug:r}){const[d,s]=Se(""),{status:c,submit:l,reset:p}=ze();function w(){l({partNumbers:t,email:d,productSlug:r})}return c==="sent"?a("p",{className:"-mt-1 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.18em] text-accent",children:"We'll email you when it's back."}):a(Re,{className:"-mt-1",email:d,onEmailChange:s,status:c,onResetVerdict:p,onSubmit:w,inputAriaLabel:"Email for the back-in-stock alert",submitLabel:"Notify me when back",buttonClassName:"cursor-pointer whitespace-nowrap border-2 border-btn px-4 font-mono text-[length:var(--size-label,11px)] font-bold uppercase tracking-[0.22em] text-btn transition-colors hover:bg-btn hover:text-btn-ink disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent disabled:hover:text-btn",errorMessage:"Couldn't save that — please try again."})}export{mt as default};
|
|
1
|
+
"use client";import{jsx as a,Fragment as h,jsxs as n}from"react/jsx-runtime";import Q from"next/link";import{BUY_ROW_CLASS as Se}from"./buy-row.js";import{useEffect as J,useRef as we,useState as Te}from"react";import{useCart as Re}from"./CartContext.js";import{useSiteTakesOrders as Ee}from"./SiteRecordContext.js";import _e from"./EmailCaptureForm.js";import{useEnglish as I}from"./EnglishVariant.js";import Ce from"./QuantityStepper.js";import{MarkedLabel as $,heroView as Le}from"./product-hero/hero-view.js";import Ae from"./ProductGallery.js";import{useRootIsDark as Oe}from"efficient-shell/theme";import{useWishlist as Ie}from"./WishlistContext.js";import{useStockAlertSignup as $e}from"./useStockAlertSignup.js";import{SPARE_WORDS as ze,productCartLine as je}from"../lib/catalog/purchase.js";import{OPTION_ROW_ATTR as Me}from"../lib/catalog/store-product.js";import{resolvingRowsAnswered as Pe}from"../lib/catalog/product-options.js";import{trackViewItem as Fe}from"../lib/google-tag.js";import{DEFAULT_HERO_LAYOUT as De,DEFAULT_HERO_RATIO as He,DEFAULT_HERO_TEXT_ALIGN as Be,parseHeroLayout as Ue,parseHeroRatio as Ve,parseHeroTextAlign as We}from"../lib/sections/hero-arrangement.js";import{DEFAULT_HERO_GALLERY_MODE as Ge,DEFAULT_HERO_IMAGE_FIT as qe}from"../lib/sections/hero-gallery.js";import{MAX_SPARES as Ye,UNITS_PER_SET as Ke,formatPrice as Z}from"../lib/commerce.js";import{formatSelectionPrice as Xe,setPriceLabel as Qe}from"../lib/wheels/price-display.js";import{productIsDually as Je,productIsTwoObjects as Ze,setSuppressesRow as et}from"../lib/wheels/set-mode.js";import{CONTENT_CAP_GUTTER as ee}from"../lib/sections/content-cap-gutter.js";import{CardTemplateRows as tt}from"efficient-web-builder/render/components/CardRowContext";import at from"./card-pieces/CardPrice.js";import nt from"./card-pieces/CardBuyButton.js";import{HeroStateProvider as te}from"./card-pieces/ProductCardState.js";const rt=4e3;function lt(t){return t?[t.year,t.make,t.model,t.modification].join("-"):""}const st=[{}],it=.72;function ot(t){const r=t.trim().split(/\s+/).filter(Boolean);if(r.length===0)return;const m=r.map((o,c)=>o.length+(r.length>1&&c===r.length-1?1:0));return`calc(100cqi / ${(Math.max(...m)*it).toFixed(2)})`}function ct({product:t,selection:r,onLightbox:m,editing:o=!1,pricePlacement:c="top",showVehicleFitment:l=!0,heroLayout:p=De,imageRatio:S=He,textAlign:ne=Be,showSpecTable:re=!0,showPriceQuote:w=!0,galleryMode:le=Ge,imageFit:se=qe,trustBullets:ie,nodeId:oe,priceTemplate:z}){const ce=I(),v=Ue(p),j=We(ne),y=Ve(S),me=v==="imageRight"?`${100-y}fr ${y}fr`:`${y}fr ${100-y}fr`,{picked:de,pick:M,qty:P,setQty:pe,choice:b,setChoice:N,angleIdx:ue,setAngleIdx:fe,showValidation:he,setShowValidation:T,manualMode:F,vehicle:R,rows:D,facts:be,part:g,outOfStock:H,offer:d,preOrder:E,canAddToCart:B,currency:k,price:f,set:U,msrpLabel:ge}=r,i=Le(t,r,o),_=Je(t),xe=Ze(t),C=l?i.vehicle:null,ve=l?i.vehicleMemory:null,L=!Oe({whenUnset:!0}),{warmCatalog:V}=Re(),x=Ee();J(()=>{!o&&x&&V(t.kind)},[o,x,t.kind,V]);const W=D.filter(e=>!E||e.values.length>0),G=W.filter(e=>e.role==="resolves"),A=W.filter(e=>e.role==="describes"&&!et(xe,e.key)),q=A.findIndex(e=>e.chosen===null),Y=(!C||!i.vehicleAnswersSpecs||r.fitmentSet)&&Pe(D,E)?q===-1?A:A.slice(0,q+1):[],ke=[...G,...Y];function ye(){return B?(T(!1),o?null:je(t,g,de,{choice:b,qty:P},{fitmentLabel:F?i.specCaption:R.appliedName?`For ${R.appliedName}`:"",fitmentKey:F?`manual|${i.specCaption}`:`vehicle|${lt(R.applied?.vehicle)}`})):(T(!0),window.setTimeout(()=>T(!1),rt),null)}const K={kind:"hero",msrpLabel:ge||null,amount:_?Qe(f,k):Xe(f,k),unitLabel:f.priced?i.unitLabel:null,packBadge:f.setTotal!=null?`${d.quantityLabel}: ${Z(U,k)}`:null,buy:{isSet:_,priced:f.priced,outOfStock:H,canAdd:B,totalLabel:f.setTotal!=null?Z(U,k):null,lineToAdd:ye}},O=a(te,{value:K,children:z?a(tt,{ownerId:oe??"",ownerType:"ProductHero",Template:z,rows:st,fallback:null,children:e=>e}):a(at,{})}),X=we(null);return J(()=>{o||X.current===t.slug||(X.current=t.slug,Fe({itemId:g?`${t.slug}|${g.id}`:t.slug,itemName:t.name,variant:i.metaValue,pricePerSet:f.setTotal??f.fromSetTotal??0,currency:k}))},[o,t.slug,t.name,i.metaValue,g,f,k]),n(h,{children:[a("nav",{className:`border-b border-line ${ee} pt-4 pb-4 font-mono text-[length:var(--size-label,13px)] uppercase tracking-[0.2em] text-fg-dim max-view-tablet:px-[min(20px,var(--sf-site-gutter,40px))]`,style:L?void 0:{background:"var(--section-bg)"},children:t.crumbs.map((e,s)=>n("span",{children:[s>0&&n(h,{children:[a("span",{className:"mx-3 text-accent",children:"/"}),a("wbr",{})]}),e.href?a(Q,{href:e.href,className:"hover:text-fg",children:a($,{text:e.label})}):a("span",{className:"text-fg",children:a($,{text:e.label})})]},`${e.label}-${s}`))}),n("section",{"data-hero-layout":v,"data-hero-align":j,className:[`grid gap-10 ${ee} py-14 max-view-tablet:px-[min(20px,var(--sf-site-gutter,40px))] max-view-tablet:py-8`,v==="stacked"?"grid-cols-1":"[grid-template-columns:var(--hero-cols)] max-view-desktop:[grid-template-columns:minmax(0,1fr)]"].join(" "),style:{...L?{}:{background:"var(--section-bg)"},...v==="stacked"?{}:{"--hero-cols":me}},children:[a(Ae,{product:t,view:i,angleIdx:ue,onSelect:fe,isLight:L,onLightbox:m,galleryMode:le,imageFit:se,style:v==="imageRight"?{order:2}:void 0}),n("div",{className:["flex flex-col gap-7",j==="center"?"items-center text-center":""].filter(Boolean).join(" "),style:v==="imageRight"?{order:1}:void 0,children:[n("div",{className:"w-full [container-type:inline-size]",children:[n("div",{className:"mb-2.5 flex items-center gap-2.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.2em] text-accent",children:[a("span",{children:a($,{text:t.eyebrow})}),t.badge&&n(h,{children:[a("span",{children:"·"}),a("span",{children:t.badge})]})]}),a("h1",{className:"font-heading2 text-[length:min(min(var(--size-headingMedium,clamp(48px,5.5vw,84px)),var(--hero-name-fit,9999px)),var(--sf-heading-max,9999px))] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[0.92] tracking-[-0.035em]",style:{"--hero-name-fit":ot(i.heading)},children:(()=>{const e=i.heading.lastIndexOf(" ");if(e===-1)return i.heading;const s=i.heading.slice(0,e),u=i.heading.slice(e+1);return n(h,{children:[s," ",n("em",{className:"font-normal italic text-accent",children:[u,"."]})]})})()})]}),c!=="belowSpecs"&&w&&O,ve,G.map(e=>a(ae,{row:e,onPick:M},e.key)),E&&i.preOrder?n(h,{children:[c==="belowSpecs"&&w&&O,i.preOrder]}):n(h,{children:[C,Y.map(e=>a(ae,{row:e,onPick:M},e.key)),re&&a(mt,{facts:be}),(d.packs.length>0||x&&(d.extra||d.spareCounts.length>0))&&n("div",{className:"border-b border-line pb-[26px]",children:[d.packs.length>0&&n(h,{children:[a("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:"How many"}),a("div",{className:"flex flex-wrap gap-1.5",children:d.packs.map(e=>n("button",{type:"button",onClick:()=>N(s=>({...s,unit:e.value})),"aria-pressed":b.unit===e.value,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",b.unit===e.value?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:b.unit===e.value?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[b.unit===e.value&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:e.label})]},e.value))})]}),x&&d.extra&&n("label",{className:`${d.packs.length>0?"mt-3.5 ":""}flex cursor-pointer items-center gap-3 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.16em] text-fg`,children:[a("input",{type:"checkbox",checked:b.spares>0,onChange:e=>N(s=>({...s,spares:e.target.checked?Ye:0})),className:"h-4 w-4 cursor-pointer accent-[var(--accent)]"}),d.extra.label]}),x&&d.spareCounts.length>0&&n(h,{children:[a("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:ze.howMany}),a("div",{className:"flex flex-col gap-1.5 sm:flex-row sm:flex-wrap",children:d.spareCounts.map(e=>{const s=e.value-Ke,u=b.spares===s;return n("button",{type:"button",onClick:()=>N(Ne=>({...Ne,spares:s})),"aria-pressed":u,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",u?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:u?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[u&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),n("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:[e.value," · ",e.label]})]},e.value)})})]}),x&&d.spareSide&&n(h,{children:[a("div",{className:"mb-3.5 mt-[26px] font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:d.spareSide.label}),a("div",{className:"flex flex-wrap gap-1.5",children:d.spareSide.options.map(e=>{const s=b.spareSide===e.value;return n("button",{type:"button",onClick:()=>N(u=>({...u,spareSide:e.value})),"aria-pressed":s,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",s?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:s?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[s&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:e.label})]},e.value)})})]})]}),c==="belowSpecs"&&w&&O,n("div",{className:Se,children:[x&&!(_&&!f.priced)&&a(Ce,{value:P,onChange:pe,size:"large"}),a(te,{value:K,children:a(nt,{})}),a(dt,{slug:t.slug,name:t.name})]}),H&&g&&a(pt,{partNumbers:g.components.map(e=>e.partNumber),productSlug:t.slug},g.id),he&&(()=>{const e=ke.filter(u=>u.chosen===null).map(u=>ce(u.prompt).replace(/^Select\s+/i,""));if(C&&i.vehicleAnswersSpecs&&!r.fitmentSet&&e.push("vehicle fitment"),e.length===0)return null;const s=e.length===1?e[0]:e.length===2?`${e[0]} and ${e[1]}`:`${e.slice(0,-1).join(", ")}, and ${e.at(-1)}`;return n("p",{role:"alert",className:"-mt-1 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.18em]",style:{color:"var(--alert)"},children:["Please select ",s," first."]})})()]}),ie]})]})]})}function mt({facts:t}){const r=I();return t.length===0?null:a("div",{className:"border-b border-line pb-[26px]",children:a("dl",{className:"flex flex-col gap-2",children:t.map(m=>n("div",{className:"flex flex-wrap items-baseline gap-x-2 font-mono text-[length:var(--size-label,13px)] uppercase tracking-[0.22em]",children:[n("dt",{className:"text-fg-dim",children:[r(m.label)," ·"]}),a("dd",{className:"font-semibold text-fg",children:m.value.label})]},m.key))})})}function ae({row:t,onPick:r}){const m=I();if(t.values.length===0&&!t.empty)return null;const o=t.values.find(l=>l.value===t.chosen),c=o&&[o.label,o.note].filter(Boolean).join(" · ");return n("div",{className:"border-b border-line pb-[26px]",[Me]:t.key,children:[n("div",{className:"mb-3.5 font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:[m(t.label)," · ",a("span",{className:"text-accent",children:c??m(t.prompt)})]}),t.values.length===0?n("p",{className:"font-mono text-[length:var(--size-body,12px)] leading-relaxed tracking-[0.1em] text-fg-dim",children:[t.empty.text," ",a(Q,{href:t.empty.href,className:"text-accent hover:underline",children:t.empty.linkText})]}):t.display==="swatch"?a("div",{className:"flex flex-wrap gap-2",children:t.values.map(l=>{const p=l.value===t.chosen;return n("button",{type:"button",onClick:()=>r(t.key,l.value),"aria-pressed":p,className:["relative flex max-w-full items-center gap-3 border-2 px-3 py-3 text-left transition-colors",p?"border-accent outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 hover:border-accent"].join(" "),style:p?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[p&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block h-5 w-5 shrink-0 rounded-full border border-fg-dim",style:{background:l.swatch}}),a("span",{className:"block min-w-0 break-words font-mono text-[length:var(--size-label,12px)] font-bold uppercase tracking-[0.18em] text-fg",children:l.label})]},l.value)})}):a("div",{className:"flex flex-wrap gap-1.5",children:t.values.map(l=>{const p=l.value===t.chosen;return n("button",{type:"button",onClick:()=>r(t.key,l.value),"aria-pressed":p,className:["relative cursor-pointer border-2 px-4 py-3 text-left font-mono uppercase transition-colors",p?"border-accent text-fg outline outline-1 outline-accent -outline-offset-1":"border-fg-dim/50 text-fg hover:border-accent"].join(" "),style:p?{background:"color-mix(in oklab, var(--accent) 14%, transparent)"}:void 0,children:[p&&a("span",{"aria-hidden":!0,className:"absolute inset-y-0 left-0 w-[3px] bg-accent"}),a("span",{className:"block text-[length:var(--size-label,14px)] tracking-[0.18em]",children:l.label}),l.note&&a("span",{className:"mt-1 block text-[length:var(--size-label,11px)] tracking-[0.12em] text-fg-dim",children:l.note})]},l.value)})})]})}function dt({slug:t,name:r}){const{has:m,toggle:o}=Ie(),c=m(t);return a("button",{type:"button",title:c?"Saved":"Save","aria-label":c?`Remove ${r} from wishlist`:`Save ${r} to wishlist`,"aria-pressed":c,onClick:()=>o(t),className:["h-12 w-12 cursor-pointer border-2 bg-transparent transition-colors",c?"border-accent text-accent":"border-fg-dim/50 text-fg hover:border-accent hover:text-accent"].join(" "),children:c?"♥":"♡"})}function pt({partNumbers:t,productSlug:r}){const[m,o]=Te(""),{status:c,submit:l,reset:p}=$e();function S(){l({partNumbers:t,email:m,productSlug:r})}return c==="sent"?a("p",{className:"-mt-1 font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.18em] text-accent",children:"We'll email you when it's back."}):a(_e,{className:"-mt-1",email:m,onEmailChange:o,status:c,onResetVerdict:p,onSubmit:S,inputAriaLabel:"Email for the back-in-stock alert",submitLabel:"Notify me when back",buttonClassName:"cursor-pointer whitespace-nowrap border-2 border-btn px-4 font-mono text-[length:var(--size-label,11px)] font-bold uppercase tracking-[0.22em] text-btn transition-colors hover:bg-btn hover:text-btn-ink disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent disabled:hover:text-btn",errorMessage:"Couldn't save that — please try again."})}export{ct as default};
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { WheelSummary } from "../lib/api/index.js";
|
|
2
|
+
import { type CatalogFilterState } from "../lib/wheels/catalog-filters.js";
|
|
3
|
+
import type { VehicleFitment } from "../lib/wheels/plp-fitment-match.js";
|
|
4
|
+
import type { Currency } from "../lib/wheels/wheels.js";
|
|
5
|
+
export declare function handPickedMatchesBar(wheel: WheelSummary, pickedFinish: string | undefined, filters: CatalogFilterState, currency: Currency, fit: VehicleFitment | null): boolean;
|
|
2
6
|
export declare function wheelForCode(pool: readonly WheelSummary[], code: string): WheelSummary | undefined;
|
|
3
|
-
export declare function SectionWheelsProvider({ wheels, children, }: {
|
|
7
|
+
export declare function SectionWheelsProvider({ wheels, currency, children, }: {
|
|
4
8
|
wheels: WheelSummary[] | undefined;
|
|
9
|
+
currency?: Currency;
|
|
5
10
|
children: React.ReactNode;
|
|
6
11
|
}): import("react").JSX.Element;
|
|
7
|
-
export declare function ProductCatalogProvider({ children }: {
|
|
12
|
+
export declare function ProductCatalogProvider({ currency, children }: {
|
|
13
|
+
currency?: Currency;
|
|
8
14
|
children: React.ReactNode;
|
|
9
15
|
}): import("react").JSX.Element;
|
|
10
16
|
interface Props {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as d}from"react/jsx-runtime";import{createContext as P,useContext as b,useEffect as p,useId as B,useMemo as v,useState as x}from"react";import{GridCards as k}from"./GridCardTemplate.js";import{useCatalogFilter as z}from"./catalog/CatalogFilterContext.js";import{loadProductCatalog as F}from"./useProductCatalog.js";import{itemKind as h}from"../lib/catalog/plp-item.js";import{applyCatalogFilters as S}from"../lib/wheels/catalog-filters.js";import{finishFamiliesOf as j}from"../lib/wheels/finish-defaults.js";import{lugCountsOf as L}from"../lib/wheels/lug-count.js";import{diametersOf as N}from"../lib/wheels/size-range.js";import{say as C}from"efficient-web-builder/format/lib/editor-words";const g=P({wheels:[],loading:!1,live:!1,obeysBar:!1,currency:""});function O(e,r,t,n,a){return h(e)==="tyre"?!0:S([y(e,r)],{...t,process:null},n,a).length>0}function y(e,r){const t=r?e.finishes?.find(n=>n.name===r):void 0;return t?{...e,finishes:[t]}:e}function M(e,r){return e.find(t=>t.designCode===r)??e.find(t=>t.slug===r)}function Q({wheels:e,currency:r="",children:t}){return d(g.Provider,{value:{wheels:e??[],loading:!1,live:!0,obeysBar:!0,currency:r},children:t})}function T({currency:e="",children:r}){const[t,n]=x([]),[a,i]=x(!0);return p(()=>{let o=!1;return F().then(l=>{o||(n(l),i(!1))}).catch(()=>{o||i(!1)}),()=>{o=!0}},[]),d(g.Provider,{value:{wheels:t,loading:a,live:!1,obeysBar:!0,currency:e},children:r})}function W({code:e,finish:r,wheel:t}){const{wheels:n,loading:a,live:i,obeysBar:o,currency:l}=b(g),u=t??(e?M(n,e):void 0),s=$(o?u:void 0,r,l);if(u){const c=d(k,{wheels:[u],finishes:[r],children:f=>f},`${u.slug}:${r??""}`);return s?c:i?null:d("div",{"data-bar-hidden":"",className:"opacity-40",children:c})}return i?null:d("div",{className:"sf-card flex aspect-square w-full items-center justify-center bg-surface-2 p-4 text-center",children:d("span",{className:"font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.2em] text-fg-dim",children:a?C("Loading…"):e||C("Set a design code")})})}function $(e,r,t){const{filters:n,vehicle:a,reportCount:i,reportSizes:o,reportLugs:l,reportFinishes:u}=z(),s=B(),c=v(()=>!e||O(e,r,n,t,a.fit),[e,r,n,t,a.fit]);p(()=>{if(e)return i(s,c?1:0),()=>i(s,0)},[e,c,i,s]);const f=v(()=>{if(!e||h(e)==="tyre")return null;const m=y(e,r);return{sizes:N([m]),lugs:L([m]),finishes:j([m])}},[e,r]);return p(()=>{if(f)return o(s,f.sizes),l(s,f.lugs),u(s,f.finishes),()=>{o(s,[]),l(s,[]),u(s,[])}},[f,o,l,u,s]),c}export{T as ProductCatalogProvider,Q as SectionWheelsProvider,W as default,O as handPickedMatchesBar,M as wheelForCode};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { CSSProperties, ReactNode } from "react";
|
|
1
|
+
import type { CSSProperties, ReactNode, Ref } from "react";
|
|
2
2
|
export { BAND_CAP } from "../lib/sections/section-band.js";
|
|
3
|
-
export default function SectionBand({ className, capped, column, style, defaults, id, attrs, inAnyBox, children, }: {
|
|
3
|
+
export default function SectionBand({ className, capped, column, style, defaults, id, attrs, rootRef, inAnyBox, children, }: {
|
|
4
4
|
className: string;
|
|
5
5
|
capped?: boolean;
|
|
6
6
|
column?: string | null;
|
|
@@ -8,6 +8,7 @@ export default function SectionBand({ className, capped, column, style, defaults
|
|
|
8
8
|
defaults?: CSSProperties;
|
|
9
9
|
id?: string;
|
|
10
10
|
attrs?: Record<string, string>;
|
|
11
|
+
rootRef?: Ref<HTMLElement>;
|
|
11
12
|
inAnyBox?: boolean;
|
|
12
13
|
children?: ReactNode;
|
|
13
14
|
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o}from"react/jsx-runtime";import{EDITORIAL_COLUMN as
|
|
1
|
+
import{jsx as o}from"react/jsx-runtime";import{EDITORIAL_COLUMN as C}from"efficient-web-builder/format/lib/content/page-width";import{BAND_CAP as N,bandClassesInBox as f}from"../lib/sections/section-band.js";import _ from"./SectionBandChoice.js";import{BAND_CAP as y}from"../lib/sections/section-band.js";function u({className:t,capped:p=!1,column:n=C,style:i,defaults:s,id:a,attrs:r,rootRef:c,inAnyBox:l=!1,children:e}){const m=f(t),d=n===null?"":f(n),x=o("section",{ref:c,...r,className:m||void 0,style:i,id:a,children:d?o("div",{className:d,children:e}):e}),B=s?{...s,...i}:i,A=o("section",{ref:c,...r,className:p?`${N} ${t}`:t,style:B,id:a,children:n===null?e:o("div",{className:n,children:e})});return o(_,{inBox:x,atTop:A,anyBox:l})}export{y as BAND_CAP,u as default};
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
import { type CartLine } from "../CartContext.js";
|
|
2
|
+
import { type HeroBuyState } from "./ProductCardState.js";
|
|
1
3
|
export declare const CARD_PAGE_WORDS = "View sizes & fitment";
|
|
2
4
|
export interface CardBuyButtonSettings {
|
|
3
5
|
buy?: boolean;
|
|
4
6
|
page?: boolean;
|
|
5
7
|
}
|
|
6
|
-
export
|
|
8
|
+
export declare function HeroBuyButton({ buy, takesOrders, add, }: {
|
|
9
|
+
buy: HeroBuyState;
|
|
10
|
+
takesOrders: boolean;
|
|
11
|
+
add: (line: CartLine) => void;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
export default function CardBuyButton({ buy, page }: CardBuyButtonSettings): import("react").JSX.Element | null;
|
|
7
14
|
export declare function CardBuyDialog(): import("react").JSX.Element | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as n,jsxs as b}from"react/jsx-runtime";import D from"next/link";import{useEffect as h}from"react";import{useCart as A}from"../CartContext.js";import g from"../QuoteLink.js";import{useSiteTakesOrders as k}from"../SiteRecordContext.js";import E from"../wheels-plp/PlpNotifyMeDialog.js";import{DEFAULT_PURCHASE_STATE as _}from"../../lib/catalog/purchase.js";import{ADD_TO_BASKET_ATTR as x}from"../../lib/commerce.js";import{STOCK_WORDS as R}from"../../lib/content/stock-words.js";import{tyreCartLine as B}from"../../lib/tyres/tyre-purchase.js";import{UNPRICED_LABEL as L,priceIn as w,resolveWheelPrice as z}from"../../lib/wheels/price-display.js";import{isOneWheelDesign as $,setLabel as P}from"../../lib/wheels/variants.js";import{splitWheelName as H}from"../../lib/wheels/wheel-name.js";import{CARD_TEXT_SIZE as C,CardButtonRow as S}from"./card-row.js";import{useHeroStateOrNull as W,useProductCardStateOrNull as j,useWheelCardState as q}from"./ProductCardState.js";const O="mt-3 flex flex-col gap-2",u=`cursor-pointer bg-btn px-4 py-3 font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-btn-ink transition-colors hover:bg-fg`,F=`border border-btn px-4 py-3 text-center font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-btn transition-colors hover:bg-btn hover:text-btn-ink`,I="View sizes & fitment",V="mt-3 block font-mono text-[length:var(--size-label,11px)] font-bold uppercase tracking-[0.18em] text-accent underline-offset-4 group-hover:underline";function G({wheel:e,sel:t,price:o,editing:r}){const{addAndOpen:i,warmCatalog:s}=A();h(()=>{r||s()},[r,s]);const{arm:c}=t;h(()=>{c()},[c]);function d(){const a=t.selectedVariant;!a||!t.canAdd||o.priced&&(r||i({id:`${e.slug}|${a.finishName}|${a.size}|quick`,slug:e.slug,name:H(e.name),process:e.process,positionNo:"01",config:[{label:a.size},{label:a.finishName,gold:!0},{label:P(a)}],finishName:a.finishName,size:a.size,components:a.components,qty:1}))}return n("button",{type:"button",onClick:d,[x]:"",disabled:!t.canAdd,className:t.canAdd?u:`${u} opacity-80`,children:"Add to basket"})}function K(e,t,o){return $(e)?t.outOfStock?"notify":t.unsellable||!o||t.detailState==="ready"&&!t.canAdd?"choose":"add":"choose"}function U({state:e,buy:t,page:o}){const{wheel:r,sel:i,price:s,editing:c,setNotifyOpen:d}=e,a=k(),l=K(r,i,s.priced),f=t?l==="notify"?n("button",{type:"button",onClick:()=>d(!0),className:u,children:"Notify me when back"}):l==="add"?a?n(G,{wheel:r,sel:i,price:s,editing:c}):n(g,{className:u}):null:null,p=!o||f?null:b("span",{"aria-hidden":!0,className:V,children:[I," →"]});return n(S,{children:f||p?b("div",{className:O,children:[f,p]}):null})}function M({state:e}){const{tyre:t,currency:o,pagePath:r,detail:i,variant:s,canAdd:c,detailReady:d,unsellable:a,editing:l}=e,{addAndOpen:f,warmCatalog:p}=A(),m=k();h(()=>{!l&&m&&p("tyre")},[l,m,p]);const y=z(w(t.prices,o),null).priced;function v(){!i||!s||!c||l||f(B(i,s,_.choice,_.qty))}return n(S,{children:b("div",{className:O,children:[!a&&y&&!m&&n(g,{className:u}),!a&&y&&m&&n("button",{type:"button",onClick:v,[x]:"",disabled:d&&!c,className:c||!d?`${u}${c?"":" opacity-80"}`:`cursor-not-allowed border border-dashed border-accent/50 px-4 py-3 font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-accent/70`,children:d&&!c?"Select a size":"Add to basket"}),r&&n(D,{href:r,className:F,children:"Open product page"})]})})}const X="flex-1 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em]",Q="flex-1 cursor-not-allowed border-2 border-dashed border-fg-dim/20 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-fg-dim/40";function N(e,t){return!t||e.isSet&&!e.priced?"quote":e.priced?e.outOfStock?"outOfStock":"add":"unpriced"}function T({buy:e,takesOrders:t,add:o}){const r=N(e,t);return r==="quote"?n(g,{className:"flex-1 cursor-pointer bg-btn px-6 py-4 text-center font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-btn-ink transition-colors hover:bg-fg"}):r!=="add"?n("button",{type:"button",disabled:!0,"aria-disabled":!0,className:Q,children:r==="outOfStock"?R.outOfStock:L}):b("button",{type:"button",[x]:"",onClick:()=>{const i=e.lineToAdd();i&&o(i)},"aria-disabled":!e.canAdd,className:[`${X} transition-colors`,e.canAdd?"cursor-pointer bg-btn text-btn-ink hover:bg-fg hover:text-bg":"cursor-pointer border-2 border-dashed border-accent/50 text-accent/80 hover:border-accent hover:text-accent"].join(" "),style:e.canAdd?void 0:{background:"color-mix(in oklab, var(--accent) 6%, transparent)"},children:["Add to Cart",e.totalLabel!=null?` · ${e.totalLabel}`:""]})}const Y=()=>{};function Z({buy:e}){const{addAndOpen:t}=A();return n(T,{buy:e,takesOrders:!0,add:o=>t(o)})}function J({buy:e}){const t=k();return N(e,t)==="add"?n(Z,{buy:e}):n(T,{buy:e,takesOrders:t,add:Y})}function ee({buy:e=!0,page:t=!0}){const o=W(),r=j();if(o)return o.buy?n(J,{buy:o.buy}):null;if(!r)throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return r.kind==="bundle"?n(S,{}):r.kind==="tyre"?n(M,{state:r}):n(U,{state:r,buy:e,page:t})}function Ae(){const{wheel:e,sel:t,editing:o,notifyOpen:r,setNotifyOpen:i}=q();return r?n(E,{wheelName:e.name,productSlug:e.slug,finishName:t.confirmedFinishName,variants:t.outOfStockVariants,initialSize:t.selectedVariant?.size,onClose:()=>i(!1),editing:o}):null}export{I as CARD_PAGE_WORDS,Ae as CardBuyDialog,T as HeroBuyButton,ee as default};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { type CardTextRegion } from "./card-text-region.js";
|
|
3
|
-
export default function CardName({ children: name, region }: {
|
|
3
|
+
export default function CardName({ children: name, region, fixedHeight, }: {
|
|
4
4
|
children?: ReactNode;
|
|
5
5
|
region?: CardTextRegion;
|
|
6
|
+
fixedHeight?: boolean;
|
|
6
7
|
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as a}from"react/jsx-runtime";import{withRMark as m}from"efficient-web-builder/render/components/RMark";import{CARD_TEXT_SIZE as o,useCatalogCard as l}from"./card-row.js";import{useProductCardStateOrNull as s}from"./ProductCardState.js";import{RegionBridge as c,RegionWords as u,regionAttr as h}from"./card-text-region.js";function f({children:r,region:n,fixedHeight:d=!0}){const t=l(),e=s(),i=e?.kind==="wheel"?m(e.wheel.name):e?.kind==="bundle"?e.bundle.name:null;return r===void 0&&i===null&&process.env.NODE_ENV!=="production"&&console.warn("[CardName] no name given and no wheel card state: the name block is empty"),a(c,{region:n,sectionType:"ProductName",children:a("div",{...h(n,"name"),className:t&&!d?`font-heading3 ${o.headingSmall2} font-medium uppercase leading-none tracking-[-0.02em]`:t?`mt-2 h-[60px] overflow-hidden break-words [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[60px] font-heading3 ${o.headingSmall2} font-medium uppercase leading-none tracking-[-0.02em]`:`mt-2 font-heading3 ${o.headingSmall1} font-medium tracking-[-0.02em]`,children:a(u,{region:n,at:"name",children:r??i})})})}export{f as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as r,jsxs as c,Fragment as b}from"react/jsx-runtime";import{formatPrice as v}from"../../lib/commerce.js";import{say as P}from"efficient-web-builder/format/lib/editor-words";import{setLabel as k}from"../../lib/wheels/variants.js";import{wheelCardPriceLine as u}from"../../lib/wheels/set-mode.js";import{EACH_UNIT as S,formatSelectionPrice as L,formatSelectionWasPrice as N,formatWheelPrice as p,formatWheelWasPrice as w,FROM_PREFIX as f,priceIn as y,resolveWheelPrice as h,SET_QUOTE_LABEL as T}from"../../lib/wheels/price-display.js";import{CARD_TEXT_SIZE as m,CardRow as g}from"./card-row.js";import{RegionBridge as _,RegionWords as C,regionAttr as E}from"./card-text-region.js";import{useHeroStateOrNull as R,useProductCardState as W}from"./ProductCardState.js";function z(e,n){if(e.kind==="tyre"){const d=h(y(e.tyre.prices,e.currency),null);return{was:null,amount:p(d,e.currency,f),note:d.priced?S:null}}const{wheel:i,currency:t,price:o,sel:l,isSet:x}=e,a=h(i.prices[t],i.msrpPrices?.[t]),s=n.setTotal&&o.priced&&o.setTotal!=null&&l.selectedVariant?`${k(l.selectedVariant)} · ${v(o.setTotal,t)}`:null;return x&&n.quoteSets?{was:null,amount:a.priced?u(p(a,t,f),!0):T,note:s}:{was:n.wasFollowsSize?N(o,t):w(a,t),amount:u(L(o,t),o.priced),note:s}}function B({state:e,region:n}){const i=c("div",{className:"flex items-baseline gap-5 border-t border-line pt-[18px]",children:[e.msrpLabel&&r("div",{className:"font-mono text-[length:var(--size-label,15px)] text-fg-dim line-through",children:e.msrpLabel}),r("div",{className:"font-heading2 text-[length:min(var(--size-headingMedium,36px),var(--sf-heading-max,9999px))] font-bold leading-none tracking-[-0.01em] text-fg",...E(n,"price"),children:r(C,{region:n,at:"price",children:e.amount})}),e.unitLabel&&r("div",{className:"font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:e.unitLabel}),e.packBadge&&r("div",{className:"ml-auto border border-accent px-3 py-2 font-mono text-[length:var(--size-label,13px)] font-bold uppercase tracking-[0.18em] text-accent",style:{background:"color-mix(in oklab, var(--accent) 14%, transparent)"},children:e.packBadge})]});return r(_,{region:n,sectionType:"ProductPrice",children:i})}function F({show:e=!0,region:n,...i}){const t=R();return t?r(B,{state:t,region:n}):r(j,{show:e,...i})}function $({state:e,show:n}){return!n||e.bundle.inStock?null:r("div",{className:`mt-1 font-mono ${m.labelSmall} uppercase tracking-[0.24em] text-fg-dim`,children:P("Currently unavailable")})}function j({show:e=!0,...n}){const i=W();if(i.kind==="bundle")return r($,{state:i,show:e});const{was:t,amount:o,note:l}=z(i,n);return c(b,{children:[r(g,{children:e?c("div",{className:`mt-2 font-mono ${m.labelLarge}`,children:[t&&r("span",{className:"mr-2 text-fg-dim line-through",children:t}),o]}):null}),r(g,{children:e&&l?r("div",{className:`mt-[2px] font-mono ${m.labelSmall} tracking-[0.08em] text-fg-dim`,children:l}):null})]})}export{F as default};
|
|
@@ -3,5 +3,6 @@ export interface CardProductBadgeSettings {
|
|
|
3
3
|
sale?: boolean;
|
|
4
4
|
numbered?: boolean;
|
|
5
5
|
axleSets?: boolean;
|
|
6
|
+
edge?: boolean;
|
|
6
7
|
}
|
|
7
|
-
export default function CardProductBadge({ show, sale, numbered, axleSets, }: CardProductBadgeSettings): import("react").JSX.Element | null;
|
|
8
|
+
export default function CardProductBadge({ show, sale, numbered, axleSets, edge, }: CardProductBadgeSettings): import("react").JSX.Element | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as e,Fragment as
|
|
1
|
+
"use client";import{jsx as e,Fragment as A,jsxs as E}from"react/jsx-runtime";import{Fragment as b}from"react";import{CARD_TEXT_SIZE as g,useCatalogCard as C}from"./card-row.js";import{bundleSaving as B}from"../../lib/commerce.js";import{useProductCardState as D}from"./ProductCardState.js";const v=`border px-2 py-1 font-mono ${g.labelSmall} uppercase tracking-[0.3em]`,x="absolute right-[18px] top-[18px] z-10",N="absolute left-[18px] top-[18px] z-10",G="absolute left-0 top-4 z-10 pointer-events-none flex flex-col items-start gap-1",R="absolute left-0 top-[52px] z-10 pointer-events-none flex flex-col items-start gap-1",w=`bg-accent px-3 py-2 font-mono ${g.labelSmall} uppercase tracking-[0.24em] text-bg`;function r({tone:s,children:t}){return e("span",{className:[v,s==="solid"?"border-accent bg-accent text-bg":"border-accent text-accent"].join(" "),children:t})}function T({show:s=!0,sale:t=!1,numbered:l=!1,axleSets:_=!1,edge:p=!1}){const o=D();if(!C()||o.kind==="tyre")return null;if(o.kind==="bundle"){const n=B(o.bundle,o.currency);return n&&p?e(S,{flags:[n]}):n?e("div",{className:`${x} pointer-events-none flex flex-col items-end gap-1`,children:e(r,{tone:"solid",children:n})}):null}const{wheel:h,price:f,isSet:c}=o,i=c||_?o.setWords:null,a=s?h.badge:null,d=c?e(r,{tone:"solid",children:"Set"}):null,m=[l?d:null,t&&f.onSale?e(r,{tone:"solid",children:"Sale"}):null,i?e(r,{tone:"outline",children:i}):a?e(r,{tone:a==="new"?"solid":"outline",children:a==="new"?"New":"Bestseller"}):null].filter(Boolean);if(p){const n=[c?"Set":null,t&&f.onSale?"Sale":null,i??(a?a==="new"?"New":"Bestseller":null)].filter(u=>!!u);return n.length?e(S,{flags:n,numbered:l}):null}return E(A,{children:[d&&!l&&e("div",{className:`${N} pointer-events-none flex flex-col items-start gap-1`,children:d}),m.length>0&&e("div",{className:`${x} pointer-events-none flex flex-col items-end gap-1`,children:m.map((n,u)=>e(b,{children:n},u))})]})}function S({flags:s,numbered:t=!1}){return e("div",{className:t?R:G,children:s.map(l=>e("span",{className:w,children:l},l))})}export{T as default};
|
|
@@ -4,5 +4,10 @@ export interface CardProductPictureSettings {
|
|
|
4
4
|
coverIndex?: unknown;
|
|
5
5
|
indexBadge?: unknown;
|
|
6
6
|
showBadge?: unknown;
|
|
7
|
+
frame?: unknown;
|
|
8
|
+
setPicture?: unknown;
|
|
7
9
|
}
|
|
10
|
+
export declare const PICTURE_FRAMES: readonly ["well", "full"];
|
|
11
|
+
export type PictureFrame = (typeof PICTURE_FRAMES)[number];
|
|
12
|
+
export declare const DEFAULT_PICTURE_FRAME: PictureFrame;
|
|
8
13
|
export default function CardProductPicture(settings: CardProductPictureSettings): import("react").JSX.Element | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as e,jsxs as m,Fragment as x}from"react/jsx-runtime";import P from"next/image";import{useState as W}from"react";import{CARD_INDEX_BADGE_CLASS as $,CARD_INDEX_CLASS as j,parseCardIndexFormat as X}from"efficient-web-builder/format/lib/sections/product-card-style";import{CARD_IMAGE_BG_OFF as z,cardImageBackgroundPaints as H,resolveCardImageBackground as B}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as _}from"efficient-web-builder/format/lib/content/card-image-shape";import{sayCount as K}from"efficient-web-builder/format/lib/editor-words";import{parseSetPicture as Z,setSecondSrc as q}from"../../lib/wheels/set-mode.js";import{coverSrcForWheel as J,parseCoverIndex as Q,resolvePaintedSrc as V}from"../../lib/wheels/cover-rendering.js";import Y from"../WheelPlaceholder.js";import{cardSpinOf as ee}from"../card-spin.js";import{useGridCard as D}from"../GridCardTemplate.js";import R from"./CardPicture.js";import k from"./CardProductBadge.js";import{useHeldCardPicture as re}from"./useHeldCardPicture.js";import{useProductCardState as te}from"./ProductCardState.js";const Pe=["well","full"],ne="well",G=r=>r==="full"?"full":ne;function ae({children:r}){return e("div",{className:"h-full w-full transition-transform duration-500 motion-safe:group-hover:scale-[1.03]",children:r})}function L({fill:r,badge:a,children:o}){const c=H(r);return m("div",{className:`sf-card-image relative aspect-[4/3] overflow-hidden${c?"":" bg-surface"}`,style:c?{backgroundColor:r}:void 0,children:[o,a]})}function ie(r){const a=te();return a.kind==="bundle"?e(le,{state:a,...r}):a.kind!=="wheel"?null:e(se,{state:a,...r})}function le({state:r,imageBackground:a,cardImage:o,showBadge:c,frame:w}){const{bundle:l}=r,{imageSizes:g}=D(),f=G(w)==="full",s=l.components.length,t=l.image?f?e(P,{alt:l.name,src:l.image,fill:!0,sizes:g,className:"object-cover",draggable:!1}):e(P,{alt:l.name,src:l.image,width:1e3,height:1e3,sizes:g,className:"block h-full w-full object-cover",draggable:!1}):e("div",{className:"flex h-full w-full items-center justify-center font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.3em] text-fg-dim",children:K("{n} piece","{n} pieces",s,{})}),d=e(ae,{children:t}),p=B(a,z),u=c!==!1?e(k,{edge:f}):null;return e("div",{style:_(o),children:f?e(L,{fill:p,badge:u,children:d}):m(x,{children:[u,e(R,{image:d,imageBackgroundFill:p})]})})}function se({state:r,imageBackground:a,cardImage:o,coverIndex:c,indexBadge:w,showBadge:l,frame:g,setPicture:f}){const{wheel:s,sel:t,isSet:d}=r,{hover:p,imageSizes:u}=D(),C=ee(p),T=J(s,Q(c),t.finish?.name,t.shownSrc),[N,M]=W(()=>new Set),A=n=>{t.pictureFailed(n),M(h=>h.has(n)?h:new Set(h).add(n))},E=V({overrideSrc:T,hookSrc:t.shownSrc,failed:N}),v=(n,h)=>e(P,{alt:h,src:n,width:1e3,height:1e3,sizes:u,className:`block h-full w-full object-contain ${C.className}`,style:C.style,draggable:!1,onError:()=>A(n)},n),O=t.finish?`${s.name} — ${t.finish.name}`:s.name,S=d&&Z(f)==="pair",U=S?q(s.finishes?.find(n=>n.name===t.finish?.name),E):null,i=re({src:E,second:U,alt:O,sizes:u,failed:N,onFailed:A,near:t.nearScreen,holdEmpty:t.awaitingProbe}),y=m(x,{children:[i.src?v(i.src,i.alt):e(Y,{imageLabel:s.name,spin:C}),i.trial]}),F=X(w),b=F!=="off",I=B(a,z);if(G(g)==="full"){const n=m(x,{children:[b?e("span",{"aria-hidden":!0,"data-format":F,className:`${j} ${$}`}):null,e(k,{show:l!==!1,numbered:b,axleSets:!0,edge:!0})]});return e("div",{style:_(o),"data-set-picture":d&&!S?"one":void 0,children:e(L,{fill:I,badge:n,children:m("div",{className:"flex h-full w-full items-center justify-center",children:[y,i.second?v(i.second,`${i.alt} — right`):null]})})})}return m("div",{style:_(o),"data-set-picture":d&&!S?"one":void 0,children:[b?e("span",{"aria-hidden":!0,"data-format":F,className:`${j} ${$}`}):null,e(k,{show:l!==!1,numbered:b,axleSets:!0}),e(R,{image:y,imageSecond:i.second?v(i.second,`${i.alt} — right`):void 0,wide:S,imageBackgroundFill:I})]})}export{ne as DEFAULT_PICTURE_FRAME,Pe as PICTURE_FRAMES,ie as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as n,Fragment as m,jsxs as p}from"react/jsx-runtime";import{Fragment as x}from"react";import{applyCardAnswers as u}from"../../lib/content/field-usage.js";import{wheelCardSpecFacts as h}from"../../lib/wheels/plp-fitment-match.js";import{CARD_TEXT_SIZE as i,useCatalogCard as f}from"./card-row.js";import{useProductCardState as g}from"./ProductCardState.js";const C="whitespace-nowrap",S=t=>typeof t=="string"?t:t.text,_=/^(.*\S) (\+\d+ more)$/;function w(t,r="·"){return t.map((a,c)=>{const e=S(a),l=typeof a!="string"&&a.accent,o=`${C}${l?" text-accent":""}`,d=c<t.length-1?`${e} ${r}`:e,s=_.exec(e);return p(x,{children:[s?p(m,{children:[n("span",{className:o,children:s[1]})," ",n("span",{className:o,children:c<t.length-1?`${s[2]} ${r}`:s[2]})]}):n("span",{className:o,children:d}),c<t.length-1?" ":null]},e)})}function $({children:t}){const r=f();return n("div",{className:r?`mt-2 h-[38px] overflow-hidden [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[76px] font-mono ${i.labelLarge} leading-[19px] tracking-[0.14em] text-fg-dim`:`mt-[4px] font-mono ${i.labelLarge} tracking-[0.1em] text-fg-dim`,children:t})}function F({sizes:t=!1,car:r=null,separator:a,fieldUsage:c=[]}){const e=g();if(e.kind!=="wheel")return null;const l=u(h(e.wheel,r,{sizes:t}),c).map(o=>o.text);return n(m,{children:w(l,a)})}function E(t){return n($,{children:n(F,{...t})})}export{C as CARD_SPEC_FIELD_CLASS,F as CardSpecFacts,$ as CardSpecLine,w as cardSpecFields,E as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{Fragment as l,jsx as r}from"react/jsx-runtime";import{say as
|
|
1
|
+
"use client";import{Fragment as l,jsx as r}from"react/jsx-runtime";import{say as n}from"efficient-web-builder/format/lib/editor-words";import{useHeroStateOrNull as u,useProductCardStateOrNull as i}from"./ProductCardState.js";function m({label:t,editing:e,onHero:a=!1,children:o}){const s=u();return i()||a&&s?r(l,{children:o}):e?r("div",{"data-host-part-sample":"",className:"opacity-60",children:n(t)}):null}export{m as default};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
+
import type { CartLine } from "../CartContext.js";
|
|
2
3
|
import { type TyreDetailState } from "../useTyreDetail.js";
|
|
3
4
|
import type { TyrePlpCardProps } from "../TyrePlpCard.js";
|
|
4
5
|
import { type PlpCardSelection } from "../wheels-plp/usePlpCardSelection.js";
|
|
5
|
-
import type { Tyre, TyreVariant, WheelSummary } from "../../lib/api/index.js";
|
|
6
|
+
import type { Bundle, Tyre, TyreVariant, WheelSummary } from "../../lib/api/index.js";
|
|
6
7
|
import { type SelectionPriceDisplay } from "../../lib/wheels/price-display.js";
|
|
7
8
|
export interface WheelCardState {
|
|
8
9
|
readonly kind: "wheel";
|
|
@@ -35,17 +36,31 @@ export interface TyreCardState {
|
|
|
35
36
|
readonly unsellable: boolean;
|
|
36
37
|
readonly editing: boolean;
|
|
37
38
|
}
|
|
38
|
-
export
|
|
39
|
-
|
|
39
|
+
export interface BundleCardState {
|
|
40
|
+
readonly kind: "bundle";
|
|
41
|
+
readonly bundle: Bundle;
|
|
42
|
+
readonly currency: string;
|
|
43
|
+
}
|
|
44
|
+
export type ProductCardState = WheelCardState | TyreCardState | BundleCardState;
|
|
45
|
+
export interface HeroBuyState {
|
|
46
|
+
readonly isSet: boolean;
|
|
47
|
+
readonly priced: boolean;
|
|
48
|
+
readonly outOfStock: boolean;
|
|
49
|
+
readonly canAdd: boolean;
|
|
50
|
+
readonly totalLabel: string | null;
|
|
51
|
+
readonly lineToAdd: () => CartLine | null;
|
|
52
|
+
}
|
|
53
|
+
export interface HeroState {
|
|
40
54
|
readonly kind: "hero";
|
|
41
55
|
readonly msrpLabel: string | null;
|
|
42
56
|
readonly amount: string;
|
|
43
57
|
readonly unitLabel: string | null;
|
|
44
58
|
readonly packBadge: string | null;
|
|
59
|
+
readonly buy: HeroBuyState | null;
|
|
45
60
|
}
|
|
46
|
-
export declare function
|
|
47
|
-
export declare function
|
|
48
|
-
value:
|
|
61
|
+
export declare function useHeroStateOrNull(): HeroState | null;
|
|
62
|
+
export declare function HeroStateProvider({ value, children }: {
|
|
63
|
+
value: HeroState;
|
|
49
64
|
children: ReactNode;
|
|
50
65
|
}): import("react").JSX.Element;
|
|
51
66
|
export declare function useProductCardState(): ProductCardState;
|
|
@@ -58,6 +73,10 @@ export declare function WheelCardStateProvider({ wheel, colours, defaultFinish,
|
|
|
58
73
|
editing?: boolean;
|
|
59
74
|
children: ReactNode;
|
|
60
75
|
}): import("react").JSX.Element;
|
|
76
|
+
export declare function BundleCardStateProvider({ bundle, children }: {
|
|
77
|
+
bundle: Bundle;
|
|
78
|
+
children: ReactNode;
|
|
79
|
+
}): import("react").JSX.Element;
|
|
61
80
|
export declare function TyreCardStateProvider({ tyre, currency, editing, children, }: {
|
|
62
81
|
tyre: TyreCardProduct;
|
|
63
82
|
currency: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as l}from"react/jsx-runtime";import{createContext as b,useCallback as z,useContext as S,useMemo as A,useState as P}from"react";import{useCurrency as h}from"../CurrencyContext.js";import{useTyreDetail as B}from"../useTyreDetail.js";import{usePlpCardSelection as N}from"../wheels-plp/usePlpCardSelection.js";import{tyrePagePath as W}from"../../lib/tyres/tyre-page-path.js";import{canOrderTyreVariant as T}from"../../lib/tyres/tyre-purchase.js";import{resolveSelectionPrice as j}from"../../lib/wheels/price-display.js";import{setBuildLabel as E,setIsWide as H,summarySetBuild as L}from"../../lib/wheels/set-mode.js";const n=b(null);function J(){const e=S(n);return e?.kind==="hero"?e:null}function K({value:e,children:t}){return l(n.Provider,{value:e,children:t})}function R(){const e=S(n);if(!e||e.kind==="hero")throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return e}function Q(){const e=S(n);return e?.kind==="hero"?null:e}function X(){const e=R();if(e.kind!=="wheel")throw new Error(`A wheel card piece was drawn on a ${e.kind} card.`);return e}const V=[];function Y({wheel:e,colours:t=V,defaultFinish:o,editing:a=!1,children:u}){const{currency:r}=h(),s=N(e,t,o),[f,p]=P(!1),d=L(e),c={kind:"wheel",wheel:e,sel:s,currency:r,price:j(e,s.selectedVariant,r,1),isSet:H(d),setWords:E(d),editing:a,notifyOpen:f,setNotifyOpen:p};return l(n.Provider,{value:c,children:u})}function Z({bundle:e,children:t}){const{currency:o}=h(),a={kind:"bundle",bundle:e,currency:o};return l(n.Provider,{value:a,children:t})}function ee({tyre:e,currency:t,editing:o=!1,children:a}){const{currency:u}=h(),{slug:r}=e,s=W(r),[f,p]=P(!1),d=z(()=>{r&&p(!0)},[r]),{state:c,tyre:m}=B(r??null,f),i=A(()=>m?.variants??[],[m]),[x,k]=P(null),w=i.length===1?i[0].size:null,y=x??w,v=i.find(g=>g.size===y),C=c==="ready",O={kind:"tyre",tyre:e,currency:t,activeCurrency:u,pagePath:s,arm:d,detailState:c,detail:m,variants:i,chosen:y,setSize:k,variant:v,canAdd:v!=null&&T(v,u),detailReady:C,unsellable:!s||c==="error"||C&&i.length===0,editing:o};return l(n.Provider,{value:O,children:a})}export{Z as BundleCardStateProvider,K as HeroStateProvider,ee as TyreCardStateProvider,Y as WheelCardStateProvider,J as useHeroStateOrNull,R as useProductCardState,Q as useProductCardStateOrNull,X as useWheelCardState};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SelectedRanges } from "efficient-web-builder/render/lib/content/box-show-for";
|
|
1
2
|
import type { FinishFamily } from "../../lib/api/index.js";
|
|
2
3
|
import { type CatalogFilterState, type SortKey } from "../../lib/wheels/catalog-filters.js";
|
|
3
4
|
import type { VehicleFitment } from "../../lib/wheels/plp-fitment-match.js";
|
|
@@ -34,8 +35,10 @@ interface CatalogFilterContextValue {
|
|
|
34
35
|
publishVehicle: (v: CatalogVehicleState) => void;
|
|
35
36
|
}
|
|
36
37
|
export declare const COLLECTION_ATTR = "data-catalog-collection";
|
|
37
|
-
export declare function CatalogFilterProvider({ children }: {
|
|
38
|
+
export declare function CatalogFilterProvider({ children, address, editing, }: {
|
|
38
39
|
children: React.ReactNode;
|
|
40
|
+
address?: SelectedRanges | null;
|
|
41
|
+
editing?: boolean;
|
|
39
42
|
}): import("react").JSX.Element;
|
|
40
43
|
export declare function useCatalogFilter(): CatalogFilterContextValue;
|
|
41
44
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as D}from"react/jsx-runtime";import{createContext as oe,useCallback as n,useContext as se,useEffect as ne,useMemo as re,useRef as B,useState as p}from"react";import{EMPTY_FILTERS as F}from"../../lib/wheels/catalog-filters.js";import{compareFinishFamily as ie}from"../../lib/wheels/finish-defaults.js";import{ShopperScopeProvider as ce}from"./ShopperScope.js";const H={fit:null,name:"",resolving:!1,unresolved:!1};function le(s,o){return s.fit===o.fit&&s.name===o.name&&s.resolving===o.resolving&&s.unresolved===o.unresolved}const r=()=>{},$=oe({filters:F,setProcess:r,setSize:r,setLugs:r,setFinish:r,setPriceMin:r,setPriceMax:r,setSort:r,clearAll:r,reportCount:r,total:0,reportLugs:r,lugOptions:[],reportSizes:r,sizeOptions:[],reportFinishes:r,finishOptions:[],reportCategories:r,categoryOptions:[],optionsReported:!1,scrollProcess:null,vehicle:H,publishVehicle:r}),J="data-catalog-collection",K=(s,o)=>s-o,ue=()=>0;function Q(s,o){return s.length===o.length&&s.every((a,u)=>a===o[u])}function S(s){const o=B(new Map),[a,u]=p([]),i=n((f,d)=>{const g=o.current.get(f);if(g&&Q(g,d))return;o.current.set(f,d);const m=new Set;for(const c of o.current.values())for(const h of c)m.add(h);const v=[...m].sort(s);u(c=>Q(c,v)?c:v)},[s]);return[a,i]}function me({children:s,address:o=null,editing:a=!1}){const[u,i]=p(F),f=n(t=>i(e=>({...e,process:t})),[]),d=n(t=>i(e=>({...e,size:t})),[]),g=n(t=>i(e=>({...e,lugs:t})),[]),m=n(t=>i(e=>({...e,finish:t})),[]),v=n(t=>i(e=>({...e,priceMin:t})),[]),c=n(t=>i(e=>({...e,priceMax:t})),[]),h=n(t=>i(e=>({...e,sort:t})),[]),L=n(()=>i(t=>({...F,sort:t.sort})),[]),[P,W]=p(H),x=n(t=>{W(e=>le(e,t)?e:t)},[]),C=B(new Map),[w,X]=p(0),z=n((t,e)=>{if(C.current.get(t)===e)return;C.current.set(t,e);let l=0;for(const R of C.current.values())l+=R;X(l)},[]),[M,T]=S(K),[_,A]=S(K),[G,I]=S(ie),[y,N]=S(ue),[V,E]=p(!1),U=n((t,e)=>{E(!0),T(t,e)},[T]),Y=n((t,e)=>{E(!0),A(t,e)},[A]),b=n((t,e)=>{E(!0),I(t,e)},[I]),[j,Z]=p(null);ne(()=>{let e=0;const O=()=>{e=0;let R=null;const te=document.querySelectorAll(`[${J}]`);for(const k of te){const q=k.getBoundingClientRect();if(q.top<=140&&q.bottom>140){R=k.getAttribute(J)??null;break}}Z(R)},l=()=>{e||(e=requestAnimationFrame(O))};return O(),window.addEventListener("scroll",l,{passive:!0}),window.addEventListener("resize",l),()=>{window.removeEventListener("scroll",l),window.removeEventListener("resize",l),e&&cancelAnimationFrame(e)}},[]);const ee=re(()=>({filters:u,setProcess:f,setSize:d,setLugs:g,setFinish:m,setPriceMin:v,setPriceMax:c,setSort:h,clearAll:L,reportCount:z,total:w,reportLugs:U,lugOptions:M,reportSizes:Y,sizeOptions:_,reportFinishes:b,finishOptions:G,reportCategories:N,categoryOptions:y,optionsReported:V,scrollProcess:j,vehicle:P,publishVehicle:x}),[u,f,d,g,m,v,c,h,L,z,w,U,M,Y,_,b,G,N,y,V,j,P,x]);return D($.Provider,{value:ee,children:D(ce,{address:o,editing:a,children:s})})}function ve(){return se($)}export{J as COLLECTION_ATTR,me as CatalogFilterProvider,H as NO_VEHICLE,ve as useCatalogFilter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as o}from"react/jsx-runtime";import{say as r}from"efficient-web-builder/format/lib/editor-words";import{CATALOG_TEXT_SIZE as l}from"../../lib/sections/catalog-text-size.js";function n({onClick:t,size:e=l.labelSmall}){return o("button",{type:"button",onClick:t,className:`cursor-pointer font-mono ${e} uppercase tracking-[0.16em] text-accent hover:text-fg`,children:r("Clear all")})}export{n as default};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
|
-
export declare function PillButton({ label, badge, open, onToggle, controls, buttonRef, }: {
|
|
2
|
+
export declare function PillButton({ labelSize, label, badge, open, onToggle, controls, buttonRef, }: {
|
|
3
|
+
labelSize?: string;
|
|
3
4
|
label: React.ReactNode;
|
|
4
5
|
badge: number;
|
|
5
6
|
open: boolean;
|
|
@@ -7,7 +8,8 @@ export declare function PillButton({ label, badge, open, onToggle, controls, but
|
|
|
7
8
|
controls?: string;
|
|
8
9
|
buttonRef?: React.Ref<HTMLButtonElement>;
|
|
9
10
|
}): React.JSX.Element;
|
|
10
|
-
export declare function FilterPill({ label, badge, open, onToggle, children, }: {
|
|
11
|
+
export declare function FilterPill({ labelSize, label, badge, open, onToggle, children, }: {
|
|
12
|
+
labelSize?: string;
|
|
11
13
|
name: string;
|
|
12
14
|
label: React.ReactNode;
|
|
13
15
|
badge: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as i,jsxs as
|
|
1
|
+
"use client";import{jsx as i,jsxs as b}from"react/jsx-runtime";import{useEffect as g,useId as k,useRef as x}from"react";import{CATALOG_TEXT_SIZE as s}from"../../lib/sections/catalog-text-size.js";function h({labelSize:r=s.labelLarge,label:c,badge:t,open:e,onToggle:n,controls:d,buttonRef:l}){const o=t>0;return b("button",{ref:l,type:"button","aria-haspopup":"dialog","aria-expanded":e,"aria-controls":d,onClick:n,className:[`inline-flex items-center gap-2 whitespace-nowrap border px-4 py-3 font-mono ${r} uppercase tracking-[0.2em] transition-colors`,o?"border-accent text-accent":"border-line hover:border-fg-dim"].join(" "),style:o?void 0:{color:"color-mix(in oklab, currentColor 80%, transparent)"},children:[c,t>0&&i("span",{className:`px-2 ${s.badge} tracking-[0.1em] text-bg`,style:{background:"var(--accent)"},children:t}),i("span",{className:`${s.badge} opacity-65 transition-transform ${e?"rotate-180":""}`,children:"▾"})]})}function w({labelSize:r,label:c,badge:t,open:e,onToggle:n,children:d}){const l=k(),o=x(null),p=x(null);return g(()=>{if(!e)return;const a=o.current?.ownerDocument??document,m=u=>{u.key==="Escape"&&(n(),p.current?.focus())},f=u=>{o.current?.contains(u.target)||n()};return a.addEventListener("keydown",m),a.addEventListener("pointerdown",f),()=>{a.removeEventListener("keydown",m),a.removeEventListener("pointerdown",f)}},[e,n]),b("div",{ref:o,className:"relative",children:[i(h,{labelSize:r,label:c,badge:t,open:e,onToggle:n,controls:e?l:void 0,buttonRef:p}),e&&i("div",{id:l,className:"absolute left-0 top-[calc(100%+6px)] z-[60] min-w-[280px] border border-line bg-surface p-5 shadow-[0_24px_60px_rgba(0,0,0,0.4)]",onClick:a=>a.stopPropagation(),children:d})]})}function _({children:r}){return i("div",{className:`mb-3 font-mono ${s.labelSmall} uppercase tracking-[0.32em] text-fg-dim`,children:r})}function L({active:r,onClick:c,children:t,role:e,ariaChecked:n}){return i("button",{type:"button",role:e,"aria-checked":e==="radio"?n:void 0,onClick:c,className:[`border px-3 py-2 font-mono ${s.labelLarge} uppercase tracking-[0.18em] transition-colors`,r?"border-accent bg-accent text-bg":"border-line hover:border-fg-dim"].join(" "),style:r?void 0:{color:"color-mix(in oklab, currentColor 75%, transparent)"},children:t})}export{w as FilterPill,L as OptButton,_ as PanelTitle,h as PillButton};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SlotComponent } from "efficient-easel/blocks";
|
|
2
|
+
import type { FirstShown } from "../../lib/wheels/shopper-first-paint.js";
|
|
3
|
+
export default function ShopperChips({ owner, showCount, showClear, showSort, firstShown, editing, }: {
|
|
4
|
+
owner: {
|
|
5
|
+
id: string;
|
|
6
|
+
template?: SlotComponent;
|
|
7
|
+
};
|
|
8
|
+
showCount: boolean;
|
|
9
|
+
showClear: boolean;
|
|
10
|
+
showSort: boolean;
|
|
11
|
+
firstShown?: FirstShown;
|
|
12
|
+
editing?: boolean;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,Fragment as C,jsxs as L}from"react/jsx-runtime";import{CardTemplateRows as N}from"efficient-web-builder/render/components/CardRowContext";import{cardRow as G}from"efficient-web-builder/format/lib/content/card-template";import{say as K}from"efficient-web-builder/format/lib/editor-words";import{useCurrency as O}from"../CurrencyContext.js";import{formatPrice as B}from"../../lib/commerce.js";import{filterChipItems as I,filterStateWithoutChip as Y}from"../../lib/sections/filter-option-rows.js";import{PlpResultRange as T,PlpToolbar as R}from"../wheels-plp/PlpToolbar.js";import S from"./ClearAllButton.js";import A from"./SortSelect.js";import{hasActivePlpFilters as j,plpSortKeysFor as M,PLP_SORT_LABELS as U}from"../../lib/wheels/plp-filters.js";import{itemKind as W,plpKindNoun as X}from"../../lib/catalog/plp-item.js";import{CATALOG_TEXT_SIZE as Z}from"../../lib/sections/catalog-text-size.js";import{EMPTY_PLP_FILTERS as $}from"../../lib/wheels/plp-filters.js";import{GALLERY_SORT_KEYS as q,GALLERY_SORT_LABELS as z}from"../../lib/sections/gallery-toolbar.js";import{useShopperMember as D}from"./ShopperScope.js";const H="✕";function J({owner:n,showCount:r,showClear:l,showSort:s,firstShown:t,editing:a}){const{ref:i,scope:o,gallery:f}=D("chips",null,{count:r,sort:s}),{currency:c}=O(),m=(!o?.live&&t?{state:o?.state??{...$,sort:t.sort},update:()=>{},clear:()=>{},total:t.total,range:t.range,kinds:t.kinds}:null)??(o?{...o,kinds:[...new Set(o.rows.map(W))]}:null);if(!m&&f)return e("div",{ref:i,"data-shopper-chips":"",children:e(Q,{owner:n,gallery:f,showCount:r,showClear:l,showSort:s,editing:a})});if(!m)return e("div",{ref:i,"data-shopper-chips":"",children:a&&e("p",{className:`font-mono ${Z.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:"Filter chips show the picks of a Filters block, or the Tags of a Gallery, in this Box"})});const{state:d,update:u,clear:_,total:p,range:v,kinds:h}=m,x=X(h.length?h:["alloy-wheel"]),E=j(d),y=I(d,c,B).map(g=>({...g,mark:H,press:()=>u(F=>Y(F,g))})),P=L(C,{children:[r&&e("div",{"data-shopper-count":"",className:"contents",children:e(T,{total:p,range:v??{from:p?1:0,to:p},noun:x})}),y.length>0&&e(b,{owner:n,chips:y,editing:a}),l&&E&&e(S,{onClick:_})]}),w=M(h.length?h:["alloy-wheel"]);return e("div",{ref:i,"data-shopper-chips":"",children:e(R,{start:P,end:s?e(A,{value:d.sort,keys:w,labels:U,onChange:g=>u({sort:g,page:1})}):void 0})})}function b({owner:n,chips:r,selected:l,editing:s}){return e("ul",{className:"flex list-none flex-wrap items-center gap-2",children:e(N,{ownerId:n.id,ownerType:"FilterChipsBlock",Template:n.template,rows:r.map(G),items:r,states:l===void 0?void 0:r.map((t,a)=>a===l?{selected:!0}:void 0),actions:s?void 0:r.map(t=>({press:t.press})),fallback:null,wrapCopy:t=>e("li",{children:t}),children:t=>t})})}function Q({owner:n,gallery:r,showCount:l,showClear:s,showSort:t,editing:a}){const{tags:i,tag:o,sort:f,shown:c,pick:k,setSort:m,clear:d}=r,u=[{label:K("All"),mark:"",press:()=>k(null)},...i.map(p=>({label:p,mark:"",press:()=>k(p)}))],_=L(C,{children:[l&&e("div",{"data-shopper-count":"",className:"contents",children:e(T,{total:c,range:{from:c?1:0,to:c},noun:V})}),i.length>0&&e(b,{owner:n,chips:u,selected:o===null?0:i.indexOf(o)+1,editing:a}),s&&o!==null&&e(S,{onClick:d})]});return e(R,{start:_,end:t?e(A,{value:f,keys:q,labels:z,onChange:m}):void 0})}const V={many:"items"};export{J as default};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SlotComponent } from "efficient-easel/blocks";
|
|
2
|
+
import { type PlpItem } from "../../lib/catalog/plp-item.js";
|
|
3
|
+
import type { FieldUsageAnswer } from "../../lib/content/field-usage.js";
|
|
4
|
+
import { type PlpSortKey } from "../../lib/wheels/plp-filters.js";
|
|
5
|
+
import type { FilterLook, FilterLookPhone, ShownFilter } from "../../lib/sections/shopper-filters.js";
|
|
6
|
+
export default function ShopperFilters({ owner, look, lookPhone, shown, showSort, openingSort, filtersBelow, fieldUsage, firstRows, editing, }: {
|
|
7
|
+
owner: {
|
|
8
|
+
id: string;
|
|
9
|
+
template?: SlotComponent;
|
|
10
|
+
};
|
|
11
|
+
look: FilterLook;
|
|
12
|
+
lookPhone: FilterLookPhone;
|
|
13
|
+
shown: readonly ShownFilter[];
|
|
14
|
+
showSort: boolean;
|
|
15
|
+
openingSort: PlpSortKey;
|
|
16
|
+
filtersBelow: boolean;
|
|
17
|
+
fieldUsage?: readonly FieldUsageAnswer[];
|
|
18
|
+
firstRows?: readonly PlpItem[];
|
|
19
|
+
editing?: boolean;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as l,Fragment as G,jsxs as d}from"react/jsx-runtime";import{useCallback as K,useMemo as F,useState as z}from"react";import{say as W}from"efficient-web-builder/format/lib/editor-words";import{CardTemplateRows as ee}from"efficient-web-builder/render/components/CardRowContext";import{cardRow as le}from"efficient-web-builder/format/lib/content/card-template";import{useCurrency as te}from"../CurrencyContext.js";import{useEnglish as re}from"../EnglishVariant.js";import ne from"./ClearAllButton.js";import se from"./PriceRange.js";import oe from"./SortSelect.js";import{DEFAULT_CATALOG_FILTER_LABELS as U}from"../../lib/content/catalog-filter-labels.js";import{itemKind as X}from"../../lib/catalog/plp-item.js";import{itemLugs as ie,lugFilterLabel as ce}from"../../lib/wheels/lug-count.js";import{CATALOG_TEXT_SIZE as L}from"../../lib/sections/catalog-text-size.js";import{buildPlpFacets as ae,itemMatchesPlp as ue,plpInStockCount as pe,plpPriceBounds as me,plpSortKeysFor as de,PLP_ONE_VALUE_MAX as fe,PLP_SORT_LABELS as ge}from"../../lib/wheels/plp-filters.js";import{FILTER_IN_STOCK_KEY as he,FILTER_PRICE_KEY as T,filterGroupItems as Se}from"../../lib/sections/filter-option-rows.js";import{hasActivePlpFilters as xe}from"../../lib/wheels/plp-filters.js";import{FilterPill as be,PillButton as we}from"./FilterPill.js";import{useShopperFilter as ye}from"./ShopperScope.js";const Y="lugs";function ke({owner:r,look:e,lookPhone:n,shown:s,showSort:c,openingSort:i,filtersBelow:t,fieldUsage:u,firstRows:b,editing:N}){const{currency:p}=te(),M=re(),{ref:V,scope:f}=ye({filtersBelow:t,openingSort:i}),{state:g}=f,h=f.live?f.rows:b??f.rows,w=F(()=>[...new Set(h.map(X))],[h]),A=F(()=>{const a=ae(h,g,p,w,u??[],"pass").filter(o=>o.key!=="collections"||s.includes("category"));if(s.includes("lugs")){const o=Ne(h,g,p);o&&a.push(o)}return a.map(o=>({...o,label:M(o.label)}))},[h,g,p,w,u,s,M]),I=s.includes("price")?me(h,p):null,P=s.includes("inStock")&&h.length>0?pe(h,g,p):null,Z=de(w.length?w:["alloy-wheel"]),y=f.update,v=K(a=>y({...a,page:1}),[y]),B=K((a,o)=>y(m=>{if(a===Y){const x=Number(o),J=(m.lugs??[]).includes(x);return{...m,page:1,lugs:J?(m.lugs??[]).filter(Q=>Q!==x):[...m.lugs??[],x]}}const _=m[a].map(String),j=_.includes(o)?_.filter(x=>x!==o):[..._,o];return{...m,page:1,[a]:a==="diameters"?j.map(Number):j}}),[y]),$=c&&!f.sortInChips,q=F(()=>{const a=Se(A,g,P).map(o=>({...o,options:o.options.map(m=>({...m,press:o.key===he?()=>v({inStockOnly:!g.inStockOnly}):()=>B(o.key,m.value)}))}));return I?[...a,{key:T,label:U.price,options:[]}]:a},[A,g,P,I,v,B]),S={owner:r,items:q,state:g,sorts:Z,showSort:$,set:v,clear:f.clear},O=e==="rail"?l(H,{...S}):l(E,{...S,columns:e==="bar-columns"}),R=(n==="rail"?e==="rail":n==="bar"&&e!=="rail")?null:n==="button"?l(ve,{...S}):n==="rail"?l(H,{...S}):l(E,{...S,columns:!1});return d("div",{ref:V,"data-shopper-filters":"",className:"w-full",children:[R?d(G,{children:[l("div",{className:"max-view-wide:hidden",children:O}),l("div",{className:"view-wide:hidden",children:R})]}):O,N&&f.grids===0&&l("p",{className:`mt-2 font-mono ${L.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:"Filters a Product Grid in this Box"})]})}function Ne(r,e,n){const s=new Map,c=new Set;for(const t of r){const u=X(t)==="alloy-wheel"?ie(t):null;u!==null&&(c.add(u),ue(t,e,n,"lugs","pass")&&s.set(u,(s.get(u)??0)+1))}if(c.size<=fe)return null;const i=e.lugs??[];return{key:Y,label:U.lugs,options:[...c].sort((t,u)=>t-u).map(t=>({value:String(t),label:ce(t),count:s.get(t)??0,checked:i.includes(t),swatch:null}))}}function k({state:r,sorts:e,set:n}){return l(oe,{value:r.sort,keys:e,labels:ge,onChange:s=>n({sort:s})})}function D(r,e){return r.key===T?(e.priceMin!=null?1:0)+(e.priceMax!=null?1:0):r.options.filter(n=>n.state.selected).length}function C({owner:r,items:e,state:n,set:s,wrap:c}){const i=(t,u)=>{const b=e[u.index],N=b.key===T?d(G,{children:[t,l(se,{min:n.priceMin,max:n.priceMax,onMin:p=>s({priceMin:p}),onMax:p=>s({priceMax:p})})]}):t;return c(N,b)};return l(ee,{ownerId:r.id,ownerType:"FilterBlock",Template:r.template,rows:e.map(le),items:e,fallback:null,wrapCopy:i,children:t=>t})}function E({columns:r,...e}){const[n,s]=z(null),c=i=>()=>s(t=>t===i?null:i);return r?d("div",{className:"flex flex-col gap-4",children:[l("div",{className:"grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] gap-6 border-y border-line py-4",children:l(C,{...e,wrap:(i,t)=>l("div",{children:i},t.key)})}),e.showSort&&l("div",{className:"flex flex-wrap items-center justify-end gap-4",children:l(k,{...e})})]}):d("div",{className:"flex flex-wrap items-center gap-2",children:[l(C,{...e,wrap:(i,t)=>l(be,{labelSize:L.labelSmall,name:t.key,label:t.label,badge:D(t,e.state),open:n===t.key,onToggle:c(t.key),children:i},t.key)}),e.showSort&&l("div",{className:"ml-auto",children:l(k,{...e})})]})}function H(r){return d("aside",{className:"flex w-full flex-col gap-4 lg:w-[268px]",children:[d("div",{className:"flex items-center justify-between",children:[l("h2",{className:"font-display text-[18px] font-medium uppercase tracking-[-0.01em]",children:W("Filter")}),xe(r.state)&&l(ne,{onClick:r.clear})]}),l("div",{className:"flex flex-col",children:l(C,{...r,wrap:(e,n)=>l("div",{className:"border-t border-line py-4",children:e},n.key)})}),r.showSort&&l(k,{...r})]})}function ve(r){const[e,n]=z(!1),s=r.items.reduce((c,i)=>c+D(i,r.state),0);return d("div",{className:"flex flex-col gap-4",children:[d("div",{className:"flex items-center justify-between gap-4",children:[l(we,{labelSize:L.labelSmall,label:"Filters",badge:s,open:e,onToggle:()=>n(c=>!c)}),r.showSort&&l(k,{...r})]}),e&&l(E,{...r,columns:!0,showSort:!1})]})}export{ke as default};
|