@dropins/storefront-pdp 3.2.0 → 3.3.0-beta.1

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.
@@ -11,10 +11,13 @@ type OptionValue = {
11
11
  inStock: boolean;
12
12
  value: string;
13
13
  selected?: boolean;
14
+ quantity?: number;
15
+ canEditQuantity?: boolean;
14
16
  };
15
17
  export type Option = {
16
18
  id: string;
17
19
  type: (typeof supportedTypes)[number];
20
+ typename?: 'ProductViewOptionValueProduct' | 'ProductViewOptionValueSwatch' | 'ProductViewOptionValueConfiguration';
18
21
  label: string;
19
22
  required?: boolean;
20
23
  multiple?: boolean;
@@ -30,6 +33,9 @@ export interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {
30
33
  onErrors?: (errors: {
31
34
  [id: string]: string;
32
35
  }) => void;
36
+ /** Per bundle option value UID quantities for selected bundle children. */
37
+ bundleOptionQuantities?: Record<string, number>;
38
+ onBundleOptionQuantityChange?: (optionValueId: string, quantity: number) => void;
33
39
  selectedUIDs?: string[];
34
40
  imageSwatchNode?: VNode | ((props: ImageNodeRenderProps) => JSX.Element);
35
41
  }
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as u,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useMemo as L,useEffect as _}from"@dropins/tools/preact-compat.js";import{Slot as j,classes as C}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{i as I,t as M}from"../chunks/date.js";import{config as N,getFetchedProductData as T}from"../api.js";import{useText as y}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const F=({initialData:b=null,scope:i,children:H,slots:e,formatValue:c,...s})=>{var l;const d=y("PDP.Product.Details.label").label,{globalLocale:g="en-US"}=N.getConfig(),[D,h]=f(g),[r,S]=f(b),x=L(()=>({data:r}),[r]);return _(()=>{const t=p.on("pdp/data",S,{scope:i}),o=p.on("locale",h);return()=>{t==null||t.off(),o==null||o.off()}},[i]),r?u("div",{...s,className:C(["pdp-attributes",s.className]),children:[d,e!=null&&e.Attributes?a(j,{name:"Attributes",slot:e==null?void 0:e.Attributes,context:{...x}}):a("ul",{children:(l=r==null?void 0:r.attributes)==null?void 0:l.map(({id:t,label:o,value:n},P)=>{if(t!=null&&t.startsWith("ac_")||!n)return null;const m=I(n)?M(n,D):n.toString(),A=c?c(m,t,o):m;return u("li",{children:[o,": ",a("span",{dangerouslySetInnerHTML:{__html:A}})]},`attribute-${P}`)})})]}):null};F.getInitialData=T;export{F as ProductAttributes,F as default};
3
+ import{jsxs as u,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useMemo as A,useEffect as L}from"@dropins/tools/preact-compat.js";import{Slot as N,classes as j}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{i as C,t as I}from"../chunks/date.js";import{config as M,getFetchedProductData as T}from"../api.js";import{useText as y}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const F=({initialData:d=null,scope:i,children:H,slots:e,formatValue:c,...s})=>{var l;const b=y("PDP.Product.Details.label").label,{globalLocale:g="en-US"}=M.getConfig(),[h,D]=f(g),[r,S]=f(d),x=A(()=>({data:r}),[r]);return L(()=>{const t=p.on("pdp/data",S,{scope:i}),o=p.on("locale",D);return()=>{t==null||t.off(),o==null||o.off()}},[i]),r?u("div",{...s,className:j(["pdp-attributes",s.className]),children:[a("h2",{className:"pdp-attributes__title",children:b}),e!=null&&e.Attributes?a(N,{name:"Attributes",slot:e==null?void 0:e.Attributes,context:{...x}}):a("ul",{children:(l=r==null?void 0:r.attributes)==null?void 0:l.map(({id:t,label:o,value:n},P)=>{if(t!=null&&t.startsWith("ac_")||!n)return null;const m=C(n)?I(n,h):n.toString(),_=c?c(m,t,o):m;return u("li",{children:[o,": ",a("span",{dangerouslySetInnerHTML:{__html:_}})]},`attribute-${P}`)})})]}):null};F.getInitialData=T;export{F as ProductAttributes,F as default};
4
4
  //# sourceMappingURL=ProductAttributes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductAttributes.js","sources":["/@dropins/storefront-pdp/src/containers/ProductAttributes/ProductAttributes.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState, useMemo } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { config, getFetchedProductData } from '@/pdp/api';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n formatValue?: (value: string, id: string, label: string) => string;\n slots?: {\n Attributes?: SlotProps<DefaultSlotContext>;\n };\n}\n\nexport const ProductAttributes: Container<\n ProductAttributesProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, slots, formatValue, ...props }) => {\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const { globalLocale = 'en-US' } = config.getConfig();\n\n const [locale, setLocale] = useState<string>(globalLocale);\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n // Listen for events\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <div {...props} className={classes(['pdp-attributes', props.className])}>\n {DetailsLabel}\n {slots?.Attributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n />\n ) : (\n <ul>\n {data?.attributes?.map(\n (\n { id, label, value }: { id: string; label: string; value: any },\n index: number\n ) => {\n if (id?.startsWith('ac_') || !value) {\n return null;\n }\n\n const formatted = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n const __html = formatValue\n ? formatValue(formatted, id, label)\n : formatted;\n\n return (\n <li key={`attribute-${index}`}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n }\n )}\n </ul>\n )}\n </div>\n );\n};\n\nProductAttributes.getInitialData = getFetchedProductData;\n"],"names":["ProductAttributes","initialData","scope","children","slots","formatValue","props","DetailsLabel","useText","globalLocale","config","locale","setLocale","useState","data","setData","defaultSlotContext","useMemo","useEffect","dataEvent","events","localeEvent","jsxs","classes","jsx","Slot","_a","id","label","value","index","formatted","isDateValid","toDateString","__html","getFetchedProductData"],"mappings":"ueAoCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,MAAAC,EAAO,YAAAC,EAAa,GAAGC,KAAY,OAC7E,MAAMC,EAAeC,EAAQ,2BAA2B,EAAE,MACpD,CAAE,aAAAC,EAAe,SAAYC,EAAO,UAAA,EAEpC,CAACC,EAAQC,CAAS,EAAIC,EAAiBJ,CAAY,EACnD,CAACK,EAAMC,CAAO,EAAIF,EAA8BZ,CAAW,EAE3De,EAAyCC,EAC7C,KAAO,CAAE,KAAAH,CAAA,GACT,CAACA,CAAI,CAAA,EAcP,OAVAI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYL,EAAS,CAAE,MAAAb,EAAO,EACpDmB,EAAcD,EAAO,GAAG,SAAUR,CAAS,EAEjD,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAACnB,CAAK,CAAC,EAELY,EAGHQ,EAAC,MAAA,CAAK,GAAGhB,EAAO,UAAWiB,EAAQ,CAAC,iBAAkBjB,EAAM,SAAS,CAAC,EACnE,SAAA,CAAAC,EACAH,GAAA,MAAAA,EAAO,WACNoB,EAACC,EAAA,CACC,KAAK,aACL,KAAMrB,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGY,CAAA,CAAmB,CAAA,EAGnCQ,EAAC,KAAA,CACE,UAAAE,EAAAZ,GAAA,YAAAA,EAAM,aAAN,YAAAY,EAAkB,IACjB,CACE,CAAE,GAAAC,EAAI,MAAAC,EAAO,MAAAC,CAAA,EACbC,IACG,CACH,GAAIH,GAAA,MAAAA,EAAI,WAAW,QAAU,CAACE,EAC5B,OAAO,KAGT,MAAME,EAAYC,EAAYH,CAAK,EAC/BI,EAAaJ,EAAOlB,CAAM,EAC1BkB,EAAM,SAAA,EAEJK,EAAS7B,EACXA,EAAY0B,EAAWJ,EAAIC,CAAK,EAChCG,EAEJ,SACG,KAAA,CAEE,SAAA,CAAAH,EAAM,KAAEJ,EAAC,OAAA,CAAK,wBAAyB,CAAE,OAAAU,EAAO,CAAG,CAAA,CAAA,EAF7C,aAAaJ,CAAK,EAG3B,CAEJ,EACF,CACF,CAAA,EAEJ,EAxCgB,IA0CpB,EAEA9B,EAAkB,eAAiBmC"}
1
+ {"version":3,"file":"ProductAttributes.js","sources":["/@dropins/storefront-pdp/src/containers/ProductAttributes/ProductAttributes.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState, useMemo } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { config, getFetchedProductData } from '@/pdp/api';\nimport '@/pdp/containers/ProductAttributes/ProductAttributes.css';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n formatValue?: (value: string, id: string, label: string) => string;\n slots?: {\n Attributes?: SlotProps<DefaultSlotContext>;\n };\n}\n\nexport const ProductAttributes: Container<\n ProductAttributesProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, slots, formatValue, ...props }) => {\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const { globalLocale = 'en-US' } = config.getConfig();\n\n const [locale, setLocale] = useState<string>(globalLocale);\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n // Listen for events\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <div {...props} className={classes(['pdp-attributes', props.className])}>\n <h2 className=\"pdp-attributes__title\">{DetailsLabel}</h2>\n {slots?.Attributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n />\n ) : (\n <ul>\n {data?.attributes?.map(\n (\n { id, label, value }: { id: string; label: string; value: any },\n index: number\n ) => {\n if (id?.startsWith('ac_') || !value) {\n return null;\n }\n\n const formatted = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n const __html = formatValue\n ? formatValue(formatted, id, label)\n : formatted;\n\n return (\n <li key={`attribute-${index}`}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n }\n )}\n </ul>\n )}\n </div>\n );\n};\n\nProductAttributes.getInitialData = getFetchedProductData;\n"],"names":["ProductAttributes","initialData","scope","children","slots","formatValue","props","DetailsLabel","useText","globalLocale","config","locale","setLocale","useState","data","setData","defaultSlotContext","useMemo","useEffect","dataEvent","events","localeEvent","jsxs","classes","jsx","Slot","_a","id","label","value","index","formatted","isDateValid","toDateString","__html","getFetchedProductData"],"mappings":"ueAqCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,MAAAC,EAAO,YAAAC,EAAa,GAAGC,KAAY,OAC7E,MAAMC,EAAeC,EAAQ,2BAA2B,EAAE,MACpD,CAAE,aAAAC,EAAe,SAAYC,EAAO,UAAA,EAEpC,CAACC,EAAQC,CAAS,EAAIC,EAAiBJ,CAAY,EACnD,CAACK,EAAMC,CAAO,EAAIF,EAA8BZ,CAAW,EAE3De,EAAyCC,EAC7C,KAAO,CAAE,KAAAH,CAAA,GACT,CAACA,CAAI,CAAA,EAcP,OAVAI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYL,EAAS,CAAE,MAAAb,EAAO,EACpDmB,EAAcD,EAAO,GAAG,SAAUR,CAAS,EAEjD,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAACnB,CAAK,CAAC,EAELY,EAGHQ,EAAC,MAAA,CAAK,GAAGhB,EAAO,UAAWiB,EAAQ,CAAC,iBAAkBjB,EAAM,SAAS,CAAC,EACpE,SAAA,CAAAkB,EAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAjB,EAAa,EACnDH,GAAA,MAAAA,EAAO,WACNoB,EAACC,EAAA,CACC,KAAK,aACL,KAAMrB,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGY,CAAA,CAAmB,CAAA,EAGnCQ,EAAC,KAAA,CACE,UAAAE,EAAAZ,GAAA,YAAAA,EAAM,aAAN,YAAAY,EAAkB,IACjB,CACE,CAAE,GAAAC,EAAI,MAAAC,EAAO,MAAAC,CAAA,EACbC,IACG,CACH,GAAIH,GAAA,MAAAA,EAAI,WAAW,QAAU,CAACE,EAC5B,OAAO,KAGT,MAAME,EAAYC,EAAYH,CAAK,EAC/BI,EAAaJ,EAAOlB,CAAM,EAC1BkB,EAAM,SAAA,EAEJK,EAAS7B,EACXA,EAAY0B,EAAWJ,EAAIC,CAAK,EAChCG,EAEJ,SACG,KAAA,CAEE,SAAA,CAAAH,EAAM,KAAEJ,EAAC,OAAA,CAAK,wBAAyB,CAAE,OAAAU,EAAO,CAAG,CAAA,CAAA,EAF7C,aAAaJ,CAAK,EAG3B,CAEJ,EACF,CACF,CAAA,EAEJ,EAxCgB,IA0CpB,EAEA9B,EAAkB,eAAiBmC"}
@@ -13,6 +13,7 @@ export type Values = {
13
13
  uid: string;
14
14
  value: string;
15
15
  }>;
16
+ bundleOptionQuantities?: Record<string, number>;
16
17
  };
17
18
  /** @deprecated This type is part of the deprecated ProductDetails component. */
18
19
  type DefaultSlotContext = {
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as he,jsx as o,Fragment as Fe}from"@dropins/tools/preact-jsx-runtime.js";import{useState as V,useEffect as C,useCallback as M,useMemo as Je}from"@dropins/tools/preact-compat.js";import{Slot as u,toLanguageTag as fe}from"@dropins/tools/lib.js";import{Incrementer as He,Image as be,Button as ge,Icon as K,Breadcrumbs as R}from"@dropins/tools/components.js";import{c as Qe,a as Oe,D as Ae,G as ze,S as Ke}from"../chunks/components.js";import"@dropins/tools/preact.js";import{config as Pe,g as Re,i as $,fetchProductData as W,p as $e,s as We,a as De,t as Xe}from"../api.js";import{events as T}from"@dropins/tools/event-bus.js";import{i as Ye,t as Ze}from"../chunks/date.js";import{useText as j}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const xe=({sku:D,hideSku:G,hideQuantity:I,hideShortDescription:w,hideDescription:E,hideAttributes:L,hideURLParams:X,hideSelectedOptionValue:Se,slots:n,children:et,initialData:y,carousel:s,optionsConfig:d,useACDL:Ie,onAddToCart:F,zoomType:ye,closeButton:ve=!0,disableDropdownPreselection:N,..._e})=>{var te,ne,ie,re,ce,oe,ae,se,pe,le,ue;const Y=j("PDP.Product.AddToCart.label").label,Ue=j("PDP.Product.Incrementer.label").label,Ve=j("PDP.Product.Details.label").label,we=j("PDP.Swatches.ChooseOption.label").label,[S,Ee]=V(Pe.getConfig().defaultLocale||"en-US"),[Le,Ne]=V(),[e=null,k]=V(y),[b,J]=V(()=>{const t=Re(1),i={sku:D,quantity:t};return e!=null&&e.optionUIDs&&(i.optionsUIDs=e.optionUIDs),i}),[Z,B]=V(()=>{var t;return(t=e==null?void 0:e.options)!=null&&t.length?$(e.options,e.optionUIDs,e.isBundle):!0}),l={data:e,values:b,valid:Z};function x(t){return t==null?void 0:t.some(i=>(i==null?void 0:i.typename)==="ProductViewOptionValueProduct")}C(()=>{const t=T.on("pdp/data",r=>{r&&(k(r),J(c=>({...c,sku:r.sku,optionsUIDs:r.optionUIDs})))}),i=T.on("pdp/setValues",r=>{J(c=>({...c,...r}))});return()=>{i==null||i.off(),t==null||t.off()}},[]),C(()=>{const t=T.on("locale",i=>{i!==S&&(Ee(i),W(D,{preselectFirstOption:!N,anchors:d==null?void 0:d.anchorOptions}).then(k))});return()=>{t==null||t.off()}},[N,S,d==null?void 0:d.anchorOptions,D]),C(()=>{Ie&&y&&Object.keys(y).length>0&&$e(y)},[y]);const v=M(t=>{J(i=>({...i,...t}))},[]);C(()=>{T.emit("pdp/values",b)},[JSON.stringify(b)]);const ke=M(async t=>{var a;const i=Object.fromEntries(Object.entries(t).filter(([,p])=>p.label!==we));let r=We(i,e==null?void 0:e.options);!X&&(e!=null&&e.options)&&!x(e.options)&&De({optionsUIDs:r.join(",")}),v({optionsUIDs:r});const c=await W(D,{anchors:d==null?void 0:d.anchorOptions,isBundle:e==null?void 0:e.isBundle,optionsUIDs:r,preselectFirstOption:!N});k(c),B($(c==null?void 0:c.options,(c==null?void 0:c.optionUIDs)??r,c==null?void 0:c.isBundle)),(a=d==null?void 0:d.anchorOptions)!=null&&a.length&&Be(c,r)},[D]),Be=M((t,i)=>{const r=(t==null?void 0:t.optionUIDs)??[];i.every(a=>r.includes(a))||(Ne(t==null?void 0:t.options),v({optionsUIDs:r}),B($(t==null?void 0:t.options,r,t==null?void 0:t.isBundle)))},[D]),ee=M(t=>{Object.keys(t).length!==0&&B(!1)},[]),q=Je(()=>{var t;return(t=e==null?void 0:e.attributes)==null?void 0:t.map(({label:i,value:r,id:c},a)=>{if(c==="ac_giftcard")return"";const p=Ye(r)?Ze(r,S):r.toString();return he("li",{children:[i,": ",o("span",{dangerouslySetInnerHTML:{__html:p}})]},a)})},[e==null?void 0:e.attributes,S]),qe=!I&&(e!=null&&e.inStock)?o(u,{name:"Quantity",slot:n==null?void 0:n.Quantity,context:{...l},children:o(He,{name:"quantity",defaultValue:b.quantity.toString(),value:b.quantity.toString(),min:1,"aria-label":Ue,className:"pdp-product__quantity",onValue:t=>{const i=Number(t);v({quantity:i}),!X&&(e!=null&&e.options)&&(x(e.options)||De({quantity:i}))}},"quantity")}):void 0,Ce=()=>{if(e!=null&&e.options)return o(u,{name:"Options",slot:n==null?void 0:n.Options,context:{...l},children:o(Ke,{selectedUIDs:b.optionsUIDs,options:e.options,defaultOptions:b.optionsUIDs,selectionsToUpdate:Le,hideSelectedValue:Se,disablePreselections:N,onValues:ke,onErrors:ee})})},Me=()=>{if(e!=null&&e.attributes){const t=e.attributes.filter(i=>i.id==="ac_giftcard");if(t.length>0){const r=t.map((c,a)=>{var p;try{const m=JSON.parse(c.value),P=b.enteredOptions||[],_=((p=m.options)==null?void 0:p.map(h=>{const f=P.find(g=>g.uid===h.uid);return{id:h.uid,value:(f==null?void 0:f.value)||""}}))||[];return o(ze,{options:m.options||[],optionValues:_,onOptionChange:(h,f)=>{var de;const g=b.enteredOptions||[],H=g.findIndex(O=>O.uid===h);let Q;if(H!==-1?Q=g.map(O=>O.uid===h?{...O,value:f}:O):Q=[...g,{uid:h,value:f}],v({enteredOptions:Q}),e){const O={...e},je=((de=O.attributes)==null?void 0:de.map(U=>{var me;if(U.id==="ac_giftcard")try{const A=JSON.parse(U.value),Ge=((me=A.options)==null?void 0:me.map(z=>z.uid===h?{...z,value:f}:z))||[];return{...U,value:JSON.stringify({...A,options:Ge})}}catch{return U}return U}))||[];O.attributes=je,k(O)}},onValidationChange:h=>{h||ee({giftCard:"Invalid gift card data"}),B(h)},className:"pdp-product__gift-card-options"},`giftcard-${a}`)}catch(m){return console.warn("Invalid gift card data format:",m),null}}).filter(c=>c!==null);return r.length>0?o("div",{className:"pdp-product__gift-card-options-container",children:r}):void 0}}},Te=()=>{if(e!=null&&e.attributes){const t=e.attributes.filter(i=>{var r;return i.id==="ac_downloadable"&&((r=i.roles)==null?void 0:r.includes("visible_in_pdp"))});if(t.length>0){const r=t.map((c,a)=>{var p,m;try{const P=typeof c.value=="string"?JSON.parse(c.value):c.value;return o(Ae,{label:c.label,value:P,onLinkChange:(_,h)=>{const f=b.optionsUIDs||[];let g;h?f.includes(_)?g=f:g=[...f,_]:g=f.filter(H=>H!==_),v({optionsUIDs:g})},currency:(m=(p=e.prices)==null?void 0:p.final)==null?void 0:m.currency,className:"pdp-product__downloadable-options"},`downloadable-${a}`)}catch(P){return console.warn("Invalid downloadable data format:",P),null}}).filter(c=>c!==null);return r.length>0?o("div",{className:"pdp-product__downloadable-options-container",children:r}):void 0}}};return o("div",{..._e,children:o(Qe,{title:o(u,{name:"Title",slot:n==null?void 0:n.Title,context:{...l},children:e==null?void 0:e.name}),sku:G?void 0:o(u,{name:"SKU",slot:n==null?void 0:n.SKU,context:{...l},children:e==null?void 0:e.sku}),options:Ce(),giftCardOptions:Me(),downloadableOptions:Te(),breadcrumbs:(n==null?void 0:n.Breadcrumbs)&&o(u,{name:"Breadcrumbs",slot:n==null?void 0:n.Breadcrumbs,context:{...l,setSeparator(t){this._registerMethod((...i)=>{const r=t(...i),c=r&&o(K,{source:r});this._setProps(a=>({...a,separator:c,children:[o(R,{separator:c,categories:a.categories})]}))})},appendLink(t){this._registerMethod((...i)=>{const{text:r,...c}=t(...i),a=o("a",{...c,children:r});this._setProps(p=>{const m=[...p.categories||[],a];return{...p,categories:m,children:[o(R,{separator:p.separator,categories:m})]}})})},appendHTMLElement(t){this._registerMethod((...i)=>{const r=t(...i),c=this._htmlElementToVNode(r);this._setProps(a=>{const p=[...a.categories||[],c];return{...a,categories:p,children:[o(R,{separator:a.separator,categories:p})]}})})}}}),quantity:qe,actions:o(u,{name:"Actions",slot:n==null?void 0:n.Actions,context:{...l,appendButton(t){this._registerMethod((...i)=>{const r=t(...i);if(!r)return;const{text:c,icon:a,...p}=r,m=o(ge,{type:"button",...p,icon:a&&o(K,{source:a}),children:c});this._setProps(P=>({children:[...P.children||[],m]}))})}},children:!(n!=null&&n.Actions)&&o(ge,{size:"medium",type:"submit",icon:o(K,{source:"Cart"}),disabled:!(e!=null&&e.inStock)||!Z,"aria-label":Y,onClick:()=>F==null?void 0:F(b),children:Y})}),shortDescription:w?void 0:o(u,{name:"ShortDescription",slot:n==null?void 0:n.ShortDescription,context:{...l},children:o("div",{dangerouslySetInnerHTML:{__html:(e==null?void 0:e.shortDescription)??""}})}),description:E?void 0:o(u,{name:"Description",slot:n==null?void 0:n.Description,context:{...l},children:o("div",{dangerouslySetInnerHTML:{__html:(e==null?void 0:e.description)??""}})}),images:((te=e==null?void 0:e.images)==null?void 0:te.map(({label:t,url:i})=>{var r,c;return o(be,{title:t,alt:t,src:i,width:((r=s==null?void 0:s.imageParams)==null?void 0:r.width)??960,height:((c=s==null?void 0:s.imageParams)==null?void 0:c.height)??1191,params:(s==null?void 0:s.imageParams)??{width:960}},i)}))??[],specialPrice:(ne=e==null?void 0:e.prices)!=null&&ne.visible?o(u,{name:"SpecialPrice",slot:n==null?void 0:n.SpecialPrice,context:{...l},children:o(Oe,{...(ie=e.prices)==null?void 0:ie.final,locale:fe(S)})}):void 0,price:(re=e==null?void 0:e.prices)!=null&&re.visible&&((ce=e==null?void 0:e.prices)!=null&&ce.regular)&&((ae=(oe=e==null?void 0:e.prices)==null?void 0:oe.final)==null?void 0:ae.amount)!==((pe=(se=e==null?void 0:e.prices)==null?void 0:se.regular)==null?void 0:pe.amount)?o(u,{name:"RegularPrice",slot:n==null?void 0:n.RegularPrice,context:{...l},children:o(Oe,{...(le=e.prices)==null?void 0:le.regular,locale:fe(S)})}):void 0,zoomType:ye,closeButton:ve,carouselConfig:{...s,thumbnails:s&&Object.keys(s).length?((ue=e==null?void 0:e.images)==null?void 0:ue.map(({label:t,url:i})=>{var r,c;return o(be,{title:t,alt:t,src:i,width:((r=s==null?void 0:s.thumbnailParams)==null?void 0:r.width)??200,height:((c=s==null?void 0:s.thumbnailParams)==null?void 0:c.height)??248,params:(s==null?void 0:s.thumbnailParams)??{width:200}},i)}))??[]:[]},outOfStock:!(e!=null&&e.inStock),attributes:L?void 0:o(u,{name:"Attributes",slot:n==null?void 0:n.Attributes,context:{...l},children:q!=null&&q.length?he(Fe,{children:[Ve,o("ul",{children:q})]}):null}),galleryContent:(n==null?void 0:n.GalleryContent)&&o(u,{name:"GalleryContent",slot:n.GalleryContent,context:{...l}}),infoContent:(n==null?void 0:n.InfoContent)&&o(u,{name:"InfoContent",slot:n.InfoContent,context:{...l}}),productContent:(n==null?void 0:n.Content)&&o(u,{name:"Content",slot:n.Content,context:{...l}})})})};xe.getInitialData=async function({sku:D,disableDropdownPreselection:G=!1,optionsConfig:I}){var E,L;const w=(L=(E=Pe.getConfig().models)==null?void 0:E.ProductDetails)==null?void 0:L.initialData;return w?Xe(w):W(D,{preselectFirstOption:!G,anchors:I==null?void 0:I.anchorOptions})};export{xe as ProductDetails,xe as default};
3
+ import{jsxs as fe,jsx as c,Fragment as Je}from"@dropins/tools/preact-jsx-runtime.js";import{useState as w,useEffect as T,useCallback as V,useMemo as He}from"@dropins/tools/preact-compat.js";import{Slot as l,toLanguageTag as be}from"@dropins/tools/lib.js";import{Incrementer as Ae,Image as Oe,Button as ge,Icon as K,Breadcrumbs as R}from"@dropins/tools/components.js";import{P as ze,a as De,D as Ke,G as Re,S as $e}from"../chunks/components.js";import"@dropins/tools/preact.js";import{config as Se,g as xe,b as We,a as $,i as x,m as Xe,fetchProductData as W,p as Ye,s as Ze,c as Pe,t as et}from"../api.js";import{events as q}from"@dropins/tools/event-bus.js";import{i as tt,t as nt}from"../chunks/date.js";import{useText as j}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const it=({sku:D,hideSku:F,hideQuantity:I,hideShortDescription:Q,hideDescription:B,hideAttributes:E,hideURLParams:X,hideSelectedOptionValue:Ie,slots:i,children:rt,initialData:y,carousel:u,optionsConfig:d,useACDL:ye,onAddToCart:G,zoomType:_e,closeButton:ve=!0,disableDropdownPreselection:C,...Ue})=>{var ne,ie,re,oe,ce,se,ae,ue,pe,le,de;const Y=j("PDP.Product.AddToCart.label").label,we=j("PDP.Product.Incrementer.label").label,Ve=j("PDP.Product.Details.label").label,Qe=j("PDP.Swatches.ChooseOption.label").label,[S,Be]=w(Se.getConfig().defaultLocale||"en-US"),[Ee,Ce]=w(),[e=null,L]=w(y),[m,N]=w(()=>{const t=xe(1),r={sku:D,quantity:t};if(e!=null&&e.optionUIDs&&(r.optionsUIDs=e.optionUIDs),e!=null&&e.isBundle&&(e!=null&&e.options)){const n=We(e.options,e.optionUIDs??[]);r.bundleOptionQuantities=n,r.enteredOptions=$(n)}return r}),[Z,k]=w(()=>{var t;return(t=e==null?void 0:e.options)!=null&&t.length?x(e.options,e.optionUIDs,e.isBundle):!0}),p={data:e,values:m,valid:Z};function ee(t){return t==null?void 0:t.some(r=>(r==null?void 0:r.typename)==="ProductViewOptionValueProduct")}T(()=>{const t=q.on("pdp/data",n=>{n&&(L(n),N(o=>{const s={...o,sku:n.sku,optionsUIDs:n.optionUIDs};if(n.isBundle&&n.options){const a=Xe(o.bundleOptionQuantities,n.options,n.optionUIDs??[]);s.bundleOptionQuantities=a,s.enteredOptions=$(a)}return s}))}),r=q.on("pdp/setValues",n=>{N(o=>({...o,...n}))});return()=>{r==null||r.off(),t==null||t.off()}},[]),T(()=>{const t=q.on("locale",r=>{r!==S&&(Be(r),W(D,{preselectFirstOption:!C,anchors:d==null?void 0:d.anchorOptions}).then(L))});return()=>{t==null||t.off()}},[C,S,d==null?void 0:d.anchorOptions,D]),T(()=>{ye&&y&&Object.keys(y).length>0&&Ye(y)},[y]);const _=V(t=>{N(r=>({...r,...t}))},[]),Le=V((t,r)=>{var o;const n=(o=e==null?void 0:e.options)==null?void 0:o.flatMap(s=>s.items).find(s=>s.id===t);n!=null&&n.canEditQuantity&&N(s=>{const a={...s.bundleOptionQuantities??{},[t]:r};return{...s,bundleOptionQuantities:a,enteredOptions:$(a)}})},[e==null?void 0:e.options]);T(()=>{q.emit("pdp/values",m)},[JSON.stringify(m)]);const Ne=V(async t=>{var s;const r=Object.fromEntries(Object.entries(t).filter(([,a])=>a.label!==Qe));let n=Ze(r,e==null?void 0:e.options);!X&&(e!=null&&e.options)&&!ee(e.options)&&Pe({optionsUIDs:n.join(",")}),_({optionsUIDs:n});const o=await W(D,{anchors:d==null?void 0:d.anchorOptions,isBundle:e==null?void 0:e.isBundle,optionsUIDs:n,preselectFirstOption:!C});L(o),k(x(o==null?void 0:o.options,(o==null?void 0:o.optionUIDs)??n,o==null?void 0:o.isBundle)),(s=d==null?void 0:d.anchorOptions)!=null&&s.length&&ke(o,n)},[D]),ke=V((t,r)=>{const n=(t==null?void 0:t.optionUIDs)??[];r.every(s=>n.includes(s))||(Ce(t==null?void 0:t.options),_({optionsUIDs:n}),k(x(t==null?void 0:t.options,n,t==null?void 0:t.isBundle)))},[D]),te=V(t=>{Object.keys(t).length!==0&&k(!1)},[]),M=He(()=>{var t;return(t=e==null?void 0:e.attributes)==null?void 0:t.map(({label:r,value:n,id:o},s)=>{if(o==="ac_giftcard")return"";const a=tt(n)?nt(n,S):n.toString();return fe("li",{children:[r,": ",c("span",{dangerouslySetInnerHTML:{__html:a}})]},s)})},[e==null?void 0:e.attributes,S]),Me=!I&&(e!=null&&e.inStock)&&!(e!=null&&e.isBundle)?c(l,{name:"Quantity",slot:i==null?void 0:i.Quantity,context:{...p},children:c(Ae,{name:"quantity",defaultValue:m.quantity.toString(),value:m.quantity.toString(),min:1,"aria-label":we,className:"pdp-product__quantity",onValue:t=>{const r=Number(t);_({quantity:r}),!X&&(e!=null&&e.options)&&(ee(e.options)||Pe({quantity:r}))}},"quantity")}):void 0,Te=()=>{if(e!=null&&e.options)return c(l,{name:"Options",slot:i==null?void 0:i.Options,context:{...p},children:c($e,{selectedUIDs:m.optionsUIDs,options:e.options,defaultOptions:m.optionsUIDs,selectionsToUpdate:Ee,hideSelectedValue:Ie,disablePreselections:C,onValues:Ne,onErrors:te,bundleOptionQuantities:m.bundleOptionQuantities,onBundleOptionQuantityChange:Le})})},qe=()=>{if(e!=null&&e.attributes){const t=e.attributes.filter(r=>r.id==="ac_giftcard");if(t.length>0){const n=t.map((o,s)=>{var a;try{const h=JSON.parse(o.value),P=m.enteredOptions||[],v=((a=h.options)==null?void 0:a.map(f=>{const b=P.find(O=>O.uid===f.uid);return{id:f.uid,value:(b==null?void 0:b.value)||""}}))||[];return c(Re,{options:h.options||[],optionValues:v,onOptionChange:(f,b)=>{var me;const O=m.enteredOptions||[],J=O.findIndex(g=>g.uid===f);let H;if(J!==-1?H=O.map(g=>g.uid===f?{...g,value:b}:g):H=[...O,{uid:f,value:b}],_({enteredOptions:H}),e){const g={...e},Fe=((me=g.attributes)==null?void 0:me.map(U=>{var he;if(U.id==="ac_giftcard")try{const A=JSON.parse(U.value),Ge=((he=A.options)==null?void 0:he.map(z=>z.uid===f?{...z,value:b}:z))||[];return{...U,value:JSON.stringify({...A,options:Ge})}}catch{return U}return U}))||[];g.attributes=Fe,L(g)}},onValidationChange:f=>{f||te({giftCard:"Invalid gift card data"}),k(f)},className:"pdp-product__gift-card-options"},`giftcard-${s}`)}catch(h){return console.warn("Invalid gift card data format:",h),null}}).filter(o=>o!==null);return n.length>0?c("div",{className:"pdp-product__gift-card-options-container",children:n}):void 0}}},je=()=>{if(e!=null&&e.attributes){const t=e.attributes.filter(r=>{var n;return r.id==="ac_downloadable"&&((n=r.roles)==null?void 0:n.includes("visible_in_pdp"))});if(t.length>0){const n=t.map((o,s)=>{var a,h;try{const P=typeof o.value=="string"?JSON.parse(o.value):o.value;return c(Ke,{label:o.label,value:P,onLinkChange:(v,f)=>{const b=m.optionsUIDs||[];let O;f?b.includes(v)?O=b:O=[...b,v]:O=b.filter(J=>J!==v),_({optionsUIDs:O})},currency:(h=(a=e.prices)==null?void 0:a.final)==null?void 0:h.currency,className:"pdp-product__downloadable-options"},`downloadable-${s}`)}catch(P){return console.warn("Invalid downloadable data format:",P),null}}).filter(o=>o!==null);return n.length>0?c("div",{className:"pdp-product__downloadable-options-container",children:n}):void 0}}};return c("div",{...Ue,children:c(ze,{title:c(l,{name:"Title",slot:i==null?void 0:i.Title,context:{...p},children:e==null?void 0:e.name}),sku:F?void 0:c(l,{name:"SKU",slot:i==null?void 0:i.SKU,context:{...p},children:e==null?void 0:e.sku}),options:Te(),giftCardOptions:qe(),downloadableOptions:je(),breadcrumbs:(i==null?void 0:i.Breadcrumbs)&&c(l,{name:"Breadcrumbs",slot:i==null?void 0:i.Breadcrumbs,context:{...p,setSeparator(t){this._registerMethod((...r)=>{const n=t(...r),o=n&&c(K,{source:n});this._setProps(s=>({...s,separator:o,children:[c(R,{separator:o,categories:s.categories})]}))})},appendLink(t){this._registerMethod((...r)=>{const{text:n,...o}=t(...r),s=c("a",{...o,children:n});this._setProps(a=>{const h=[...a.categories||[],s];return{...a,categories:h,children:[c(R,{separator:a.separator,categories:h})]}})})},appendHTMLElement(t){this._registerMethod((...r)=>{const n=t(...r),o=this._htmlElementToVNode(n);this._setProps(s=>{const a=[...s.categories||[],o];return{...s,categories:a,children:[c(R,{separator:s.separator,categories:a})]}})})}}}),quantity:Me,actions:c(l,{name:"Actions",slot:i==null?void 0:i.Actions,context:{...p,appendButton(t){this._registerMethod((...r)=>{const n=t(...r);if(!n)return;const{text:o,icon:s,...a}=n,h=c(ge,{type:"button",...a,icon:s&&c(K,{source:s}),children:o});this._setProps(P=>({children:[...P.children||[],h]}))})}},children:!(i!=null&&i.Actions)&&c(ge,{size:"medium",type:"submit",icon:c(K,{source:"Cart"}),disabled:!(e!=null&&e.inStock)||!Z,"aria-label":Y,onClick:()=>G==null?void 0:G(m),children:Y})}),shortDescription:Q?void 0:c(l,{name:"ShortDescription",slot:i==null?void 0:i.ShortDescription,context:{...p},children:c("div",{dangerouslySetInnerHTML:{__html:(e==null?void 0:e.shortDescription)??""}})}),description:B?void 0:c(l,{name:"Description",slot:i==null?void 0:i.Description,context:{...p},children:c("div",{dangerouslySetInnerHTML:{__html:(e==null?void 0:e.description)??""}})}),images:((ne=e==null?void 0:e.images)==null?void 0:ne.map(({label:t,url:r})=>{var n,o;return c(Oe,{title:t,alt:t,src:r,width:((n=u==null?void 0:u.imageParams)==null?void 0:n.width)??960,height:((o=u==null?void 0:u.imageParams)==null?void 0:o.height)??1191,params:(u==null?void 0:u.imageParams)??{width:960}},r)}))??[],specialPrice:(ie=e==null?void 0:e.prices)!=null&&ie.visible?c(l,{name:"SpecialPrice",slot:i==null?void 0:i.SpecialPrice,context:{...p},children:c(De,{...(re=e.prices)==null?void 0:re.final,locale:be(S)})}):void 0,price:(oe=e==null?void 0:e.prices)!=null&&oe.visible&&((ce=e==null?void 0:e.prices)!=null&&ce.regular)&&((ae=(se=e==null?void 0:e.prices)==null?void 0:se.final)==null?void 0:ae.amount)!==((pe=(ue=e==null?void 0:e.prices)==null?void 0:ue.regular)==null?void 0:pe.amount)?c(l,{name:"RegularPrice",slot:i==null?void 0:i.RegularPrice,context:{...p},children:c(De,{...(le=e.prices)==null?void 0:le.regular,locale:be(S)})}):void 0,zoomType:_e,closeButton:ve,carouselConfig:{...u,thumbnails:u&&Object.keys(u).length?((de=e==null?void 0:e.images)==null?void 0:de.map(({label:t,url:r})=>{var n,o;return c(Oe,{title:t,alt:t,src:r,width:((n=u==null?void 0:u.thumbnailParams)==null?void 0:n.width)??200,height:((o=u==null?void 0:u.thumbnailParams)==null?void 0:o.height)??248,params:(u==null?void 0:u.thumbnailParams)??{width:200}},r)}))??[]:[]},outOfStock:!(e!=null&&e.inStock),attributes:E?void 0:c(l,{name:"Attributes",slot:i==null?void 0:i.Attributes,context:{...p},children:M!=null&&M.length?fe(Je,{children:[Ve,c("ul",{children:M})]}):null}),galleryContent:(i==null?void 0:i.GalleryContent)&&c(l,{name:"GalleryContent",slot:i.GalleryContent,context:{...p}}),infoContent:(i==null?void 0:i.InfoContent)&&c(l,{name:"InfoContent",slot:i.InfoContent,context:{...p}}),productContent:(i==null?void 0:i.Content)&&c(l,{name:"Content",slot:i.Content,context:{...p}})})})};it.getInitialData=async function({sku:D,disableDropdownPreselection:F=!1,optionsConfig:I}){var B,E;const Q=(E=(B=Se.getConfig().models)==null?void 0:B.ProductDetails)==null?void 0:E.initialData;return Q?et(Q):W(D,{preselectFirstOption:!F,anchors:I==null?void 0:I.anchorOptions})};export{it as ProductDetails,it as default};
4
4
  //# sourceMappingURL=ProductDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductDetails.js","sources":["/@dropins/storefront-pdp/src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe-commerce/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe-commerce/elsie/components';\nimport {\n Product,\n Swatches,\n PriceRange,\n Option,\n GiftCardOptions,\n DownloadableOptions,\n} from '@/pdp/components';\nimport { config, fetchProductData } from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Lang, useText } from '@adobe-commerce/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport {\n isProductOptionsSelectionComplete,\n selectionMapToOptionUIDs,\n type ProductOptionSelectionMap,\n} from '@/pdp/lib/product-option-selection';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel, Option as ProductOption } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype IconType = keyof typeof import('@adobe-commerce/elsie/icons');\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n enteredOptions?: Array<{ uid: string; value: string }>;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type CarouselConfig = {\n controls?: {\n desktop?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n mobile?: 'dots' | 'thumbnailsRow' | null;\n };\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n desktop: boolean;\n mobile: boolean;\n };\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\n/** @deprecated This interface is part of the deprecated ProductDetails component. */\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<\n DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }\n >;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<\n DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }\n >;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n useACDL?: boolean;\n onAddToCart?: (values: Values) => void;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n disableDropdownPreselection?: boolean;\n}\n\n/**\n * @deprecated This container has been deprecated and will be removed in a future release.\n * Please use the different composable containers to build your product details page.xs\n */\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n useACDL,\n onAddToCart,\n zoomType,\n closeButton = true,\n disableDropdownPreselection,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(\n (config.getConfig().defaultLocale as Lang) || 'en-US'\n );\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1\n\n const defaultValues: Values = {\n sku,\n quantity: initialQuantity,\n };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n if (!data?.options?.length) {\n return true;\n }\n return isProductOptionsSelectionComplete(\n data.options,\n data.optionUIDs,\n data.isBundle\n );\n });\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n function hasProductViewOptionValueProduct(options: ProductOption[]) {\n return options?.some(\n (option) => option?.typename === 'ProductViewOptionValueProduct'\n );\n }\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', (payload) => {\n if (payload) {\n setData(payload);\n // Preserve the current quantity value when updating from pdp/data event\n setValues((prev: Values) => ({\n ...prev,\n sku: payload.sku,\n optionsUIDs: payload.optionUIDs,\n }));\n }\n });\n\n // @ts-ignore - Type error with event bus events\n const updateDataEvent = events.on(\n 'pdp/setValues',\n (payload: Partial<Values>) => {\n setValues((prev: Values) => ({ ...prev, ...payload }));\n }\n );\n\n return () => {\n updateDataEvent?.off();\n dataEvent?.off();\n };\n }, []);\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n }).then(setData);\n });\n return () => {\n localeEvent?.off();\n };\n }, [disableDropdownPreselection, locale, optionsConfig?.anchorOptions, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback((newValues: Partial<Values>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n useEffect(() => {\n events.emit('pdp/values', values);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(values)]);\n\n const handleOptionSelected = useCallback(\n async (selections: ProductOptionSelectionMap) => {\n // options Selected\n const sanitizedSelections = Object.fromEntries(\n Object.entries(selections).filter(\n ([, value]) => value.label !== ChooseOptionLabel\n )\n ) as ProductOptionSelectionMap;\n\n let optionsUIDs = selectionMapToOptionUIDs(\n sanitizedSelections,\n data?.options\n );\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the hideURLParams is not set to true and the product is not a bundle type\n if (\n !hideURLParams &&\n data?.options &&\n !hasProductViewOptionValueProduct(data.options)\n ) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n handleOnValues({ optionsUIDs });\n\n // get refined product data and update state\n const next = await fetchProductData(sku, {\n anchors: optionsConfig?.anchorOptions,\n isBundle: data?.isBundle,\n optionsUIDs,\n preselectFirstOption: !disableDropdownPreselection,\n });\n\n setData(next);\n setValid(\n isProductOptionsSelectionComplete(\n next?.options,\n next?.optionUIDs ?? optionsUIDs,\n next?.isBundle\n )\n );\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const processUpdates = useCallback(\n (next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n handleOnValues({ optionsUIDs: updatedOptionsUIDs });\n setValid(\n isProductOptionsSelectionComplete(\n next?.options,\n updatedOptionsUIDs,\n next?.isBundle\n )\n );\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value, id }, key: number) => {\n // Return empty string for gift card attributes\n if (id === 'ac_giftcard') {\n return '';\n }\n\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n value={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n const quantityValue = Number(quantity);\n handleOnValues({ quantity: quantityValue });\n\n // Add quantity to URL parameters if not set to hide\n if (!hideURLParams && data?.options) {\n // Only update URL if the product is not a bundle type\n if (!hasProductViewOptionValueProduct(data.options)) {\n setUrlParams({ quantity: quantityValue });\n }\n }\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot\n name=\"Options\"\n slot={slots?.Options}\n context={{ ...defaultSlotContext }}\n >\n <Swatches\n selectedUIDs={values.optionsUIDs}\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n disablePreselections={disableDropdownPreselection}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n />\n </Slot>\n );\n }\n };\n\n const renderGiftCardOptions = () => {\n if (data?.attributes) {\n const giftCardAttributes = data.attributes.filter(\n (attr) => attr.id === 'ac_giftcard'\n );\n\n if (giftCardAttributes.length > 0) {\n const giftCardElements = giftCardAttributes.map(\n (giftCardAttr, index) => {\n try {\n const giftCardData = JSON.parse(giftCardAttr.value);\n const prevOptions = values.enteredOptions || [];\n const optionValues =\n giftCardData.options?.map((option: any) => {\n const existingOption = prevOptions.find(\n (opt: { uid: string; value: string }) =>\n opt.uid === option.uid\n );\n return {\n id: option.uid,\n value: existingOption?.value || '',\n };\n }) || [];\n\n return (\n <GiftCardOptions\n key={`giftcard-${index}`}\n options={giftCardData.options || []}\n optionValues={optionValues}\n onOptionChange={(uid: string, value: string) => {\n const prevOptions = values.enteredOptions || [];\n const idx = prevOptions.findIndex(\n (field: { uid: string; value: string }) =>\n field.uid === uid\n );\n let newEnteredOptions;\n if (idx !== -1) {\n newEnteredOptions = prevOptions.map(\n (field: { uid: string; value: string }) =>\n field.uid === uid ? { ...field, value } : field\n );\n } else {\n newEnteredOptions = [...prevOptions, { uid, value }];\n }\n\n handleOnValues({ enteredOptions: newEnteredOptions });\n\n if (data) {\n const updatedData = { ...data };\n const giftCardAttributes =\n updatedData.attributes?.map((attr) => {\n if (attr.id === 'ac_giftcard') {\n try {\n const giftCardData = JSON.parse(attr.value);\n const updatedOptions =\n giftCardData.options?.map((option: any) => {\n if (option.uid === uid) {\n return { ...option, value };\n }\n return option;\n }) || [];\n return {\n ...attr,\n value: JSON.stringify({\n ...giftCardData,\n options: updatedOptions,\n }),\n };\n } catch (error) {\n return attr;\n }\n }\n return attr;\n }) || [];\n updatedData.attributes = giftCardAttributes;\n setData(updatedData);\n }\n }}\n onValidationChange={(valid: boolean) => {\n if (!valid) {\n handleOnErrors({ giftCard: 'Invalid gift card data' });\n }\n\n setValid(valid);\n }}\n className=\"pdp-product__gift-card-options\"\n />\n );\n } catch (error) {\n console.warn('Invalid gift card data format:', error);\n return null;\n }\n }\n );\n\n // Filter out null values and return a single element\n const validElements = giftCardElements.filter(\n (element) => element !== null\n );\n return validElements.length > 0 ? (\n <div className=\"pdp-product__gift-card-options-container\">\n {validElements}\n </div>\n ) : undefined;\n }\n }\n return undefined;\n };\n\n const renderDownloadableOptions = () => {\n if (data?.attributes) {\n const downloadableAttributes = data.attributes.filter(\n (attr) =>\n attr.id === 'ac_downloadable' &&\n attr.roles?.includes('visible_in_pdp')\n );\n\n if (downloadableAttributes.length > 0) {\n const downloadableElements = downloadableAttributes.map(\n (downloadableAttr, index) => {\n try {\n const downloadableValue =\n typeof downloadableAttr.value === 'string'\n ? JSON.parse(downloadableAttr.value)\n : downloadableAttr.value;\n\n return (\n <DownloadableOptions\n key={`downloadable-${index}`}\n label={downloadableAttr.label}\n value={downloadableValue}\n onLinkChange={(uid: string, selected: boolean) => {\n const prevUIDs = values.optionsUIDs || [];\n let newOptionsUIDs;\n\n if (selected) {\n if (!prevUIDs.includes(uid)) {\n newOptionsUIDs = [...prevUIDs, uid];\n } else {\n newOptionsUIDs = prevUIDs;\n }\n } else {\n newOptionsUIDs = prevUIDs.filter(\n (id: string) => id !== uid\n );\n }\n\n handleOnValues({ optionsUIDs: newOptionsUIDs });\n }}\n currency={data.prices?.final?.currency}\n className=\"pdp-product__downloadable-options\"\n />\n );\n } catch (error) {\n console.warn('Invalid downloadable data format:', error);\n return null;\n }\n }\n );\n\n // Filter out null values and return a wrapper div\n const validElements = downloadableElements.filter(\n (element) => element !== null\n );\n return validElements.length > 0 ? (\n <div className=\"pdp-product__downloadable-options-container\">\n {validElements}\n </div>\n ) : undefined;\n }\n }\n return undefined;\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n giftCardOptions={renderGiftCardOptions()}\n downloadableOptions={renderDownloadableOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && (\n <Icon source={nextSeparator} />\n );\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n separator,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={separator}\n categories={prev.categories}\n />,\n ],\n };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), link];\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), vnode];\n\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: data?.shortDescription ?? '',\n }}\n />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices?.final}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data?.prices?.regular &&\n data?.prices?.final?.amount !== data?.prices?.regular?.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices?.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n zoomType={zoomType}\n closeButton={closeButton}\n carouselConfig={{\n ...carousel,\n thumbnails:\n carousel && Object.keys(carousel).length\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\n/** @deprecated This method is part of the deprecated ProductDetails component. */\nProductDetails.getInitialData = async function ({\n sku,\n disableDropdownPreselection = false,\n optionsConfig,\n}) {\n const initialData = config.getConfig().models?.ProductDetails?.initialData;\n\n return initialData\n ? transformProductData(initialData)\n : fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n });\n};\n"],"names":["ProductDetails","sku","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","children","initialData","carousel","optionsConfig","useACDL","onAddToCart","zoomType","closeButton","disableDropdownPreselection","props","AddToCartLabel","useText","IncrementerLabel","DetailsLabel","ChooseOptionLabel","locale","setLocale","useState","config","selectionsToUpdate","setSelectionsToUpdate","data","setData","values","setValues","initialQuantity","getValidatedQuantityFromUrl","defaultValues","valid","setValid","_a","isProductOptionsSelectionComplete","defaultSlotContext","hasProductViewOptionValueProduct","options","option","useEffect","dataEvent","events","payload","prev","updateDataEvent","localeEvent","fetchProductData","publishProductPageViewEvent","handleOnValues","useCallback","newValues","handleOptionSelected","selections","sanitizedSelections","value","optionsUIDs","selectionMapToOptionUIDs","setUrlParams","next","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","item","handleOnErrors","_errors","attributes","useMemo","label","id","key","__html","isDateValid","toDateString","jsx","quantity","Slot","Incrementer","quantityValue","renderOptions","Swatches","renderGiftCardOptions","giftCardAttributes","attr","validElements","giftCardAttr","index","giftCardData","prevOptions","optionValues","existingOption","opt","GiftCardOptions","uid","idx","field","newEnteredOptions","updatedData","updatedOptions","error","element","renderDownloadableOptions","downloadableAttributes","downloadableAttr","downloadableValue","DownloadableOptions","selected","prevUIDs","newOptionsUIDs","_b","Product","callback","attrs","nextSeparator","separator","Icon","Breadcrumbs","text","p","link","categories","domElement","vnode","_button","icon","buttonProps","button","Button","url","Image","PriceRange","_c","toLanguageTag","_d","_e","_g","_f","_i","_h","_j","_k","jsxs","Fragment","transformProductData"],"mappings":"k0BAkLO,MAAMA,GAGT,CAAC,CACH,IAAAC,EACA,QAAAC,EACA,aAAAC,EACA,qBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,cAAAC,EACA,wBAAAC,GACA,MAAAC,EACA,SAAAC,GACA,YAAAC,EACA,SAAAC,EACA,cAAAC,EACA,QAAAC,GACA,YAAAC,EACA,SAAAC,GACA,YAAAC,GAAc,GACd,4BAAAC,EACA,GAAGC,EACL,IAAM,sCAEJ,MAAMC,EAAiBC,EAAQ,6BAA6B,EAAE,MACxDC,GAAmBD,EAAQ,+BAA+B,EAAE,MAC5DE,GAAeF,EAAQ,2BAA2B,EAAE,MACpDG,GAAoBH,EAAQ,iCAAiC,EAAE,MAG/D,CAACI,EAAQC,EAAS,EAAIC,EACzBC,GAAO,UAAA,EAAY,eAA0B,OAAA,EAG1C,CAACC,GAAoBC,EAAqB,EAAIH,EAAA,EAE9C,CAACI,EAAO,KAAMC,CAAO,EAAIL,EAAShB,CAAW,EAE7C,CAACsB,EAAQC,CAAS,EAAIP,EAAiB,IAAM,CACjD,MAAMQ,EAAkBC,GAA4B,CAAC,EAE/CC,EAAwB,CAC5B,IAAApC,EACA,SAAUkC,CAAA,EAGZ,OAAIJ,GAAA,MAAAA,EAAM,aACRM,EAAc,YAAcN,EAAK,YAE5BM,CACT,CAAC,EAGK,CAACC,EAAOC,CAAQ,EAAIZ,EAAS,IAAM,OACvC,OAAKa,EAAAT,GAAA,YAAAA,EAAM,UAAN,MAAAS,EAAe,OAGbC,EACLV,EAAK,QACLA,EAAK,WACLA,EAAK,QAAA,EALE,EAOX,CAAC,EACKW,EAAyC,CAAE,KAAAX,EAAM,OAAAE,EAAQ,MAAAK,CAAA,EAE/D,SAASK,EAAiCC,EAA0B,CAClE,OAAOA,GAAA,YAAAA,EAAS,KACbC,IAAWA,GAAA,YAAAA,EAAQ,YAAa,gCAErC,CAEAC,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAaC,GAAY,CAC/CA,IACFjB,EAAQiB,CAAO,EAEff,EAAWgB,IAAkB,CAC3B,GAAGA,EACH,IAAKD,EAAQ,IACb,YAAaA,EAAQ,UAAA,EACrB,EAEN,CAAC,EAGKE,EAAkBH,EAAO,GAC7B,gBACCC,GAA6B,CAC5Bf,EAAWgB,IAAkB,CAAE,GAAGA,EAAM,GAAGD,GAAU,CACvD,CAAA,EAGF,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAiB,MACjBJ,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,CAAA,CAAE,EAGLD,EAAU,IAAM,CACd,MAAMM,EAAcJ,EAAO,GAAG,SAAWC,GAAoB,CACvDA,IAAYxB,IAEhBC,GAAUuB,CAAe,EAEzBI,EAAiBpD,EAAK,CACpB,qBAAsB,CAACiB,EACvB,QAASL,GAAA,YAAAA,EAAe,aAAA,CACzB,EAAE,KAAKmB,CAAO,EACjB,CAAC,EACD,MAAO,IAAM,CACXoB,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAClC,EAA6BO,EAAQZ,GAAA,YAAAA,EAAe,cAAeZ,CAAG,CAAC,EAE3E6C,EAAU,IAAM,CACVhC,IAAWH,GAAe,OAAO,KAAKA,CAAW,EAAE,OAAS,GAC9D2C,GAA4B3C,CAAW,CAG3C,EAAG,CAACA,CAAW,CAAC,EAGhB,MAAM4C,EAAiBC,EAAaC,GAA+B,CACjEvB,EAAWgB,IAAU,CAAE,GAAGA,EAAM,GAAGO,GAAY,CACjD,EAAG,CAAA,CAAE,EAELX,EAAU,IAAM,CACdE,EAAO,KAAK,aAAcf,CAAM,CAElC,EAAG,CAAC,KAAK,UAAUA,CAAM,CAAC,CAAC,EAE3B,MAAMyB,GAAuBF,EAC3B,MAAOG,GAA0C,OAE/C,MAAMC,EAAsB,OAAO,YACjC,OAAO,QAAQD,CAAU,EAAE,OACzB,CAAC,EAAGE,CAAK,IAAMA,EAAM,QAAUrC,EAAA,CACjC,EAGF,IAAIsC,EAAcC,GAChBH,EACA7B,GAAA,YAAAA,EAAM,OAAA,EAON,CAACxB,IACDwB,GAAA,MAAAA,EAAM,UACN,CAACY,EAAiCZ,EAAK,OAAO,GAE9CiC,GAAa,CAAE,YAAaF,EAAY,KAAK,GAAG,EAAG,EAIrDP,EAAe,CAAE,YAAAO,EAAa,EAG9B,MAAMG,EAAO,MAAMZ,EAAiBpD,EAAK,CACvC,QAASY,GAAA,YAAAA,EAAe,cACxB,SAAUkB,GAAA,YAAAA,EAAM,SAChB,YAAA+B,EACA,qBAAsB,CAAC5C,CAAA,CACxB,EAEDc,EAAQiC,CAAI,EACZ1B,EACEE,EACEwB,GAAA,YAAAA,EAAM,SACNA,GAAA,YAAAA,EAAM,aAAcH,EACpBG,GAAA,YAAAA,EAAM,QAAA,CACR,GAIEzB,EAAA3B,GAAA,YAAAA,EAAe,gBAAf,MAAA2B,EAA8B,QAChC0B,GAAeD,EAAMH,CAAW,CAEpC,EAEA,CAAC7D,CAAG,CAAA,EAGAiE,GAAiBV,EACrB,CAACS,EAA2BE,IAAkC,CAC5D,MAAMC,GAAqBH,GAAA,YAAAA,EAAM,aAAc,CAAA,EACxBE,EAAoB,MAAOE,GAChDD,EAAmB,SAASC,CAAI,CAAA,IAGhCvC,GAAsBmC,GAAA,YAAAA,EAAM,OAAO,EACnCV,EAAe,CAAE,YAAaa,EAAoB,EAClD7B,EACEE,EACEwB,GAAA,YAAAA,EAAM,QACNG,EACAH,GAAA,YAAAA,EAAM,QAAA,CACR,EAGN,EAEA,CAAChE,CAAG,CAAA,EAGAqE,GAAiBd,EAAae,GAAsC,CACpE,OAAO,KAAKA,CAAO,EAAE,SAAW,KAAY,EAAK,CACvD,EAAG,CAAA,CAAE,EAGCC,EAAaC,GAAQ,IAAM,OAC/B,OAAOjC,EAAAT,GAAA,YAAAA,EAAM,aAAN,YAAAS,EAAkB,IAAI,CAAC,CAAE,MAAAkC,EAAO,MAAAb,EAAO,GAAAc,CAAA,EAAMC,IAAgB,CAElE,GAAID,IAAO,cACT,MAAO,GAGT,MAAME,EAASC,GAAYjB,CAAK,EAC5BkB,GAAalB,EAAOpC,CAAM,EAC1BoC,EAAM,SAAA,EAEV,UACG,KAAA,CAEE,SAAA,CAAAa,EAAM,KAAEM,EAAC,OAAA,CAAK,wBAAyB,CAAE,OAAAH,EAAO,CAAG,CAAA,CAAA,EAF7CD,CAGT,CAEJ,EACF,EAAG,CAAC7C,GAAA,YAAAA,EAAM,WAAYN,CAAM,CAAC,EAEvBwD,GACJ,CAAC9E,IAAgB4B,GAAA,MAAAA,EAAM,SACrBiD,EAACE,EAAA,CACC,KAAK,WACL,KAAMzE,GAAA,YAAAA,EAAO,SACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAACG,GAAA,CAEC,KAAK,WACL,aAAclD,EAAO,SAAS,SAAA,EAC9B,MAAOA,EAAO,SAAS,SAAA,EACvB,IAAK,EACL,aAAYX,GACZ,UAAU,wBACV,QAAU2D,GAAa,CACrB,MAAMG,EAAgB,OAAOH,CAAQ,EACrC1B,EAAe,CAAE,SAAU6B,EAAe,EAGtC,CAAC7E,IAAiBwB,GAAA,MAAAA,EAAM,WAErBY,EAAiCZ,EAAK,OAAO,GAChDiC,GAAa,CAAE,SAAUoB,EAAe,EAG9C,CAAA,EAlBI,UAAA,CAmBN,CAAA,EAEA,OAEAC,GAAgB,IAAM,CAC1B,GAAItD,GAAA,MAAAA,EAAM,QACR,OACEiD,EAACE,EAAA,CACC,KAAK,UACL,KAAMzE,GAAA,YAAAA,EAAO,QACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAACM,GAAA,CACC,aAAcrD,EAAO,YACrB,QAASF,EAAK,QACd,eAAgBE,EAAO,YACvB,mBAAAJ,GACA,kBAAmBrB,GACnB,qBAAsBU,EACtB,SAAUwC,GACV,SAAUY,EAAA,CAAA,CACZ,CAAA,CAIR,EAEMiB,GAAwB,IAAM,CAClC,GAAIxD,GAAA,MAAAA,EAAM,WAAY,CACpB,MAAMyD,EAAqBzD,EAAK,WAAW,OACxC0D,GAASA,EAAK,KAAO,aAAA,EAGxB,GAAID,EAAmB,OAAS,EAAG,CA0FjC,MAAME,EAzFmBF,EAAmB,IAC1C,CAACG,EAAcC,IAAU,OACvB,GAAI,CACF,MAAMC,EAAe,KAAK,MAAMF,EAAa,KAAK,EAC5CG,EAAc7D,EAAO,gBAAkB,CAAA,EACvC8D,IACJvD,EAAAqD,EAAa,UAAb,YAAArD,EAAsB,IAAKK,GAAgB,CACzC,MAAMmD,EAAiBF,EAAY,KAChCG,GACCA,EAAI,MAAQpD,EAAO,GAAA,EAEvB,MAAO,CACL,GAAIA,EAAO,IACX,OAAOmD,GAAA,YAAAA,EAAgB,QAAS,EAAA,CAEpC,KAAM,CAAA,EAER,OACEhB,EAACkB,GAAA,CAEC,QAASL,EAAa,SAAW,CAAA,EACjC,aAAAE,EACA,eAAgB,CAACI,EAAatC,IAAkB,QAC9C,MAAMiC,EAAc7D,EAAO,gBAAkB,CAAA,EACvCmE,EAAMN,EAAY,UACrBO,GACCA,EAAM,MAAQF,CAAA,EAElB,IAAIG,EAYJ,GAXIF,IAAQ,GACVE,EAAoBR,EAAY,IAC7BO,GACCA,EAAM,MAAQF,EAAM,CAAE,GAAGE,EAAO,MAAAxC,GAAUwC,CAAA,EAG9CC,EAAoB,CAAC,GAAGR,EAAa,CAAE,IAAAK,EAAK,MAAAtC,EAAO,EAGrDN,EAAe,CAAE,eAAgB+C,EAAmB,EAEhDvE,EAAM,CACR,MAAMwE,EAAc,CAAE,GAAGxE,CAAA,EACnByD,KACJhD,GAAA+D,EAAY,aAAZ,YAAA/D,GAAwB,IAAKiD,GAAS,QACpC,GAAIA,EAAK,KAAO,cACd,GAAI,CACF,MAAMI,EAAe,KAAK,MAAMJ,EAAK,KAAK,EACpCe,KACJX,GAAAA,EAAa,UAAbA,YAAAA,GAAsB,IAAKhD,GACrBA,EAAO,MAAQsD,EACV,CAAE,GAAGtD,EAAQ,MAAAgB,CAAA,EAEfhB,KACH,CAAA,EACR,MAAO,CACL,GAAG4C,EACH,MAAO,KAAK,UAAU,CACpB,GAAGI,EACH,QAASW,EAAA,CACV,CAAA,CAEL,MAAgB,CACd,OAAOf,CACT,CAEF,OAAOA,CACT,KAAM,CAAA,EACRc,EAAY,WAAaf,GACzBxD,EAAQuE,CAAW,CACrB,CACF,EACA,mBAAqBjE,GAAmB,CACjCA,GACHgC,GAAe,CAAE,SAAU,yBAA0B,EAGvD/B,EAASD,CAAK,CAChB,EACA,UAAU,gCAAA,EA3DL,YAAYsD,CAAK,EAAA,CA8D5B,OAASa,EAAO,CACd,eAAQ,KAAK,iCAAkCA,CAAK,EAC7C,IACT,CACF,CAAA,EAIqC,OACpCC,GAAYA,IAAY,IAAA,EAE3B,OAAOhB,EAAc,OAAS,EAC5BV,EAAC,OAAI,UAAU,2CACZ,WACH,EACE,MACN,CACF,CAEF,EAEM2B,GAA4B,IAAM,CACtC,GAAI5E,GAAA,MAAAA,EAAM,WAAY,CACpB,MAAM6E,EAAyB7E,EAAK,WAAW,OAC5C0D,UACC,OAAAA,EAAK,KAAO,qBACZjD,EAAAiD,EAAK,QAAL,YAAAjD,EAAY,SAAS,mBAAgB,EAGzC,GAAIoE,EAAuB,OAAS,EAAG,CA4CrC,MAAMlB,EA3CuBkB,EAAuB,IAClD,CAACC,EAAkBjB,IAAU,SAC3B,GAAI,CACF,MAAMkB,EACJ,OAAOD,EAAiB,OAAU,SAC9B,KAAK,MAAMA,EAAiB,KAAK,EACjCA,EAAiB,MAEvB,OACE7B,EAAC+B,GAAA,CAEC,MAAOF,EAAiB,MACxB,MAAOC,EACP,aAAc,CAACX,EAAaa,IAAsB,CAChD,MAAMC,EAAWhF,EAAO,aAAe,CAAA,EACvC,IAAIiF,EAEAF,EACGC,EAAS,SAASd,CAAG,EAGxBe,EAAiBD,EAFjBC,EAAiB,CAAC,GAAGD,EAAUd,CAAG,EAKpCe,EAAiBD,EAAS,OACvBtC,GAAeA,IAAOwB,CAAA,EAI3B5C,EAAe,CAAE,YAAa2D,EAAgB,CAChD,EACA,UAAUC,GAAA3E,EAAAT,EAAK,SAAL,YAAAS,EAAa,QAAb,YAAA2E,EAAoB,SAC9B,UAAU,mCAAA,EAtBL,gBAAgBvB,CAAK,EAAA,CAyBhC,OAASa,EAAO,CACd,eAAQ,KAAK,oCAAqCA,CAAK,EAChD,IACT,CACF,CAAA,EAIyC,OACxCC,GAAYA,IAAY,IAAA,EAE3B,OAAOhB,EAAc,OAAS,EAC5BV,EAAC,OAAI,UAAU,8CACZ,WACH,EACE,MACN,CACF,CAEF,EAEA,OACEA,EAAC,MAAA,CAAK,GAAG7D,GACP,SAAA6D,EAACoC,GAAA,CACC,MACEpC,EAACE,EAAA,CACC,KAAK,QACL,KAAMzE,GAAA,YAAAA,EAAO,MACb,QAAS,CAAE,GAAGiC,CAAA,EAEb,SAAAX,GAAA,YAAAA,EAAM,IAAA,CAAA,EAGX,IACG7B,EAQG,OAPF8E,EAACE,EAAA,CACC,KAAK,MACL,KAAMzE,GAAA,YAAAA,EAAO,IACb,QAAS,CAAE,GAAGiC,CAAA,EAEb,SAAAX,GAAA,YAAAA,EAAM,GAAA,CAAA,EAIb,QAASsD,GAAA,EACT,gBAAiBE,GAAA,EACjB,oBAAqBoB,GAAA,EACrB,aACElG,GAAA,YAAAA,EAAO,cACLuE,EAACE,EAAA,CACC,KAAK,cACL,KAAMzE,GAAA,YAAAA,EAAO,YACb,QAAS,CACP,GAAGiC,EAEH,aAAa2E,EAAU,CACrB,KAAK,gBAAgB,IAAIC,IAAU,CACjC,MAAMC,EAAgBF,EAAS,GAAGC,CAAK,EAEjCE,EAAYD,GAChBvC,EAACyC,EAAA,CAAK,OAAQF,EAAe,EAG/B,KAAK,UAAWrE,IACP,CACL,GAAGA,EACH,UAAAsE,EACA,SAAU,CAERxC,EAAC0C,EAAA,CACC,UAAAF,EACA,WAAYtE,EAAK,UAAA,CAAA,CACnB,CACF,EAEH,CACH,CAAC,CACH,EAEA,WAAWmE,EAAU,CACnB,KAAK,gBAAgB,IAAIC,IAAU,CACjC,KAAM,CAAE,KAAAK,EAAM,GAAGC,GAAMP,EAAS,GAAGC,CAAK,EAElCO,EAAO7C,EAAC,IAAA,CAAG,GAAG4C,EAAI,SAAAD,EAAK,EAE7B,KAAK,UAAWzE,GAAc,CAC5B,MAAM4E,EAAa,CAAC,GAAI5E,EAAK,YAAc,CAAA,EAAK2E,CAAI,EACpD,MAAO,CACL,GAAG3E,EACH,WAAA4E,EACA,SAAU,CAER9C,EAAC0C,EAAA,CACC,UAAWxE,EAAK,UAChB,WAAA4E,CAAA,CAAA,CACF,CACF,CAEJ,CAAC,CACH,CAAC,CACH,EAEA,kBAAkBT,EAAU,CAC1B,KAAK,gBAAgB,IAAIC,IAAU,CACjC,MAAMS,EAAaV,EAAS,GAAGC,CAAK,EAE9BU,EAAQ,KAAK,oBAAoBD,CAAU,EAEjD,KAAK,UAAW7E,GAAc,CAC5B,MAAM4E,EAAa,CAAC,GAAI5E,EAAK,YAAc,CAAA,EAAK8E,CAAK,EAErD,MAAO,CACL,GAAG9E,EACH,WAAA4E,EACA,SAAU,CAER9C,EAAC0C,EAAA,CACC,UAAWxE,EAAK,UAChB,WAAA4E,CAAA,CAAA,CACF,CACF,CAEJ,CAAC,CACH,CAAC,CACH,CAAA,CACF,CAAA,EAIN,SAAA7C,GACA,QACED,EAACE,EAAA,CACC,KAAK,UACL,KAAMzE,GAAA,YAAAA,EAAO,QACb,QAAS,CACP,GAAGiC,EAEH,aAAa2E,EAAU,CACrB,KAAK,gBAAgB,IAAIC,IAAU,CACjC,MAAMW,EAAUZ,EAAS,GAAGC,CAAK,EAEjC,GAAI,CAACW,EAAS,OAEd,KAAM,CAAE,KAAAN,EAAM,KAAAO,EAAM,GAAGC,GAAgBF,EAEjCG,EACJpD,EAACqD,GAAA,CACC,KAAK,SACJ,GAAGF,EACJ,KAAMD,GAAQlD,EAACyC,EAAA,CAAK,OAAQS,EAAM,EAEjC,SAAAP,CAAA,CAAA,EAIL,KAAK,UAAWzE,IAAe,CAC7B,SAAU,CAAC,GAAIA,EAAK,UAAY,CAAA,EAAKkF,CAAM,CAAA,EAC3C,CACJ,CAAC,CACH,CAAA,EAKA,SAAA,EAAC3H,GAAA,MAAAA,EAAO,UACNuE,EAACqD,GAAA,CACC,KAAK,SACL,KAAK,SACL,KAAMrD,EAACyC,EAAA,CAAK,OAAO,MAAA,CAAO,EAC1B,SAAU,EAAC1F,GAAA,MAAAA,EAAM,UAAW,CAACO,EAC7B,aAAYlB,EACZ,QAAS,IACAL,GAAA,YAAAA,EAAckB,GAGtB,SAAAb,CAAA,CAAA,CACH,CAAA,EAKR,iBACGhB,EAaG,OAZF4E,EAACE,EAAA,CACC,KAAK,mBACL,KAAMzE,GAAA,YAAAA,EAAO,iBACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAAC,MAAA,CAEC,wBAAyB,CACvB,QAAQjD,GAAA,YAAAA,EAAM,mBAAoB,EAAA,CACpC,CAAA,CACF,CAAA,EAIN,YACG1B,EAWG,OAVF2E,EAACE,EAAA,CACC,KAAK,cACL,KAAMzE,GAAA,YAAAA,EAAO,YACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQjD,GAAA,YAAAA,EAAM,cAAe,EAAA,CAAG,CAAA,CAC7D,CAAA,EAIN,SACES,GAAAT,GAAA,YAAAA,EAAM,SAAN,YAAAS,GAAc,IAAI,CAAC,CAAE,MAAAkC,EAAO,IAAA4D,cAC1B,OAAAtD,EAACuD,GAAA,CAEC,MAAO7D,EACP,IAAKA,EACL,IAAK4D,EAGL,QAAO9F,EAAA5B,GAAA,YAAAA,EAAU,cAAV,YAAA4B,EAAuB,QAAS,IACvC,SAAQ2E,EAAAvG,GAAA,YAAAA,EAAU,cAAV,YAAAuG,EAAuB,SAAU,KACzC,QAAQvG,GAAA,YAAAA,EAAU,cAAe,CAAE,MAAO,GAAA,CAAI,EARzC0H,CAAA,MAUH,CAAA,EAER,cACEnB,GAAApF,GAAA,YAAAA,EAAM,SAAN,MAAAoF,GAAc,QACZnC,EAACE,EAAA,CACC,KAAK,eACL,KAAMzE,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAACwD,GAAA,CACE,IAAGC,GAAA1G,EAAK,SAAL,YAAA0G,GAAa,MACjB,OAAQC,GAAcjH,CAAM,CAAA,CAAA,CAC9B,CAAA,EAEA,OAEN,OACEkH,GAAA5G,GAAA,YAAAA,EAAM,SAAN,MAAA4G,GAAc,WACdC,GAAA7G,GAAA,YAAAA,EAAM,SAAN,MAAA6G,GAAc,YACdC,IAAAC,GAAA/G,GAAA,YAAAA,EAAM,SAAN,YAAA+G,GAAc,QAAd,YAAAD,GAAqB,YAAWE,IAAAC,GAAAjH,GAAA,YAAAA,EAAM,SAAN,YAAAiH,GAAc,UAAd,YAAAD,GAAuB,QACrD/D,EAACE,EAAA,CACC,KAAK,eACL,KAAMzE,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,GAAGiC,CAAA,EAEd,SAAAsC,EAACwD,GAAA,CACE,IAAGS,GAAAlH,EAAK,SAAL,YAAAkH,GAAa,QACjB,OAAQP,GAAcjH,CAAM,CAAA,CAAA,CAC9B,CAAA,EAEA,OAEN,SAAAT,GACA,YAAAC,GACA,eAAgB,CACd,GAAGL,EACH,WACEA,GAAY,OAAO,KAAKA,CAAQ,EAAE,SAC9BsI,GAAAnH,GAAA,YAAAA,EAAM,SAAN,YAAAmH,GAAc,IAAI,CAAC,CAAE,MAAAxE,EAAO,IAAA4D,KAAI,SAC9B,OAAAtD,EAACuD,GAAA,CAEC,MAAO7D,EACP,IAAKA,EACL,IAAK4D,EAGL,QAAO9F,EAAA5B,GAAA,YAAAA,EAAU,kBAAV,YAAA4B,EAA2B,QAAS,IAC3C,SAAQ2E,EAAAvG,GAAA,YAAAA,EAAU,kBAAV,YAAAuG,EAA2B,SAAU,IAC7C,QAAQvG,GAAA,YAAAA,EAAU,kBAAmB,CAAE,MAAO,GAAA,CAAI,EAR7C0H,CAAA,MAUH,CAAA,EACN,CAAA,CAAC,EAET,WAAY,EAACvG,GAAA,MAAAA,EAAM,SACnB,WACGzB,EAaG,OAZF0E,EAACE,EAAA,CACC,KAAK,aACL,KAAMzE,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGiC,CAAA,EAEb,SAAA8B,GAAA,MAAAA,EAAY,OACX2E,GAAAC,GAAA,CACG,SAAA,CAAA7H,GACDyD,EAAC,MAAI,SAAAR,CAAA,CAAW,CAAA,CAAA,CAClB,EACE,IAAA,CAAA,EAIV,gBACE/D,GAAA,YAAAA,EAAO,iBACLuE,EAACE,EAAA,CACC,KAAK,iBACL,KAAMzE,EAAM,eACZ,QAAS,CAAE,GAAGiC,CAAA,CAAmB,CAAA,EAIvC,aACEjC,GAAA,YAAAA,EAAO,cACLuE,EAACE,EAAA,CACC,KAAK,cACL,KAAMzE,EAAM,YACZ,QAAS,CAAE,GAAGiC,CAAA,CAAmB,CAAA,EAIvC,gBACEjC,GAAA,YAAAA,EAAO,UACLuE,EAACE,EAAA,CACC,KAAK,UACL,KAAMzE,EAAM,QACZ,QAAS,CAAE,GAAGiC,CAAA,CAAmB,CAAA,CACnC,CAAA,EAIR,CAEJ,EAGA1C,GAAe,eAAiB,eAAgB,CAC9C,IAAAC,EACA,4BAAAiB,EAA8B,GAC9B,cAAAL,CACF,EAAG,SACD,MAAMF,GAAcwG,GAAA3E,EAAAZ,GAAO,UAAA,EAAY,SAAnB,YAAAY,EAA2B,iBAA3B,YAAA2E,EAA2C,YAE/D,OAAOxG,EACH0I,GAAqB1I,CAAW,EAChC0C,EAAiBpD,EAAK,CACpB,qBAAsB,CAACiB,EACvB,QAASL,GAAA,YAAAA,EAAe,aAAA,CACzB,CACP"}
1
+ {"version":3,"file":"ProductDetails.js","sources":["/@dropins/storefront-pdp/src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe-commerce/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe-commerce/elsie/components';\nimport {\n Product,\n Swatches,\n PriceRange,\n Option,\n GiftCardOptions,\n DownloadableOptions,\n} from '@/pdp/components';\nimport { config, fetchProductData } from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Lang, useText } from '@adobe-commerce/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport {\n isProductOptionsSelectionComplete,\n selectionMapToOptionUIDs,\n type ProductOptionSelectionMap,\n} from '@/pdp/lib/product-option-selection';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel, Option as ProductOption } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\nimport {\n buildBundleOptionQuantitiesFromOptions,\n bundleOptionQuantitiesToEnteredOptions,\n mergeBundleOptionQuantities,\n} from '@/pdp/lib/bundle-option-quantities';\n\ntype IconType = keyof typeof import('@adobe-commerce/elsie/icons');\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n enteredOptions?: Array<{ uid: string; value: string }>;\n bundleOptionQuantities?: Record<string, number>;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type CarouselConfig = {\n controls?: {\n desktop?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n mobile?: 'dots' | 'thumbnailsRow' | null;\n };\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n desktop: boolean;\n mobile: boolean;\n };\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\n/** @deprecated This interface is part of the deprecated ProductDetails component. */\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<\n DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }\n >;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<\n DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }\n >;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n useACDL?: boolean;\n onAddToCart?: (values: Values) => void;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n disableDropdownPreselection?: boolean;\n}\n\n/**\n * @deprecated This container has been deprecated and will be removed in a future release.\n * Please use the different composable containers to build your product details page.xs\n */\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n useACDL,\n onAddToCart,\n zoomType,\n closeButton = true,\n disableDropdownPreselection,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(\n (config.getConfig().defaultLocale as Lang) || 'en-US'\n );\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1\n\n const defaultValues: Values = {\n sku,\n quantity: initialQuantity,\n };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n\n if (data?.isBundle && data?.options) {\n const bundleOptionQuantities = buildBundleOptionQuantitiesFromOptions(\n data.options,\n data.optionUIDs ?? []\n );\n defaultValues.bundleOptionQuantities = bundleOptionQuantities;\n defaultValues.enteredOptions = bundleOptionQuantitiesToEnteredOptions(\n bundleOptionQuantities\n );\n }\n\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n if (!data?.options?.length) {\n return true;\n }\n return isProductOptionsSelectionComplete(\n data.options,\n data.optionUIDs,\n data.isBundle\n );\n });\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n function hasProductViewOptionValueProduct(options: ProductOption[]) {\n return options?.some(\n (option) => option?.typename === 'ProductViewOptionValueProduct'\n );\n }\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', (payload) => {\n if (payload) {\n setData(payload);\n setValues((prev: Values) => {\n const next: Values = {\n ...prev,\n sku: payload.sku,\n optionsUIDs: payload.optionUIDs,\n };\n\n if (payload.isBundle && payload.options) {\n const bundleOptionQuantities = mergeBundleOptionQuantities(\n prev.bundleOptionQuantities,\n payload.options,\n payload.optionUIDs ?? []\n );\n next.bundleOptionQuantities = bundleOptionQuantities;\n next.enteredOptions = bundleOptionQuantitiesToEnteredOptions(\n bundleOptionQuantities\n );\n }\n\n return next;\n });\n }\n });\n\n // @ts-ignore - Type error with event bus events\n const updateDataEvent = events.on(\n 'pdp/setValues',\n (payload: Partial<Values>) => {\n setValues((prev: Values) => ({ ...prev, ...payload }));\n }\n );\n\n return () => {\n updateDataEvent?.off();\n dataEvent?.off();\n };\n }, []);\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n }).then(setData);\n });\n return () => {\n localeEvent?.off();\n };\n }, [disableDropdownPreselection, locale, optionsConfig?.anchorOptions, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback((newValues: Partial<Values>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n const handleBundleOptionQuantityChange = useCallback(\n (optionValueId: string, quantity: number) => {\n const optionValue = data?.options\n ?.flatMap((option) => option.items)\n .find((item) => item.id === optionValueId);\n\n if (!optionValue?.canEditQuantity) {\n return;\n }\n\n setValues((prev) => {\n const bundleOptionQuantities = {\n ...(prev.bundleOptionQuantities ?? {}),\n [optionValueId]: quantity,\n };\n return {\n ...prev,\n bundleOptionQuantities,\n enteredOptions: bundleOptionQuantitiesToEnteredOptions(\n bundleOptionQuantities\n ),\n };\n });\n },\n [data?.options]\n );\n\n useEffect(() => {\n events.emit('pdp/values', values);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(values)]);\n\n const handleOptionSelected = useCallback(\n async (selections: ProductOptionSelectionMap) => {\n // options Selected\n const sanitizedSelections = Object.fromEntries(\n Object.entries(selections).filter(\n ([, value]) => value.label !== ChooseOptionLabel\n )\n ) as ProductOptionSelectionMap;\n\n let optionsUIDs = selectionMapToOptionUIDs(\n sanitizedSelections,\n data?.options\n );\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the hideURLParams is not set to true and the product is not a bundle type\n if (\n !hideURLParams &&\n data?.options &&\n !hasProductViewOptionValueProduct(data.options)\n ) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n handleOnValues({ optionsUIDs });\n\n // get refined product data and update state\n const next = await fetchProductData(sku, {\n anchors: optionsConfig?.anchorOptions,\n isBundle: data?.isBundle,\n optionsUIDs,\n preselectFirstOption: !disableDropdownPreselection,\n });\n\n setData(next);\n setValid(\n isProductOptionsSelectionComplete(\n next?.options,\n next?.optionUIDs ?? optionsUIDs,\n next?.isBundle\n )\n );\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const processUpdates = useCallback(\n (next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n handleOnValues({ optionsUIDs: updatedOptionsUIDs });\n setValid(\n isProductOptionsSelectionComplete(\n next?.options,\n updatedOptionsUIDs,\n next?.isBundle\n )\n );\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value, id }, key: number) => {\n // Return empty string for gift card attributes\n if (id === 'ac_giftcard') {\n return '';\n }\n\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock && !data?.isBundle ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n value={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n const quantityValue = Number(quantity);\n handleOnValues({ quantity: quantityValue });\n\n // Add quantity to URL parameters if not set to hide\n if (!hideURLParams && data?.options) {\n // Only update URL if the product is not a bundle type\n if (!hasProductViewOptionValueProduct(data.options)) {\n setUrlParams({ quantity: quantityValue });\n }\n }\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot\n name=\"Options\"\n slot={slots?.Options}\n context={{ ...defaultSlotContext }}\n >\n <Swatches\n selectedUIDs={values.optionsUIDs}\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n disablePreselections={disableDropdownPreselection}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n bundleOptionQuantities={values.bundleOptionQuantities}\n onBundleOptionQuantityChange={handleBundleOptionQuantityChange}\n />\n </Slot>\n );\n }\n };\n\n const renderGiftCardOptions = () => {\n if (data?.attributes) {\n const giftCardAttributes = data.attributes.filter(\n (attr) => attr.id === 'ac_giftcard'\n );\n\n if (giftCardAttributes.length > 0) {\n const giftCardElements = giftCardAttributes.map(\n (giftCardAttr, index) => {\n try {\n const giftCardData = JSON.parse(giftCardAttr.value);\n const prevOptions = values.enteredOptions || [];\n const optionValues =\n giftCardData.options?.map((option: any) => {\n const existingOption = prevOptions.find(\n (opt: { uid: string; value: string }) =>\n opt.uid === option.uid\n );\n return {\n id: option.uid,\n value: existingOption?.value || '',\n };\n }) || [];\n\n return (\n <GiftCardOptions\n key={`giftcard-${index}`}\n options={giftCardData.options || []}\n optionValues={optionValues}\n onOptionChange={(uid: string, value: string) => {\n const prevOptions = values.enteredOptions || [];\n const idx = prevOptions.findIndex(\n (field: { uid: string; value: string }) =>\n field.uid === uid\n );\n let newEnteredOptions;\n if (idx !== -1) {\n newEnteredOptions = prevOptions.map(\n (field: { uid: string; value: string }) =>\n field.uid === uid ? { ...field, value } : field\n );\n } else {\n newEnteredOptions = [...prevOptions, { uid, value }];\n }\n\n handleOnValues({ enteredOptions: newEnteredOptions });\n\n if (data) {\n const updatedData = { ...data };\n const giftCardAttributes =\n updatedData.attributes?.map((attr) => {\n if (attr.id === 'ac_giftcard') {\n try {\n const giftCardData = JSON.parse(attr.value);\n const updatedOptions =\n giftCardData.options?.map((option: any) => {\n if (option.uid === uid) {\n return { ...option, value };\n }\n return option;\n }) || [];\n return {\n ...attr,\n value: JSON.stringify({\n ...giftCardData,\n options: updatedOptions,\n }),\n };\n } catch (error) {\n return attr;\n }\n }\n return attr;\n }) || [];\n updatedData.attributes = giftCardAttributes;\n setData(updatedData);\n }\n }}\n onValidationChange={(valid: boolean) => {\n if (!valid) {\n handleOnErrors({ giftCard: 'Invalid gift card data' });\n }\n\n setValid(valid);\n }}\n className=\"pdp-product__gift-card-options\"\n />\n );\n } catch (error) {\n console.warn('Invalid gift card data format:', error);\n return null;\n }\n }\n );\n\n // Filter out null values and return a single element\n const validElements = giftCardElements.filter(\n (element) => element !== null\n );\n return validElements.length > 0 ? (\n <div className=\"pdp-product__gift-card-options-container\">\n {validElements}\n </div>\n ) : undefined;\n }\n }\n return undefined;\n };\n\n const renderDownloadableOptions = () => {\n if (data?.attributes) {\n const downloadableAttributes = data.attributes.filter(\n (attr) =>\n attr.id === 'ac_downloadable' &&\n attr.roles?.includes('visible_in_pdp')\n );\n\n if (downloadableAttributes.length > 0) {\n const downloadableElements = downloadableAttributes.map(\n (downloadableAttr, index) => {\n try {\n const downloadableValue =\n typeof downloadableAttr.value === 'string'\n ? JSON.parse(downloadableAttr.value)\n : downloadableAttr.value;\n\n return (\n <DownloadableOptions\n key={`downloadable-${index}`}\n label={downloadableAttr.label}\n value={downloadableValue}\n onLinkChange={(uid: string, selected: boolean) => {\n const prevUIDs = values.optionsUIDs || [];\n let newOptionsUIDs;\n\n if (selected) {\n if (!prevUIDs.includes(uid)) {\n newOptionsUIDs = [...prevUIDs, uid];\n } else {\n newOptionsUIDs = prevUIDs;\n }\n } else {\n newOptionsUIDs = prevUIDs.filter(\n (id: string) => id !== uid\n );\n }\n\n handleOnValues({ optionsUIDs: newOptionsUIDs });\n }}\n currency={data.prices?.final?.currency}\n className=\"pdp-product__downloadable-options\"\n />\n );\n } catch (error) {\n console.warn('Invalid downloadable data format:', error);\n return null;\n }\n }\n );\n\n // Filter out null values and return a wrapper div\n const validElements = downloadableElements.filter(\n (element) => element !== null\n );\n return validElements.length > 0 ? (\n <div className=\"pdp-product__downloadable-options-container\">\n {validElements}\n </div>\n ) : undefined;\n }\n }\n return undefined;\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n giftCardOptions={renderGiftCardOptions()}\n downloadableOptions={renderDownloadableOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && (\n <Icon source={nextSeparator} />\n );\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n separator,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={separator}\n categories={prev.categories}\n />,\n ],\n };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), link];\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), vnode];\n\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: data?.shortDescription ?? '',\n }}\n />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices?.final}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data?.prices?.regular &&\n data?.prices?.final?.amount !== data?.prices?.regular?.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices?.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n zoomType={zoomType}\n closeButton={closeButton}\n carouselConfig={{\n ...carousel,\n thumbnails:\n carousel && Object.keys(carousel).length\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\n/** @deprecated This method is part of the deprecated ProductDetails component. */\nProductDetails.getInitialData = async function ({\n sku,\n disableDropdownPreselection = false,\n optionsConfig,\n}) {\n const initialData = config.getConfig().models?.ProductDetails?.initialData;\n\n return initialData\n ? transformProductData(initialData)\n : fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n });\n};\n"],"names":["ProductDetails","sku","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","children","initialData","carousel","optionsConfig","useACDL","onAddToCart","zoomType","closeButton","disableDropdownPreselection","props","AddToCartLabel","useText","IncrementerLabel","DetailsLabel","ChooseOptionLabel","locale","setLocale","useState","config","selectionsToUpdate","setSelectionsToUpdate","data","setData","values","setValues","initialQuantity","getValidatedQuantityFromUrl","defaultValues","bundleOptionQuantities","buildBundleOptionQuantitiesFromOptions","bundleOptionQuantitiesToEnteredOptions","valid","setValid","_a","isProductOptionsSelectionComplete","defaultSlotContext","hasProductViewOptionValueProduct","options","option","useEffect","dataEvent","events","payload","prev","next","mergeBundleOptionQuantities","updateDataEvent","localeEvent","fetchProductData","publishProductPageViewEvent","handleOnValues","useCallback","newValues","handleBundleOptionQuantityChange","optionValueId","quantity","optionValue","item","handleOptionSelected","selections","sanitizedSelections","value","optionsUIDs","selectionMapToOptionUIDs","setUrlParams","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","handleOnErrors","_errors","attributes","useMemo","label","id","key","__html","isDateValid","toDateString","jsx","Slot","Incrementer","quantityValue","renderOptions","Swatches","renderGiftCardOptions","giftCardAttributes","attr","validElements","giftCardAttr","index","giftCardData","prevOptions","optionValues","existingOption","opt","GiftCardOptions","uid","idx","field","newEnteredOptions","updatedData","updatedOptions","error","element","renderDownloadableOptions","downloadableAttributes","downloadableAttr","downloadableValue","DownloadableOptions","selected","prevUIDs","newOptionsUIDs","_b","Product","callback","attrs","nextSeparator","separator","Icon","Breadcrumbs","text","p","link","categories","domElement","vnode","_button","icon","buttonProps","button","Button","url","Image","PriceRange","_c","toLanguageTag","_d","_e","_g","_f","_i","_h","_j","_k","jsxs","Fragment","transformProductData"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as O,jsx as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as M,useEffect as D,useRef as G,useMemo as S}from"@dropins/tools/preact-compat.js";import{Slot as K}from"@dropins/tools/lib.js";import{Image as W}from"@dropins/tools/components.js";import{events as L}from"@dropins/tools/event-bus.js";import{getFetchedProductData as a}from"../api.js";import{C as k,O as b,Z as m}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import{useText as P}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/preact.js";const z=[".mp4",".webm",".ogg",".mov",".avi",".mkv"],ee={".mp4":"video/mp4",".webm":"video/webm",".ogg":"video/ogg",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska"};function te(r){if(!r)return"video/mp4";const l=r.toLowerCase(),t=z.find(e=>l.endsWith(e));return t?ee[t]:"video/mp4"}function re(r){if(!r)return!1;const l=r.toLowerCase();return z.some(t=>l.endsWith(t))}function x(r,l){if(l)return l;if(r!=null&&r.includes("adobeaemcloud.com")&&r.endsWith("/play"))return r.replace(/\/play$/,"/as/thumbnail.png")}function oe(r){if(!r)return"";const l=r.match(/(?:youtube\.com\/(?:watch\?v=|embed\/)|youtu\.be\/)([a-zA-Z0-9_-]+)/);if(l)return`https://www.youtube.com/embed/${l[1]}?rel=0`;const t=r.match(/vimeo\.com\/(?:video\/)?(\d+)/);return t?`https://player.vimeo.com/video/${t[1]}`:r}const ne=3e3;function le(r,{enabled:l=!0,timeoutMs:t=ne}={}){const e=r.join("\0"),p=!l||r.length===0,[d,c]=M(null),[u,h]=M(null);return D(()=>{if(p){c(e),h(null);return}let w=!1,n=r.length,y=!1;const g=()=>{w||(w=!0,y&&h(e),c(e))},A=window.setTimeout(()=>{y=!0,g()},t),s=v=>{w||(v&&(y=!0),n-=1,n<=0&&(window.clearTimeout(A),g()))};return r.forEach(v=>{const f=new Image;f.src=v,typeof f.decode=="function"?f.decode().then(()=>s(!1)).catch(()=>s(!0)):(f.onload=()=>s(!1),f.onerror=()=>s(!0))}),()=>{w=!0,window.clearTimeout(A)}},[e,l,t,p]),{ready:p||d===e,error:u===e}}const de=200,ce=(r,l)=>{var d,c;const t=((d=r==null?void 0:r.images)==null?void 0:d.map(u=>({type:"image",url:u.url,label:u.label})))??[];if(!l)return t;const e=((c=r==null?void 0:r.videos)==null?void 0:c.map(u=>({type:"video",url:u.url,label:u.title??"",preview:u.preview})))??[];return(typeof l=="object"?l.position:"last")==="first"?[...e,...t]:[...t,...e]},ie=(r,l)=>{if(!r)return[];const t=(r.images??[]).map(e=>e.url);return l&&(r.videos??[]).forEach(e=>{var d;const p=x(e.url,(d=e.preview)==null?void 0:d.url);p&&t.push(p)}),t},ue=(r,l,t)=>{var u,h;if(r===l)return!0;if(!r||!l)return!1;const e=r.images??[],p=l.images??[];if(e.length!==p.length)return!1;for(let o=0;o<e.length;o+=1)if(e[o].url!==p[o].url)return!1;if(!t)return!0;const d=r.videos??[],c=l.videos??[];if(d.length!==c.length)return!1;for(let o=0;o<d.length;o+=1){if(d[o].url!==c[o].url)return!1;const _=x(d[o].url,(u=d[o].preview)==null?void 0:u.url),w=x(c[o].url,(h=c[o].preview)==null?void 0:h.url);if(_!==w)return!1}return!0},pe=()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,q=({data:r,videos:l,imageParams:t,thumbnailParams:e,zoom:p,slots:d,ImagesLabel:c,onZoom:u})=>{const h=S(()=>({data:r}),[r]),o=S(()=>ce(r,l),[r,l]),_=S(()=>o.length>0?o.map((n,y)=>{const g=({...A})=>{var f;const s={title:n.label,src:n.url,alt:c==null?void 0:c.replace("{product}",n.label).replace("{key}",String(y+1)).replace("{total}",String(o.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:y===0?"eager":"lazy",...A},v=n.type==="video"?x(n.url,(f=n.preview)==null?void 0:f.url):void 0;return i(K,{name:"CarouselMainImage",slot:d==null?void 0:d.CarouselMainImage,context:{...h,defaultImageProps:s,mediaType:n.type,previewUrl:v},children:n.type==="video"?re(n.url)?O("video",{className:"pdp-product-gallery__video",controls:!0,preload:"metadata",poster:v,width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,children:[i("source",{src:n.url,type:te(n.url)}),"Your browser does not support the video tag."]}):i("iframe",{className:"pdp-product-gallery__video-iframe",src:oe(n.url),title:n.label||"Product video",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,loading:"lazy",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0}):i(W,{...s})})};return p&&n.type==="image"?i(m,{closeButton:typeof p=="object"?p.closeButton:!1,children:i(g,{})},n.url):i(g,{onClick:()=>u==null?void 0:u(y)},n.url)}):i("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder"),[c,o,t,p,h,d==null?void 0:d.CarouselMainImage,u]),w=S(()=>o.length>0?o.map((n,y)=>{var s;const g={title:n.label,src:n.url,alt:c==null?void 0:c.replace("{product}",n.label).replace("{key}",String(y+1)).replace("{total}",String(o.length)),width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,params:e??{width:200},loading:"lazy"},A=n.type==="video"?x(n.url,(s=n.preview)==null?void 0:s.url):void 0;return i(K,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:d==null?void 0:d.CarouselThumbnail,context:{...h,defaultImageProps:g,mediaType:n.type,previewUrl:A},children:n.type==="video"?O("span",{className:"pdp-product-gallery__video-thumbnail",role:"img","aria-label":`Play video: ${n.label||"Product video"}`,children:[A?i("img",{src:A,alt:"",width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,loading:"lazy","aria-hidden":"true"}):i("span",{className:"pdp-product-gallery__video-thumbnail-placeholder",style:{width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248},"aria-hidden":"true"}),i("span",{className:"pdp-product-gallery__video-icon","aria-hidden":"true",children:"▶"})]}):i(W,{...g})},n.url)}):i("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,"aria-hidden":!0},"pleaceholder"),[c,o,e,h,d==null?void 0:d.CarouselThumbnail]);return{mediaItems:o,galleryItems:_,thumbnails:w}},fe=({initialData:r=null,scope:l,controls:t="dots",loop:e=!0,peak:p=!1,gap:d=null,arrows:c=!0,arrowsOnMainImage:u=!1,zoom:h=!1,videos:o=!1,imageParams:_,thumbnailParams:w,children:n,slots:y,...g})=>{const A=P("PDP.Product.Image.label").label,[s,v]=M(r),[f,B]=M(null),[H,N]=M(!1),[R,j]=M(null),F=G(r);D(()=>{F.current=s},[s]);const V=G(o);V.current=o,D(()=>{const E=L.on("pdp/data",C=>{if(!C){v(null),B(null),N(!1);return}if(ue(F.current,C,V.current)){v(C),B(null),N(!1);return}B(C),N(!1)},{scope:l});return()=>{E==null||E.off()}},[l]);const Q=S(()=>ie(f,o),[f,o]),{ready:U}=le(Q,{enabled:!!f});D(()=>{if(!f||!U)return;const E=()=>{v(f),B(null),N(!1)};if(pe()){E();return}const C=window.requestAnimationFrame(()=>N(!0)),J=window.setTimeout(E,de+50);return()=>{window.cancelAnimationFrame(C),window.clearTimeout(J)}},[U,f]);const{mediaItems:I,galleryItems:$,thumbnails:Y}=q({data:s,videos:o,imageParams:_,thumbnailParams:w,zoom:h,slots:y,ImagesLabel:A,onZoom:j}),T=q({data:f,videos:o,imageParams:_,thumbnailParams:w,zoom:h,slots:y,ImagesLabel:A});if(!s)return null;const X=["pdp-product-gallery__stack",g.className].filter(Boolean).join(" "),Z=["pdp-product-gallery__layer","pdp-product-gallery__layer--pending",H?"pdp-product-gallery__layer--entering":""].filter(Boolean).join(" ");return O("div",{...g,className:X,children:[i("div",{className:"pdp-product-gallery__layer",children:i(k,{arrows:!!I.length&&c,arrowsOnMainImage:u,controls:I.length?t:void 0,loop:e&&!!I.length,peak:!!I.length&&p,gap:d,defaultIndex:R||0,thumbnails:Y,children:$})}),f?i("div",{className:Z,"aria-hidden":"true",children:i(k,{arrows:!!T.mediaItems.length&&c,arrowsOnMainImage:u,controls:T.mediaItems.length?t:void 0,loop:e&&!!T.mediaItems.length,peak:!!T.mediaItems.length&&p,gap:d,defaultIndex:0,thumbnails:T.thumbnails,children:T.galleryItems})}):null,R===null?null:i(b,{onClose:()=>j(null),centered:!0,children:i(k,{arrows:!!I.length,width:"100%",height:"100%",defaultIndex:R,loop:e&&!!I.length,controls:"dots",isZoomed:!0,children:$})})]})};fe.getInitialData=a;export{fe as ProductGallery,fe as default};
3
+ import{jsxs as O,jsx as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as N,useEffect as B,useRef as $,useMemo as x}from"@dropins/tools/preact-compat.js";import{Slot as G}from"@dropins/tools/lib.js";import{Image as W}from"@dropins/tools/components.js";import{events as L}from"@dropins/tools/event-bus.js";import{getFetchedProductData as a}from"../api.js";import{C as R,O as b,Z as m}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import{useText as P}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/preact.js";const q=[".mp4",".webm",".ogg",".mov",".avi",".mkv"],ee={".mp4":"video/mp4",".webm":"video/webm",".ogg":"video/ogg",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska"};function te(o){if(!o)return"video/mp4";const l=o.toLowerCase(),t=q.find(e=>l.endsWith(e));return t?ee[t]:"video/mp4"}function oe(o){if(!o)return!1;const l=o.toLowerCase();return q.some(t=>l.endsWith(t))}function D(o,l){if(l)return l;if(o!=null&&o.includes("adobeaemcloud.com")&&o.endsWith("/play"))return o.replace(/\/play$/,"/as/thumbnail.png")}function re(o){if(!o)return"";const l=o.match(/(?:youtube\.com\/(?:watch\?v=|embed\/)|youtu\.be\/)([a-zA-Z0-9_-]+)/);if(l)return`https://www.youtube.com/embed/${l[1]}?rel=0`;const t=o.match(/vimeo\.com\/(?:video\/)?(\d+)/);return t?`https://player.vimeo.com/video/${t[1]}`:o}const ne=3e3;function le(o,{enabled:l=!0,timeoutMs:t=ne}={}){const e=o.join("\0"),p=!l||o.length===0,[d,c]=N(null),[u,h]=N(null);return B(()=>{if(p){c(e),h(null);return}let w=!1,n=o.length,y=!1;const g=()=>{w||(w=!0,y&&h(e),c(e))},A=window.setTimeout(()=>{y=!0,g()},t),f=v=>{w||(v&&(y=!0),n-=1,n<=0&&(window.clearTimeout(A),g()))};return o.forEach(v=>{const s=new Image;s.src=v,typeof s.decode=="function"?s.decode().then(()=>f(!1)).catch(()=>f(!0)):(s.onload=()=>f(!1),s.onerror=()=>f(!0))}),()=>{w=!0,window.clearTimeout(A)}},[e,l,t,p]),{ready:p||d===e,error:u===e}}const de=200,ce=(o,l)=>{var d,c;const t=((d=o==null?void 0:o.images)==null?void 0:d.map(u=>({type:"image",url:u.url,label:u.label})))??[];if(!l)return t;const e=((c=o==null?void 0:o.videos)==null?void 0:c.map(u=>({type:"video",url:u.url,label:u.title??"",preview:u.preview})))??[];return(typeof l=="object"?l.position:"last")==="first"?[...e,...t]:[...t,...e]},ie=(o,l)=>{if(!o)return[];const t=(o.images??[]).map(e=>e.url);return l&&(o.videos??[]).forEach(e=>{var d;const p=D(e.url,(d=e.preview)==null?void 0:d.url);p&&t.push(p)}),t},ue=(o,l,t)=>{var u,h;if(o===l)return!0;if(!o||!l)return!1;const e=o.images??[],p=l.images??[];if(e.length!==p.length)return!1;for(let r=0;r<e.length;r+=1)if(e[r].url!==p[r].url)return!1;if(!t)return!0;const d=o.videos??[],c=l.videos??[];if(d.length!==c.length)return!1;for(let r=0;r<d.length;r+=1){if(d[r].url!==c[r].url)return!1;const _=D(d[r].url,(u=d[r].preview)==null?void 0:u.url),w=D(c[r].url,(h=c[r].preview)==null?void 0:h.url);if(_!==w)return!1}return!0},pe=()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,Z=({data:o,videos:l,imageParams:t,thumbnailParams:e,zoom:p,slots:d,ImagesLabel:c,onZoom:u})=>{const h=x(()=>({data:o}),[o]),r=x(()=>ce(o,l),[o,l]),_=x(()=>r.length>0?r.map((n,y)=>{const g=({...f})=>{var I;const v={title:n.label,src:n.url,alt:c==null?void 0:c.replace("{product}",n.label).replace("{key}",String(y+1)).replace("{total}",String(r.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:y===0?"eager":"lazy",...f},s=n.type==="video"?D(n.url,(I=n.preview)==null?void 0:I.url):void 0;return i(G,{name:"CarouselMainImage",slot:d==null?void 0:d.CarouselMainImage,context:{...h,defaultImageProps:v,mediaType:n.type,previewUrl:s},children:n.type==="video"?oe(n.url)?O("video",{className:"pdp-product-gallery__video",controls:!0,preload:"metadata",poster:s,width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,children:[i("source",{src:n.url,type:te(n.url)}),"Your browser does not support the video tag."]}):i("iframe",{className:"pdp-product-gallery__video-iframe",src:re(n.url),title:n.label||"Product video",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,loading:"lazy",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0}):i(W,{...v})})},A=u?{onClick:()=>u(y),onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),u(y))},role:"button",tabIndex:0}:{};return p&&n.type==="image"?i(m,{closeButton:typeof p=="object"?p.closeButton:!1,children:i(g,{})},n.url):i(g,{...A},n.url)}):i("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder"),[c,r,t,p,h,d==null?void 0:d.CarouselMainImage,u]),w=x(()=>r.length>0?r.map((n,y)=>{var f;const g={title:n.label,src:n.url,alt:c==null?void 0:c.replace("{product}",n.label).replace("{key}",String(y+1)).replace("{total}",String(r.length)),width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,params:e??{width:200},loading:"lazy"},A=n.type==="video"?D(n.url,(f=n.preview)==null?void 0:f.url):void 0;return i(G,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:d==null?void 0:d.CarouselThumbnail,context:{...h,defaultImageProps:g,mediaType:n.type,previewUrl:A},children:n.type==="video"?O("span",{className:"pdp-product-gallery__video-thumbnail",role:"img","aria-label":`Play video: ${n.label||"Product video"}`,children:[A?i("img",{src:A,alt:"",width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,loading:"lazy","aria-hidden":"true"}):i("span",{className:"pdp-product-gallery__video-thumbnail-placeholder",style:{width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248},"aria-hidden":"true"}),i("span",{className:"pdp-product-gallery__video-icon","aria-hidden":"true",children:"▶"})]}):i(W,{...g})},n.url)}):i("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(e==null?void 0:e.width)??200,height:(e==null?void 0:e.height)??248,"aria-hidden":!0},"pleaceholder"),[c,r,e,h,d==null?void 0:d.CarouselThumbnail]);return{mediaItems:r,galleryItems:_,thumbnails:w}},fe=({initialData:o=null,scope:l,controls:t="dots",loop:e=!0,peak:p=!1,gap:d=null,arrows:c=!0,arrowsOnMainImage:u=!1,zoom:h=!1,videos:r=!1,imageParams:_,thumbnailParams:w,children:n,slots:y,...g})=>{const A=P("PDP.Product.Image.label").label,[f,v]=N(o),[s,I]=N(null),[z,S]=N(!1),[k,j]=N(null),F=$(o);B(()=>{F.current=f},[f]);const V=$(r);V.current=r,B(()=>{const C=L.on("pdp/data",M=>{if(!M){v(null),I(null),S(!1);return}if(ue(F.current,M,V.current)){v(M),I(null),S(!1);return}I(M),S(!1)},{scope:l});return()=>{C==null||C.off()}},[l]);const H=x(()=>ie(s,r),[s,r]),{ready:K}=le(H,{enabled:!!s});B(()=>{if(!s||!K)return;const C=()=>{v(s),I(null),S(!1)};if(pe()){C();return}const M=window.requestAnimationFrame(()=>S(!0)),J=window.setTimeout(C,de+50);return()=>{window.cancelAnimationFrame(M),window.clearTimeout(J)}},[K,s]);const{mediaItems:T,galleryItems:U,thumbnails:Q}=Z({data:f,videos:r,imageParams:_,thumbnailParams:w,zoom:h,slots:y,ImagesLabel:A,onZoom:j}),E=Z({data:s,videos:r,imageParams:_,thumbnailParams:w,zoom:h,slots:y,ImagesLabel:A});if(!f)return null;const Y=["pdp-product-gallery__stack",g.className].filter(Boolean).join(" "),X=["pdp-product-gallery__layer","pdp-product-gallery__layer--pending",z?"pdp-product-gallery__layer--entering":""].filter(Boolean).join(" ");return O("div",{...g,className:Y,children:[i("div",{className:"pdp-product-gallery__layer",children:i(R,{arrows:!!T.length&&c,arrowsOnMainImage:u,controls:T.length?t:void 0,loop:e&&!!T.length,peak:!!T.length&&p,gap:d,defaultIndex:k||0,thumbnails:Q,children:U})}),s?i("div",{className:X,"aria-hidden":"true",children:i(R,{arrows:!!E.mediaItems.length&&c,arrowsOnMainImage:u,controls:E.mediaItems.length?t:void 0,loop:e&&!!E.mediaItems.length,peak:!!E.mediaItems.length&&p,gap:d,defaultIndex:0,thumbnails:E.thumbnails,children:E.galleryItems})}):null,k===null?null:i(b,{onClose:()=>j(null),centered:!0,children:i(R,{arrows:!!T.length,width:"100%",height:"100%",defaultIndex:k,loop:e&&!!T.length,controls:"dots",isZoomed:!0,children:U})})]})};fe.getInitialData=a;export{fe as ProductGallery,fe as default};
4
4
  //# sourceMappingURL=ProductGallery.js.map