efficient-storefront-blocks 0.60.0 → 0.62.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 +79 -1
- package/README.md +2 -1
- package/dist/chunks/{EditorPreviewCheckout-XY2PLPBD.js → EditorPreviewCheckout-BQFPYYBS.js} +1 -1
- package/dist/chunks/{SiteEditorProvider-XF374NLZ.js → SiteEditorProvider-3E6XWZIS.js} +1 -1
- package/dist/chunks/chunk-4BQ44OLC.js +250 -0
- package/dist/chunks/chunk-MT5KWSYX.js +1 -0
- package/dist/chunks/chunk-OJ4OD3N6.js +1 -0
- package/dist/chunks/{fitment-data-RORHKBID.js → fitment-data-PWZAAUFK.js} +1 -1
- package/dist/editor/components/EditorPreviewChat.js +4 -4
- package/dist/editor/components/PreviewHeader.d.ts +1 -1
- package/dist/editor/components/PreviewHeader.js +4 -4
- package/dist/editor/lib/efficient-backend.d.ts +1 -0
- package/dist/editor/lib/efficient-backend.js +1 -1
- package/dist/editor/lib/efficient-block-sources.d.ts +2 -0
- package/dist/editor/lib/efficient-block-sources.js +1 -0
- package/dist/editor/lib/puck/blocks/commerce/EuTyreLabelBlock/fields.d.ts +2 -0
- package/dist/editor/lib/puck/blocks/commerce/EuTyreLabelBlock/fields.js +1 -0
- package/dist/editor/lib/puck/blocks/commerce/ProductGallery/fields.d.ts +6 -0
- package/dist/editor/lib/puck/blocks/commerce/ProductGallery/fields.js +1 -0
- package/dist/editor/lib/puck/blocks/commerce/ProductHero/fields.js +1 -1
- package/dist/editor/lib/puck/blocks/commerce/index.d.ts +1 -1
- package/dist/editor/lib/puck/blocks/commerce/index.js +1 -1
- package/dist/editor/lib/puck/blocks/service/RatingBlock/fields.d.ts +2 -0
- package/dist/editor/lib/puck/blocks/service/RatingBlock/fields.js +1 -0
- package/dist/editor/lib/puck/blocks/service/index.d.ts +1 -1
- package/dist/editor/lib/puck/blocks/service/index.js +1 -1
- package/dist/editor/lib/puck/config.js +1 -1
- package/dist/editor/lib/storefront-editor-words.d.ts +1 -0
- package/dist/editor/lib/storefront-editor-words.js +1 -1
- package/dist/editor.css +1 -1
- package/dist/fitment.d.ts +56 -0
- package/dist/fitment.js +1 -0
- package/dist/index.d.ts +36 -6
- package/dist/index.js +101 -81
- package/dist/links.js +1 -1
- package/dist/render/app/globals.css +70 -14
- package/dist/render/built-with.json +1 -1
- package/dist/render/components/CartContext.d.ts +1 -0
- package/dist/render/components/CartContext.js +1 -1
- package/dist/render/components/CartDrawer.d.ts +0 -8
- package/dist/render/components/CartDrawer.js +2 -2
- package/dist/render/components/ChatWidget.js +1 -1
- package/dist/render/components/EuTyreLabels.d.ts +3 -0
- package/dist/render/components/EuTyreLabels.js +1 -1
- package/dist/render/components/FitmentTable.js +1 -1
- package/dist/render/components/FooterMenu.js +1 -1
- package/dist/render/components/FormBlock.js +1 -1
- package/dist/render/components/GalleryItem.js +1 -1
- package/dist/render/components/Header.js +1 -1
- package/dist/render/components/LegalLine.js +1 -1
- package/dist/render/components/PopupFrame.d.ts +2 -1
- package/dist/render/components/PopupFrame.js +1 -1
- package/dist/render/components/PopupHost.d.ts +17 -0
- package/dist/render/components/PopupHost.js +1 -0
- package/dist/render/components/ProductCard.js +1 -1
- package/dist/render/components/ProductGallery.d.ts +15 -0
- package/dist/render/components/ProductGallery.js +1 -0
- package/dist/render/components/ProductHeroPanel.js +1 -1
- package/dist/render/components/RatingStars.d.ts +4 -0
- package/dist/render/components/RatingStars.js +1 -0
- package/dist/render/components/Reviews.js +1 -1
- package/dist/render/components/StorefrontProviders.d.ts +1 -3
- package/dist/render/components/StorefrontProviders.js +1 -1
- package/dist/render/components/SubscribePopupContext.d.ts +3 -15
- package/dist/render/components/SubscribePopupContext.js +1 -1
- package/dist/render/components/TyrePlpCard.js +1 -1
- package/dist/render/components/WheelCardFrame.d.ts +3 -27
- package/dist/render/components/WheelCardFrame.js +1 -1
- package/dist/render/components/card-pieces/CardBuyButton.d.ts +7 -0
- package/dist/render/components/card-pieces/CardBuyButton.js +1 -0
- package/dist/render/components/card-pieces/CardFinishSwatches.d.ts +5 -0
- package/dist/render/components/card-pieces/CardFinishSwatches.js +1 -0
- package/dist/render/components/card-pieces/CardPrice.d.ts +7 -0
- package/dist/render/components/card-pieces/CardPrice.js +1 -0
- package/dist/render/components/card-pieces/CardProductBadge.d.ts +7 -0
- package/dist/render/components/card-pieces/CardProductBadge.js +1 -0
- package/dist/render/components/card-pieces/CardSizes.d.ts +9 -0
- package/dist/render/components/card-pieces/CardSizes.js +1 -0
- package/dist/render/components/card-pieces/ProductCardState.d.ts +53 -0
- package/dist/render/components/card-pieces/ProductCardState.js +1 -0
- package/dist/render/components/card-pieces/card-row.d.ts +20 -0
- package/dist/render/components/card-pieces/card-row.js +1 -0
- package/dist/render/components/cart/drawer-parts.d.ts +28 -0
- package/dist/render/components/cart/drawer-parts.js +1 -0
- package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.d.ts +3 -0
- package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.js +1 -1
- package/dist/render/components/pdp-dynamic/DynamicProductGallery.d.ts +9 -0
- package/dist/render/components/pdp-dynamic/DynamicProductGallery.js +1 -0
- package/dist/render/components/useHeaderBar.js +1 -1
- package/dist/render/components/useIsLightTheme.d.ts +1 -0
- package/dist/render/components/useIsLightTheme.js +1 -0
- package/dist/render/components/wheels-plp/AlloyWheelsListing.d.ts +2 -1
- package/dist/render/components/wheels-plp/AlloyWheelsListing.js +1 -1
- package/dist/render/components/wheels-plp/PlpCard.d.ts +3 -2
- package/dist/render/components/wheels-plp/PlpCard.js +1 -1
- package/dist/render/components/wheels-plp/usePlpCardSelection.d.ts +1 -1
- package/dist/render/components/wheels-plp/usePlpCardSelection.js +1 -1
- package/dist/render/components/wheels-plp/usePlpFiltersInUrl.d.ts +2 -1
- package/dist/render/components/wheels-plp/usePlpFiltersInUrl.js +1 -1
- package/dist/render/lib/api/index.d.ts +4 -2
- package/dist/render/lib/api/index.js +1 -1
- package/dist/render/lib/api/types.d.ts +48 -1
- package/dist/render/lib/chrome-load.d.ts +1 -1
- package/dist/render/lib/chrome-load.js +1 -1
- package/dist/render/lib/content/field-usage.d.ts +0 -1
- package/dist/render/lib/content/field-usage.js +1 -1
- package/dist/render/lib/content/product-hero.d.ts +1 -0
- package/dist/render/lib/content/product-hero.js +1 -1
- package/dist/render/lib/header-fit.d.ts +2 -0
- package/dist/render/lib/header-fit.js +1 -0
- package/dist/render/lib/popup/popup-stores.d.ts +2 -0
- package/dist/render/lib/popup/popup-stores.js +1 -0
- package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/meta.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/meta.js +1 -0
- package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/render.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/EuTyreLabelBlock/render.js +1 -0
- package/dist/render/lib/puck/blocks/commerce/ProductGallery/meta.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/ProductGallery/meta.js +1 -0
- package/dist/render/lib/puck/blocks/commerce/ProductGallery/render.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/ProductGallery/render.js +1 -0
- package/dist/render/lib/puck/blocks/commerce/metas.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/metas.js +1 -1
- package/dist/render/lib/puck/blocks/commerce/renders.d.ts +2 -0
- package/dist/render/lib/puck/blocks/commerce/renders.js +1 -1
- package/dist/render/lib/puck/blocks/service/RatingBlock/meta.d.ts +3 -0
- package/dist/render/lib/puck/blocks/service/RatingBlock/meta.js +1 -0
- package/dist/render/lib/puck/blocks/service/RatingBlock/render.d.ts +2 -0
- package/dist/render/lib/puck/blocks/service/RatingBlock/render.js +1 -0
- package/dist/render/lib/puck/blocks/service/metas.d.ts +1 -0
- package/dist/render/lib/puck/blocks/service/metas.js +1 -1
- package/dist/render/lib/puck/blocks/service/renders.d.ts +1 -0
- package/dist/render/lib/puck/blocks/service/renders.js +1 -1
- package/dist/render/lib/puck/lazy-draws.js +1 -1
- package/dist/render/lib/storefront-page-groups.js +1 -1
- package/dist/render/lib/wheels/fitment-columns.d.ts +6 -1
- package/dist/render/lib/wheels/fitment-columns.js +1 -1
- package/dist/render/lib/wheels/plp-fitment-match.d.ts +4 -0
- package/dist/render/lib/wheels/plp-fitment-match.js +1 -1
- package/dist/render/lib/wheels/plp-hydrate.d.ts +2 -0
- package/dist/render/lib/wheels/plp-hydrate.js +1 -1
- package/dist/render/lib/wheels/spec-sheet.js +1 -1
- package/dist/words.d.ts +2 -2
- package/dist/words.js +3 -3
- package/package.json +11 -4
- package/dist/chunks/chunk-EZQTUHPN.js +0 -1
- package/dist/chunks/chunk-FCCEAXMM.js +0 -1
- package/dist/chunks/chunk-YNI65Q6Z.js +0 -250
- package/dist/render/components/wheels-plp/useWheelCardBottom.d.ts +0 -20
- package/dist/render/components/wheels-plp/useWheelCardBottom.js +0 -1
- package/dist/render/lib/popup/popup-rules.d.ts +0 -25
- package/dist/render/lib/popup/popup-rules.js +0 -1
- /package/dist/chunks/{chunk-YNI65Q6Z.js.LEGAL.txt → chunk-4BQ44OLC.js.LEGAL.txt} +0 -0
- /package/dist/chunks/{chunk-VT346MLP.js → chunk-FZFBLN7K.js} +0 -0
- /package/dist/chunks/{chunk-I6VNNXUI.js → chunk-TRUOK5AD.js} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CardProductBadgeSettings {
|
|
2
|
+
show?: boolean;
|
|
3
|
+
sale?: boolean;
|
|
4
|
+
numbered?: boolean;
|
|
5
|
+
axleSets?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export default function CardProductBadge({ show, sale, numbered, axleSets, }: CardProductBadgeSettings): import("react").JSX.Element | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,Fragment as x,jsxs as h}from"react/jsx-runtime";import{Fragment as _}from"react";import{CARD_TEXT_SIZE as S,useCatalogCard as A}from"./card-row.js";import{useProductCardState as C}from"./ProductCardState.js";const b=`border px-2 py-1 font-mono ${S.labelSmall} uppercase tracking-[0.3em]`,B="absolute right-[18px] top-[18px] z-10",E="absolute left-[18px] top-[18px] z-10";function t({tone:n,children:l}){return e("span",{className:[b,n==="solid"?"border-accent bg-accent text-bg":"border-accent text-accent"].join(" "),children:l})}function D({show:n=!0,sale:l=!1,numbered:a=!1,axleSets:u=!1}){const o=C();if(!A()||o.kind!=="wheel")return null;const{wheel:p,price:m,isSet:c}=o,i=c||u?o.setWords:null,s=n?p.badge:null,r=c?e(t,{tone:"solid",children:"Set"}):null,d=[a?r:null,l&&m.onSale?e(t,{tone:"solid",children:"Sale"}):null,i?e(t,{tone:"outline",children:i}):s?e(t,{tone:s==="new"?"solid":"outline",children:s==="new"?"New":"Bestseller"}):null].filter(Boolean);return h(x,{children:[r&&!a&&e("div",{className:`${E} pointer-events-none flex flex-col items-start gap-1`,children:r}),d.length>0&&e("div",{className:`${B} pointer-events-none flex flex-col items-end gap-1`,children:d.map((f,g)=>e(_,{children:f},g))})]})}export{D as default};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const CARD_CHIP_ROW_CLASS = "mt-3 flex h-[26px] items-center gap-1";
|
|
2
|
+
export declare const CARD_CHIP_LIST_CLASS = "flex min-w-0 items-center gap-1 overflow-hidden";
|
|
3
|
+
export declare const CARD_CHIP_MORE_CLASS: string;
|
|
4
|
+
export declare const CARD_CHIP_SHAPE_CLASS: string;
|
|
5
|
+
export declare const CARD_CHIP_CLASS: string;
|
|
6
|
+
export interface CardSizesSettings {
|
|
7
|
+
shown?: number;
|
|
8
|
+
}
|
|
9
|
+
export default function CardSizes({ shown }: CardSizesSettings): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t,jsxs as n}from"react/jsx-runtime";import{CARD_TEXT_SIZE as c,CardControlRow as C}from"./card-row.js";import{useProductCardState as _}from"./ProductCardState.js";const f="mt-3 flex h-[26px] items-center gap-1",u="flex min-w-0 items-center gap-1 overflow-hidden",g=`shrink-0 border border-line px-2 py-0.5 font-mono ${c.labelSmall} tracking-[0.08em] text-fg-dim`,h=`border px-2 py-0.5 font-mono ${c.labelSmall} tracking-[0.08em] whitespace-nowrap`,A=`${h} border-accent/60 text-accent`,b=r=>["cursor-pointer transition-colors",h,r?"border-accent bg-accent text-bg":"border-accent/60 text-accent hover:border-accent hover:bg-accent/10"].join(" ");function R({shown:r=2}){const s=_();if(s.kind!=="tyre")return t(C,{});const{tyre:o,variants:i,detailReady:S,chosen:a,setSize:x}=s,d=S&&i.length>0,p=d?i.map(e=>e.size):o.sizes,l=p.slice(0,r),m=p.length-l.length;return t(C,{children:n("div",{children:[o.fitSize&&n("p",{className:`font-mono ${c.labelSmall} font-medium uppercase tracking-[0.14em] text-green`,children:["Fits · ",o.fitSize]}),n("div",{className:f,children:[t("div",{className:u,children:l.map(e=>d?t("button",{type:"button",title:e,"aria-label":e,"aria-pressed":a===e,onClick:()=>x(e),className:b(a===e),children:e},e):t("span",{className:A,children:e},e))}),m>0&&n("span",{className:g,children:["+",m]})]})]})})}export{A as CARD_CHIP_CLASS,u as CARD_CHIP_LIST_CLASS,g as CARD_CHIP_MORE_CLASS,f as CARD_CHIP_ROW_CLASS,h as CARD_CHIP_SHAPE_CLASS,R as default};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type TyreDetailState } from "../useTyreDetail.js";
|
|
3
|
+
import type { TyrePlpCardProps } from "../TyrePlpCard.js";
|
|
4
|
+
import { type PlpCardSelection } from "../wheels-plp/usePlpCardSelection.js";
|
|
5
|
+
import type { Tyre, TyreVariant, WheelSummary } from "../../lib/api/index.js";
|
|
6
|
+
import { type SelectionPriceDisplay } from "../../lib/wheels/price-display.js";
|
|
7
|
+
export interface WheelCardState {
|
|
8
|
+
readonly kind: "wheel";
|
|
9
|
+
readonly wheel: WheelSummary;
|
|
10
|
+
readonly sel: PlpCardSelection;
|
|
11
|
+
readonly currency: string;
|
|
12
|
+
readonly price: SelectionPriceDisplay;
|
|
13
|
+
readonly isSet: boolean;
|
|
14
|
+
readonly setWords: string | null;
|
|
15
|
+
readonly editing: boolean;
|
|
16
|
+
readonly notifyOpen: boolean;
|
|
17
|
+
readonly setNotifyOpen: (open: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
export type TyreCardProduct = Pick<TyrePlpCardProps, "brand" | "brandLogo" | "name" | "slug" | "sizes" | "fitSize" | "rimDiameters" | "prices" | "image">;
|
|
20
|
+
export interface TyreCardState {
|
|
21
|
+
readonly kind: "tyre";
|
|
22
|
+
readonly tyre: TyreCardProduct;
|
|
23
|
+
readonly currency: string;
|
|
24
|
+
readonly activeCurrency: string;
|
|
25
|
+
readonly pagePath: string | null;
|
|
26
|
+
readonly arm: () => void;
|
|
27
|
+
readonly detailState: TyreDetailState;
|
|
28
|
+
readonly detail: Tyre | null;
|
|
29
|
+
readonly variants: readonly TyreVariant[];
|
|
30
|
+
readonly chosen: string | null;
|
|
31
|
+
readonly setSize: (size: string) => void;
|
|
32
|
+
readonly variant: TyreVariant | undefined;
|
|
33
|
+
readonly canAdd: boolean;
|
|
34
|
+
readonly detailReady: boolean;
|
|
35
|
+
readonly unsellable: boolean;
|
|
36
|
+
readonly editing: boolean;
|
|
37
|
+
}
|
|
38
|
+
export type ProductCardState = WheelCardState | TyreCardState;
|
|
39
|
+
export declare function useProductCardState(): ProductCardState;
|
|
40
|
+
export declare function useWheelCardState(): WheelCardState;
|
|
41
|
+
export declare function WheelCardStateProvider({ wheel, colours, defaultFinish, editing, children, }: {
|
|
42
|
+
wheel: WheelSummary;
|
|
43
|
+
colours?: readonly string[];
|
|
44
|
+
defaultFinish?: string;
|
|
45
|
+
editing?: boolean;
|
|
46
|
+
children: ReactNode;
|
|
47
|
+
}): import("react").JSX.Element;
|
|
48
|
+
export declare function TyreCardStateProvider({ tyre, currency, editing, children, }: {
|
|
49
|
+
tyre: TyreCardProduct;
|
|
50
|
+
currency: string;
|
|
51
|
+
editing?: boolean;
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as v}from"react/jsx-runtime";import{createContext as k,useCallback as z,useContext as A,useMemo as W,useState as p}from"react";import{useCurrency as P}from"../CurrencyContext.js";import{useTyreDetail as b}from"../useTyreDetail.js";import{usePlpCardSelection as B}from"../wheels-plp/usePlpCardSelection.js";import{tyrePagePath as T}from"../../lib/tyres/tyre-page-path.js";import{canOrderTyreVariant as j}from"../../lib/tyres/tyre-purchase.js";import{resolveSelectionPrice as E}from"../../lib/wheels/price-display.js";import{setBuildLabel as L,setIsWide as N,summarySetBuild as R}from"../../lib/wheels/set-mode.js";const y=k(null);function V(){const e=A(y);if(!e)throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return e}function K(){const e=V();if(e.kind!=="wheel")throw new Error("A wheel card piece was drawn on a tyre card.");return e}const _=[];function Q({wheel:e,colours:c=_,defaultFinish:i,editing:l=!1,children:a}){const{currency:t}=P(),r=B(e,c,i),[d,u]=p(!1),s=R(e),n={kind:"wheel",wheel:e,sel:r,currency:t,price:E(e,r.selectedVariant,t,1),isSet:N(s),setWords:L(s),editing:l,notifyOpen:d,setNotifyOpen:u};return v(y.Provider,{value:n,children:a})}function X({tyre:e,currency:c,editing:i=!1,children:l}){const{currency:a}=P(),{slug:t}=e,r=T(t),[d,u]=p(!1),s=z(()=>{t&&u(!0)},[t]),{state:n,tyre:m}=b(t??null,d),o=W(()=>m?.variants??[],[m]),[h,x]=p(null),w=o.length===1?o[0].size:null,C=h??w,f=o.find(g=>g.size===C),S=n==="ready",O={kind:"tyre",tyre:e,currency:c,activeCurrency:a,pagePath:r,arm:s,detailState:n,detail:m,variants:o,chosen:C,setSize:x,variant:f,canAdd:f!=null&&j(f,a),detailReady:S,unsellable:!r||n==="error"||S&&o.length===0,editing:i};return v(y.Provider,{value:O,children:l})}export{X as TyreCardStateProvider,Q as WheelCardStateProvider,V as useProductCardState,K as useWheelCardState};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type CardLook = "catalog" | "compact";
|
|
3
|
+
export declare const CARD_TEXT_SIZE: {
|
|
4
|
+
readonly headingSmall1: "text-[length:var(--size-headingSmall,22px)]";
|
|
5
|
+
readonly headingSmall2: "text-[length:var(--size-headingSmall,30px)]";
|
|
6
|
+
readonly labelSmall: "text-[length:var(--size-label,11px)]";
|
|
7
|
+
readonly label: "text-[length:var(--size-label,12px)]";
|
|
8
|
+
readonly labelLarge: "text-[length:var(--size-label,13px)]";
|
|
9
|
+
};
|
|
10
|
+
export declare const CardLookContext: import("react").Context<CardLook>;
|
|
11
|
+
export declare function useCatalogCard(): boolean;
|
|
12
|
+
export declare function CardRow({ children }: {
|
|
13
|
+
children?: ReactNode;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
export declare function CardControlRow({ children }: {
|
|
16
|
+
children?: ReactNode;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
export declare function CardButtonRow({ children }: {
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t,Fragment as r}from"react/jsx-runtime";import{createContext as n,useContext as o}from"react";const c={headingSmall1:"text-[length:var(--size-headingSmall,22px)]",headingSmall2:"text-[length:var(--size-headingSmall,30px)]",labelSmall:"text-[length:var(--size-label,11px)]",label:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"},i=n("catalog");function s(){return o(i)==="catalog"}function a({children:e}){const l=s();return t(r,{children:e??(l?t("div",{"aria-hidden":!0}):null)})}function g({children:e}){return t(a,{children:e?t("div",{className:"relative z-10",children:e}):null})}function u({children:e}){return t(a,{children:e?t("div",{className:"relative z-10 [.sf-card-rows>*>&]:self-end",children:e}):null})}export{c as CARD_TEXT_SIZE,u as CardButtonRow,g as CardControlRow,i as CardLookContext,a as CardRow,s as useCatalogCard};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
import { type CartLine } from "../CartContext.js";
|
|
3
|
+
import type { TyreSummary } from "../../lib/api/index.js";
|
|
4
|
+
import { type CartDrawerContent } from "efficient-web-builder/format/lib/content/cart-drawer";
|
|
5
|
+
export declare function CartDrawerHeader({ content, closeRef, }: {
|
|
6
|
+
content: CartDrawerContent;
|
|
7
|
+
closeRef?: RefObject<HTMLButtonElement | null>;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function CartStatusRail({ content }: {
|
|
10
|
+
content: CartDrawerContent;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
export declare function CartLines({ content, tyres, }: {
|
|
13
|
+
content: CartDrawerContent;
|
|
14
|
+
tyres: ReadonlyMap<string, TyreSummary>;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export declare function CartUpsell(): import("react").JSX.Element;
|
|
17
|
+
export declare function CartCouponRow(): import("react").JSX.Element;
|
|
18
|
+
export declare function CartTrustMarkers({ content }: {
|
|
19
|
+
content: CartDrawerContent;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
export declare function CartTotals(): import("react").JSX.Element;
|
|
22
|
+
export declare function CartActions(): import("react").JSX.Element;
|
|
23
|
+
export declare function CartLineRow({ line, tyre, onRemove, onQtyChange, }: {
|
|
24
|
+
line: CartLine;
|
|
25
|
+
tyre?: TyreSummary | null;
|
|
26
|
+
onRemove: () => void;
|
|
27
|
+
onQtyChange: (q: number) => void;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t,jsxs as a,Fragment as c}from"react/jsx-runtime";import u from"next/link";import{FREE_PRICE as b,UNPRICED_LABEL as N}from"../../lib/wheels/price-display.js";import k from"../CartLineThumbnail.js";import w from"../CouponField.js";import C from"../QuantityStepper.js";import j from"efficient-web-builder/render/components/RMark";import{lineTotal as y,useCart as d}from"../CartContext.js";import{COUPON_DEFERRED_TOTAL as B}from"../../lib/cart/coupon-preview.js";import{shippingWords as S,TAX_PENDING as T}from"../../lib/cart/shipping-status.js";import{useCurrency as g}from"../CurrencyContext.js";import{cartSubtitle as F}from"efficient-web-builder/format/lib/content/cart-drawer";function G({content:e,closeRef:r}){const{close:n,items:s}=d(),l=r;return a("header",{className:"flex flex-shrink-0 flex-col gap-4 border-b border-line px-8 pb-6 pt-8 max-[640px]:px-6 max-[640px]:pt-6 max-[640px]:pb-5",children:[a("div",{className:"flex items-center justify-between",children:[a("span",{className:"flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.3em] text-accent",children:[e.kickerBadge?t("span",{className:"border px-2 py-1 text-[10px]",style:{background:"color-mix(in oklab, var(--accent) 12%, transparent)",borderColor:"color-mix(in oklab, var(--accent) 50%, transparent)"},children:e.kickerBadge}):null,(e.kickerBadge?"· ":"")+e.kickerText]}),t("button",{ref:l,type:"button",onClick:n,"aria-label":"Close cart",className:"flex h-8 w-8 items-center justify-center border border-line text-[14px] text-fg-dim transition-colors hover:border-accent hover:text-accent",children:"✕"})]}),a("h1",{className:"font-display text-[38px] font-medium uppercase leading-[0.95] tracking-[-0.03em] max-[640px]:text-[30px]",children:[e.titleLead+" ",t("em",{className:"font-serif font-normal italic text-accent tracking-[-0.02em] normal-case",children:e.titleAccent})]}),t("p",{className:"font-serif text-[13px] italic leading-[1.5] text-fg-dim",children:F(e,s.length)})]})}function H({content:e}){const{totals:r}=d(),{activeCountry:n}=g(),s=n?.name??e.shipsToFallback,l=1+(e.leadTimeValue?1:0)+(s?1:0);return t(c,{children:a("div",{className:`grid flex-shrink-0 ${$[l-1]} gap-px border-b border-line bg-line`,children:[t(h,{label:"Items",value:a(c,{children:[t("em",{className:"font-serif font-normal italic text-accent",children:r.sets})," set",r.sets===1?"":"s"," · ",r.units," item",r.units===1?"":"s"]})}),e.leadTimeValue?t(h,{label:"Lead time",value:e.leadTimeValue}):null,s?t(h,{label:"Ships to",value:s}):null]})})}function X({content:e,tyres:r}){const{items:n,remove:s,setQty:l}=d();return t(c,{children:n.length===0?t(U,{content:e}):n.map(o=>t(_,{line:o,tyre:r.get(o.slug),onRemove:()=>s(o.id),onQtyChange:m=>l(o.id,m)},o.id))})}function Y(){const{items:e,totals:r,bundles:n}=d(),{formatMoney:s}=g(),l=new Set(e.flatMap(i=>(i.components??[]).map(x=>x.partNumber))),o=new Set(r.appliedBundles.map(i=>i.slug)),m=n.filter(i=>!o.has(i.slug)).filter(i=>i.components.some(x=>l.has(x.partNumber))).slice(0,2);return t(c,{children:m.length>0&&a("section",{className:"border-b border-line px-8 py-6 max-[640px]:px-6",style:{background:"color-mix(in oklab, var(--site-surface) 60%, transparent)"},children:[a("div",{className:"mb-4 flex items-center justify-between font-mono text-[10px] uppercase tracking-[0.3em] text-accent",children:[t("span",{children:"You may also need"}),t("span",{className:"font-display text-[11px] normal-case tracking-[0.08em] text-fg-dim",children:"Buy together, save"})]}),t("div",{className:"grid grid-cols-2 gap-2 max-[640px]:grid-cols-1",children:m.map(i=>t(R,{href:`/bundles/${i.slug}`,title:i.name,sub:E(i,r.currency,s)},i.slug))})]})})}function J(){return t(c,{children:t("section",{className:"border-b border-line px-8 py-6 max-[640px]:px-6",children:t(w,{})})})}function Z({content:e}){return t(c,{children:e.promises.length>0&&t("div",{className:"flex flex-wrap justify-center gap-5 border-b border-line px-8 pt-6 pb-8 font-mono text-[9px] uppercase tracking-[0.24em] text-fg-dim max-[640px]:px-6",children:e.promises.map(r=>t(L,{children:r},r))})})}function ee(){const{totals:e,coupon:r}=d(),{formatMoney:n}=g();return t(c,{children:a("div",{className:"flex flex-shrink-0 flex-col gap-2 border-t border-line px-8 pt-5 max-[640px]:px-6",children:[t(p,{label:`Subtotal · ${e.sets} set${e.sets===1?"":"s"}`,value:n(e.subtotal,e.currency)}),e.appliedBundles.map(s=>t(p,{label:`Bundle · ${s.name}${s.multiples>1?` ×${s.multiples}`:""}`,value:a("span",{style:{color:"var(--green)"},children:["− ",n(s.discount,e.currency)]})},s.slug)),e.discount>0&&r?.valid&&t(p,{label:`Coupon · ${r.code}`,value:a("span",{style:{color:"var(--green)"},children:["− ",n(e.discount,e.currency)]})}),r?.deferred&&t(p,{label:`Coupon · ${r.code}`,value:B}),r?.valid&&r.effects?.gift&&t(p,{label:`Free gift · ${r.effects.gift.partNumber}${r.effects.gift.quantity>1?` ×${r.effects.gift.quantity}`:""}`,value:t("span",{style:{color:"var(--green)"},children:b})}),t(p,{label:"Shipping",value:e.shippingStatus==="free"?t("span",{style:{color:"var(--green)"},children:b}):S(e.shippingStatus)??n(e.shipping,e.currency)}),e.tax&&(e.tax.charged?t(p,{label:e.tax.inclusive?`${e.tax.name} included · ${e.tax.rate}%`:e.tax.name,value:n(e.tax.amount,e.currency)}):e.tax.name?t(p,{label:e.tax.name,value:T}):null),a("div",{className:"mt-2 flex items-center justify-between border-t border-line pt-4 text-fg",children:[a("span",{className:"font-display text-[22px] font-medium tracking-[-0.02em] normal-case",children:["Total ",t("em",{className:"font-serif font-normal italic text-accent",children:"due"})]}),t("span",{className:"text-right font-display text-[30px] font-medium tracking-[-0.025em] text-fg",children:e.repricing?"…":n(e.grand,e.currency)})]})]})})}function te(){const{items:e,close:r}=d();return t(c,{children:a("div",{className:"flex flex-shrink-0 flex-col gap-3 px-8 pb-6 pt-4 max-[640px]:px-6",children:[a(u,{href:"/checkout",onClick:r,"aria-disabled":e.length===0,className:["group flex items-center justify-between border px-5 py-5 font-mono text-[12px] uppercase tracking-[0.3em] transition-colors",e.length===0?"pointer-events-none cursor-not-allowed border-line bg-surface text-fg-dim":"border-btn bg-btn text-btn-ink hover:border-fg hover:bg-fg"].join(" "),children:["Begin checkout",t("span",{className:"transition-transform group-hover:translate-x-1",children:"→"})]}),t("div",{className:"flex items-center justify-between px-1 py-2 font-mono text-[10px] uppercase tracking-[0.24em] text-fg-dim",children:t(u,{href:"/wheels",onClick:r,className:"text-fg transition-colors hover:text-accent",children:"← Keep browsing"})})]})})}const $=["grid-cols-1","grid-cols-2","grid-cols-3"];function h({label:e,value:r}){return a("div",{className:"flex flex-col gap-1 bg-bg px-4 py-4",children:[t("span",{className:"font-mono text-[9px] uppercase tracking-[0.26em] text-fg-dim",children:e}),t("span",{className:"font-display text-[14px] font-medium tracking-[-0.005em] text-fg",children:r})]})}function _({line:e,tyre:r,onRemove:n,onQtyChange:s}){const{catalog:l,totals:o}=d(),m=(e.components??[]).reduce((f,v)=>f+(o.freeUnitsByPartNumber[v.partNumber]??0),0),{currency:i,formatMoney:x}=g();return a(c,{children:[a("article",{className:"grid grid-cols-[96px_1fr] gap-5 border-b border-line px-8 py-6 transition-colors hover:bg-[color-mix(in_oklab,var(--site-surface)_60%,transparent)] max-[640px]:grid-cols-[78px_1fr] max-[640px]:px-6 max-[640px]:py-5",children:[t(k,{line:e,catalog:l,tyre:r}),a("div",{className:"flex min-w-0 flex-col gap-2",children:[a("div",{className:"flex items-start justify-between gap-3",children:[a("span",{className:"font-mono text-[9px] uppercase tracking-[0.26em] text-accent",children:["N° ",e.positionNo," · ",e.process==="FusionForge®"?a(c,{children:["FusionForge",t(j,{})]}):e.process]}),t("span",{className:"whitespace-nowrap font-display text-[16px] font-medium tracking-[-0.015em] text-fg",children:y(e,i)===null?N:x(y(e,i),i)})]}),a("h3",{className:"mt-0.5 font-display text-[22px] font-medium uppercase leading-none tracking-[-0.02em]",children:[e.name.lead,t("em",{className:"font-serif font-normal italic text-accent tracking-[-0.01em] normal-case",children:e.name.accent})]}),e.config.length>0&&a("div",{className:"mt-1 flex flex-wrap gap-2",children:[e.config.map(f=>t("span",{className:["border px-2 py-1 font-mono text-[9px] uppercase tracking-[0.18em]",f.gold?"border-[color-mix(in_oklab,var(--accent)_45%,var(--site-line))] text-accent":"border-line text-fg-dim"].join(" "),children:f.label},f.label)),m>0&&a("span",{className:"border border-accent bg-accent px-2 py-1 font-mono text-[9px] uppercase tracking-[0.18em] text-bg",children:[m,"× free"]})]}),a("div",{className:"mt-3 flex items-center justify-between gap-3",children:[t(C,{value:e.qty,onChange:s,size:"small"}),a("div",{className:"flex gap-4 font-mono text-[10px] uppercase tracking-[0.22em]",children:[t(u,{href:e.href??`/wheels/${e.slug}`,className:"text-fg-dim transition-colors hover:text-accent",children:e.href?"View product":"Edit finish"}),t("button",{type:"button",onClick:n,className:"text-fg-dim transition-colors hover:text-alert",children:"Remove"})]})]})]})]}),e.verifiedFor&&a("div",{className:"mx-8 -mt-px flex items-start gap-3 border-t-0 px-4 py-4 font-display text-[13px] leading-[1.45] text-fg max-[640px]:mx-6",style:{background:"color-mix(in oklab, var(--accent) 8%, transparent)",border:"1px solid color-mix(in oklab, var(--accent) 35%, var(--site-line))",borderTop:"0"},children:[t("span",{className:"flex-shrink-0 pt-px font-mono text-[10px] uppercase tracking-[0.24em] text-accent",children:"Fits"}),a("span",{children:["Verified for your ",t("strong",{className:"font-medium text-accent",children:e.verifiedFor}),". Final torque values shipped with the wheels."]})]})]})}function R({title:e,sub:r,href:n}){return a(u,{href:n,className:"flex items-center justify-between border border-line bg-bg px-4 py-3 text-left transition-colors hover:border-accent",children:[a("span",{className:"flex min-w-0 flex-col gap-1",children:[t("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap font-display text-[13px] font-medium tracking-[-0.005em] text-fg",children:e}),t("span",{className:"font-mono text-[9px] uppercase tracking-[0.22em] text-fg-dim",children:r})]}),t("span",{className:"ml-2 flex h-6 w-6 flex-shrink-0 items-center justify-center font-mono text-[13px] text-accent",style:{borderColor:"color-mix(in oklab, var(--accent) 45%, var(--site-line))",borderWidth:1,borderStyle:"solid"},children:"+"})]})}function E(e,r,n){const s=e.savings[r];if(s===void 0)return"Buy together";const l=n(s,r);return e.savingIsFrom?`Save from ${l}`:`Save ${l}`}function L({children:e}){return t("span",{className:"inline-flex items-center gap-2 before:text-[6px] before:text-accent before:content-['●']",children:e})}function p({label:e,value:r}){return a("div",{className:"flex items-center justify-between font-mono text-[11px] uppercase tracking-[0.18em] text-fg-dim",children:[t("span",{children:e}),t("strong",{className:"font-display text-[14px] font-normal tracking-[-0.005em] normal-case text-fg",children:r})]})}function U({content:e}){return a("div",{className:"flex flex-col items-center justify-center gap-3 px-8 py-20 text-center",children:[t("span",{className:"font-mono text-[10px] uppercase tracking-[0.3em] text-accent",children:e.emptyKicker}),t("p",{className:"font-serif text-[16px] italic leading-[1.5] text-fg-dim",children:e.emptyBody}),a(u,{href:"/wheels",className:"mt-3 inline-flex items-center gap-3 border border-line px-5 py-3 font-mono text-[11px] uppercase tracking-[0.3em] text-fg transition-colors hover:border-accent hover:text-accent",children:["Browse the catalog ",t("span",{className:"text-accent",children:"→"})]})]})}export{te as CartActions,J as CartCouponRow,G as CartDrawerHeader,_ as CartLineRow,X as CartLines,H as CartStatusRail,ee as CartTotals,Z as CartTrustMarkers,Y as CartUpsell};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as r}from"react/jsx-runtime";import c,{EU_LABEL_BAND as m,EuTyreLabelGrades as d}from"../EuTyreLabels.js";import p from"../SectionBand.js";import a from"./KindGate.js";import{useEuTyreLabels as f}from"../useEuTyreLabels.js";import{useCurrentProduct as y}from"../../lib/puck/current-product.js";import{useSampleProduct as b}from"./useSampleProduct.js";import{say as E}from"efficient-web-builder/format/lib/editor-words";const s=["tyre"];function L(e){return r(a,{kinds:s,type:"EuTyreLabel",editing:e.editing,children:r(T,{...e})})}function T({num:e,editing:t=!1}){const n=l(t);return n.length===0&&t?r(p,{className:m,children:r(i,{})}):r(c,{labels:n,num:e??"",capped:!1})}function _({editing:e=!1}){return r(a,{kinds:s,type:"EuTyreLabel",editing:e,children:r(h,{editing:e})})}function h({editing:e}){const t=l(e);return t.length===0?e?r(i,{}):null:r(d,{labels:t})}function l(e){const t=y(),n=b(e&&!t),o=t?.product??n,u=o?.kind==="tyre"?o.source.variants:[];return f(u)}function i(){return r("p",{className:"font-mono text-[length:var(--size-label,13px)] uppercase tracking-[0.18em] text-fg-dim",children:E("The EU label appears here for every size with an EPREL registration number. It is read live from the registry and never stored.")})}export{_ as DynamicEuTyreLabelBlock,L as default,s as supportedKinds};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HeroGalleryMode, HeroImageFit } from "../../lib/sections/hero-gallery.js";
|
|
2
|
+
interface GalleryLook {
|
|
3
|
+
galleryMode?: HeroGalleryMode;
|
|
4
|
+
imageFit?: HeroImageFit;
|
|
5
|
+
}
|
|
6
|
+
export default function DynamicProductGallery({ editing, ...look }: {
|
|
7
|
+
editing?: boolean;
|
|
8
|
+
} & GalleryLook): import("react").JSX.Element | null;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as e,Fragment as s,jsxs as c}from"react/jsx-runtime";import l from"../ProductGallery.js";import a from"../ProductLightbox.js";import{SECTION_NOTICE_TEXT_CLASS as p}from"../SectionNotice.js";import{heroView as d}from"../product-hero/hero-view.js";import{useIsLightTheme as f}from"../useIsLightTheme.js";import{useLightbox as g}from"../useLightbox.js";import{useProductSelection as x}from"../useProductSelection.js";import{useCurrentProduct as h}from"../../lib/puck/current-product.js";import{say as L}from"efficient-web-builder/format/lib/editor-words";import{useSampleProduct as S}from"./useSampleProduct.js";function b({editing:o=!1,...t}){const r=h();return r?e(n,{product:r.product,selection:r.selection,onLightbox:r.openLightbox,editing:o,...t}):o?e(y,{...t}):null}function n({product:o,selection:t,onLightbox:r,editing:i,...u}){const m=f();return e(l,{product:o,view:d(o,t,i),angleIdx:t.angleIdx,onSelect:t.setAngleIdx,isLight:m,onLightbox:r,...u})}function y(o){const t=S(!0);return t?e(I,{product:t,...o}):e("p",{className:p,children:L("Loading sample product…")})}function I({product:o,...t}){const r=x(o,{editing:!0}),i=g();return c(s,{children:[e(n,{product:o,selection:r,onLightbox:i.open,editing:!0,...t}),e(a,{item:i.item,onClose:i.close})]})}export{b as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as l,useLayoutEffect as R,useRef as H,useState as m}from"react";import{HEADER_DRAWN_HEIGHT_VAR as v,HEADER_SET_HEIGHT_VAR as _}from"efficient-web-builder/render/lib/puck/header-clearance";import{fitHeaderToRow as w}from"../lib/header-fit.js";function z({stickyMode:u,heightPx:f}){const s=H(null),[E,b]=m(!1),[p,a]=m(!1);return l(()=>{const e=s.current?.ownerDocument?.defaultView??window,r=f;let n=e.scrollY;function o(){const t=e.scrollY;b(t>10),u==="on_scroll_up"&&(t<=r?a(!1):t>n+4?a(!0):t<n-4&&a(!1)),n=t}return o(),e.addEventListener("scroll",o,{passive:!0}),()=>e.removeEventListener("scroll",o)},[u,f]),l(()=>{u!=="on_scroll_up"&&a(!1)},[u]),l(()=>{const e=s.current?.ownerDocument?.documentElement;e&&e.style.setProperty(_,`${f}px`)},[f]),l(()=>{const e=s.current,r=e?.ownerDocument,n=r?.defaultView;if(!e||!r||!n)return;let o="";const t=d=>{const c=`${Math.round(d)}px`;c!==o&&(o=c,r.documentElement.style.setProperty(v,c),r.body?.style.setProperty(v,c))};if(typeof n.ResizeObserver!="function"){t(e.getBoundingClientRect().height);return}const i=new n.ResizeObserver(d=>{const c=d[0]?.borderBoxSize?.[0];t(c?c.blockSize:e.getBoundingClientRect().height)});return i.observe(e),()=>i.disconnect()},[]),l(()=>{const e=s.current?.ownerDocument?.documentElement;e&&e.setAttribute("data-header-sticky",u)},[u]),R(()=>{s.current&&w(s.current)}),l(()=>{const e=s.current,r=e?.ownerDocument,n=r?.defaultView;if(!e||!r||!n)return;let o=!0;const t=()=>{o&&w(e)};e.addEventListener("load",t,!0),r.fonts?.ready.then(t,()=>{});const i=typeof n.ResizeObserver=="function"?new n.ResizeObserver(t):null;return i?.observe(e),()=>{o=!1,e.removeEventListener("load",t,!0),i?.disconnect()}},[]),{headerRef:s,scrolled:E,navHidden:p}}export{z as useHeaderBar};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useIsLightTheme(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{useEffect as u,useState as o}from"react";function i(){const[n,s]=o(!1);return u(()=>{const t=()=>{s(document.documentElement.getAttribute("data-theme")==="light")};t();const e=new MutationObserver(t);return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()},[]),n}export{i as useIsLightTheme};
|
|
@@ -20,6 +20,7 @@ export interface AlloyWheelsListingProps {
|
|
|
20
20
|
showInStock?: boolean;
|
|
21
21
|
kinds?: string[];
|
|
22
22
|
products?: ProductSummary[];
|
|
23
|
+
requestQuery?: string;
|
|
23
24
|
wheels?: WheelSummary[];
|
|
24
25
|
editing?: boolean;
|
|
25
26
|
coverIndex?: number;
|
|
@@ -39,4 +40,4 @@ export declare const PLP_GATE_DEFAULTS: {
|
|
|
39
40
|
readonly heading: "Let's find wheels that fit your car.";
|
|
40
41
|
readonly intro: "Tell us what you drive and we'll show you every set that bolts straight on — bolt pattern, offset and hub bore checked for you.";
|
|
41
42
|
};
|
|
42
|
-
export default function AlloyWheelsListing({ heading, intro, askForCar, gateHeading, gateIntro, perPage, columns, defaultSort, hiddenFacets, fieldUsage, showPrice, showInStock, kinds, products, wheels, editing, coverIndex, cardImage, spinOnHover, imageBackground, showBadge, showCardSizes, showCardBuy, showCardPage, showCardPrice, showCardFinishes, outline, indexBadge, titleLevel, }: AlloyWheelsListingProps): import("react").JSX.Element | null;
|
|
43
|
+
export default function AlloyWheelsListing({ heading, intro, askForCar, gateHeading, gateIntro, perPage, columns, defaultSort, hiddenFacets, fieldUsage, showPrice, showInStock, kinds, products, wheels, requestQuery, editing, coverIndex, cardImage, spinOnHover, imageBackground, showBadge, showCardSizes, showCardBuy, showCardPage, showCardPrice, showCardFinishes, outline, indexBadge, titleLevel, }: AlloyWheelsListingProps): import("react").JSX.Element | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as r,jsxs as s,Fragment as se}from"react/jsx-runtime";import{LISTING_CARD_SHOW as B}from"../../lib/sections/card-show-defaults.js";import{useCallback as d,useEffect as Je,useId as Qe,useMemo as l,useRef as Ze,useState as et}from"react";import{CARD_IMAGE_BG_OFF as tt,resolveCardImageBackground as ot}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as rt}from"efficient-web-builder/format/lib/content/card-image-shape";import{cardIndexCss as nt,DEFAULT_CARD_INDEX_FORMAT as st,DEFAULT_CARD_OUTLINE as it}from"efficient-web-builder/format/lib/sections/product-card-style";import{answersForKind as ie}from"../../lib/content/field-usage.js";import{useCurrency as lt}from"../CurrencyContext.js";import at from"../NoCurrencyNote.js";import{usePreviewDevice as ct}from"efficient-easel/screen/components/PreviewDeviceContext";import{renderGold as pt,renderHeadline as dt}from"efficient-web-builder/render/components/goldPhrases";import{useUnifiedProductCatalog as mt}from"../useProductCatalog.js";import{scrollBehavior as ht}from"efficient-web-builder/render/components/useReducedMotion";import{normalizePlpColumns as ut,PLP_GRID_GAP_VAR as ft,plpGridVars as gt}from"../../lib/wheels/plp-grid.js";import{plpCardImageSizes as yt}from"../../lib/sections/card-image-sizes.js";import{CARD_ROWS_GRID_CLASS as xt,cardRowsGridStyle as St}from"../WheelCardFrame.js";import{applyPlpFilters as wt,asPlpSortKey as bt,buildPlpFacets as Ct,buildPlpTypeOptions as Nt,buildTyreSizeBoxes as vt,EMPTY_PLP_FILTERS as le,hasActivePlpFilters as Pt,paginatePlp as kt,pickTyreSize as _t,plpTyreSizeBoxesShown as Tt,plpInStockCount as At,plpOpeningSort as zt,plpPriceBounds as Ft,plpShownKinds as It,plpSortKeysFor as Ot,PLP_SORT_LABELS as Bt}from"../../lib/wheels/plp-filters.js";import{itemKind as z,itemSlug as L,itemTyreSizes as Lt,plpBrandVaries as Vt,plpProcessVaries as Rt,plpItemsOfKinds as Et,plpKindNoun as V,resolvePlpKinds as Dt}from"../../lib/catalog/plp-item.js";import{plpGateWords as Kt,plpVehicleCopy as jt}from"../../lib/catalog/plp-vehicle-copy.js";import{oemBadgeSize as Gt,oemTyreSizes as Mt}from"../../lib/tyres/tyre-vehicle-fitment.js";import $t from"../TyreSummaryCard.js";import{wheelsFittingVehicle as Wt}from"../../lib/wheels/plp-fitment-match.js";import Ht from"./PlpActiveChips.js";import{DEFAULT_COVER_INDEX as Ut}from"../../lib/wheels/cover-rendering.js";import Xt from"./PlpCard.js";import Yt from"./PlpPagination.js";import qt from"./PlpSidebar.js";import Jt from"./PlpVehicleBar.js";import Qt from"./PlpVehicleGate.js";import{useVehicleCatalog as Zt}from"./useVehicleCatalog.js";import{useVehicleFit as eo}from"../fitment/useVehicleFit.js";import{usePlpFiltersInUrl as to}from"./usePlpFiltersInUrl.js";import{say as R}from"efficient-web-builder/format/lib/editor-words";const Do={heading:"Let's find wheels that fit your car.",intro:"Tell us what you drive and we'll show you every set that bolts straight on — bolt pattern, offset and hub bore checked for you."};function oo({level:C,className:N,children:v}){return r(C===2?"h2":"h1",{className:N,children:v})}const ro=[];function no({heading:C="",intro:N="",askForCar:v=!0,gateHeading:E="",gateIntro:ae="",perPage:D=24,columns:ce,defaultSort:pe="recommended",hiddenFacets:de=[],fieldUsage:g=ro,showPrice:K=!0,showInStock:me=!0,kinds:he,products:ue,wheels:fe,editing:m=!1,coverIndex:ge=Ut,cardImage:ye,spinOnHover:xe=!1,imageBackground:Se,showBadge:we=!0,showCardSizes:be,showCardBuy:Ce,showCardPage:Ne,showCardPrice:ve,showCardFinishes:Pe,outline:ke=it,indexBadge:j=st,titleLevel:_e}){const{currency:a}=lt(),Te=ot(Se,tt),h=Dt(he),G=ct(),M=ut(ce),Ae=gt(M,m?G:null),ze=yt(M,m?G:null),$=`plp-${Qe().replace(/:/g,"")}`,F=nt($,j),Fe=mt(),W=ue??fe??Fe??[],H=l(()=>Et(W,h),[W,h.join(",")]),o=eo({editing:m,enabled:v,autoApply:!0}),[Ie,I]=et(!1),Oe=zt(pe,h),y=o.applied?.vehicle??null,[t,w]=to({editing:m,openingSort:Oe,appliedVehicle:y,vehicleRestored:o.restored}),p=It(h,t.kind),i=d(e=>w(e),[w]),U=d((e,u)=>{const c=t[e],Ye=c.map(String).includes(u)?c.filter(qe=>String(qe)!==u):[...c,e==="diameters"?Number(u):u];i({...t,[e]:Ye,page:1})},[t,i]),X=d(e=>i({...t,priceMax:e,page:1}),[t,i]),Y=d(e=>i({...t,inStockOnly:e,page:1}),[t,i]),q=d(e=>i({...le,kind:e,inStockOnly:t.inStockOnly,priceMax:t.priceMax,sort:t.sort}),[t.inStockOnly,t.priceMax,t.sort,i]),Be=d(e=>i({...t,sort:e,page:1}),[t,i]),Le=d(e=>{i({...t,page:e}),typeof window<"u"&&window.scrollTo({top:0,behavior:ht()})},[t,i]),J=d(()=>i({...le,sort:t.sort}),[t.sort,i]),{clear:k}=o,Q=d(()=>{k(),I(!0),w(e=>({...e,page:1}))},[k]),Ve=d(()=>{k(),I(!1),w(e=>({...e,page:1}))},[k]),_=y?[y.make,y.model,y.year,y.modification].join("|"):"",T=Ze(null);Je(()=>{if(o.restored){if(T.current===null){T.current=_;return}T.current!==_&&(T.current=_,w(e=>e.page===1?e:{...e,page:1}))}},[o.restored,_,w]);const A=Zt({catalog:H,shownKinds:h,vehicle:y,editing:m}),n=l(()=>{if(!o.fit)return A;const e=A.filter(c=>z(c)==="alloy-wheel"),u=new Set(Wt(e,o.fit).map(c=>c.slug));return A.filter(c=>z(c)!=="alloy-wheel"||u.has(L(c)))},[A,o.fit]),b=de.join(","),Re=l(()=>{const e=new Set(b?b.split(","):[]);return Ct(n,t,a,p,g).filter(u=>!e.has(u.key))},[n,t,a,b,p.join(","),g]),x=l(()=>wt(n,t,a),[n,t,a]),Z=p.length>1,Ee=l(()=>ie(g,"alloy-wheel"),[g]),De=l(()=>ie(g,"tyre"),[g]),ee=l(()=>Vt(x),[x]),Ke=l(()=>Rt(x),[x]),je=l(()=>K?Ft(n,a):null,[n,a,K]),Ge=l(()=>At(n,t,a),[n,t,a]),Me=l(()=>Nt(n,h,t,a),[n,h.join(","),t,a]),$e=d((e,u)=>{const c=_t(n.flatMap(Lt),t.tyreSizes[0]??"",e,u);i({...t,tyreSizes:c?[c]:[],page:1})},[n,t,i]),We=l(()=>{const e=new Set(b?b.split(","):[]);return!Tt(n,p)||e.has("tyreSizes")?null:vt(n,t,a)},[n,t,a,b,p.join(","),g]),f=l(()=>kt(x,t.page,D),[x,t.page,D]),S=V(p),O=jt(p),te=Kt(E,ae,p,h),oe=p.length===1&&p[0]==="tyre",re=o.applied?.stock??null,P=l(()=>Mt(re),[re]),He=l(()=>n.filter(e=>p.includes(z(e))).length,[n,p.join(",")]),ne=H.length===0,Ue=!ne&&n.length===0,Xe=v&&!m&&!o.applied&&!Ie;return h.length===0?null:s("section",{style:rt(ye),children:[v&&r(Jt,{cascade:o.cascade,appliedName:o.appliedName,fit:o.fit,fitSummary:oe&&P.length>0?`Takes ${P.join(" · ")}`:null,resolving:o.resolving,unresolved:oe?!!o.applied&&!o.resolving&&P.length===0:o.unresolved,matchCount:He,copy:O,onAmend:Ve,onClear:Q}),Xe&&r(Qt,{cascade:o.cascade,heading:te.heading,intro:te.intro,ready:o.restored,copy:O,onSkip:()=>I(!0)}),s("div",{className:"px-5 py-10 md:px-[max(2.5rem,calc((100%_-_var(--sf-content-cap,100%))/2_+_2.5rem))]",children:[(C||N)&&s("header",{className:"mb-6",children:[C&&r(oo,{level:_e,className:"font-display text-[clamp(28px,4vw,40px)] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[1.05] tracking-[-0.02em]",children:dt(C,!1)}),N&&r("p",{className:"mt-2 max-w-[60ch] text-[15px] text-fg-dim",children:pt(N)})]}),s("div",{className:"flex flex-col gap-8 lg:flex-row lg:items-start",children:[r(qt,{facets:Re,filters:t,typeOptions:Me,sizeBoxes:We,sizeMatches:t.tyreSizes.length>0?x.length:null,noun:S,priceBounds:je,inStockCount:me?Ge:null,onToggle:U,onPickType:q,onPickSize:$e,onPriceMax:X,onInStockOnly:Y,onClearAll:J}),s("div",{className:"min-w-0 flex-1",children:[s("div",{className:"mb-4 flex min-h-[34px] flex-wrap items-center justify-between gap-x-4 gap-y-2 border-b border-line pb-3",children:[s("div",{className:"flex min-w-0 flex-1 flex-wrap items-center gap-x-4 gap-y-2",children:[r("p",{className:"font-mono text-[12px] tabular-nums tracking-[0.08em]",children:f.total===0?s("span",{className:"text-fg-dim",children:["No ",S.many]}):s(se,{children:[s("span",{children:[f.from,"–",f.to]}),s("span",{className:"text-fg-dim",children:[" of ",f.total," ",S.many]})]})}),r(Ht,{filters:t,onToggle:U,onPriceMax:X,onInStockOnly:Y,onPickType:q})]}),s("label",{className:"flex items-center gap-2 font-mono text-[11px] uppercase tracking-[0.16em] text-fg-dim",children:["Sort by",r("select",{value:t.sort,onChange:e=>Be(bt(e.target.value)),className:"cursor-pointer border border-line bg-transparent px-2 py-2 font-mono text-[12px] normal-case tracking-normal text-fg",children:Ot(h).map(e=>r("option",{value:e,children:Bt[e]},e))})]})]}),ne?r("div",{className:"border border-dashed border-line p-10",children:r("p",{className:"font-mono text-[12px] uppercase tracking-[0.16em] text-fg-dim",children:m?S.many==="wheels"?R("No wheels in this website's catalog yet — curate products to see them here."):S.many==="tyres"?R("No tyres in this website's catalog yet — curate products to see them here."):R("No products in this website's catalog yet — curate products to see them here."):"Our catalog is being updated. Please check back shortly."})}):Ue?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No confirmed fit for your ",o.appliedName]}),r("p",{className:"mt-2 max-w-[52ch] text-[14px] text-fg-dim",children:O.nothingFits}),s("button",{type:"button",onClick:Q,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:["Show all ",S.many]})]}):f.total===0?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No ",S.many," match those filters"]}),r("p",{className:"mt-2 max-w-[46ch] text-[14px] text-fg-dim",children:"Try widening the price range or clearing a filter."}),Pt(t)&&r("button",{type:"button",onClick:J,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:"Clear all filters"})]}):s(se,{children:[F&&r("style",{children:F}),r("div",{className:`${F?`${$} plp-card-grid`:"plp-card-grid"} ${xt}`,style:{...Ae,...St(`var(${ft})`)},children:f.items.map(e=>z(e)==="tyre"?r($t,{item:e,currency:a,fitSize:P.length>0?Gt(e.sizes,P):null,kindLabel:Z?V(["tyre"]).one:null,showBrand:ee,editing:m,fieldUsage:De},`tyre:${L(e)}`):r(Xt,{wheel:e,colours:t.finishes,fit:o.fit,editing:m,kindLabel:Z?V(["alloy-wheel"]).one:null,showBrand:ee,coverIndex:ge,fieldUsage:Ee,showProcess:Ke,spinOnHover:xe,imageBackgroundFill:Te,showBadge:we,outline:ke,indexBadge:j,showCardSizes:be??B.showCardSizes,showCardBuy:Ce??B.showCardBuy,showCardPage:Ne??B.showCardPage,showCardPrice:ve??!0,showCardFinishes:Pe??!0,imageSizes:ze},`wheel:${L(e)}`))})]}),r(Yt,{page:f.page,pageCount:f.pageCount,onPage:Le}),r(at,{editing:m})]})]})]})]})}export{Do as PLP_GATE_DEFAULTS,no as default};
|
|
1
|
+
"use client";import{jsx as r,jsxs as s,Fragment as se}from"react/jsx-runtime";import{LISTING_CARD_SHOW as B}from"../../lib/sections/card-show-defaults.js";import{useCallback as d,useEffect as Qe,useId as Ze,useMemo as l,useRef as et,useState as tt}from"react";import{CARD_IMAGE_BG_OFF as ot,resolveCardImageBackground as rt}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as nt}from"efficient-web-builder/format/lib/content/card-image-shape";import{cardIndexCss as st,DEFAULT_CARD_INDEX_FORMAT as it,DEFAULT_CARD_OUTLINE as lt}from"efficient-web-builder/format/lib/sections/product-card-style";import{answersForKind as ie}from"../../lib/content/field-usage.js";import{useCurrency as at}from"../CurrencyContext.js";import ct from"../NoCurrencyNote.js";import{usePreviewDevice as pt}from"efficient-easel/screen/components/PreviewDeviceContext";import{renderGold as dt,renderHeadline as mt}from"efficient-web-builder/render/components/goldPhrases";import{useUnifiedProductCatalog as ht}from"../useProductCatalog.js";import{scrollBehavior as ut}from"efficient-web-builder/render/components/useReducedMotion";import{normalizePlpColumns as ft,PLP_GRID_GAP_VAR as gt,plpGridVars as yt}from"../../lib/wheels/plp-grid.js";import{plpCardImageSizes as xt}from"../../lib/sections/card-image-sizes.js";import{CARD_ROWS_GRID_CLASS as St,cardRowsGridStyle as wt}from"../WheelCardFrame.js";import{applyPlpFilters as bt,asPlpSortKey as Ct,buildPlpFacets as Nt,buildPlpTypeOptions as vt,buildTyreSizeBoxes as Pt,EMPTY_PLP_FILTERS as le,hasActivePlpFilters as kt,paginatePlp as _t,pickTyreSize as Tt,plpTyreSizeBoxesShown as At,plpInStockCount as zt,plpOpeningSort as Ft,plpPriceBounds as It,plpShownKinds as Ot,plpSortKeysFor as Bt,PLP_SORT_LABELS as Lt}from"../../lib/wheels/plp-filters.js";import{itemKind as z,itemSlug as L,itemTyreSizes as Vt,plpBrandVaries as Rt,plpProcessVaries as Et,plpItemsOfKinds as Dt,plpKindNoun as V,resolvePlpKinds as Kt}from"../../lib/catalog/plp-item.js";import{plpGateWords as jt,plpVehicleCopy as Gt}from"../../lib/catalog/plp-vehicle-copy.js";import{oemBadgeSize as Mt,oemTyreSizes as $t}from"../../lib/tyres/tyre-vehicle-fitment.js";import Wt from"../TyreSummaryCard.js";import{wheelsFittingVehicle as Ht}from"../../lib/wheels/plp-fitment-match.js";import Ut from"./PlpActiveChips.js";import{DEFAULT_COVER_INDEX as Xt}from"../../lib/wheels/cover-rendering.js";import Yt from"./PlpCard.js";import qt from"./PlpPagination.js";import Jt from"./PlpSidebar.js";import Qt from"./PlpVehicleBar.js";import Zt from"./PlpVehicleGate.js";import{useVehicleCatalog as eo}from"./useVehicleCatalog.js";import{useVehicleFit as to}from"../fitment/useVehicleFit.js";import{usePlpFiltersInUrl as oo}from"./usePlpFiltersInUrl.js";import{say as R}from"efficient-web-builder/format/lib/editor-words";const Ko={heading:"Let's find wheels that fit your car.",intro:"Tell us what you drive and we'll show you every set that bolts straight on — bolt pattern, offset and hub bore checked for you."};function ro({level:C,className:N,children:v}){return r(C===2?"h2":"h1",{className:N,children:v})}const no=[];function so({heading:C="",intro:N="",askForCar:v=!0,gateHeading:E="",gateIntro:ae="",perPage:D=24,columns:ce,defaultSort:pe="recommended",hiddenFacets:de=[],fieldUsage:g=no,showPrice:K=!0,showInStock:me=!0,kinds:he,products:ue,wheels:fe,requestQuery:ge,editing:m=!1,coverIndex:ye=Xt,cardImage:xe,spinOnHover:Se=!1,imageBackground:we,showBadge:be=!0,showCardSizes:Ce,showCardBuy:Ne,showCardPage:ve,showCardPrice:Pe,showCardFinishes:ke,outline:_e=lt,indexBadge:j=it,titleLevel:Te}){const{currency:a}=at(),Ae=rt(we,ot),h=Kt(he),G=pt(),M=ft(ce),ze=yt(M,m?G:null),Fe=xt(M,m?G:null),$=`plp-${Ze().replace(/:/g,"")}`,F=st($,j),Ie=ht(),W=ue??fe??Ie??[],H=l(()=>Dt(W,h),[W,h.join(",")]),o=to({editing:m,enabled:v,autoApply:!0}),[Oe,I]=tt(!1),Be=Ft(pe,h),y=o.applied?.vehicle??null,[t,w]=oo({editing:m,openingSort:Be,appliedVehicle:y,vehicleRestored:o.restored,requestQuery:ge}),p=Ot(h,t.kind),i=d(e=>w(e),[w]),U=d((e,u)=>{const c=t[e],qe=c.map(String).includes(u)?c.filter(Je=>String(Je)!==u):[...c,e==="diameters"?Number(u):u];i({...t,[e]:qe,page:1})},[t,i]),X=d(e=>i({...t,priceMax:e,page:1}),[t,i]),Y=d(e=>i({...t,inStockOnly:e,page:1}),[t,i]),q=d(e=>i({...le,kind:e,inStockOnly:t.inStockOnly,priceMax:t.priceMax,sort:t.sort}),[t.inStockOnly,t.priceMax,t.sort,i]),Le=d(e=>i({...t,sort:e,page:1}),[t,i]),Ve=d(e=>{i({...t,page:e}),typeof window<"u"&&window.scrollTo({top:0,behavior:ut()})},[t,i]),J=d(()=>i({...le,sort:t.sort}),[t.sort,i]),{clear:k}=o,Q=d(()=>{k(),I(!0),w(e=>({...e,page:1}))},[k]),Re=d(()=>{k(),I(!1),w(e=>({...e,page:1}))},[k]),_=y?[y.make,y.model,y.year,y.modification].join("|"):"",T=et(null);Qe(()=>{if(o.restored){if(T.current===null){T.current=_;return}T.current!==_&&(T.current=_,w(e=>e.page===1?e:{...e,page:1}))}},[o.restored,_,w]);const A=eo({catalog:H,shownKinds:h,vehicle:y,editing:m}),n=l(()=>{if(!o.fit)return A;const e=A.filter(c=>z(c)==="alloy-wheel"),u=new Set(Ht(e,o.fit).map(c=>c.slug));return A.filter(c=>z(c)!=="alloy-wheel"||u.has(L(c)))},[A,o.fit]),b=de.join(","),Ee=l(()=>{const e=new Set(b?b.split(","):[]);return Nt(n,t,a,p,g).filter(u=>!e.has(u.key))},[n,t,a,b,p.join(","),g]),x=l(()=>bt(n,t,a),[n,t,a]),Z=p.length>1,De=l(()=>ie(g,"alloy-wheel"),[g]),Ke=l(()=>ie(g,"tyre"),[g]),ee=l(()=>Rt(x),[x]),je=l(()=>Et(x),[x]),Ge=l(()=>K?It(n,a):null,[n,a,K]),Me=l(()=>zt(n,t,a),[n,t,a]),$e=l(()=>vt(n,h,t,a),[n,h.join(","),t,a]),We=d((e,u)=>{const c=Tt(n.flatMap(Vt),t.tyreSizes[0]??"",e,u);i({...t,tyreSizes:c?[c]:[],page:1})},[n,t,i]),He=l(()=>{const e=new Set(b?b.split(","):[]);return!At(n,p)||e.has("tyreSizes")?null:Pt(n,t,a)},[n,t,a,b,p.join(","),g]),f=l(()=>_t(x,t.page,D),[x,t.page,D]),S=V(p),O=Gt(p),te=jt(E,ae,p,h),oe=p.length===1&&p[0]==="tyre",re=o.applied?.stock??null,P=l(()=>$t(re),[re]),Ue=l(()=>n.filter(e=>p.includes(z(e))).length,[n,p.join(",")]),ne=H.length===0,Xe=!ne&&n.length===0,Ye=v&&!m&&!o.applied&&!Oe;return h.length===0?null:s("section",{style:nt(xe),children:[v&&r(Qt,{cascade:o.cascade,appliedName:o.appliedName,fit:o.fit,fitSummary:oe&&P.length>0?`Takes ${P.join(" · ")}`:null,resolving:o.resolving,unresolved:oe?!!o.applied&&!o.resolving&&P.length===0:o.unresolved,matchCount:Ue,copy:O,onAmend:Re,onClear:Q}),Ye&&r(Zt,{cascade:o.cascade,heading:te.heading,intro:te.intro,ready:o.restored,copy:O,onSkip:()=>I(!0)}),s("div",{className:"px-5 py-10 md:px-[max(2.5rem,calc((100%_-_var(--sf-content-cap,100%))/2_+_2.5rem))]",children:[(C||N)&&s("header",{className:"mb-6",children:[C&&r(ro,{level:Te,className:"font-display text-[clamp(28px,4vw,40px)] [font-weight:var(--sf-heading-weight,500)] [text-transform:var(--sf-heading-case,uppercase)] leading-[1.05] tracking-[-0.02em]",children:mt(C,!1)}),N&&r("p",{className:"mt-2 max-w-[60ch] text-[15px] text-fg-dim",children:dt(N)})]}),s("div",{className:"flex flex-col gap-8 lg:flex-row lg:items-start",children:[r(Jt,{facets:Ee,filters:t,typeOptions:$e,sizeBoxes:He,sizeMatches:t.tyreSizes.length>0?x.length:null,noun:S,priceBounds:Ge,inStockCount:me?Me:null,onToggle:U,onPickType:q,onPickSize:We,onPriceMax:X,onInStockOnly:Y,onClearAll:J}),s("div",{className:"min-w-0 flex-1",children:[s("div",{className:"mb-4 flex min-h-[34px] flex-wrap items-center justify-between gap-x-4 gap-y-2 border-b border-line pb-3",children:[s("div",{className:"flex min-w-0 flex-1 flex-wrap items-center gap-x-4 gap-y-2",children:[r("p",{className:"font-mono text-[12px] tabular-nums tracking-[0.08em]",children:f.total===0?s("span",{className:"text-fg-dim",children:["No ",S.many]}):s(se,{children:[s("span",{children:[f.from,"–",f.to]}),s("span",{className:"text-fg-dim",children:[" of ",f.total," ",S.many]})]})}),r(Ut,{filters:t,onToggle:U,onPriceMax:X,onInStockOnly:Y,onPickType:q})]}),s("label",{className:"flex items-center gap-2 font-mono text-[11px] uppercase tracking-[0.16em] text-fg-dim",children:["Sort by",r("select",{value:t.sort,onChange:e=>Le(Ct(e.target.value)),className:"cursor-pointer border border-line bg-transparent px-2 py-2 font-mono text-[12px] normal-case tracking-normal text-fg",children:Bt(h).map(e=>r("option",{value:e,children:Lt[e]},e))})]})]}),ne?r("div",{className:"border border-dashed border-line p-10",children:r("p",{className:"font-mono text-[12px] uppercase tracking-[0.16em] text-fg-dim",children:m?S.many==="wheels"?R("No wheels in this website's catalog yet — curate products to see them here."):S.many==="tyres"?R("No tyres in this website's catalog yet — curate products to see them here."):R("No products in this website's catalog yet — curate products to see them here."):"Our catalog is being updated. Please check back shortly."})}):Xe?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No confirmed fit for your ",o.appliedName]}),r("p",{className:"mt-2 max-w-[52ch] text-[14px] text-fg-dim",children:O.nothingFits}),s("button",{type:"button",onClick:Q,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:["Show all ",S.many]})]}):f.total===0?s("div",{className:"border border-line p-10",children:[s("h3",{className:"font-display text-[22px] font-medium uppercase tracking-[-0.01em]",children:["No ",S.many," match those filters"]}),r("p",{className:"mt-2 max-w-[46ch] text-[14px] text-fg-dim",children:"Try widening the price range or clearing a filter."}),kt(t)&&r("button",{type:"button",onClick:J,className:"mt-4 cursor-pointer bg-btn px-4 py-3 font-mono text-[11px] font-bold uppercase tracking-[0.24em] text-btn-ink hover:bg-fg",children:"Clear all filters"})]}):s(se,{children:[F&&r("style",{children:F}),r("div",{className:`${F?`${$} plp-card-grid`:"plp-card-grid"} ${St}`,style:{...ze,...wt(`var(${gt})`)},children:f.items.map(e=>z(e)==="tyre"?r(Wt,{item:e,currency:a,fitSize:P.length>0?Mt(e.sizes,P):null,kindLabel:Z?V(["tyre"]).one:null,showBrand:ee,editing:m,fieldUsage:Ke},`tyre:${L(e)}`):r(Yt,{wheel:e,colours:t.finishes,fit:o.fit,editing:m,kindLabel:Z?V(["alloy-wheel"]).one:null,showBrand:ee,coverIndex:ye,fieldUsage:De,showProcess:je,spinOnHover:Se,imageBackgroundFill:Ae,showBadge:be,outline:_e,indexBadge:j,showCardSizes:Ce??B.showCardSizes,showCardBuy:Ne??B.showCardBuy,showCardPage:ve??B.showCardPage,showCardPrice:Pe??!0,showCardFinishes:ke??!0,imageSizes:Fe},`wheel:${L(e)}`))})]}),r(qt,{page:f.page,pageCount:f.pageCount,onPage:Ve}),r(ct,{editing:m})]})]})]})]})}export{Ko as PLP_GATE_DEFAULTS,so as default};
|
|
@@ -2,7 +2,7 @@ import type { WheelSummary } from "../../lib/api/index.js";
|
|
|
2
2
|
import { type CardIndexFormat, type CardOutline } from "efficient-web-builder/format/lib/sections/product-card-style";
|
|
3
3
|
import { type FieldUsageAnswer } from "../../lib/content/field-usage.js";
|
|
4
4
|
import { type VehicleFitment } from "../../lib/wheels/plp-fitment-match.js";
|
|
5
|
-
export
|
|
5
|
+
export interface PlpCardProps {
|
|
6
6
|
wheel: WheelSummary;
|
|
7
7
|
colours?: readonly string[];
|
|
8
8
|
fit?: VehicleFitment | null;
|
|
@@ -24,4 +24,5 @@ export default function PlpCard({ wheel, colours, fit, editing, brandPlate, kind
|
|
|
24
24
|
showCardPrice?: boolean;
|
|
25
25
|
showCardFinishes?: boolean;
|
|
26
26
|
imageSizes?: string;
|
|
27
|
-
}
|
|
27
|
+
}
|
|
28
|
+
export default function PlpCard({ wheel, colours, fit, editing, brandPlate, kindLabel, showBrand, showProcess, coverIndex, fieldUsage, spinOnHover, imageBackgroundFill, showBadge, outline, indexBadge, showCardSizes, showCardBuy, showCardPage, showCardPrice, showCardFinishes, imageSizes, }: PlpCardProps): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as o,Fragment as $,jsxs as j}from"react/jsx-runtime";import{CARD_IMAGE_SIZES as M}from"../../lib/sections/card-image-sizes.js";import{LISTING_CARD_SHOW as P}from"../../lib/sections/card-show-defaults.js";import X from"next/image";import{useState as U}from"react";import H from"../BrandPlate.js";import V,{CardBuyDialog as Z}from"../card-pieces/CardBuyButton.js";import q from"../card-pieces/CardFinishSwatches.js";import J from"../card-pieces/CardPrice.js";import K from"../card-pieces/CardProductBadge.js";import{useWheelCardState as Q,WheelCardStateProvider as Y}from"../card-pieces/ProductCardState.js";import{wheelCardEyebrow as ee,wheelCardEyebrowShows as re}from"../ProductCardEyebrow.js";import{withRMark as I}from"efficient-web-builder/render/components/RMark";import oe from"../WheelPlaceholder.js";import ae,{cardSpecFields as te}from"../WheelCardFrame.js";import{CARD_IMAGE_BG_OFF as ne}from"efficient-web-builder/format/lib/content/card-image-background";import{itemBrand as se}from"../../lib/catalog/plp-item.js";import{CARD_INDEX_BADGE_CLASS as ie,CARD_INDEX_CLASS as le,DEFAULT_CARD_INDEX_FORMAT as de,DEFAULT_CARD_OUTLINE as me}from"efficient-web-builder/format/lib/sections/product-card-style";import{applyCardAnswers as ce}from"../../lib/content/field-usage.js";import{setSecondSrc as he}from"../../lib/wheels/set-mode.js";import{PLP_GRID_GAP_VAR as ue}from"../../lib/wheels/plp-grid.js";import{FITMENT_FIELD_SEPARATOR as pe,wheelCardSpecFacts as fe}from"../../lib/wheels/plp-fitment-match.js";import{coverSrcForWheel as we,DEFAULT_COVER_INDEX as Se,resolvePaintedSrc as Ce}from"../../lib/wheels/cover-rendering.js";const ge=[];function _e({wheel:s,colours:c,fit:i=null,editing:l=!1,brandPlate:d=!1,kindLabel:h=null,showBrand:t=!0,showProcess:u=!1,coverIndex:p=Se,fieldUsage:f=ge,spinOnHover:w=!1,imageBackgroundFill:S=ne,showBadge:C=!0,outline:g=me,indexBadge:_=de,showCardSizes:E=P.showCardSizes,showCardBuy:b=P.showCardBuy,showCardPage:A=P.showCardPage,showCardPrice:e=!0,showCardFinishes:r=!0,imageSizes:m=M}){return o(Y,{wheel:s,colours:c,editing:l,children:o(Ee,{fit:i,brandPlate:d,kindLabel:h,showBrand:t,showProcess:u,coverIndex:p,fieldUsage:f,spinOnHover:w,imageBackgroundFill:S,showBadge:C,outline:g,indexBadge:_,showCardSizes:E,showCardBuy:b,showCardPage:A,showCardPrice:e,showCardFinishes:r,imageSizes:m})})}function Ee({fit:s,brandPlate:c,kindLabel:i,showBrand:l,showProcess:d,coverIndex:h,fieldUsage:t,spinOnHover:u,imageBackgroundFill:p,showBadge:f,outline:w,indexBadge:S,showCardSizes:C,showCardBuy:g,showCardPage:_,showCardPrice:E,showCardFinishes:b,imageSizes:A}){const{wheel:e,sel:r,isSet:m}=Q(),T=we(e,h,r.finish?.name,r.shownSrc,s?.holes),[R,x]=U(()=>new Set),k=a=>x(n=>n.has(a)?n:new Set(n).add(a)),F=Ce({overrideSrc:T,hookSrc:r.shownSrc,failed:R}),B=se(e),G=u?"transition-transform duration-700 [transition-timing-function:cubic-bezier(.2,.6,.2,1)] group-hover:rotate-[72deg]":"",y=(a,n)=>o(X,{src:a,alt:n,width:800,height:800,sizes:A,className:["block h-full w-full object-contain",G].filter(Boolean).join(" "),draggable:!1,onError:()=>k(a)},a),L=r.finish?`${e.name} — ${r.finish.name}`:e.name,O=F?y(F,L):o(oe,{imageLabel:e.name}),D=m?he(e.finishes?.find(a=>a.name===r.finish?.name),F):null,v=D&&!R.has(D)?y(D,`${L} — right`):void 0,N=S!=="off"?o("span",{"aria-hidden":!0,className:`${le} ${ie}`}):null,z=ce(fe(e,s,{sizes:C}),t).map(a=>a.text),W=ee({kindLabel:i,brand:l&&B?I(B):null,process:d&&e.process?I(e.process):null},t);return j($,{children:[o(ae,{href:`/wheels/${e.slug}`,wide:m,setGridGap:`var(${ue})`,identityLink:!0,containerProps:{onPointerEnter:r.arm,onTouchStart:r.arm,onFocusCapture:r.arm},probes:r.probes,outline:w,imageBackgroundFill:p,indexBadge:N,badges:o(K,{show:f,numbered:N!=null,sale:!0}),image:O,imageSecond:v,plate:c?o(H,{brand:B,logo:e.brandLogo}):null,eyebrow:W,wholeCardLink:!0,reserveEyebrow:re({kind:!!i,brand:l,process:d},t),name:I(e.name),spec:te(z,pe),price:o(J,{show:E,setTotal:!0,wasFollowsSize:!0}),swatches:o(q,{show:b,showSingle:!0}),buy:o(V,{buy:g,page:_})}),o(Z,{})]})}export{_e as default};
|
|
@@ -15,4 +15,4 @@ export interface PlpCardSelection extends FinishSelection {
|
|
|
15
15
|
canAdd: boolean;
|
|
16
16
|
unsellable: boolean;
|
|
17
17
|
}
|
|
18
|
-
export declare function usePlpCardSelection(wheel: WheelSummary, colours?: readonly string[]): PlpCardSelection;
|
|
18
|
+
export declare function usePlpCardSelection(wheel: WheelSummary, colours?: readonly string[], defaultFinish?: string): PlpCardSelection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useCallback as z,useEffect as p,useMemo as c,useRef as F,useState as V}from"react";import{useFinishSelection as
|
|
1
|
+
"use client";import{useCallback as z,useEffect as p,useMemo as c,useRef as F,useState as V}from"react";import{useFinishSelection as B}from"../useFinishSelection.js";import{useWheelDetail as E}from"../useWheelDetail.js";import{firstFinishInFamilies as L}from"../../lib/wheels/finish-colour-match.js";import{isRenderableFinish as M}from"../../lib/wheels/renderable-finishes.js";import{variantsForFinish as v}from"../../lib/wheels/variant-spec.js";import{findVariant as P,firstSellableFinishIndex as U,isOneWheelDesign as _,isVariantOutOfStock as q,outOfStockVariantsForFinish as G}from"../../lib/wheels/variants.js";const H=[];function w(s,a=H,C){const i=c(()=>s.finishes.filter(M),[s.finishes]),u=i.length>0,r=B(i,s.coverImage??null,C??s.defaultFinish??void 0),[R,W]=V(!1),A=z(()=>{u&&W(!0)},[u]),{state:f,wheel:O}=E(s.slug,R),t=c(()=>O?.variants??[],[O]),n=r.selectedIdx>=0?i[r.selectedIdx]?.name??null:null,[g,x]=V(null),{setSelectedIdx:o}=r,d=F(!1),D=z(e=>{d.current=!0,o(e)},[o]),m=a.join(","),I=F(null);p(()=>{if(I.current===m)return;I.current=m;const e=L(i,a);e<0||(d.current=!0,o(e))},[m,a,i,o]);const b=F(!1);p(()=>{if(b.current||d.current||t.length===0||!n||(b.current=!0,v(t,n).length>0))return;const e=U(t,i.map(S=>S.name),r.availability);e>=0&&o(e)},[t,n,i,r.availability,o]);const l=c(()=>v(t,n),[t,n]),k=_(s);p(()=>{x(e=>e&&l.some(S=>S.size===e)?e:k&&l.length===1?l[0].size:null)},[l,k]);const h=P(t,n,g),y=q(h),K=h!=null&&!y,N=!u||f==="error"||f==="ready"&&l.length===0,j=c(()=>G(t,n),[t,n]);return{...r,setSelectedIdx:D,finishes:i,arm:A,detailState:f,confirmedFinishName:n,sizeOptions:l,size:g,setSize:x,selectedVariant:h,outOfStock:y,outOfStockVariants:j,canAdd:K,unsellable:N}}export{w as usePlpCardSelection};
|
|
@@ -6,5 +6,6 @@ export interface PlpUrlFiltersArgs {
|
|
|
6
6
|
openingSort: PlpSortKey;
|
|
7
7
|
appliedVehicle: VehicleSelection | null;
|
|
8
8
|
vehicleRestored: boolean;
|
|
9
|
+
requestQuery?: string;
|
|
9
10
|
}
|
|
10
|
-
export declare function usePlpFiltersInUrl({ editing, openingSort, appliedVehicle, vehicleRestored, }: PlpUrlFiltersArgs): [PlpFilterState, Dispatch<SetStateAction<PlpFilterState>>];
|
|
11
|
+
export declare function usePlpFiltersInUrl({ editing, openingSort, appliedVehicle, vehicleRestored, requestQuery, }: PlpUrlFiltersArgs): [PlpFilterState, Dispatch<SetStateAction<PlpFilterState>>];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as d,useState as l}from"react";import{EMPTY_PLP_FILTERS as E,plpFiltersFromParams as L,plpFiltersToParams as i}from"../../lib/wheels/plp-filters.js";import{appendVehicleParams as P}from"../../lib/wheels/plp-vehicle-params.js";const w="plp:locationchange";let m=!1;function S(t){if(typeof window>"u")return()=>{};if(!m){m=!0;for(const e of["pushState","replaceState"]){const n=window.history[e];window.history[e]=function(...a){n.apply(this,a),window.dispatchEvent(new Event(w))}}}return window.addEventListener("popstate",t),window.addEventListener(w,t),()=>{window.removeEventListener("popstate",t),window.removeEventListener(w,t)}}function y(t,e){const n=L(new URLSearchParams(t));return i(n).toString()===""?{...E,sort:e}:n}function I({editing:t,openingSort:e,appliedVehicle:n,vehicleRestored:s,requestQuery:a}){const[c,p]=l(()=>y(t?"":a??"",e)),[f,h]=l(!1);return d(()=>{if(t||typeof window>"u")return;const r=()=>{const o=y(window.location.search,e);p(u=>i(u).toString()===i(o).toString()?u:o)};return r(),h(!0),S(r)},[t,e]),d(()=>{if(t||!f||!s||typeof window>"u")return;const r=i(c);P(r,n);const o=r.toString();window.history.replaceState(null,"",`${window.location.pathname}${o?`?${o}`:""}`)},[t,f,s,c,n]),[c,p]}export{I as usePlpFiltersInUrl};
|
|
@@ -199,7 +199,7 @@ export type Brand = {
|
|
|
199
199
|
client_name: string;
|
|
200
200
|
design_count: number;
|
|
201
201
|
};
|
|
202
|
-
import type { components } from "./types.js";
|
|
202
|
+
import type { components, operations } from "./types.js";
|
|
203
203
|
export declare function resolveMediaUrls<T>(value: T): T;
|
|
204
204
|
export type Process = components["schemas"]["Process"];
|
|
205
205
|
export type FinishFamily = components["schemas"]["FinishFamily"];
|
|
@@ -237,6 +237,7 @@ export type TyreFitVariant = components["schemas"]["TyreFitVariant"];
|
|
|
237
237
|
export type TyreFitVehicle = components["schemas"]["TyreFitVehicle"];
|
|
238
238
|
export type Site = components["schemas"]["Site"];
|
|
239
239
|
export type PageStub = components["schemas"]["PageStub"];
|
|
240
|
+
export type PopupStub = components["schemas"]["PopupStub"];
|
|
240
241
|
export type Page = components["schemas"]["Page"];
|
|
241
242
|
export type ProductTemplateStub = components["schemas"]["ProductTemplateStub"];
|
|
242
243
|
export type DynamicPageStub = components["schemas"]["DynamicPageStub"];
|
|
@@ -339,6 +340,7 @@ export declare const products: {
|
|
|
339
340
|
getSite: () => Promise<Site>;
|
|
340
341
|
getSiteBySlug: (slug: string) => Promise<Site>;
|
|
341
342
|
listPages: () => Promise<PageStub[]>;
|
|
343
|
+
listPopups: () => Promise<PopupStub[]>;
|
|
342
344
|
listProductTemplates: () => Promise<ProductTemplateStub[]>;
|
|
343
345
|
listDynamicPages: (recordType?: string) => Promise<DynamicPageStub[]>;
|
|
344
346
|
getRecord: (type: string, key: string) => Promise<PublicRecord | null>;
|
|
@@ -349,7 +351,7 @@ export declare const products: {
|
|
|
349
351
|
revalidate?: number;
|
|
350
352
|
record?: string;
|
|
351
353
|
}) => Promise<Page>;
|
|
352
|
-
listBlogPosts: () => Promise<BlogPostSummary[]>;
|
|
354
|
+
listBlogPosts: (opts?: NonNullable<operations["listBlogPosts"]["parameters"]["query"]>) => Promise<BlogPostSummary[]>;
|
|
353
355
|
getBlogPost: (slug: string) => Promise<BlogPostDetail>;
|
|
354
356
|
createOrder: (body: OrderRequest) => Promise<OrderConfirmation>;
|
|
355
357
|
createOrderAuthed: (body: OrderRequest) => Promise<OrderConfirmation>;
|