efficient-storefront-blocks 0.76.0 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/chunks/EditorPreviewCheckout-GNQP4MQ4.js +4 -0
  3. package/dist/chunks/{SiteEditorProvider-AJUWZYHT.js → SiteEditorProvider-R3HXJAPW.js} +1 -1
  4. package/dist/chunks/chunk-BOJGJXIU.js +311 -0
  5. package/dist/chunks/chunk-CAULWKXR.js +1 -0
  6. package/dist/chunks/chunk-GDR5GGVW.js +1 -0
  7. package/dist/chunks/chunk-OWYNZAAY.js +1 -0
  8. package/dist/chunks/chunk-ZIZWJZ5T.js +1 -0
  9. package/dist/chunks/{fitment-data-IZYCNTET.js → fitment-data-JNQKYQIB.js} +1 -1
  10. package/dist/editor/components/CategorySource.js +1 -1
  11. package/dist/editor/lib/document/blocks/commerce/GalleryB/fields.js +1 -1
  12. package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
  13. package/dist/editor/lib/document/blocks/service/Events/fields.js +1 -1
  14. package/dist/editor/lib/document/blocks/service/FooterGroup/fields.js +1 -1
  15. package/dist/editor/lib/document/blocks/service/FooterSocial/fields.js +1 -1
  16. package/dist/index.js +31 -31
  17. package/dist/render/app/globals.css +13 -0
  18. package/dist/render/built-with.json +1 -1
  19. package/dist/render/components/ChatWidget.js +1 -1
  20. package/dist/render/components/ConsentPanel.js +1 -1
  21. package/dist/render/components/Events.d.ts +2 -1
  22. package/dist/render/components/Events.js +1 -1
  23. package/dist/render/components/FooterGroup.d.ts +2 -1
  24. package/dist/render/components/FooterGroup.js +1 -1
  25. package/dist/render/components/GalleryGrid.d.ts +2 -1
  26. package/dist/render/components/GalleryGrid.js +1 -1
  27. package/dist/render/components/Notice.d.ts +6 -0
  28. package/dist/render/components/Notice.js +1 -0
  29. package/dist/render/components/ProductGridSection.d.ts +2 -1
  30. package/dist/render/components/ProductGridSection.js +1 -1
  31. package/dist/render/components/SubscribePopup.js +2 -2
  32. package/dist/render/components/TyreFitVerdicts.d.ts +2 -1
  33. package/dist/render/components/TyreFitVerdicts.js +1 -1
  34. package/dist/render/components/TyreVehicleFitment.js +1 -1
  35. package/dist/render/components/WheelCardFrame.d.ts +3 -0
  36. package/dist/render/components/WheelCardFrame.js +1 -1
  37. package/dist/render/components/catalog/CatalogFilterBar.js +1 -1
  38. package/dist/render/components/checkout/CheckoutPageClient.d.ts +4 -0
  39. package/dist/render/components/checkout/CheckoutPageClient.js +1 -1
  40. package/dist/render/components/checkout/checkout-parts.js +1 -1
  41. package/dist/render/components/checkout/checkout-state.d.ts +14 -2
  42. package/dist/render/components/checkout/checkout-state.js +3 -3
  43. package/dist/render/components/product-hero/TyreHeroFitment.d.ts +2 -1
  44. package/dist/render/components/product-hero/TyreHeroFitment.js +1 -1
  45. package/dist/render/components/product-hero/VehicleQuestion.d.ts +0 -4
  46. package/dist/render/components/product-hero/VehicleQuestion.js +1 -1
  47. package/dist/render/components/product-hero/WheelHeroFitment.js +1 -1
  48. package/dist/render/components/useTyreFitAnswer.d.ts +1 -0
  49. package/dist/render/components/useTyreFitAnswer.js +1 -1
  50. package/dist/render/lib/api/index.d.ts +6 -3
  51. package/dist/render/lib/api/index.js +1 -1
  52. package/dist/render/lib/api/types.d.ts +3 -0
  53. package/dist/render/lib/checkout/pay-first.d.ts +34 -0
  54. package/dist/render/lib/checkout/pay-first.js +1 -0
  55. package/dist/render/lib/document/blocks/commerce/GalleryB/render.js +1 -1
  56. package/dist/render/lib/document/blocks/commerce/ProductGrid/render.js +1 -1
  57. package/dist/render/lib/document/blocks/service/Events/render.js +1 -1
  58. package/dist/render/lib/document/blocks/service/FooterGroup/render.js +1 -1
  59. package/dist/render/lib/tyres/tyre-fit-copy.js +1 -1
  60. package/dist/render/lib/tyres/tyre-vehicle-fitment.d.ts +3 -1
  61. package/dist/render/lib/tyres/tyre-vehicle-fitment.js +1 -1
  62. package/dist/words.d.ts +0 -5
  63. package/dist/words.js +2 -2
  64. package/package.json +3 -3
  65. package/dist/chunks/EditorPreviewCheckout-ANI7HUYX.js +0 -4
  66. package/dist/chunks/chunk-3IQQNZIM.js +0 -311
  67. package/dist/chunks/chunk-4F5CAFXO.js +0 -1
  68. package/dist/chunks/chunk-5NXOTPHK.js +0 -1
  69. package/dist/chunks/chunk-YAYHH5GY.js +0 -1
  70. package/dist/chunks/chunk-YFPWVNDB.js +0 -1
  71. /package/dist/chunks/{chunk-3IQQNZIM.js.LEGAL.txt → chunk-BOJGJXIU.js.LEGAL.txt} +0 -0
@@ -1 +1 @@
1
- import{PREVIEW_TOKEN_HEADER as tt,SITE_HOST_HEADER as et,SITE_SLUG_HEADER as rt}from"../site-headers.js";import{PRODUCT_API_BASE as at,PRODUCT_BACKEND_URL as k}from"./origins.js";import{backendHopHeaders as st,clientIpFromForwardedFor as nt,FORWARDED_FOR_HEADER as ot,hopCachingOf as it}from"../forwarded-for.js";import ct from"efficient-web-builder/format/lib/document/media-manifest.json";import{auth as P}from"../auth.js";import{efficientClientOpen as dt}from"efficient-easel/screen/lib/session";import{listableWheelSummaries as J}from"../wheels/listable-wheels.js";import{dropRenderlessFinishes as L}from"../wheels/renderable-finishes.js";const ut=process.env.NEXT_PUBLIC_API_URL??"http://localhost:8000";class m extends Error{status;data;constructor(e,s,o){super(s),this.status=e,this.data=o}}const U="Unable to reach the server. This could be a problem with your internet connection, or the server may be undergoing maintenance or an upgrade. Please try again shortly.",lt=new Set([502,503,504]),I=0,pt="This editor runs on its host's own backend, which does not serve this request.",yt=5e3,ht=15e3,ft=()=>typeof window>"u"?yt:ht;function D(t){const e=(t.method??"GET").toUpperCase();if(!(t.body!=null||e!=="GET"&&e!=="HEAD")&&!(t.audience!=null&&t.audience!=="shop")&&typeof AbortSignal?.timeout=="function")return AbortSignal.timeout(ft())}const x=t=>t instanceof Error&&t.name==="TimeoutError",H=(t,e)=>lt.has(t)?U:e,gt=["admin","venue"];let M="admin";function ne(t){M=gt.includes(t)?t:"admin"}function mt(){return M}const wt=/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8})*$/;let F=null;function oe(t){F=t&&wt.test(t)?t:null}function St(){return F}function Pt(t){if(typeof window>"u"||!t.startsWith("/api/v1/"))return t;const e=j();return!e||/[?&]site=/.test(t)?t:E(t,`site=${encodeURIComponent(e)}`)}async function i(t,e={}){const{token:s,baseUrl:o,headers:l,audience:p,...w}=e;if(typeof window<"u"&&!dt())throw new m(I,pt,null);if(typeof window>"u"&&o===void 0)throw new Error(`apiFetch(${JSON.stringify(t)}) ran on the server without an explicit baseUrl. The API_URL default it would inherit is browser-only (the prod image bakes NEXT_PUBLIC_API_URL="" for same-origin use, which a Node fetch cannot resolve). Pass a base explicitly: \`await backendOpts()\` (or baseUrl: PRODUCT_FETCH_BASE) for product reads, or the server-only PRODUCT_BACKEND_URL env for other backend surfaces.`);const a=typeof FormData<"u"&&w.body instanceof FormData;let r;try{r=await fetch(`${o??ut}${Pt(t)}`,{...w,headers:{...a?{}:{"Content-Type":"application/json"},...s?{Authorization:`Bearer ${s}`}:{},...p===null?{}:{"X-Portal-Audience":p??"shop"},...l},signal:w.signal??D({...w,audience:p})})}catch(y){throw y instanceof TypeError||x(y)?new m(I,U,null):y}let n;try{n=await r.text()}catch(y){throw x(y)?new m(I,U,null):y}let c=null;if(n)try{c=JSON.parse(n)}catch{throw new m(r.status,r.ok?"Expected JSON but received a non-JSON response":H(r.status,r.statusText),n)}if(!r.ok){const y=(c&&typeof c=="object"&&"detail"in c&&typeof c.detail=="string"?c.detail:null)??H(r.status,r.statusText);throw new m(r.status,y,c)}return c}let O=null;async function B(){return O||(O=bt().finally(()=>{O=null}),O)}async function bt(){const t=P.takeLegacyRefresh(),e=await Ot.refresh(t??void 0);return P.setTokens(e.access),e.access}async function q(){return P.getAccess()??B()}async function h(t,e={}){let s;try{s=await q()}catch{throw P.clear(),new m(401,"Not signed in",null)}try{return await i(t,{...e,token:s})}catch(o){if(!(o instanceof m)||o.status!==401)throw o;try{const l=await B();return await i(t,{...e,token:l})}catch{throw P.clear(),o}}}async function G(t,e={}){if(P.getAccess())try{return{data:await h(t,e),asShopper:!0}}catch(s){if(!(s instanceof m)||s.status!==401)throw s}return{data:await i(t,e),asShopper:!1}}async function W(){const t=await h("/api/auth/me/");if(t.portal!=="shop")throw P.clear(),new m(403,"This session is not valid for this shop.",null);return t}const Ot={login:(t,e)=>i("/api/auth/login/",{method:"POST",body:JSON.stringify({email:t,password:e,portal:"shop"}),credentials:"include"}),refresh:t=>i("/api/auth/refresh/",{method:"POST",body:JSON.stringify(t?{refresh:t,portal:"shop"}:{portal:"shop"}),credentials:"include"}),logout:async()=>{P.clear();try{await i("/api/auth/logout/",{method:"POST",body:JSON.stringify({portal:"shop"}),credentials:"include"})}catch{}},restoreSession:async()=>{const t=await q();return await W(),t},me:W,updateMe:t=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify(t)}),changePassword:(t,e)=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify({password:e,old_password:t})}),changeEmail:(t,e)=>h("/api/shop-portal/change-email/",{method:"POST",body:JSON.stringify({new_email:t,current_password:e})}),myProfile:()=>h("/api/shop-portal/profile/"),updateMyProfile:t=>h("/api/shop-portal/profile/",{method:"PATCH",body:JSON.stringify(t)}),myAddresses:()=>h("/api/shop-portal/delivery-locations/"),createAddress:t=>h("/api/shop-portal/delivery-locations/",{method:"POST",body:JSON.stringify(t)}),updateAddress:(t,e)=>h(`/api/shop-portal/delivery-locations/${t}/`,{method:"PATCH",body:JSON.stringify(e)}),deleteAddress:t=>h(`/api/shop-portal/delivery-locations/${t}/`,{method:"DELETE"}),passwordResetRequest:t=>i("/api/auth/password-reset/",{method:"POST",body:JSON.stringify({email:t})}),passwordResetConfirm:(t,e,s)=>i("/api/auth/password-reset/confirm/",{method:"POST",body:JSON.stringify({uid:t,token:e,new_password:s})}),brands:()=>h("/api/products/brands/"),myOrders:()=>h("/api/shop-portal/orders/").then(t=>t.results),myOrder:t=>h(`/api/shop-portal/orders/${t}/`),cancelOrder:t=>h(`/api/shop-portal/orders/${t}/cancel/`,{method:"POST"}),myReturns:t=>h(`/api/shop-portal/returns/${t?`?order=${encodeURIComponent(t)}`:""}`).then(e=>e.results),createReturn:t=>h("/api/shop-portal/returns/",{method:"POST",body:JSON.stringify(t)}),withdrawReturn:t=>h(`/api/shop-portal/returns/${t}/cancel/`,{method:"POST"}),uploadReturnPhoto:(t,e)=>{const s=new FormData;return s.append("claim_item",t),s.append("file",e),s.append("media_type",e.type.startsWith("video/")?"video":"image"),h("/api/shop-portal/return-media/",{method:"POST",body:s})}};import{media as At,absolutizeApiUrl as N}from"efficient-web-builder/render/lib/media";import{analyzeLogoSvg as Tt,isSvgUrl as Rt}from"efficient-web-builder/format/lib/logo/reverse-svg";import{getEditorSiteId as Et}from"efficient-web-builder/render/lib/editor-site";import{shopRouteBase as Ct,webRuntimeSiteSlug as j}from"efficient-web-builder/format/lib/web-runtime";function g(t){if(typeof t=="string")return t.startsWith("/media/")?At(t):t;if(Array.isArray(t))return t.map(g);if(t&&typeof t=="object"){const e={};for(const[s,o]of Object.entries(t))e[s]=s==="captions"&&o&&typeof o=="object"&&!Array.isArray(o)?Object.fromEntries(Object.entries(o).map(([l,p])=>[g(l),p])):g(o);return e}return t}import{PRODUCT_API_BASE as we}from"./origins.js";const z=typeof window>"u"&&k!=="",$t=z?k:at,_t=Ct,b=()=>({baseUrl:_t(),audience:null});function d(t,e){const s=e?`?process=${encodeURIComponent(e)}`:"";return`/api/v1${t}${s}`}const Ut=100,K=50;function V(t,e,s){const o=new URLSearchParams;for(const[l,p]of Object.entries(e))p!=null&&p!==""&&o.set(l,String(p));return o.set("pageSize",String(Ut)),s&&o.set("cursor",s),`/api/v1${t}?${o.toString()}`}function It(t,e){return V("/wheels",{process:t},e)}function Nt(t,e,s){return V("/products",{kind:t.join(","),make:e?.make,model:e?.model,year:e?.year,modification:e?.modification},s)}function vt(t){if(!t)return null;try{return new URL(t,"http://cursor.invalid").searchParams.get("cursor")}catch{return null}}async function X(t,e,s=()=>!1){const o=[];let l=null;try{for(let p=0;p<K;p++){const w=await i(await e(l),await u());if(o.push(...w.results),l=vt(w.next),!l)break}l&&console.warn(`[${t}] stopped at ${K} pages (${o.length} rows); catalog may be truncated`)}catch(p){if(s(p))throw p;console.warn(`[${t}] product API unavailable, returning []`,p)}return o}const kt=t=>t instanceof m&&t.status===400;function Jt(t){return t.flatMap(e=>e.kind==="alloy-wheel"?J([e]):[e])}async function Z(){return(await Lt()).host}async function Lt(){try{const{headers:t}=await import("next/headers"),e=await t(),s=p=>p?.split(",")[0]?.split(":")[0]?.trim().toLowerCase()||null,o=s(e.get(et)??e.get("x-forwarded-host")??e.get("host")),l=s(e.get("host"));return{host:o,matchesRequestHost:o!==null&&o===l}}catch{return{host:null,matchesRequestHost:!1}}}async function Dt(){try{const{headers:t}=await import("next/headers");return nt((await t()).get(ot))}catch{return null}}async function xt(){try{const{headers:t}=await import("next/headers");return(await t()).get(rt)||null}catch{return null}}async function Ht(){const t=await xt();if(t)return`site=${encodeURIComponent(t)}`;const e=await Z();return e?`host=${encodeURIComponent(e)}`:""}async function f(t){if(typeof window<"u"){const e=j();return e?E(t,`site=${encodeURIComponent(e)}`):t}return E(t,await Ht())}function E(t,e){return e?`${t}${t.includes("?")?"&":"?"}${e}`:t}const Mt="preview";async function Ft(){if(typeof window<"u")return null;try{const{headers:t}=await import("next/headers");return(await t()).get(tt)}catch{return null}}async function Bt(){try{const{headers:t}=await import("next/headers");return(await t()).get("user-agent")}catch{return null}}async function v(t,e){const s=await Ft();if(s===null)return[await f(t),await u(e)];const o=E(await f(t),`${Mt}=${encodeURIComponent(s)}`),{next:l,cache:p,...w}=e??{},a=await u({...w,cache:"no-store"}),r=await Bt();return r&&(a.headers={...a.headers,"user-agent":r}),[o,a]}async function qt(t){if(!z)return;const[e,s]=await Promise.all([Z(),Dt()]),o=st(e,s,t);return Object.keys(o).length>0?o:void 0}async function u(t){const e=await qt(it(t)),s={baseUrl:$t,...t};return e&&(s.headers={...e,...t?.headers}),s}const A=typeof window>"u";function T(t,e){const s=new URLSearchParams;for(const[l,p]of Object.entries(e))p!==void 0&&p!==""&&s.set(l,String(p));const o=s.toString();return`/api/v1/fitment${t}${o?`?${o}`:""}`}const le={listMakes:async t=>{if(A){const{fitmentData:s}=await import("./fitment-data.js");return s.makes(t)}return(await i(T("/makes",{region:t}),b())).results},listModels:async(t,e)=>{if(A){const{fitmentData:o}=await import("./fitment-data.js");return o.models(t,e)}return(await i(T("/models",{make:t,region:e}),b())).results},listYears:async(t,e,s)=>{if(A){const{fitmentData:l}=await import("./fitment-data.js");return l.years(t,e,s)}return(await i(T("/years",{make:t,model:e,region:s}),b())).results},listModifications:async(t,e,s,o)=>{if(A){const{fitmentData:p}=await import("./fitment-data.js");return p.modifications(t,e,s,o)}return(await i(T("/modifications",{make:t,model:e,year:s,region:o}),b())).results},getStockFitment:async(t,e,s,o,l)=>{if(A){const{fitmentData:p}=await import("./fitment-data.js");return p.stockFitment(t,e,s,o,l)}return i(T("/stock-fitment",{make:t,model:e,year:s,modification:o,region:l}),b())}},pe={listWheels:async t=>{const e=await X("products.listWheels",async s=>await f(It(t,s)));return J(g(e))},listCatalog:async(t,e)=>{if(t.length===0)throw new Error("products.listCatalog() needs at least one kind. An empty list would omit `kind`, which the contract reads as `alloy-wheel` — so the call would silently return the wheel catalog instead of nothing.");const s=await X("products.listCatalog",async o=>await f(Nt(t,e,o)),kt);return Jt(g(s))},getWheel:async t=>L(g(await i(await f(d(`/wheels/${t}`)),await u()))),getTyre:async t=>g(await i(await f(d(`/tyres/${t}`)),await u())),listBundles:async()=>{try{return await i(await f(d("/bundles")),await u())}catch{return[]}},getBundle:async t=>i(await f(d(`/bundles/${t}`)),await u()),listGalleryBuilds:async(t={})=>{const{process:e=null,wheelSlug:s=null}=t;if(typeof window>"u"){const{listGalleryBuilds:o}=await import("./gallery-builds-data.js");return g(o(e,s))}try{const o=new URLSearchParams;e&&o.set("process",e),s&&o.set("wheelSlug",s);const l=o.toString(),p=await i(`/api/v1/gallery-builds${l?`?${l}`:""}`,b());return g(p.results)}catch(o){return console.warn("[products.listGalleryBuilds] product API unavailable, returning []",o),[]}},getSite:async()=>i(await f(d("/site")),await u()),getSiteBySlug:async t=>i(`${d("/site")}?${new URLSearchParams({site:t})}`,typeof window>"u"?await u():void 0),listPages:async()=>g(await i(await f(d("/pages")),await u())),listPopups:async()=>i(await f(d("/popups")),await u()),listProductTemplates:async()=>{try{return await i(await f(d("/product-templates")),await u())}catch(t){return console.warn("[products.listProductTemplates] unavailable, returning []",t),[]}},listDynamicPages:async t=>{const e=t?`?recordType=${encodeURIComponent(t)}`:"";try{return await i(await f(`${d("/dynamic-pages")}${e}`),await u())}catch(s){if(s instanceof m&&s.status===404)return[];throw s}},getRecord:async(t,e)=>{try{return await i(await f(d(`/records/${encodeURIComponent(t)}/${encodeURIComponent(e)}`)),await u())}catch(s){if(s instanceof m&&s.status===404)return null;throw s}},listRecordKeys:async t=>{try{const e=await i(await f(d(`/records/${encodeURIComponent(t)}`)),await u({cache:"no-store"}));return Array.isArray(e?.keys)?e.keys.filter(s=>typeof s=="string"&&s!==""):[]}catch(e){if(e instanceof m&&e.status===404)return[];throw e}},listProductTypeChoices:async()=>{try{return await i(await f(d("/product-type-choices")),await u())}catch(t){return console.warn("[products.listProductTypeChoices] unavailable, returning []",t),[]}},listFieldUsage:async()=>{try{return await i(await f(d("/field-usage")),await u())}catch(t){return console.warn("[products.listFieldUsage] unavailable, returning []",t),[]}},getPage:async(t,e={})=>{const s=e.record?`?record=${encodeURIComponent(e.record)}`:"",[o,l]=await v(d(`/pages/${t}`)+s,e.revalidate!==void 0?{next:{revalidate:e.revalidate}}:void 0);return g(await i(o,l))},listBlogPosts:async(t={})=>{const e=t.category?`?category=${encodeURIComponent(t.category)}`:"";try{return(await i(d("/blog-posts")+e,await u())).map(o=>({...o,coverImage:N(o.coverImage)??""}))}catch(s){return console.warn("[products.listBlogPosts] blog API unavailable, returning []",s),[]}},getBlogPost:async t=>{const e=await i(d(`/blog-posts/${t}`),await u());return{...e,coverImage:N(e.coverImage)??""}},createOrder:async t=>i(d("/orders"),await u({method:"POST",body:JSON.stringify(t)})),createOrderAuthed:async t=>h(d("/orders"),await u({method:"POST",body:JSON.stringify(t)})),lookupOrder:async t=>i(d("/orders/lookup"),await u({method:"POST",body:JSON.stringify(t)})),createPaymentIntent:async t=>i(d("/payments/intent"),await u({method:"POST",body:JSON.stringify(t)})),createPaypalOrder:async t=>i(d("/payments/paypal/order"),await u({method:"POST",body:JSON.stringify(t)})),capturePaypalOrder:async t=>i(d("/payments/paypal/capture"),await u({method:"POST",body:JSON.stringify(t)})),createAfterpayCheckout:async t=>i(d("/payments/afterpay/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureAfterpayPayment:async t=>i(d("/payments/afterpay/capture"),await u({method:"POST",body:JSON.stringify(t)})),chargeSquare:async t=>i(d("/payments/square/charge"),await u({method:"POST",body:JSON.stringify(t)})),createGocardlessBillingRequest:async t=>i(d("/payments/gocardless/billing-request"),await u({method:"POST",body:JSON.stringify(t)})),completeGocardlessPayment:async t=>i(d("/payments/gocardless/complete"),await u({method:"POST",body:JSON.stringify(t)})),createZipCheckout:async t=>i(d("/payments/zip/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureZipPayment:async t=>i(d("/payments/zip/capture"),await u({method:"POST",body:JSON.stringify(t)})),createKlarnaCheckout:async t=>i(d("/payments/klarna/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureKlarnaPayment:async t=>i(d("/payments/klarna/capture"),await u({method:"POST",body:JSON.stringify(t)})),createStockAlert:async t=>i(d("/stock-alerts"),await u({method:"POST",body:JSON.stringify(t)})),createPreOrderIntent:async t=>i(d("/pre-order-intents"),await u({method:"POST",body:JSON.stringify(t)})),createNewsletterSubscription:async t=>i(d("/newsletter-subscriptions"),await u({method:"POST",body:JSON.stringify(t)})),unsubscribeNewsletter:async t=>i(d("/newsletter-unsubscribe"),await u({method:"POST",body:JSON.stringify(t)})),captureCart:async t=>i(d("/carts"),await u({method:"POST",body:JSON.stringify(t)})),restoreCart:async t=>i(d("/carts/restore"),await u({method:"POST",body:JSON.stringify(t)})),unsubscribeCartReminders:async t=>i(d("/carts/unsubscribe"),await u({method:"POST",body:JSON.stringify(t)})),listReviews:async(t={})=>{const e=new URLSearchParams;t.limit&&e.set("limit",String(t.limit)),t.designCode&&e.set("designCode",t.designCode);const s=d("/reviews"),o=e.toString();try{return await i(await f(o?`${s}?${o}`:s),await u())}catch(l){return console.warn("[products.listReviews] product API unavailable, returning []",l),[]}},submitReview:async t=>i(d("/reviews"),await u({method:"POST",body:JSON.stringify(t)})),getForm:async t=>i(d(`/forms/${encodeURIComponent(t)}`),await u()),submitForm:async(t,e)=>i(d(`/forms/${encodeURIComponent(t)}/submissions`),await u({method:"POST",body:JSON.stringify(e)})),listShippingMethods:async()=>{try{return await i(d("/shipping-methods"),await u())}catch(t){return console.warn("[products.listShippingMethods] product API unavailable, returning []",t),[]}},listCountrySubdivisions:async t=>{try{return await i(d(`/countries/${encodeURIComponent(t)}/subdivisions`),await u())}catch(e){return console.warn("[products.listCountrySubdivisions] unavailable, returning []",e),[]}},quoteCart:async t=>{const e=d("/cart/quote"),s=await u({method:"POST",body:JSON.stringify(t)});return t.couponCode?(await G(e,s)).data:i(e,s)},validateCoupon:async t=>{const{data:e,asShopper:s}=await G(d("/coupons/validate"),await u({method:"POST",body:JSON.stringify(t)}));return{...e,askedAsShopper:s}},getHeaderSettings:async()=>{const t=D({method:"GET"}),e=await i(...await v(d("/header-settings"),{signal:t})),s=N(e.logoUrl);let o=null,l=null;if(s&&Rt(s)){const p=await Tt(s,t);p&&(o=p.reversed,l=p.inkIsDark)}return{...e,logoUrl:s,logoReversed:o,logoInkIsDark:l}},getThemeSettings:async()=>i(...await v(d("/theme-settings"))),getChatSettings:async()=>i(await f(d("/chat-settings")),await u())},ye={listServices:async()=>{try{return await i(d("/bookings/services"),await u())}catch(t){return console.warn("[bookings.listServices] API unavailable, returning []",t),{results:[],currency:"USD"}}},getAvailability:async(t,e)=>i(d(`/bookings/availability?service=${encodeURIComponent(t)}&date=${e}`),await u()),create:async t=>i(d("/bookings"),await u({method:"POST",body:JSON.stringify(t)})),get:async t=>i(d(`/bookings/manage/${encodeURIComponent(t)}`),await u()),cancel:async t=>i(d(`/bookings/manage/${encodeURIComponent(t)}/cancel`),await u({method:"POST"})),createPaymentIntent:async t=>i(d("/bookings/payments/intent"),await u({method:"POST",body:JSON.stringify({manageToken:t})}))};class Gt extends Error{slug;count;constructor(e,s){super(`Slug "${e}" exists on ${s} websites; a site is required to pick one.`),this.slug=e,this.count=s,this.name="AmbiguousPageSlugError"}}const C=(t,e,s)=>{const o=new URLSearchParams({...e?{site:e}:{},...s?{draft:"1"}:{}}).toString();return`/api/storefront/${t}/${o?`?${o}`:""}`},$=t=>`/api/storefront/sites/${encodeURIComponent(t)}/`,Wt=t=>`${$(t)}currencies/`,jt="/api/storefront/media/ingest/";class zt extends Error{constructor(){super("This editor is not connected to a website, so an upload has nowhere to go. Open the page from the website the file should belong to, then try again."),this.name="MediaUploadDestinationError"}}function Kt(){const t=Et();if(!t)throw new zt;return`${jt}?${new URLSearchParams({site:t})}`}const Vt="X-Puck-Media-Manifest",Y=ct.contentHash,_={"X-Media-Manifest":Y,[Vt]:Y},he=Q({});function Q(t){return(e,s={})=>{const o=St(),l=t.headers||o?{...o?{"Accept-Language":o}:{},...t.headers,...s.headers}:void 0;return i(e,{...s,...t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{},...l?{headers:l}:{},audience:t.audience??mt()})}}function Xt(t={}){const e=Q(t),s=t.siteDrafts===!0,o=a=>C("header-settings",a,s),l=a=>C("theme-settings",a,s),p=a=>C("chat-settings",a,s),w=a=>C("social-settings",a,s);return{findPageBySlug:async(a,r,n)=>{const c=new URLSearchParams({slug:a});n&&c.set("site",n);const y=await e(`/api/storefront/pages/?${c.toString()}`,{token:r}),S=Array.isArray(y)?y:y.results??[];if(!n&&S.length>1)throw new Gt(a,S.length);return S[0]??null},getPageById:(a,r)=>e(`/api/storefront/pages/${a}/`,{token:r}),saveLayout:(a,r,n,c,y)=>e(`/api/storefront/pages/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r,expected_updated_at:c,...y?{client_id:y}:{}}),token:n}),duplicatePage:(a,r,n)=>e(`/api/storefront/pages/${a}/duplicate/`,{method:"POST",body:JSON.stringify({title:r.title,slug:r.slug}),token:n}),geocode:(a,r,n)=>e(`/api/storefront/geocode/?${new URLSearchParams(n?{q:a,country:n}:{q:a})}`,{token:r}),listBlockSources:a=>e("/api/storefront/block-sources/",{token:a}),listRecordTypes:a=>e("/api/storefront/record-types/",{token:a}),createPagePreviewLink:(a,r)=>e(`/api/storefront/pages/${a}/preview-link/`,{method:"POST",token:r}),claimPageEditLock:(a,r,n,c=!1)=>e(`/api/storefront/pages/${a}/edit-lock/`,{method:"POST",body:JSON.stringify({client_id:n,takeover:c}),token:r}),releasePageEditLock:(a,r)=>e(`/api/storefront/pages/${a}/edit-lock/`,{method:"DELETE",token:r}),createTemplate:(a,r,n)=>e("/api/storefront/page-templates/",{method:"POST",body:JSON.stringify({name:a,layout:r}),headers:_,token:n}),getTemplate:(a,r)=>e(`/api/storefront/page-templates/${a}/`,{token:r}),saveTemplateLayout:(a,r,n)=>e(`/api/storefront/page-templates/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r}),headers:_,token:n}),listTemplatePages:async(a,r)=>{const n=await e(`/api/storefront/template-pages/?template=${encodeURIComponent(a)}`,{token:r});return Array.isArray(n)?n:n.results??[]},findTemplatePageBySlug:async(a,r,n)=>{const c=await e(`/api/storefront/template-pages/?template=${encodeURIComponent(a)}&slug=${encodeURIComponent(r)}`,{token:n});return(Array.isArray(c)?c:c.results??[])[0]??null},createTemplatePage:(a,r,n)=>e("/api/storefront/template-pages/",{method:"POST",body:JSON.stringify({template:a,...r}),headers:_,token:n}),saveTemplatePageLayout:(a,r,n)=>e(`/api/storefront/template-pages/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r}),headers:_,token:n}),deleteTemplatePage:(a,r,n)=>e(`/api/storefront/template-pages/${a}/`,{method:"DELETE",token:r,...n?.keepalive?{keepalive:!0}:{}}),listPages:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("site",r);const c=await e(`/api/storefront/pages/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]},createPage:(a,r,n,c)=>e("/api/storefront/pages/",{method:"POST",body:JSON.stringify({title:a,slug:r,layout:n}),token:c}),deletePage:(a,r)=>e(`/api/storefront/pages/${a}/`,{method:"DELETE",token:r}),getHeaderSettings:(a,r)=>e(o(r),{token:a}),listMenus:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("site",r);const c=await e(`/api/storefront/menus/?${n}`,{token:a});return Array.isArray(c)?c:c.results??[]},listBlogPosts:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.visibleOnly&&n.set("is_visible","true"),r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/blog-posts/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]},listFieldUsage:async(a,r)=>{const n=await e(`/api/storefront/field-usage/?site=${encodeURIComponent(r)}`,{token:a});return Array.isArray(n?.entries)?n.entries:[]},listCategories:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.visibleOnly&&n.set("is_visible","true"),r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/categories/?${n.toString()}`,{token:a});return[...Array.isArray(c)?c:c.results??[]].sort((S,R)=>S.sort_order-R.sort_order||S.name.localeCompare(R.name))},listForms:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/forms/?${n.toString()}`,{token:a});return[...Array.isArray(c)?c:c.results??[]].sort((S,R)=>S.title.localeCompare(R.title))},listWheelSummaries:async(a,r={})=>{const n=new URLSearchParams;r.siteId&&n.set("site",r.siteId);const c=n.toString(),y=await e(`/api/storefront/wheel-curations/summaries/${c?`?${c}`:""}`,{token:a});return g(y)},listProducts:async(a,r={})=>{const n=new URLSearchParams;r.kinds?.length&&n.set("kind",r.kinds.join(",")),r.siteId&&n.set("site",r.siteId);const c=n.toString(),y=await e(`/api/storefront/products/${c?`?${c}`:""}`,{token:a});return g(y)},getWheelDetail:async(a,r,n={})=>{const c=new URLSearchParams({slug:r});return n.siteId&&c.set("site",n.siteId),L(g(await e(`/api/storefront/wheel-curations/detail/?${c.toString()}`,{token:a})))},updateHeaderSettings:(a,r,n)=>e(o(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getSite:(a,r)=>e($(a),{token:r}),listSites:async a=>{const r=await e("/api/storefront/sites/?no_page=true",{token:a});return Array.isArray(r)?r:r.results??[]},listSiteCurrencies:async(a,r)=>{const n=await e(Wt(a),{token:r});return Array.isArray(n)?n:[]},publishSite:(a,r)=>e(`${$(a)}publish/`,{method:"POST",token:r}),getSiteLiveState:(a,r)=>e(`${$(a)}live-state/`,{token:r}),getThemeSettings:(a,r)=>e(l(r),{token:a}),updateThemeSettings:(a,r,n)=>e(l(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getChatSettings:(a,r)=>e(p(r),{token:a}),updateChatSettings:(a,r,n)=>e(p(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getSocialSettings:(a,r)=>e(w(r),{token:a}),updateSocialSettings:(a,r,n)=>e(w(n),{method:"PATCH",body:JSON.stringify(a),token:r}),uploadHeaderLogo:(a,r,n)=>{const c=new FormData;return c.append("logo",a),e(o(n),{method:"PATCH",body:c,token:r})},clearHeaderLogo:(a,r)=>e(o(r),{method:"PATCH",body:JSON.stringify({logo:null}),token:a}),setHeaderLogoFromAsset:(a,r,n)=>e(o(n),{method:"PATCH",body:JSON.stringify({logo_asset_id:a}),token:r}),uploadMedia:async(a,r)=>{const n=new FormData;return n.append("file",a),e(Kt(),{method:"POST",body:n,token:r})},listMedia:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("kind",r);const c=await e(`/api/storefront/media-assets/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]}}}const fe=Xt({siteDrafts:!0});export{ut as API_URL,Gt as AmbiguousPageSlugError,m as ApiError,ht as BROWSER_READ_TIMEOUT_MS,pt as EFFICIENT_CLIENT_CLOSED_MESSAGE,zt as MediaUploadDestinationError,Mt as PREVIEW_PARAM,we as PRODUCT_API_BASE,yt as SERVER_READ_TIMEOUT_MS,U as SERVER_UNREACHABLE_MESSAGE,I as STATUS_NETWORK_ERROR,he as adminFetch,Ot as api,i as apiFetch,E as appendSiteQuery,ye as bookings,Xt as createStorefrontAdmin,D as defaultRequestDeadline,Kt as editorMediaUploadPath,mt as editorPortalAudience,St as editorRequestLanguage,le as fitment,pe as products,ft as readDeadlineMs,Dt as resolveClientIp,g as resolveMediaUrls,Ft as resolvePreviewToken,Z as resolveSiteHost,Lt as resolveSiteHostSource,xt as resolveSiteSlug,oe as setEditorLanguage,ne as setEditorPortalAudience,fe as storefrontAdmin};
1
+ import{PREVIEW_TOKEN_HEADER as tt,SITE_HOST_HEADER as et,SITE_SLUG_HEADER as rt}from"../site-headers.js";import{PRODUCT_API_BASE as at,PRODUCT_BACKEND_URL as k}from"./origins.js";import{backendHopHeaders as st,clientIpFromForwardedFor as nt,FORWARDED_FOR_HEADER as ot,hopCachingOf as it}from"../forwarded-for.js";import ct from"efficient-web-builder/format/lib/document/media-manifest.json";import{auth as P}from"../auth.js";import{efficientClientOpen as dt}from"efficient-easel/screen/lib/session";import{listableWheelSummaries as J}from"../wheels/listable-wheels.js";import{dropRenderlessFinishes as L}from"../wheels/renderable-finishes.js";const ut=process.env.NEXT_PUBLIC_API_URL??"http://localhost:8000";class m extends Error{status;data;constructor(e,s,o){super(s),this.status=e,this.data=o}}const U="Unable to reach the server. This could be a problem with your internet connection, or the server may be undergoing maintenance or an upgrade. Please try again shortly.",lt=new Set([502,503,504]),I=0,pt="This editor runs on its host's own backend, which does not serve this request.",yt=5e3,ht=15e3,ft=()=>typeof window>"u"?yt:ht;function D(t){const e=(t.method??"GET").toUpperCase();if(!(t.body!=null||e!=="GET"&&e!=="HEAD")&&!(t.audience!=null&&t.audience!=="shop")&&typeof AbortSignal?.timeout=="function")return AbortSignal.timeout(ft())}const x=t=>t instanceof Error&&t.name==="TimeoutError",H=(t,e)=>lt.has(t)?U:e,gt=["admin","venue"];let F="admin";function ne(t){F=gt.includes(t)?t:"admin"}function mt(){return F}const wt=/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8})*$/;let M=null;function oe(t){M=t&&wt.test(t)?t:null}function St(){return M}function Pt(t){if(typeof window>"u"||!t.startsWith("/api/v1/"))return t;const e=j();return!e||/[?&]site=/.test(t)?t:E(t,`site=${encodeURIComponent(e)}`)}async function i(t,e={}){const{token:s,baseUrl:o,headers:l,audience:p,...w}=e;if(typeof window<"u"&&!dt())throw new m(I,pt,null);if(typeof window>"u"&&o===void 0)throw new Error(`apiFetch(${JSON.stringify(t)}) ran on the server without an explicit baseUrl. The API_URL default it would inherit is browser-only (the prod image bakes NEXT_PUBLIC_API_URL="" for same-origin use, which a Node fetch cannot resolve). Pass a base explicitly: \`await backendOpts()\` (or baseUrl: PRODUCT_FETCH_BASE) for product reads, or the server-only PRODUCT_BACKEND_URL env for other backend surfaces.`);const a=typeof FormData<"u"&&w.body instanceof FormData;let r;try{r=await fetch(`${o??ut}${Pt(t)}`,{...w,headers:{...a?{}:{"Content-Type":"application/json"},...s?{Authorization:`Bearer ${s}`}:{},...p===null?{}:{"X-Portal-Audience":p??"shop"},...l},signal:w.signal??D({...w,audience:p})})}catch(y){throw y instanceof TypeError||x(y)?new m(I,U,null):y}let n;try{n=await r.text()}catch(y){throw x(y)?new m(I,U,null):y}let c=null;if(n)try{c=JSON.parse(n)}catch{throw new m(r.status,r.ok?"Expected JSON but received a non-JSON response":H(r.status,r.statusText),n)}if(!r.ok){const y=(c&&typeof c=="object"&&"detail"in c&&typeof c.detail=="string"?c.detail:null)??H(r.status,r.statusText);throw new m(r.status,y,c)}return c}let b=null;async function B(){return b||(b=Ot().finally(()=>{b=null}),b)}async function Ot(){const t=P.takeLegacyRefresh(),e=await bt.refresh(t??void 0);return P.setTokens(e.access),e.access}async function q(){return P.getAccess()??B()}async function h(t,e={}){let s;try{s=await q()}catch{throw P.clear(),new m(401,"Not signed in",null)}try{return await i(t,{...e,token:s})}catch(o){if(!(o instanceof m)||o.status!==401)throw o;try{const l=await B();return await i(t,{...e,token:l})}catch{throw P.clear(),o}}}async function G(t,e={}){if(P.getAccess())try{return{data:await h(t,e),asShopper:!0}}catch(s){if(!(s instanceof m)||s.status!==401)throw s}return{data:await i(t,e),asShopper:!1}}async function W(){const t=await h("/api/auth/me/");if(t.portal!=="shop")throw P.clear(),new m(403,"This session is not valid for this shop.",null);return t}const bt={login:(t,e)=>i("/api/auth/login/",{method:"POST",body:JSON.stringify({email:t,password:e,portal:"shop"}),credentials:"include"}),refresh:t=>i("/api/auth/refresh/",{method:"POST",body:JSON.stringify(t?{refresh:t,portal:"shop"}:{portal:"shop"}),credentials:"include"}),logout:async()=>{P.clear();try{await i("/api/auth/logout/",{method:"POST",body:JSON.stringify({portal:"shop"}),credentials:"include"})}catch{}},restoreSession:async()=>{const t=await q();return await W(),t},me:W,updateMe:t=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify(t)}),changePassword:(t,e)=>h("/api/auth/me/",{method:"PATCH",body:JSON.stringify({password:e,old_password:t})}),changeEmail:(t,e)=>h("/api/shop-portal/change-email/",{method:"POST",body:JSON.stringify({new_email:t,current_password:e})}),myProfile:()=>h("/api/shop-portal/profile/"),updateMyProfile:t=>h("/api/shop-portal/profile/",{method:"PATCH",body:JSON.stringify(t)}),myAddresses:()=>h("/api/shop-portal/delivery-locations/"),createAddress:t=>h("/api/shop-portal/delivery-locations/",{method:"POST",body:JSON.stringify(t)}),updateAddress:(t,e)=>h(`/api/shop-portal/delivery-locations/${t}/`,{method:"PATCH",body:JSON.stringify(e)}),deleteAddress:t=>h(`/api/shop-portal/delivery-locations/${t}/`,{method:"DELETE"}),passwordResetRequest:t=>i("/api/auth/password-reset/",{method:"POST",body:JSON.stringify({email:t})}),passwordResetConfirm:(t,e,s)=>i("/api/auth/password-reset/confirm/",{method:"POST",body:JSON.stringify({uid:t,token:e,new_password:s})}),brands:()=>h("/api/products/brands/"),myOrders:()=>h("/api/shop-portal/orders/").then(t=>t.results),myOrder:t=>h(`/api/shop-portal/orders/${t}/`),cancelOrder:t=>h(`/api/shop-portal/orders/${t}/cancel/`,{method:"POST"}),myReturns:t=>h(`/api/shop-portal/returns/${t?`?order=${encodeURIComponent(t)}`:""}`).then(e=>e.results),createReturn:t=>h("/api/shop-portal/returns/",{method:"POST",body:JSON.stringify(t)}),withdrawReturn:t=>h(`/api/shop-portal/returns/${t}/cancel/`,{method:"POST"}),uploadReturnPhoto:(t,e)=>{const s=new FormData;return s.append("claim_item",t),s.append("file",e),s.append("media_type",e.type.startsWith("video/")?"video":"image"),h("/api/shop-portal/return-media/",{method:"POST",body:s})}};import{media as At,absolutizeApiUrl as N}from"efficient-web-builder/render/lib/media";import{analyzeLogoSvg as Tt,isSvgUrl as Rt}from"efficient-web-builder/format/lib/logo/reverse-svg";import{getEditorSiteId as Et}from"efficient-web-builder/render/lib/editor-site";import{shopRouteBase as Ct,webRuntimeSiteSlug as j}from"efficient-web-builder/format/lib/web-runtime";function g(t){if(typeof t=="string")return t.startsWith("/media/")?At(t):t;if(Array.isArray(t))return t.map(g);if(t&&typeof t=="object"){const e={};for(const[s,o]of Object.entries(t))e[s]=s==="captions"&&o&&typeof o=="object"&&!Array.isArray(o)?Object.fromEntries(Object.entries(o).map(([l,p])=>[g(l),p])):g(o);return e}return t}import{PRODUCT_API_BASE as we}from"./origins.js";const z=typeof window>"u"&&k!=="",$t=z?k:at,_t=Ct,O=()=>({baseUrl:_t(),audience:null});function d(t,e){const s=e?`?process=${encodeURIComponent(e)}`:"";return`/api/v1${t}${s}`}const Ut=100,K=50;function V(t,e,s){const o=new URLSearchParams;for(const[l,p]of Object.entries(e))p!=null&&p!==""&&o.set(l,String(p));return o.set("pageSize",String(Ut)),s&&o.set("cursor",s),`/api/v1${t}?${o.toString()}`}function It(t,e){return V("/wheels",{process:t},e)}function Nt(t,e,s){return V("/products",{kind:t.join(","),make:e?.make,model:e?.model,year:e?.year,modification:e?.modification},s)}function vt(t){if(!t)return null;try{return new URL(t,"http://cursor.invalid").searchParams.get("cursor")}catch{return null}}async function X(t,e,s=()=>!1){const o=[];let l=null;try{for(let p=0;p<K;p++){const w=await i(await e(l),await u());if(o.push(...w.results),l=vt(w.next),!l)break}l&&console.warn(`[${t}] stopped at ${K} pages (${o.length} rows); catalog may be truncated`)}catch(p){if(s(p))throw p;console.warn(`[${t}] product API unavailable, returning []`,p)}return o}const kt=t=>t instanceof m&&t.status===400;function Jt(t){return t.flatMap(e=>e.kind==="alloy-wheel"?J([e]):[e])}async function Z(){return(await Lt()).host}async function Lt(){try{const{headers:t}=await import("next/headers"),e=await t(),s=p=>p?.split(",")[0]?.split(":")[0]?.trim().toLowerCase()||null,o=s(e.get(et)??e.get("x-forwarded-host")??e.get("host")),l=s(e.get("host"));return{host:o,matchesRequestHost:o!==null&&o===l}}catch{return{host:null,matchesRequestHost:!1}}}async function Dt(){try{const{headers:t}=await import("next/headers");return nt((await t()).get(ot))}catch{return null}}async function xt(){try{const{headers:t}=await import("next/headers");return(await t()).get(rt)||null}catch{return null}}async function Ht(){const t=await xt();if(t)return`site=${encodeURIComponent(t)}`;const e=await Z();return e?`host=${encodeURIComponent(e)}`:""}async function f(t){if(typeof window<"u"){const e=j();return e?E(t,`site=${encodeURIComponent(e)}`):t}return E(t,await Ht())}function E(t,e){return e?`${t}${t.includes("?")?"&":"?"}${e}`:t}const Ft="preview";async function Mt(){if(typeof window<"u")return null;try{const{headers:t}=await import("next/headers");return(await t()).get(tt)}catch{return null}}async function Bt(){try{const{headers:t}=await import("next/headers");return(await t()).get("user-agent")}catch{return null}}async function v(t,e){const s=await Mt();if(s===null)return[await f(t),await u(e)];const o=E(await f(t),`${Ft}=${encodeURIComponent(s)}`),{next:l,cache:p,...w}=e??{},a=await u({...w,cache:"no-store"}),r=await Bt();return r&&(a.headers={...a.headers,"user-agent":r}),[o,a]}async function qt(t){if(!z)return;const[e,s]=await Promise.all([Z(),Dt()]),o=st(e,s,t);return Object.keys(o).length>0?o:void 0}async function u(t){const e=await qt(it(t)),s={baseUrl:$t,...t};return e&&(s.headers={...e,...t?.headers}),s}const A=typeof window>"u";function T(t,e){const s=new URLSearchParams;for(const[l,p]of Object.entries(e))p!==void 0&&p!==""&&s.set(l,String(p));const o=s.toString();return`/api/v1/fitment${t}${o?`?${o}`:""}`}const le={listMakes:async t=>{if(A){const{fitmentData:s}=await import("./fitment-data.js");return s.makes(t)}return(await i(T("/makes",{region:t}),O())).results},listModels:async(t,e)=>{if(A){const{fitmentData:o}=await import("./fitment-data.js");return o.models(t,e)}return(await i(T("/models",{make:t,region:e}),O())).results},listYears:async(t,e,s)=>{if(A){const{fitmentData:l}=await import("./fitment-data.js");return l.years(t,e,s)}return(await i(T("/years",{make:t,model:e,region:s}),O())).results},listModifications:async(t,e,s,o)=>{if(A){const{fitmentData:p}=await import("./fitment-data.js");return p.modifications(t,e,s,o)}return(await i(T("/modifications",{make:t,model:e,year:s,region:o}),O())).results},getStockFitment:async(t,e,s,o,l)=>{if(A){const{fitmentData:p}=await import("./fitment-data.js");return p.stockFitment(t,e,s,o,l)}return i(T("/stock-fitment",{make:t,model:e,year:s,modification:o,region:l}),O())}},pe={listWheels:async(t,e={})=>{const s=await X("products.listWheels",async o=>await f(It(t,o)),e.throwOnFailure?()=>!0:void 0);return J(g(s))},listCatalog:async(t,e)=>{if(t.length===0)throw new Error("products.listCatalog() needs at least one kind. An empty list would omit `kind`, which the contract reads as `alloy-wheel` — so the call would silently return the wheel catalog instead of nothing.");const s=await X("products.listCatalog",async o=>await f(Nt(t,e,o)),kt);return Jt(g(s))},getWheel:async t=>L(g(await i(await f(d(`/wheels/${t}`)),await u()))),getTyre:async t=>g(await i(await f(d(`/tyres/${t}`)),await u())),listBundles:async(t={})=>{try{return await i(await f(d("/bundles")),await u())}catch(e){if(t.throwOnFailure)throw e;return[]}},getBundle:async t=>i(await f(d(`/bundles/${t}`)),await u()),listGalleryBuilds:async(t={})=>{const{process:e=null,wheelSlug:s=null}=t;if(typeof window>"u"){const{listGalleryBuilds:o}=await import("./gallery-builds-data.js");return g(o(e,s))}try{const o=new URLSearchParams;e&&o.set("process",e),s&&o.set("wheelSlug",s);const l=o.toString(),p=await i(`/api/v1/gallery-builds${l?`?${l}`:""}`,O());return g(p.results)}catch(o){return console.warn("[products.listGalleryBuilds] product API unavailable, returning []",o),[]}},getSite:async()=>i(await f(d("/site")),await u()),getSiteBySlug:async t=>i(`${d("/site")}?${new URLSearchParams({site:t})}`,typeof window>"u"?await u():void 0),listPages:async()=>g(await i(await f(d("/pages")),await u())),listPopups:async()=>i(await f(d("/popups")),await u()),listProductTemplates:async()=>{try{return await i(await f(d("/product-templates")),await u())}catch(t){return console.warn("[products.listProductTemplates] unavailable, returning []",t),[]}},listDynamicPages:async t=>{const e=t?`?recordType=${encodeURIComponent(t)}`:"";try{return await i(await f(`${d("/dynamic-pages")}${e}`),await u())}catch(s){if(s instanceof m&&s.status===404)return[];throw s}},getRecord:async(t,e)=>{try{return await i(await f(d(`/records/${encodeURIComponent(t)}/${encodeURIComponent(e)}`)),await u())}catch(s){if(s instanceof m&&s.status===404)return null;throw s}},listRecordKeys:async t=>{try{const e=await i(await f(d(`/records/${encodeURIComponent(t)}`)),await u({cache:"no-store"}));return Array.isArray(e?.keys)?e.keys.filter(s=>typeof s=="string"&&s!==""):[]}catch(e){if(e instanceof m&&e.status===404)return[];throw e}},listProductTypeChoices:async()=>{try{return await i(await f(d("/product-type-choices")),await u())}catch(t){return console.warn("[products.listProductTypeChoices] unavailable, returning []",t),[]}},listFieldUsage:async()=>{try{return await i(await f(d("/field-usage")),await u())}catch(t){return console.warn("[products.listFieldUsage] unavailable, returning []",t),[]}},getPage:async(t,e={})=>{const s=e.record?`?record=${encodeURIComponent(e.record)}`:"",[o,l]=await v(d(`/pages/${t}`)+s,e.revalidate!==void 0?{next:{revalidate:e.revalidate}}:void 0);return g(await i(o,l))},listBlogPosts:async(t={},{throwOnFailure:e=!1}={})=>{const s=t.category?`?category=${encodeURIComponent(t.category)}`:"";try{return(await i(d("/blog-posts")+s,await u())).map(l=>({...l,coverImage:N(l.coverImage)??""}))}catch(o){if(e)throw o;return console.warn("[products.listBlogPosts] blog API unavailable, returning []",o),[]}},getBlogPost:async t=>{const e=await i(d(`/blog-posts/${t}`),await u());return{...e,coverImage:N(e.coverImage)??""}},createOrder:async t=>i(d("/orders"),await u({method:"POST",body:JSON.stringify(t)})),createOrderAuthed:async t=>h(d("/orders"),await u({method:"POST",body:JSON.stringify(t)})),lookupOrder:async t=>i(d("/orders/lookup"),await u({method:"POST",body:JSON.stringify(t)})),createPaymentIntent:async t=>i(d("/payments/intent"),await u({method:"POST",body:JSON.stringify(t)})),createPaypalOrder:async t=>i(d("/payments/paypal/order"),await u({method:"POST",body:JSON.stringify(t)})),capturePaypalOrder:async t=>i(d("/payments/paypal/capture"),await u({method:"POST",body:JSON.stringify(t)})),createAfterpayCheckout:async t=>i(d("/payments/afterpay/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureAfterpayPayment:async t=>i(d("/payments/afterpay/capture"),await u({method:"POST",body:JSON.stringify(t)})),chargeSquare:async t=>i(d("/payments/square/charge"),await u({method:"POST",body:JSON.stringify(t)})),createGocardlessBillingRequest:async t=>i(d("/payments/gocardless/billing-request"),await u({method:"POST",body:JSON.stringify(t)})),completeGocardlessPayment:async t=>i(d("/payments/gocardless/complete"),await u({method:"POST",body:JSON.stringify(t)})),createZipCheckout:async t=>i(d("/payments/zip/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureZipPayment:async t=>i(d("/payments/zip/capture"),await u({method:"POST",body:JSON.stringify(t)})),createKlarnaCheckout:async t=>i(d("/payments/klarna/checkout"),await u({method:"POST",body:JSON.stringify(t)})),captureKlarnaPayment:async t=>i(d("/payments/klarna/capture"),await u({method:"POST",body:JSON.stringify(t)})),createStockAlert:async t=>i(d("/stock-alerts"),await u({method:"POST",body:JSON.stringify(t)})),createPreOrderIntent:async t=>i(d("/pre-order-intents"),await u({method:"POST",body:JSON.stringify(t)})),createNewsletterSubscription:async t=>i(d("/newsletter-subscriptions"),await u({method:"POST",body:JSON.stringify(t)})),unsubscribeNewsletter:async t=>i(d("/newsletter-unsubscribe"),await u({method:"POST",body:JSON.stringify(t)})),captureCart:async t=>i(d("/carts"),await u({method:"POST",body:JSON.stringify(t)})),restoreCart:async t=>i(d("/carts/restore"),await u({method:"POST",body:JSON.stringify(t)})),unsubscribeCartReminders:async t=>i(d("/carts/unsubscribe"),await u({method:"POST",body:JSON.stringify(t)})),listReviews:async(t={})=>{const e=new URLSearchParams;t.limit&&e.set("limit",String(t.limit)),t.designCode&&e.set("designCode",t.designCode);const s=d("/reviews"),o=e.toString();try{return await i(await f(o?`${s}?${o}`:s),await u())}catch(l){return console.warn("[products.listReviews] product API unavailable, returning []",l),[]}},submitReview:async t=>i(d("/reviews"),await u({method:"POST",body:JSON.stringify(t)})),getForm:async t=>i(d(`/forms/${encodeURIComponent(t)}`),await u()),submitForm:async(t,e)=>i(d(`/forms/${encodeURIComponent(t)}/submissions`),await u({method:"POST",body:JSON.stringify(e)})),listShippingMethods:async()=>{try{return await i(d("/shipping-methods"),await u())}catch(t){return console.warn("[products.listShippingMethods] product API unavailable, returning []",t),[]}},listCountrySubdivisions:async t=>{try{return await i(d(`/countries/${encodeURIComponent(t)}/subdivisions`),await u())}catch(e){return console.warn("[products.listCountrySubdivisions] unavailable, returning []",e),[]}},quoteCart:async t=>{const e=d("/cart/quote"),s=await u({method:"POST",body:JSON.stringify(t)});return t.couponCode?(await G(e,s)).data:i(e,s)},validateCoupon:async t=>{const{data:e,asShopper:s}=await G(d("/coupons/validate"),await u({method:"POST",body:JSON.stringify(t)}));return{...e,askedAsShopper:s}},getHeaderSettings:async()=>{const t=D({method:"GET"}),e=await i(...await v(d("/header-settings"),{signal:t})),s=N(e.logoUrl);let o=null,l=null;if(s&&Rt(s)){const p=await Tt(s,t);p&&(o=p.reversed,l=p.inkIsDark)}return{...e,logoUrl:s,logoReversed:o,logoInkIsDark:l}},getThemeSettings:async()=>i(...await v(d("/theme-settings"))),getChatSettings:async()=>i(await f(d("/chat-settings")),await u())},ye={listServices:async()=>{try{return await i(d("/bookings/services"),await u())}catch(t){return console.warn("[bookings.listServices] API unavailable, returning []",t),{results:[],currency:"USD"}}},getAvailability:async(t,e)=>i(d(`/bookings/availability?service=${encodeURIComponent(t)}&date=${e}`),await u()),create:async t=>i(d("/bookings"),await u({method:"POST",body:JSON.stringify(t)})),get:async t=>i(d(`/bookings/manage/${encodeURIComponent(t)}`),await u()),cancel:async t=>i(d(`/bookings/manage/${encodeURIComponent(t)}/cancel`),await u({method:"POST"})),createPaymentIntent:async t=>i(d("/bookings/payments/intent"),await u({method:"POST",body:JSON.stringify({manageToken:t})}))};class Gt extends Error{slug;count;constructor(e,s){super(`Slug "${e}" exists on ${s} websites; a site is required to pick one.`),this.slug=e,this.count=s,this.name="AmbiguousPageSlugError"}}const C=(t,e,s)=>{const o=new URLSearchParams({...e?{site:e}:{},...s?{draft:"1"}:{}}).toString();return`/api/storefront/${t}/${o?`?${o}`:""}`},$=t=>`/api/storefront/sites/${encodeURIComponent(t)}/`,Wt=t=>`${$(t)}currencies/`,jt="/api/storefront/media/ingest/";class zt extends Error{constructor(){super("This editor is not connected to a website, so an upload has nowhere to go. Open the page from the website the file should belong to, then try again."),this.name="MediaUploadDestinationError"}}function Kt(){const t=Et();if(!t)throw new zt;return`${jt}?${new URLSearchParams({site:t})}`}const Vt="X-Puck-Media-Manifest",Y=ct.contentHash,_={"X-Media-Manifest":Y,[Vt]:Y},he=Q({});function Q(t){return(e,s={})=>{const o=St(),l=t.headers||o?{...o?{"Accept-Language":o}:{},...t.headers,...s.headers}:void 0;return i(e,{...s,...t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{},...l?{headers:l}:{},audience:t.audience??mt()})}}function Xt(t={}){const e=Q(t),s=t.siteDrafts===!0,o=a=>C("header-settings",a,s),l=a=>C("theme-settings",a,s),p=a=>C("chat-settings",a,s),w=a=>C("social-settings",a,s);return{findPageBySlug:async(a,r,n)=>{const c=new URLSearchParams({slug:a});n&&c.set("site",n);const y=await e(`/api/storefront/pages/?${c.toString()}`,{token:r}),S=Array.isArray(y)?y:y.results??[];if(!n&&S.length>1)throw new Gt(a,S.length);return S[0]??null},getPageById:(a,r)=>e(`/api/storefront/pages/${a}/`,{token:r}),saveLayout:(a,r,n,c,y)=>e(`/api/storefront/pages/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r,expected_updated_at:c,...y?{client_id:y}:{}}),token:n}),duplicatePage:(a,r,n)=>e(`/api/storefront/pages/${a}/duplicate/`,{method:"POST",body:JSON.stringify({title:r.title,slug:r.slug}),token:n}),geocode:(a,r,n)=>e(`/api/storefront/geocode/?${new URLSearchParams(n?{q:a,country:n}:{q:a})}`,{token:r}),listBlockSources:a=>e("/api/storefront/block-sources/",{token:a}),listRecordTypes:a=>e("/api/storefront/record-types/",{token:a}),createPagePreviewLink:(a,r)=>e(`/api/storefront/pages/${a}/preview-link/`,{method:"POST",token:r}),claimPageEditLock:(a,r,n,c=!1)=>e(`/api/storefront/pages/${a}/edit-lock/`,{method:"POST",body:JSON.stringify({client_id:n,takeover:c}),token:r}),releasePageEditLock:(a,r)=>e(`/api/storefront/pages/${a}/edit-lock/`,{method:"DELETE",token:r}),createTemplate:(a,r,n)=>e("/api/storefront/page-templates/",{method:"POST",body:JSON.stringify({name:a,layout:r}),headers:_,token:n}),getTemplate:(a,r)=>e(`/api/storefront/page-templates/${a}/`,{token:r}),saveTemplateLayout:(a,r,n)=>e(`/api/storefront/page-templates/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r}),headers:_,token:n}),listTemplatePages:async(a,r)=>{const n=await e(`/api/storefront/template-pages/?template=${encodeURIComponent(a)}`,{token:r});return Array.isArray(n)?n:n.results??[]},findTemplatePageBySlug:async(a,r,n)=>{const c=await e(`/api/storefront/template-pages/?template=${encodeURIComponent(a)}&slug=${encodeURIComponent(r)}`,{token:n});return(Array.isArray(c)?c:c.results??[])[0]??null},createTemplatePage:(a,r,n)=>e("/api/storefront/template-pages/",{method:"POST",body:JSON.stringify({template:a,...r}),headers:_,token:n}),saveTemplatePageLayout:(a,r,n)=>e(`/api/storefront/template-pages/${a}/`,{method:"PATCH",body:JSON.stringify({layout:r}),headers:_,token:n}),deleteTemplatePage:(a,r,n)=>e(`/api/storefront/template-pages/${a}/`,{method:"DELETE",token:r,...n?.keepalive?{keepalive:!0}:{}}),listPages:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("site",r);const c=await e(`/api/storefront/pages/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]},createPage:(a,r,n,c)=>e("/api/storefront/pages/",{method:"POST",body:JSON.stringify({title:a,slug:r,layout:n}),token:c}),deletePage:(a,r)=>e(`/api/storefront/pages/${a}/`,{method:"DELETE",token:r}),getHeaderSettings:(a,r)=>e(o(r),{token:a}),listMenus:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("site",r);const c=await e(`/api/storefront/menus/?${n}`,{token:a});return Array.isArray(c)?c:c.results??[]},listBlogPosts:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.visibleOnly&&n.set("is_visible","true"),r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/blog-posts/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]},listFieldUsage:async(a,r)=>{const n=await e(`/api/storefront/field-usage/?site=${encodeURIComponent(r)}`,{token:a});return Array.isArray(n?.entries)?n.entries:[]},listCategories:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.visibleOnly&&n.set("is_visible","true"),r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/categories/?${n.toString()}`,{token:a});return[...Array.isArray(c)?c:c.results??[]].sort((S,R)=>S.sort_order-R.sort_order||S.name.localeCompare(R.name))},listForms:async(a,r={})=>{const n=new URLSearchParams({no_page:"true"});r.siteId&&n.set("site",r.siteId);const c=await e(`/api/storefront/forms/?${n.toString()}`,{token:a});return[...Array.isArray(c)?c:c.results??[]].sort((S,R)=>S.title.localeCompare(R.title))},listWheelSummaries:async(a,r={})=>{const n=new URLSearchParams;r.siteId&&n.set("site",r.siteId);const c=n.toString(),y=await e(`/api/storefront/wheel-curations/summaries/${c?`?${c}`:""}`,{token:a});return g(y)},listProducts:async(a,r={})=>{const n=new URLSearchParams;r.kinds?.length&&n.set("kind",r.kinds.join(",")),r.siteId&&n.set("site",r.siteId);const c=n.toString(),y=await e(`/api/storefront/products/${c?`?${c}`:""}`,{token:a});return g(y)},getWheelDetail:async(a,r,n={})=>{const c=new URLSearchParams({slug:r});return n.siteId&&c.set("site",n.siteId),L(g(await e(`/api/storefront/wheel-curations/detail/?${c.toString()}`,{token:a})))},updateHeaderSettings:(a,r,n)=>e(o(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getSite:(a,r)=>e($(a),{token:r}),listSites:async a=>{const r=await e("/api/storefront/sites/?no_page=true",{token:a});return Array.isArray(r)?r:r.results??[]},listSiteCurrencies:async(a,r)=>{const n=await e(Wt(a),{token:r});return Array.isArray(n)?n:[]},publishSite:(a,r)=>e(`${$(a)}publish/`,{method:"POST",token:r}),getSiteLiveState:(a,r)=>e(`${$(a)}live-state/`,{token:r}),getThemeSettings:(a,r)=>e(l(r),{token:a}),updateThemeSettings:(a,r,n)=>e(l(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getChatSettings:(a,r)=>e(p(r),{token:a}),updateChatSettings:(a,r,n)=>e(p(n),{method:"PATCH",body:JSON.stringify(a),token:r}),getSocialSettings:(a,r)=>e(w(r),{token:a}),updateSocialSettings:(a,r,n)=>e(w(n),{method:"PATCH",body:JSON.stringify(a),token:r}),uploadHeaderLogo:(a,r,n)=>{const c=new FormData;return c.append("logo",a),e(o(n),{method:"PATCH",body:c,token:r})},clearHeaderLogo:(a,r)=>e(o(r),{method:"PATCH",body:JSON.stringify({logo:null}),token:a}),setHeaderLogoFromAsset:(a,r,n)=>e(o(n),{method:"PATCH",body:JSON.stringify({logo_asset_id:a}),token:r}),uploadMedia:async(a,r)=>{const n=new FormData;return n.append("file",a),e(Kt(),{method:"POST",body:n,token:r})},listMedia:async(a,r)=>{const n=new URLSearchParams({no_page:"true"});r&&n.set("kind",r);const c=await e(`/api/storefront/media-assets/?${n.toString()}`,{token:a});return Array.isArray(c)?c:c.results??[]}}}const fe=Xt({siteDrafts:!0});export{ut as API_URL,Gt as AmbiguousPageSlugError,m as ApiError,ht as BROWSER_READ_TIMEOUT_MS,pt as EFFICIENT_CLIENT_CLOSED_MESSAGE,zt as MediaUploadDestinationError,Ft as PREVIEW_PARAM,we as PRODUCT_API_BASE,yt as SERVER_READ_TIMEOUT_MS,U as SERVER_UNREACHABLE_MESSAGE,I as STATUS_NETWORK_ERROR,he as adminFetch,bt as api,i as apiFetch,E as appendSiteQuery,ye as bookings,Xt as createStorefrontAdmin,D as defaultRequestDeadline,Kt as editorMediaUploadPath,mt as editorPortalAudience,St as editorRequestLanguage,le as fitment,pe as products,ft as readDeadlineMs,Dt as resolveClientIp,g as resolveMediaUrls,Mt as resolvePreviewToken,Z as resolveSiteHost,Lt as resolveSiteHostSource,xt as resolveSiteSlug,oe as setEditorLanguage,ne as setEditorPortalAudience,fe as storefrontAdmin};
@@ -1677,6 +1677,7 @@ export interface components {
1677
1677
  fbp?: string;
1678
1678
  fbc?: string;
1679
1679
  adConsent?: "granted" | "denied";
1680
+ checkoutFlow?: 1 | 2;
1680
1681
  };
1681
1682
  PaymentIntentRequest: {
1682
1683
  idempotencyKey: string;
@@ -1885,6 +1886,8 @@ export interface components {
1885
1886
  };
1886
1887
  OrderConfirmation: {
1887
1888
  orderNumber: string;
1889
+ checkoutNumber: string;
1890
+ expiresAt: string | null;
1888
1891
  status: string;
1889
1892
  total: string;
1890
1893
  currency: string;
@@ -0,0 +1,34 @@
1
+ import { type OrderConfirmation } from "../api/index.js";
2
+ import type { LandingOrder } from "./wallet-return.js";
3
+ export declare const PAY_FIRST_FLOW = 2;
4
+ export declare function paysFirst(method: string | null): boolean;
5
+ export declare const CHECKOUT_UNAVAILABLE = "checkout_unavailable";
6
+ export declare const NOT_CHECKED = "We could not check your payment. Please try again.";
7
+ export declare const INTENT_READ_MS = 10000;
8
+ export declare function readIntentStatus(intent: {
9
+ publishableKey: string;
10
+ clientSecret: string;
11
+ }, ms?: number): Promise<string | undefined>;
12
+ export declare const DROPPABLE_INTENT: Set<string>;
13
+ export declare function checkoutGone(err: unknown): boolean;
14
+ export declare function orderReference(conf: Pick<OrderConfirmation, "orderNumber" | "checkoutNumber">): string;
15
+ export type PayFirstResult = {
16
+ kind: "pending" | "processing" | "refunded" | "expired";
17
+ checkoutNumber: string;
18
+ };
19
+ export declare function payFirstOutcome(conf: OrderConfirmation): {
20
+ kind: "placed";
21
+ order: OrderConfirmation;
22
+ } | PayFirstResult;
23
+ export interface PayFirstPage {
24
+ setConfirming(on: boolean): void;
25
+ land(order: LandingOrder): void;
26
+ markPaid(): void;
27
+ track(order: OrderConfirmation): void;
28
+ unplaced(result: PayFirstResult): void;
29
+ }
30
+ export declare function settlePayFirst({ checkoutNumber, resend, page, }: {
31
+ checkoutNumber: string;
32
+ resend: () => Promise<OrderConfirmation>;
33
+ page: PayFirstPage;
34
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import{loadStripe as c}from"@stripe/stripe-js";import{ApiError as i}from"../api/index.js";const m=2;function y(e){return e==="card"}const u="checkout_unavailable",f="We could not check your payment. Please try again.",d=1e4;async function k(e,n=d){let t;const r=new Promise(o=>{t=setTimeout(()=>o(void 0),n)}),a=(async()=>{try{return(await(await c(e.publishableKey))?.retrievePaymentIntent(e.clientSecret))?.paymentIntent?.status}catch{return}})();try{return await Promise.race([a,r])}finally{clearTimeout(t)}}const x=new Set(["none","requires_payment_method","canceled"]);function N(e){return e instanceof i&&typeof e.data=="object"&&e.data!==null&&e.data.code===u}function h(e){return e.orderNumber||e.checkoutNumber}function s(e){return e.orderNumber?{kind:"placed",order:e}:{kind:e.status==="released"?"refunded":e.status==="expired"?"expired":"pending",checkoutNumber:e.checkoutNumber}}async function _({checkoutNumber:e,resend:n,page:t}){t.setConfirming(!0);let r;try{r=s(await n())}catch{r={kind:"pending",checkoutNumber:e}}r.kind==="placed"?(t.markPaid(),t.track(r.order),t.land(r.order)):t.unplaced({...r,checkoutNumber:r.checkoutNumber||e}),t.setConfirming(!1)}export{u as CHECKOUT_UNAVAILABLE,x as DROPPABLE_INTENT,d as INTENT_READ_MS,f as NOT_CHECKED,m as PAY_FIRST_FLOW,N as checkoutGone,h as orderReference,s as payFirstOutcome,y as paysFirst,k as readIntentStatus,_ as settlePayFirst};
@@ -1 +1 @@
1
- import{jsx as m}from"react/jsx-runtime";import y,{SourcedGalleryGrid as f}from"../../../../../components/pdp-dynamic/DynamicGalleryGrid.js";import{declaredBlockSource as r,sourcedRows as c}from"efficient-web-builder/format/lib/content/block-sources";import H from"../../../../../components/GalleryGrid.js";import{hidableText as d}from"efficient-easel/screen/lib/document/hidable";import{parseSectionHeadPlacement as k}from"efficient-web-builder/format/lib/sections/section-head-placement";import{phHide as i}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{GalleryBMeta as T,GALLERY_B_PH as n}from"./meta.js";const P={...T,render:e=>{const l=k(e.headPlacement)==="own-box",t=a=>l?void 0:a;if(r(e)!==""){const a=!!e.editor?.isEditing,{rows:o,sample:u}=c(e,a);return m(f,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),omitHead:l,rows:u?[]:o,limit:e.limit,layout:e.layout,editing:a,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0})}return e.dynamic?m(y,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),omitHead:l,galleryHref:d(e.galleryHref)||"/gallery",zone:e.mediaZone||"all",photoDisplay:e.photoDisplay||"covers",previewHover:e.previewHover,display:e.display,displayPhone:e.displayPhone,styleOwner:e.id,editing:e.editor?.isEditing,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0}):m(H,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),omitHead:l,linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),galleryHref:d(e.galleryHref)||"/gallery",previewHover:e.previewHover,display:e.display,displayPhone:e.displayPhone,styleOwner:e.id,layout:e.layout,columns:e.columns,columnsMobile:e.columnsMobile,gap:e.gap,items:e.items,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0,editing:e.editor?.isEditing})}};export{P as GalleryBRender};
1
+ import{jsx as m}from"react/jsx-runtime";import{phoneKey as y}from"efficient-easel/draw";import f,{SourcedGalleryGrid as r}from"../../../../../components/pdp-dynamic/DynamicGalleryGrid.js";import{declaredBlockSource as c,sourcedRows as H}from"efficient-web-builder/format/lib/content/block-sources";import g from"../../../../../components/GalleryGrid.js";import{hidableText as d}from"efficient-easel/screen/lib/document/hidable";import{parseSectionHeadPlacement as k}from"efficient-web-builder/format/lib/sections/section-head-placement";import{phHide as i}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{GalleryBMeta as T,GALLERY_B_PH as n}from"./meta.js";const D={...T,render:e=>{const l=k(e.headPlacement)==="own-box",t=a=>l?void 0:a;if(c(e)!==""){const a=!!e.editor?.isEditing,{rows:o,sample:u}=H(e,a);return m(r,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),omitHead:l,rows:u?[]:o,limit:e.limit,layout:e.layout,editing:a,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0})}return e.dynamic?m(f,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),omitHead:l,galleryHref:d(e.galleryHref)||"/gallery",zone:e.mediaZone||"all",photoDisplay:e.photoDisplay||"covers",previewHover:e.previewHover,display:e.display,displayPhone:e.displayPhone,styleOwner:e.id,editing:e.editor?.isEditing,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0}):m(g,{num:t(i(e.num,n.num,e.editor)),title:t(i(e.title,n.title,e.editor)),omitHead:l,linkText:t(i(e.linkText,n.link,e.editor)),linkHref:t(d(e.linkHref)||"/contact"),galleryHref:d(e.galleryHref)||"/gallery",previewHover:e.previewHover,display:e.display,displayPhone:e.displayPhone,styleOwner:e.id,layout:e.layout,columns:e.columns,columnsMobile:e.columnsMobile,gap:e.gap,gapPhone:e[y("gap")],items:e.items,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0,editing:e.editor?.isEditing})}};export{D as GalleryBRender};
@@ -1 +1 @@
1
- import{jsx as m}from"react/jsx-runtime";import h from"../../../../../components/pdp-dynamic/DynamicRelatedProducts.js";import{DEFAULT_RELATIONSHIP as w}from"../../../../catalog/relationships.js";import{resolveWidth as s}from"efficient-web-builder/format/lib/content/section-width";import C from"../../../../../components/ProductGridSection.js";import{resolveBoundCardImageBackground as f}from"efficient-web-builder/format/lib/content/card-image-background";import{hidableText as B}from"efficient-easel/screen/lib/document/hidable";import{parseCoverIndex as P}from"../../../../wheels/cover-rendering.js";import{parseSectionHeadPlacement as x}from"efficient-web-builder/format/lib/sections/section-head-placement";import{parseCardOutline as c,parseCardIndexFormat as u}from"efficient-web-builder/format/lib/sections/product-card-style";import{PH as n}from"efficient-web-builder/format/lib/document/blocks/placeholders";import{phHide as i}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{PRODUCTGRID_PH as t}from"../placeholders.js";import{ProductGridMeta as k}from"./meta.js";const A={...k,render:e=>{if(e.dynamic)return m(h,{num:i(e.num,t.num,e.editor),title:i(e.title,n.sectionHeading,e.editor),description:i(e.description,n.body,e.editor),columns:typeof e.columns=="number"?e.columns:3,relationship:w,cardImage:e.cardImage,outline:c(e.outline),indexBadge:u(e.indexBadge),showBadge:e.showBadge??!0,imageBackground:f(e.imageBackground),showCardPrice:e.showCardPrice,showCardFinishes:e.showCardFinishes,showCardSizes:e.showCardSizes,showCardBuy:e.showCardBuy,showCardPage:e.showCardPage,editing:e.editor?.isEditing});const a=i(e.linkText,t.link,e.editor),o=e.source,g=s(e,"full"),r=x(e.headPlacement)==="own-box",d=l=>r?void 0:l;return m(C,{gap:e.gap,contentCapped:g.mode==="page",num:d(i(e.num,t.num,e.editor)),title:d(i(e.title,n.sectionHeading,e.editor)),titleSize:e.titleSize,padTop:r?0:e.padTop,description:d(i(e.description,n.body,e.editor)),link:d(a?{text:a,href:B(e.linkHref)||"#"}:void 0),products:e.products,wheels:e.wheels,source:o?.slug?o:void 0,catalog:e.catalog,kinds:e.kinds,fieldUsage:e.fieldUsage,columns:e.columns,limit:e.showAll?void 0:e.limit,editing:e.editor?.isEditing,imageBackground:e.imageBackground,cardImage:e.cardImage,spinOnHover:e.spinOnHover,coverIndex:P(e.coverIndex),outline:c(e.outline),indexBadge:u(e.indexBadge),showBadge:e.showBadge??!0,showCardPrice:e.showCardPrice,showCardFinishes:e.showCardFinishes,showCardSizes:e.showCardSizes,showCardBuy:e.showCardBuy,showCardPage:e.showCardPage})}};export{A as ProductGridRender};
1
+ import{jsx as m}from"react/jsx-runtime";import{phoneKey as h}from"efficient-easel/draw";import w from"../../../../../components/pdp-dynamic/DynamicRelatedProducts.js";import{DEFAULT_RELATIONSHIP as f}from"../../../../catalog/relationships.js";import{resolveWidth as s}from"efficient-web-builder/format/lib/content/section-width";import C from"../../../../../components/ProductGridSection.js";import{resolveBoundCardImageBackground as B}from"efficient-web-builder/format/lib/content/card-image-background";import{hidableText as P}from"efficient-easel/screen/lib/document/hidable";import{parseCoverIndex as x}from"../../../../wheels/cover-rendering.js";import{parseSectionHeadPlacement as k}from"efficient-web-builder/format/lib/sections/section-head-placement";import{parseCardOutline as c,parseCardIndexFormat as u}from"efficient-web-builder/format/lib/sections/product-card-style";import{PH as n}from"efficient-web-builder/format/lib/document/blocks/placeholders";import{phHide as i}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{PRODUCTGRID_PH as t}from"../placeholders.js";import{ProductGridMeta as I}from"./meta.js";const j={...I,render:e=>{if(e.dynamic)return m(w,{num:i(e.num,t.num,e.editor),title:i(e.title,n.sectionHeading,e.editor),description:i(e.description,n.body,e.editor),columns:typeof e.columns=="number"?e.columns:3,relationship:f,cardImage:e.cardImage,outline:c(e.outline),indexBadge:u(e.indexBadge),showBadge:e.showBadge??!0,imageBackground:B(e.imageBackground),showCardPrice:e.showCardPrice,showCardFinishes:e.showCardFinishes,showCardSizes:e.showCardSizes,showCardBuy:e.showCardBuy,showCardPage:e.showCardPage,editing:e.editor?.isEditing});const a=i(e.linkText,t.link,e.editor),o=e.source,g=s(e,"full"),r=k(e.headPlacement)==="own-box",d=l=>r?void 0:l;return m(C,{gap:e.gap,gapPhone:e[h("gap")],contentCapped:g.mode==="page",num:d(i(e.num,t.num,e.editor)),title:d(i(e.title,n.sectionHeading,e.editor)),titleSize:e.titleSize,padTop:r?0:e.padTop,description:d(i(e.description,n.body,e.editor)),link:d(a?{text:a,href:P(e.linkHref)||"#"}:void 0),products:e.products,wheels:e.wheels,source:o?.slug?o:void 0,catalog:e.catalog,kinds:e.kinds,fieldUsage:e.fieldUsage,columns:e.columns,limit:e.showAll?void 0:e.limit,editing:e.editor?.isEditing,imageBackground:e.imageBackground,cardImage:e.cardImage,spinOnHover:e.spinOnHover,coverIndex:x(e.coverIndex),outline:c(e.outline),indexBadge:u(e.indexBadge),showBadge:e.showBadge??!0,showCardPrice:e.showCardPrice,showCardFinishes:e.showCardFinishes,showCardSizes:e.showCardSizes,showCardBuy:e.showCardBuy,showCardPage:e.showCardPage})}};export{j as ProductGridRender};
@@ -1 +1 @@
1
- import{jsx as y}from"react/jsx-runtime";import h,{readFacets as k,readTags as g}from"../../../../../components/Events.js";import{BLOCK_SOURCE_ROWS_PROP as b,declaredBlockSource as x,sourcedRows as A}from"efficient-web-builder/format/lib/content/block-sources";import{hidableText as E}from"efficient-easel/screen/lib/document/hidable";import{parseSectionHeadPlacement as S}from"efficient-web-builder/format/lib/sections/section-head-placement";import{phHide as m}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{say as n}from"efficient-web-builder/format/lib/editor-words";import{EventsMeta as T,EVENTS_PH as u}from"./meta.js";const v=()=>[{key:"sample-1",title:n("First card"),excerpt:n("A line about it appears here.")},{key:"sample-2",title:n("Second card"),excerpt:n("A line about it appears here.")},{key:"sample-3",title:n("Third card"),excerpt:n("A line about it appears here.")},{key:"sample-4",title:n("Fourth card"),excerpt:n("A line about it appears here.")}],f=(e,i,a)=>({slug:e.key||`card-${i}`,title:e.title??"",excerpt:e.excerpt??"",cover:e.cover??"",meta:e.meta||void 0,dateLabel:e.dateLabel||void 0,href:e.href||"#",...a?.facets?{facets:a.facets}:{},...a?.tags?{tags:a.tags}:{}});function B(e){const i=e[b],a=new Map,o=[];if(!Array.isArray(i))return{byKey:a,byIndex:o};for(const d of i){if(!d||typeof d!="object"||Array.isArray(d))continue;const t=d;if(!Object.values(t).some(l=>typeof l=="string"&&l))continue;const s={facets:k(t.facets),tags:g(t.tags)};o.push(s),typeof t.key=="string"&&t.key&&a.set(t.key,s)}return{byKey:a,byIndex:o}}const I={...T,render:e=>{const i=S(e.headPlacement)==="own-box",a=r=>i?void 0:r,o=m(e.linkText,u.link,e.editor),t=x(e)!==""?A(e,!!e.editor?.isEditing,v()):null,s=t&&!t.sample?B(e):null,l=t?t.sample?[]:t.rows.map((r,c)=>f(r,c,r.key?s?.byKey.get(r.key):s?.byIndex[c])):e.posts;return y(h,{num:a(m(e.num,u.num,e.editor)),title:a(m(e.title,u.title,e.editor)),link:a(o?{text:o,href:E(e.linkHref)||"/journal"}:void 0),omitHead:i,posts:l,sample:t?.sample?t.rows.map((r,c)=>f(r,c)):void 0,columns:e.columns,limit:e.limit,showAll:e.showAll,layout:e.layout,featuredWidth:e.featuredWidth,listCover:e.listCover,featuredDarken:e.featuredDarken,cardImage:e.cardImage,gap:e.gap,nameFilter:e.nameFilter===!0,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0,editing:e.editor?.isEditing})}};export{I as EventsRender};
1
+ import{jsx as y}from"react/jsx-runtime";import{phoneKey as h}from"efficient-easel/draw";import g,{readFacets as k,readTags as b}from"../../../../../components/Events.js";import{BLOCK_SOURCE_ROWS_PROP as x,declaredBlockSource as A,sourcedRows as E}from"efficient-web-builder/format/lib/content/block-sources";import{hidableText as S}from"efficient-easel/screen/lib/document/hidable";import{parseSectionHeadPlacement as T}from"efficient-web-builder/format/lib/sections/section-head-placement";import{phHide as m}from"efficient-web-builder/render/lib/document/blocks/scaffold";import{say as n}from"efficient-web-builder/format/lib/editor-words";import{EventsMeta as v,EVENTS_PH as u}from"./meta.js";const B=()=>[{key:"sample-1",title:n("First card"),excerpt:n("A line about it appears here.")},{key:"sample-2",title:n("Second card"),excerpt:n("A line about it appears here.")},{key:"sample-3",title:n("Third card"),excerpt:n("A line about it appears here.")},{key:"sample-4",title:n("Fourth card"),excerpt:n("A line about it appears here.")}],f=(e,i,a)=>({slug:e.key||`card-${i}`,title:e.title??"",excerpt:e.excerpt??"",cover:e.cover??"",meta:e.meta||void 0,dateLabel:e.dateLabel||void 0,href:e.href||"#",...a?.facets?{facets:a.facets}:{},...a?.tags?{tags:a.tags}:{}});function P(e){const i=e[x],a=new Map,r=[];if(!Array.isArray(i))return{byKey:a,byIndex:r};for(const d of i){if(!d||typeof d!="object"||Array.isArray(d))continue;const t=d;if(!Object.values(t).some(s=>typeof s=="string"&&s))continue;const l={facets:k(t.facets),tags:b(t.tags)};r.push(l),typeof t.key=="string"&&t.key&&a.set(t.key,l)}return{byKey:a,byIndex:r}}const K={...v,render:e=>{const i=T(e.headPlacement)==="own-box",a=o=>i?void 0:o,r=m(e.linkText,u.link,e.editor),t=A(e)!==""?E(e,!!e.editor?.isEditing,B()):null,l=t&&!t.sample?P(e):null,s=t?t.sample?[]:t.rows.map((o,c)=>f(o,c,o.key?l?.byKey.get(o.key):l?.byIndex[c])):e.posts;return y(g,{num:a(m(e.num,u.num,e.editor)),title:a(m(e.title,u.title,e.editor)),link:a(r?{text:r,href:S(e.linkHref)||"/journal"}:void 0),omitHead:i,posts:s,sample:t?.sample?t.rows.map((o,c)=>f(o,c)):void 0,columns:e.columns,limit:e.limit,showAll:e.showAll,layout:e.layout,featuredWidth:e.featuredWidth,listCover:e.listCover,featuredDarken:e.featuredDarken,cardImage:e.cardImage,gap:e.gap,gapPhone:e[h("gap")],nameFilter:e.nameFilter===!0,padTop:typeof e.padTop=="number"?e.padTop:void 0,padBottom:typeof e.padBottom=="number"?e.padBottom:void 0,editing:e.editor?.isEditing})}};export{K as EventsRender};
@@ -1 +1 @@
1
- import{jsx as p}from"react/jsx-runtime";import n from"../../../../../components/FooterGroup.js";import{FooterGroupMeta as i}from"./meta.js";const c={...i,render:({direction:o,gap:r,align:t,blocks:e})=>p(n,{direction:o,gap:r,align:t,content:e})};export{c as FooterGroupRender};
1
+ import{jsx as n}from"react/jsx-runtime";import{phoneKey as m}from"efficient-easel/draw";import i from"../../../../../components/FooterGroup.js";import{FooterGroupMeta as a}from"./meta.js";const d={...a,render:({direction:o,gap:r,align:e,blocks:t,...p})=>n(i,{direction:o,gap:r,gapPhone:p[m("gap")],align:e,content:t})};export{d as FooterGroupRender};
@@ -1 +1 @@
1
- function o(t){const e=t.oemSizes.length>0?` Your car takes ${t.oemSizes.join(", ")}.`:"";return t.status==="fits"?`This tyre is made in a size your car takes.${e}`:t.status==="doesNotFit"?`This tyre is not made in a size your car takes.${e}`:"We don’t hold factory tyre sizes for this car, so we can’t tell you whether this tyre fits it. Please check your car’s door placard or ask us before ordering."}const s={fits:"Fits",doesNotFit:"Not your size",unknown:"Unknown"};export{s as TYRE_FIT_LABEL,o as tyreFitHeadline};
1
+ function o(e){const t=e.oemSizes.length>0?` Your car takes ${e.oemSizes.join(", ")}.`:"";return e.status==="fits"?`This tyre is made in a size your car takes.${t}`:e.status==="doesNotFit"?`This tyre is not made in a size your car takes.${t}`:e.failed?"We couldn’t check whether this tyre fits your car just now. Please try again, or ask us before ordering.":"We don’t hold factory tyre sizes for this car, so we can’t tell you whether this tyre fits it. Please check your car’s door placard or ask us before ordering."}const r={fits:"Fits",doesNotFit:"Not your size",unknown:"Unknown"};export{r as TYRE_FIT_LABEL,o as tyreFitHeadline};
@@ -1,7 +1,9 @@
1
1
  import type { StockFitment, TyreVehicleFitment } from "../api/index.js";
2
2
  import type { VehicleSelection } from "../wheels/fitment-options.js";
3
3
  export type TyreFitStatus = TyreVehicleFitment["status"];
4
- export type TyreFitAnswer = TyreVehicleFitment;
4
+ export type TyreFitAnswer = TyreVehicleFitment & {
5
+ failed?: true;
6
+ };
5
7
  export interface TyreFitVehicleQuery {
6
8
  make: string;
7
9
  model: string;
@@ -1 +1 @@
1
- import{PRODUCT_API_BASE as c,apiFetch as m}from"../api/index.js";import{parseTyreSize as u,tyreSizeLabel as y}from"./tyre-size.js";function k(t){if(!t||t.year===null)return null;const{make:n,model:e,year:r,modification:o}=t;return!n||!e||!o?null:{make:n,model:e,year:r,modification:o}}function l(t,n){const e=new URLSearchParams({make:n.make,model:n.model,year:String(n.year),modification:n.modification});return`/api/v1/tyres/${encodeURIComponent(t)}/fitment?${e.toString()}`}function s(t,n=""){return{vehicle:{...t,region:n},status:"unknown",oemSizes:[],variants:[]}}function p(t,n){if(typeof n!="object"||n===null)return s(t);const e=n,r=typeof e.vehicle=="object"&&e.vehicle!==null?e.vehicle:{},o=typeof r.region=="string"?r.region:"",a=e.status;if(a!=="fits"&&a!=="doesNotFit")return s(t,o);const f=Array.isArray(e.variants)?e.variants.filter(i=>typeof i=="object"&&i!==null&&typeof i.sku=="string"&&typeof i.fits=="boolean"):[];return f.length===0?s(t,o):{vehicle:{make:typeof r.make=="string"?r.make:t.make,model:typeof r.model=="string"?r.model:t.model,year:typeof r.year=="number"?r.year:t.year,modification:typeof r.modification=="string"?r.modification:t.modification,region:o},status:a,oemSizes:Array.isArray(e.oemSizes)?e.oemSizes.filter(i=>typeof i=="string"):[],variants:f.map(i=>({sku:i.sku,size:typeof i.size=="string"?i.size:"",fits:i.fits}))}}async function z(t,n){try{const e=await m(l(t,n),{baseUrl:c});return p(n,e)}catch{return s(n)}}function S(t){if(!t)return[];const n=[];for(const e of[...t.frontTyres,...t.rearTyres]){const r=u(e);if(!r)continue;const o=y(r);n.includes(o)||n.push(o)}return n}function b(t,n){if(n.length===0)return null;for(const e of t){const r=u(e);if(!r)continue;const o=y(r);if(n.includes(o))return o}return null}function A(t,n){if(!t||t.status==="unknown")return"unknown";const e=t.variants.find(r=>r.sku===n);return e?e.fits?"fits":"doesNotFit":"unknown"}export{z as loadTyreVehicleFitment,b as oemBadgeSize,S as oemTyreSizes,p as toTyreFitAnswer,k as tyreFitQuery,l as tyreVehicleFitmentPath,A as variantFitStatus};
1
+ import{ApiError as y,PRODUCT_API_BASE as m,apiFetch as l}from"../api/index.js";import{parseTyreSize as u,tyreSizeLabel as c}from"./tyre-size.js";function z(t){if(!t||t.year===null)return null;const{make:n,model:e,year:r,modification:o}=t;return!n||!e||!o?null:{make:n,model:e,year:r,modification:o}}function p(t,n){const e=new URLSearchParams({make:n.make,model:n.model,year:String(n.year),modification:n.modification});return`/api/v1/tyres/${encodeURIComponent(t)}/fitment?${e.toString()}`}function s(t,n=""){return{vehicle:{...t,region:n},status:"unknown",oemSizes:[],variants:[]}}function d(t,n){if(typeof n!="object"||n===null)return s(t);const e=n,r=typeof e.vehicle=="object"&&e.vehicle!==null?e.vehicle:{},o=typeof r.region=="string"?r.region:"",a=e.status;if(a!=="fits"&&a!=="doesNotFit")return s(t,o);const f=Array.isArray(e.variants)?e.variants.filter(i=>typeof i=="object"&&i!==null&&typeof i.sku=="string"&&typeof i.fits=="boolean"):[];return f.length===0?s(t,o):{vehicle:{make:typeof r.make=="string"?r.make:t.make,model:typeof r.model=="string"?r.model:t.model,year:typeof r.year=="number"?r.year:t.year,modification:typeof r.modification=="string"?r.modification:t.modification,region:o},status:a,oemSizes:Array.isArray(e.oemSizes)?e.oemSizes.filter(i=>typeof i=="string"):[],variants:f.map(i=>({sku:i.sku,size:typeof i.size=="string"?i.size:"",fits:i.fits}))}}async function S(t,n){try{const e=await l(p(t,n),{baseUrl:m});return d(n,e)}catch(e){return e instanceof y&&e.status>=400&&e.status<500?s(n):{...s(n),failed:!0}}}function b(t){if(!t)return[];const n=[];for(const e of[...t.frontTyres,...t.rearTyres]){const r=u(e);if(!r)continue;const o=c(r);n.includes(o)||n.push(o)}return n}function A(t,n){if(n.length===0)return null;for(const e of t){const r=u(e);if(!r)continue;const o=c(r);if(n.includes(o))return o}return null}function F(t,n){if(!t||t.status==="unknown")return"unknown";const e=t.variants.find(r=>r.sku===n);return e?e.fits?"fits":"doesNotFit":"unknown"}export{S as loadTyreVehicleFitment,A as oemBadgeSize,b as oemTyreSizes,d as toTyreFitAnswer,z as tyreFitQuery,p as tyreVehicleFitmentPath,F as variantFitStatus};
package/dist/words.d.ts CHANGED
@@ -143,7 +143,6 @@ export type WebBuilderPhrase =
143
143
  | "Anchor"
144
144
  | "Animation"
145
145
  | "Another group already uses this heading — pick a different one."
146
- | "Another page uses this URL handle."
147
146
  | "Answer"
148
147
  | "Any color"
149
148
  | "App"
@@ -336,7 +335,6 @@ export type WebBuilderPhrase =
336
335
  | "Couldn’t add the page — please retry."
337
336
  | "Couldn’t add the popup — please retry."
338
337
  | "Couldn’t delete the page — please retry."
339
- | "Couldn’t duplicate the page — please retry."
340
338
  | "Couldn’t duplicate the section — please retry"
341
339
  | "Couldn’t load pages"
342
340
  | "Couldn’t open this section."
@@ -411,7 +409,6 @@ export type WebBuilderPhrase =
411
409
  | "Down"
412
410
  | "Draft before restore"
413
411
  | "Drop in your own sanitized HTML."
414
- | "Duplicate page"
415
412
  | "Duplicate section"
416
413
  | "Duplicate to another page"
417
414
  | "Duplicate to page"
@@ -1124,7 +1121,6 @@ export type WebBuilderPhrase =
1124
1121
  | "Texture opacity"
1125
1122
  | "Thanks — we'll email you to confirm."
1126
1123
  | "The chat bubble is hidden across the whole site."
1127
- | "The copy is a draft and stays hidden until you publish it. It opens in the editor."
1128
1124
  | "The current product's compatible tyres — image, size, key specs and price per tyre, with an inquiry link. Display only."
1129
1125
  | "The current product's related items in a tidy row — the product page's built-in 'Pair with' cross-sell."
1130
1126
  | "The floating chat bubble shows in the corner of every page."
@@ -1208,7 +1204,6 @@ export type WebBuilderPhrase =
1208
1204
  | "Typed in"
1209
1205
  | "Tyre Fitment Form"
1210
1206
  | "Tyre Sizes"
1211
- | "URL handle"
1212
1207
  | "URL pill"
1213
1208
  | "URL: /{slug}"
1214
1209
  | "Undo"