efficient-storefront-blocks 0.87.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/chunks/{EditorPreviewCheckout-GD4IJ4WK.js → EditorPreviewCheckout-ZGPS3Q3X.js} +1 -1
  3. package/dist/chunks/{SiteEditorProvider-2UVCJZXS.js → SiteEditorProvider-HZ47WOEX.js} +1 -1
  4. package/dist/chunks/{chunk-H4IHUSCU.js → chunk-7C2YH2AQ.js} +1 -1
  5. package/dist/chunks/chunk-O7GCI2MP.js +1 -0
  6. package/dist/chunks/chunk-RHNDIM7Z.js +382 -0
  7. package/dist/chunks/chunk-VOK5N3IB.js +1 -0
  8. package/dist/chunks/{fitment-data-5GBUMO2O.js → fitment-data-SH4US3BV.js} +1 -1
  9. package/dist/contract.js +14 -2
  10. package/dist/editor/components/CategorySource.d.ts +8 -1
  11. package/dist/editor/components/CategorySource.js +1 -1
  12. package/dist/editor/components/CollectionPicker.js +1 -1
  13. package/dist/editor/components/EditProductLink.js +1 -1
  14. package/dist/editor/components/FinishPicker.js +1 -1
  15. package/dist/editor/components/FormPicker.js +1 -1
  16. package/dist/editor/components/GalleryShowcaseSource.js +1 -1
  17. package/dist/editor/components/HeaderSettingsPanel.js +1 -1
  18. package/dist/editor/components/ProductHeroSource.js +1 -1
  19. package/dist/editor/components/ProductPicker.js +1 -1
  20. package/dist/editor/components/ReviewsProductSource.js +1 -1
  21. package/dist/editor/components/SocialLinksDoor.js +1 -1
  22. package/dist/editor/components/SpecTableSource.js +1 -1
  23. package/dist/editor/lib/document/blocks/commerce/BundleOffer/fields.js +1 -1
  24. package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.d.ts +2 -0
  25. package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.js +1 -0
  26. package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.d.ts +2 -0
  27. package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.js +1 -0
  28. package/dist/editor/lib/document/blocks/commerce/GalleryItem/fields.js +1 -1
  29. package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.d.ts +2 -0
  30. package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.js +1 -0
  31. package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
  32. package/dist/editor/lib/document/blocks/commerce/ProductName/fields.js +1 -1
  33. package/dist/editor/lib/document/blocks/commerce/ProductPicture/fields.js +1 -1
  34. package/dist/editor/lib/document/blocks/commerce/controls.d.ts +4 -0
  35. package/dist/editor/lib/document/blocks/commerce/controls.js +1 -1
  36. package/dist/editor/lib/document/blocks/commerce/index.d.ts +1 -1
  37. package/dist/editor/lib/document/blocks/commerce/index.js +1 -1
  38. package/dist/editor/lib/document/config.js +1 -1
  39. package/dist/editor/lib/editor-words-kept.d.ts +1 -0
  40. package/dist/editor/lib/editor-words-kept.js +1 -0
  41. package/dist/editor/lib/efficient-backend.d.ts +7 -1
  42. package/dist/editor/lib/efficient-backend.js +1 -1
  43. package/dist/editor/lib/storefront-document.js +1 -1
  44. package/dist/editor/lib/storefront-editor-words.d.ts +33 -4
  45. package/dist/editor/lib/storefront-editor-words.js +1 -1
  46. package/dist/editor.css +1 -1
  47. package/dist/index.js +134 -81
  48. package/dist/links.js +1 -1
  49. package/dist/render/app/globals.css +111 -0
  50. package/dist/render/built-with.json +1 -1
  51. package/dist/render/components/BundleCard.d.ts +2 -1
  52. package/dist/render/components/BundleCard.js +1 -1
  53. package/dist/render/components/GalleryGrid.js +1 -1
  54. package/dist/render/components/GalleryItem.d.ts +11 -1
  55. package/dist/render/components/GalleryItem.js +1 -1
  56. package/dist/render/components/GridCardTemplate.d.ts +7 -1
  57. package/dist/render/components/GridCardTemplate.js +1 -1
  58. package/dist/render/components/ProductGridSection.d.ts +5 -1
  59. package/dist/render/components/ProductGridSection.js +1 -1
  60. package/dist/render/components/ProductHeroPanel.js +1 -1
  61. package/dist/render/components/ProductRef.d.ts +8 -2
  62. package/dist/render/components/ProductRef.js +1 -1
  63. package/dist/render/components/SectionBand.d.ts +3 -2
  64. package/dist/render/components/SectionBand.js +1 -1
  65. package/dist/render/components/card-pieces/CardBuyButton.d.ts +8 -1
  66. package/dist/render/components/card-pieces/CardBuyButton.js +1 -1
  67. package/dist/render/components/card-pieces/CardName.d.ts +2 -1
  68. package/dist/render/components/card-pieces/CardName.js +1 -1
  69. package/dist/render/components/card-pieces/CardPrice.js +1 -1
  70. package/dist/render/components/card-pieces/CardProductBadge.d.ts +2 -1
  71. package/dist/render/components/card-pieces/CardProductBadge.js +1 -1
  72. package/dist/render/components/card-pieces/CardProductPicture.d.ts +5 -0
  73. package/dist/render/components/card-pieces/CardProductPicture.js +1 -1
  74. package/dist/render/components/card-pieces/CardSpecs.js +1 -1
  75. package/dist/render/components/card-pieces/HostPart.js +1 -1
  76. package/dist/render/components/card-pieces/ProductCardState.d.ts +25 -6
  77. package/dist/render/components/card-pieces/ProductCardState.js +1 -1
  78. package/dist/render/components/catalog/CatalogFilterContext.d.ts +4 -1
  79. package/dist/render/components/catalog/CatalogFilterContext.js +1 -1
  80. package/dist/render/components/catalog/ClearAllButton.d.ts +4 -0
  81. package/dist/render/components/catalog/ClearAllButton.js +1 -0
  82. package/dist/render/components/catalog/FilterPill.d.ts +4 -2
  83. package/dist/render/components/catalog/FilterPill.js +1 -1
  84. package/dist/render/components/catalog/ShopperChips.d.ts +13 -0
  85. package/dist/render/components/catalog/ShopperChips.js +1 -0
  86. package/dist/render/components/catalog/ShopperFilters.d.ts +20 -0
  87. package/dist/render/components/catalog/ShopperFilters.js +1 -0
  88. package/dist/render/components/catalog/ShopperScope.d.ts +72 -0
  89. package/dist/render/components/catalog/ShopperScope.js +3 -0
  90. package/dist/render/components/catalog/SortSelect.js +1 -1
  91. package/dist/render/components/pdp-dynamic/DynamicRelatedProducts.js +1 -1
  92. package/dist/render/components/wheels-plp/PlpActiveChips.js +1 -1
  93. package/dist/render/components/wheels-plp/PlpPagination.d.ts +2 -1
  94. package/dist/render/components/wheels-plp/PlpPagination.js +1 -1
  95. package/dist/render/components/wheels-plp/PlpSidebar.js +1 -1
  96. package/dist/render/components/wheels-plp/usePlpFiltersInUrl.d.ts +2 -0
  97. package/dist/render/components/wheels-plp/usePlpFiltersInUrl.js +1 -1
  98. package/dist/render/lib/api/index.d.ts +6 -0
  99. package/dist/render/lib/api/index.js +1 -1
  100. package/dist/render/lib/catalog/related-cards.d.ts +4 -1
  101. package/dist/render/lib/catalog/relationships.d.ts +9 -2
  102. package/dist/render/lib/catalog/relationships.js +1 -1
  103. package/dist/render/lib/commerce.d.ts +2 -0
  104. package/dist/render/lib/commerce.js +1 -1
  105. package/dist/render/lib/content/article-body.js +1 -5
  106. package/dist/render/lib/content/filter-card-seed.d.ts +10 -0
  107. package/dist/render/lib/content/filter-card-seed.js +1 -0
  108. package/dist/render/lib/content/product-card-seed.d.ts +5 -0
  109. package/dist/render/lib/content/product-card-seed.js +1 -1
  110. package/dist/render/lib/document/blocks/commerce/BundleOffer/meta.js +1 -1
  111. package/dist/render/lib/document/blocks/commerce/BundleOffer/render.js +1 -1
  112. package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.d.ts +8 -0
  113. package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.js +1 -0
  114. package/dist/render/lib/document/blocks/commerce/FilterBlock/render.d.ts +2 -0
  115. package/dist/render/lib/document/blocks/commerce/FilterBlock/render.js +1 -0
  116. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.d.ts +8 -0
  117. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.js +1 -0
  118. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.d.ts +2 -0
  119. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.js +1 -0
  120. package/dist/render/lib/document/blocks/commerce/GalleryB/meta.js +1 -1
  121. package/dist/render/lib/document/blocks/commerce/GalleryItem/render.js +1 -1
  122. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.d.ts +2 -0
  123. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.js +1 -0
  124. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.d.ts +2 -0
  125. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.js +1 -0
  126. package/dist/render/lib/document/blocks/commerce/ProductGrid/meta.js +1 -1
  127. package/dist/render/lib/document/blocks/commerce/ProductGrid/render.js +1 -1
  128. package/dist/render/lib/document/blocks/commerce/ProductHero/meta.js +1 -1
  129. package/dist/render/lib/document/blocks/commerce/ProductName/render.js +1 -1
  130. package/dist/render/lib/document/blocks/commerce/ProductPicture/render.js +1 -1
  131. package/dist/render/lib/document/blocks/commerce/metas.d.ts +3 -0
  132. package/dist/render/lib/document/blocks/commerce/metas.js +1 -1
  133. package/dist/render/lib/document/blocks/commerce/renders.d.ts +3 -0
  134. package/dist/render/lib/document/blocks/commerce/renders.js +1 -1
  135. package/dist/render/lib/document/card-templates.d.ts +1 -0
  136. package/dist/render/lib/document/card-templates.js +1 -1
  137. package/dist/render/lib/document/document-nodes.d.ts +24 -0
  138. package/dist/render/lib/document/document-nodes.js +1 -0
  139. package/dist/render/lib/document/lazy-draws.js +1 -1
  140. package/dist/render/lib/document/render-config.js +1 -1
  141. package/dist/render/lib/document/storefront-root.js +1 -1
  142. package/dist/render/lib/links/link-rules.js +1 -1
  143. package/dist/render/lib/sections/bundle-to-grid.d.ts +8 -0
  144. package/dist/render/lib/sections/bundle-to-grid.js +1 -0
  145. package/dist/render/lib/sections/catalog-text-size.d.ts +2 -0
  146. package/dist/render/lib/sections/catalog-text-size.js +1 -1
  147. package/dist/render/lib/sections/filter-option-rows.d.ts +37 -0
  148. package/dist/render/lib/sections/filter-option-rows.js +1 -0
  149. package/dist/render/lib/sections/gallery-toolbar.d.ts +27 -0
  150. package/dist/render/lib/sections/gallery-toolbar.js +1 -0
  151. package/dist/render/lib/sections/grid-no-hole.d.ts +3 -0
  152. package/dist/render/lib/sections/grid-no-hole.js +1 -1
  153. package/dist/render/lib/sections/product-grid-pages.d.ts +42 -0
  154. package/dist/render/lib/sections/product-grid-pages.js +1 -0
  155. package/dist/render/lib/sections/shopper-filters.d.ts +45 -0
  156. package/dist/render/lib/sections/shopper-filters.js +1 -0
  157. package/dist/render/lib/wheels/plp-filters.d.ts +6 -3
  158. package/dist/render/lib/wheels/plp-filters.js +1 -1
  159. package/dist/render/lib/wheels/plp-hydrate.d.ts +5 -3
  160. package/dist/render/lib/wheels/plp-hydrate.js +1 -1
  161. package/dist/render/lib/wheels/selected-ranges.d.ts +16 -0
  162. package/dist/render/lib/wheels/selected-ranges.js +1 -0
  163. package/dist/render/lib/wheels/set-mode.d.ts +10 -0
  164. package/dist/render/lib/wheels/set-mode.js +1 -1
  165. package/dist/render/lib/wheels/shopper-first-paint.d.ts +28 -0
  166. package/dist/render/lib/wheels/shopper-first-paint.js +1 -0
  167. package/dist/render/lib/wheels/shopper-scope.d.ts +11 -0
  168. package/dist/render/lib/wheels/shopper-scope.js +1 -0
  169. package/dist/words.d.ts +46 -6
  170. package/dist/words.js +6 -6
  171. package/package.json +4 -4
  172. package/dist/chunks/chunk-QLR6IVWJ.js +0 -369
  173. package/dist/chunks/chunk-SYK5QPNV.js +0 -1
  174. package/dist/chunks/chunk-XZ46W3NV.js +0 -1
  175. package/dist/render/components/pdp-dynamic/DynamicBundleOffer.d.ts +0 -13
  176. package/dist/render/components/pdp-dynamic/DynamicBundleOffer.js +0 -1
  177. /package/dist/chunks/{chunk-DLWIDJS5.js → chunk-NQLVRCTI.js} +0 -0
  178. /package/dist/chunks/{chunk-QLR6IVWJ.js.LEGAL.txt → chunk-RHNDIM7Z.js.LEGAL.txt} +0 -0
@@ -0,0 +1 @@
1
+ import{f as Ct,i as be,q as xt,s as St,t as vt,v as G}from"./chunk-7C2YH2AQ.js";import{La as ye,Ma as yt,Pa as qe,Qa as bt,Ta as We,Ua as Ge}from"./chunk-O7GCI2MP.js";import{j as ht,l as ae}from"./chunk-NQLVRCTI.js";import{createContext as Sn,useContext as Nt,useEffect as vn,useMemo as Ce,useState as _t}from"react";function Pt(e,t){return e.map(n=>({partNumber:n.partNumber,quantity:n.wheels*t}))}function se(e,t){if(e.length===0)return null;let n=0;for(let r of e){let o=r.prices?.[t];if(typeof o!="number"||!Number.isFinite(o)||o<=0)return null;n+=o*r.wheels}return n}var Ke=4,Hr=1,Br={unit:"set",spares:0,spareSide:"left"};function wt(e){return e.unit==="single"?1:Ke+e.spares}function qr(e,t){return[{partNumber:e.partNumber,wheels:wt(t),prices:e.prices}]}function Wr(e,t){let n=wt(t)-Ke;if(n<=0||e.length===0)return e;let r=bn(e),o=r?r[t.spareSide]:0;return e.map((i,s)=>s===o?{...i,wheels:i.wheels+n}:i)}function bn(e){let t,n;for(let r=0;r<e.length;r+=1){let o=e[r].hand;if(o!=="left"&&o!=="right")continue;if((o==="left"?t:n)!==void 0)return null;o==="left"?t=r:n=r}return t!==void 0&&n!==void 0?{left:t,right:n}:null}function Cn(e,t){return t.spares>0?`${e} + spare`:e}function Gr(e){return e.unit==="single"?"Single":Cn(`Set of ${Ke}`,e)}var Kr="data-add-to-basket",ze=9,xn="en",Et=new Map;function Le(e,t,n){let r=`${e}|${t??""}|${n??""}`,o=Et.get(r);return o||(o=new Intl.NumberFormat(xn,{style:"currency",currency:e,...t===void 0?{}:{minimumFractionDigits:t},...n===void 0?{}:{maximumFractionDigits:n}}),Et.set(r,o)),o}function le(e,t,n=0){return Le(t,0,n).format(e)}function zr(e,t){return Le(t).format(e)}function Xr(e,t){let n=e.savings[t];if(n===void 0)return null;let r=le(n,t);return e.savingIsFrom?`Save from ${r}`:`Save ${r}`}import{jsx as _n}from"react/jsx-runtime";var En="storefront-country",Rt=En,Xe=Sn(null);function Pn(e){return Lt(e,"catalogue")}function wn(e){return Lt(e,"money")}function Lt(e,t){let n=new Map(e.map(r=>[r.code,r.decimalPlaces]));return(r,o)=>{if(!o)return"";let i=n.get(o)??0;return Le(o,t==="money"?i:0,i).format(r)}}function Zr({children:e,currencies:t,countries:n,defaultCurrency:r,defaultCountry:o}){let i=Ce(()=>t??[],[t]),s=Ce(()=>n??[],[n]),l=Ce(()=>r||i.find(p=>p.isDefault)?.code||i[0]?.code||"",[r,i]),u=Ce(()=>o||s.find(p=>p.isDefault)?.code||s[0]?.code||"",[o,s]),[c,f]=_t(u),[C,d]=_t(!1);vn(()=>{let p=ae.getItem(Rt);p&&s.some(M=>M.code===p)&&f(p),d(!0)},[s]);function w(p){f(p),ae.setItem(Rt,p)}let E=Ce(()=>{let p=s.find(R=>R.code===c)??null,M=p?.currency,L=M&&i.some(R=>R.code===M)?M:l,F=Pn(i),_=wn(i);return{country:c,currency:L,setCountry:w,currencies:i,countries:s,activeCountry:p,formatPrice:(R,h)=>F(R,h??L),formatMoney:(R,h)=>_(R,h??L),ready:C}},[c,i,s,l,C]);return _n(Xe.Provider,{value:E,children:e})}function kt(){let e=Nt(Xe);if(!e)throw new Error("useCurrency must be used within a CurrencyProvider");return e}function Jr(){return Nt(Xe)?.country??""}import{createContext as Bn,useCallback as v,useContext as qn,useEffect as V,useMemo as Gt,useRef as ue,useState as N}from"react";function It(){return"/edit"}function Tt(e,t){return e.valid?!1:e.reason==="firstOrderOnly"?!0:e.reason==="notEligible"&&!t}var Ot="We'll confirm this discount when you place your order.",oo="Confirmed at checkout";function io(e){return e&&(e.valid||e.deferred)?e.code:void 0}var At="coupon_code: ";function ao(e){return!(e instanceof be)||e.status!==400||!e.message.startsWith(At)?null:e.message.slice(At.length)}function Mt(e,t){return e.map(n=>({qty:n.qty,slug:n.slug,name:`${n.name.lead}${n.name.accent}`.trim(),finish:n.finishName,size:n.size,kind:n.kind,sku:n.sku,pack:n.pack,priceLabel:t(n)}))}var ke="Price on request",Nn="Request a quote",Ln="from ",co="From ",fo="each",Dt="Free";function Ve(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ye(e,t){let n=e?.[t];return Ve(n)?n:null}function po(e,t,n,r){let o=Ye(e,n),i=Ye(t,n);return o===null&&i===null?0:o===null?1:i===null?-1:r==="asc"?o-i:i-o}function mo(e,t,n,r){if(n==null&&r==null)return!0;let o=Ye(e,t);return!(o===null||n!=null&&o<n||r!=null&&o>r)}var kn={priced:!1,unit:null,was:null,onSale:!1,setTotal:null};function In(e,t,n){if(!Ve(e))return kn;let r=Ve(t)&&t>e?t:null;return{priced:!0,unit:e,was:r,onSale:r!==null,setTotal:n!=null?e*n:null}}function go(e,t,n=""){return!e.priced||e.unit==null?ke:`${n}${le(e.unit,t)}`}function ho(e,t){return e.was==null?null:le(e.was,t)}function An(e,t,n=1){let r=se(e,t);if(r===null)return{priced:!1,unit:null,isFrom:!1,setTotal:null};let o=e.reduce((s,l)=>s+l.wheels,0),i=Math.min(...e.map(s=>s.prices[t]));return{priced:!0,unit:i,isFrom:i*o!==r,setTotal:r*n}}var Tn={priced:!1,unit:null,isFrom:!1,was:null,onSale:!1,setTotal:null};function yo(e,t,n,r=1){let o=In(e.prices[n],e.msrpPrices?.[n],4),i=o.setTotal==null?null:o.setTotal*r;if(!t)return{priced:o.priced,unit:o.unit,isFrom:!0,was:o.was,onSale:o.onSale,setTotal:null,fromSetTotal:i};let s=An(t.components,n,r);return s.priced?{priced:!0,unit:s.unit,isFrom:s.isFrom,was:null,onSale:!1,setTotal:s.setTotal,fromSetTotal:i}:{...Tn,fromSetTotal:i}}function On(e,t){return!e.priced||e.unit==null?ke:`${e.isFrom?Ln:""}${le(e.unit,t)}`}function bo(e,t){return e.was==null?null:le(e.was,t)}function Co(e,t){return!e.priced||e.unit==null?Nn:On(e,t)}var Mn=/^[^@\s]+@[^@\s]+\.[^@\s]+$/;function Ft(e){return Mn.test(e.trim())}var Ut="sf:ga-purchases",Dn=20;function Ht(){return typeof window>"u"||window.parent!==window}function xe(...e){try{if(Ht()||typeof window.gtag!="function")return;window.gtag(...e)}catch{}}function Fn(e,t){let n=e.config.find(r=>r.gold)?.label;return{item_id:`${e.slug}|${e.finishName}|${e.size}`,item_name:`${e.name.lead}${e.name.accent}`.trim(),...n?{item_variant:n}:{},price:se(e.components,t)??0,quantity:e.qty}}function Qe(e,t){return e.filter(Ie).map(n=>Fn(n,t))}function wo(e){xe("event","view_item",{currency:e.currency,value:e.pricePerSet,items:[{item_id:e.itemId,item_name:e.itemName,...e.variant?{item_variant:e.variant}:{},price:e.pricePerSet,quantity:1}]})}function Bt(e,t){let n=Qe([e],t);n.length!==0&&xe("event","add_to_cart",{currency:t,value:n[0].price*n[0].quantity,items:n})}function _o(e){let t=Qe(e.lines,e.currency);t.length!==0&&xe("event","begin_checkout",{currency:e.currency,value:e.value,...e.coupon?{coupon:e.coupon}:{},items:t})}var $t=new Set;function Un(e){if($t.has(e))return!1;$t.add(e);try{let t=JSON.parse(ae.getItem(Ut)??"[]");if(t.includes(e))return!1;ae.setItem(Ut,JSON.stringify([...t,e].slice(-Dn)))}catch{}return!0}function Ro(e){let t=e.confirmation;if(Ht()||!Un(t.orderNumber))return;let n=t.currency,r=Number(t.grandTotal);xe("event","purchase",{transaction_id:t.orderNumber,currency:n,value:r,shipping:Number(t.freightCharge),...t.couponCode?{coupon:t.couponCode}:{},items:Qe(e.lines,n)}),e.adsSendTo&&xe("event","conversion",{send_to:e.adsSendTo,transaction_id:t.orderNumber,currency:n,value:r})}var $n="Arranged after review",qt="Calculated at checkout",Hn=qt,ko=qt;function Wt({quoted:e,optionCount:t,chosenAmount:n,couponWaivesFreight:r}){return e&&t===0?"arranged":r?"free":n===void 0?"pending":n===0?"free":"charged"}function Io(e){switch(e){case"arranged":return $n;case"pending":return Hn;case"free":return Dt;case"charged":return null}}import{jsx as zn}from"react/jsx-runtime";var Wn=400,Gn=400,Kn=1500;function Ie(e){return(e.components?.length??0)>0}function Kt(e,t){return{code:e,valid:t.valid,deferred:Tt(t,t.askedAsShopper),message:t.message||void 0,effects:t.effects??void 0}}function Xt(e,t){return se(e.components,t)}function je(e,t){let n=Xt(e,t);return n===null?null:n*e.qty}function zt(e){return e!=="tyre"}var Vt=Bn(null);function Go({children:e,preview:t=!1}){let{currency:n,country:r,formatMoney:o}=kt(),[i,s]=N(t),[l,u]=N([]),[c,f]=N([]),[C,d]=N([]),[w,E]=N(!1),[p,M]=N(!1),[L,F]=N(!1),[_,R]=N(!1),[h,$]=N(null),[j,U]=N(0),b=v(()=>U(a=>a+1),[]),[P,x]=N(void 0),[K,Ue]=N(null),[S,A]=N(null),[ce,ee]=N(!1),[T,de]=N(null),Z=ue(void 0),H=v(()=>s(!0),[]),te=v(()=>s(!1),[]),B=v(()=>s(a=>!a),[]);V(()=>{t||typeof window>"u"||new URLSearchParams(window.location.search).get("cart")==="open"&&H()},[H,t]);let ne=It(),D=ue(ne);V(()=>{D.current!==ne&&(D.current=ne,t||te())},[ne,t,te]);let we=v(a=>{Ue(m=>m?.country===a?.country&&m?.subdivision===a?.subdivision&&m?.postcode===a?.postcode?m:a)},[]),re=v(a=>{R(!0),zt(a)&&F(!0)},[]),fe=L||l.some(a=>zt(a.kind)),pe=_||l.length>0;V(()=>{if(t||!fe||w)return;let a=!0;return G.listWheels().then(m=>{a&&(f(m),E(!0))}),()=>{a=!1}},[t,fe,w]),V(()=>{if(t||!pe||p)return;let a=!0;return G.listBundles().then(m=>{a&&(d(m),M(!0))}),()=>{a=!1}},[t,pe,p]);let q=h?.deliveryOptions??[],me=h?.courier??null;V(()=>{h&&de(a=>a&&q.some(m=>m.id===a)?a:q[0]?.id??null)},[h]);let X=v(()=>l.filter(Ie).flatMap(a=>Pt(a.components,a.qty)),[l]),_e=v(async(a,m)=>{let y=a.trim().toUpperCase();if(!y)return;let g=X();if(g.length===0){A({code:y,valid:!1,message:"Add a wheel to the cart first."});return}ee(!0),Z.current=m;try{let I=await G.validateCoupon({code:y,items:g,currency:n,shippingMethodId:T??void 0,customerEmail:m});A(Kt(y,I))}catch{A({code:y,valid:!1,unchecked:!0,message:"Could not check that code. Please try again."})}finally{ee(!1)}},[X,n,T]),Re=v(()=>{A(null),Z.current=void 0},[]),k=v(a=>{if(!S)return;let{code:m}=S;A(y=>y&&y.code===m?{code:m,valid:!1,refused:!0,message:a}:y)},[S]);V(()=>{if(!S||S.refused)return;let a=S.code,m=g=>g!==null&&g.code===a&&!g.refused,y=setTimeout(async()=>{let g=X();if(g.length===0){A(I=>m(I)?{code:a,valid:!1,message:"Add a wheel to the cart first."}:I);return}ee(!0);try{let I=await G.validateCoupon({code:a,items:g,currency:n,shippingMethodId:T??void 0,customerEmail:Z.current});A(he=>m(he)?Kt(a,I):he)}catch{}finally{ee(!1)}},Wn);return()=>clearTimeout(y)},[l,n,T]);let z=S&&!S.refused?S.code:void 0;V(()=>{if(t)return;let a=!0,m=setTimeout(async()=>{let y=X();if(y.length===0){$(null),x(void 0);return}try{let g=await G.quoteCart({items:y,currency:n,shippingMethodId:T??void 0,couponCode:z,customerEmail:Z.current||void 0,country:K?.country||r||void 0,subdivision:K?.country&&K.subdivision||void 0,postcode:K?.country&&K.postcode||void 0});if(!a)return;$(g)}catch{if(!a)return}x(z)},Gn);return()=>{a=!1,clearTimeout(m)}},[l,n,T,z,r,K,j]);let oe=v(a=>{u(m=>{let y=m.findIndex(g=>g.id===a.id);return y===-1?[...m,a]:m.map((g,I)=>I===y?{...g,qty:Math.min(ze,g.qty+a.qty)}:g)}),Bt(a,n)},[n]),ot=v(a=>{u(m=>m.filter(y=>y.id!==a))},[]),it=v((a,m)=>{let y=Math.max(1,Math.min(ze,m));u(g=>g.map(I=>I.id===a?{...I,qty:y}:I))},[]),at=v(a=>{u(a)},[]),[ge,dn]=N(null),st=ue(null);st.current=ge;let W=ue(null),$e=ue(""),lt=v((a,m)=>{let y=a.trim().toLowerCase();Ft(y)&&dn(g=>g&&g.email===y&&g.firstName===(m??"")?g:{email:y,firstName:m??""})},[]);V(()=>{if(t||!ge)return;let a=Mt(l.filter(Ie),g=>je(g,n)===null?ke:o(je(g,n),n)),m={email:ge.email,firstName:ge.firstName,currency:n,items:a},y=JSON.stringify(m);if(y!==$e.current)return W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{W.current=null,$e.current=y,G.captureCart(m).catch(g=>{})},Kn),()=>{W.current&&(clearTimeout(W.current),W.current=null)}},[l,ge,n,t]);let ut=v(()=>{W.current&&(clearTimeout(W.current),W.current=null);let a=st.current;a&&($e.current="",G.captureCart({email:a.email,firstName:a.firstName,currency:n,items:[]}).catch(m=>{}))},[n]),ct=Gt(()=>{let a=l.reduce((O,ie)=>{let Ne=je(ie,n);return Ne===null?O:O+Ne},0),m=l.some(O=>Xt(O,n)===null),y=l.reduce((O,ie)=>O+ie.qty,0),g=S?.valid?S.effects:void 0,I=g?Math.min(a,Number(g.discountAmount)):0,he=h?.bundleDiscount??0,pn=h?.appliedBundles??[],He=!!g?.freeShipping,mt=q.find(O=>O.id===T),gt=He?0:h?.shipping??mt?.amount??0,mn=Wt({quoted:h!==null,optionCount:q.length,chosenAmount:mt?.amount,couponWaivesFreight:He}),Be={};for(let O of g?.freeUnits??[])Be[O.partNumber]=(Be[O.partNumber]??0)+O.quantity;let gn=h?.tax??null,hn=h?h.grandTotal:a-I-he+gt;return{sets:y,units:l.reduce((O,ie)=>O+(ie.components??[]).reduce((Ne,yn)=>Ne+yn.wheels*ie.qty,0),0),subtotal:a,hasUnpricedLine:m,discount:I,bundleDiscount:he,appliedBundles:pn,shipping:gt,freeShipping:He,shippingStatus:mn,freeUnitsByPartNumber:Be,tax:gn,grand:hn,repricing:!!S?.refused&&h!==null&&P===S?.code,currency:n}},[l,n,S,q,T,h,P]),dt=ue(!0),ft=v(a=>{dt.current=a},[]),pt=v(a=>{oe(a),dt.current&&H()},[oe,H]),fn=Gt(()=>({isOpen:i,preview:t,open:H,close:te,toggle:B,items:l,catalog:c,bundles:C,warmCatalog:re,add:oe,addAndOpen:pt,setAutoOpen:ft,remove:ot,setQty:it,replaceItems:at,identify:lt,clearCapturedCart:ut,coupon:S,applyCoupon:_e,removeCoupon:Re,refuseCoupon:k,couponBusy:ce,deliveryOptions:q,setQuoteDestination:we,courier:me,requote:b,shippingMethodId:T,setShippingMethodId:de,totals:ct}),[i,t,H,te,B,l,c,C,re,oe,pt,ft,ot,it,at,lt,ut,S,_e,Re,k,ce,q,we,me,b,T,ct]);return zn(Vt.Provider,{value:fn,children:e})}function Yt(){let e=qn(Vt);if(!e)throw new Error("useCart() must be called inside <CartProvider>. Mount the provider in app/layout.tsx.");return e}import{cache as rr}from"react";function Qt(e,t,n,r){for(;e.size>=t;){let o,i;for(let[l,u]of e){if(u.expiresAt<=r){o=l;break}i===void 0&&n(l)&&(i=l)}let s=o??i??e.keys().next().value;if(s===void 0)return;e.delete(s)}}var Xn=6e4,Vn=5e3,Yn=500,Ae=new Map;async function Qn(e){let{host:t,matchesRequestHost:n}=await xt();if(!t)return"";let r=await St();return r?`${e}|slug:${encodeURIComponent(t)}/${encodeURIComponent(r)}`:n?`${e}|host:${t}`:`${e}|xhost:${t}`}var jn=e=>e.includes("|slug:")||e.includes("|xhost:");async function jt(e,t){if(await vt()!==null)return t();let n=await Qn(e);if(!n)return t();let r=Date.now(),o=Ae.get(n);if(o&&o.expiresAt>r)return o.load;let i=await t(),s=i.outcome.state==="failed",l=s?Vn:Xn,u=Ae.get(n)?.lastGood,c=i.outcome.state==="ok"?i:s?u:void 0,f=s&&c?c:i;return Qt(Ae,Yn,jn,r),Ae.set(n,{load:f,expiresAt:r+l,lastGood:c}),f}var Zn=404;function Jn(e){if(e instanceof be&&e.status===Zn)return{state:"absent"};let t=e instanceof be?e.status:-1,n=e instanceof Error?e.message:String(e);return{state:"failed",status:t,detail:n}}var er="[storefront:chrome-load-failed]";function tr(e,t){console.error(`${er} ${e} status=${t.status} \u2014 serving fallback chrome`,t.detail)}async function Zt(e,t,n,r){try{let o=await t();return r?.(o)?{value:o,outcome:{state:"absent"}}:{value:o,outcome:{state:"ok"}}}catch(o){let i=Jn(o);return i.state==="failed"&&tr(e,i),{value:n,outcome:i}}}function nr(e){return e==="production"?"silent":"banner"}var Zo=nr("production");function or(e,t){return e?.trim()||t}function ai({legalName:e,foundedYear:t,siteName:n},r=new Date().getFullYear()){let o=or(e,n);return`\xA9 ${t&&t<r?`${t}\u2013${r}`:`${r}`} ${o}`}var ir={name:ye,legalName:null,foundedYear:null,faviconUrl:null,currencies:[],defaultCurrency:null,countries:[],defaultCountry:null,commerceEnabled:!0,cardPayments:!1,paymentMethods:[],paypalClientId:null,paypalEnvironment:null,squareApplicationId:null,squareLocationId:null,squareEnvironment:null,ga4MeasurementId:null,googleAdsId:null,googleAdsConversionLabel:null,metaPixelId:null,consentEnabled:!1,consentPrivacyPage:null,consentNoticeOptOut:!1,socialLinks:qe},si=rr(async()=>jt("site",()=>Zt("site",async()=>{let e=await G.getSite();return{name:yt(e.name),legalName:e.legalName?.trim()||null,foundedYear:e.foundedYear??null,faviconUrl:e.faviconUrl??null,currencies:e.currencies??[],defaultCurrency:e.defaultCurrency??null,countries:e.countries??[],defaultCountry:e.defaultCountry??null,commerceEnabled:e.commerceEnabled??!0,cardPayments:e.cardPayments??!1,paymentMethods:e.paymentMethods??(e.cardPayments?["card"]:[]),paypalClientId:e.paypalClientId??null,paypalEnvironment:e.paypalEnvironment??null,squareApplicationId:e.squareApplicationId??null,squareLocationId:e.squareLocationId??null,squareEnvironment:e.squareEnvironment??null,ga4MeasurementId:e.ga4MeasurementId??null,googleAdsId:e.googleAdsId??null,googleAdsConversionLabel:(e.googleAdsId?e.googleAdsConversionLabel:null)??null,metaPixelId:e.metaPixelId??null,consentEnabled:e.consentEnabled??!1,consentPrivacyPage:e.consentPrivacyPage??null,consentNoticeOptOut:e.consentNoticeOptOut??!1,socialLinks:bt(e.socialLinks)}},ir)));var li={name:ye,legalName:null,foundedYear:null,faviconUrl:null,currencies:[{code:"USD",symbol:"$",decimalPlaces:2,isDefault:!0}],defaultCurrency:"USD",countries:[{code:"US",name:"United States",currency:"USD",url:"",isDefault:!0,chargeTax:!1,taxDisplay:"none",taxName:"",taxRate:null,postalLabel:"Zip Code"}],defaultCountry:"US",commerceEnabled:!0,cardPayments:!0,paymentMethods:["card"],paypalClientId:null,paypalEnvironment:null,squareApplicationId:null,squareLocationId:null,squareEnvironment:null,ga4MeasurementId:null,googleAdsId:null,googleAdsConversionLabel:null,metaPixelId:null,consentEnabled:!1,consentPrivacyPage:null,consentNoticeOptOut:!1,socialLinks:qe};import{jsx as ve,jsxs as Ze}from"react/jsx-runtime";import{useEffect as Te,useId as ur,useRef as en,useState as Oe}from"react";import{useRootIsDark as cr}from"efficient-shell/theme";import{efficientClientOpen as ar}from"efficient-easel/screen/lib/session";var Se=new Map,sr=64;async function lr(e){if(!ar())return null;try{let t=await fetch(`${ht()}/logo-analysis.json?url=${encodeURIComponent(e)}`);if(!t.ok)return null;let n=await t.json();if(!n||typeof n!="object")return null;let{reversed:r,inkIsDark:o}=n;return typeof r!="string"?null:{reversed:r,inkIsDark:typeof o=="boolean"?o:null}}catch{return null}}function Jt(e){let t=Se.get(e);if(t)return t;let n=lr(e);if(Se.set(e,n),Se.size>sr){let r=Se.keys().next();r.done||Se.delete(r.value)}return n}var dr=202/22,fr=.88,Pi=16,pr="invert(1)";function wi({variant:e="header",scrolled:t=!0,src:n,reverse:r=!1,color:o=null,onLightSurface:i,reversedSrc:s,inkIsDark:l,size:u="medium",sizePx:c,wordmark:f,siteName:C=ye,fitToContainer:d=!1,fitWordmarkToContainer:w=!1,fitFloorPx:E}){let p=f&&f.trim()?f.trim():C,[M,L]=Oe(null),F=en(null),_=k=>{F.current=k};Te(()=>{L(F.current?.ownerDocument??null)},[]);let R=!cr({doc:M,whenUnset:!0}),h=n&&n.trim()?n.trim():null,$=!!h&&Ct(h),j=i??(R&&t),U=o&&o.trim()?o.trim():null,b=r&&!U,P=`logo-color-${ur().replace(/[^A-Za-z0-9_-]/g,"")}`,x=b&&$&&h&&s!=null?{reversed:s,inkIsDark:l??null}:null,K=x!==null,[Ue,S]=Oe(null);Te(()=>{if(!b||!h||!$||K){S(null);return}let k=!1;return S(null),Jt(h).then(z=>{k||S(z)}),()=>{k=!0}},[b,h,$,K]);let A=x??Ue,ce=!!A&&A.inkIsDark!==null&&(j?!A.inkIsDark:A.inkIsDark),ee=b&&!!h&&!$&&!j,T=ce&&A?A.reversed:h,de=T?[T]:[],[Z,H]=Oe(0);Te(()=>{H(0)},[h,ce]);let te=e==="footer"?Ge:We[u],B=c&&c>0?c:te,ne=Math.round(B*dr),D=Z<de.length?de[Z]:null,[we,re]=Oe(T),fe=D!==null&&D===we,pe=en(null);Te(()=>{let k=pe.current;if(!k||!k.complete)return;if(k.naturalWidth>0||k.naturalHeight>0){re(D);return}let z=!1;return k.decode().then(()=>!z&&re(D),()=>!z&&H(oe=>oe+1)),()=>{z=!0}},[D]);let q=d||w,me=`calc(100cqi / ${((p.length+1)*fr).toFixed(2)})`,X=q&&E&&E>0?Math.min(E,B):null,_e=q?X===null?`min(${B}px, ${me})`:`clamp(${X}px, ${me}, ${B}px)`:`${B}px`,Re=Ze("span",{className:`font-display font-bold tracking-[0.18em] ${X===null?"whitespace-nowrap":"whitespace-normal"}`,style:{fontSize:_e,lineHeight:1,...U?{color:U}:{}},"aria-label":p,children:[p,ve("span",{className:"text-accent",style:U?{color:U}:void 0,children:"."})]});return Ze("span",{ref:_,className:"inline-flex items-center",children:[!fe&&Re,U&&D&&ve("svg",{"aria-hidden":"true",focusable:"false",width:"0",height:"0",style:{position:"absolute"},children:Ze("filter",{id:P,colorInterpolationFilters:"sRGB",children:[ve("feFlood",{style:{floodColor:U}}),ve("feComposite",{in2:"SourceAlpha",operator:"in"})]})}),D&&ve("img",{ref:pe,src:D,alt:p,width:ne,height:B,className:"shrink-0 object-contain",style:{...fe?{height:`${B}px`,width:"auto",...d?{maxWidth:"100cqi"}:{}}:{display:"none"},...ee?{filter:pr}:{},...U?{filter:`url(#${P})`}:{}},onLoad:()=>re(D),onError:()=>H(k=>k+1)},D)]})}import{jsx as mr}from"react/jsx-runtime";function Ri({tone:e="bad",role:t,children:n}){return mr("div",{role:t,className:["border bg-surface px-4 py-3 text-[14px] leading-relaxed text-fg",e==="good"?"border-accent":e==="bad"?"border-alert":"border-line"].join(" "),children:n})}import{jsx as Ee,jsxs as hr}from"react/jsx-runtime";function gr({spokes:e,mesh:t=!1,className:n}){let s=u=>Math.round(u*1e3)/1e3,l=[];for(let u=0;u<e;u++){let c=u/e*Math.PI*2-Math.PI/2;if(l.push({x1:s(100+Math.cos(c)*22),y1:s(100+Math.sin(c)*22),x2:s(100+Math.cos(c)*86),y2:s(100+Math.sin(c)*86),main:!0}),t){let f=c+Math.PI/e;l.push({x1:s(100+Math.cos(f)*22*1.4),y1:s(100+Math.sin(f)*22*1.4),x2:s(100+Math.cos(f)*78),y2:s(100+Math.sin(f)*78),main:!1})}}return hr("svg",{viewBox:"0 0 200 200",fill:"none",stroke:"currentColor",className:n??"block h-[70%] w-[70%] transition-transform duration-700 [transition-timing-function:cubic-bezier(.2,.6,.2,1)]",children:[Ee("circle",{cx:100,cy:100,r:92,strokeWidth:2}),Ee("circle",{cx:100,cy:100,r:84,strokeWidth:1,opacity:.4}),Ee("circle",{cx:100,cy:100,r:22,strokeWidth:2}),Ee("circle",{cx:100,cy:100,r:6,fill:"currentColor"}),l.map((u,c)=>Ee("line",{x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,stroke:"currentColor",strokeWidth:u.main?6:3,strokeLinecap:"round",opacity:u.main?1:.5},c))]})}var Ai="#c9a461",tn=[{f:"black",label:"Black",hex:"#171717"},{f:"silver",label:"Silver",hex:"#cccccc"},{f:"bronze",label:"Bronze",hex:"#8a6438"},{f:"graphite",label:"Graphite",hex:"#3a3c3f"},{f:"red",label:"Candy Red",hex:"#7a0f14"}],Ti={name:"",color:"var(--fg)",family:"silver",src:""};function yr(e,t){let n=r=>{let o=tn.findIndex(i=>i.f===r);return o===-1?tn.length:o};return n(e)-n(t)||e.localeCompare(t)}function Oi(e){let t=new Set;for(let n of e)for(let r of n.finishes??[])r?.family&&t.add(r.family);return[...t].sort(yr)}import{useState as br}from"react";import{jsx as J,jsxs as Je}from"react/jsx-runtime";function Cr({customerEmail:e}){let{coupon:t,applyCoupon:n,removeCoupon:r,couponBusy:o}=Yt(),[i,s]=br("");async function l(){o||!i.trim()||(await n(i,e),s(""))}return Je("div",{className:"flex flex-col gap-2",children:[t===null?Je("div",{className:"flex border border-line",children:[J("input",{type:"text",value:i,onChange:u=>s(u.target.value),onKeyDown:u=>{u.key==="Enter"&&(u.preventDefault(),l())},placeholder:"Coupon code","aria-label":"Coupon code",className:"flex-1 bg-transparent px-4 py-4 font-mono text-[11px] uppercase tracking-[0.18em] text-fg outline-none placeholder:text-fg-dim"}),J("button",{type:"button",onClick:()=>{l()},disabled:o,className:"border-l border-line px-4 font-mono text-[10px] uppercase tracking-[0.26em] text-btn transition-colors hover:bg-btn hover:text-btn-ink disabled:cursor-wait disabled:opacity-60",children:o?"\u2026":"Apply"})]}):Je("div",{className:["flex items-center justify-between gap-3 border px-4 py-3",t.valid?"border-accent":"border-line"].join(" "),style:t.valid?{background:"color-mix(in oklab, var(--accent) 8%, transparent)"}:void 0,children:[J("span",{className:["font-mono text-[11px] uppercase tracking-[0.22em]",t.valid?"text-accent":t.deferred||t.unchecked?"text-fg":"text-fg-dim line-through"].join(" "),children:t.code}),t.unchecked&&J("button",{type:"button",onClick:()=>{n(t.code,e)},disabled:o,className:"ml-auto font-mono text-[10px] uppercase tracking-[0.26em] text-btn transition-colors hover:text-fg disabled:cursor-wait disabled:opacity-60",children:o?"\u2026":"Try again"}),J("button",{type:"button",onClick:r,"aria-label":`Remove coupon ${t.code}`,className:"font-mono text-[12px] text-fg-dim transition-colors hover:text-fg",children:"\u2715"})]}),t?.deferred?J("p",{className:"font-mono text-[10px] uppercase tracking-[0.18em] text-fg-dim",children:Ot}):t&&!t.valid&&t.message&&J("p",{className:"font-mono text-[10px] uppercase tracking-[0.18em] text-alert",children:t.message})]})}var et="Ads on. Shopper can opt out.",Me="Ads and analytics off until Accept",xr={us:{region:"us",name:"United States",model:"opt-out",law:"California CCPA / CPRA, other state laws",beforeChoice:et,footerLink:"Do Not Sell or Share My Personal Information",panelEyebrow:"Do not sell or share",adsRowName:"Sale or sharing for ads"},ca:{region:"ca",name:"Canada",model:"opt-in",law:"PIPEDA, Quebec Law 25",beforeChoice:Me,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},au:{region:"au",name:"Australia",model:"opt-out",law:"Privacy Act 1988 (APPs)",beforeChoice:et,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},nz:{region:"nz",name:"New Zealand",model:"opt-out",law:"Privacy Act 2020",beforeChoice:et,footerLink:"Privacy choices",panelEyebrow:"Privacy choices",adsRowName:"Advertising"},uk:{region:"uk",name:"United Kingdom",model:"opt-in",law:"PECR, UK GDPR",beforeChoice:Me,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"},eu:{region:"eu",name:"European Union",model:"opt-in",law:"ePrivacy Directive, GDPR",beforeChoice:Me,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"},other:{region:"other",name:"All other countries",model:"opt-in",law:"Safe default",beforeChoice:Me,footerLink:"Cookie settings",panelEyebrow:"Cookie settings",adsRowName:"Advertising"}};function Sr(e){let t=[...e.googleAds?["Google"]:[],...e.meta?["Facebook","Instagram"]:[]];return t.length<=1?t.join(""):`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`}function Bi(e,t,n){let r=Sr(n),o=r?`We use cookies to count visits and to show you ${t} ads on ${r}.`:"We use cookies to count visits.";return e.model==="opt-in"?{heading:r?"Cookies and ads":"Cookies",before:`${o} Nothing loads until you choose. You can change this at any time with `,link:e.footerLink,after:" at the bottom of every page."}:{heading:r?"Cookies and ads":"Cookies",before:`${o} You can say no at any time: choose Privacy choices, or use `,link:e.footerLink,after:" at the bottom of every page."}}var qi={accept:"Accept all",reject:"Reject all",choose:"Choose",save:"Save",ok:"OK",privacyChoices:"Privacy choices",privacyPolicy:"Privacy Policy",alwaysOn:"Always on"};var vr={asked:!1,region:"other",model:"opt-in",analytics:!0,ads:!0,chosen:!0,gpc:!1};var Er=vr;function zi(e=Er){if(e.asked)return e.ads?"granted":"denied"}function Vi(){let e=typeof crypto<"u"?crypto:void 0;if(typeof e?.randomUUID=="function")return e.randomUUID();let t=new Uint8Array(16);if(typeof e?.getRandomValues=="function")e.getRandomValues(t);else for(let r=0;r<t.length;r++)t[r]=Math.floor(Math.random()*256);t[6]=t[6]&15|64,t[8]=t[8]&63|128;let n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join("");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}import{Children as wr,isValidElement as _r,useEffect as rn,useId as Rr,useLayoutEffect as sn,useRef as Y,useState as on}from"react";var De=(e,t)=>!!e[t]&&!e[t].disabled;function tt(e,t,n){let r=e.length;for(let o=1;o<=r;o++){let i=((t+n*o)%r+r)%r;if(De(e,i))return i}return t}function nt(e,t){return tt(e,t===1?-1:e.length,t)}function rt(e,t){return De(e,t)?t:Math.max(nt(e,1),0)}function nn(e,t,n){let{open:r,focus:o}=e,i=s=>({...e,...s});if(t.length===1&&/\S/.test(t)){let s=e.typed+t.toLowerCase(),l=n.findIndex((u,c)=>De(n,c)&&u.label.toLowerCase().startsWith(s));return{state:i({open:!0,typed:s,focus:l>=0?l:o}),handled:!0}}if(!r)return t==="ArrowDown"||t==="ArrowUp"||t==="Enter"||t===" "?{state:i({open:!0,typed:""}),handled:!0}:{state:e,handled:!1};switch(t){case"ArrowDown":return{state:i({focus:tt(n,o,1)}),handled:!0};case"ArrowUp":return{state:i({focus:tt(n,o,-1)}),handled:!0};case"Home":return{state:i({focus:nt(n,1)}),handled:!0};case"End":return{state:i({focus:nt(n,-1)}),handled:!0};case"Enter":case" ":return De(n,o)?{state:i({open:!1,typed:""}),commit:o,refocus:!0,handled:!0}:{state:e,handled:!0};case"Escape":return{state:i({open:!1,typed:""}),refocus:!0,handled:!0};case"Tab":return{state:i({open:!1,typed:""}),handled:!1};default:return{state:e,handled:!1}}}import{placeMenu as Nr}from"efficient-shell/ui";import{Fragment as Mr,jsx as Q,jsxs as ln}from"react/jsx-runtime";var an={body:"text-[length:var(--size-body,14px)]",label:"text-[length:var(--size-label,13px)]"};function Lr({items:e,value:t,onPick:n,open:r,onOpen:o,onClose:i}){let[s,l]=on(!1),u=r!==void 0,c=u?r:s,[f,C]=on(0),d=Y({text:"",timer:0}),w=Y(null),E=Y(null),p=Y(null),M=Rr(),L=Y(null),F=e.findIndex(b=>b.value===t),_=b=>{b!==c&&(u||l(b),b?o?.():i?.())},R=b=>{let P=e[b];!P||P.disabled||(n(P.value),_(!1),E.current?.focus())},h=b=>{let P={open:c,focus:c?f:rt(e,F),typed:d.current.text},x=nn(P,b,e);return!x.handled&&x.state.open===c?!1:(x.state.typed!==P.typed&&(d.current.text=x.state.typed,window.clearTimeout(d.current.timer),d.current.timer=window.setTimeout(()=>{d.current.text=""},500)),C(x.state.focus),x.commit!==void 0?R(x.commit):_(x.state.open),x.refocus&&E.current?.focus(),x.handled)},$=Y(h);$.current=h;let j=Y(()=>_(!1));j.current=()=>_(!1);let U=b=>{c||(L.current=b.nativeEvent,$.current(b.key)&&b.preventDefault())};return rn(()=>{if(!c)return;let b=x=>{w.current?.contains(x.target)||j.current()},P=x=>{x!==L.current&&$.current(x.key)&&x.preventDefault()};return document.addEventListener("mousedown",b),document.addEventListener("keydown",P),()=>{document.removeEventListener("mousedown",b),document.removeEventListener("keydown",P)}},[c]),rn(()=>{c&&(d.current.text||C(rt(e,F)))},[c]),sn(()=>{if(!c||!p.current)return;p.current.children.item(f)?.scrollIntoView({block:"nearest"})},[f,c]),{open:c,toggle:()=>_(!c),close:()=>_(!1),focusIdx:f,setFocusIdx:C,pick:b=>R(e.findIndex(P=>P.value===b)),wrapRef:w,triggerRef:E,listRef:p,listId:M,onTriggerKeyDown:U,activeId:c?`${M}-${f}`:void 0}}var kr={select:{list:"absolute left-0 top-full z-50 mt-1 max-h-[280px] w-max min-w-full overflow-y-auto border-2 border-accent bg-bg shadow-xl",item:(e,t,n)=>["px-3 py-3 font-mono text-[13px] font-semibold uppercase tracking-[0.1em] transition-colors whitespace-nowrap",n?"cursor-not-allowed opacity-40":"cursor-pointer",e&&!n?"bg-accent text-bg":"bg-bg text-fg"].join(" ")},cell:{list:"absolute left-0 top-full z-50 mt-1 max-h-[320px] w-max min-w-full overflow-y-auto border-2 border-accent bg-bg shadow-xl",item:e=>[`cursor-pointer whitespace-nowrap px-6 py-3 font-mono ${an.label} font-semibold uppercase tracking-[0.1em] transition-colors`,e?"bg-accent text-bg":"bg-bg text-fg"].join(" "),pickerMarker:!0},hairline:{list:"absolute left-0 top-full z-50 max-h-[320px] w-full overflow-y-auto border border-line bg-bg shadow-[0_6px_20px_rgba(0,0,0,0.10)]",item:(e,t)=>[`flex cursor-pointer items-center justify-between gap-4 border-b border-line px-4 py-3 text-left ${an.body} transition-colors last:border-b-0`,t?"border-fg font-medium text-fg":e?"border-fg text-fg":"text-fg-dim"].join(" "),pickerMarker:!0},region:{list:"absolute right-0 top-full z-[200] mt-2 flex min-w-[240px] flex-col border border-line bg-surface text-fg",item:(e,t,n,r)=>["flex w-full cursor-pointer items-center gap-3 px-4 py-3 text-left transition-colors","font-mono text-[13px] uppercase tracking-[0.18em]",e?"bg-surface-2 text-fg":"",r?"":"border-b border-line",t?"text-accent":""].join(" "),itemStyle:e=>e?void 0:{color:"color-mix(in oklab, currentColor 80%, transparent)"}}};function Ir(e,t){sn(()=>{let n=e.current,r=n?.ownerDocument.defaultView;if(!n||!r)return;let o=()=>{let i=n.style;i.top=i.bottom=i.marginTop=i.marginBottom=i.maxHeight=i.overflowY=i.translate="";let s=n.offsetParent??n.parentElement;if(!s)return;let l=s.getBoundingClientRect(),u=n.getBoundingClientRect(),c=Math.abs(u.right-l.right)<Math.abs(u.left-l.left)?"end":"start",f=Nr({trigger:{left:l.left,right:l.right,top:l.top,bottom:l.bottom},menu:{width:u.width,height:u.height},bounds:{left:0,top:0,right:r.innerWidth,bottom:r.innerHeight},align:c,side:"bottom"});if(f.side==="top"){i.top="auto",i.bottom="100%",i.marginTop="0px";let d=f.top+Math.min(u.height,f.maxHeight);i.marginBottom=`${Math.max(0,l.top-d)}px`}f.maxHeight<u.height&&(i.maxHeight=`${f.maxHeight}px`,i.overflowY="auto");let C=f.left-u.left;C&&(i.translate=`${C}px`)};return o(),r.addEventListener("resize",o),r.addEventListener("scroll",o,!0),()=>{r.removeEventListener("resize",o),r.removeEventListener("scroll",o,!0)}},[e,t])}function Ar(e){return e.split(" ").map(t=>t==="left-0"?"right-0":t).join(" ")}function Tr({id:e,tone:t,items:n,value:r,focusIdx:o,onFocus:i,onPick:s,listRef:l,ariaLabel:u,align:c="start"}){let f=kr[t],C=Y(null);return Ir(C,n.length),Q("ul",{ref:d=>{C.current=d,l&&(l.current=d)},id:e,role:"listbox","aria-label":u,...f.pickerMarker?{"data-picker-menu":""}:{},className:c==="end"?Ar(f.list):f.list,children:n.map((d,w)=>{let E=d.value===r;return Q("li",{id:`${e}-${w}`,role:"option","aria-selected":E,"aria-disabled":d.disabled||void 0,onMouseEnter:()=>!d.disabled&&i(w),onMouseDown:p=>{p.preventDefault(),d.disabled||s(d.value)},className:f.item(w===o,E&&d.value!=="",!!d.disabled,w===n.length-1),style:f.itemStyle?.(E),children:d.meta===void 0?d.label:ln(Mr,{children:[d.lead,Q("span",{className:"flex-1 whitespace-nowrap",children:d.label}),Q("span",{className:"ml-auto text-[12px] opacity-50",children:d.meta})]})},`${d.value}_${w}`)})})}function Or({value:e,onChange:t,disabled:n,children:r,className:o,style:i,name:s,id:l,"aria-label":u,align:c}){let f=wr.toArray(r).flatMap(p=>{if(!_r(p))return[];if(p.type!=="option")return[];let L=p.props,F=L.value!==void 0?String(L.value):"",_=L.children,R=typeof _=="string"||typeof _=="number"?String(_):F;return[{value:F,label:R,disabled:!!L.disabled}]}),C=e??"",d=Lr({items:f,value:C,onPick:p=>t?.({target:{value:p}})}),E=f.find(p=>p.value===C)?.label??f[0]?.label??"";return ln("div",{ref:d.wrapRef,className:"relative",children:[s&&Q("input",{type:"hidden",name:s,value:C}),Q("button",{ref:p=>{d.triggerRef.current=p},type:"button",disabled:n,"aria-haspopup":"listbox","aria-expanded":d.open,"aria-controls":d.open?d.listId:void 0,"aria-activedescendant":d.activeId,"aria-label":u,id:l,onClick:()=>!n&&d.toggle(),onKeyDown:p=>!n&&d.onTriggerKeyDown(p),className:`block w-full ${o??""}`,style:i,children:Q("span",{className:"block w-full truncate text-left",children:E})}),d.open&&Q(Tr,{id:d.listId,tone:"select",items:f,value:C,focusIdx:d.focusIdx,onFocus:d.setFocusIdx,onPick:d.pick,listRef:d.listRef,align:c})]})}import{jsx as Pe,jsxs as Fe}from"react/jsx-runtime";var Dr="font-mono text-[length:var(--size-label,12px)]",Fr="font-semibold uppercase tracking-[0.22em] text-fg";function un(e){return`${e??Dr} ${Fr}`}function cn(){return Pe("span",{className:"text-accent",children:" *"})}function Ur({children:e,required:t,labelFace:n}){return Fe("span",{className:un(n),children:[e,t?Pe(cn,{}):null]})}function $r({label:e,required:t,hint:n,separate:r,htmlFor:o,labelFace:i,className:s,children:l}){let u=s?`flex flex-col gap-2 ${s}`:"flex flex-col gap-2",c=n?Pe("span",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-fg-dim",children:n}):null;return r||n?Fe("div",{className:u,children:[Fe("label",{htmlFor:o,className:un(i),children:[e,t?Pe(cn,{}):null]}),l,c]}):Fe("label",{htmlFor:o,className:u,children:[Pe(Ur,{required:t,labelFace:i,children:e}),l]})}var aa="w-full border-2 border-line bg-bg px-4 py-4 font-display text-[17px] tracking-[-0.005em] text-fg outline-none transition-colors placeholder:text-fg-dim hover:border-fg-dim focus:border-accent";export{It as a,oo as b,io as c,ao as d,Pt as e,Ke as f,Hr as g,Br as h,qr as i,Wr as j,bn as k,Cn as l,Gr as m,Kr as n,ze as o,Le as p,le as q,zr as r,Xr as s,ke as t,Nn as u,Ln as v,co as w,fo as x,Dt as y,Ye as z,po as A,mo as B,In as C,go as D,ho as E,An as F,yo as G,On as H,bo as I,Co as J,Ft as K,wo as L,_o as M,Ro as N,ko as O,Io as P,Zr as Q,kt as R,Jr as S,Ie as T,je as U,Go as V,Yt as W,ai as X,ir as Y,li as Z,Pi as _,wi as $,gr as aa,Ai as ba,tn as ca,Ti as da,yr as ea,Oi as fa,Cr as ga,Ri as ha,xr as ia,Bi as ja,qi as ka,vr as la,zi as ma,Vi as na,Lr as oa,Tr as pa,Or as qa,Ur as ra,$r as sa,aa as ta};
@@ -1 +1 @@
1
- import{a as d,b as p,c as S,p as b,r as T}from"./chunk-H4IHUSCU.js";import"./chunk-DLWIDJS5.js";import"./chunk-Y6SLVHK3.js";var v={generatedAt:"2026-06-28T04:33:14.721Z",region:"audm",upstreamHits:80,makes:[{slug:"abarth",name:"Abarth"},{slug:"aion",name:"Aion"},{slug:"alfa-romeo",name:"Alfa Romeo"},{slug:"alpine",name:"Alpine"},{slug:"aston-martin",name:"Aston Martin"},{slug:"audi",name:"Audi"},{slug:"bentley",name:"Bentley"},{slug:"bmw",name:"BMW"},{slug:"bmw-alpina",name:"BMW Alpina"},{slug:"byd",name:"BYD"},{slug:"cadillac",name:"Cadillac"},{slug:"chery",name:"Chery"},{slug:"citroen",name:"Citro\xEBn"},{slug:"cupra",name:"Cupra"},{slug:"daihatsu",name:"Daihatsu"},{slug:"datsun",name:"Datsun"},{slug:"deepal",name:"Deepal"},{slug:"denza",name:"Denza"},{slug:"dodge",name:"Dodge"},{slug:"ds",name:"DS"},{slug:"ferrari",name:"Ferrari"},{slug:"fiat",name:"Fiat"},{slug:"ford",name:"Ford"},{slug:"foton",name:"Foton"},{slug:"geely",name:"Geely"},{slug:"genesis",name:"Genesis"},{slug:"great-wall",name:"Great Wall (GWM)"},{slug:"haval",name:"Haval"},{slug:"holden",name:"Holden"},{slug:"honda",name:"Honda"},{slug:"hyundai",name:"Hyundai"},{slug:"ineos",name:"Ineos"},{slug:"isuzu",name:"Isuzu"},{slug:"iveco",name:"Iveco"},{slug:"jac",name:"JAC"},{slug:"jaecoo",name:"Jaecoo"},{slug:"jaguar",name:"Jaguar"},{slug:"jeep",name:"Jeep"},{slug:"kg-mobility",name:"KGM"},{slug:"kia",name:"Kia"},{slug:"lamborghini",name:"Lamborghini"},{slug:"land-rover",name:"Land Rover"},{slug:"ldv",name:"LDV"},{slug:"leapmotor",name:"Leapmotor"},{slug:"lexus",name:"Lexus"},{slug:"lotus",name:"Lotus"},{slug:"mahindra",name:"Mahindra"},{slug:"maserati",name:"Maserati"},{slug:"mazda",name:"Mazda"},{slug:"mclaren",name:"McLaren"},{slug:"mercedes",name:"Mercedes-Benz"},{slug:"mercedes-maybach",name:"Mercedes-Maybach"},{slug:"mg",name:"MG"},{slug:"mini",name:"MINI"},{slug:"mitsubishi",name:"Mitsubishi"},{slug:"nissan",name:"Nissan"},{slug:"omoda",name:"Omoda"},{slug:"opel",name:"Opel"},{slug:"ora",name:"Ora"},{slug:"peugeot",name:"Peugeot"},{slug:"polaris",name:"Polaris"},{slug:"polestar",name:"Polestar"},{slug:"porsche",name:"Porsche"},{slug:"proton",name:"Proton"},{slug:"ram",name:"Ram"},{slug:"renault",name:"Renault"},{slug:"seat",name:"Seat"},{slug:"skoda",name:"Skoda"},{slug:"smart",name:"Smart"},{slug:"ssangyong",name:"SsangYong"},{slug:"subaru",name:"Subaru"},{slug:"suzuki",name:"Suzuki"},{slug:"tank",name:"Tank"},{slug:"tesla",name:"Tesla"},{slug:"toyota",name:"Toyota"},{slug:"triumph",name:"Triumph"},{slug:"volkswagen",name:"Volkswagen"},{slug:"volvo",name:"Volvo"},{slug:"zeekr",name:"Zeekr"}],models:{abarth:[{slug:"500e",name:"500e"},{slug:"695",name:"695"},{slug:"695c",name:"695C"}],aion:[{slug:"ut",name:"UT"}],"alfa-romeo":[{slug:"giulia",name:"Giulia"},{slug:"junior",name:"Junior"},{slug:"stelvio",name:"Stelvio"},{slug:"tonale",name:"Tonale"}],alpine:[{slug:"a110",name:"A110"},{slug:"a390",name:"A390"}],"aston-martin":[{slug:"db11",name:"DB11"},{slug:"db12",name:"DB12"},{slug:"dbs-770-ultimate",name:"DBS 770 Ultimate"},{slug:"dbs-superleggera",name:"DBS Superleggera"},{slug:"dbx",name:"DBX"},{slug:"dbx-s",name:"DBX S"},{slug:"dbx707",name:"DBX707"},{slug:"v12-vantage",name:"V12 Vantage"},{slug:"valhalla",name:"Valhalla"},{slug:"valour",name:"Valour"},{slug:"vanquish",name:"Vanquish"},{slug:"vantage",name:"Vantage"},{slug:"vantage-s",name:"Vantage S"}],audi:[{slug:"5-5",name:"5+5"},{slug:"a1",name:"A1"},{slug:"a3",name:"A3"},{slug:"a4",name:"A4"},{slug:"a4-allroad",name:"A4 Allroad"},{slug:"a5",name:"A5"},{slug:"a6",name:"A6"},{slug:"a6-allroad",name:"A6 Allroad"},{slug:"a7",name:"A7"},{slug:"a8",name:"A8"},{slug:"allroad",name:"Allroad"},{slug:"e-tron",name:"e-tron"},{slug:"e-tron-gt",name:"e-tron GT"},{slug:"e-tron-s",name:"e-tron S"},{slug:"e-tron-s-sportback",name:"e-tron S Sportback"},{slug:"e-tron-sportback",name:"e-tron Sportback"},{slug:"q2",name:"Q2"},{slug:"q3",name:"Q3"},{slug:"q3-sportback",name:"Q3 Sportback"},{slug:"q4",name:"Q4 e-tron"},{slug:"q4-sportback",name:"Q4 Sportback e-tron"},{slug:"q5",name:"Q5"},{slug:"q5-sportback",name:"Q5 Sportback"},{slug:"q6-e-tron",name:"Q6 e-tron"},{slug:"q7",name:"Q7"},{slug:"q8",name:"Q8"},{slug:"q8-e-tron",name:"Q8 e-tron"},{slug:"q8-sportback-e-tron",name:"Q8 Sportback e-tron"},{slug:"r8",name:"R8"},{slug:"rs-e-tron-gt",name:"RS e-tron GT"},{slug:"rs-q3",name:"RS Q3"},{slug:"rs-q3-sportback",name:"RS Q3 Sportback"},{slug:"rs-q8",name:"RS Q8"},{slug:"rs3",name:"RS3"},{slug:"rs4",name:"RS4"},{slug:"rs5",name:"RS5"},{slug:"rs6",name:"RS6"},{slug:"rs7",name:"RS7"},{slug:"s-e-tron-gt",name:"S e-tron GT"},{slug:"s1",name:"S1"},{slug:"s3",name:"S3"},{slug:"s4",name:"S4"},{slug:"s5",name:"S5"},{slug:"s6",name:"S6"},{slug:"s7",name:"S7"},{slug:"s8",name:"S8"},{slug:"sq2",name:"SQ2"},{slug:"sq5",name:"SQ5"},{slug:"sq5-sportback",name:"SQ5 Sportback"},{slug:"sq6-e-tron",name:"SQ6 e-tron"},{slug:"sq7",name:"SQ7"},{slug:"sq8",name:"SQ8"},{slug:"sq8-e-tron",name:"SQ8 e-tron"},{slug:"sq8-sportback-e-tron",name:"SQ8 Sportback e-tron"},{slug:"tt",name:"TT"},{slug:"tt-rs",name:"TT RS"},{slug:"tts",name:"TT S"}],bentley:[{slug:"bentayga",name:"Bentayga"},{slug:"continental-gt",name:"Continental GT"},{slug:"continental-gtc",name:"Continental GTC"},{slug:"flying-spur",name:"Flying Spur"}],bmw:[{slug:"1-series",name:"1 Series"},{slug:"2-series",name:"2 Series"},{slug:"2-series-active-tourer",name:"2 Series Active Tourer"},{slug:"2-series-gran-coupe",name:"2 Series Gran Coupe"},{slug:"3-series",name:"3 Series"},{slug:"3-series-gran-turismo",name:"3 Series Gran Turismo"},{slug:"4-series",name:"4 Series"},{slug:"4-series-gran-coupe",name:"4 Series Gran Coupe"},{slug:"5-series",name:"5 Series"},{slug:"5-series-gran-turismo",name:"5 Series Gran Turismo"},{slug:"6-series",name:"6 Series"},{slug:"7-series",name:"7 Series"},{slug:"8-series",name:"8 Series"},{slug:"i4",name:"i4"},{slug:"i5",name:"i5"},{slug:"i7",name:"i7"},{slug:"ix",name:"iX"},{slug:"ix1",name:"iX1"},{slug:"ix2",name:"iX2"},{slug:"ix3",name:"iX3"},{slug:"m2",name:"M2"},{slug:"m3",name:"M3"},{slug:"m4",name:"M4"},{slug:"m5",name:"M5"},{slug:"m8",name:"M8"},{slug:"x1",name:"X1"},{slug:"x2",name:"X2"},{slug:"x3",name:"X3"},{slug:"x3-m",name:"X3 M"},{slug:"x4",name:"X4"},{slug:"x4-m",name:"X4 M"},{slug:"x5",name:"X5"},{slug:"x5-m",name:"X5 M"},{slug:"x6",name:"X6"},{slug:"x6-m",name:"X6 M"},{slug:"x7",name:"X7"},{slug:"xm",name:"XM"},{slug:"z4",name:"Z4"}],"bmw-alpina":[{slug:"b10",name:"B10"},{slug:"b3",name:"B3"},{slug:"b4",name:"B4"},{slug:"b8",name:"B8"},{slug:"xb7",name:"XB7"},{slug:"xd3",name:"XD3"}],byd:[{slug:"atto-1",name:"Atto 1"},{slug:"atto-3",name:"Atto 3"},{slug:"sea-lion-6",name:"Sealion 6"},{slug:"seal",name:"Seal"},{slug:"sealion-5",name:"Sealion 5"},{slug:"sealion-7",name:"Sealion 7"},{slug:"sealion-8",name:"Sealion 8"},{slug:"shark-6",name:"Shark 6"}],cadillac:[{slug:"lyriq",name:"Lyriq"}],chery:[{slug:"j1",name:"J1"},{slug:"j11",name:"J11"},{slug:"j3",name:"J3"},{slug:"omoda-5",name:"Omoda 5"},{slug:"omoda-5-gt",name:"Omoda 5 GT"},{slug:"omoda-e5",name:"Omoda E5"},{slug:"tiggo-4",name:"Tiggo 4"},{slug:"tiggo-4-pro",name:"Tiggo 4 Pro"},{slug:"tiggo-7",name:"Tiggo 7"},{slug:"tiggo-7-pro",name:"Tiggo 7 Pro"},{slug:"tiggo-8",name:"Tiggo 8"},{slug:"tiggo-8-pro-max",name:"Tiggo 8 Pro Max"}],citroen:[{slug:"c3",name:"C3"},{slug:"c3-aircross",name:"C3 Aircross"},{slug:"c4",name:"C4"},{slug:"c5-aircross",name:"C5 Aircross"}],cupra:[{slug:"ateca",name:"Ateca"},{slug:"born",name:"Born"},{slug:"formentor",name:"Formentor"},{slug:"leon",name:"Leon"},{slug:"tavascan",name:"Tavascan"},{slug:"terramar",name:"Terramar"}],daihatsu:[{slug:"charade",name:"Charade"}],datsun:[{slug:"240z",name:"240Z"},{slug:"260z",name:"260Z"},{slug:"280z",name:"280Z"},{slug:"280zx",name:"280ZX"}],deepal:[{slug:"e07",name:"E07"},{slug:"s07",name:"S07"}],denza:[{slug:"b5",name:"B5"},{slug:"b8",name:"B8"},{slug:"d9",name:"D9"}],dodge:[{slug:"avenger",name:"Avenger"}],ds:[{slug:"ds-3",name:"DS 3"},{slug:"ds-4",name:"DS 4"},{slug:"ds-7",name:"DS 7"}],ferrari:[{slug:"12cilindri",name:"12Cilindri"},{slug:"12cilindri-spider",name:"12Cilindri Spider"},{slug:"296-gt3",name:"296 GT3"},{slug:"296-gtb",name:"296 GTB"},{slug:"296-gts",name:"296 GTS"},{slug:"296-speciale",name:"296 Speciale"},{slug:"296-speciale-a",name:"296 Speciale A"},{slug:"458-italia",name:"458 Italia"},{slug:"458-speciale",name:"458 Speciale"},{slug:"458-speciale-a",name:"458 Speciale A"},{slug:"458-spider",name:"458 Spider"},{slug:"488-gtb",name:"488 GTB"},{slug:"488-pista",name:"488 Pista"},{slug:"488-pista-spider",name:"488 Pista Spider"},{slug:"488-spider",name:"488 Spider"},{slug:"812-competizione",name:"812 Competizione"},{slug:"812-competizione-a",name:"812 Competizione A"},{slug:"812-gts",name:"812 GTS"},{slug:"812-superfast",name:"812 Superfast"},{slug:"849-testarossa",name:"849 Testarossa"},{slug:"amalfi",name:"Amalfi"},{slug:"daytona-sp3",name:"Daytona SP3"},{slug:"f8-spider",name:"F8 Spider"},{slug:"f8-tributo",name:"F8 Tributo"},{slug:"f80",name:"F80"},{slug:"ff",name:"FF"},{slug:"gtc4-lusso",name:"GTC4Lusso"},{slug:"monza-sp1",name:"Monza SP1"},{slug:"monza-sp2",name:"Monza SP2"},{slug:"portofino",name:"Portofino"},{slug:"roma",name:"Roma"},{slug:"sf90-spider",name:"SF90 Spider"},{slug:"sf90-stradale",name:"SF90 Stradale"},{slug:"sf90-xx-spider",name:"SF90 XX Spider"},{slug:"sf90-xx-stradale",name:"SF90 XX Stradale"}],fiat:[{slug:"500",name:"500"},{slug:"500c",name:"500C"},{slug:"500e",name:"500e"},{slug:"595",name:"595"},{slug:"695",name:"695"},{slug:"ducato",name:"Ducato"},{slug:"ritmo",name:"Ritmo"}],ford:[{slug:"capri",name:"Capri"},{slug:"cougar",name:"Cougar"},{slug:"courier",name:"Courier"},{slug:"e-transit",name:"E-Transit"},{slug:"endura",name:"Endura"},{slug:"escape",name:"Escape"},{slug:"everest",name:"Everest"},{slug:"f-150",name:"F-150"},{slug:"fairlane",name:"Fairlane"},{slug:"fairmont",name:"Fairmont"},{slug:"falcon",name:"Falcon"},{slug:"fiesta",name:"Fiesta"},{slug:"laser",name:"Laser"},{slug:"ltd",name:"LTD"},{slug:"mustang",name:"Mustang"},{slug:"mustang-mach-e",name:"Mustang Mach-E"},{slug:"probe",name:"Probe"},{slug:"puma",name:"Puma"},{slug:"ranger",name:"Ranger"},{slug:"taurus",name:"Taurus"},{slug:"territory",name:"Territory"},{slug:"tourneo-custom",name:"Tourneo Custom"},{slug:"transit",name:"Transit"},{slug:"transit-custom",name:"Transit Custom"}],foton:[{slug:"tunland",name:"Tunland"}],geely:[{slug:"ex5",name:"EX5"},{slug:"riddara-rd6",name:"Riddara RD6"},{slug:"starray-em-i",name:"Starray EM-i"}],genesis:[{slug:"g70",name:"G70"},{slug:"g80",name:"G80"},{slug:"gv60",name:"GV60"},{slug:"gv70",name:"GV70"},{slug:"gv80",name:"GV80"}],"great-wall":[{slug:"cannon",name:"Cannon"},{slug:"cannon-alpha",name:"Cannon Alpha"},{slug:"ora",name:"Ora"},{slug:"steed",name:"Steed"},{slug:"ute",name:"Ute"}],haval:[{slug:"h6",name:"H6"},{slug:"h6gt",name:"H6 GT"},{slug:"jolion",name:"Jolion"},{slug:"jolion-s",name:"Jolion S"}],holden:[{slug:"acadia",name:"Acadia"},{slug:"adventra",name:"Adventra"},{slug:"apollo",name:"Apollo"},{slug:"astra",name:"Astra"},{slug:"astra-gtc",name:"Astra GTC"},{slug:"astra-vxr",name:"Astra VXR"},{slug:"barina",name:"Barina"},{slug:"barina-spark",name:"Barina Spark"},{slug:"caprice",name:"Caprice"},{slug:"captiva",name:"Captiva"},{slug:"captiva-5",name:"Captiva 5"},{slug:"captiva-7",name:"Captiva 7"},{slug:"cascada",name:"Cascada"},{slug:"colorado",name:"Colorado"},{slug:"colorado-7",name:"Colorado 7"},{slug:"commodore",name:"Commodore"},{slug:"crewman",name:"Crewman"},{slug:"cruze",name:"Cruze"},{slug:"equinox",name:"Equinox"},{slug:"frontera",name:"Frontera"},{slug:"insignia-vxr",name:"Insignia VXR"},{slug:"jackaroo",name:"Jackaroo"},{slug:"malibu",name:"Malibu"},{slug:"monaro",name:"Monaro"},{slug:"one-tonner",name:"One Tonner"},{slug:"rodeo",name:"Rodeo"},{slug:"spark",name:"Spark"},{slug:"suburban",name:"Suburban"},{slug:"tigra",name:"Tigra"},{slug:"trailblazer",name:"Trailblazer"},{slug:"trax",name:"Trax"},{slug:"ute",name:"Ute"},{slug:"vectra",name:"Vectra"},{slug:"viva",name:"Viva"},{slug:"volt",name:"Volt"},{slug:"zafira",name:"Zafira"}],honda:[{slug:"accord",name:"Accord"},{slug:"accord-euro",name:"Accord Euro"},{slug:"city",name:"City"},{slug:"civic",name:"Civic"},{slug:"civic-5d",name:"Civic 5d"},{slug:"civic-type-r",name:"Civic Type R"},{slug:"cr-v",name:"CR-V"},{slug:"hr-v",name:"HR-V"},{slug:"jazz",name:"Jazz"},{slug:"jazz-crosstar",name:"Jazz Crosstar"},{slug:"legend",name:"Legend"},{slug:"odyssey",name:"Odyssey"},{slug:"s2000",name:"S2000"},{slug:"zr-v",name:"ZR-V"}],hyundai:[{slug:"accent",name:"Accent"},{slug:"elantra",name:"Elantra"},{slug:"elantra-lavita",name:"Elantra LaVita"},{slug:"i20-n",name:"i20 N"},{slug:"i30",name:"i30"},{slug:"i30-fastback-n",name:"i30 Fastback N"},{slug:"i30-n",name:"i30 N"},{slug:"i30-sedan",name:"i30 Sedan"},{slug:"i30-sedan-n",name:"i30 Sedan N"},{slug:"i45",name:"i45"},{slug:"iload",name:"iLoad"},{slug:"imax",name:"iMax"},{slug:"inster",name:"Inster"},{slug:"ioniq",name:"IONIQ"},{slug:"ioniq-5",name:"IONIQ 5"},{slug:"ioniq-5-n",name:"IONIQ 5 N"},{slug:"ioniq-6",name:"IONIQ 6"},{slug:"ioniq-6-n",name:"IONIQ 6 N"},{slug:"ioniq-9",name:"IONIQ 9"},{slug:"ix35",name:"ix35"},{slug:"kona",name:"Kona"},{slug:"kona-n",name:"Kona N"},{slug:"mighty",name:"Mighty"},{slug:"nexo",name:"Nexo"},{slug:"palisade",name:"Palisade"},{slug:"santa-fe",name:"Santa Fe"},{slug:"sonata",name:"Sonata"},{slug:"staria",name:"Staria"},{slug:"tucson",name:"Tucson"},{slug:"venue",name:"Venue"}],ineos:[{slug:"grenadier",name:"Grenadier"}],isuzu:[{slug:"d-max",name:"D-MAX"},{slug:"mu-x",name:"mu-X"}],iveco:[{slug:"daily",name:"Daily"}],jac:[{slug:"t9",name:"T9"}],jaecoo:[{slug:"j5",name:"J5"},{slug:"j7",name:"J7"}],jaguar:[{slug:"e-pace",name:"E-Pace"},{slug:"f-pace",name:"F-Pace"},{slug:"f-type",name:"F-Type"},{slug:"i-pace",name:"I-Pace"},{slug:"xe",name:"XE"},{slug:"xf",name:"XF"}],jeep:[{slug:"avenger",name:"Avenger"},{slug:"cherokee",name:"Cherokee"},{slug:"compass",name:"Compass"},{slug:"gladiator",name:"Gladiator"},{slug:"grand-cherokee",name:"Grand Cherokee"},{slug:"grand-cherokee-l",name:"Grand Cherokee L"},{slug:"renegade",name:"Renegade"},{slug:"wrangler",name:"Wrangler"}],"kg-mobility":[{slug:"actyon",name:"Actyon"},{slug:"korando",name:"Korando"},{slug:"musso",name:"Musso"},{slug:"musso-ev",name:"Musso EV"},{slug:"rexton",name:"Rexton"},{slug:"torres",name:"Torres"}],kia:[{slug:"carnival",name:"Carnival"},{slug:"cerato",name:"Cerato"},{slug:"ev3",name:"EV3"},{slug:"ev4",name:"EV4"},{slug:"ev5",name:"EV5"},{slug:"ev6",name:"EV6"},{slug:"ev9",name:"EV9"},{slug:"grand-carnival",name:"Grand Carnival"},{slug:"k4",name:"K4"},{slug:"mentor",name:"Mentor"},{slug:"niro",name:"Niro"},{slug:"niro-plus",name:"Niro Plus"},{slug:"optima",name:"Optima"},{slug:"picanto",name:"Picanto"},{slug:"picanto-x-line",name:"Picanto X-Line"},{slug:"rio",name:"Rio"},{slug:"rondo",name:"Rondo"},{slug:"seltos",name:"Seltos"},{slug:"sorento",name:"Sorento"},{slug:"sportage",name:"Sportage"},{slug:"stinger",name:"Stinger"},{slug:"stonic",name:"Stonic"},{slug:"tasman",name:"Tasman"}],lamborghini:[{slug:"aventador",name:"Aventador"},{slug:"countach",name:"Countach"},{slug:"huracan",name:"Huracan"},{slug:"revuelto",name:"Revuelto"},{slug:"sian",name:"Sian"},{slug:"temerario",name:"Temerario"},{slug:"urus",name:"Urus"}],"land-rover":[{slug:"defender",name:"Defender"},{slug:"discovery-5",name:"Discovery 5"},{slug:"discovery-sport",name:"Discovery Sport"},{slug:"range-rover",name:"Range Rover"},{slug:"range-rover-evoque",name:"Range Rover Evoque"},{slug:"range-rover-sport",name:"Range Rover Sport"},{slug:"range-rover-velar",name:"Range Rover Velar"}],ldv:[{slug:"d90",name:"D90"},{slug:"deliver-7",name:"Deliver 7"},{slug:"deliver-9",name:"Deliver 9"},{slug:"edeliver-3",name:"eDeliver 3"},{slug:"edeliver-7",name:"eDeliver 7"},{slug:"edeliver-9",name:"eDeliver 9"},{slug:"et60",name:"eT60"},{slug:"g10",name:"G10"},{slug:"mifa",name:"Mifa People Mover"},{slug:"mifa-9",name:"Mifa 9"},{slug:"t60",name:"T60"},{slug:"terron-9",name:"Terron 9"},{slug:"v80",name:"V80"}],leapmotor:[{slug:"b10",name:"B10"},{slug:"c10",name:"C10"}],lexus:[{slug:"es",name:"ES"},{slug:"gx",name:"GX"},{slug:"is",name:"IS"},{slug:"lbx",name:"LBX"},{slug:"lc",name:"LC"},{slug:"lm",name:"LM"},{slug:"ls",name:"LS"},{slug:"lx",name:"LX"},{slug:"nx",name:"NX"},{slug:"rc-f",name:"RC F"},{slug:"rx",name:"RX"},{slug:"rz",name:"RZ"},{slug:"ux",name:"UX"}],lotus:[{slug:"eletre",name:"Eletre"},{slug:"emeya",name:"Emeya"},{slug:"emira",name:"Emira"},{slug:"evija",name:"Evija"}],mahindra:[{slug:"genio",name:"Genio"},{slug:"pik-up",name:"Pik Up"},{slug:"scorpio-n",name:"Scorpio-N"},{slug:"xuv500",name:"XUV500"},{slug:"xuv700",name:"XUV700"}],maserati:[{slug:"ghibli",name:"Ghibli"},{slug:"gran-turismo",name:"GranTurismo"},{slug:"grancabrio",name:"GranCabrio"},{slug:"grecale",name:"Grecale"},{slug:"gt2-stradale",name:"GT2 Stradale"},{slug:"levante",name:"Levante"},{slug:"mc20",name:"MC20"},{slug:"mcpura",name:"MCPura"},{slug:"quattroporte",name:"Quattroporte"}],mazda:[{slug:"6e",name:"6e"},{slug:"929",name:"929"},{slug:"bravo",name:"Bravo"},{slug:"bt-50",name:"BT-50"},{slug:"cx-3",name:"CX-3"},{slug:"cx-30",name:"CX-30"},{slug:"cx-5",name:"CX-5"},{slug:"cx-60",name:"CX-60"},{slug:"cx-70",name:"CX-70"},{slug:"cx-8",name:"CX-8"},{slug:"cx-80",name:"CX-80"},{slug:"cx-9",name:"CX-9"},{slug:"cx-90",name:"CX-90"},{slug:"mazda2",name:"Mazda2"},{slug:"mazda3",name:"Mazda3"},{slug:"mazda3-mps",name:"Mazda3 MPS"},{slug:"mazda6",name:"Mazda6"},{slug:"mx-30",name:"MX-30"},{slug:"mx-5",name:"MX-5"},{slug:"mx-5-rf",name:"MX-5 RF"},{slug:"rx-7",name:"RX-7"}],mclaren:[{slug:"720s",name:"720S"},{slug:"720s-spider",name:"720S Spider"},{slug:"750s",name:"750S"},{slug:"765lt",name:"765LT"},{slug:"765lt-spider",name:"765LT Spider"},{slug:"artura",name:"Artura"},{slug:"gt",name:"GT"},{slug:"gts",name:"GTS"},{slug:"mp4-12c",name:"Mp4-12C"},{slug:"senna",name:"Senna"},{slug:"speedtail",name:"Speedtail"},{slug:"w1",name:"W1"}],mercedes:[{slug:"a-class",name:"A-Class"},{slug:"a-class-amg",name:"A-Class AMG"},{slug:"c-class",name:"C-Class"},{slug:"c-class-amg",name:"C-Class AMG"},{slug:"cla-class",name:"CLA-Class"},{slug:"cla-class-amg",name:"CLA-Class AMG"},{slug:"cle-class",name:"CLE-Class"},{slug:"cls-class-amg",name:"CLS-Class AMG"},{slug:"e-class",name:"E-Class"},{slug:"e-class-amg",name:"E-Class AMG"},{slug:"e-class-cabrio",name:"E-Class Cabriolet"},{slug:"e-class-coupe",name:"E-Class Coupe"},{slug:"eqa",name:"EQA"},{slug:"eqb",name:"EQB"},{slug:"eqc",name:"EQC"},{slug:"eqe",name:"EQE"},{slug:"eqe-amg",name:"EQE AMG"},{slug:"eqe-suv",name:"EQE SUV"},{slug:"eqe-suv-amg",name:"EQE SUV AMG"},{slug:"eqs",name:"EQS"},{slug:"eqs-amg",name:"EQS AMG"},{slug:"eqs-suv",name:"EQS SUV"},{slug:"eqv",name:"EQV"},{slug:"g-class",name:"G-Class"},{slug:"g-class-amg",name:"G-Class AMG"},{slug:"gla",name:"GLA-Class"},{slug:"gla-class-amg",name:"GLA-Class AMG"},{slug:"glb",name:"GLB-Class"},{slug:"glb-class-amg",name:"GLB-Class AMG"},{slug:"glc",name:"GLC-Class"},{slug:"glc-class-amg",name:"GLC-Class AMG"},{slug:"glc-class-coupe",name:"GLC-Class Coupe"},{slug:"glc-class-coupe-amg",name:"GLC-Class Coupe AMG"},{slug:"gle-class",name:"GLE-Class"},{slug:"gle-class-amg",name:"GLE-Class AMG"},{slug:"gle-class-coupe",name:"GLE-Class Coupe"},{slug:"gle-class-coupe-amg",name:"GLE-Class Coupe AMG"},{slug:"gls-class",name:"GLS-Class"},{slug:"gls-class-amg",name:"GLS-Class AMG"},{slug:"s-class",name:"S-Class"},{slug:"sprinter",name:"Sprinter"},{slug:"v-class",name:"V-Class"},{slug:"x-class",name:"X-Class"}],"mercedes-maybach":[{slug:"eqs",name:"EQS"},{slug:"gls-class",name:"GLS-Class"},{slug:"s-class",name:"S-Class"}],mg:[{slug:"3",name:"3"},{slug:"350",name:"350"},{slug:"4",name:"4"},{slug:"5",name:"5"},{slug:"6",name:"6"},{slug:"cyberster",name:"Cyberster"},{slug:"gs",name:"GS"},{slug:"hs",name:"HS"},{slug:"im5",name:"IM5"},{slug:"im6",name:"IM6"},{slug:"qs",name:"QS"},{slug:"s5",name:"S5"},{slug:"u9",name:"MGU9"},{slug:"zs",name:"ZS"},{slug:"zs-ev",name:"ZS EV"},{slug:"zst",name:"ZST"}],mini:[{slug:"aceman",name:"Aceman"},{slug:"clubman",name:"Clubman"},{slug:"convertible",name:"Convertible"},{slug:"cooper",name:"Cooper"},{slug:"countryman",name:"Countryman"},{slug:"hatch",name:"Hatch"}],mitsubishi:[{slug:"asx",name:"ASX"},{slug:"challenger",name:"Challenger"},{slug:"eclipse-cross",name:"Eclipse Cross"},{slug:"express",name:"Express"},{slug:"l200",name:"L200"},{slug:"magna",name:"Magna"},{slug:"mirage",name:"Mirage"},{slug:"nimbus",name:"Nimbus"},{slug:"outlander",name:"Outlander"},{slug:"pajero-sport",name:"Pajero Sport"},{slug:"triton",name:"Triton"},{slug:"verada",name:"Verada"}],nissan:[{slug:"200sx",name:"200SX"},{slug:"280zx",name:"280ZX"},{slug:"300zx",name:"300ZX"},{slug:"370z",name:"370Z"},{slug:"almera",name:"Almera"},{slug:"altima",name:"Altima"},{slug:"ariya",name:"Ariya"},{slug:"bluebird",name:"Bluebird"},{slug:"dualis",name:"Dualis"},{slug:"dualis-2",name:"Dualis+2"},{slug:"gt-r",name:"GT-R"},{slug:"juke",name:"Juke"},{slug:"leaf",name:"Leaf"},{slug:"maxima",name:"Maxima"},{slug:"micra",name:"Micra"},{slug:"navara",name:"Navara"},{slug:"np300-navara",name:"NP300 Navara"},{slug:"pathfinder",name:"Pathfinder"},{slug:"patrol",name:"Patrol"},{slug:"patrol-cab-chassis",name:"Patrol Cab Chassis"},{slug:"pulsar",name:"Pulsar"},{slug:"qashqai",name:"Qashqai"},{slug:"x-trail",name:"X-Trail"},{slug:"z",name:"Z"}],omoda:[{slug:"9",name:"9"},{slug:"c5",name:"C5"},{slug:"e5",name:"E5"}],opel:[{slug:"astra",name:"Astra"},{slug:"grandland",name:"Grandland"},{slug:"mokka",name:"Mokka"}],ora:[{slug:"03",name:"03"}],peugeot:[{slug:"2008",name:"2008"},{slug:"208",name:"208"},{slug:"3008",name:"3008"},{slug:"308",name:"308"},{slug:"408",name:"408"},{slug:"5008",name:"5008"},{slug:"508",name:"508"},{slug:"boxer",name:"Boxer"},{slug:"expert",name:"Expert"},{slug:"partner",name:"Partner"}],polaris:[{slug:"general-xp",name:"General XP 1000"},{slug:"general-xp-4",name:"General XP 4 1000"},{slug:"ranger-crew-xd",name:"Ranger Crew XD 1500"},{slug:"ranger-crew-xp",name:"Ranger Crew XP 1000"},{slug:"ranger-xd",name:"Ranger XD 1500"},{slug:"ranger-xp",name:"Ranger XP 1000"},{slug:"rzr-pro-r",name:"RZR Pro R"},{slug:"rzr-pro-r-4",name:"RZR Pro R 4"},{slug:"rzr-pro-xp",name:"RZR Pro XP"},{slug:"rzr-xp",name:"RZR XP 1000"},{slug:"rzr-xp-4",name:"RZR XP 4 1000"},{slug:"xpedition-adv",name:"Xpedition ADV"},{slug:"xpedition-adv-5",name:"Xpedition ADV 5"},{slug:"xpedition-xp",name:"Xpedition XP"},{slug:"xpedition-xp-5",name:"Xpedition XP 5"}],polestar:[{slug:"polestar-1",name:"Polestar 1"},{slug:"polestar-2",name:"Polestar 2"},{slug:"polestar-3",name:"Polestar 3"},{slug:"polestar-4",name:"Polestar 4"},{slug:"polestar-5",name:"Polestar 5"}],porsche:[{slug:"718",name:"718"},{slug:"911",name:"911"},{slug:"928",name:"928"},{slug:"cayenne",name:"Cayenne"},{slug:"macan",name:"Macan"},{slug:"panamera",name:"Panamera"},{slug:"taycan",name:"Taycan"}],proton:[{slug:"exora",name:"Exora"},{slug:"gen-2",name:"Gen-2"},{slug:"jumbuck",name:"Jumbuck"},{slug:"persona",name:"Persona"},{slug:"preve",name:"Preve"},{slug:"s16",name:"S16"},{slug:"satria",name:"Satria"},{slug:"savvy",name:"Savvy"},{slug:"suprima",name:"Suprima S"},{slug:"waja",name:"Waja"}],ram:[{slug:"1500",name:"1500"},{slug:"1500-classic",name:"1500 Classic"},{slug:"1500-trx",name:"1500 TRX"},{slug:"2500",name:"2500"},{slug:"3500",name:"3500"}],renault:[{slug:"arkana",name:"Arkana"},{slug:"captur",name:"Captur"},{slug:"duster",name:"Duster"},{slug:"kangoo",name:"Kangoo"},{slug:"kangoo-van",name:"Kangoo Van"},{slug:"koleos",name:"Koleos"},{slug:"latitude",name:"Latitude"},{slug:"master",name:"Master"},{slug:"megane-e-tech",name:"Megane E-Tech"},{slug:"scenic-e-tech",name:"Scenic E-Tech"},{slug:"trafic",name:"Trafic"}],seat:[{slug:"arona",name:"Arona"},{slug:"ateca",name:"Ateca"},{slug:"leon",name:"Leon"},{slug:"tarraco",name:"Tarraco"}],skoda:[{slug:"elroq",name:"Elroq"},{slug:"enyaq-iv",name:"Enyaq"},{slug:"fabia",name:"Fabia"},{slug:"kamiq",name:"Kamiq"},{slug:"karoq",name:"Karoq"},{slug:"kodiaq",name:"Kodiaq"},{slug:"octavia",name:"Octavia"},{slug:"rapid",name:"Rapid"},{slug:"scala",name:"Scala"},{slug:"superb",name:"Superb"},{slug:"superb-scout",name:"Superb Scout"},{slug:"yeti",name:"Yeti"}],smart:[{slug:"1",name:"#1"},{slug:"3",name:"#3"},{slug:"roadster",name:"Roadster"}],ssangyong:[{slug:"korando",name:"Korando"},{slug:"kyron",name:"Kyron"},{slug:"musso",name:"Musso"},{slug:"rexton",name:"Rexton"},{slug:"rhino",name:"Rhino"},{slug:"stavic",name:"Stavic"},{slug:"tivoli",name:"Tivoli"}],subaru:[{slug:"brz",name:"BRZ"},{slug:"crosstrek",name:"Crosstrek"},{slug:"forester",name:"Forester"},{slug:"impreza",name:"Impreza"},{slug:"liberty",name:"Liberty"},{slug:"outback",name:"Outback"},{slug:"solterra",name:"Solterra"},{slug:"wrx",name:"WRX"},{slug:"wrx-sti",name:"WRX STI"},{slug:"xv",name:"XV"}],suzuki:[{slug:"baleno",name:"Baleno"},{slug:"fronx",name:"Fronx"},{slug:"ignis",name:"Ignis"},{slug:"jimny",name:"Jimny"},{slug:"s-cross",name:"S-Cross"},{slug:"swift",name:"Swift"},{slug:"swift-sport",name:"Swift Sport"},{slug:"vitara",name:"Vitara"}],tank:[{slug:"300",name:"300"},{slug:"500",name:"500"}],tesla:[{slug:"cybertruck",name:"Cybertruck"},{slug:"model-3",name:"Model 3"},{slug:"model-s",name:"Model S"},{slug:"model-x",name:"Model X"},{slug:"model-y",name:"Model Y"}],toyota:[{slug:"86",name:"86"},{slug:"aurion",name:"Aurion"},{slug:"avalon",name:"Avalon"},{slug:"avensis-verso",name:"Avensis Verso"},{slug:"bz4x",name:"bZ4X"},{slug:"c-hr",name:"C-HR"},{slug:"camry",name:"Camry"},{slug:"corolla",name:"Corolla"},{slug:"corolla-cross",name:"Corolla Cross"},{slug:"echo",name:"Echo"},{slug:"fortuner",name:"Fortuner"},{slug:"gr-corolla",name:"GR Corolla"},{slug:"gr-yaris",name:"GR Yaris"},{slug:"gr86",name:"GR86"},{slug:"granvia",name:"Granvia"},{slug:"hiace",name:"Hiace"},{slug:"hilux",name:"Hilux"},{slug:"kluger",name:"Kluger"},{slug:"land-cruiser",name:"Land Cruiser"},{slug:"land-cruiser-prado",name:"Land Cruiser Prado"},{slug:"prius",name:"Prius"},{slug:"prius-c",name:"Prius c"},{slug:"prius-v",name:"Prius v"},{slug:"rav4",name:"RAV4"},{slug:"rukus",name:"Rukus"},{slug:"supra",name:"Supra"},{slug:"tarago",name:"Tarago"},{slug:"tundra",name:"Tundra"},{slug:"vienta",name:"Vienta"},{slug:"yaris",name:"Yaris"},{slug:"yaris-cross",name:"Yaris Cross"}],triumph:[{slug:"tr7",name:"TR7"}],volkswagen:[{slug:"amarok",name:"Amarok"},{slug:"beetle",name:"Beetle"},{slug:"caddy",name:"Caddy"},{slug:"california",name:"California"},{slug:"caravelle",name:"Caravelle"},{slug:"cc",name:"CC"},{slug:"crafter",name:"Crafter"},{slug:"golf",name:"Golf"},{slug:"golf-alltrack",name:"Golf Alltrack"},{slug:"golf-gti",name:"Golf GTI"},{slug:"golf-r",name:"Golf R"},{slug:"grand-california",name:"Grand California"},{slug:"id-buzz",name:"ID. Buzz"},{slug:"id4",name:"ID.4"},{slug:"id5",name:"ID.5"},{slug:"multivan",name:"Multivan"},{slug:"passat",name:"Passat"},{slug:"passat-alltrack",name:"Passat Alltrack"},{slug:"polo",name:"Polo"},{slug:"polo-gti",name:"Polo GTI"},{slug:"t-cross",name:"T-Cross"},{slug:"t-roc",name:"T-Roc"},{slug:"t-roc-r",name:"T-Roc R"},{slug:"tiguan",name:"Tiguan"},{slug:"tiguan-allspace",name:"Tiguan Allspace"},{slug:"touareg",name:"Touareg"},{slug:"transporter",name:"Transporter"}],volvo:[{slug:"c40",name:"C40"},{slug:"es90",name:"ES90"},{slug:"ex30",name:"EX30"},{slug:"ex40",name:"EX40"},{slug:"ex90",name:"EX90"},{slug:"s60",name:"S60"},{slug:"s60-cross-country",name:"S60 Cross Country"},{slug:"s90",name:"S90"},{slug:"v60-cross-country",name:"V60 Cross Country"},{slug:"v90-cross-country",name:"V90 Cross Country"},{slug:"xc40",name:"XC40"},{slug:"xc60",name:"XC60"},{slug:"xc90",name:"XC90"}],zeekr:[{slug:"009",name:"009"},{slug:"x",name:"X"}]},years:{"audi/rs6":[2026,2025,2024,2023,2022,2021,2020],"bmw/m3":[2026,2025,2024,2023,2022,2021,2020,2018,2017,2016,2015,2014],"ferrari/296-gtb":[2026,2025,2024,2023,2022],"lamborghini/huracan":[2024,2023,2022,2021,2020,2019],"mclaren/750s":[2026,2025,2024,2023],"mercedes/c-class-amg":[2026,2025,2024,2023,2022,2021,2020,2019,2018,2017,2016],"nissan/gt-r":[2023,2022,2021,2020,2019,2018,2017,2016],"tesla/model-3":[2026,2025,2024,2023,2022,2021,2020,2019,2018,2017],"toyota/supra":[2026,2025,2024,2023,2022,2021,1993,1992,1991,1990,1989,1988,1987,1986]},modifications:{"audi/rs6/2024":[{slug:"a28ff79ddf",name:"4.0 TFSi quattro",trim:"4.0 TFSi quattro",body:null}],"bmw/m3/2024":[{slug:"0aaf0bb46d",name:"M3",trim:"M3",body:null},{slug:"402e65e913",name:"M3 Competition",trim:"M3 Competition",body:null},{slug:"4c760df5c5",name:"M3 Competition xDrive",trim:"M3 Competition xDrive",body:null},{slug:"6250847bc8",name:"M3 Competition xDrive",trim:"M3 Competition xDrive",body:null},{slug:"82f59cadb0",name:"M3",trim:"M3",body:null}],"ferrari/296-gtb/2024":[{slug:"c412dafd12",name:"3.0",trim:"3.0",body:null}],"lamborghini/huracan/2024":[{slug:"aab49a3dae",name:"Evo 5.2",trim:"Evo 5.2",body:null},{slug:"f81a37ca20",name:"Evo 5.2",trim:"Evo 5.2",body:null}],"mclaren/750s/2024":[{slug:"f8f346c327",name:"4.0T",trim:"4.0T",body:null}],"mercedes/c-class-amg/2024":[{slug:"038122904b",name:"C 43 4Matic",trim:"C 43 4Matic",body:null},{slug:"a403e6b64c",name:"C 63 S E",trim:"C 63 S E",body:null}],"nissan/gt-r/2024":[],"tesla/model-3/2024":[{slug:"026e4ab9d6",name:"Long Range",trim:"Long Range",body:null},{slug:"4296c050a9",name:"Performance",trim:"Performance",body:null},{slug:"50f0c93d66",name:"Performance",trim:"Performance",body:null},{slug:"be5b2b9767",name:"Standard Range",trim:"Standard Range",body:null},{slug:"d4960b3833",name:"Long Range",trim:"Long Range",body:null}],"toyota/supra/2024":[{slug:"eabbd747b7",name:"3.0i",trim:"3.0i",body:null}]},meta:{modelsFetchedAt:{abarth:"2026-06-28T04:33:00.474Z",aion:"2026-06-28T04:33:01.415Z","alfa-romeo":"2026-06-28T04:33:02.355Z",alpine:"2026-06-28T04:33:03.290Z","aston-martin":"2026-06-28T04:33:04.229Z",audi:"2026-06-28T04:33:05.195Z",bentley:"2026-06-28T04:33:06.135Z",bmw:"2026-06-28T04:33:07.112Z","bmw-alpina":"2026-06-28T04:33:08.062Z",byd:"2026-06-28T04:33:09.004Z",cadillac:"2026-06-28T04:33:09.958Z",chery:"2026-06-28T04:33:10.944Z",citroen:"2026-06-28T04:33:11.887Z",cupra:"2026-06-28T04:33:12.827Z",daihatsu:"2026-06-28T04:33:13.770Z",datsun:"2026-06-28T04:33:14.721Z",deepal:"2026-06-27T04:23:59.381Z",denza:"2026-06-27T04:24:00.200Z",dodge:"2026-06-27T04:24:01.018Z",ds:"2026-06-27T04:24:01.843Z",ferrari:"2026-06-27T04:24:02.667Z",fiat:"2026-06-27T04:24:03.492Z",ford:"2026-06-27T04:24:04.311Z",foton:"2026-06-27T04:24:05.129Z",geely:"2026-06-27T04:24:05.946Z",genesis:"2026-06-27T04:24:06.764Z","great-wall":"2026-06-27T04:24:07.584Z",haval:"2026-06-27T04:24:08.402Z",holden:"2026-06-27T04:24:09.221Z",honda:"2026-06-27T04:24:10.039Z",hyundai:"2026-06-27T04:24:10.861Z",ineos:"2026-06-27T04:24:11.677Z",isuzu:"2026-06-27T04:24:12.495Z",iveco:"2026-06-28T04:32:51.940Z",jac:"2026-06-27T04:24:13.314Z",jaecoo:"2026-06-28T04:32:17.949Z",jaguar:"2026-06-28T04:32:18.902Z",jeep:"2026-06-28T04:32:19.838Z","kg-mobility":"2026-06-28T04:32:20.769Z",kia:"2026-06-28T04:32:21.710Z",lamborghini:"2026-06-28T04:32:22.641Z","land-rover":"2026-06-28T04:32:23.589Z",ldv:"2026-06-28T04:32:24.525Z",leapmotor:"2026-06-28T04:32:25.463Z",lexus:"2026-06-28T04:32:26.401Z",lotus:"2026-06-28T04:32:27.336Z",mahindra:"2026-06-28T04:32:28.278Z",maserati:"2026-06-28T04:32:29.225Z",mazda:"2026-06-28T04:32:30.189Z",mclaren:"2026-06-28T04:32:31.133Z",mercedes:"2026-06-28T04:32:32.103Z","mercedes-maybach":"2026-06-28T04:32:33.041Z",mg:"2026-06-28T04:32:33.991Z",mini:"2026-06-28T04:32:34.935Z",mitsubishi:"2026-06-28T04:32:35.884Z",nissan:"2026-06-28T04:32:36.836Z",omoda:"2026-06-28T04:32:37.789Z",opel:"2026-06-28T04:32:38.731Z",ora:"2026-06-28T04:32:39.684Z",peugeot:"2026-06-28T04:32:40.631Z",polaris:"2026-06-28T04:32:52.902Z",polestar:"2026-06-28T04:32:41.575Z",porsche:"2026-06-28T04:32:42.516Z",proton:"2026-06-28T04:32:43.459Z",ram:"2026-06-28T04:32:44.398Z",renault:"2026-06-28T04:32:45.351Z",seat:"2026-06-28T04:32:46.297Z",skoda:"2026-06-28T04:32:47.233Z",smart:"2026-06-28T04:32:48.178Z",ssangyong:"2026-06-28T04:32:49.114Z",subaru:"2026-06-28T04:32:50.052Z",suzuki:"2026-06-28T04:32:50.996Z",tank:"2026-06-28T04:32:53.840Z",tesla:"2026-06-28T04:32:54.775Z",toyota:"2026-06-28T04:32:55.749Z",triumph:"2026-06-28T04:32:56.677Z",volkswagen:"2026-06-28T04:32:57.635Z",volvo:"2026-06-28T04:32:58.582Z",zeekr:"2026-06-28T04:32:59.524Z"},popularFetchedAt:"2026-06-28T04:32:16.984Z",coverage:{covered:79,total:79}}};var u=v,k=(d||""||"http://localhost:8000").replace(/\/+$/,""),M=3600,Z="x-efficient-shop-hop",C="".trim();async function g(a,e){let s=new URLSearchParams;for(let[h,i]of Object.entries(e))i!==void 0&&i!==""&&s.set(h,String(i));let n=s.toString(),l=`${k}/api/fitment${a}${n?`?${n}`:""}`,m={next:{revalidate:M}},[f,y]=await Promise.all([b(),T()]),o=p(f,y,S(m));C&&(o[Z]=C);let t=await fetch(l,{...m,...Object.keys(o).length>0?{headers:o}:{}});if(!t.ok)throw new Error(`backend fitment ${t.status} on ${a}`);let c=await t.text();return c?JSON.parse(c):null}function r(a){return a!==void 0&&u.region===a&&(u.makes?.length??0)>0}function A(a){if(!a)return null;let e=a.et_range;return{pcd:a.pcd||void 0,boltPattern:a.bolt_pattern||void 0,centreBore:a.centre_bore??void 0,frontWheels:a.front_wheels??[],rearWheels:a.rear_wheels??[],frontTyres:a.front_tyres??[],rearTyres:a.rear_tyres??[],etRange:e&&e[0]!==null&&e[1]!==null?[e[0],e[1]]:void 0}}var z={async makes(a){try{return await g("/makes/",{region:a})}catch(e){if(r(a))return u.makes;throw e}},async models(a,e){try{return await g("/models/",{make:a,region:e})}catch(s){let n=r(e)?u.models[a]:void 0;if(n)return n;throw s}},async years(a,e,s){try{return await g("/years/",{make:a,model:e,region:s})}catch(n){let l=r(s)?u.years[`${a}/${e}`]:void 0;if(l)return l;throw n}},async modifications(a,e,s,n){try{return await g("/modifications/",{make:a,model:e,year:s,region:n})}catch(l){let m=r(n)?u.modifications[`${a}/${e}/${s}`]:void 0;if(m)return m;throw l}},async stockFitment(a,e,s,n,l){return A(await g("/stock-fitment/",{make:a,model:e,year:s,modification:n,region:l}))}};export{z as fitmentData};
1
+ import{a as d,b as p,c as S,p as b,r as T}from"./chunk-7C2YH2AQ.js";import"./chunk-NQLVRCTI.js";import"./chunk-Y6SLVHK3.js";var v={generatedAt:"2026-06-28T04:33:14.721Z",region:"audm",upstreamHits:80,makes:[{slug:"abarth",name:"Abarth"},{slug:"aion",name:"Aion"},{slug:"alfa-romeo",name:"Alfa Romeo"},{slug:"alpine",name:"Alpine"},{slug:"aston-martin",name:"Aston Martin"},{slug:"audi",name:"Audi"},{slug:"bentley",name:"Bentley"},{slug:"bmw",name:"BMW"},{slug:"bmw-alpina",name:"BMW Alpina"},{slug:"byd",name:"BYD"},{slug:"cadillac",name:"Cadillac"},{slug:"chery",name:"Chery"},{slug:"citroen",name:"Citro\xEBn"},{slug:"cupra",name:"Cupra"},{slug:"daihatsu",name:"Daihatsu"},{slug:"datsun",name:"Datsun"},{slug:"deepal",name:"Deepal"},{slug:"denza",name:"Denza"},{slug:"dodge",name:"Dodge"},{slug:"ds",name:"DS"},{slug:"ferrari",name:"Ferrari"},{slug:"fiat",name:"Fiat"},{slug:"ford",name:"Ford"},{slug:"foton",name:"Foton"},{slug:"geely",name:"Geely"},{slug:"genesis",name:"Genesis"},{slug:"great-wall",name:"Great Wall (GWM)"},{slug:"haval",name:"Haval"},{slug:"holden",name:"Holden"},{slug:"honda",name:"Honda"},{slug:"hyundai",name:"Hyundai"},{slug:"ineos",name:"Ineos"},{slug:"isuzu",name:"Isuzu"},{slug:"iveco",name:"Iveco"},{slug:"jac",name:"JAC"},{slug:"jaecoo",name:"Jaecoo"},{slug:"jaguar",name:"Jaguar"},{slug:"jeep",name:"Jeep"},{slug:"kg-mobility",name:"KGM"},{slug:"kia",name:"Kia"},{slug:"lamborghini",name:"Lamborghini"},{slug:"land-rover",name:"Land Rover"},{slug:"ldv",name:"LDV"},{slug:"leapmotor",name:"Leapmotor"},{slug:"lexus",name:"Lexus"},{slug:"lotus",name:"Lotus"},{slug:"mahindra",name:"Mahindra"},{slug:"maserati",name:"Maserati"},{slug:"mazda",name:"Mazda"},{slug:"mclaren",name:"McLaren"},{slug:"mercedes",name:"Mercedes-Benz"},{slug:"mercedes-maybach",name:"Mercedes-Maybach"},{slug:"mg",name:"MG"},{slug:"mini",name:"MINI"},{slug:"mitsubishi",name:"Mitsubishi"},{slug:"nissan",name:"Nissan"},{slug:"omoda",name:"Omoda"},{slug:"opel",name:"Opel"},{slug:"ora",name:"Ora"},{slug:"peugeot",name:"Peugeot"},{slug:"polaris",name:"Polaris"},{slug:"polestar",name:"Polestar"},{slug:"porsche",name:"Porsche"},{slug:"proton",name:"Proton"},{slug:"ram",name:"Ram"},{slug:"renault",name:"Renault"},{slug:"seat",name:"Seat"},{slug:"skoda",name:"Skoda"},{slug:"smart",name:"Smart"},{slug:"ssangyong",name:"SsangYong"},{slug:"subaru",name:"Subaru"},{slug:"suzuki",name:"Suzuki"},{slug:"tank",name:"Tank"},{slug:"tesla",name:"Tesla"},{slug:"toyota",name:"Toyota"},{slug:"triumph",name:"Triumph"},{slug:"volkswagen",name:"Volkswagen"},{slug:"volvo",name:"Volvo"},{slug:"zeekr",name:"Zeekr"}],models:{abarth:[{slug:"500e",name:"500e"},{slug:"695",name:"695"},{slug:"695c",name:"695C"}],aion:[{slug:"ut",name:"UT"}],"alfa-romeo":[{slug:"giulia",name:"Giulia"},{slug:"junior",name:"Junior"},{slug:"stelvio",name:"Stelvio"},{slug:"tonale",name:"Tonale"}],alpine:[{slug:"a110",name:"A110"},{slug:"a390",name:"A390"}],"aston-martin":[{slug:"db11",name:"DB11"},{slug:"db12",name:"DB12"},{slug:"dbs-770-ultimate",name:"DBS 770 Ultimate"},{slug:"dbs-superleggera",name:"DBS Superleggera"},{slug:"dbx",name:"DBX"},{slug:"dbx-s",name:"DBX S"},{slug:"dbx707",name:"DBX707"},{slug:"v12-vantage",name:"V12 Vantage"},{slug:"valhalla",name:"Valhalla"},{slug:"valour",name:"Valour"},{slug:"vanquish",name:"Vanquish"},{slug:"vantage",name:"Vantage"},{slug:"vantage-s",name:"Vantage S"}],audi:[{slug:"5-5",name:"5+5"},{slug:"a1",name:"A1"},{slug:"a3",name:"A3"},{slug:"a4",name:"A4"},{slug:"a4-allroad",name:"A4 Allroad"},{slug:"a5",name:"A5"},{slug:"a6",name:"A6"},{slug:"a6-allroad",name:"A6 Allroad"},{slug:"a7",name:"A7"},{slug:"a8",name:"A8"},{slug:"allroad",name:"Allroad"},{slug:"e-tron",name:"e-tron"},{slug:"e-tron-gt",name:"e-tron GT"},{slug:"e-tron-s",name:"e-tron S"},{slug:"e-tron-s-sportback",name:"e-tron S Sportback"},{slug:"e-tron-sportback",name:"e-tron Sportback"},{slug:"q2",name:"Q2"},{slug:"q3",name:"Q3"},{slug:"q3-sportback",name:"Q3 Sportback"},{slug:"q4",name:"Q4 e-tron"},{slug:"q4-sportback",name:"Q4 Sportback e-tron"},{slug:"q5",name:"Q5"},{slug:"q5-sportback",name:"Q5 Sportback"},{slug:"q6-e-tron",name:"Q6 e-tron"},{slug:"q7",name:"Q7"},{slug:"q8",name:"Q8"},{slug:"q8-e-tron",name:"Q8 e-tron"},{slug:"q8-sportback-e-tron",name:"Q8 Sportback e-tron"},{slug:"r8",name:"R8"},{slug:"rs-e-tron-gt",name:"RS e-tron GT"},{slug:"rs-q3",name:"RS Q3"},{slug:"rs-q3-sportback",name:"RS Q3 Sportback"},{slug:"rs-q8",name:"RS Q8"},{slug:"rs3",name:"RS3"},{slug:"rs4",name:"RS4"},{slug:"rs5",name:"RS5"},{slug:"rs6",name:"RS6"},{slug:"rs7",name:"RS7"},{slug:"s-e-tron-gt",name:"S e-tron GT"},{slug:"s1",name:"S1"},{slug:"s3",name:"S3"},{slug:"s4",name:"S4"},{slug:"s5",name:"S5"},{slug:"s6",name:"S6"},{slug:"s7",name:"S7"},{slug:"s8",name:"S8"},{slug:"sq2",name:"SQ2"},{slug:"sq5",name:"SQ5"},{slug:"sq5-sportback",name:"SQ5 Sportback"},{slug:"sq6-e-tron",name:"SQ6 e-tron"},{slug:"sq7",name:"SQ7"},{slug:"sq8",name:"SQ8"},{slug:"sq8-e-tron",name:"SQ8 e-tron"},{slug:"sq8-sportback-e-tron",name:"SQ8 Sportback e-tron"},{slug:"tt",name:"TT"},{slug:"tt-rs",name:"TT RS"},{slug:"tts",name:"TT S"}],bentley:[{slug:"bentayga",name:"Bentayga"},{slug:"continental-gt",name:"Continental GT"},{slug:"continental-gtc",name:"Continental GTC"},{slug:"flying-spur",name:"Flying Spur"}],bmw:[{slug:"1-series",name:"1 Series"},{slug:"2-series",name:"2 Series"},{slug:"2-series-active-tourer",name:"2 Series Active Tourer"},{slug:"2-series-gran-coupe",name:"2 Series Gran Coupe"},{slug:"3-series",name:"3 Series"},{slug:"3-series-gran-turismo",name:"3 Series Gran Turismo"},{slug:"4-series",name:"4 Series"},{slug:"4-series-gran-coupe",name:"4 Series Gran Coupe"},{slug:"5-series",name:"5 Series"},{slug:"5-series-gran-turismo",name:"5 Series Gran Turismo"},{slug:"6-series",name:"6 Series"},{slug:"7-series",name:"7 Series"},{slug:"8-series",name:"8 Series"},{slug:"i4",name:"i4"},{slug:"i5",name:"i5"},{slug:"i7",name:"i7"},{slug:"ix",name:"iX"},{slug:"ix1",name:"iX1"},{slug:"ix2",name:"iX2"},{slug:"ix3",name:"iX3"},{slug:"m2",name:"M2"},{slug:"m3",name:"M3"},{slug:"m4",name:"M4"},{slug:"m5",name:"M5"},{slug:"m8",name:"M8"},{slug:"x1",name:"X1"},{slug:"x2",name:"X2"},{slug:"x3",name:"X3"},{slug:"x3-m",name:"X3 M"},{slug:"x4",name:"X4"},{slug:"x4-m",name:"X4 M"},{slug:"x5",name:"X5"},{slug:"x5-m",name:"X5 M"},{slug:"x6",name:"X6"},{slug:"x6-m",name:"X6 M"},{slug:"x7",name:"X7"},{slug:"xm",name:"XM"},{slug:"z4",name:"Z4"}],"bmw-alpina":[{slug:"b10",name:"B10"},{slug:"b3",name:"B3"},{slug:"b4",name:"B4"},{slug:"b8",name:"B8"},{slug:"xb7",name:"XB7"},{slug:"xd3",name:"XD3"}],byd:[{slug:"atto-1",name:"Atto 1"},{slug:"atto-3",name:"Atto 3"},{slug:"sea-lion-6",name:"Sealion 6"},{slug:"seal",name:"Seal"},{slug:"sealion-5",name:"Sealion 5"},{slug:"sealion-7",name:"Sealion 7"},{slug:"sealion-8",name:"Sealion 8"},{slug:"shark-6",name:"Shark 6"}],cadillac:[{slug:"lyriq",name:"Lyriq"}],chery:[{slug:"j1",name:"J1"},{slug:"j11",name:"J11"},{slug:"j3",name:"J3"},{slug:"omoda-5",name:"Omoda 5"},{slug:"omoda-5-gt",name:"Omoda 5 GT"},{slug:"omoda-e5",name:"Omoda E5"},{slug:"tiggo-4",name:"Tiggo 4"},{slug:"tiggo-4-pro",name:"Tiggo 4 Pro"},{slug:"tiggo-7",name:"Tiggo 7"},{slug:"tiggo-7-pro",name:"Tiggo 7 Pro"},{slug:"tiggo-8",name:"Tiggo 8"},{slug:"tiggo-8-pro-max",name:"Tiggo 8 Pro Max"}],citroen:[{slug:"c3",name:"C3"},{slug:"c3-aircross",name:"C3 Aircross"},{slug:"c4",name:"C4"},{slug:"c5-aircross",name:"C5 Aircross"}],cupra:[{slug:"ateca",name:"Ateca"},{slug:"born",name:"Born"},{slug:"formentor",name:"Formentor"},{slug:"leon",name:"Leon"},{slug:"tavascan",name:"Tavascan"},{slug:"terramar",name:"Terramar"}],daihatsu:[{slug:"charade",name:"Charade"}],datsun:[{slug:"240z",name:"240Z"},{slug:"260z",name:"260Z"},{slug:"280z",name:"280Z"},{slug:"280zx",name:"280ZX"}],deepal:[{slug:"e07",name:"E07"},{slug:"s07",name:"S07"}],denza:[{slug:"b5",name:"B5"},{slug:"b8",name:"B8"},{slug:"d9",name:"D9"}],dodge:[{slug:"avenger",name:"Avenger"}],ds:[{slug:"ds-3",name:"DS 3"},{slug:"ds-4",name:"DS 4"},{slug:"ds-7",name:"DS 7"}],ferrari:[{slug:"12cilindri",name:"12Cilindri"},{slug:"12cilindri-spider",name:"12Cilindri Spider"},{slug:"296-gt3",name:"296 GT3"},{slug:"296-gtb",name:"296 GTB"},{slug:"296-gts",name:"296 GTS"},{slug:"296-speciale",name:"296 Speciale"},{slug:"296-speciale-a",name:"296 Speciale A"},{slug:"458-italia",name:"458 Italia"},{slug:"458-speciale",name:"458 Speciale"},{slug:"458-speciale-a",name:"458 Speciale A"},{slug:"458-spider",name:"458 Spider"},{slug:"488-gtb",name:"488 GTB"},{slug:"488-pista",name:"488 Pista"},{slug:"488-pista-spider",name:"488 Pista Spider"},{slug:"488-spider",name:"488 Spider"},{slug:"812-competizione",name:"812 Competizione"},{slug:"812-competizione-a",name:"812 Competizione A"},{slug:"812-gts",name:"812 GTS"},{slug:"812-superfast",name:"812 Superfast"},{slug:"849-testarossa",name:"849 Testarossa"},{slug:"amalfi",name:"Amalfi"},{slug:"daytona-sp3",name:"Daytona SP3"},{slug:"f8-spider",name:"F8 Spider"},{slug:"f8-tributo",name:"F8 Tributo"},{slug:"f80",name:"F80"},{slug:"ff",name:"FF"},{slug:"gtc4-lusso",name:"GTC4Lusso"},{slug:"monza-sp1",name:"Monza SP1"},{slug:"monza-sp2",name:"Monza SP2"},{slug:"portofino",name:"Portofino"},{slug:"roma",name:"Roma"},{slug:"sf90-spider",name:"SF90 Spider"},{slug:"sf90-stradale",name:"SF90 Stradale"},{slug:"sf90-xx-spider",name:"SF90 XX Spider"},{slug:"sf90-xx-stradale",name:"SF90 XX Stradale"}],fiat:[{slug:"500",name:"500"},{slug:"500c",name:"500C"},{slug:"500e",name:"500e"},{slug:"595",name:"595"},{slug:"695",name:"695"},{slug:"ducato",name:"Ducato"},{slug:"ritmo",name:"Ritmo"}],ford:[{slug:"capri",name:"Capri"},{slug:"cougar",name:"Cougar"},{slug:"courier",name:"Courier"},{slug:"e-transit",name:"E-Transit"},{slug:"endura",name:"Endura"},{slug:"escape",name:"Escape"},{slug:"everest",name:"Everest"},{slug:"f-150",name:"F-150"},{slug:"fairlane",name:"Fairlane"},{slug:"fairmont",name:"Fairmont"},{slug:"falcon",name:"Falcon"},{slug:"fiesta",name:"Fiesta"},{slug:"laser",name:"Laser"},{slug:"ltd",name:"LTD"},{slug:"mustang",name:"Mustang"},{slug:"mustang-mach-e",name:"Mustang Mach-E"},{slug:"probe",name:"Probe"},{slug:"puma",name:"Puma"},{slug:"ranger",name:"Ranger"},{slug:"taurus",name:"Taurus"},{slug:"territory",name:"Territory"},{slug:"tourneo-custom",name:"Tourneo Custom"},{slug:"transit",name:"Transit"},{slug:"transit-custom",name:"Transit Custom"}],foton:[{slug:"tunland",name:"Tunland"}],geely:[{slug:"ex5",name:"EX5"},{slug:"riddara-rd6",name:"Riddara RD6"},{slug:"starray-em-i",name:"Starray EM-i"}],genesis:[{slug:"g70",name:"G70"},{slug:"g80",name:"G80"},{slug:"gv60",name:"GV60"},{slug:"gv70",name:"GV70"},{slug:"gv80",name:"GV80"}],"great-wall":[{slug:"cannon",name:"Cannon"},{slug:"cannon-alpha",name:"Cannon Alpha"},{slug:"ora",name:"Ora"},{slug:"steed",name:"Steed"},{slug:"ute",name:"Ute"}],haval:[{slug:"h6",name:"H6"},{slug:"h6gt",name:"H6 GT"},{slug:"jolion",name:"Jolion"},{slug:"jolion-s",name:"Jolion S"}],holden:[{slug:"acadia",name:"Acadia"},{slug:"adventra",name:"Adventra"},{slug:"apollo",name:"Apollo"},{slug:"astra",name:"Astra"},{slug:"astra-gtc",name:"Astra GTC"},{slug:"astra-vxr",name:"Astra VXR"},{slug:"barina",name:"Barina"},{slug:"barina-spark",name:"Barina Spark"},{slug:"caprice",name:"Caprice"},{slug:"captiva",name:"Captiva"},{slug:"captiva-5",name:"Captiva 5"},{slug:"captiva-7",name:"Captiva 7"},{slug:"cascada",name:"Cascada"},{slug:"colorado",name:"Colorado"},{slug:"colorado-7",name:"Colorado 7"},{slug:"commodore",name:"Commodore"},{slug:"crewman",name:"Crewman"},{slug:"cruze",name:"Cruze"},{slug:"equinox",name:"Equinox"},{slug:"frontera",name:"Frontera"},{slug:"insignia-vxr",name:"Insignia VXR"},{slug:"jackaroo",name:"Jackaroo"},{slug:"malibu",name:"Malibu"},{slug:"monaro",name:"Monaro"},{slug:"one-tonner",name:"One Tonner"},{slug:"rodeo",name:"Rodeo"},{slug:"spark",name:"Spark"},{slug:"suburban",name:"Suburban"},{slug:"tigra",name:"Tigra"},{slug:"trailblazer",name:"Trailblazer"},{slug:"trax",name:"Trax"},{slug:"ute",name:"Ute"},{slug:"vectra",name:"Vectra"},{slug:"viva",name:"Viva"},{slug:"volt",name:"Volt"},{slug:"zafira",name:"Zafira"}],honda:[{slug:"accord",name:"Accord"},{slug:"accord-euro",name:"Accord Euro"},{slug:"city",name:"City"},{slug:"civic",name:"Civic"},{slug:"civic-5d",name:"Civic 5d"},{slug:"civic-type-r",name:"Civic Type R"},{slug:"cr-v",name:"CR-V"},{slug:"hr-v",name:"HR-V"},{slug:"jazz",name:"Jazz"},{slug:"jazz-crosstar",name:"Jazz Crosstar"},{slug:"legend",name:"Legend"},{slug:"odyssey",name:"Odyssey"},{slug:"s2000",name:"S2000"},{slug:"zr-v",name:"ZR-V"}],hyundai:[{slug:"accent",name:"Accent"},{slug:"elantra",name:"Elantra"},{slug:"elantra-lavita",name:"Elantra LaVita"},{slug:"i20-n",name:"i20 N"},{slug:"i30",name:"i30"},{slug:"i30-fastback-n",name:"i30 Fastback N"},{slug:"i30-n",name:"i30 N"},{slug:"i30-sedan",name:"i30 Sedan"},{slug:"i30-sedan-n",name:"i30 Sedan N"},{slug:"i45",name:"i45"},{slug:"iload",name:"iLoad"},{slug:"imax",name:"iMax"},{slug:"inster",name:"Inster"},{slug:"ioniq",name:"IONIQ"},{slug:"ioniq-5",name:"IONIQ 5"},{slug:"ioniq-5-n",name:"IONIQ 5 N"},{slug:"ioniq-6",name:"IONIQ 6"},{slug:"ioniq-6-n",name:"IONIQ 6 N"},{slug:"ioniq-9",name:"IONIQ 9"},{slug:"ix35",name:"ix35"},{slug:"kona",name:"Kona"},{slug:"kona-n",name:"Kona N"},{slug:"mighty",name:"Mighty"},{slug:"nexo",name:"Nexo"},{slug:"palisade",name:"Palisade"},{slug:"santa-fe",name:"Santa Fe"},{slug:"sonata",name:"Sonata"},{slug:"staria",name:"Staria"},{slug:"tucson",name:"Tucson"},{slug:"venue",name:"Venue"}],ineos:[{slug:"grenadier",name:"Grenadier"}],isuzu:[{slug:"d-max",name:"D-MAX"},{slug:"mu-x",name:"mu-X"}],iveco:[{slug:"daily",name:"Daily"}],jac:[{slug:"t9",name:"T9"}],jaecoo:[{slug:"j5",name:"J5"},{slug:"j7",name:"J7"}],jaguar:[{slug:"e-pace",name:"E-Pace"},{slug:"f-pace",name:"F-Pace"},{slug:"f-type",name:"F-Type"},{slug:"i-pace",name:"I-Pace"},{slug:"xe",name:"XE"},{slug:"xf",name:"XF"}],jeep:[{slug:"avenger",name:"Avenger"},{slug:"cherokee",name:"Cherokee"},{slug:"compass",name:"Compass"},{slug:"gladiator",name:"Gladiator"},{slug:"grand-cherokee",name:"Grand Cherokee"},{slug:"grand-cherokee-l",name:"Grand Cherokee L"},{slug:"renegade",name:"Renegade"},{slug:"wrangler",name:"Wrangler"}],"kg-mobility":[{slug:"actyon",name:"Actyon"},{slug:"korando",name:"Korando"},{slug:"musso",name:"Musso"},{slug:"musso-ev",name:"Musso EV"},{slug:"rexton",name:"Rexton"},{slug:"torres",name:"Torres"}],kia:[{slug:"carnival",name:"Carnival"},{slug:"cerato",name:"Cerato"},{slug:"ev3",name:"EV3"},{slug:"ev4",name:"EV4"},{slug:"ev5",name:"EV5"},{slug:"ev6",name:"EV6"},{slug:"ev9",name:"EV9"},{slug:"grand-carnival",name:"Grand Carnival"},{slug:"k4",name:"K4"},{slug:"mentor",name:"Mentor"},{slug:"niro",name:"Niro"},{slug:"niro-plus",name:"Niro Plus"},{slug:"optima",name:"Optima"},{slug:"picanto",name:"Picanto"},{slug:"picanto-x-line",name:"Picanto X-Line"},{slug:"rio",name:"Rio"},{slug:"rondo",name:"Rondo"},{slug:"seltos",name:"Seltos"},{slug:"sorento",name:"Sorento"},{slug:"sportage",name:"Sportage"},{slug:"stinger",name:"Stinger"},{slug:"stonic",name:"Stonic"},{slug:"tasman",name:"Tasman"}],lamborghini:[{slug:"aventador",name:"Aventador"},{slug:"countach",name:"Countach"},{slug:"huracan",name:"Huracan"},{slug:"revuelto",name:"Revuelto"},{slug:"sian",name:"Sian"},{slug:"temerario",name:"Temerario"},{slug:"urus",name:"Urus"}],"land-rover":[{slug:"defender",name:"Defender"},{slug:"discovery-5",name:"Discovery 5"},{slug:"discovery-sport",name:"Discovery Sport"},{slug:"range-rover",name:"Range Rover"},{slug:"range-rover-evoque",name:"Range Rover Evoque"},{slug:"range-rover-sport",name:"Range Rover Sport"},{slug:"range-rover-velar",name:"Range Rover Velar"}],ldv:[{slug:"d90",name:"D90"},{slug:"deliver-7",name:"Deliver 7"},{slug:"deliver-9",name:"Deliver 9"},{slug:"edeliver-3",name:"eDeliver 3"},{slug:"edeliver-7",name:"eDeliver 7"},{slug:"edeliver-9",name:"eDeliver 9"},{slug:"et60",name:"eT60"},{slug:"g10",name:"G10"},{slug:"mifa",name:"Mifa People Mover"},{slug:"mifa-9",name:"Mifa 9"},{slug:"t60",name:"T60"},{slug:"terron-9",name:"Terron 9"},{slug:"v80",name:"V80"}],leapmotor:[{slug:"b10",name:"B10"},{slug:"c10",name:"C10"}],lexus:[{slug:"es",name:"ES"},{slug:"gx",name:"GX"},{slug:"is",name:"IS"},{slug:"lbx",name:"LBX"},{slug:"lc",name:"LC"},{slug:"lm",name:"LM"},{slug:"ls",name:"LS"},{slug:"lx",name:"LX"},{slug:"nx",name:"NX"},{slug:"rc-f",name:"RC F"},{slug:"rx",name:"RX"},{slug:"rz",name:"RZ"},{slug:"ux",name:"UX"}],lotus:[{slug:"eletre",name:"Eletre"},{slug:"emeya",name:"Emeya"},{slug:"emira",name:"Emira"},{slug:"evija",name:"Evija"}],mahindra:[{slug:"genio",name:"Genio"},{slug:"pik-up",name:"Pik Up"},{slug:"scorpio-n",name:"Scorpio-N"},{slug:"xuv500",name:"XUV500"},{slug:"xuv700",name:"XUV700"}],maserati:[{slug:"ghibli",name:"Ghibli"},{slug:"gran-turismo",name:"GranTurismo"},{slug:"grancabrio",name:"GranCabrio"},{slug:"grecale",name:"Grecale"},{slug:"gt2-stradale",name:"GT2 Stradale"},{slug:"levante",name:"Levante"},{slug:"mc20",name:"MC20"},{slug:"mcpura",name:"MCPura"},{slug:"quattroporte",name:"Quattroporte"}],mazda:[{slug:"6e",name:"6e"},{slug:"929",name:"929"},{slug:"bravo",name:"Bravo"},{slug:"bt-50",name:"BT-50"},{slug:"cx-3",name:"CX-3"},{slug:"cx-30",name:"CX-30"},{slug:"cx-5",name:"CX-5"},{slug:"cx-60",name:"CX-60"},{slug:"cx-70",name:"CX-70"},{slug:"cx-8",name:"CX-8"},{slug:"cx-80",name:"CX-80"},{slug:"cx-9",name:"CX-9"},{slug:"cx-90",name:"CX-90"},{slug:"mazda2",name:"Mazda2"},{slug:"mazda3",name:"Mazda3"},{slug:"mazda3-mps",name:"Mazda3 MPS"},{slug:"mazda6",name:"Mazda6"},{slug:"mx-30",name:"MX-30"},{slug:"mx-5",name:"MX-5"},{slug:"mx-5-rf",name:"MX-5 RF"},{slug:"rx-7",name:"RX-7"}],mclaren:[{slug:"720s",name:"720S"},{slug:"720s-spider",name:"720S Spider"},{slug:"750s",name:"750S"},{slug:"765lt",name:"765LT"},{slug:"765lt-spider",name:"765LT Spider"},{slug:"artura",name:"Artura"},{slug:"gt",name:"GT"},{slug:"gts",name:"GTS"},{slug:"mp4-12c",name:"Mp4-12C"},{slug:"senna",name:"Senna"},{slug:"speedtail",name:"Speedtail"},{slug:"w1",name:"W1"}],mercedes:[{slug:"a-class",name:"A-Class"},{slug:"a-class-amg",name:"A-Class AMG"},{slug:"c-class",name:"C-Class"},{slug:"c-class-amg",name:"C-Class AMG"},{slug:"cla-class",name:"CLA-Class"},{slug:"cla-class-amg",name:"CLA-Class AMG"},{slug:"cle-class",name:"CLE-Class"},{slug:"cls-class-amg",name:"CLS-Class AMG"},{slug:"e-class",name:"E-Class"},{slug:"e-class-amg",name:"E-Class AMG"},{slug:"e-class-cabrio",name:"E-Class Cabriolet"},{slug:"e-class-coupe",name:"E-Class Coupe"},{slug:"eqa",name:"EQA"},{slug:"eqb",name:"EQB"},{slug:"eqc",name:"EQC"},{slug:"eqe",name:"EQE"},{slug:"eqe-amg",name:"EQE AMG"},{slug:"eqe-suv",name:"EQE SUV"},{slug:"eqe-suv-amg",name:"EQE SUV AMG"},{slug:"eqs",name:"EQS"},{slug:"eqs-amg",name:"EQS AMG"},{slug:"eqs-suv",name:"EQS SUV"},{slug:"eqv",name:"EQV"},{slug:"g-class",name:"G-Class"},{slug:"g-class-amg",name:"G-Class AMG"},{slug:"gla",name:"GLA-Class"},{slug:"gla-class-amg",name:"GLA-Class AMG"},{slug:"glb",name:"GLB-Class"},{slug:"glb-class-amg",name:"GLB-Class AMG"},{slug:"glc",name:"GLC-Class"},{slug:"glc-class-amg",name:"GLC-Class AMG"},{slug:"glc-class-coupe",name:"GLC-Class Coupe"},{slug:"glc-class-coupe-amg",name:"GLC-Class Coupe AMG"},{slug:"gle-class",name:"GLE-Class"},{slug:"gle-class-amg",name:"GLE-Class AMG"},{slug:"gle-class-coupe",name:"GLE-Class Coupe"},{slug:"gle-class-coupe-amg",name:"GLE-Class Coupe AMG"},{slug:"gls-class",name:"GLS-Class"},{slug:"gls-class-amg",name:"GLS-Class AMG"},{slug:"s-class",name:"S-Class"},{slug:"sprinter",name:"Sprinter"},{slug:"v-class",name:"V-Class"},{slug:"x-class",name:"X-Class"}],"mercedes-maybach":[{slug:"eqs",name:"EQS"},{slug:"gls-class",name:"GLS-Class"},{slug:"s-class",name:"S-Class"}],mg:[{slug:"3",name:"3"},{slug:"350",name:"350"},{slug:"4",name:"4"},{slug:"5",name:"5"},{slug:"6",name:"6"},{slug:"cyberster",name:"Cyberster"},{slug:"gs",name:"GS"},{slug:"hs",name:"HS"},{slug:"im5",name:"IM5"},{slug:"im6",name:"IM6"},{slug:"qs",name:"QS"},{slug:"s5",name:"S5"},{slug:"u9",name:"MGU9"},{slug:"zs",name:"ZS"},{slug:"zs-ev",name:"ZS EV"},{slug:"zst",name:"ZST"}],mini:[{slug:"aceman",name:"Aceman"},{slug:"clubman",name:"Clubman"},{slug:"convertible",name:"Convertible"},{slug:"cooper",name:"Cooper"},{slug:"countryman",name:"Countryman"},{slug:"hatch",name:"Hatch"}],mitsubishi:[{slug:"asx",name:"ASX"},{slug:"challenger",name:"Challenger"},{slug:"eclipse-cross",name:"Eclipse Cross"},{slug:"express",name:"Express"},{slug:"l200",name:"L200"},{slug:"magna",name:"Magna"},{slug:"mirage",name:"Mirage"},{slug:"nimbus",name:"Nimbus"},{slug:"outlander",name:"Outlander"},{slug:"pajero-sport",name:"Pajero Sport"},{slug:"triton",name:"Triton"},{slug:"verada",name:"Verada"}],nissan:[{slug:"200sx",name:"200SX"},{slug:"280zx",name:"280ZX"},{slug:"300zx",name:"300ZX"},{slug:"370z",name:"370Z"},{slug:"almera",name:"Almera"},{slug:"altima",name:"Altima"},{slug:"ariya",name:"Ariya"},{slug:"bluebird",name:"Bluebird"},{slug:"dualis",name:"Dualis"},{slug:"dualis-2",name:"Dualis+2"},{slug:"gt-r",name:"GT-R"},{slug:"juke",name:"Juke"},{slug:"leaf",name:"Leaf"},{slug:"maxima",name:"Maxima"},{slug:"micra",name:"Micra"},{slug:"navara",name:"Navara"},{slug:"np300-navara",name:"NP300 Navara"},{slug:"pathfinder",name:"Pathfinder"},{slug:"patrol",name:"Patrol"},{slug:"patrol-cab-chassis",name:"Patrol Cab Chassis"},{slug:"pulsar",name:"Pulsar"},{slug:"qashqai",name:"Qashqai"},{slug:"x-trail",name:"X-Trail"},{slug:"z",name:"Z"}],omoda:[{slug:"9",name:"9"},{slug:"c5",name:"C5"},{slug:"e5",name:"E5"}],opel:[{slug:"astra",name:"Astra"},{slug:"grandland",name:"Grandland"},{slug:"mokka",name:"Mokka"}],ora:[{slug:"03",name:"03"}],peugeot:[{slug:"2008",name:"2008"},{slug:"208",name:"208"},{slug:"3008",name:"3008"},{slug:"308",name:"308"},{slug:"408",name:"408"},{slug:"5008",name:"5008"},{slug:"508",name:"508"},{slug:"boxer",name:"Boxer"},{slug:"expert",name:"Expert"},{slug:"partner",name:"Partner"}],polaris:[{slug:"general-xp",name:"General XP 1000"},{slug:"general-xp-4",name:"General XP 4 1000"},{slug:"ranger-crew-xd",name:"Ranger Crew XD 1500"},{slug:"ranger-crew-xp",name:"Ranger Crew XP 1000"},{slug:"ranger-xd",name:"Ranger XD 1500"},{slug:"ranger-xp",name:"Ranger XP 1000"},{slug:"rzr-pro-r",name:"RZR Pro R"},{slug:"rzr-pro-r-4",name:"RZR Pro R 4"},{slug:"rzr-pro-xp",name:"RZR Pro XP"},{slug:"rzr-xp",name:"RZR XP 1000"},{slug:"rzr-xp-4",name:"RZR XP 4 1000"},{slug:"xpedition-adv",name:"Xpedition ADV"},{slug:"xpedition-adv-5",name:"Xpedition ADV 5"},{slug:"xpedition-xp",name:"Xpedition XP"},{slug:"xpedition-xp-5",name:"Xpedition XP 5"}],polestar:[{slug:"polestar-1",name:"Polestar 1"},{slug:"polestar-2",name:"Polestar 2"},{slug:"polestar-3",name:"Polestar 3"},{slug:"polestar-4",name:"Polestar 4"},{slug:"polestar-5",name:"Polestar 5"}],porsche:[{slug:"718",name:"718"},{slug:"911",name:"911"},{slug:"928",name:"928"},{slug:"cayenne",name:"Cayenne"},{slug:"macan",name:"Macan"},{slug:"panamera",name:"Panamera"},{slug:"taycan",name:"Taycan"}],proton:[{slug:"exora",name:"Exora"},{slug:"gen-2",name:"Gen-2"},{slug:"jumbuck",name:"Jumbuck"},{slug:"persona",name:"Persona"},{slug:"preve",name:"Preve"},{slug:"s16",name:"S16"},{slug:"satria",name:"Satria"},{slug:"savvy",name:"Savvy"},{slug:"suprima",name:"Suprima S"},{slug:"waja",name:"Waja"}],ram:[{slug:"1500",name:"1500"},{slug:"1500-classic",name:"1500 Classic"},{slug:"1500-trx",name:"1500 TRX"},{slug:"2500",name:"2500"},{slug:"3500",name:"3500"}],renault:[{slug:"arkana",name:"Arkana"},{slug:"captur",name:"Captur"},{slug:"duster",name:"Duster"},{slug:"kangoo",name:"Kangoo"},{slug:"kangoo-van",name:"Kangoo Van"},{slug:"koleos",name:"Koleos"},{slug:"latitude",name:"Latitude"},{slug:"master",name:"Master"},{slug:"megane-e-tech",name:"Megane E-Tech"},{slug:"scenic-e-tech",name:"Scenic E-Tech"},{slug:"trafic",name:"Trafic"}],seat:[{slug:"arona",name:"Arona"},{slug:"ateca",name:"Ateca"},{slug:"leon",name:"Leon"},{slug:"tarraco",name:"Tarraco"}],skoda:[{slug:"elroq",name:"Elroq"},{slug:"enyaq-iv",name:"Enyaq"},{slug:"fabia",name:"Fabia"},{slug:"kamiq",name:"Kamiq"},{slug:"karoq",name:"Karoq"},{slug:"kodiaq",name:"Kodiaq"},{slug:"octavia",name:"Octavia"},{slug:"rapid",name:"Rapid"},{slug:"scala",name:"Scala"},{slug:"superb",name:"Superb"},{slug:"superb-scout",name:"Superb Scout"},{slug:"yeti",name:"Yeti"}],smart:[{slug:"1",name:"#1"},{slug:"3",name:"#3"},{slug:"roadster",name:"Roadster"}],ssangyong:[{slug:"korando",name:"Korando"},{slug:"kyron",name:"Kyron"},{slug:"musso",name:"Musso"},{slug:"rexton",name:"Rexton"},{slug:"rhino",name:"Rhino"},{slug:"stavic",name:"Stavic"},{slug:"tivoli",name:"Tivoli"}],subaru:[{slug:"brz",name:"BRZ"},{slug:"crosstrek",name:"Crosstrek"},{slug:"forester",name:"Forester"},{slug:"impreza",name:"Impreza"},{slug:"liberty",name:"Liberty"},{slug:"outback",name:"Outback"},{slug:"solterra",name:"Solterra"},{slug:"wrx",name:"WRX"},{slug:"wrx-sti",name:"WRX STI"},{slug:"xv",name:"XV"}],suzuki:[{slug:"baleno",name:"Baleno"},{slug:"fronx",name:"Fronx"},{slug:"ignis",name:"Ignis"},{slug:"jimny",name:"Jimny"},{slug:"s-cross",name:"S-Cross"},{slug:"swift",name:"Swift"},{slug:"swift-sport",name:"Swift Sport"},{slug:"vitara",name:"Vitara"}],tank:[{slug:"300",name:"300"},{slug:"500",name:"500"}],tesla:[{slug:"cybertruck",name:"Cybertruck"},{slug:"model-3",name:"Model 3"},{slug:"model-s",name:"Model S"},{slug:"model-x",name:"Model X"},{slug:"model-y",name:"Model Y"}],toyota:[{slug:"86",name:"86"},{slug:"aurion",name:"Aurion"},{slug:"avalon",name:"Avalon"},{slug:"avensis-verso",name:"Avensis Verso"},{slug:"bz4x",name:"bZ4X"},{slug:"c-hr",name:"C-HR"},{slug:"camry",name:"Camry"},{slug:"corolla",name:"Corolla"},{slug:"corolla-cross",name:"Corolla Cross"},{slug:"echo",name:"Echo"},{slug:"fortuner",name:"Fortuner"},{slug:"gr-corolla",name:"GR Corolla"},{slug:"gr-yaris",name:"GR Yaris"},{slug:"gr86",name:"GR86"},{slug:"granvia",name:"Granvia"},{slug:"hiace",name:"Hiace"},{slug:"hilux",name:"Hilux"},{slug:"kluger",name:"Kluger"},{slug:"land-cruiser",name:"Land Cruiser"},{slug:"land-cruiser-prado",name:"Land Cruiser Prado"},{slug:"prius",name:"Prius"},{slug:"prius-c",name:"Prius c"},{slug:"prius-v",name:"Prius v"},{slug:"rav4",name:"RAV4"},{slug:"rukus",name:"Rukus"},{slug:"supra",name:"Supra"},{slug:"tarago",name:"Tarago"},{slug:"tundra",name:"Tundra"},{slug:"vienta",name:"Vienta"},{slug:"yaris",name:"Yaris"},{slug:"yaris-cross",name:"Yaris Cross"}],triumph:[{slug:"tr7",name:"TR7"}],volkswagen:[{slug:"amarok",name:"Amarok"},{slug:"beetle",name:"Beetle"},{slug:"caddy",name:"Caddy"},{slug:"california",name:"California"},{slug:"caravelle",name:"Caravelle"},{slug:"cc",name:"CC"},{slug:"crafter",name:"Crafter"},{slug:"golf",name:"Golf"},{slug:"golf-alltrack",name:"Golf Alltrack"},{slug:"golf-gti",name:"Golf GTI"},{slug:"golf-r",name:"Golf R"},{slug:"grand-california",name:"Grand California"},{slug:"id-buzz",name:"ID. Buzz"},{slug:"id4",name:"ID.4"},{slug:"id5",name:"ID.5"},{slug:"multivan",name:"Multivan"},{slug:"passat",name:"Passat"},{slug:"passat-alltrack",name:"Passat Alltrack"},{slug:"polo",name:"Polo"},{slug:"polo-gti",name:"Polo GTI"},{slug:"t-cross",name:"T-Cross"},{slug:"t-roc",name:"T-Roc"},{slug:"t-roc-r",name:"T-Roc R"},{slug:"tiguan",name:"Tiguan"},{slug:"tiguan-allspace",name:"Tiguan Allspace"},{slug:"touareg",name:"Touareg"},{slug:"transporter",name:"Transporter"}],volvo:[{slug:"c40",name:"C40"},{slug:"es90",name:"ES90"},{slug:"ex30",name:"EX30"},{slug:"ex40",name:"EX40"},{slug:"ex90",name:"EX90"},{slug:"s60",name:"S60"},{slug:"s60-cross-country",name:"S60 Cross Country"},{slug:"s90",name:"S90"},{slug:"v60-cross-country",name:"V60 Cross Country"},{slug:"v90-cross-country",name:"V90 Cross Country"},{slug:"xc40",name:"XC40"},{slug:"xc60",name:"XC60"},{slug:"xc90",name:"XC90"}],zeekr:[{slug:"009",name:"009"},{slug:"x",name:"X"}]},years:{"audi/rs6":[2026,2025,2024,2023,2022,2021,2020],"bmw/m3":[2026,2025,2024,2023,2022,2021,2020,2018,2017,2016,2015,2014],"ferrari/296-gtb":[2026,2025,2024,2023,2022],"lamborghini/huracan":[2024,2023,2022,2021,2020,2019],"mclaren/750s":[2026,2025,2024,2023],"mercedes/c-class-amg":[2026,2025,2024,2023,2022,2021,2020,2019,2018,2017,2016],"nissan/gt-r":[2023,2022,2021,2020,2019,2018,2017,2016],"tesla/model-3":[2026,2025,2024,2023,2022,2021,2020,2019,2018,2017],"toyota/supra":[2026,2025,2024,2023,2022,2021,1993,1992,1991,1990,1989,1988,1987,1986]},modifications:{"audi/rs6/2024":[{slug:"a28ff79ddf",name:"4.0 TFSi quattro",trim:"4.0 TFSi quattro",body:null}],"bmw/m3/2024":[{slug:"0aaf0bb46d",name:"M3",trim:"M3",body:null},{slug:"402e65e913",name:"M3 Competition",trim:"M3 Competition",body:null},{slug:"4c760df5c5",name:"M3 Competition xDrive",trim:"M3 Competition xDrive",body:null},{slug:"6250847bc8",name:"M3 Competition xDrive",trim:"M3 Competition xDrive",body:null},{slug:"82f59cadb0",name:"M3",trim:"M3",body:null}],"ferrari/296-gtb/2024":[{slug:"c412dafd12",name:"3.0",trim:"3.0",body:null}],"lamborghini/huracan/2024":[{slug:"aab49a3dae",name:"Evo 5.2",trim:"Evo 5.2",body:null},{slug:"f81a37ca20",name:"Evo 5.2",trim:"Evo 5.2",body:null}],"mclaren/750s/2024":[{slug:"f8f346c327",name:"4.0T",trim:"4.0T",body:null}],"mercedes/c-class-amg/2024":[{slug:"038122904b",name:"C 43 4Matic",trim:"C 43 4Matic",body:null},{slug:"a403e6b64c",name:"C 63 S E",trim:"C 63 S E",body:null}],"nissan/gt-r/2024":[],"tesla/model-3/2024":[{slug:"026e4ab9d6",name:"Long Range",trim:"Long Range",body:null},{slug:"4296c050a9",name:"Performance",trim:"Performance",body:null},{slug:"50f0c93d66",name:"Performance",trim:"Performance",body:null},{slug:"be5b2b9767",name:"Standard Range",trim:"Standard Range",body:null},{slug:"d4960b3833",name:"Long Range",trim:"Long Range",body:null}],"toyota/supra/2024":[{slug:"eabbd747b7",name:"3.0i",trim:"3.0i",body:null}]},meta:{modelsFetchedAt:{abarth:"2026-06-28T04:33:00.474Z",aion:"2026-06-28T04:33:01.415Z","alfa-romeo":"2026-06-28T04:33:02.355Z",alpine:"2026-06-28T04:33:03.290Z","aston-martin":"2026-06-28T04:33:04.229Z",audi:"2026-06-28T04:33:05.195Z",bentley:"2026-06-28T04:33:06.135Z",bmw:"2026-06-28T04:33:07.112Z","bmw-alpina":"2026-06-28T04:33:08.062Z",byd:"2026-06-28T04:33:09.004Z",cadillac:"2026-06-28T04:33:09.958Z",chery:"2026-06-28T04:33:10.944Z",citroen:"2026-06-28T04:33:11.887Z",cupra:"2026-06-28T04:33:12.827Z",daihatsu:"2026-06-28T04:33:13.770Z",datsun:"2026-06-28T04:33:14.721Z",deepal:"2026-06-27T04:23:59.381Z",denza:"2026-06-27T04:24:00.200Z",dodge:"2026-06-27T04:24:01.018Z",ds:"2026-06-27T04:24:01.843Z",ferrari:"2026-06-27T04:24:02.667Z",fiat:"2026-06-27T04:24:03.492Z",ford:"2026-06-27T04:24:04.311Z",foton:"2026-06-27T04:24:05.129Z",geely:"2026-06-27T04:24:05.946Z",genesis:"2026-06-27T04:24:06.764Z","great-wall":"2026-06-27T04:24:07.584Z",haval:"2026-06-27T04:24:08.402Z",holden:"2026-06-27T04:24:09.221Z",honda:"2026-06-27T04:24:10.039Z",hyundai:"2026-06-27T04:24:10.861Z",ineos:"2026-06-27T04:24:11.677Z",isuzu:"2026-06-27T04:24:12.495Z",iveco:"2026-06-28T04:32:51.940Z",jac:"2026-06-27T04:24:13.314Z",jaecoo:"2026-06-28T04:32:17.949Z",jaguar:"2026-06-28T04:32:18.902Z",jeep:"2026-06-28T04:32:19.838Z","kg-mobility":"2026-06-28T04:32:20.769Z",kia:"2026-06-28T04:32:21.710Z",lamborghini:"2026-06-28T04:32:22.641Z","land-rover":"2026-06-28T04:32:23.589Z",ldv:"2026-06-28T04:32:24.525Z",leapmotor:"2026-06-28T04:32:25.463Z",lexus:"2026-06-28T04:32:26.401Z",lotus:"2026-06-28T04:32:27.336Z",mahindra:"2026-06-28T04:32:28.278Z",maserati:"2026-06-28T04:32:29.225Z",mazda:"2026-06-28T04:32:30.189Z",mclaren:"2026-06-28T04:32:31.133Z",mercedes:"2026-06-28T04:32:32.103Z","mercedes-maybach":"2026-06-28T04:32:33.041Z",mg:"2026-06-28T04:32:33.991Z",mini:"2026-06-28T04:32:34.935Z",mitsubishi:"2026-06-28T04:32:35.884Z",nissan:"2026-06-28T04:32:36.836Z",omoda:"2026-06-28T04:32:37.789Z",opel:"2026-06-28T04:32:38.731Z",ora:"2026-06-28T04:32:39.684Z",peugeot:"2026-06-28T04:32:40.631Z",polaris:"2026-06-28T04:32:52.902Z",polestar:"2026-06-28T04:32:41.575Z",porsche:"2026-06-28T04:32:42.516Z",proton:"2026-06-28T04:32:43.459Z",ram:"2026-06-28T04:32:44.398Z",renault:"2026-06-28T04:32:45.351Z",seat:"2026-06-28T04:32:46.297Z",skoda:"2026-06-28T04:32:47.233Z",smart:"2026-06-28T04:32:48.178Z",ssangyong:"2026-06-28T04:32:49.114Z",subaru:"2026-06-28T04:32:50.052Z",suzuki:"2026-06-28T04:32:50.996Z",tank:"2026-06-28T04:32:53.840Z",tesla:"2026-06-28T04:32:54.775Z",toyota:"2026-06-28T04:32:55.749Z",triumph:"2026-06-28T04:32:56.677Z",volkswagen:"2026-06-28T04:32:57.635Z",volvo:"2026-06-28T04:32:58.582Z",zeekr:"2026-06-28T04:32:59.524Z"},popularFetchedAt:"2026-06-28T04:32:16.984Z",coverage:{covered:79,total:79}}};var u=v,k=(d||""||"http://localhost:8000").replace(/\/+$/,""),M=3600,Z="x-efficient-shop-hop",C="".trim();async function g(a,e){let s=new URLSearchParams;for(let[h,i]of Object.entries(e))i!==void 0&&i!==""&&s.set(h,String(i));let n=s.toString(),l=`${k}/api/fitment${a}${n?`?${n}`:""}`,m={next:{revalidate:M}},[f,y]=await Promise.all([b(),T()]),o=p(f,y,S(m));C&&(o[Z]=C);let t=await fetch(l,{...m,...Object.keys(o).length>0?{headers:o}:{}});if(!t.ok)throw new Error(`backend fitment ${t.status} on ${a}`);let c=await t.text();return c?JSON.parse(c):null}function r(a){return a!==void 0&&u.region===a&&(u.makes?.length??0)>0}function A(a){if(!a)return null;let e=a.et_range;return{pcd:a.pcd||void 0,boltPattern:a.bolt_pattern||void 0,centreBore:a.centre_bore??void 0,frontWheels:a.front_wheels??[],rearWheels:a.rear_wheels??[],frontTyres:a.front_tyres??[],rearTyres:a.rear_tyres??[],etRange:e&&e[0]!==null&&e[1]!==null?[e[0],e[1]]:void 0}}var z={async makes(a){try{return await g("/makes/",{region:a})}catch(e){if(r(a))return u.makes;throw e}},async models(a,e){try{return await g("/models/",{make:a,region:e})}catch(s){let n=r(e)?u.models[a]:void 0;if(n)return n;throw s}},async years(a,e,s){try{return await g("/years/",{make:a,model:e,region:s})}catch(n){let l=r(s)?u.years[`${a}/${e}`]:void 0;if(l)return l;throw n}},async modifications(a,e,s,n){try{return await g("/modifications/",{make:a,model:e,year:s,region:n})}catch(l){let m=r(n)?u.modifications[`${a}/${e}/${s}`]:void 0;if(m)return m;throw l}},async stockFitment(a,e,s,n,l){return A(await g("/stock-fitment/",{make:a,model:e,year:s,modification:n,region:l}))}};export{z as fitmentData};
package/dist/contract.js CHANGED
@@ -1,4 +1,4 @@
1
- var y=["general","commerce","service"],i=[{key:"openers",title:"Hero & intros",defaultExpanded:!0,templateable:!0,sections:[{type:"Hero",label:"Hero",set:"general"},{type:"HeroSingle",label:"Hero Single",set:"general"},{type:"IntroBleed",label:"Scroll-Over Text",set:"general"}]},{key:"shop",title:"Shop & galleries",templateable:!0,sections:[{type:"Collections",label:"Collections",set:"commerce"},{type:"AlloyWheelsListing",label:"List",set:"commerce"},{type:"CatalogFilterBar",label:"Catalog Filter Bar",set:"commerce"},{type:"ProductGrid",label:"Product Grid",set:"commerce"},{type:"FitmentFinder",label:"Fitment Form",set:"commerce"},{type:"Gallery",label:"Tabbed Gallery",set:"commerce"},{type:"GalleryB",label:"Customer Photo Grid",set:"commerce"}]},{key:"product",title:"Product page",templateable:!0,sections:[{type:"ProductHero",label:"Product Hero",set:"commerce"},{type:"SpecTable",label:"Spec Table",set:"commerce"},{type:"ProcessSteps",label:"Image & Text Columns",set:"general"},{type:"DetailRows",label:"Feature Rows",set:"commerce"},{type:"FitmentTable",label:"Fitment Table",set:"commerce"},{type:"TyreSizes",label:"Tyre Sizes",set:"commerce"},{type:"TyreFitment",label:"Tyre Fitment Form",set:"commerce"},{type:"EuTyreLabel",label:"EU Tyre Label",set:"commerce"},{type:"BundleOffer",label:"Bundle Products",set:"commerce"}]},{key:"checkout",title:"Checkout & ordering",templateable:!0,sections:[{type:"OrderSummary",label:"Order Table",set:"general"},{type:"PaymentBadges",label:"Payment Methods",set:"general"},{type:"CheckoutCTA",label:"Ready-to-Order Banner",set:"commerce"}]},{key:"about",title:"About & brand story",templateable:!0,sections:[{type:"Footprint",label:"Locations Map",set:"general"}]},{key:"content",title:"Text & content",templateable:!0,sections:[{type:"Prose",label:"Editorial Text",set:"general"},{type:"ParagraphsA",label:"Lead Text",set:"general"},{type:"Cards",label:"Cards",set:"general"}]},{key:"proof",title:"Stats & social proof",templateable:!0,sections:[{type:"Stats",label:"Stats",set:"general"},{type:"Chart",label:"Chart",set:"general"},{type:"Mockup",label:"Mockup Card",set:"general"},{type:"Reviews",label:"Reviews",set:"service"}]},{key:"promo",title:"Promotions & sign-ups",templateable:!0,sections:[{type:"Banner",label:"Banner",set:"general"},{type:"TitleWithButtons",label:"Call-to-Action Heading",set:"general"},{type:"Countdown",label:"Countdown",set:"general"}]},{key:"blog",title:"Blog & journal",templateable:!0,sections:[{type:"FeaturedCover",label:"Feature Banner",set:"general"},{type:"LongRead",label:"Article Text",set:"general"},{type:"Events",label:"Latest Posts",set:"service"}]},{key:"navigation",title:"Navigation & wayfinding",templateable:!0,sections:[{type:"Breadcrumb",label:"Breadcrumb",set:"general"},{type:"CategoryBar",label:"Category Bar",set:"general"},{type:"DocTabs",label:"Document Tabs",set:"general"}]},{key:"legal",title:"Legal & documents",templateable:!0,sections:[{type:"DocBody",label:"Document Text",set:"general"}]},{key:"contact",title:"Contact, FAQ & forms",templateable:!0,sections:[{type:"FAQ",label:"Q&A",set:"general"},{type:"ContactRouting",label:"Contact Form",set:"service"},{type:"ContactLocations",label:"Contact / Locations",set:"general"},{type:"SubmitBuild",label:"Photo Submission Form",set:"service"},{type:"ReviewForm",label:"Review Form",set:"service"},{type:"Form",label:"Form",set:"service"},{type:"AppointmentBooking",label:"Booking Form",set:"service"}]},{key:"structure",title:"Layout, structure & embeds",templateable:!1,sections:[{type:"SectionHeader",label:"Section Header",set:"general"},{type:"Flex",label:"Box",set:"general"},{type:"Divider",label:"Divider",set:"general"},{type:"CustomHTML",label:"Custom HTML",set:"general"}]},{key:"layouts",title:"Layouts",templateable:!0,sections:[{type:"Manifesto",label:"Brand Text",set:"general"},{type:"Split",label:"Image & Text Split",set:"general"},{type:"Subscribe",label:"Signup Form",set:"service"},{type:"Ticker",label:"Scrolling Bar",set:"general"},{type:"SpecStrip",label:"Spec Strip",set:"general"},{type:"TimelineTrack",label:"Milestone Timeline",set:"general"},{type:"Timeline",label:"Story Timeline",set:"general"},{type:"Logos",label:"Logos",set:"general"},{type:"DocMasthead",label:"Page Header",set:"general"}]}];var b={Masthead:`Owner, 2026-10-10 (the page headers become ONE Layouts row): Issue Header and Document Header are one Page Header. Retired from the Add menu with no second preset (reviewer, 2026-11-06).
1
+ var y=["general","commerce","service"],i=[{key:"openers",title:"Hero & intros",defaultExpanded:!0,templateable:!0,sections:[{type:"Hero",label:"Hero",set:"general"},{type:"HeroSingle",label:"Hero Single",set:"general"},{type:"IntroBleed",label:"Scroll-Over Text",set:"general"}]},{key:"shop",title:"Shop & galleries",templateable:!0,sections:[{type:"Collections",label:"Collections",set:"commerce"},{type:"AlloyWheelsListing",label:"List",set:"commerce"},{type:"CatalogFilterBar",label:"Catalog Filter Bar",set:"commerce"},{type:"ProductGrid",label:"Product Grid",set:"commerce"},{type:"FitmentFinder",label:"Fitment Form",set:"commerce"},{type:"Gallery",label:"Tabbed Gallery",set:"commerce"},{type:"GalleryB",label:"Customer Photo Grid",set:"commerce"}]},{key:"product",title:"Product page",templateable:!0,sections:[{type:"ProductHero",label:"Product Hero",set:"commerce"},{type:"SpecTable",label:"Spec Table",set:"commerce"},{type:"ProcessSteps",label:"Image & Text Columns",set:"general"},{type:"DetailRows",label:"Feature Rows",set:"commerce"},{type:"FitmentTable",label:"Fitment Table",set:"commerce"},{type:"TyreSizes",label:"Tyre Sizes",set:"commerce"},{type:"EuTyreLabel",label:"EU Tyre Label",set:"commerce"}]},{key:"checkout",title:"Checkout & ordering",templateable:!0,sections:[{type:"OrderSummary",label:"Order Table",set:"general"},{type:"PaymentBadges",label:"Payment Methods",set:"general"},{type:"CheckoutCTA",label:"Ready-to-Order Banner",set:"commerce"}]},{key:"about",title:"About & brand story",templateable:!0,sections:[{type:"Footprint",label:"Locations Map",set:"general"}]},{key:"content",title:"Text & content",templateable:!0,sections:[{type:"Prose",label:"Editorial Text",set:"general"},{type:"ParagraphsA",label:"Lead Text",set:"general"},{type:"Cards",label:"Cards",set:"general"}]},{key:"proof",title:"Stats & social proof",templateable:!0,sections:[{type:"Stats",label:"Stats",set:"general"},{type:"Chart",label:"Chart",set:"general"},{type:"Mockup",label:"Mockup Card",set:"general"},{type:"Reviews",label:"Reviews",set:"service"}]},{key:"promo",title:"Promotions & sign-ups",templateable:!0,sections:[{type:"Banner",label:"Banner",set:"general"},{type:"TitleWithButtons",label:"Call-to-Action Heading",set:"general"},{type:"Countdown",label:"Countdown",set:"general"}]},{key:"blog",title:"Blog & journal",templateable:!0,sections:[{type:"FeaturedCover",label:"Feature Banner",set:"general"},{type:"LongRead",label:"Article Text",set:"general"},{type:"ArticleBody",label:"Article Body",set:"service"},{type:"Events",label:"Latest Posts",set:"service"}]},{key:"navigation",title:"Navigation & wayfinding",templateable:!0,sections:[{type:"Breadcrumb",label:"Breadcrumb",set:"general"},{type:"CategoryBar",label:"Category Bar",set:"general"},{type:"DocTabs",label:"Document Tabs",set:"general"}]},{key:"legal",title:"Legal & documents",templateable:!0,sections:[{type:"DocBody",label:"Document Text",set:"general"}]},{key:"contact",title:"Contact, FAQ & forms",templateable:!0,sections:[{type:"FAQ",label:"Q&A",set:"general"},{type:"ContactRouting",label:"Contact Form",set:"service"},{type:"ContactLocations",label:"Contact / Locations",set:"general"},{type:"SubmitBuild",label:"Photo Submission Form",set:"service"},{type:"ReviewForm",label:"Review Form",set:"service"},{type:"Form",label:"Form",set:"service"},{type:"AppointmentBooking",label:"Booking Form",set:"service"}]},{key:"structure",title:"Layout, structure & embeds",templateable:!1,sections:[{type:"SectionHeader",label:"Section Header",set:"general"},{type:"Flex",label:"Box",set:"general"},{type:"Divider",label:"Divider",set:"general"},{type:"CustomHTML",label:"Custom HTML",set:"general"}]},{key:"layouts",title:"Layouts",templateable:!0,sections:[{type:"Manifesto",label:"Brand Text",set:"general"},{type:"Split",label:"Image & Text Split",set:"general"},{type:"Subscribe",label:"Signup Form",set:"service"},{type:"Ticker",label:"Scrolling Bar",set:"general"},{type:"SpecStrip",label:"Spec Strip",set:"general"},{type:"TimelineTrack",label:"Milestone Timeline",set:"general"},{type:"Timeline",label:"Story Timeline",set:"general"},{type:"Logos",label:"Logos",set:"general"},{type:"DocMasthead",label:"Page Header",set:"general"}]}];var b={Masthead:`Owner, 2026-10-10 (the page headers become ONE Layouts row): Issue Header and Document Header are one Page Header. Retired from the Add menu with no second preset (reviewer, 2026-11-06).
2
2
 
3
3
  WHAT REPLACES IT: Page Header, a Box of Text blocks: a Header Box (the eyebrow, the title, a Details Box of one Text per line) over a Deck Box. Every Issue Header field is plain words with no data source, so the merchant makes the issue shape from Text blocks in that Box: the issue lines are Details lines, the lead is the Deck, and the "In this issue" panel is a Box of Texts beside it. Its converter row (\`section-to-box-rows-pageheader\` \`masthead\`, OFF) stays for a stored page that moves later.
4
4
 
@@ -50,4 +50,16 @@ THE TYPE KEY STAYS AND SO DOES THE COMPONENT. Every page holding a Stats with Te
50
50
 
51
51
  WHAT REPLACES IT: Product Grid, bound to the current product. Both draw every card through the grid's ONE card template (efficient-storefront-blocks, lib/content/product-card-seed).
52
52
 
53
- THE TYPE KEY STAYS AND SO DOES THE COMPONENT. A stored Related Products node is read as that grid by the host (\`relatedToGrid\`) and draws the same cards; no document is rewritten. Its footnote is the one value the grid has no home for.`};var O=Array.from(new Set([...i.flatMap(e=>e.sections.map(t=>t.type)),...Object.keys(b)])),A=Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.label]))),g={Heading:"general",Text:"general",Eyebrow:"general",ImageBlock:"general",LogoBlock:"general",LocationMap:"general",Contents:"general",ButtonBlock:"general",CardList:"general",PostCard:"general",HeroSlide:"general",HeroGroup:"general",Integrations:"general",Grid:"general",KeyFeatures:"general",Spacer:"general",Series:"general",DocMetaCards:"general",StatsParagraph:"general",Testimonials:"general",Masthead:"general",CollectionCard:"commerce",GalleryItem:"commerce",ProductRef:"commerce",CompatibleTyres:"commerce",DeliveryOptions:"commerce",Header:"commerce",SearchBlock:"commerce",CartBlock:"commerce",CountrySwitchBlock:"commerce",AccountBlock:"commerce",ThemeSwitchBlock:"commerce",ProductGallery:"commerce",EuTyreLabelBlock:"commerce",SubmitBox:"service",BookingBox:"service",SubscribeBlogs:"service",RatingBlock:"service",Footer:"service",FooterLogo:"service",FooterMenu:"service",FooterDivider:"service",FooterGroup:"service",FooterText:"service",FooterEmailSignup:"service",FooterSocial:"service",FooterPayment:"service",MenuBlock:"service",MenuLinkBlock:"service",ArticleBody:"service",ProductPrice:"commerce",ProductSize:"commerce",ProductColour:"commerce",ProductPicture:"commerce",ProductEyebrow:"commerce",ProductName:"commerce",ProductSpecs:"commerce",ProductBuy:"commerce",FitmentPicker:"commerce",StockFitment:"commerce",RelatedProducts:"commerce",EmailFormBlock:"service",SocialLogosBlock:"service",PaymentLogosBlock:"service",LegalLineBlock:"service",SiteHeader:"service",SiteFooter:"service"},a={...g,...Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.set])))};function T(e){return Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0}function l(e){return Object.keys(a).filter(t=>a[t]===e).sort()}var E=l("general"),w=l("commerce"),S=l("service");var f="Box",C=`${f}es`;var h=e=>!!e&&typeof e=="object"&&!Array.isArray(e),p=e=>h(e)&&typeof e.type=="string"&&h(e.props);var s=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),d=e=>p(e)&&e.type!=="";function u(e,t,o){if(Array.isArray(e))for(let r of e)d(r)?c(r,t,o):s(r)&&typeof r.type=="string"&&r.type!==""&&t.add(r.type)}function n(e,t,o){if(Array.isArray(e)){if(o.has(e))return;o.add(e);for(let r of e)d(r)?c(r,t,o):n(r,t,o)}else if(s(e)&&!o.has(e)){o.add(e);for(let r of Object.values(e))n(r,t,o)}}function c(e,t,o){if(!o.has(e)){o.add(e),t.add(e.type);for(let r of Object.values(e.props))n(r,t,o)}}function m(e){let t=new Set,o=new Set;if(d(e))c(e,t,o);else if(s(e)){if(u(e.content,t,o),s(e.zones))for(let r of Object.values(e.zones))u(r,t,o);s(e.root)&&n(e.root,t,o)}return[...t].sort()}export{y as BLOCK_SETS,w as COMMERCE_BLOCKS,E as GENERAL_BLOCKS,S as SERVICE_BLOCKS,T as blockSetOf,m as blockTypesIn};
53
+ THE TYPE KEY STAYS AND SO DOES THE COMPONENT. A stored Related Products node is read as that grid by the host (\`relatedToGrid\`) and draws the same cards; no document is rewritten. Its footnote is the one value the grid has no home for.`,BundleOffer:`Plan section-parts bundles grid source (2026-11-07): a Product Grid that shows "Bundles with this product" IS the bundle section, so offering both asked a merchant to choose between two names for one section.
54
+
55
+ WHAT REPLACES IT: Product Grid, bound to the current product, Show set to its bundles. Both draw every kit through the grid's ONE card template (efficient-storefront-blocks, lib/content/product-card-seed).
56
+
57
+ THE TYPE KEY STAYS AND SO DOES THE DRAWING. A stored Bundle Products node is read as that grid by the host (\`bundleToGrid\`) and draws its kits; no document is rewritten.`,TyreFitment:`Owner, 2026-10-10 (approved): the Tyre Fitment Form goes into the Fitment Form, whose answer follows the page. One vehicle section, not two.
58
+
59
+ WHAT REPLACES IT: the Fitment Form, a Box of a head, the vehicle picker (\`FitmentPicker\`), its answer (\`StockFitment\`) and a Button. On a tyre product page the answer part draws one verdict per size against the picked car, the same \`TyreFitVerdicts\` drawing this section made; on every other page it draws the car's OEM fitment card (efficient-storefront-blocks 0.87.0). The old escape link is the Box's Button.
60
+
61
+ WHAT A MERCHANT LOSES: the tyre-only head copy ("Will it fit your car?"); a press seeds the Fitment Form's own head. The page decides the answer, so there is no mode row.
62
+
63
+ NO CONVERTER ROW: 0 TyreFitment nodes on the US sites, draft or published (read only, 2026-11-07). Old sites stay as they are (owner, 2026-11-06).
64
+
65
+ THE TYPE KEY STAYS AND SO DOES THE COMPONENT (efficient-storefront-blocks). A stored Tyre Fitment Form still renders through it and can still be edited, its head split, width, heading level, settings groups and cover included; no document is rewritten.`};var O=Array.from(new Set([...i.flatMap(e=>e.sections.map(t=>t.type)),...Object.keys(b)])),A=Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.label]))),g={Heading:"general",Text:"general",Eyebrow:"general",ImageBlock:"general",LogoBlock:"general",LocationMap:"general",Contents:"general",ButtonBlock:"general",CardList:"general",PostCard:"general",HeroSlide:"general",HeroGroup:"general",Integrations:"general",Grid:"general",KeyFeatures:"general",Spacer:"general",Series:"general",DocMetaCards:"general",StatsParagraph:"general",Testimonials:"general",Masthead:"general",CollectionCard:"commerce",GalleryItem:"commerce",ProductRef:"commerce",CompatibleTyres:"commerce",DeliveryOptions:"commerce",Header:"commerce",SearchBlock:"commerce",CartBlock:"commerce",CountrySwitchBlock:"commerce",AccountBlock:"commerce",ThemeSwitchBlock:"commerce",ProductGallery:"commerce",EuTyreLabelBlock:"commerce",SubmitBox:"service",BookingBox:"service",SubscribeBlogs:"service",RatingBlock:"service",Footer:"service",FooterLogo:"service",FooterMenu:"service",FooterDivider:"service",FooterGroup:"service",FooterText:"service",FooterEmailSignup:"service",FooterSocial:"service",FooterPayment:"service",MenuBlock:"service",MenuLinkBlock:"service",ProductPrice:"commerce",ProductSize:"commerce",ProductColour:"commerce",ProductPicture:"commerce",ProductEyebrow:"commerce",ProductName:"commerce",ProductSpecs:"commerce",ProductBuy:"commerce",FitmentPicker:"commerce",StockFitment:"commerce",RelatedProducts:"commerce",BundleOffer:"commerce",TyreFitment:"commerce",EmailFormBlock:"service",SocialLogosBlock:"service",PaymentLogosBlock:"service",LegalLineBlock:"service",SiteHeader:"service",SiteFooter:"service"},a={...g,...Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.set])))};function T(e){return Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0}function l(e){return Object.keys(a).filter(t=>a[t]===e).sort()}var E=l("general"),w=l("commerce"),S=l("service");var f="Box",C=`${f}es`;var h=e=>!!e&&typeof e=="object"&&!Array.isArray(e),p=e=>h(e)&&typeof e.type=="string"&&h(e.props);var s=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),d=e=>p(e)&&e.type!=="";function u(e,t,o){if(Array.isArray(e))for(let r of e)d(r)?c(r,t,o):s(r)&&typeof r.type=="string"&&r.type!==""&&t.add(r.type)}function n(e,t,o){if(Array.isArray(e)){if(o.has(e))return;o.add(e);for(let r of e)d(r)?c(r,t,o):n(r,t,o)}else if(s(e)&&!o.has(e)){o.add(e);for(let r of Object.values(e))n(r,t,o)}}function c(e,t,o){if(!o.has(e)){o.add(e),t.add(e.type);for(let r of Object.values(e.props))n(r,t,o)}}function m(e){let t=new Set,o=new Set;if(d(e))c(e,t,o);else if(s(e)){if(u(e.content,t,o),s(e.zones))for(let r of Object.values(e.zones))u(r,t,o);s(e.root)&&n(e.root,t,o)}return[...t].sort()}export{y as BLOCK_SETS,w as COMMERCE_BLOCKS,E as GENERAL_BLOCKS,S as SERVICE_BLOCKS,T as blockSetOf,m as blockTypesIn};
@@ -2,15 +2,22 @@ import type { CategorySourceValue } from "../../render/lib/content/source-values
2
2
  import { type AdminStorefrontCategory } from "../../render/lib/api/index.js";
3
3
  export declare const PRODUCT_CONTENT_MANUAL = "Manual";
4
4
  export declare const PRODUCT_CONTENT_CATEGORY = "Category";
5
+ export declare const PRODUCT_CONTENT_PRODUCT_PAGE = "Product page";
5
6
  export type ProductContentOption = {
6
7
  label: string;
7
8
  value: string;
8
9
  group?: string;
9
10
  };
10
- export declare function productContentOptions(categories: readonly AdminStorefrontCategory[], value: CategorySourceValue | null | undefined): {
11
+ export interface ProductContentPage {
12
+ onProductPage: boolean;
13
+ dynamic?: unknown;
14
+ relationship?: unknown;
15
+ }
16
+ export declare function productContentOptions(categories: readonly AdminStorefrontCategory[], value: CategorySourceValue | null | undefined, page?: ProductContentPage): {
11
17
  options: ProductContentOption[];
12
18
  selected: string;
13
19
  };
20
+ export declare function productContentProps(props: Record<string, unknown>, pick: string, categories: readonly AdminStorefrontCategory[]): Record<string, unknown>;
14
21
  interface Props {
15
22
  value?: CategorySourceValue | null;
16
23
  onChange: (value: CategorySourceValue | null) => void;
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as I}from"react/jsx-runtime";import{SettingsField as j}from"efficient-easel/panel";import{FieldSelect as D}from"efficient-easel/fields";import{CategoryIcon as F}from"efficient-easel/icons";import{say as o,sayCount as K}from"efficient-web-builder/format/lib/editor-words";import{useEffect as T,useRef as M,useState as f}from"react";import{loadProductCatalog as R}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as _}from"./useStorefrontCategories.js";import{ALL_PRODUCTS_NAME as w,ALL_PRODUCTS_SLUG as m,gridKindsOf as G,gridRowsOf as Y,productContentOf as g}from"../../render/lib/wheels/grid-source.js";import{plpKindNoun as $}from"../../render/lib/catalog/plp-item.js";import{Tooltip as q}from"efficient-shell/ui";import{useEasel as z}from"efficient-easel/easel";import B from"efficient-web-builder/editor/components/SourceStatus";const H="Manual",J="Category";function i(t){return t.slug&&t.slug.trim()?t.slug:`cat-${t.id}`}function Q(t,r){if(g(t)==="category")return r.find(n=>i(n)===t.slug)??r.find(n=>n.name===t.name)}function V(t,r){if(t===m)return{slug:t,name:w};const n=r.find(s=>i(s)===t);return n?{slug:t,name:n.name}:null}function N(t,r){if(g(t)!=="category")return t;const n=r.find(s=>i(s)===t.slug);return n&&n.name!==t.name?{...t,name:n.name}:t}function W(t,r){const n=g(r),s=Q(r,t),u=n==="category"&&!s;return{selected:n==="manual"?"":n==="all"?m:s?i(s):r.slug,options:[{label:H,value:""},{label:w,value:m},...u?[{label:o("{name} (unavailable)",{name:r.name}),value:r.slug}]:[],...t.map(l=>({label:l.name,value:i(l),group:J}))]}}function X({value:t,onChange:r}){const[n,s]=f(null),[u,p]=f(null),[l,h]=f(!1),[y,C]=f(!1),c=M(!0);T(()=>(c.current=!0,R().then(e=>{c.current&&p(e)}),_().then(e=>{c.current&&s(e)}),()=>{c.current=!1}),[]),T(()=>{if(!t?.slug||n===null)return;const e=N(t,n);e!==t&&r(e)},[n]);const P=e=>{r(e?V(e,n??[]):null)},A=()=>{t?.slug&&(h(!0),C(!1),Promise.all([_(!0),R(!0)]).then(([e,U])=>{if(!c.current)return;s(e),p(U);const O=N(t,e);O!==t&&r(O)}).catch(()=>{c.current&&C(!0)}).finally(()=>{c.current&&h(!1)}))},S=z(e=>e.selectedItem)?.props?.kinds,E=t?.slug&&u?Y(t,S,u).length:0,b=$(G(t,S)),x=W(n??[],t),d=o("Storefront → Categories"),L=y?"error":l?"loading":"idle",k=y?o("Couldn’t reach {place}.",{place:d}):l?o("Syncing from {place}…",{place:d}):K("{n} {one}","{n} {many}",E,{one:o(b.one),many:o(b.many)});return I("div",{children:[a(j,{label:o("Product content"),icon:a(F,{}),children:a(q,{className:"relative block w-full",content:t?.slug?null:o("Pick the products yourself below, or choose “All products” or a category from {place}.",{place:d}),children:a(D,{value:x.selected,ariaLabel:o("Product content"),onChange:P,options:x.options.map(e=>({...e,label:e.value===""||e.value===m?o(e.label):e.label,...e.group?{group:o(e.group)}:{}}))})})}),t?.slug?a(B,{compact:!0,status:L,statusText:k,onRefresh:A,busy:l,hint:o("Shows this source’s products as they are now, here and on the live page. Set how many appear with “Items to display”.")}):null]})}export{J as PRODUCT_CONTENT_CATEGORY,H as PRODUCT_CONTENT_MANUAL,X as default,W as productContentOptions};
1
+ "use client";import{jsx as m,jsxs as Z}from"react/jsx-runtime";import{SettingsField as B}from"efficient-easel/panel";import{FieldSelect as V}from"efficient-easel/fields";import{CategoryIcon as W}from"efficient-easel/icons";import{say as a,sayCount as Y}from"efficient-web-builder/format/lib/editor-words";import{useEffect as N,useRef as q,useState as y}from"react";import{loadProductCatalog as A}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as L}from"./useStorefrontCategories.js";import{ALL_PRODUCTS_NAME as w,ALL_PRODUCTS_SLUG as h,gridKindsOf as J,gridRowsOf as Q,productContentOf as C}from"../../render/lib/wheels/grid-source.js";import{plpKindNoun as X}from"../../render/lib/catalog/plp-item.js";import{Tooltip as v}from"efficient-shell/ui";import{useEasel as D}from"efficient-easel/easel";import tt from"efficient-web-builder/editor/components/SourceStatus";import{templateOnInsert as et}from"efficient-web-builder/format/lib/content/card-template";import{isEditorOnDynamicPage as nt}from"efficient-web-builder/format/lib/document/editor-page-context";import{DEFAULT_RELATIONSHIP as ot,RELATIONSHIPS as rt,relationshipByKey as st}from"../../render/lib/catalog/relationships.js";import{drawsKits as T}from"../../render/lib/document/card-templates.js";const at="Manual",ct="Category",I="Product page",S="related:",U=t=>`${S}${t}`,it=t=>t.startsWith(S)?t.slice(S.length):null;function f(t){return t.slug&&t.slug.trim()?t.slug:`cat-${t.id}`}function lt(t,o){if(C(t)==="category")return o.find(n=>f(n)===t.slug)??o.find(n=>n.name===t.name)}function k(t,o){if(t===h)return{slug:t,name:w};const n=o.find(s=>f(s)===t);return n?{slug:t,name:n.name}:null}function K(t,o){if(C(t)!=="category")return t;const n=o.find(s=>f(s)===t.slug);return n&&n.name!==t.name?{...t,name:n.name}:t}const ut="root:default-zone";function pt(t){const o=typeof t.relationship=="string"?t.relationship:ot;return st(o)?.key??o}function dt(t,o,n={onProductPage:!1}){const s=C(o),r=lt(o,t),c=s==="category"&&!r;return{selected:n.onProductPage&&n.dynamic===!0?U(pt(n)):s==="manual"?"":s==="all"?h:r?f(r):o.slug,options:[{label:at,value:""},{label:w,value:h},...c?[{label:a("{name} (unavailable)",{name:o.name}),value:o.slug}]:[],...t.map(i=>({label:i.name,value:f(i),group:ct})),...n.onProductPage?rt.map(i=>({label:i.label,value:U(i.key),group:I})):[]]}}function mt(t,o,n){const s=it(o),r=s?{...t,dynamic:!0,relationship:s}:{...t,dynamic:!1,source:o?k(o,n):null};if(T(r)===T(t))return r;const c=et("ProductGrid",{...r,template:[]}),u=T(r)?{gap:r.gap??c.gap,gapPhone:r.gapPhone??c.gapPhone}:{};return{...r,...u,template:c.template}}function ft({value:t,onChange:o}){const[n,s]=y(null),[r,c]=y(null),[u,P]=y(!1),[i,b]=y(!1),l=q(!0);N(()=>(l.current=!0,A().then(e=>{l.current&&c(e)}),L().then(e=>{l.current&&s(e)}),()=>{l.current=!1}),[]),N(()=>{if(!t?.slug||n===null)return;const e=K(t,n);e!==t&&o(e)},[n]);const{appState:j,dispatch:F}=D(e=>e),p=D(e=>e.selectedItem),g={onProductPage:nt(),dynamic:p?.props?.dynamic,relationship:p?.props?.relationship},G=e=>{const d=j.ui.itemSelector;if(!g.onProductPage||!p?.props||!d){o(e?k(e,n??[]):null);return}F({type:"replace",destinationZone:d.zone??ut,destinationIndex:d.index,data:{...p,props:mt(p.props,e,n??[])}})},M=()=>{t?.slug&&(P(!0),b(!1),Promise.all([L(!0),A(!0)]).then(([e,d])=>{if(!l.current)return;s(e),c(d);const _=K(t,e);_!==t&&o(_)}).catch(()=>{l.current&&b(!0)}).finally(()=>{l.current&&P(!1)}))},x=p?.props?.kinds,$=t?.slug&&r?Q(t,x,r).length:0,R=X(J(t,x)),E=dt(n??[],t,g),O=a("Storefront → Categories"),z=i?"error":u?"loading":"idle",H=i?a("Couldn’t reach {place}.",{place:O}):u?a("Syncing from {place}…",{place:O}):Y("{n} {one}","{n} {many}",$,{one:a(R.one),many:a(R.many)});return Z("div",{children:[m(B,{label:a("Product content"),icon:m(W,{}),children:m(v,{className:"relative block w-full",content:t?.slug?null:a("Pick the products yourself below, or choose “All products” or a category from {place}.",{place:O}),children:m(V,{value:E.selected,ariaLabel:a("Product content"),onChange:G,options:E.options.map(e=>({...e,label:e.value===""||e.value===h||e.group===I?a(e.label):e.label,...e.group?{group:a(e.group)}:{}}))})})}),t?.slug&&!(g.onProductPage&&g.dynamic===!0)?m(tt,{compact:!0,status:z,statusText:H,onRefresh:M,busy:u,hint:a("Shows this source’s products as they are now, here and on the live page. Set how many appear with “Items to display”.")}):null]})}export{ct as PRODUCT_CONTENT_CATEGORY,at as PRODUCT_CONTENT_MANUAL,I as PRODUCT_CONTENT_PRODUCT_PAGE,ft as default,dt as productContentOptions,mt as productContentProps};
@@ -1 +1 @@
1
- "use client";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{Button as j}from"efficient-shell/ui";import{SettingsField as z}from"efficient-easel/panel";import{FieldSelect as E}from"efficient-easel/fields";import{CategoryIcon as I}from"efficient-easel/icons";import{useEffect as b,useRef as d,useState as T}from"react";import{loadStorefrontCategories as F}from"./useStorefrontCategories.js";import{snapshotChanged as W}from"efficient-web-builder/editor/components/useSnapshotSource";import{onCollectionCategoriesChanged as D}from"efficient-web-builder/format/lib/editor-events";import{useEaselHost as H}from"efficient-easel/screen/lib/host";import{say as t}from"efficient-web-builder/format/lib/editor-words";import{sizedImage as L}from"efficient-web-builder/format/lib/sized-image";import{resolveCategoryImage as P}from"../../render/components/CollectionCard.js";function C(e){return{id:e.id,name:e.name,slug:e.slug,description:e.description??"",image:e.image??""}}function _({value:e,onChange:s}){const N=H(),[a,v]=T(null),l=d(!0),m=d(e);m.current=e;const f=d(s);f.current=s;const p=(o=!1)=>F(o).then(r=>(l.current&&v(r),r)),h=o=>{const r=m.current;if(!r?.id)return;const c=o.find(R=>R.id===r.id);if(!c)return;const y=C(c);W(y,r)&&f.current(y)};b(()=>(l.current=!0,p().then(h),()=>{l.current=!1}),[]),b(()=>D(()=>{p(!0).then(h)}),[]);const x=o=>{if(!o){s(null);return}const r=(a??[]).find(c=>c.id===o);r&&s(C(r))},S=()=>{e?.id&&N.send("storefront-editor:open-category",{categoryId:e.id,name:e.name})},g=a===null,k=!!e?.id&&!(a??[]).some(o=>o.id===e.id),u=P(e?.image);return n("div",{children:[i(z,{label:t("Collection"),icon:i(I,{}),children:i(E,{value:e?.id??"",ariaLabel:t("Collection"),onChange:x,readOnly:g,options:[{label:g?t("Loading…"):t("None"),value:""},...k?[{label:t("{name} (unavailable)",{name:e.name}),value:e.id}]:[],...(a??[]).map(o=>({label:o.name,value:o.id}))]})}),e?.id?n("div",{className:"sf-blogsource",style:{marginTop:9},children:[n("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Name")}),i("div",{style:{fontWeight:600},children:e.name})]}),n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Description")}),i("div",{style:{fontSize:13,opacity:e.description?.85:.5},children:e.description||t("No description yet")})]}),n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Image")}),u?i("img",{...L(u,{fallbackWidth:640,maxWidth:960}),sizes:"320px",alt:"",style:{width:"100%",height:96,objectFit:"cover",borderRadius:"var(--radius-card)"}}):i("div",{style:{fontSize:13,opacity:.5},children:t("No image yet")})]})]}),i(j,{variant:"secondary",size:"md",className:"sf-blogsource-action",style:{marginTop:10},onClick:S,children:t("Edit category ✎")}),i("p",{className:"es-field-hint sf-hint-keep",children:t("Name, description and image come from {place}. Edit them there — this card updates to match.",{place:t("Storefront → Categories")})})]}):i("p",{className:"es-field-hint sf-hint-keep",style:{marginTop:7},children:t("Pick a category from {place} to fill this card’s name, description and image. That content is edited in the category.",{place:t("Storefront → Categories")})})]})}export{_ as default};
1
+ "use client";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{Button as k}from"efficient-shell/ui";import{SettingsField as z}from"efficient-easel/panel";import{FieldSelect as E}from"efficient-easel/fields";import{CategoryIcon as I}from"efficient-easel/icons";import{useEffect as b,useRef as l,useState as F}from"react";import{loadStorefrontCategories as T}from"./useStorefrontCategories.js";import{snapshotChanged as W}from"efficient-web-builder/editor/components/useSnapshotSource";import{onCollectionCategoriesChanged as D}from"efficient-web-builder/format/lib/editor-events";import{useEaselHost as H}from"efficient-easel/screen/lib/host";import{say as t}from"efficient-web-builder/format/lib/editor-words";import{sizedImage as L}from"efficient-web-builder/format/lib/sized-image";import{resolveCategoryImage as P}from"../../render/components/CollectionCard.js";function C(e){return{id:e.id,name:e.name,slug:e.slug,description:e.description??"",image:e.image??""}}function _({value:e,onChange:s}){const N=H(),[a,v]=F(null),d=l(!0),m=l(e);m.current=e;const f=l(s);f.current=s;const p=(o=!1)=>T(o).then(r=>(d.current&&v(r),r)),h=o=>{const r=m.current;if(!r?.id)return;const c=o.find(j=>j.id===r.id);if(!c)return;const y=C(c);W(y,r)&&f.current(y)};b(()=>(d.current=!0,p().then(h),()=>{d.current=!1}),[]),b(()=>D(()=>{p(!0).then(h)}),[]);const x=o=>{if(!o){s(null);return}const r=(a??[]).find(c=>c.id===o);r&&s(C(r))},S=()=>{e?.id&&N.send("storefront-editor:open-category",{categoryId:e.id,name:e.name})},g=a===null,R=!!e?.id&&!(a??[]).some(o=>o.id===e.id),u=P(e?.image);return n("div",{children:[i(z,{label:t("Collection"),icon:i(I,{}),children:i(E,{value:e?.id??"",ariaLabel:t("Collection"),onChange:x,readOnly:g,options:[{label:g?t("Loading…"):t("None"),value:""},...R?[{label:t("{name} (unavailable)",{name:e.name}),value:e.id}]:[],...(a??[]).map(o=>({label:o.name,value:o.id}))]})}),e?.id?n("div",{className:"sf-blogsource",style:{marginTop:9},children:[n("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Name")}),i("div",{style:{fontWeight:600},children:e.name})]}),n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Description")}),i("div",{style:{fontSize:13,opacity:e.description?.85:.5},children:e.description||t("No description yet")})]}),n("div",{children:[i("div",{className:"sf-field-label",style:{opacity:.6},children:t("Image")}),u?i("img",{...L(u,{fallbackWidth:640,maxWidth:960}),sizes:"320px",alt:"",style:{width:"100%",height:96,objectFit:"cover",borderRadius:"var(--radius-card)"}}):i("div",{style:{fontSize:13,opacity:.5},children:t("No image yet")})]})]}),i(k,{variant:"secondary",size:"md",className:"sf-blogsource-action",style:{marginTop:10},onClick:S,children:t("Edit category ✎")}),i("p",{className:"es-field-hint",children:t("Name, description and image come from {place}. Edit them there — this card updates to match.",{place:t("Storefront → Categories")})})]}):i("p",{className:"es-field-hint",children:t("Pick a category from {place} to fill this card’s name, description and image. That content is edited in the category.",{place:t("Storefront → Categories")})})]})}export{_ as default};
@@ -1 +1 @@
1
- "use client";import{jsx as s,jsxs as l}from"react/jsx-runtime";import{Button as a}from"efficient-shell/ui";import{useEasel as u}from"efficient-easel/easel";import{useEaselHost as m}from"efficient-easel/screen/lib/host";import{say as t}from"efficient-web-builder/format/lib/editor-words";import{useProductCatalog as p}from"../../render/components/useProductCatalog.js";import{useGridSourceLock as f}from"./useGridSourceLock.js";function h(){const r=m(),n=p(),{selectedItem:c}=u(o=>o),d=c?.props?.code??"",e=(n??[]).find(o=>o.slug===d)??null,i=f()!==null;return!e||i?null:l("div",{className:"sf-blogsource",children:[s(a,{variant:"secondary",size:"md",className:"sf-blogsource-action",onClick:()=>r.send("storefront-editor:open-product",{slug:e.slug,name:e.name}),children:t("Edit product ✎")}),s("p",{className:"es-field-hint sf-hint-keep",children:t("Price and details come from the product record — edit them in the Products database and this block updates to match. The name follows the product’s design name unless it’s overridden per storefront in {place}.",{place:t("Storefront → Catalog")})})]})}export{h as default};
1
+ "use client";import{jsx as s,jsxs as l}from"react/jsx-runtime";import{Button as a}from"efficient-shell/ui";import{useEasel as u}from"efficient-easel/easel";import{useEaselHost as m}from"efficient-easel/screen/lib/host";import{say as t}from"efficient-web-builder/format/lib/editor-words";import{useProductCatalog as p}from"../../render/components/useProductCatalog.js";import{useGridSourceLock as f}from"./useGridSourceLock.js";function h(){const r=m(),c=p(),{selectedItem:n}=u(o=>o),d=n?.props?.code??"",e=(c??[]).find(o=>o.slug===d)??null,i=f()!==null;return!e||i?null:l("div",{className:"sf-blogsource",children:[s(a,{variant:"secondary",size:"md",className:"sf-blogsource-action",onClick:()=>r.send("storefront-editor:open-product",{slug:e.slug,name:e.name}),children:t("Edit product ✎")}),s("p",{className:"es-field-hint",children:t("Price and details come from the product record — edit them in the Products database and this block updates to match. The name follows the product’s design name unless it’s overridden per storefront in {place}.",{place:t("Storefront → Catalog")})})]})}export{h as default};
@@ -1 +1 @@
1
- "use client";import{jsx as s,jsxs as m}from"react/jsx-runtime";import{useEasel as p}from"efficient-easel/easel";import{SettingsField as f}from"efficient-easel/panel";import{FieldSelect as u}from"efficient-easel/fields";import{FinishIcon as g}from"efficient-easel/icons";import{isRenderableFinish as b}from"../../render/lib/wheels/renderable-finishes.js";import{useProductCatalog as F}from"../../render/components/useProductCatalog.js";import{say as n}from"efficient-web-builder/format/lib/editor-words";function v({value:t,onChange:l}){const a=F(),{selectedItem:c}=p(e=>e),r=c?.props?.code??"",o=a===null,i=(a??[]).find(e=>e.slug===r)?.finishes??[],h=i.filter(b).map(e=>e.name),d=h.includes(t??"")?t:"";return m("div",{children:[s(f,{label:n("Finish"),icon:s(g,{}),hint:n("Pinning one overrides the section’s Cover image."),children:s(u,{value:d,ariaLabel:n("Finish"),onChange:l,readOnly:o||i.length===0,options:[{label:o?n("Loading…"):i.length===0?n("No finishes on this product"):n("Default (the product's default finish)"),value:""},...i.map(e=>({label:e.src?e.name:n("{name} — no image",{name:e.name}),value:e.name,disabled:!e.src}))]})}),!o&&i.length===0&&r&&s("p",{className:"es-field-hint sf-hint-keep",children:n("This product has no finishes yet, so its card falls back to the product image — or an empty placeholder when it has none. Add finishes to the product record, then give each one an image.")}),!o&&i.length>0&&h.length===0&&s("p",{className:"es-field-hint sf-hint-keep",children:n("None of this product’s finishes has an image, so none can be shown on the card. Add an image to a finish on the product record to pick it here.")})]})}export{v as default};
1
+ "use client";import{jsx as o,jsxs as p}from"react/jsx-runtime";import{useEasel as u}from"efficient-easel/easel";import{SettingsField as f,InertHint as l}from"efficient-easel/panel";import{FieldSelect as g}from"efficient-easel/fields";import{FinishIcon as b}from"efficient-easel/icons";import{isRenderableFinish as F}from"../../render/lib/wheels/renderable-finishes.js";import{useProductCatalog as v}from"../../render/components/useProductCatalog.js";import{say as n}from"efficient-web-builder/format/lib/editor-words";function x({value:t,onChange:c}){const r=v(),{selectedItem:d}=u(e=>e),a=d?.props?.code??"",s=r===null,i=(r??[]).find(e=>e.slug===a)?.finishes??[],h=i.filter(F).map(e=>e.name),m=h.includes(t??"")?t:"";return p("div",{children:[o(f,{label:n("Finish"),icon:o(b,{}),hint:n("Pinning one overrides the section’s Cover image."),children:o(g,{value:m,ariaLabel:n("Finish"),onChange:c,readOnly:s||i.length===0,options:[{label:s?n("Loading…"):i.length===0?n("No finishes on this product"):n("Default (the product's default finish)"),value:""},...i.map(e=>({label:e.src?e.name:n("{name} — no image",{name:e.name}),value:e.name,disabled:!e.src}))]})}),!s&&i.length===0&&a&&o(l,{children:n("This product has no finishes yet, so its card falls back to the product image — or an empty placeholder when it has none. Add finishes to the product record, then give each one an image.")}),!s&&i.length>0&&h.length===0&&o(l,{children:n("None of this product’s finishes has an image, so none can be shown on the card. Add an image to a finish on the product record to pick it here.")})]})}export{x as default};
@@ -1 +1 @@
1
- "use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{useContext as D,useEffect as R,useRef as N,useState as w}from"react";import{Button as v}from"efficient-shell/ui";import q from"efficient-web-builder/editor/components/SearchSelectField";import{ScreenDocumentContext as A}from"efficient-easel/screen/components/ScreenDocumentContext";import{loadStorefrontForms as H}from"./useStorefrontForms.js";import{onStorefrontFormsChanged as I}from"efficient-web-builder/format/lib/editor-events";import{openFormBuilder as J,requestFormEdit as G}from"efficient-web-builder/format/lib/editor-form-window";import{useEaselHost as O}from"efficient-easel/screen/lib/host";import{say as s,sayCount as W}from"efficient-web-builder/format/lib/editor-words";const P="__create-a-new-form__";function K({value:e,forms:o,loadFailed:i,emptyLabel:m}){const d=o??[],b=e?d.some(r=>r.slug===e):!0,f=o===null&&!i,g={value:"",label:f?s("Loading…"):i?s("Forms couldn’t be loaded"):m===void 0?s("No form yet"):s(m)},_=e&&!b?[{value:e,label:f||i?e:s("{slug} — no form with this name",{slug:e})}]:[],u=d.map(r=>({value:r.slug,label:r.is_active?r.title:s("{title} (switched off)",{title:r.title})})),k=f?[]:[{value:P,label:s("Create a new form")}];return[g,..._,...u,...k]}function M(e){return e===P?{action:"create"}:{action:"store",slug:e}}function Q({value:e,pickedId:o,forms:i}){if(!e||!o||i.some(d=>d.slug===e))return null;const m=i.find(d=>d.id===o);return m&&m.slug&&m.slug!==e?m.slug:null}function U(e){const o=[s("Goes to {place}",{place:s("Storefront → Forms")})],i=(e.notify_email??"").trim();return i&&o.push(s("Emails a copy to {email}",{email:i})),e.mailing_list_name&&o.push(e.subscribe_mode==="checkbox"?s("Joins the “{audience}” audience, but only when the consent box is ticked",{audience:e.mailing_list_name}):s("Joins the “{audience}” audience",{audience:e.mailing_list_name})),e.kind==="account_signup"&&o.push(e.signup_customer_type==="importer"?s("Creates a wholesale account"):s("Creates a retail account")),o}function V({value:e,onChange:o,label:i="Form",emptyLabel:m}){const d=O(),b=D(A),f=b?b.capabilities.hasForms:!0,[g,_]=w(null),[u,k]=w(!1),[r,E]=w(!1),[j,F]=w(!1),h=N(!0),x=N(e);x.current=e;const C=N(o);C.current=o;const S=N(null),y=(n=!1)=>H(n).then(c=>{if(h.current){_(c),k(!1);const p=Q({value:x.current,pickedId:S.current,forms:c});p&&C.current(p)}return c},()=>(h.current&&k(!0),[]));R(()=>(h.current=!0,f&&y(),()=>{h.current=!1}),[f]),R(()=>f?I(()=>{y(!0)}):void 0,[f]);const a=e?(g??[]).find(n=>n.slug===e)??null:null;a?S.current=a.id:e||(S.current=null);const z=!!e&&!a&&g!==null&&!u,L=K({value:e,forms:g,loadFailed:u,emptyLabel:m}),T=async()=>{E(!0),F(!1);try{const n=await G(d,{mode:"create"}),c=await y(!0);if(!h.current)return;if(n.status==="timeout"){F(!0);return}if(n.status!=="saved")return;const{form:p}=n;p.slug!==x.current&&C.current(p.slug),c.some(B=>B.id===p.id)||y(!0)}finally{h.current&&E(!1)}},$=n=>{const c=M(n);c.action==="create"?T():(F(!1),o(c.slug))};return f?l("div",{className:"sf-formpicker",children:[t(q,{label:i,options:L,fallback:"",value:e??"",onChange:$,placeholder:s("Search forms…")}),j&&t("p",{className:"sf-formsummary-warn",children:s("That didn’t come back — pick the form from the list, or try again.")}),a?l("div",{className:"sf-blogsource sf-formsummary",children:[l("div",{children:[t("div",{className:"sf-formsummary-caption",children:W("{n} field","{n} fields",a.fields.length)}),a.fields.length?t("ol",{className:"sf-formsummary-fields",children:a.fields.map((n,c)=>t("li",{children:n.label},n.key||`${n.label}-${c}`))}):t("p",{className:"es-field-hint sf-hint-keep",children:s("This form has no fields yet, so there is nothing for a visitor to fill in.")})]}),l("div",{children:[t("div",{className:"sf-formsummary-caption",children:s("Where the answers go")}),t("ul",{className:"sf-formsummary-fields",children:U(a).map(n=>t("li",{children:n},n))})]}),!a.is_active&&t("p",{className:"sf-formsummary-warn",children:s("This form is switched off, so it won’t appear on the published page. Turn it back on in {place}.",{place:s("Storefront → Forms")})}),l("div",{className:"sf-formsummary-actions",children:[t(v,{variant:"secondary",size:"md",onClick:()=>J(d,a.id),children:s("Edit form ✎")}),t(v,{variant:"secondary",size:"md",disabled:r,onClick:()=>{T()},children:s("New form +")})]}),t("p",{className:"es-field-hint sf-hint-keep",children:s("The questions, the button text and the thank-you message all come from {place}. Edit them there — this section updates to match.",{place:s("Storefront → Forms")})})]}):l("div",{className:"sf-blogsource sf-formsummary",children:[u?l("p",{className:"es-field-hint sf-hint-keep",children:[s("This website’s forms couldn’t be loaded, so there is nothing to choose from yet."),e?` ${s("This section still points at “{slug}”, and that is unchanged.",{slug:e})}`:""]}):z&&t("p",{className:"sf-formsummary-warn",children:s("This section points at “{slug}”, and this website has no form with that name. Pick one from the list above, or leave it — nothing has been changed.",{slug:e??""})}),l("div",{className:"sf-formsummary-actions",children:[u&&t(v,{variant:"secondary",size:"md",disabled:r,onClick:()=>{y(!0)},children:s("Try again")}),t(v,{variant:"secondary",size:"md",disabled:r,onClick:()=>{T()},children:s("New form +")})]}),!u&&t("p",{className:"es-field-hint sf-hint-keep",children:s("Pick a form to show here, or build a new one. Forms are made once in {place} and can be shown on any number of pages.",{place:s("Storefront → Forms")})})]})]}):t("div",{className:"sf-formpicker",children:t("div",{className:"sf-blogsource sf-formsummary",children:l("div",{children:[t("div",{className:"sf-formsummary-caption",children:s(i)}),l("p",{className:"es-field-hint sf-hint-keep",children:[s("Forms aren’t available in this editor, so there is nothing to choose here."),e?` ${s("This section still points at “{slug}”, and that is unchanged.",{slug:e})}`:""]})]})})})}export{P as CREATE_SENTINEL,V as default,Q as followRenamedForm,U as formDestinationLines,K as formPickerOptions,M as resolveFormPick};
1
+ "use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{useContext as H,useEffect as P,useRef as w,useState as v}from"react";import{Button as N}from"efficient-shell/ui";import I from"efficient-web-builder/editor/components/SearchSelectField";import{ScreenDocumentContext as q}from"efficient-easel/screen/components/ScreenDocumentContext";import{loadStorefrontForms as A}from"./useStorefrontForms.js";import{onStorefrontFormsChanged as J}from"efficient-web-builder/format/lib/editor-events";import{openFormBuilder as G,requestFormEdit as O}from"efficient-web-builder/format/lib/editor-form-window";import{useEaselHost as W}from"efficient-easel/screen/lib/host";import{say as s,sayCount as K}from"efficient-web-builder/format/lib/editor-words";import{InertHint as E}from"efficient-easel/panel";const j="__create-a-new-form__";function M({value:e,forms:n,loadFailed:r,emptyLabel:m}){const d=n??[],b=e?d.some(i=>i.slug===e):!0,u=n===null&&!r,g={value:"",label:u?s("Loading…"):r?s("Forms couldn’t be loaded"):m===void 0?s("No form yet"):s(m)},_=e&&!b?[{value:e,label:u||r?e:s("{slug} — no form with this name",{slug:e})}]:[],f=d.map(i=>({value:i.slug,label:i.is_active?i.title:s("{title} (switched off)",{title:i.title})})),k=u?[]:[{value:j,label:s("Create a new form")}];return[g,..._,...f,...k]}function Q(e){return e===j?{action:"create"}:{action:"store",slug:e}}function U({value:e,pickedId:n,forms:r}){if(!e||!n||r.some(d=>d.slug===e))return null;const m=r.find(d=>d.id===n);return m&&m.slug&&m.slug!==e?m.slug:null}function V(e){const n=[s("Goes to {place}",{place:s("Storefront → Forms")})],r=(e.notify_email??"").trim();return r&&n.push(s("Emails a copy to {email}",{email:r})),e.mailing_list_name&&n.push(e.subscribe_mode==="checkbox"?s("Joins the “{audience}” audience, but only when the consent box is ticked",{audience:e.mailing_list_name}):s("Joins the “{audience}” audience",{audience:e.mailing_list_name})),e.kind==="account_signup"&&n.push(e.signup_customer_type==="importer"?s("Creates a wholesale account"):s("Creates a retail account")),n}function X({value:e,onChange:n,label:r="Form",emptyLabel:m}){const d=W(),b=H(q),u=b?b.capabilities.hasForms:!0,[g,_]=v(null),[f,k]=v(!1),[i,R]=v(!1),[z,F]=v(!1),h=w(!0),x=w(e);x.current=e;const C=w(n);C.current=n;const S=w(null),y=(o=!1)=>A(o).then(c=>{if(h.current){_(c),k(!1);const p=U({value:x.current,pickedId:S.current,forms:c});p&&C.current(p)}return c},()=>(h.current&&k(!0),[]));P(()=>(h.current=!0,u&&y(),()=>{h.current=!1}),[u]),P(()=>u?J(()=>{y(!0)}):void 0,[u]);const a=e?(g??[]).find(o=>o.slug===e)??null:null;a?S.current=a.id:e||(S.current=null);const L=!!e&&!a&&g!==null&&!f,$=M({value:e,forms:g,loadFailed:f,emptyLabel:m}),T=async()=>{R(!0),F(!1);try{const o=await O(d,{mode:"create"}),c=await y(!0);if(!h.current)return;if(o.status==="timeout"){F(!0);return}if(o.status!=="saved")return;const{form:p}=o;p.slug!==x.current&&C.current(p.slug),c.some(D=>D.id===p.id)||y(!0)}finally{h.current&&R(!1)}},B=o=>{const c=Q(o);c.action==="create"?T():(F(!1),n(c.slug))};return u?l("div",{className:"sf-formpicker",children:[t(I,{label:r,options:$,fallback:"",value:e??"",onChange:B,placeholder:s("Search forms…")}),z&&t("p",{className:"sf-formsummary-warn",children:s("That didn’t come back — pick the form from the list, or try again.")}),a?l("div",{className:"sf-blogsource sf-formsummary",children:[l("div",{children:[t("div",{className:"sf-formsummary-caption",children:K("{n} field","{n} fields",a.fields.length)}),a.fields.length?t("ol",{className:"sf-formsummary-fields",children:a.fields.map((o,c)=>t("li",{children:o.label},o.key||`${o.label}-${c}`))}):t(E,{children:s("This form has no fields yet, so there is nothing for a visitor to fill in.")})]}),l("div",{children:[t("div",{className:"sf-formsummary-caption",children:s("Where the answers go")}),t("ul",{className:"sf-formsummary-fields",children:V(a).map(o=>t("li",{children:o},o))})]}),!a.is_active&&t("p",{className:"sf-formsummary-warn",children:s("This form is switched off, so it won’t appear on the published page. Turn it back on in {place}.",{place:s("Storefront → Forms")})}),l("div",{className:"sf-formsummary-actions",children:[t(N,{variant:"secondary",size:"md",onClick:()=>G(d,a.id),children:s("Edit form ✎")}),t(N,{variant:"secondary",size:"md",disabled:i,onClick:()=>{T()},children:s("New form +")})]}),t("p",{className:"es-field-hint",children:s("The questions, the button text and the thank-you message all come from {place}. Edit them there — this section updates to match.",{place:s("Storefront → Forms")})})]}):l("div",{className:"sf-blogsource sf-formsummary",children:[f?l(E,{children:[s("This website’s forms couldn’t be loaded, so there is nothing to choose from yet."),e?` ${s("This section still points at “{slug}”, and that is unchanged.",{slug:e})}`:""]}):L&&t("p",{className:"sf-formsummary-warn",children:s("This section points at “{slug}”, and this website has no form with that name. Pick one from the list above, or leave it — nothing has been changed.",{slug:e??""})}),l("div",{className:"sf-formsummary-actions",children:[f&&t(N,{variant:"secondary",size:"md",disabled:i,onClick:()=>{y(!0)},children:s("Try again")}),t(N,{variant:"secondary",size:"md",disabled:i,onClick:()=>{T()},children:s("New form +")})]}),!f&&t("p",{className:"es-field-hint",children:s("Pick a form to show here, or build a new one. Forms are made once in {place} and can be shown on any number of pages.",{place:s("Storefront → Forms")})})]})]}):t("div",{className:"sf-formpicker",children:t("div",{className:"sf-blogsource sf-formsummary",children:l("div",{children:[t("div",{className:"sf-formsummary-caption",children:s(r)}),l(E,{children:[s("Forms aren’t available in this editor, so there is nothing to choose here."),e?` ${s("This section still points at “{slug}”, and that is unchanged.",{slug:e})}`:""]})]})})})}export{j as CREATE_SENTINEL,X as default,U as followRenamedForm,V as formDestinationLines,M as formPickerOptions,Q as resolveFormPick};