@dropins/storefront-pdp 1.1.2-alpha2 → 1.2.0-alpha6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/api/fetch-graphql/fetch-graphql.d.ts +2 -2
  2. package/api/initialize/initialize.d.ts +3 -3
  3. package/api.js +1 -0
  4. package/api.js.map +1 -0
  5. package/chunks/PriceRange.js +1 -0
  6. package/chunks/PriceRange.js.map +1 -0
  7. package/chunks/Swatches.js +2 -1
  8. package/chunks/Swatches.js.map +1 -0
  9. package/chunks/Zoom.js +1 -0
  10. package/chunks/Zoom.js.map +1 -0
  11. package/chunks/date.js +1 -0
  12. package/chunks/date.js.map +1 -0
  13. package/chunks/getFetchedProductData.js +1 -0
  14. package/chunks/getFetchedProductData.js.map +1 -0
  15. package/chunks/isProductConfigurationValid.js +7 -6
  16. package/chunks/isProductConfigurationValid.js.map +1 -0
  17. package/components/Swatches/Swatches.d.ts +4 -2
  18. package/containers/ProductAttributes/ProductAttributes.d.ts +8 -1
  19. package/containers/ProductAttributes.js +2 -1
  20. package/containers/ProductAttributes.js.map +1 -0
  21. package/containers/ProductDescription/ProductDescription.d.ts +1 -1
  22. package/containers/ProductDescription.js +1 -0
  23. package/containers/ProductDescription.js.map +1 -0
  24. package/containers/ProductDetails/ProductDetails.d.ts +12 -3
  25. package/containers/ProductDetails.js +2 -1
  26. package/containers/ProductDetails.js.map +1 -0
  27. package/containers/ProductGallery/ProductGallery.d.ts +14 -1
  28. package/containers/ProductGallery.js +2 -1
  29. package/containers/ProductGallery.js.map +1 -0
  30. package/containers/ProductHeader/ProductHeader.d.ts +1 -1
  31. package/containers/ProductHeader.js +1 -0
  32. package/containers/ProductHeader.js.map +1 -0
  33. package/containers/ProductOptions/ProductOptions.d.ts +9 -2
  34. package/containers/ProductOptions.js +2 -1
  35. package/containers/ProductOptions.js.map +1 -0
  36. package/containers/ProductPrice/ProductPrice.d.ts +1 -1
  37. package/containers/ProductPrice.js +1 -0
  38. package/containers/ProductPrice.js.map +1 -0
  39. package/containers/ProductQuantity/ProductQuantity.d.ts +1 -1
  40. package/containers/ProductQuantity.js +2 -1
  41. package/containers/ProductQuantity.js.map +1 -0
  42. package/containers/ProductShortDescription/ProductShortDescription.d.ts +1 -1
  43. package/containers/ProductShortDescription.js +1 -0
  44. package/containers/ProductShortDescription.js.map +1 -0
  45. package/fragments.js +1 -0
  46. package/fragments.js.map +1 -0
  47. package/i18n/en_US.json.d.ts +0 -3
  48. package/lib/url-params.d.ts +1 -0
  49. package/package.json +1 -1
  50. package/render/render.d.ts +1 -1
  51. package/render.js +3 -2
  52. package/render.js.map +1 -0
@@ -13,11 +13,11 @@
13
13
  * is strictly forbidden unless prior written permission is obtained
14
14
  * from Adobe.
15
15
  */
16
- export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, setFetchGraphQlHeaders: (header: import('@adobe-commerce/fetch-graphql').Header) => void, fetchGraphQl: <T = any>(query: string, options?: import('@adobe-commerce/fetch-graphql').FetchOptions | undefined) => Promise<{
16
+ export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, setFetchGraphQlHeaders: (header: import('@adobe-commerce/fetch-graphql').Header | ((prev: import('@adobe-commerce/fetch-graphql').Header) => import('@adobe-commerce/fetch-graphql').Header)) => void, fetchGraphQl: <T = any>(query: string, options?: import('@adobe-commerce/fetch-graphql').FetchOptions | undefined) => Promise<{
17
17
  errors?: import('@adobe-commerce/fetch-graphql').FetchQueryError | undefined;
18
18
  data: T;
19
19
  }>, getConfig: () => {
20
20
  endpoint: string | undefined;
21
- fetchGraphQlHeaders: import('@adobe-commerce/fetch-graphql').Header | undefined;
21
+ fetchGraphQlHeaders: import('@adobe-commerce/fetch-graphql').Header;
22
22
  };
23
23
  //# sourceMappingURL=fetch-graphql.d.ts.map
@@ -1,5 +1,5 @@
1
- import { Initializer } from '../../../@adobe-commerce/elsie/src/lib';
2
- import { Lang } from '../../../@adobe-commerce/elsie/src/i18n';
1
+ import { Initializer } from '@dropins/tools/types/elsie/src/lib';
2
+ import { Lang } from '@dropins/tools/types/elsie/src/i18n';
3
3
  import { ProductModel } from '../../data/models';
4
4
 
5
5
  type ConfigProps = {
@@ -22,6 +22,6 @@ type ConfigProps = {
22
22
  };
23
23
  };
24
24
  export declare const initialize: Initializer<ConfigProps>;
25
- export declare const config: import('../../../@adobe-commerce/elsie/src/lib').Config<ConfigProps>;
25
+ export declare const config: import('@dropins/tools/types/elsie/src/lib').Config<ConfigProps>;
26
26
  export {};
27
27
  //# sourceMappingURL=initialize.d.ts.map
package/api.js CHANGED
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{c as i,f as d,h as c,g as n,k as u,d as g,e as f,i as h,m as p,r as l,s as m,a as P,b as C,l as F,j as G}from"./chunks/isProductConfigurationValid.js";import{g as V}from"./chunks/getFetchedProductData.js";import"@dropins/tools/lib.js";import"@dropins/tools/event-bus.js";import"./fragments.js";import"@dropins/tools/fetch-graphql.js";export{i as config,d as fetchGraphQl,c as fetchProductData,n as getConfig,V as getFetchedProductData,u as getProductConfigurationValues,g as getProductData,f as getRefinedProduct,h as initialize,p as isProductConfigurationValid,l as removeFetchGraphQlHeader,m as setEndpoint,P as setFetchGraphQlHeader,C as setFetchGraphQlHeaders,F as setProductConfigurationValid,G as setProductConfigurationValues};
4
+ //# sourceMappingURL=api.js.map
package/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsx as r,Fragment as h,jsxs as l}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{Price as s}from"@dropins/tools/components.js";const o=({amount:e,currency:p,locale:d,variant:g,sale:t,minimumAmount:i,maximumAmount:n,className:a,...c})=>r(h,{children:e||i===n?r("div",{className:"pdp-price-range",...c,children:r(s,{amount:e||i,currency:p,locale:d,variant:g,sale:t,className:a})}):l("div",{className:"pdp-price-range",...c,children:[r(s,{amount:i,currency:p,locale:d,className:a}),r("span",{className:"pdp-price-range__label",children:"-"}),r(s,{amount:n,currency:p,locale:d,className:a})]})});export{o as P};
4
+ //# sourceMappingURL=PriceRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PriceRange.js","sources":["/@dropins/storefront-pdp/src/components/PriceRange/PriceRange.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 { HTMLAttributes } from 'preact/compat';\nimport '@/pdp/components/PriceRange/PriceRange.css';\nimport { FunctionalComponent } from 'preact';\nimport { Price } from '@adobe-commerce/elsie/components';\n\nexport interface PriceRangeProps extends HTMLAttributes<HTMLDivElement> {\n locale?: string;\n variant?: 'default' | 'strikethrough';\n currency?: string;\n\n // Simple product\n amount?: number;\n sale?: boolean;\n\n // Complex product (range)\n minimumAmount?: number;\n maximumAmount?: number;\n}\n\nexport const PriceRange: FunctionalComponent<PriceRangeProps> = ({\n amount,\n currency,\n locale,\n variant,\n sale,\n minimumAmount,\n maximumAmount,\n className,\n ...props\n}) => {\n return (\n <>\n {amount || minimumAmount === maximumAmount ? (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={amount ? amount : minimumAmount}\n currency={currency}\n locale={locale}\n variant={variant}\n sale={sale}\n className={className}\n />\n </div>\n ) : (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={minimumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n <span className=\"pdp-price-range__label\">{'-'}</span>\n <Price\n amount={maximumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n </div>\n )}\n </>\n );\n};\n"],"names":["PriceRange","amount","currency","locale","variant","sale","minimumAmount","maximumAmount","className","props","jsx","Fragment","Price","jsxs"],"mappings":"2JAmCO,MAAMA,EAAmD,CAAC,CAC/D,OAAAC,EACA,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,KAAAC,EACA,cAAAC,EACA,cAAAC,EACA,UAAAC,EACA,GAAGC,CACL,IAEIC,EAAAC,EAAA,CACG,YAAUL,IAAkBC,IAC1B,MAAI,CAAA,UAAW,kBAAoB,GAAGE,EACrC,SAAAC,EAACE,EAAA,CACC,OAAQX,GAAkBK,EAC1B,SAAAJ,EACA,OAAAC,EACA,QAAAC,EACA,KAAAC,EACA,UAAAG,CAAA,CAAA,EAEJ,EAEAK,EAAC,OAAI,UAAW,kBAAoB,GAAGJ,EACrC,SAAA,CAAAC,EAACE,EAAA,CACC,OAAQN,EACR,SAAAJ,EACA,OAAAC,EACA,UAAAK,CAAA,CACF,EACCE,EAAA,OAAA,CAAK,UAAU,yBAA0B,SAAI,IAAA,EAC9CA,EAACE,EAAA,CACC,OAAQL,EACR,SAAAL,EACA,OAAAC,EACA,UAAAK,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAAA"}
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as h,jsxs as J}from"@dropins/tools/preact-jsx-runtime.js";import{useState as M,useEffect as P,useMemo as R,useCallback as _}from"@dropins/tools/preact-compat.js";import{classes as N}from"@dropins/tools/lib.js";import{Picker as z,ColorSwatch as A,ImageSwatch as y,TextSwatch as B}from"@dropins/tools/components.js";/* empty css */import{useText as C}from"@dropins/tools/i18n.js";const D=["text","image","color","dropdown"],F=d=>d.map(s=>({...s,text:s.label,disabled:!s.inStock}));function G(d,s){return d.reduce((x,i)=>{const n=s==null?void 0:s.find(f=>f.items.find(w=>w.id===i));if(!n)return x;const b=n.items.find(f=>f.id===i);return{...x,[n.id]:{label:b.label,value:b.id}}},{})}const E=({options:d,hideSelectedValue:s,disablePreselections:x,selectedUIDs:i,onValues:n,onErrors:b,defaultOptions:f,selectionsToUpdate:w,className:L,children:H,...O})=>{const q=C("PDP.Swatches.Required.label").label,k=C("PDP.Swatches.ChooseOption.label").label,[S,m]=M(()=>d==null?void 0:d.reduce((r,e)=>{const{items:a}=e,t=a==null?void 0:a.find(c=>f==null?void 0:f.includes(c.id)),u=a==null?void 0:a.find(c=>c.selected);return t?{...r,[e.id]:{label:t.label,value:t.id}}:u?{...r,[e.id]:{label:u.label,value:u.id}}:r},{}));P(()=>{if(i){const l=G(i,d);if(JSON.stringify(l)===JSON.stringify(S))return;m(r=>{let e={...r,...l};return n==null||n(e),e})}},[i]),P(()=>{w==null||w.forEach(l=>{m(r=>{var t;const e=(t=l==null?void 0:l.items)==null?void 0:t.find(u=>u.selected);return e?{...r,[l.id]:{label:e==null?void 0:e.label,value:e==null?void 0:e.id}}:r})})},[w,m]),R(()=>{const l=d==null?void 0:d.reduce((r,e)=>{var t;let a=!1;return(t=e==null?void 0:e.items)==null||t.forEach(u=>{var v;((v=S[e.id])==null?void 0:v.value)===u.id&&(a=!0)}),e.required&&!a&&(r[e.id]=q),r},{});return b==null||b(l),l},[S]);const g=_((l,r,e)=>{m(a=>{let t={...a,...l&&{[l]:{label:r,value:e}}};return r===k&&delete t[l],n==null||n(t,e),t})},[n]),$=_((l,r)=>{var a;const e=((a=r.selectedOptions[0])==null?void 0:a.label)??"";g(l,e,r.value)},[g]),j=_(({items:l,id:r,required:e,type:a,selected:t,label:u})=>(l==null?void 0:l.length)>0&&h("div",{className:N(["pdp-swatches__options"]),children:(a==null?void 0:a.toLowerCase())==="dropdown"?h(z,{"aria-label":u,placeholder:x?k:void 0,handleSelect:c=>$(r,c.target),options:F(l),value:t}):l==null?void 0:l.map(c=>{const v={key:c.id,id:c.id,name:r,value:c.value,label:c.label,groupAriaLabel:u,selected:t===c.id,outOfStock:!c.inStock,required:e===null?!0:e,onValue:()=>{g(r,c.label,c.id)}};switch(a){case"text":return h(B,{...v,label:c.label});case"image":return h(y,{...v,src:c.value,alt:c.label});case"color":return h(A,{...v,size:"large",color:c.value});default:return console.warn(`Invalid swatch type ${a}`),null}})}),[k,g,$]);return h("div",{...O,className:N(["pdp-swatches",L]),children:d==null?void 0:d.map(({type:l,label:r,id:e,multiple:a,required:t,items:u})=>{var c;return D.includes(l)||console.warn(`Invalid swatch type ${l}`),a&&console.warn("Multiple selection swatches are not currently supported."),J("div",{id:`swatch-item-${e}`,"data-slot-key":`product-swatch--${e}`,className:"pdp-swatches__field",children:[h("div",{className:"pdp-swatches__field__label",children:S[e]?s?`${r}`:`${r}: ${S[e].label}`:r}),h(j,{id:e,type:l,required:t,items:u,label:r,selected:(c=S[e])==null?void 0:c.value})]},`swatch-item-${e}`)})})};export{E as S};
3
+ import{jsx as h,jsxs as M}from"@dropins/tools/preact-jsx-runtime.js";import{useState as R,useEffect as N,useMemo as z,useCallback as _}from"@dropins/tools/preact-compat.js";import{classes as P}from"@dropins/tools/lib.js";import{Picker as A,ColorSwatch as y,ImageSwatch as B,TextSwatch as D}from"@dropins/tools/components.js";/* empty css */import{useText as C}from"@dropins/tools/i18n.js";const F=["text","image","color","dropdown"],G=t=>t.map(s=>({...s,text:s.label,disabled:!s.inStock}));function H(t,s){return t.reduce((m,i)=>{const n=s==null?void 0:s.find(f=>f.items.find(w=>w.id===i));if(!n)return m;const b=n.items.find(f=>f.id===i);return{...m,[n.id]:{label:b.label,value:b.id}}},{})}const I=({options:t,hideSelectedValue:s,disablePreselections:m,selectedUIDs:i,onValues:n,onErrors:b,defaultOptions:f,selectionsToUpdate:w,className:L,children:K,imageSwatchNode:O,...q})=>{const j=C("PDP.Swatches.Required.label").label,k=C("PDP.Swatches.ChooseOption.label").label,[S,x]=R(()=>t==null?void 0:t.reduce((r,e)=>{const{items:a}=e,d=a==null?void 0:a.find(c=>f==null?void 0:f.includes(c.id)),u=a==null?void 0:a.find(c=>c.selected);return d?{...r,[e.id]:{label:d.label,value:d.id}}:u?{...r,[e.id]:{label:u.label,value:u.id}}:r},{}));N(()=>{if(i){const l=H(i,t);if(JSON.stringify(l)===JSON.stringify(S))return;x(r=>{let e={...r,...l};return n==null||n(e),e})}},[i]),N(()=>{w==null||w.forEach(l=>{x(r=>{var d;const e=(d=l==null?void 0:l.items)==null?void 0:d.find(u=>u.selected);return e?{...r,[l.id]:{label:e==null?void 0:e.label,value:e==null?void 0:e.id}}:r})})},[w,x]),z(()=>{const l=t==null?void 0:t.reduce((r,e)=>{var d;let a=!1;return(d=e==null?void 0:e.items)==null||d.forEach(u=>{var v;((v=S[e.id])==null?void 0:v.value)===u.id&&(a=!0)}),e.required&&!a&&(r[e.id]=j),r},{});return b==null||b(l),l},[S]);const g=_((l,r,e)=>{x(a=>{let d={...a,...l&&{[l]:{label:r,value:e}}};return r===k&&delete d[l],n==null||n(d,e),d})},[n]),$=_((l,r)=>{var a;const e=((a=r.selectedOptions[0])==null?void 0:a.label)??"";g(l,e,r.value)},[g]),J=_(({items:l,id:r,required:e,type:a,selected:d,label:u})=>(l==null?void 0:l.length)>0&&h("div",{className:P(["pdp-swatches__options"]),children:(a==null?void 0:a.toLowerCase())==="dropdown"?h(A,{"aria-label":u,placeholder:m?k:void 0,handleSelect:c=>$(r,c.target),options:G(l),value:d}):l==null?void 0:l.map(c=>{const v={key:c.id,id:c.id,name:r,value:c.value,label:c.label,groupAriaLabel:u,selected:d===c.id,outOfStock:!c.inStock,required:e===null?!0:e,onValue:()=>{g(r,c.label,c.id)}};switch(a){case"text":return h(D,{...v,label:c.label});case"image":return h(B,{...v,src:c.value,alt:c.label,imageNode:O});case"color":return h(y,{...v,size:"large",color:c.value});default:return console.warn(`Invalid swatch type ${a}`),null}})}),[k,g,$]);return h("div",{...q,className:P(["pdp-swatches",L]),children:t==null?void 0:t.map(({type:l,label:r,id:e,multiple:a,required:d,items:u})=>{var c;return F.includes(l)||console.warn(`Invalid swatch type ${l}`),a&&console.warn("Multiple selection swatches are not currently supported."),M("div",{id:`swatch-item-${e}`,"data-slot-key":`product-swatch--${e}`,className:"pdp-swatches__field",children:[h("div",{className:"pdp-swatches__field__label",children:S[e]?s?`${r}`:`${r}: ${S[e].label}`:r}),h(J,{id:e,type:l,required:d,items:u,label:r,selected:(c=S[e])==null?void 0:c.value})]},`swatch-item-${e}`)})})};export{I as S};
4
+ //# sourceMappingURL=Swatches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Swatches.js","sources":["/@dropins/storefront-pdp/src/components/Swatches/Swatches.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 { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n useState,\n useMemo,\n useCallback,\n useEffect,\n JSX,\n} from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n ColorSwatch,\n ImageSwatch,\n TextSwatch,\n Picker,\n PickerOption,\n ImageNodeRenderProps,\n} from '@adobe-commerce/elsie/components';\n\nimport '@/pdp/components/Swatches/Swatches.css';\n\nconst supportedTypes = ['text', 'image', 'color', 'dropdown'];\n\nconst mapToPickerOptions = (items: OptionValue[]): PickerOption[] => {\n return items.map((item: OptionValue) => ({\n ...item,\n text: item.label,\n disabled: !item.inStock,\n }));\n};\n\ntype OptionValue = {\n id: string;\n label: string;\n inStock: boolean;\n value: string;\n selected?: boolean;\n};\n\nexport type Option = {\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n};\n\ntype Selection = { [id: string]: { label: string; value: string } };\n\nfunction optionUIDsToSelection(\n optionUIDs: string[],\n options: Array<Option>\n): Selection {\n return optionUIDs.reduce((accum, optionUID) => {\n const option = options?.find((option) =>\n option.items.find((item) => item.id === optionUID)\n );\n if (!option) return accum;\n\n const item = option.items.find((item) => item.id === optionUID);\n\n return {\n ...accum,\n [option.id]: {\n label: item!.label,\n value: item!.id,\n },\n };\n }, {});\n}\n\nexport interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {\n options: Array<Option>;\n hideSelectedValue?: boolean;\n disablePreselections?: boolean;\n defaultOptions?: string[];\n selectionsToUpdate?: Option[];\n onValues?: (uids: Selection, current: string) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n selectedUIDs?: string[];\n imageSwatchNode?: VNode | ((props: ImageNodeRenderProps) => JSX.Element);\n}\n\nexport const Swatches: FunctionComponent<SwatchesProps> = ({\n options,\n hideSelectedValue,\n disablePreselections,\n selectedUIDs,\n onValues,\n onErrors,\n defaultOptions,\n selectionsToUpdate,\n className,\n children,\n imageSwatchNode,\n ...props\n}) => {\n // i18n\n const RequiredLabel = useText('PDP.Swatches.Required.label').label;\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n const [selections, setSelections] = useState<Selection>(() => {\n const initial = options?.reduce((accum, option) => {\n const { items } = option;\n const defaultSelection = items?.find((item) =>\n defaultOptions?.includes(item.id)\n );\n const selected = items?.find((item) => item.selected);\n if (defaultSelection) {\n return {\n ...accum,\n [option.id]: {\n label: defaultSelection.label,\n value: defaultSelection.id,\n },\n };\n } else if (selected) {\n return {\n ...accum,\n [option.id]: { label: selected.label, value: selected.id },\n };\n }\n return accum;\n }, {} as Selection);\n\n return initial;\n });\n\n // set selected options from props\n useEffect(() => {\n if (selectedUIDs) {\n const selection = optionUIDsToSelection(selectedUIDs, options);\n // if the internal state is already the same as the props, do nothing\n if (JSON.stringify(selection) === JSON.stringify(selections)) return;\n\n setSelections((prev) => {\n let next = {\n ...prev,\n ...selection,\n };\n onValues?.(next);\n return next;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedUIDs]);\n\n // this only applies for the case with anchor options\n // update selections in the swatches if they are updated in the parent component\n useEffect(() => {\n selectionsToUpdate?.forEach((selectionToUpdate) => {\n setSelections((prev) => {\n const selectedItem = selectionToUpdate?.items?.find(\n (item) => item.selected\n );\n if (!selectedItem) return prev;\n\n const next = {\n ...prev,\n [selectionToUpdate.id]: {\n label: selectedItem?.label,\n value: selectedItem?.id,\n },\n };\n return next;\n });\n });\n }, [selectionsToUpdate, setSelections]);\n\n // Update invalid options\n useMemo(() => {\n const errors = options?.reduce((accum, option) => {\n let valueSelected = false;\n option?.items?.forEach((item) => {\n const selected = selections[option.id]?.value === item.id;\n if (selected) {\n valueSelected = true;\n }\n });\n\n // Validate required\n if (option.required && !valueSelected) {\n accum[option.id] = RequiredLabel;\n }\n return accum;\n }, {} as { [id: string]: string });\n\n // Call the callback\n onErrors?.(errors);\n\n return errors;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selections]);\n\n const handleOnSelection = useCallback(\n (id: string, label: string, optionId: string) => {\n setSelections((prev) => {\n let next = {\n ...prev,\n ...(id && { [id]: { label, value: optionId } }),\n };\n\n if (label === ChooseOptionLabel) {\n delete next[id];\n }\n\n // Call the callback\n onValues?.(next, optionId);\n\n // Return the next state\n return next;\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onValues]\n );\n\n // Function to handle the picker selection\n const handlePickerSelect = useCallback(\n (optionId: string, selection: any) => {\n const label = selection.selectedOptions[0]?.label ?? '';\n handleOnSelection(optionId, label, selection.value);\n },\n [handleOnSelection]\n );\n\n const Swatches = useCallback(\n ({ items, id, required, type, selected, label }: any) => {\n return (\n items?.length > 0 && (\n <div className={classes(['pdp-swatches__options'])}>\n {type?.toLowerCase() === 'dropdown' ? (\n <Picker\n aria-label={label}\n placeholder={\n disablePreselections ? ChooseOptionLabel : undefined\n }\n handleSelect={(event) => handlePickerSelect(id, event.target)}\n options={mapToPickerOptions(items)}\n value={selected}\n />\n ) : (\n items?.map((option: any) => {\n const common = {\n key: option.id,\n id: option.id,\n name: id,\n value: option.value,\n label: option.label,\n groupAriaLabel: label,\n selected: selected === option.id,\n outOfStock: !option.inStock,\n // API may return null, we default to true as all swatches are required.\n // we still comply to this in case the api return \"false\".\n required: required === null ? true : required,\n onValue: () => {\n handleOnSelection(id, option.label, option.id);\n },\n };\n\n switch (type) {\n case 'text':\n return <TextSwatch {...common} label={option.label} />;\n\n case 'image':\n return (\n <ImageSwatch\n {...common}\n src={option.value}\n alt={option.label}\n imageNode={imageSwatchNode}\n />\n );\n\n case 'color':\n return (\n <ColorSwatch\n {...common}\n size=\"large\"\n color={option.value}\n />\n );\n\n default:\n console.warn(`Invalid swatch type ${type}`);\n return null;\n }\n })\n )}\n </div>\n )\n );\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [ChooseOptionLabel, handleOnSelection, handlePickerSelect]\n );\n\n return (\n <div {...props} className={classes(['pdp-swatches', className])}>\n {options?.map(({ type, label, id, multiple, required, items }) => {\n // Only render supported types\n if (!supportedTypes.includes(type)) {\n console.warn(`Invalid swatch type ${type}`);\n }\n\n if (multiple) {\n console.warn(\n 'Multiple selection swatches are not currently supported.'\n );\n }\n\n return (\n <div\n key={`swatch-item-${id}`}\n id={`swatch-item-${id}`}\n data-slot-key={`product-swatch--${id}`}\n className=\"pdp-swatches__field\"\n >\n <div className=\"pdp-swatches__field__label\">\n {selections[id]\n ? hideSelectedValue\n ? `${label}`\n : `${label}: ${selections[id].label}`\n : label}\n </div>\n\n <Swatches\n id={id}\n type={type}\n required={required}\n items={items}\n label={label} //label referring to the name of the swatchGroup\n selected={selections[id]?.value}\n />\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":["supportedTypes","mapToPickerOptions","items","item","optionUIDsToSelection","optionUIDs","options","accum","optionUID","option","Swatches","hideSelectedValue","disablePreselections","selectedUIDs","onValues","onErrors","defaultOptions","selectionsToUpdate","className","children","imageSwatchNode","props","RequiredLabel","useText","ChooseOptionLabel","selections","setSelections","useState","defaultSelection","selected","useEffect","selection","prev","next","selectionToUpdate","selectedItem","_a","useMemo","errors","valueSelected","handleOnSelection","useCallback","id","label","optionId","handlePickerSelect","required","type","jsx","classes","Picker","event","common","TextSwatch","ImageSwatch","ColorSwatch","multiple","jsxs"],"mappings":"yYAsCA,MAAMA,EAAiB,CAAC,OAAQ,QAAS,QAAS,UAAU,EAEtDC,EAAsBC,GACnBA,EAAM,IAAKC,IAAuB,CACvC,GAAGA,EACH,KAAMA,EAAK,MACX,SAAU,CAACA,EAAK,OAAA,EAChB,EAsBJ,SAASC,EACPC,EACAC,EACW,CACX,OAAOD,EAAW,OAAO,CAACE,EAAOC,IAAc,CAC7C,MAAMC,EAASH,GAAA,YAAAA,EAAS,KAAMG,GAC5BA,EAAO,MAAM,KAAMN,GAASA,EAAK,KAAOK,CAAS,GAE/C,GAAA,CAACC,EAAe,OAAAF,EAEd,MAAAJ,EAAOM,EAAO,MAAM,KAAMN,GAASA,EAAK,KAAOK,CAAS,EAEvD,MAAA,CACL,GAAGD,EACH,CAACE,EAAO,EAAE,EAAG,CACX,MAAON,EAAM,MACb,MAAOA,EAAM,EAAA,CAEjB,CACF,EAAG,EAAE,CACP,CAcO,MAAMO,EAA6C,CAAC,CACzD,QAAAJ,EACA,kBAAAK,EACA,qBAAAC,EACA,aAAAC,EACA,SAAAC,EACA,SAAAC,EACA,eAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,SAAAC,EACA,gBAAAC,EACA,GAAGC,CACL,IAAM,CAEE,MAAAC,EAAgBC,EAAQ,6BAA6B,EAAE,MACvDC,EAAoBD,EAAQ,iCAAiC,EAAE,MAE/D,CAACE,EAAYC,CAAa,EAAIC,EAAoB,IACtCrB,GAAA,YAAAA,EAAS,OAAO,CAACC,EAAOE,IAAW,CAC3C,KAAA,CAAE,MAAAP,GAAUO,EACZmB,EAAmB1B,GAAA,YAAAA,EAAO,KAAMC,GACpCa,GAAA,YAAAA,EAAgB,SAASb,EAAK,KAE1B0B,EAAW3B,GAAA,YAAAA,EAAO,KAAMC,GAASA,EAAK,UAC5C,OAAIyB,EACK,CACL,GAAGrB,EACH,CAACE,EAAO,EAAE,EAAG,CACX,MAAOmB,EAAiB,MACxB,MAAOA,EAAiB,EAAA,CAE5B,EACSC,EACF,CACL,GAAGtB,EACH,CAACE,EAAO,EAAE,EAAG,CAAE,MAAOoB,EAAS,MAAO,MAAOA,EAAS,EAAG,CAC3D,EAEKtB,CACT,EAAG,GAGJ,EAGDuB,EAAU,IAAM,CACd,GAAIjB,EAAc,CACV,MAAAkB,EAAY3B,EAAsBS,EAAcP,CAAO,EAE7D,GAAI,KAAK,UAAUyB,CAAS,IAAM,KAAK,UAAUN,CAAU,EAAG,OAE9DC,EAAeM,GAAS,CACtB,IAAIC,EAAO,CACT,GAAGD,EACH,GAAGD,CACL,EACA,OAAAjB,GAAA,MAAAA,EAAWmB,GACJA,CAAA,CACR,CAAA,CACH,EAEC,CAACpB,CAAY,CAAC,EAIjBiB,EAAU,IAAM,CACMb,GAAA,MAAAA,EAAA,QAASiB,GAAsB,CACjDR,EAAeM,GAAS,OAChB,MAAAG,GAAeC,EAAAF,GAAA,YAAAA,EAAmB,QAAnB,YAAAE,EAA0B,KAC5CjC,GAASA,EAAK,UAEb,OAACgC,EAEQ,CACX,GAAGH,EACH,CAACE,EAAkB,EAAE,EAAG,CACtB,MAAOC,GAAA,YAAAA,EAAc,MACrB,MAAOA,GAAA,YAAAA,EAAc,EAAA,CAEzB,EAR0BH,CASnB,CACR,CAAA,EACF,EACA,CAACf,EAAoBS,CAAa,CAAC,EAGtCW,EAAQ,IAAM,CACZ,MAAMC,EAAShC,GAAA,YAAAA,EAAS,OAAO,CAACC,EAAOE,IAAW,OAChD,IAAI8B,EAAgB,GACZ,OAAAH,EAAA3B,GAAA,YAAAA,EAAA,QAAA,MAAA2B,EAAO,QAASjC,GAAS,SACdiC,EAAAX,EAAWhB,EAAO,EAAE,IAApB,YAAA2B,EAAuB,SAAUjC,EAAK,KAErCoC,EAAA,GAClB,GAIE9B,EAAO,UAAY,CAAC8B,IAChBhC,EAAAE,EAAO,EAAE,EAAIa,GAEdf,CACT,EAAG,IAGH,OAAAQ,GAAA,MAAAA,EAAWuB,GAEJA,CAAA,EAEN,CAACb,CAAU,CAAC,EAEf,MAAMe,EAAoBC,EACxB,CAACC,EAAYC,EAAeC,IAAqB,CAC/ClB,EAAeM,GAAS,CACtB,IAAIC,EAAO,CACT,GAAGD,EACH,GAAIU,GAAM,CAAE,CAACA,CAAE,EAAG,CAAE,MAAAC,EAAO,MAAOC,CAAW,CAAA,CAC/C,EAEA,OAAID,IAAUnB,GACZ,OAAOS,EAAKS,CAAE,EAIhB5B,GAAA,MAAAA,EAAWmB,EAAMW,GAGVX,CAAA,CACR,CACH,EAEA,CAACnB,CAAQ,CACX,EAGM+B,EAAqBJ,EACzB,CAACG,EAAkBb,IAAmB,OACpC,MAAMY,IAAQP,EAAAL,EAAU,gBAAgB,CAAC,IAA3B,YAAAK,EAA8B,QAAS,GACnCI,EAAAI,EAAUD,EAAOZ,EAAU,KAAK,CACpD,EACA,CAACS,CAAiB,CACpB,EAEM9B,EAAW+B,EACf,CAAC,CAAE,MAAAvC,EAAO,GAAAwC,EAAI,SAAAI,EAAU,KAAAC,EAAM,SAAAlB,EAAU,MAAAc,MAEpCzC,GAAA,YAAAA,EAAO,QAAS,GACd8C,EAAC,OAAI,UAAWC,EAAQ,CAAC,uBAAuB,CAAC,EAC9C,UAAMF,GAAA,YAAAA,EAAA,iBAAkB,WACvBC,EAACE,EAAA,CACC,aAAYP,EACZ,YACE/B,EAAuBY,EAAoB,OAE7C,aAAe2B,GAAUN,EAAmBH,EAAIS,EAAM,MAAM,EAC5D,QAASlD,EAAmBC,CAAK,EACjC,MAAO2B,CAAA,CAAA,EAGT3B,GAAA,YAAAA,EAAO,IAAKO,GAAgB,CAC1B,MAAM2C,EAAS,CACb,IAAK3C,EAAO,GACZ,GAAIA,EAAO,GACX,KAAMiC,EACN,MAAOjC,EAAO,MACd,MAAOA,EAAO,MACd,eAAgBkC,EAChB,SAAUd,IAAapB,EAAO,GAC9B,WAAY,CAACA,EAAO,QAGpB,SAAUqC,IAAa,KAAO,GAAOA,EACrC,QAAS,IAAM,CACbN,EAAkBE,EAAIjC,EAAO,MAAOA,EAAO,EAAE,CAAA,CAEjD,EAEA,OAAQsC,EAAM,CACZ,IAAK,OACH,SAAQM,EAAY,CAAA,GAAGD,EAAQ,MAAO3C,EAAO,MAAO,EAEtD,IAAK,QAED,OAAAuC,EAACM,EAAA,CACE,GAAGF,EACJ,IAAK3C,EAAO,MACZ,IAAKA,EAAO,MACZ,UAAWW,CAAA,CACb,EAGJ,IAAK,QAED,OAAA4B,EAACO,EAAA,CACE,GAAGH,EACJ,KAAK,QACL,MAAO3C,EAAO,KAAA,CAChB,EAGJ,QACU,eAAA,KAAK,uBAAuBsC,CAAI,EAAE,EACnC,IAAA,CAEZ,GAEL,EAKN,CAACvB,EAAmBgB,EAAmBK,CAAkB,CAC3D,EAGE,OAAAG,EAAC,OAAK,GAAG3B,EAAO,UAAW4B,EAAQ,CAAC,eAAgB/B,CAAS,CAAC,EAC3D,SAASZ,GAAA,YAAAA,EAAA,IAAI,CAAC,CAAE,KAAAyC,EAAM,MAAAJ,EAAO,GAAAD,EAAI,SAAAc,EAAU,SAAAV,EAAU,MAAA5C,KAAY,OAEhE,OAAKF,EAAe,SAAS+C,CAAI,GACvB,QAAA,KAAK,uBAAuBA,CAAI,EAAE,EAGxCS,GACM,QAAA,KACN,0DACF,EAIAC,EAAC,MAAA,CAEC,GAAI,eAAef,CAAE,GACrB,gBAAe,mBAAmBA,CAAE,GACpC,UAAU,sBAEV,SAAA,CAAAM,EAAC,OAAI,UAAU,6BACZ,WAAWN,CAAE,EACV/B,EACE,GAAGgC,CAAK,GACR,GAAGA,CAAK,KAAKlB,EAAWiB,CAAE,EAAE,KAAK,GACnCC,EACN,EAEAK,EAACtC,EAAA,CACC,GAAAgC,EACA,KAAAK,EACA,SAAAD,EACA,MAAA5C,EACA,MAAAyC,EACA,UAAUP,EAAAX,EAAWiB,CAAE,IAAb,YAAAN,EAAgB,KAAA,CAAA,CAC5B,CAAA,EApBK,eAAeM,CAAE,EAqBxB,CAEH,GACH,CAEJ"}
package/chunks/Zoom.js CHANGED
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsxs as F,jsx as C,Fragment as bt}from"@dropins/tools/preact-jsx-runtime.js";import*as ot from"@dropins/tools/preact-compat.js";import{useState as X,Children as j,useRef as K,useMemo as vt,useEffect as R,useCallback as rt}from"@dropins/tools/preact-compat.js";import{debounce as yt,classes as N}from"@dropins/tools/lib.js";import{Button as mt,Icon as Wt}from"@dropins/tools/components.js";/* empty css */import{useText as A}from"@dropins/tools/i18n.js";import{cloneElement as Et}from"@dropins/tools/preact.js";const kt=c=>ot.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},ot.createElement("path",{d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round"})),Ct=c=>ot.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...c},ot.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),ot.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),$t=24,wt=16,Xt="32";var Mt=(c=>(c[c.small=16]="small",c[c.medium=24]="medium",c[c.large=64]="large",c))(Mt||{});const Ht=({show:c=1,scrollbar:m=!1,peak:_=!1,arrows:i=!1,controls:n="dots",arrowsOnMainImage:$=!1,loop:l=!1,gap:b=null,direction:M="horizontal",width:W="100%",height:J="100%",defaultIndex:Y=0,className:ct,children:E,thumbnails:Q=null,isZoomed:P,...V})=>{const z=A("PDP.Carousel.label").label,at=A("PDP.Carousel.Slide.label").label,it=A("PDP.Carousel.Previous.label").label,B=A("PDP.Carousel.Next.label").label,ut=A("PDP.Carousel.Controls.label").label,nt=A("PDP.Carousel.Controls.Button.label").label,[h,ht]=X(()=>Lt(c)),g=Math.ceil(j.count(E)/h),L=_?$t:0,q=b?Mt[b]:0,H=j.count(E)%h,[u,ft]=X(l?k()?Y-1:Y+1:Y),e=K([]),[y,x]=X(0),[w,O]=X(0),I=vt(()=>j.toArray(Q),[Q]),f=vt(()=>{const t=j.toArray(E).reduce((r,s,o)=>o%h===0?[...r,[s]]:[...r.slice(0,-1),[...r[r.length-1],s]],[]);return!l||t.length===1?t:l&&j.count(E)%h===0?[t[g-1]].concat(t).concat([t[0],t[1]]):[j.toArray(E).slice(-h)].concat(t).concat([t[0],t[1]])},[E,h,g,l]),S=K(null),Z=K(null),d=n==="thumbnailsRow"||n==="thumbnailsColumn";R(()=>{const t=S.current;if(!t)return;const r=yt(()=>{x(t.offsetWidth??0),O(t.offsetHeight??0);const o=window.innerWidth,a=Lt(c,o);a!==h&&ht(a)},50),s=new ResizeObserver(r);return s.observe(t),()=>{s.unobserve(t)}},[h,c]);const G=rt(t=>{const r=l?t-1:t,s=e==null?void 0:e.current[0],o=(s==null?void 0:s.offsetWidth)+wt,a=(s==null?void 0:s.offsetHeight)+wt,p=Z.current,U=n==="thumbnailsRow",lt=n==="thumbnailsColumn",T=U?p==null?void 0:p.offsetWidth:p==null?void 0:p.offsetHeight,D=U?o:a;if((U||lt)&&T){const Nt=Math.floor((U?p.clientWidth:p.clientHeight)/D),Dt=Math.floor(Nt/2),pt=(r-Dt)*D;p.style.scrollBehavior="smooth",U?p.scrollLeft=k()?-(p.scrollWidth-p.clientWidth-pt):pt:p.scrollTop=pt}},[n,l]);R(()=>{G(u)},[u,G]);const v=rt((t,r,s)=>{d&&G(t);const o=S.current,a=L?o.offsetWidth-L:o.offsetWidth-L+q;if(!Array.from(o.querySelectorAll("[data-index]")).filter(T=>{const D=Number(T.getAttribute("data-index"));return!isNaN(D)&&D>-1})[t])return;if(s){const T=t===0?g:0,D=a*(g+(H||h)/h);if(k()){if(o.scrollLeft<=0&&o.scrollLeft>-(a-5)){v(1,!0);return}if(o.scrollLeft<a-D&&o.scrollLeft>=-D){v(g,!0);return}o.style.scrollBehavior="auto",o.scrollLeft=T===0?0:-D,v(T===0?1:g,!0)}else{if(o.scrollLeft>=0&&o.scrollLeft<a-5){v(1,!0);return}if(o.scrollLeft>D-a&&o.scrollLeft<=D){v(g,!0);return}o.style.scrollBehavior="auto",o.scrollLeft=T===0?0:D,v(T===0?1:g,!0);return}}const lt=(o.offsetWidth-q)/h*f[t].length-L;o.style.scrollBehavior=r?"smooth":"auto",o.scrollLeft=k()?-(f[t].length===h?a*t:a*(t-1)-lt):f[t].length===h?a*t:a*(t-1)+lt},[q,g,L,h,H,f,G,n]),tt=rt(()=>{if(l){const r=u-1;v(r,!0,k()?u===g-1:u===1);return}const t=u<=0?0:u-1;v(t,!0)},[u,v,l]),et=rt(()=>{const t=f.length-1;if(l){const s=u+1;v(s,!0,k()?u===0:u===g);return}const r=u>=t?t:u+1;v(r,!0)},[f.length,l,u,v,g]);R(()=>{const t=r=>{r.key==="ArrowLeft"&&(r.preventDefault(),k()?et():tt()),r.key==="ArrowRight"&&(r.preventDefault(),k()?tt():et())};return window.addEventListener("keydown",t),()=>{window.removeEventListener("keydown",t)}},[et,tt]),R(()=>{v(l?Y+1:Y,!1)},[Y,v,l]);const dt=yt(()=>{const t=S.current,r=L?t.offsetWidth-L:t.offsetWidth-L+q,s=Math.abs(t.scrollLeft)/r,o=Math.abs(Math.round(s)-s<1?Math.round(s):Math.ceil(s));if(d&&G(o),l){const a=r*(g+(H||h)/h),p=k()?-t.scrollLeft:t.scrollLeft;if(Math.ceil(Math.abs(p))>=Math.ceil(a)-5){t.style.scrollBehavior="auto",t.scrollLeft=k()?-t.offsetWidth+(Math.ceil(p)-Math.ceil(a)-L):t.offsetWidth+(Math.ceil(p)-Math.ceil(a)-L);return}if(Math.abs(p)===0){t.style.scrollBehavior="auto",t.scrollLeft=k()?-(a-t.offsetWidth+L):a-t.offsetWidth+L;return}}u!==o&&ft(o)},100);R(()=>{const t=S.current;return t==null||t.addEventListener("scroll",dt),()=>{t==null||t.removeEventListener("scroll",dt)}},[dt]);const st=(t,r,s)=>C(mt,{className:N([["pdp-carousel__button",!t],[`pdp-carousel__button--${r}`,!t],[`pdp-carousel__button--${n}`,t]]),style:{"--height":`${w}px`},variant:"tertiary","aria-label":r==="next"?B:it,onClick:s,disabled:l?!1:r==="next"?u>=f.length-1:u<1,children:C(Wt,{className:N([["pdp-carousel__button__icon",!t],[`pdp-carousel__button__icon--${r}`,!t],[`pdp-carousel__button__icon--${n}--${r}`,t]]),size:Xt,source:kt})}),gt=i&&f.length!=1&&st(d,"prev",tt),_t=i&&f.length!=1&&st(d,"next",et),Pt=i&&f.length!=1&&st(!1,"prev",tt),xt=i&&f.length!=1&&st(!1,"next",et);return F("div",{role:"region","aria-roledescription":z,className:N(["pdp-carousel",["pdp-carousel--main-image-controls",$],["pdp-carousel--arrows",i&&!d],[`pdp-carousel--${n}`,d],ct]),style:{"--flex-carousel":n==="thumbnailsColumn"?"row-reverse":"column","--gap":d?"0":"var(--spacing-small)","--width":W},...V,children:[C("div",{ref:S,className:N(["pdp-carousel__wrapper",`pdp-carousel__wrapper--${M}`,["pdp-carousel__wrapper--scrollbar",m],["pdp-carousel__wrapper--peak",_]]),style:{"--total-width":n==="thumbnailsColumn"?"81.6%":"100%","--height":n==="thumbnailsColumn"?"auto":J,"--gap":b?`var(--spacing-${b})`:"0px","--per-page":h},tabIndex:0,children:f.map((t,r)=>{const s=t.length<h;return C("div",{role:"group","aria-roledescription":at,"data-index":r,className:N(["pdp-carousel__slide",`pdp-carousel__slide--${M}`,["pdp-carousel__slide--active",u===r],["pdp-carousel__slide--orphan",s]]),style:{"--length":t.length},children:t},r)})}),!d&&F(bt,{children:[gt,_t]}),d&&$&&F(bt,{children:[Pt,xt]}),n&&f.length!=1&&F("div",{className:N([[`pdp-carousel__controls__container--${n}`,d],["pdp-carousel__controls__container--no-arrows",!i||$]]),style:{"--width":n==="thumbnailsRow"?`${y}px`:W,"--height":`${w}px`,"--nr-thumbnails":I.length},children:[(d||P)&&!$&&gt,C("div",{ref:Z,className:N([[`pdp-carousel__controls__wrapper--${n}`,d],["pdp-carousel__controls__wrapper",d]]),children:C("div",{role:"group","aria-label":ut,className:N(["pdp-carousel__controls",[`pdp-carousel__controls--${n}`,d]]),children:(l?f.slice(0,g):f).map((t,r)=>{const s=l?g:f.length,o=l?u-1===r:u===r;return d?F("label",{className:N(["pdp-carousel__thumbnail__container"]),ref:a=>{a&&(e.current[r]=a)},children:[C("input",{type:"radio",name:"carousel-thumbnails","aria-label":nt.replace("{key}",String(r+1)).replace("{total}",String(s)),checked:o&&y!==0,onChange:()=>{v(l?r+1:r,!0)},...V,className:N(["pdp-carousel__thumbnail",["pdp-carousel__thumbnail--selected",o&&y!==0]])}),C("span",{className:N(["pdp-carousel__thumbnail__span"]),children:I[r]})]},r):C("button",{"aria-label":nt.replace("{key}",String(r+1)).replace("{total}",String(s)),onClick:()=>{v(l?r+1:r,!0)},className:N(["pdp-carousel__controls__button",["pdp-carousel__controls__button--active",o]])},r)})})}),(d||P)&&!$&&_t]})]})};function Lt(c,m=0){if(typeof c=="number")return c;const{small:_,medium:i,large:n}=c,l=[{breakpoint:1024,value:n},{breakpoint:786,value:i},{breakpoint:0,value:_}].find(({breakpoint:b})=>m>b);return l?l.value:_}function k(){return document.documentElement.dir==="rtl"}const Ot=({centered:c,onClose:m,className:_,children:i,...n})=>{const $=A("PDP.Overlay.Close.label").label,l=K(null),b=rt(()=>{m==null||m()},[m]);return R(()=>{const M=W=>{W.key==="Escape"&&b()};return document.addEventListener("keydown",M),()=>{document.removeEventListener("keydown",M)}},[b]),R(()=>{const M=l.current;M==null||M.focus();const W=document.scrollingElement,J=W.style.overflow;return W.style.overflow="hidden",()=>{W.style.overflow=J}},[]),F("div",{...n,className:N(["pdp-overlay",["pdp-overlay--centered",c],_]),ref:l,role:"dialog","aria-describedby":"overlay-content",tabindex:0,children:[C("div",{className:"pdp-overlay__content",id:"overlay-content",children:i}),C(mt,{"aria-label":$,variant:"tertiary",className:"pdp-overlay__close-button",onClick:b,icon:C(Ct,{})})]})},Zt=({children:c,scale:m=2,closeButton:_=!0})=>{const[i,n]=X(!1),[$,l]=X("pdp-zoom"),[b,M]=X(!1),[W,J]=X({x:0,y:0}),[Y,ct]=X({x:0,y:0}),[E,Q]=X({x:0,y:0}),P=K(null),V=K(!1),z=K(null),at=e=>{!i||e.type!=="touchstart"||(J({x:e.touches[0].clientX,y:e.touches[0].clientY}),ct({x:E.x,y:E.y}),M(!0))},it=e=>{var d;if(!b||e.type!=="touchmove")return;const y=(d=e.currentTarget)==null?void 0:d.getBoundingClientRect(),x=(100-100/m)/2,w=e.touches[0].clientX-W.x,O=e.touches[0].clientY-W.y,I=w*100/(y.width*m),f=O*100/(y.height*m),S=Y.x+I,Z=Y.y+f;Q({x:Math.max(-x,Math.min(S,x))||0,y:Math.max(-x,Math.min(Z,x))||0}),e.preventDefault()},B=e=>{var Z;const y=(Z=e.currentTarget)==null?void 0:Z.getBoundingClientRect(),x=(100-100/m)/2;let w=null;if("touches"in e)if(e.touches.length>0)w=e.touches[0],z.current={clientX:w.clientX,clientY:w.clientY};else if(e.type==="touchend"&&P.current)w={clientX:P.current.x,clientY:P.current.y};else if(z.current)w=z.current;else return;else if(e instanceof MouseEvent)w=e;else return;const O=(w.clientX-y.left)/y.width*100,I=(w.clientY-y.top)/y.height*100,f=(50-O)*(m-1)/m,S=(50-I)*(m-1)/m;Q({x:Math.max(-x,Math.min(f,x))||0,y:Math.max(-x,Math.min(S,x))||0})},ut=e=>{if(_)P.current={x:e.touches[0].clientX,y:e.touches[0].clientY,time:Date.now()},z.current={clientX:e.touches[0].clientX,clientY:e.touches[0].clientY},V.current=!1,i&&at(e);else{if(b)return;!i&&B(e),n(!i),e.preventDefault()}},nt=e=>{if(e.touches.length!==0){if(z.current={clientX:e.touches[0].clientX,clientY:e.touches[0].clientY},_){if(!P.current)return;if(b){it(e);return}const y=e.touches[0].clientX,x=e.touches[0].clientY,w=Math.abs(y-P.current.x),O=Math.abs(x-P.current.y);(w>10||O>10)&&(V.current=!0)}i&&B(e)}},h=e=>{if(_){if(!P.current)return;const y=Date.now()-P.current.time;!V.current&&y<300&&!b&&(n(!0),B(e),e.preventDefault()),M(!1),P.current=null}else n(!1)},ht=e=>{"touches"in e||b||(i?!_&&n(!1):(n(!0),B(e)),e.preventDefault())},g=e=>{"touches"in e||i&&B(e)},L=e=>{if(!("touches"in e)){if(_){M(!1);return}n(!1)}},q=e=>{n(!1),e.stopPropagation()},H=i?`scale(${m}) translateX(${E.x}%) translateY(${E.y}%)`:"none",u=A("PDP.Zoom.Close.label").label,ft=Et(j.only(c),{draggable:!1,style:{"--transform":H}});return R(()=>{l(i?`pdp-zoom ${_?"pdp-zoom--no-effects":"pdp-zoom--zoomed"}`:"pdp-zoom")},[i,_]),F("figure",{className:$,onClick:ht,onMouseMove:g,onMouseLeave:L,onTouchStart:ut,onTouchMove:nt,onTouchEnd:h,children:[ft,_&&i&&C(mt,{"aria-label":u,variant:"tertiary",className:"pdp-zoom__close-button",icon:C(Ct,{}),onClick:q})]})};export{Ht as C,Ot as O,Zt as Z};
4
+ //# sourceMappingURL=Zoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Zoom.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronDown.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","/@dropins/storefront-pdp/src/components/Carousel/Carousel.tsx","/@dropins/storefront-pdp/src/components/Overlay/Overlay.tsx","/@dropins/storefront-pdp/src/components/Zoom/Zoom.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","/**\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 { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n Children,\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from 'preact/compat';\nimport { classes, debounce } from '@adobe-commerce/elsie/lib';\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { ChevronDown } from '@adobe-commerce/elsie/icons';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nimport '@/pdp/components/Carousel/Carousel.css';\n\ntype Show = number;\n\nconst PEAK_WIDTH = 24;\nconst THUMB_GAP = 16;\nconst ICON_SIZE = '32';\n\nenum GapSize {\n small = 16,\n medium = 24,\n large = 64,\n}\n\nexport interface CarouselProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n children: VNode[] | VNode;\n thumbnails?: VNode[] | VNode;\n show?: Show | { small: Show; medium: Show; large: Show };\n gap?: 'small' | 'medium' | 'large' | null;\n scrollbar?: boolean;\n peak?: boolean;\n arrows?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loop?: boolean;\n direction?: 'horizontal';\n style?: Record<string, string | number>;\n width?: string;\n height?: string;\n defaultIndex?: number;\n infinite?: boolean;\n isZoomed?: boolean;\n}\n\nexport const Carousel: FunctionComponent<CarouselProps> = ({\n show = 1,\n scrollbar = false,\n peak = false,\n arrows = false,\n controls = 'dots',\n arrowsOnMainImage = false,\n loop = false,\n gap = null,\n direction = 'horizontal',\n width = '100%',\n height = '100%',\n defaultIndex = 0,\n className,\n children,\n thumbnails = null,\n isZoomed,\n ...props\n}) => {\n // i18n\n const Label = useText('PDP.Carousel.label').label;\n const SlideLabel = useText('PDP.Carousel.Slide.label').label;\n const PreviousLabel = useText('PDP.Carousel.Previous.label').label;\n const NextLabel = useText('PDP.Carousel.Next.label').label;\n const ControlsLabel = useText('PDP.Carousel.Controls.label').label;\n const ControlsBtnLabel = useText('PDP.Carousel.Controls.Button.label').label;\n\n // States\n const [perPage, setPerPage] = useState(() => getPerPageFromBreakpoint(show));\n\n // Constants\n const length = Math.ceil(Children.count(children) / perPage);\n\n const peakWidth = peak ? PEAK_WIDTH : 0;\n const gapWidth = gap ? GapSize[gap] : 0;\n const rest = Children.count(children) % perPage;\n\n // States\n const [current, setCurrent] = useState(\n loop ? (isRTL() ? defaultIndex - 1 : defaultIndex + 1) : defaultIndex\n );\n\n // Thumbnails (refs for each thumbnail item)\n const thumbnailsRefs = useRef<HTMLLabelElement[]>([]);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbHeight, setThumbHeight] = useState(0);\n\n // VNodes\n const thumbnailSlides = useMemo<VNode[]>(() => {\n return Children.toArray(thumbnails);\n }, [thumbnails]);\n\n // Slides\n const slides = useMemo<VNode[][]>(() => {\n const returnValue = Children.toArray(children).reduce((acc, child, i) => {\n if (i % perPage === 0) {\n return [...acc, [child]];\n }\n\n return [...acc.slice(0, -1), [...acc[acc.length - 1], child]];\n }, [] as VNode[][]);\n\n if (!loop || returnValue.length === 1) {\n return returnValue;\n }\n\n if (loop && !(Children.count(children) % perPage !== 0)) {\n return [returnValue[length - 1]]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }\n\n return [Children.toArray(children).slice(-perPage)]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }, [children, perPage, length, loop]);\n\n // Wrapper\n const wrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailsWrapperRef = useRef<HTMLDivElement>(null);\n\n const thumbnailControls =\n controls === 'thumbnailsRow' || controls === 'thumbnailsColumn';\n\n // Observe Resize (responsive)\n useEffect(() => {\n const wrapper = wrapperRef.current;\n\n if (!wrapper) return; // Guard clause in case the ref is not set yet\n\n const handleResize = debounce(() => {\n setThumbWidth(wrapper.offsetWidth ?? 0);\n setThumbHeight(wrapper.offsetHeight ?? 0);\n const width = window.innerWidth;\n const newPerPage = getPerPageFromBreakpoint(show, width);\n\n if (newPerPage !== perPage) {\n setPerPage(newPerPage);\n }\n }, 50);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapper);\n\n return () => {\n observer.unobserve(wrapper);\n };\n }, [perPage, show]);\n\n // Scrolling logic controls\n const handleThumbnailsScroll = useCallback(\n (nextSlideIndex: number) => {\n const nextItem = loop ? nextSlideIndex - 1 : nextSlideIndex;\n const thumbnailRef = thumbnailsRefs?.current[0];\n const oneItemWidth = thumbnailRef?.offsetWidth + THUMB_GAP;\n const oneItemHeight = thumbnailRef?.offsetHeight + THUMB_GAP;\n const thumbnailsWrapper = thumbnailsWrapperRef.current!;\n\n const isRow = controls === 'thumbnailsRow';\n const isColumn = controls === 'thumbnailsColumn';\n const offset = isRow\n ? thumbnailsWrapper?.offsetWidth\n : thumbnailsWrapper?.offsetHeight;\n const oneItemSize = isRow ? oneItemWidth : oneItemHeight;\n\n if ((isRow || isColumn) && offset) {\n const visibleThumbnails = Math.floor(\n (isRow\n ? thumbnailsWrapper.clientWidth\n : thumbnailsWrapper.clientHeight) / oneItemSize\n );\n const centerOffset = Math.floor(visibleThumbnails / 2);\n const targetScrollPosition = (nextItem - centerOffset) * oneItemSize;\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n\n if (isRow) {\n thumbnailsWrapper.scrollLeft = isRTL()\n ? -(\n thumbnailsWrapper.scrollWidth -\n thumbnailsWrapper.clientWidth -\n targetScrollPosition\n )\n : targetScrollPosition;\n } else {\n thumbnailsWrapper.scrollTop = targetScrollPosition;\n }\n }\n },\n [controls, loop]\n );\n\n useEffect(() => {\n handleThumbnailsScroll(current);\n }, [current, handleThumbnailsScroll]);\n\n // Navigation\n const handleScrollTo = useCallback(\n (nextSlideIndex: number, smooth?: boolean, reset?: boolean) => {\n if (thumbnailControls) {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n\n const items = Array.from(wrapper.querySelectorAll('[data-index]')).filter(\n (element) => {\n const dataIndex = Number(element.getAttribute('data-index')!);\n return !isNaN(dataIndex) && dataIndex > -1;\n }\n );\n\n const item = items[nextSlideIndex];\n\n if (!item) {\n return;\n }\n\n if (reset) {\n const futureIndex = nextSlideIndex === 0 ? length : 0;\n const scrollWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (isRTL()) {\n if (\n wrapper.scrollLeft <= 0 &&\n wrapper.scrollLeft > -(realWidth - 5)\n ) {\n handleScrollTo(1, true);\n return;\n }\n if (\n wrapper.scrollLeft < realWidth - scrollWidth &&\n wrapper.scrollLeft >= -scrollWidth\n ) {\n handleScrollTo(length, true);\n return;\n }\n\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = futureIndex === 0 ? 0 : -scrollWidth;\n handleScrollTo(futureIndex === 0 ? 1 : length, true);\n } else {\n if (wrapper.scrollLeft >= 0 && wrapper.scrollLeft < realWidth - 5) {\n handleScrollTo(1, true);\n return;\n }\n\n if (\n wrapper.scrollLeft > scrollWidth - realWidth &&\n wrapper.scrollLeft <= scrollWidth\n ) {\n handleScrollTo(length, true);\n return;\n }\n\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = futureIndex === 0 ? 0 : scrollWidth;\n handleScrollTo(futureIndex === 0 ? 1 : length, true);\n return;\n }\n }\n\n const diff =\n ((wrapper.offsetWidth - gapWidth) / perPage) *\n slides[nextSlideIndex].length -\n peakWidth;\n\n wrapper.style.scrollBehavior = smooth ? 'smooth' : 'auto';\n wrapper.scrollLeft = isRTL()\n ? -(slides[nextSlideIndex].length === perPage\n ? realWidth * nextSlideIndex\n : realWidth * (nextSlideIndex - 1) - diff)\n : slides[nextSlideIndex].length === perPage\n ? realWidth * nextSlideIndex\n : realWidth * (nextSlideIndex - 1) + diff;\n return;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n gapWidth,\n length,\n peakWidth,\n perPage,\n rest,\n slides,\n handleThumbnailsScroll,\n controls,\n ]\n );\n\n const handleGoToPrev = useCallback(() => {\n if (loop) {\n const nextSlideIndex = current - 1;\n handleScrollTo(\n nextSlideIndex,\n true,\n isRTL() ? current === length - 1 : current === 1\n );\n return;\n }\n\n const nextSlideIndex = current <= 0 ? 0 : current - 1;\n handleScrollTo(nextSlideIndex, true);\n }, [current, handleScrollTo, loop]); //eslint-disable-line react-hooks/exhaustive-deps\n\n const handleGoToNext = useCallback(() => {\n const lastSlideIndex = slides.length - 1;\n\n if (loop) {\n const nextSlideIndex = current + 1;\n handleScrollTo(\n nextSlideIndex,\n true,\n isRTL() ? current === 0 : current === length\n );\n return;\n }\n\n const nextSlideIndex =\n current >= lastSlideIndex ? lastSlideIndex : current + 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [slides.length, loop, current, handleScrollTo, length]);\n\n // Navigate with keyboard\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n isRTL() ? handleGoToNext() : handleGoToPrev();\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n isRTL() ? handleGoToPrev() : handleGoToNext();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleGoToNext, handleGoToPrev]);\n\n // Set default index\n useEffect(() => {\n handleScrollTo(loop ? defaultIndex + 1 : defaultIndex, false);\n }, [defaultIndex, handleScrollTo, loop]);\n\n // Track scrolling (swipes)\n const handleOnScroll = debounce(() => {\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n\n const dividing = Math.abs(wrapper.scrollLeft) / realWidth;\n const nextSlideIndex = Math.abs(\n Math.round(dividing) - dividing < 1\n ? Math.round(dividing)\n : Math.ceil(dividing)\n );\n\n if (thumbnailControls) {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n if (loop) {\n const totalWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n const scrollOffset = isRTL() ? -wrapper.scrollLeft : wrapper.scrollLeft;\n\n if (Math.ceil(Math.abs(scrollOffset)) >= Math.ceil(totalWidth) - 5) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = isRTL()\n ? -wrapper.offsetWidth +\n (Math.ceil(scrollOffset) - Math.ceil(totalWidth) - peakWidth)\n : wrapper.offsetWidth +\n (Math.ceil(scrollOffset) - Math.ceil(totalWidth) - peakWidth);\n return;\n }\n\n if (Math.abs(scrollOffset) === 0) {\n wrapper.style.scrollBehavior = 'auto';\n\n wrapper.scrollLeft = isRTL()\n ? -(totalWidth - wrapper.offsetWidth + peakWidth)\n : totalWidth - wrapper.offsetWidth + peakWidth;\n return;\n }\n }\n\n if (current !== nextSlideIndex) {\n setCurrent(nextSlideIndex);\n }\n }, 100);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n wrapper?.addEventListener('scroll', handleOnScroll);\n\n return () => {\n wrapper?.removeEventListener('scroll', handleOnScroll);\n };\n }, [handleOnScroll]);\n\n // thumbnails is column -> container is row reverse, controls is column\n // thumbnails is row -> container is column, controls is row\n const getArrow = (\n forThumbnails: boolean,\n direction: string,\n callback: () => void\n ) => {\n return (\n <Button\n className={classes([\n ['pdp-carousel__button', !forThumbnails],\n [`pdp-carousel__button--${direction}`, !forThumbnails],\n [`pdp-carousel__button--${controls}`, forThumbnails],\n ])}\n style={{\n '--height': `${thumbHeight}px`,\n }}\n variant=\"tertiary\"\n aria-label={direction === 'next' ? NextLabel : PreviousLabel}\n onClick={callback}\n disabled={\n loop\n ? false\n : direction === 'next'\n ? current >= slides.length - 1\n : current < 1\n }\n >\n <Icon\n className={classes([\n ['pdp-carousel__button__icon', !forThumbnails],\n [`pdp-carousel__button__icon--${direction}`, !forThumbnails],\n [\n `pdp-carousel__button__icon--${controls}--${direction}`,\n forThumbnails,\n ],\n ])}\n size={ICON_SIZE}\n source={ChevronDown}\n />\n </Button>\n );\n };\n\n const prevArrow =\n arrows &&\n slides.length != 1 &&\n getArrow(thumbnailControls, 'prev', handleGoToPrev);\n\n const nextArrow =\n arrows &&\n slides.length != 1 &&\n getArrow(thumbnailControls, 'next', handleGoToNext);\n\n const prevArrowMainImage =\n arrows && slides.length != 1 && getArrow(false, 'prev', handleGoToPrev);\n\n const nextArrowMainImage =\n arrows && slides.length != 1 && getArrow(false, 'next', handleGoToNext);\n\n return (\n <div\n role=\"region\"\n aria-roledescription={Label}\n className={classes([\n 'pdp-carousel',\n ['pdp-carousel--main-image-controls', arrowsOnMainImage],\n ['pdp-carousel--arrows', arrows && !thumbnailControls],\n [`pdp-carousel--${controls}`, thumbnailControls],\n className,\n ])}\n style={{\n '--flex-carousel':\n controls === 'thumbnailsColumn' ? 'row-reverse' : 'column',\n '--gap': thumbnailControls ? '0' : 'var(--spacing-small)',\n '--width': width,\n }}\n {...props}\n >\n {/* Slideshow */}\n <div\n ref={wrapperRef}\n className={classes([\n 'pdp-carousel__wrapper',\n `pdp-carousel__wrapper--${direction}`,\n ['pdp-carousel__wrapper--scrollbar', scrollbar],\n ['pdp-carousel__wrapper--peak', peak],\n ])}\n style={{\n '--total-width': controls === 'thumbnailsColumn' ? `81.6%` : `100%`,\n '--height': controls === 'thumbnailsColumn' ? 'auto' : height,\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n '--per-page': perPage,\n }}\n tabIndex={0}\n >\n {slides.map((page, index) => {\n const orphan = page.length < perPage;\n\n return (\n <div\n key={index}\n role=\"group\"\n aria-roledescription={SlideLabel}\n data-index={index}\n className={classes([\n 'pdp-carousel__slide',\n `pdp-carousel__slide--${direction}`,\n ['pdp-carousel__slide--active', current === index],\n ['pdp-carousel__slide--orphan', orphan],\n ])}\n style={{\n '--length': page.length,\n }}\n >\n {page}\n </div>\n );\n })}\n </div>\n\n {/* Previous and next arrows for Carousel without thumbnails */}\n {!thumbnailControls && (\n <>\n {prevArrow}\n {nextArrow}\n </>\n )}\n\n {thumbnailControls && arrowsOnMainImage && (\n <>\n {prevArrowMainImage}\n {nextArrowMainImage}\n </>\n )}\n\n {/* Controls */}\n {controls && slides.length != 1 && (\n <div\n className={classes([\n [\n `pdp-carousel__controls__container--${controls}`,\n thumbnailControls,\n ],\n [\n 'pdp-carousel__controls__container--no-arrows',\n !arrows || arrowsOnMainImage,\n ],\n ])}\n style={{\n '--width': controls === 'thumbnailsRow' ? `${thumbWidth}px` : width,\n '--height': `${thumbHeight}px`,\n '--nr-thumbnails': thumbnailSlides.length,\n }}\n >\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && prevArrow}\n\n <div\n ref={thumbnailsWrapperRef}\n className={classes([\n [\n `pdp-carousel__controls__wrapper--${controls}`,\n thumbnailControls,\n ],\n [`pdp-carousel__controls__wrapper`, thumbnailControls],\n ])}\n >\n <div\n role=\"group\"\n aria-label={ControlsLabel}\n className={classes([\n 'pdp-carousel__controls',\n [`pdp-carousel__controls--${controls}`, thumbnailControls],\n ])}\n >\n {(loop ? slides.slice(0, length) : slides).map((_, key) => {\n const buttonsLength = loop ? length : slides.length;\n const active = loop ? current - 1 === key : current === key;\n\n if (!thumbnailControls) {\n return (\n <button\n key={key}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n onClick={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n className={classes([\n 'pdp-carousel__controls__button',\n ['pdp-carousel__controls__button--active', active],\n ])}\n />\n );\n }\n return (\n <label\n className={classes(['pdp-carousel__thumbnail__container'])}\n key={key}\n ref={(el: HTMLLabelElement | null) => {\n if (el) {\n thumbnailsRefs.current[key] = el;\n }\n }}\n >\n <input\n type=\"radio\"\n name={'carousel-thumbnails'}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n checked={active && thumbWidth !== 0}\n onChange={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n {...props}\n className={classes([\n 'pdp-carousel__thumbnail',\n [\n 'pdp-carousel__thumbnail--selected',\n active && thumbWidth !== 0,\n ],\n ])}\n />\n\n <span\n className={classes(['pdp-carousel__thumbnail__span'])}\n >\n {thumbnailSlides[key]}\n </span>\n </label>\n );\n })}\n </div>\n </div>\n\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && nextArrow}\n </div>\n )}\n </div>\n );\n};\n\n// Utilities\nfunction getPerPageFromBreakpoint(\n breakpoints: { small: number; medium: number; large: number } | number,\n width = 0\n) {\n if (typeof breakpoints === 'number') return breakpoints;\n\n const { small, medium, large } = breakpoints;\n const breakpointsMap = [\n { breakpoint: 1024, value: large },\n { breakpoint: 786, value: medium },\n { breakpoint: 0, value: small },\n ];\n\n const matchingBreakpoint = breakpointsMap.find(\n ({ breakpoint }) => width > breakpoint\n );\n\n return matchingBreakpoint ? matchingBreakpoint.value : small;\n}\n\nfunction isRTL() {\n return document.documentElement.dir === 'rtl';\n}\n","/**\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 { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useCallback, useEffect, useRef } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Close as CloseSVG } from '@adobe-commerce/elsie/icons';\nimport { Button } from '@adobe-commerce/elsie/components';\n\nimport '@/pdp/components/Overlay/Overlay.css';\n\nexport interface OverlayProps extends HTMLAttributes<HTMLDivElement> {\n centered?: boolean;\n onClose?: () => void;\n}\n\nexport const Overlay: FunctionComponent<OverlayProps> = ({\n centered,\n onClose,\n className,\n children,\n ...props\n}) => {\n // i18n\n const CloseLabel = useText('PDP.Overlay.Close.label').label;\n const overlayRef = useRef<HTMLInputElement>(null);\n const handleOnClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n // Close on ESC\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleOnClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleOnClose]);\n\n // Prevent document scrolling\n useEffect(() => {\n const input = overlayRef.current;\n input?.focus();\n\n const scrollingElement = document.scrollingElement as HTMLElement;\n\n const defaultOverflowValue = scrollingElement.style.overflow;\n\n scrollingElement.style.overflow = 'hidden';\n\n return () => {\n scrollingElement.style.overflow = defaultOverflowValue;\n };\n }, []);\n\n return (\n <div\n {...props}\n className={classes([\n 'pdp-overlay',\n ['pdp-overlay--centered', centered],\n className,\n ])}\n ref={overlayRef}\n role=\"dialog\"\n aria-describedby=\"overlay-content\"\n tabindex={0}\n >\n <div className=\"pdp-overlay__content\" id=\"overlay-content\">\n {children}\n </div>\n <Button\n aria-label={CloseLabel}\n variant=\"tertiary\"\n className=\"pdp-overlay__close-button\"\n onClick={handleOnClose}\n icon={<CloseSVG />}\n />\n </div>\n );\n};\n","/**\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 */\nimport { cloneElement, FunctionComponent, VNode } from 'preact';\nimport { Children, useEffect, useState, useRef } from 'preact/compat';\n\nimport '@/pdp/components/Zoom/Zoom.css';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { Close as CloseSVG } from '@adobe-commerce/elsie/icons';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface ZoomProps {\n children: VNode[] | VNode;\n scale?: number;\n closeButton?: boolean;\n}\n\nexport const Zoom: FunctionComponent<ZoomProps> = ({\n children,\n scale = 2.0,\n closeButton = true,\n}) => {\n const [zoomed, setZoomed] = useState(false);\n const [figureClassName, setFigureClassName] = useState('pdp-zoom');\n const [drag, setDrag] = useState(false);\n const [dragStart, setDragStart] = useState({ x: 0, y: 0 });\n const [dragStartPosition, setDragStartPosition] = useState({ x: 0, y: 0 });\n const [position, setPosition] = useState({ x: 0, y: 0 });\n\n // Track touch start position for swipe detection, only used when closeButton is enabled\n const touchStartRef = useRef<{ x: number; y: number; time: number } | null>(\n null\n );\n const isSwipingRef = useRef<boolean>(false);\n const lastValidTouchRef = useRef<{ clientX: number; clientY: number } | null>(\n null\n );\n\n const startDrag = (event: TouchEvent) => {\n if (!zoomed || event.type !== 'touchstart') return;\n setDragStart({ x: event.touches[0].clientX, y: event.touches[0].clientY });\n setDragStartPosition({ x: position.x, y: position.y });\n setDrag(true);\n };\n\n const dragMove = (event: TouchEvent) => {\n if (!drag || event.type !== 'touchmove') return;\n const zoomer = (\n event.currentTarget as HTMLElement\n )?.getBoundingClientRect();\n const overlap = (100 - 100 / scale) / 2;\n const movedX = event.touches[0].clientX - dragStart.x;\n const movedY = event.touches[0].clientY - dragStart.y;\n const movedXPercent = (movedX * 100) / (zoomer.width * scale);\n const movedYPercent = (movedY * 100) / (zoomer.height * scale);\n const x = dragStartPosition.x + movedXPercent;\n const y = dragStartPosition.y + movedYPercent;\n setPosition({\n x: Math.max(-overlap, Math.min(x, overlap)) || 0,\n y: Math.max(-overlap, Math.min(y, overlap)) || 0,\n });\n event.preventDefault();\n };\n\n const updatePosition = (event: MouseEvent | TouchEvent) => {\n const zoomer = (\n event.currentTarget as HTMLElement\n )?.getBoundingClientRect();\n\n const overlap = (100 - 100 / scale) / 2;\n let coordinates: { clientX: number; clientY: number } | null = null;\n\n if ('touches' in event) {\n // For touchend events, touches array will be empty, so use our last stored position\n if (event.touches.length > 0) {\n coordinates = event.touches[0];\n // Store the last valid touch for use in touchend\n lastValidTouchRef.current = {\n clientX: coordinates.clientX,\n clientY: coordinates.clientY,\n };\n } else if (event.type === 'touchend' && touchStartRef.current) {\n // For touchend, use the starting position as fallback\n coordinates = {\n clientX: touchStartRef.current.x,\n clientY: touchStartRef.current.y,\n };\n } else if (lastValidTouchRef.current) {\n // If we have a stored position, use it\n coordinates = lastValidTouchRef.current;\n } else {\n // No valid coordinates available\n return;\n }\n } else if (event instanceof MouseEvent) {\n coordinates = event;\n } else {\n return;\n }\n\n // Calculate relative position as percentage from center\n const relativeX =\n ((coordinates.clientX - zoomer.left) / zoomer.width) * 100;\n const relativeY =\n ((coordinates.clientY - zoomer.top) / zoomer.height) * 100;\n\n // Adjust position to center on click point\n const x = ((50 - relativeX) * (scale - 1)) / scale;\n const y = ((50 - relativeY) * (scale - 1)) / scale;\n\n setPosition({\n x: Math.max(-overlap, Math.min(x, overlap)) || 0,\n y: Math.max(-overlap, Math.min(y, overlap)) || 0,\n });\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n // Only use swipe detection when closeButton is enabled\n if (closeButton) {\n // Record the starting touch position and time\n touchStartRef.current = {\n x: event.touches[0].clientX,\n y: event.touches[0].clientY,\n time: Date.now(),\n };\n\n // Store last valid touch\n lastValidTouchRef.current = {\n clientX: event.touches[0].clientX,\n clientY: event.touches[0].clientY,\n };\n\n isSwipingRef.current = false;\n\n if (zoomed) {\n startDrag(event);\n }\n } else {\n // When closeButton is disabled, use the original behavior\n if (drag) return;\n\n !zoomed && updatePosition(event);\n\n setZoomed(!zoomed);\n\n event.preventDefault();\n }\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n if (event.touches.length === 0) return;\n\n // Store last valid touch position on any move\n lastValidTouchRef.current = {\n clientX: event.touches[0].clientX,\n clientY: event.touches[0].clientY,\n };\n\n // When closeButton is enabled, use swipe detection\n if (closeButton) {\n if (!touchStartRef.current) return;\n\n // If already in drag mode, handle drag movement\n if (drag) {\n dragMove(event);\n return;\n }\n\n // Detect if this is a swipe (not a tap)\n const touchX = event.touches[0].clientX;\n const touchY = event.touches[0].clientY;\n const deltaX = Math.abs(touchX - touchStartRef.current.x);\n const deltaY = Math.abs(touchY - touchStartRef.current.y);\n\n // If movement exceeds threshold, mark as swiping\n if (deltaX > 10 || deltaY > 10) {\n isSwipingRef.current = true;\n }\n }\n\n // Update position if already zoomed\n if (zoomed) {\n updatePosition(event);\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n // When closeButton is enabled, use swipe detection\n if (closeButton) {\n if (!touchStartRef.current) return;\n\n // Handle tap vs swipe\n const tapDuration = Date.now() - touchStartRef.current.time;\n\n // Only trigger zoom on tap (not swipe) and when tap is short enough\n if (!isSwipingRef.current && tapDuration < 300 && !drag) {\n setZoomed(true);\n updatePosition(event);\n event.preventDefault();\n }\n\n // Reset drag state and clear touch tracking\n setDrag(false);\n touchStartRef.current = null;\n } else {\n // When closeButton is disabled, simply toggle zoom\n setZoomed(false);\n }\n };\n\n const handleClick = (event: MouseEvent) => {\n // Only handle mouse clicks here\n if ('touches' in event) return;\n\n if (drag) return;\n\n if (zoomed) {\n !closeButton && setZoomed(false);\n } else {\n setZoomed(true);\n updatePosition(event);\n }\n event.preventDefault();\n };\n\n const handleMove = (event: MouseEvent) => {\n // Only handle mouse moves here\n if ('touches' in event) return;\n\n if (zoomed) {\n updatePosition(event);\n }\n };\n\n const handleLeave = (event: MouseEvent) => {\n // Only handle mouse events\n if ('touches' in event) return;\n\n if (closeButton) {\n setDrag(false);\n return;\n }\n setZoomed(false);\n };\n\n const closeButtonClick = (event: MouseEvent | TouchEvent) => {\n setZoomed(false);\n event.stopPropagation();\n };\n\n const transformStyle = zoomed\n ? `scale(${scale}) translateX(${position.x}%) translateY(${position.y}%)`\n : 'none';\n\n const CloseLabel = useText('PDP.Zoom.Close.label').label;\n const ImageClone = cloneElement(Children.only(children) as any, {\n draggable: false,\n style: {\n '--transform': transformStyle,\n },\n });\n\n useEffect(() => {\n const className = zoomed\n ? `pdp-zoom ${closeButton ? 'pdp-zoom--no-effects' : 'pdp-zoom--zoomed'}`\n : 'pdp-zoom';\n setFigureClassName(className);\n }, [zoomed, closeButton]);\n\n return (\n <figure\n className={figureClassName}\n onClick={handleClick}\n onMouseMove={handleMove}\n onMouseLeave={handleLeave}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {ImageClone}\n {closeButton && zoomed && (\n <Button\n aria-label={CloseLabel}\n variant=\"tertiary\"\n className=\"pdp-zoom__close-button\"\n icon={<CloseSVG />}\n onClick={closeButtonClick}\n />\n )}\n </figure>\n );\n};\n"],"names":["SvgChevronDown","props","React","SvgClose","PEAK_WIDTH","THUMB_GAP","ICON_SIZE","GapSize","Carousel","show","scrollbar","peak","arrows","controls","arrowsOnMainImage","loop","gap","direction","width","height","defaultIndex","className","children","thumbnails","isZoomed","Label","useText","SlideLabel","PreviousLabel","NextLabel","ControlsLabel","ControlsBtnLabel","perPage","setPerPage","useState","getPerPageFromBreakpoint","length","Children","peakWidth","gapWidth","rest","current","setCurrent","isRTL","thumbnailsRefs","useRef","thumbWidth","setThumbWidth","thumbHeight","setThumbHeight","thumbnailSlides","useMemo","slides","returnValue","acc","child","i","wrapperRef","thumbnailsWrapperRef","thumbnailControls","useEffect","wrapper","handleResize","debounce","newPerPage","observer","handleThumbnailsScroll","useCallback","nextSlideIndex","nextItem","thumbnailRef","oneItemWidth","oneItemHeight","thumbnailsWrapper","isRow","isColumn","offset","oneItemSize","visibleThumbnails","centerOffset","targetScrollPosition","handleScrollTo","smooth","reset","realWidth","element","dataIndex","futureIndex","scrollWidth","diff","handleGoToPrev","handleGoToNext","lastSlideIndex","handleKeyDown","event","handleOnScroll","dividing","totalWidth","scrollOffset","getArrow","forThumbnails","callback","jsx","Button","classes","Icon","ChevronDown","prevArrow","nextArrow","prevArrowMainImage","nextArrowMainImage","jsxs","page","index","orphan","Fragment","_","key","buttonsLength","active","el","breakpoints","small","medium","large","matchingBreakpoint","breakpoint","Overlay","centered","onClose","CloseLabel","overlayRef","handleOnClose","input","scrollingElement","defaultOverflowValue","CloseSVG","Zoom","scale","closeButton","zoomed","setZoomed","figureClassName","setFigureClassName","drag","setDrag","dragStart","setDragStart","dragStartPosition","setDragStartPosition","position","setPosition","touchStartRef","isSwipingRef","lastValidTouchRef","startDrag","dragMove","zoomer","_a","overlap","movedX","movedY","movedXPercent","movedYPercent","x","y","updatePosition","coordinates","relativeX","relativeY","handleTouchStart","handleTouchMove","touchX","touchY","deltaX","deltaY","handleTouchEnd","tapDuration","handleClick","handleMove","handleLeave","closeButtonClick","transformStyle","ImageClone","cloneElement"],"mappings":"ygBACA,MAAMA,GAAkBC,GAA0BC,GAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAO,EAAkBC,GAAM,cAAc,OAAQ,CAAE,EAAG,kDAAmD,OAAQ,eAAgB,YAAa,IAAK,cAAe,SAAU,eAAgB,OAAO,CAAE,CAAC,ECAtXC,GAAYF,GAA0BC,GAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,GAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,iCAAkC,OAAQ,cAAc,CAAE,EAAmBA,GAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,iCAAkC,OAAQ,cAAc,CAAE,CAAC,ECkCjdE,GAAa,GACbC,GAAY,GACZC,GAAY,KAElB,IAAKC,IAAAA,IACHA,EAAAA,EAAA,MAAQ,EAAR,EAAA,QACAA,EAAAA,EAAA,OAAS,EAAT,EAAA,SACAA,EAAAA,EAAA,MAAQ,EAAR,EAAA,QAHGA,IAAAA,IAAA,CAAA,CAAA,EA2BE,MAAMC,GAA6C,CAAC,CACzD,KAAAC,EAAO,EACP,UAAAC,EAAY,GACZ,KAAAC,EAAO,GACP,OAAAC,EAAS,GACT,SAAAC,EAAW,OACX,kBAAAC,EAAoB,GACpB,KAAAC,EAAO,GACP,IAAAC,EAAM,KACN,UAAAC,EAAY,aACZ,MAAAC,EAAQ,OACR,OAAAC,EAAS,OACT,aAAAC,EAAe,EACf,UAAAC,GACA,SAAAC,EACA,WAAAC,EAAa,KACb,SAAAC,EACA,GAAGvB,CACL,IAAM,CAEE,MAAAwB,EAAQC,EAAQ,oBAAoB,EAAE,MACtCC,GAAaD,EAAQ,0BAA0B,EAAE,MACjDE,GAAgBF,EAAQ,6BAA6B,EAAE,MACvDG,EAAYH,EAAQ,yBAAyB,EAAE,MAC/CI,GAAgBJ,EAAQ,6BAA6B,EAAE,MACvDK,GAAmBL,EAAQ,oCAAoC,EAAE,MAGjE,CAACM,EAASC,EAAU,EAAIC,EAAS,IAAMC,GAAyB1B,CAAI,CAAC,EAGrE2B,EAAS,KAAK,KAAKC,EAAS,MAAMf,CAAQ,EAAIU,CAAO,EAErDM,EAAY3B,EAAOP,GAAa,EAChCmC,EAAWvB,EAAMT,GAAQS,CAAG,EAAI,EAChCwB,EAAOH,EAAS,MAAMf,CAAQ,EAAIU,EAGlC,CAACS,EAASC,EAAU,EAAIR,EAC5BnB,EAAQ4B,EAAM,EAAIvB,EAAe,EAAIA,EAAe,EAAKA,CAC3D,EAGMwB,EAAiBC,EAA2B,EAAE,EAC9C,CAACC,EAAYC,CAAa,EAAIb,EAAS,CAAC,EACxC,CAACc,EAAaC,CAAc,EAAIf,EAAS,CAAC,EAG1CgB,EAAkBC,GAAiB,IAChCd,EAAS,QAAQd,CAAU,EACjC,CAACA,CAAU,CAAC,EAGT6B,EAASD,GAAmB,IAAM,CAChC,MAAAE,EAAchB,EAAS,QAAQf,CAAQ,EAAE,OAAO,CAACgC,EAAKC,EAAOC,IAC7DA,EAAIxB,IAAY,EACX,CAAC,GAAGsB,EAAK,CAACC,CAAK,CAAC,EAGlB,CAAC,GAAGD,EAAI,MAAM,EAAG,EAAE,EAAG,CAAC,GAAGA,EAAIA,EAAI,OAAS,CAAC,EAAGC,CAAK,CAAC,EAC3D,EAAe,EAElB,MAAI,CAACxC,GAAQsC,EAAY,SAAW,EAC3BA,EAGLtC,GAAUsB,EAAS,MAAMf,CAAQ,EAAIU,IAAY,EAC5C,CAACqB,EAAYjB,EAAS,CAAC,CAAC,EAC5B,OAAOiB,CAAW,EAClB,OAAO,CAACA,EAAY,CAAC,EAAGA,EAAY,CAAC,CAAC,CAAC,EAGrC,CAAChB,EAAS,QAAQf,CAAQ,EAAE,MAAM,CAACU,CAAO,CAAC,EAC/C,OAAOqB,CAAW,EAClB,OAAO,CAACA,EAAY,CAAC,EAAGA,EAAY,CAAC,CAAC,CAAC,GACzC,CAAC/B,EAAUU,EAASI,EAAQrB,CAAI,CAAC,EAG9B0C,EAAaZ,EAAuB,IAAI,EACxCa,EAAuBb,EAAuB,IAAI,EAElDc,EACJ9C,IAAa,iBAAmBA,IAAa,mBAG/C+C,EAAU,IAAM,CACd,MAAMC,EAAUJ,EAAW,QAE3B,GAAI,CAACI,EAAS,OAER,MAAAC,EAAeC,GAAS,IAAM,CACpBhB,EAAAc,EAAQ,aAAe,CAAC,EACvBZ,EAAAY,EAAQ,cAAgB,CAAC,EACxC,MAAM3C,EAAQ,OAAO,WACf8C,EAAa7B,GAAyB1B,EAAMS,CAAK,EAEnD8C,IAAehC,GACjBC,GAAW+B,CAAU,GAEtB,EAAE,EAECC,EAAW,IAAI,eAAeH,CAAY,EAChD,OAAAG,EAAS,QAAQJ,CAAO,EAEjB,IAAM,CACXI,EAAS,UAAUJ,CAAO,CAC5B,CAAA,EACC,CAAC7B,EAASvB,CAAI,CAAC,EAGlB,MAAMyD,EAAyBC,GAC5BC,GAA2B,CACpB,MAAAC,EAAWtD,EAAOqD,EAAiB,EAAIA,EACvCE,EAAe1B,GAAA,YAAAA,EAAgB,QAAQ,GACvC2B,GAAeD,GAAA,YAAAA,EAAc,aAAcjE,GAC3CmE,GAAgBF,GAAA,YAAAA,EAAc,cAAejE,GAC7CoE,EAAoBf,EAAqB,QAEzCgB,EAAQ7D,IAAa,gBACrB8D,GAAW9D,IAAa,mBACxB+D,EAASF,EACXD,GAAA,YAAAA,EAAmB,YACnBA,GAAA,YAAAA,EAAmB,aACjBI,EAAcH,EAAQH,EAAeC,EAEtC,IAAAE,GAASC,KAAaC,EAAQ,CACjC,MAAME,GAAoB,KAAK,OAC5BJ,EACGD,EAAkB,YAClBA,EAAkB,cAAgBI,CACxC,EACME,GAAe,KAAK,MAAMD,GAAoB,CAAC,EAC/CE,IAAwBX,EAAWU,IAAgBF,EACzDJ,EAAkB,MAAM,eAAiB,SAErCC,EACgBD,EAAA,WAAa9B,IAC3B,EACE8B,EAAkB,YAClBA,EAAkB,YAClBO,IAEFA,GAEJP,EAAkB,UAAYO,EAChC,CAEJ,EACA,CAACnE,EAAUE,CAAI,CACjB,EAEA6C,EAAU,IAAM,CACdM,EAAuBzB,CAAO,CAAA,EAC7B,CAACA,EAASyB,CAAsB,CAAC,EAGpC,MAAMe,EAAiBd,GACrB,CAACC,EAAwBc,EAAkBC,IAAoB,CACzDxB,GACFO,EAAuBE,CAAc,EAGvC,MAAMP,EAAUJ,EAAW,QACrB2B,EAAY9C,EACduB,EAAQ,YAAcvB,EACtBuB,EAAQ,YAAcvB,EAAYC,EAWtC,GAAI,CATU,MAAM,KAAKsB,EAAQ,iBAAiB,cAAc,CAAC,EAAE,OAChEwB,GAAY,CACX,MAAMC,EAAY,OAAOD,EAAQ,aAAa,YAAY,CAAE,EAC5D,MAAO,CAAC,MAAMC,CAAS,GAAKA,EAAY,EAAA,CAE5C,EAEmBlB,CAAc,EAG/B,OAGF,GAAIe,EAAO,CACH,MAAAI,EAAcnB,IAAmB,EAAIhC,EAAS,EAC9CoD,EACJJ,GAAahD,GAAUI,GAAcR,GAAWA,GAElD,GAAIW,IAAS,CACX,GACEkB,EAAQ,YAAc,GACtBA,EAAQ,WAAa,EAAEuB,EAAY,GACnC,CACAH,EAAe,EAAG,EAAI,EACtB,MAAA,CAEF,GACEpB,EAAQ,WAAauB,EAAYI,GACjC3B,EAAQ,YAAc,CAAC2B,EACvB,CACAP,EAAe7C,EAAQ,EAAI,EAC3B,MAAA,CAGFyB,EAAQ,MAAM,eAAiB,OAC/BA,EAAQ,WAAa0B,IAAgB,EAAI,EAAI,CAACC,EAC9CP,EAAeM,IAAgB,EAAI,EAAInD,EAAQ,EAAI,CAAA,KAC9C,CACL,GAAIyB,EAAQ,YAAc,GAAKA,EAAQ,WAAauB,EAAY,EAAG,CACjEH,EAAe,EAAG,EAAI,EACtB,MAAA,CAGF,GACEpB,EAAQ,WAAa2B,EAAcJ,GACnCvB,EAAQ,YAAc2B,EACtB,CACAP,EAAe7C,EAAQ,EAAI,EAC3B,MAAA,CAGFyB,EAAQ,MAAM,eAAiB,OACvBA,EAAA,WAAa0B,IAAgB,EAAI,EAAIC,EAC7CP,EAAeM,IAAgB,EAAI,EAAInD,EAAQ,EAAI,EACnD,MAAA,CACF,CAGI,MAAAqD,IACF5B,EAAQ,YAActB,GAAYP,EAClCoB,EAAOgB,CAAc,EAAE,OACzB9B,EAEMuB,EAAA,MAAM,eAAiBqB,EAAS,SAAW,OAC3CrB,EAAA,WAAalB,EAAM,EACvB,EAAES,EAAOgB,CAAc,EAAE,SAAWpC,EAChCoD,EAAYhB,EACZgB,GAAahB,EAAiB,GAAKqB,IACvCrC,EAAOgB,CAAc,EAAE,SAAWpC,EAClCoD,EAAYhB,EACZgB,GAAahB,EAAiB,GAAKqB,EAEzC,EAEA,CACElD,EACAH,EACAE,EACAN,EACAQ,EACAY,EACAc,EACArD,CAAA,CAEJ,EAEM6E,GAAiBvB,GAAY,IAAM,CACvC,GAAIpD,EAAM,CACR,MAAMqD,EAAiB3B,EAAU,EACjCwC,EACEb,EACA,GACAzB,EAAM,EAAIF,IAAYL,EAAS,EAAIK,IAAY,CACjD,EACA,MAAA,CAGF,MAAM2B,EAAiB3B,GAAW,EAAI,EAAIA,EAAU,EACpDwC,EAAeb,EAAgB,EAAI,CAClC,EAAA,CAAC3B,EAASwC,EAAgBlE,CAAI,CAAC,EAE5B4E,GAAiBxB,GAAY,IAAM,CACjC,MAAAyB,EAAiBxC,EAAO,OAAS,EAEvC,GAAIrC,EAAM,CACR,MAAMqD,EAAiB3B,EAAU,EACjCwC,EACEb,EACA,GACAzB,IAAUF,IAAY,EAAIA,IAAYL,CACxC,EACA,MAAA,CAGF,MAAMgC,EACJ3B,GAAWmD,EAAiBA,EAAiBnD,EAAU,EAEzDwC,EAAeb,EAAgB,EAAI,CAAA,EAClC,CAAChB,EAAO,OAAQrC,EAAM0B,EAASwC,EAAgB7C,CAAM,CAAC,EAGzDwB,EAAU,IAAM,CACR,MAAAiC,EAAiBC,GAAyB,CAC1CA,EAAM,MAAQ,cAChBA,EAAM,eAAe,EACfnD,EAAA,EAAIgD,GAAe,EAAID,GAAe,GAG1CI,EAAM,MAAQ,eAChBA,EAAM,eAAe,EACfnD,EAAA,EAAI+C,GAAe,EAAIC,GAAe,EAEhD,EAEO,cAAA,iBAAiB,UAAWE,CAAa,EAEzC,IAAM,CACJ,OAAA,oBAAoB,UAAWA,CAAa,CACrD,CAAA,EACC,CAACF,GAAgBD,EAAc,CAAC,EAGnC9B,EAAU,IAAM,CACdqB,EAAelE,EAAOK,EAAe,EAAIA,EAAc,EAAK,CAC3D,EAAA,CAACA,EAAc6D,EAAgBlE,CAAI,CAAC,EAGjC,MAAAgF,GAAiBhC,GAAS,IAAM,CACpC,MAAMF,EAAUJ,EAAW,QACrB2B,EAAY9C,EACduB,EAAQ,YAAcvB,EACtBuB,EAAQ,YAAcvB,EAAYC,EAEhCyD,EAAW,KAAK,IAAInC,EAAQ,UAAU,EAAIuB,EAC1ChB,EAAiB,KAAK,IAC1B,KAAK,MAAM4B,CAAQ,EAAIA,EAAW,EAC9B,KAAK,MAAMA,CAAQ,EACnB,KAAK,KAAKA,CAAQ,CACxB,EAMA,GAJIrC,GACFO,EAAuBE,CAAc,EAGnCrD,EAAM,CACR,MAAMkF,EACJb,GAAahD,GAAUI,GAAcR,GAAWA,GAC5CkE,EAAevD,EAAM,EAAI,CAACkB,EAAQ,WAAaA,EAAQ,WAEzD,GAAA,KAAK,KAAK,KAAK,IAAIqC,CAAY,CAAC,GAAK,KAAK,KAAKD,CAAU,EAAI,EAAG,CAClEpC,EAAQ,MAAM,eAAiB,OACvBA,EAAA,WAAalB,EAAM,EACvB,CAACkB,EAAQ,aACR,KAAK,KAAKqC,CAAY,EAAI,KAAK,KAAKD,CAAU,EAAI3D,GACnDuB,EAAQ,aACP,KAAK,KAAKqC,CAAY,EAAI,KAAK,KAAKD,CAAU,EAAI3D,GACvD,MAAA,CAGF,GAAI,KAAK,IAAI4D,CAAY,IAAM,EAAG,CAChCrC,EAAQ,MAAM,eAAiB,OAEvBA,EAAA,WAAalB,EAAM,EACvB,EAAEsD,EAAapC,EAAQ,YAAcvB,GACrC2D,EAAapC,EAAQ,YAAcvB,EACvC,MAAA,CACF,CAGEG,IAAY2B,GACd1B,GAAW0B,CAAc,GAE1B,GAAG,EAENR,EAAU,IAAM,CACd,MAAMC,EAAUJ,EAAW,QAClB,OAAAI,GAAA,MAAAA,EAAA,iBAAiB,SAAUkC,IAE7B,IAAM,CACFlC,GAAA,MAAAA,EAAA,oBAAoB,SAAUkC,GACzC,CAAA,EACC,CAACA,EAAc,CAAC,EAInB,MAAMI,GAAW,CACfC,EACAnF,EACAoF,IAGEC,EAACC,GAAA,CACC,UAAWC,EAAQ,CACjB,CAAC,uBAAwB,CAACJ,CAAa,EACvC,CAAC,yBAAyBnF,CAAS,GAAI,CAACmF,CAAa,EACrD,CAAC,yBAAyBvF,CAAQ,GAAIuF,CAAa,CAAA,CACpD,EACD,MAAO,CACL,WAAY,GAAGpD,CAAW,IAC5B,EACA,QAAQ,WACR,aAAY/B,IAAc,OAASY,EAAYD,GAC/C,QAASyE,EACT,SACEtF,EACI,GACAE,IAAc,OACdwB,GAAWW,EAAO,OAAS,EAC3BX,EAAU,EAGhB,SAAA6D,EAACG,GAAA,CACC,UAAWD,EAAQ,CACjB,CAAC,6BAA8B,CAACJ,CAAa,EAC7C,CAAC,+BAA+BnF,CAAS,GAAI,CAACmF,CAAa,EAC3D,CACE,+BAA+BvF,CAAQ,KAAKI,CAAS,GACrDmF,CAAA,CACF,CACD,EACD,KAAM9F,GACN,OAAQoG,EAAA,CAAA,CACV,CACF,EAIEC,GACJ/F,GACAwC,EAAO,QAAU,GACjB+C,GAASxC,EAAmB,OAAQ+B,EAAc,EAE9CkB,GACJhG,GACAwC,EAAO,QAAU,GACjB+C,GAASxC,EAAmB,OAAQgC,EAAc,EAE9CkB,GACJjG,GAAUwC,EAAO,QAAU,GAAK+C,GAAS,GAAO,OAAQT,EAAc,EAElEoB,GACJlG,GAAUwC,EAAO,QAAU,GAAK+C,GAAS,GAAO,OAAQR,EAAc,EAGtE,OAAAoB,EAAC,MAAA,CACC,KAAK,SACL,uBAAsBtF,EACtB,UAAW+E,EAAQ,CACjB,eACA,CAAC,oCAAqC1F,CAAiB,EACvD,CAAC,uBAAwBF,GAAU,CAAC+C,CAAiB,EACrD,CAAC,iBAAiB9C,CAAQ,GAAI8C,CAAiB,EAC/CtC,EAAA,CACD,EACD,MAAO,CACL,kBACER,IAAa,mBAAqB,cAAgB,SACpD,QAAS8C,EAAoB,IAAM,uBACnC,UAAWzC,CACb,EACC,GAAGjB,EAGJ,SAAA,CAAAqG,EAAC,MAAA,CACC,IAAK7C,EACL,UAAW+C,EAAQ,CACjB,wBACA,0BAA0BvF,CAAS,GACnC,CAAC,mCAAoCP,CAAS,EAC9C,CAAC,8BAA+BC,CAAI,CAAA,CACrC,EACD,MAAO,CACL,gBAAiBE,IAAa,mBAAqB,QAAU,OAC7D,WAAYA,IAAa,mBAAqB,OAASM,EACvD,QAASH,EAAM,iBAAiBA,CAAG,IAAM,MACzC,aAAcgB,CAChB,EACA,SAAU,EAET,SAAOoB,EAAA,IAAI,CAAC4D,EAAMC,IAAU,CACrB,MAAAC,EAASF,EAAK,OAAShF,EAG3B,OAAAsE,EAAC,MAAA,CAEC,KAAK,QACL,uBAAsB3E,GACtB,aAAYsF,EACZ,UAAWT,EAAQ,CACjB,sBACA,wBAAwBvF,CAAS,GACjC,CAAC,8BAA+BwB,IAAYwE,CAAK,EACjD,CAAC,8BAA+BC,CAAM,CAAA,CACvC,EACD,MAAO,CACL,WAAYF,EAAK,MACnB,EAEC,SAAAA,CAAA,EAdIC,CAeP,CAEH,CAAA,CAAA,CACH,EAGC,CAACtD,GAEGoD,EAAAI,GAAA,CAAA,SAAA,CAAAR,GACAC,EAAA,EACH,EAGDjD,GAAqB7C,GAEjBiG,EAAAI,GAAA,CAAA,SAAA,CAAAN,GACAC,EAAA,EACH,EAIDjG,GAAYuC,EAAO,QAAU,GAC5B2D,EAAC,MAAA,CACC,UAAWP,EAAQ,CACjB,CACE,sCAAsC3F,CAAQ,GAC9C8C,CACF,EACA,CACE,+CACA,CAAC/C,GAAUE,CAAA,CACb,CACD,EACD,MAAO,CACL,UAAWD,IAAa,gBAAkB,GAAGiC,CAAU,KAAO5B,EAC9D,WAAY,GAAG8B,CAAW,KAC1B,kBAAmBE,EAAgB,MACrC,EAEE,SAAA,EAAqBS,GAAAnC,IAAa,CAACV,GAAqB6F,GAE1DL,EAAC,MAAA,CACC,IAAK5C,EACL,UAAW8C,EAAQ,CACjB,CACE,oCAAoC3F,CAAQ,GAC5C8C,CACF,EACA,CAAC,kCAAmCA,CAAiB,CAAA,CACtD,EAED,SAAA2C,EAAC,MAAA,CACC,KAAK,QACL,aAAYxE,GACZ,UAAW0E,EAAQ,CACjB,yBACA,CAAC,2BAA2B3F,CAAQ,GAAI8C,CAAiB,CAAA,CAC1D,EAEC,UAAA5C,EAAOqC,EAAO,MAAM,EAAGhB,CAAM,EAAIgB,GAAQ,IAAI,CAACgE,EAAGC,IAAQ,CACnD,MAAAC,EAAgBvG,EAAOqB,EAASgB,EAAO,OACvCmE,EAASxG,EAAO0B,EAAU,IAAM4E,EAAM5E,IAAY4E,EAExD,OAAK1D,EAmBHoD,EAAC,QAAA,CACC,UAAWP,EAAQ,CAAC,oCAAoC,CAAC,EAEzD,IAAMgB,GAAgC,CAChCA,IACa5E,EAAA,QAAQyE,CAAG,EAAIG,EAElC,EAEA,SAAA,CAAAlB,EAAC,QAAA,CACC,KAAK,QACL,KAAM,sBACN,aAAYvE,GAAiB,QAC3B,QACA,OAAOsF,EAAM,CAAC,CACd,EAAA,QAAQ,UAAW,OAAOC,CAAa,CAAC,EAC1C,QAASC,GAAUzE,IAAe,EAClC,SAAU,IAAM,CACdmC,EAAelE,EAAOsG,EAAM,EAAIA,EAAK,EAAI,CAC3C,EACC,GAAGpH,EACJ,UAAWuG,EAAQ,CACjB,0BACA,CACE,oCACAe,GAAUzE,IAAe,CAAA,CAE5B,CAAA,CAAA,CACH,EAEAwD,EAAC,OAAA,CACC,UAAWE,EAAQ,CAAC,+BAA+B,CAAC,EAEnD,WAAgBa,CAAG,CAAA,CAAA,CACtB,CAAA,EAhCKA,CAiCP,EApDEf,EAAC,SAAA,CAEC,aAAYvE,GAAiB,QAC3B,QACA,OAAOsF,EAAM,CAAC,CACd,EAAA,QAAQ,UAAW,OAAOC,CAAa,CAAC,EAC1C,QAAS,IAAM,CACbrC,EAAelE,EAAOsG,EAAM,EAAIA,EAAK,EAAI,CAC3C,EACA,UAAWb,EAAQ,CACjB,iCACA,CAAC,yCAA0Ce,CAAM,CAClD,CAAA,CAAA,EAXIF,CAYP,CAyCL,CAAA,CAAA,CAAA,CACH,CACF,GAEE1D,GAAqBnC,IAAa,CAACV,GAAqB8F,EAAA,CAAA,CAAA,CAC5D,CAAA,CAEJ,CAEJ,EAGA,SAASzE,GACPsF,EACAvG,EAAQ,EACR,CACI,GAAA,OAAOuG,GAAgB,SAAiB,OAAAA,EAE5C,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,MAAAC,CAAU,EAAAH,EAO3BI,EANiB,CACrB,CAAE,WAAY,KAAM,MAAOD,CAAM,EACjC,CAAE,WAAY,IAAK,MAAOD,CAAO,EACjC,CAAE,WAAY,EAAG,MAAOD,CAAM,CAChC,EAE0C,KACxC,CAAC,CAAE,WAAAI,CAAW,IAAM5G,EAAQ4G,CAC9B,EAEO,OAAAD,EAAqBA,EAAmB,MAAQH,CACzD,CAEA,SAAS/E,GAAQ,CACR,OAAA,SAAS,gBAAgB,MAAQ,KAC1C,CCnqBO,MAAMoF,GAA2C,CAAC,CACvD,SAAAC,EACA,QAAAC,EACA,UAAA5G,EACA,SAAAC,EACA,GAAGrB,CACL,IAAM,CAEE,MAAAiI,EAAaxG,EAAQ,yBAAyB,EAAE,MAChDyG,EAAatF,EAAyB,IAAI,EAC1CuF,EAAgBjE,GAAY,IAAM,CAC5B8D,GAAA,MAAAA,GAAA,EACT,CAACA,CAAO,CAAC,EAGZ,OAAArE,EAAU,IAAM,CACR,MAAAiC,EAAiBC,GAAyB,CAC1CA,EAAM,MAAQ,UACFsC,EAAA,CAElB,EAES,gBAAA,iBAAiB,UAAWvC,CAAa,EAE3C,IAAM,CACF,SAAA,oBAAoB,UAAWA,CAAa,CACvD,CAAA,EACC,CAACuC,CAAa,CAAC,EAGlBxE,EAAU,IAAM,CACd,MAAMyE,EAAQF,EAAW,QACzBE,GAAA,MAAAA,EAAO,QAEP,MAAMC,EAAmB,SAAS,iBAE5BC,EAAuBD,EAAiB,MAAM,SAEpD,OAAAA,EAAiB,MAAM,SAAW,SAE3B,IAAM,CACXA,EAAiB,MAAM,SAAWC,CACpC,CACF,EAAG,EAAE,EAGHxB,EAAC,MAAA,CACE,GAAG9G,EACJ,UAAWuG,EAAQ,CACjB,cACA,CAAC,wBAAyBwB,CAAQ,EAClC3G,CAAA,CACD,EACD,IAAK8G,EACL,KAAK,SACL,mBAAiB,kBACjB,SAAU,EAEV,SAAA,CAAA7B,EAAC,MAAI,CAAA,UAAU,uBAAuB,GAAG,kBACtC,SAAAhF,EACH,EACAgF,EAACC,GAAA,CACC,aAAY2B,EACZ,QAAQ,WACR,UAAU,4BACV,QAASE,EACT,OAAOI,GAAS,CAAA,CAAA,CAAA,CAAA,CAClB,CAAA,CACF,CAEJ,ECvEaC,GAAqC,CAAC,CACjD,SAAAnH,EACA,MAAAoH,EAAQ,EACR,YAAAC,EAAc,EAChB,IAAM,CACJ,KAAM,CAACC,EAAQC,CAAS,EAAI3G,EAAS,EAAK,EACpC,CAAC4G,EAAiBC,CAAkB,EAAI7G,EAAS,UAAU,EAC3D,CAAC8G,EAAMC,CAAO,EAAI/G,EAAS,EAAK,EAChC,CAACgH,EAAWC,CAAY,EAAIjH,EAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACnD,CAACkH,EAAmBC,EAAoB,EAAInH,EAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EACnE,CAACoH,EAAUC,CAAW,EAAIrH,EAAS,CAAE,EAAG,EAAG,EAAG,EAAG,EAGjDsH,EAAgB3G,EACpB,IACF,EACM4G,EAAe5G,EAAgB,EAAK,EACpC6G,EAAoB7G,EACxB,IACF,EAEM8G,GAAa7D,GAAsB,CACnC,CAAC8C,GAAU9C,EAAM,OAAS,eAC9BqD,EAAa,CAAE,EAAGrD,EAAM,QAAQ,CAAC,EAAE,QAAS,EAAGA,EAAM,QAAQ,CAAC,EAAE,QAAS,EACzEuD,GAAqB,CAAE,EAAGC,EAAS,EAAG,EAAGA,EAAS,EAAG,EACrDL,EAAQ,EAAI,EACd,EAEMW,GAAY9D,GAAsB,OACtC,GAAI,CAACkD,GAAQlD,EAAM,OAAS,YAAa,OACnC,MAAA+D,GACJC,EAAAhE,EAAM,gBAAN,YAAAgE,EACC,wBACGC,GAAW,IAAM,IAAMrB,GAAS,EAChCsB,EAASlE,EAAM,QAAQ,CAAC,EAAE,QAAUoD,EAAU,EAC9Ce,EAASnE,EAAM,QAAQ,CAAC,EAAE,QAAUoD,EAAU,EAC9CgB,EAAiBF,EAAS,KAAQH,EAAO,MAAQnB,GACjDyB,EAAiBF,EAAS,KAAQJ,EAAO,OAASnB,GAClD0B,EAAIhB,EAAkB,EAAIc,EAC1BG,EAAIjB,EAAkB,EAAIe,EACpBZ,EAAA,CACV,EAAG,KAAK,IAAI,CAACQ,EAAS,KAAK,IAAIK,EAAGL,CAAO,CAAC,GAAK,EAC/C,EAAG,KAAK,IAAI,CAACA,EAAS,KAAK,IAAIM,EAAGN,CAAO,CAAC,GAAK,CAAA,CAChD,EACDjE,EAAM,eAAe,CACvB,EAEMwE,EAAkBxE,GAAmC,OACnD,MAAA+D,GACJC,EAAAhE,EAAM,gBAAN,YAAAgE,EACC,wBAEGC,GAAW,IAAM,IAAMrB,GAAS,EACtC,IAAI6B,EAA2D,KAE/D,GAAI,YAAazE,EAEX,GAAAA,EAAM,QAAQ,OAAS,EACXyE,EAAAzE,EAAM,QAAQ,CAAC,EAE7B4D,EAAkB,QAAU,CAC1B,QAASa,EAAY,QACrB,QAASA,EAAY,OACvB,UACSzE,EAAM,OAAS,YAAc0D,EAAc,QAEtCe,EAAA,CACZ,QAASf,EAAc,QAAQ,EAC/B,QAASA,EAAc,QAAQ,CACjC,UACSE,EAAkB,QAE3Ba,EAAcb,EAAkB,YAGhC,gBAEO5D,aAAiB,WACZyE,EAAAzE,MAEd,QAIF,MAAM0E,GACFD,EAAY,QAAUV,EAAO,MAAQA,EAAO,MAAS,IACnDY,GACFF,EAAY,QAAUV,EAAO,KAAOA,EAAO,OAAU,IAGnDO,GAAM,GAAKI,IAAc9B,EAAQ,GAAMA,EACvC2B,GAAM,GAAKI,IAAc/B,EAAQ,GAAMA,EAEjCa,EAAA,CACV,EAAG,KAAK,IAAI,CAACQ,EAAS,KAAK,IAAIK,EAAGL,CAAO,CAAC,GAAK,EAC/C,EAAG,KAAK,IAAI,CAACA,EAAS,KAAK,IAAIM,EAAGN,CAAO,CAAC,GAAK,CAAA,CAChD,CACH,EAEMW,GAAoB5E,GAAsB,CAE9C,GAAI6C,EAEFa,EAAc,QAAU,CACtB,EAAG1D,EAAM,QAAQ,CAAC,EAAE,QACpB,EAAGA,EAAM,QAAQ,CAAC,EAAE,QACpB,KAAM,KAAK,IAAI,CACjB,EAGA4D,EAAkB,QAAU,CAC1B,QAAS5D,EAAM,QAAQ,CAAC,EAAE,QAC1B,QAASA,EAAM,QAAQ,CAAC,EAAE,OAC5B,EAEA2D,EAAa,QAAU,GAEnBb,GACFe,GAAU7D,CAAK,MAEZ,CAEL,GAAIkD,EAAM,OAET,CAAAJ,GAAU0B,EAAexE,CAAK,EAE/B+C,EAAU,CAACD,CAAM,EAEjB9C,EAAM,eAAe,CAAA,CAEzB,EAEM6E,GAAmB7E,GAAsB,CACzC,GAAAA,EAAM,QAAQ,SAAW,EAS7B,IANA4D,EAAkB,QAAU,CAC1B,QAAS5D,EAAM,QAAQ,CAAC,EAAE,QAC1B,QAASA,EAAM,QAAQ,CAAC,EAAE,OAC5B,EAGI6C,EAAa,CACX,GAAA,CAACa,EAAc,QAAS,OAG5B,GAAIR,EAAM,CACRY,GAAS9D,CAAK,EACd,MAAA,CAIF,MAAM8E,EAAS9E,EAAM,QAAQ,CAAC,EAAE,QAC1B+E,EAAS/E,EAAM,QAAQ,CAAC,EAAE,QAC1BgF,EAAS,KAAK,IAAIF,EAASpB,EAAc,QAAQ,CAAC,EAClDuB,EAAS,KAAK,IAAIF,EAASrB,EAAc,QAAQ,CAAC,GAGpDsB,EAAS,IAAMC,EAAS,MAC1BtB,EAAa,QAAU,GACzB,CAIEb,GACF0B,EAAexE,CAAK,EAExB,EAEMkF,EAAkBlF,GAAsB,CAE5C,GAAI6C,EAAa,CACX,GAAA,CAACa,EAAc,QAAS,OAG5B,MAAMyB,EAAc,KAAK,IAAI,EAAIzB,EAAc,QAAQ,KAGnD,CAACC,EAAa,SAAWwB,EAAc,KAAO,CAACjC,IACjDH,EAAU,EAAI,EACdyB,EAAexE,CAAK,EACpBA,EAAM,eAAe,GAIvBmD,EAAQ,EAAK,EACbO,EAAc,QAAU,IAAA,MAGxBX,EAAU,EAAK,CAEnB,EAEMqC,GAAepF,GAAsB,CAErC,YAAaA,GAEbkD,IAEAJ,EACD,CAAAD,GAAeE,EAAU,EAAK,GAE/BA,EAAU,EAAI,EACdyB,EAAexE,CAAK,GAEtBA,EAAM,eAAe,EACvB,EAEMqF,EAAcrF,GAAsB,CAEpC,YAAaA,GAEb8C,GACF0B,EAAexE,CAAK,CAExB,EAEMsF,EAAetF,GAAsB,CAEzC,GAAI,cAAaA,GAEjB,IAAI6C,EAAa,CACfM,EAAQ,EAAK,EACb,MAAA,CAEFJ,EAAU,EAAK,EACjB,EAEMwC,EAAoBvF,GAAmC,CAC3D+C,EAAU,EAAK,EACf/C,EAAM,gBAAgB,CACxB,EAEMwF,EAAiB1C,EACnB,SAASF,CAAK,gBAAgBY,EAAS,CAAC,iBAAiBA,EAAS,CAAC,KACnE,OAEEpB,EAAaxG,EAAQ,sBAAsB,EAAE,MAC7C6J,GAAaC,GAAanJ,EAAS,KAAKf,CAAQ,EAAU,CAC9D,UAAW,GACX,MAAO,CACL,cAAegK,CAAA,CACjB,CACD,EAED,OAAA1H,EAAU,IAAM,CAIdmF,EAHkBH,EACd,YAAYD,EAAc,uBAAyB,kBAAkB,GACrE,UACwB,CAAA,EAC3B,CAACC,EAAQD,CAAW,CAAC,EAGtB5B,EAAC,SAAA,CACC,UAAW+B,EACX,QAASoC,GACT,YAAaC,EACb,aAAcC,EACd,aAAcV,GACd,YAAaC,GACb,WAAYK,EAEX,SAAA,CAAAO,GACA5C,GAAeC,GACdtC,EAACC,GAAA,CACC,aAAY2B,EACZ,QAAQ,WACR,UAAU,yBACV,OAAOM,GAAS,EAAA,EAChB,QAAS6C,CAAA,CAAA,CACX,CAAA,CAEJ,CAEJ","x_google_ignoreList":[0,1]}
package/chunks/date.js CHANGED
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{toLanguageTag as n}from"@dropins/tools/lib.js";function a(t,d="en_US"){if(!o(t))throw Error("Invalid date string");return t.split(" ")[1]||(t=`${t} 00:00:00`),new Date(t).toLocaleDateString(n(d)).toString()}function o(t){if(![/^\d{4}-\d{2}-\d{2}$/,/^\d{1,2}\/\d{1,2}\/\d{4}$/,/^\d{2}\/\d{2}\/\d{4}$/,/^\d{4}\/\d{2}\/\d{2}$/,/^\d{1,2}\.\d{1,2}\.\d{4}$/,/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/].some(i=>i.test(t)))return!1;const e=new Date(t);return!isNaN(e.getTime())}export{o as i,a as t};
4
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","sources":["/@dropins/storefront-pdp/src/lib/date.ts"],"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 { toLanguageTag } from '@adobe-commerce/elsie/lib';\n\nexport function toDateString(value: string, locale = 'en_US') {\n if (!isDateValid(value)) throw Error('Invalid date string');\n\n // normalize time to 00:00:00\n const time = value.split(' ')[1];\n if (!time) value = `${value} 00:00:00`;\n\n return new Date(value).toLocaleDateString(toLanguageTag(locale)).toString();\n}\n\nexport function isDateValid(dateString: string) {\n const acceptedFormats = [\n /^\\d{4}-\\d{2}-\\d{2}$/, // YYYY-MM-DD\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{2}\\/\\d{2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{4}\\/\\d{2}\\/\\d{2}$/, // YYYY/MM/DD\n /^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$/, // DD.MM.YYYY\n /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/, // YYYY-MM-DD HH:mm:ss\n ];\n\n if (!acceptedFormats.some((format) => format.test(dateString))) return false;\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n"],"names":["toDateString","value","locale","isDateValid","toLanguageTag","dateString","format","date"],"mappings":"sDAkBgB,SAAAA,EAAaC,EAAeC,EAAS,QAAS,CAC5D,GAAI,CAACC,EAAYF,CAAK,EAAG,MAAM,MAAM,qBAAqB,EAI1D,OADaA,EAAM,MAAM,GAAG,EAAE,CAAC,IACZA,EAAA,GAAGA,CAAK,aAEpB,IAAI,KAAKA,CAAK,EAAE,mBAAmBG,EAAcF,CAAM,CAAC,EAAE,SAAS,CAC5E,CAEO,SAASC,EAAYE,EAAoB,CAU1C,GAAA,CAToB,CACtB,sBACA,4BACA,wBACA,wBACA,4BACA,uCACF,EAEqB,KAAMC,GAAWA,EAAO,KAAKD,CAAU,CAAC,EAAU,MAAA,GAEjE,MAAAE,EAAO,IAAI,KAAKF,CAAU,EAChC,MAAO,CAAC,MAAME,EAAK,SAAS,CAC9B"}
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{events as e}from"@dropins/tools/event-bus.js";const s=async()=>e._lastEvent["pdp/data"]?Promise.resolve(e._lastEvent["pdp/data"].payload):new Promise(a=>{const t=e.on("pdp/data",r=>{a(r),t==null||t.off()},{eager:!0})});export{s as g};
4
+ //# sourceMappingURL=getFetchedProductData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFetchedProductData.js","sources":["/@dropins/storefront-pdp/src/api/getFetchedProductData/getFetchedProductData.ts"],"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 { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\n\nexport const getFetchedProductData = async (): Promise<ProductModel | null> => {\n // if the event has already been emitted, return the last payload\n if (events._lastEvent['pdp/data']) {\n return Promise.resolve(events._lastEvent['pdp/data'].payload);\n }\n\n // otherwise, wait for the next event\n return new Promise((resolve) => {\n const event = events.on(\n 'pdp/data',\n (data) => {\n resolve(data);\n event?.off();\n },\n { eager: true }\n );\n });\n};\n"],"names":["getFetchedProductData","events","resolve","event","data"],"mappings":"qDAmBO,MAAMA,EAAwB,SAE/BC,EAAO,WAAW,UAAU,EACvB,QAAQ,QAAQA,EAAO,WAAW,UAAU,EAAE,OAAO,EAIvD,IAAI,QAASC,GAAY,CAC9B,MAAMC,EAAQF,EAAO,GACnB,WACCG,GAAS,CACRF,EAAQE,CAAI,EACZD,GAAA,MAAAA,EAAO,KACT,EACA,CAAE,MAAO,EAAK,CAChB,CAAA,CACD"}
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{merge as oe,Initializer as ae}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as ne}from"../fragments.js";import{FetchGraphQL as ue}from"@dropins/tools/fetch-graphql.js";function $e(e){const n=new URLSearchParams(window.location.search);Object.entries(e).forEach(([r,t])=>{t===null?n.delete(r):n.set(r,String(t))});let i=window.location.pathname;i+=`?${n.toString()}`,i+=window.location.hash,window.history.replaceState({},"",i)}function le(){const e=new URLSearchParams(window.location.search),n={};return e.forEach((i,r)=>{n[r]=i}),n}function me(e){var n,i,r,t,s,o,l,a,c,m,u,f;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((i=(n=e==null?void 0:e.prices)==null?void 0:n.regular)==null?void 0:i.amount)||0,minimalPrice:(t=(r=e==null?void 0:e.prices)==null?void 0:r.final)==null?void 0:t.minimumAmount,maximalPrice:(o=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:o.maximumAmount,specialPrice:(a=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:a.amount,tierPricing:void 0,currencyCode:((m=(c=e==null?void 0:e.prices)==null?void 0:c.final)==null?void 0:m.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(f=(u=e==null?void 0:e.images)==null?void 0:u[0])==null?void 0:f.url}}const ce={PRODUCT_CONTEXT:"productContext"},fe={PRODUCT_PAGE_VIEW:"product-page-view"};function ie(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function Pe(e,n){const i=ie();i.push({[e]:null}),i.push({[e]:n})}function de(e,n){ie().push(r=>{const t=r.getState?r.getState():{};r.push({event:e,eventInfo:{...t,...n}})})}function he(e){const n=me(e);Pe(ce.PRODUCT_CONTEXT,n),de(fe.PRODUCT_PAGE_VIEW)}var q=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(q||{}),re=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(re||{});function K(e,n){var o,l,a,c,m,u,f,P,h,y,d,b;const i=((c=(a=(l=(o=e==null?void 0:e.options)==null?void 0:o[0])==null?void 0:l.values)==null?void 0:a[0])==null?void 0:c.__typename)==="ProductViewOptionValueProduct",r=Ee(e,i,n==null?void 0:n.preselectFirstOption),t=(e==null?void 0:e.__typename)===re.SimpleProductView?q.SimpleProduct:q.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:i,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:we(e),prices:xe(e,i,r),attributes:ye(e),options:De(e,i),optionUIDs:r,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,productType:t}:null;return oe(s,((P=(f=(u=(m=_.getConfig())==null?void 0:m.models)==null?void 0:u.ProductDetails)==null?void 0:f.transformer)==null?void 0:P.call(f,e))??((b=(d=(y=(h=_.getConfig())==null?void 0:h.models)==null?void 0:y.ProductDetails)==null?void 0:d.transform)==null?void 0:b.call(d,e)))}function we(e){var n,i;return(i=(n=e.images)==null?void 0:n.filter(r=>{var t;return!((t=r.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:i.map(r=>(r.url=r.url.replace(/^https?:/,""),r))}function ye(e){var n,i;return(i=(n=e.attributes)==null?void 0:n.filter(({roles:r})=>(r==null?void 0:r.indexOf("visible_in_pdp"))!==-1))==null?void 0:i.map(({label:r,value:t,name:s})=>({id:s,label:r,value:t.toString().split(",").join(", ")}))}function De(e,n){const{options:i,optionUIDs:r}=e;return i==null?void 0:i.map(({id:t,title:s,required:o,multi:l,values:a})=>{var u;const c=(u=a==null?void 0:a[0])==null?void 0:u.__typename;let m=a==null?void 0:a[0].type;return m?m=m.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):m="dropdown",{id:t,type:m,typename:c,label:s,required:o,multiple:l,items:n?ge(a,r):Ce(a,r,m)}})}function ge(e,n){return e==null?void 0:e.filter(({enabled:i})=>typeof i>"u"||i).map(({id:i,title:r,inStock:t,isDefault:s,product:o})=>({id:i,inStock:t,label:r,selected:(n==null?void 0:n.indexOf(i))>-1||s,value:i,product:o}))}function Ce(e,n,i){return e==null?void 0:e.map(({id:r,title:t,inStock:s,value:o})=>({id:r,inStock:s,label:t,selected:(n==null?void 0:n.indexOf(r))>-1,value:(i==null?void 0:i.toLowerCase())==="dropdown"?r:o==null?void 0:o.replace(/^https?:/,"")}))}function xe(e,n,i){var d,b,X,B,z;const{price:r,priceRange:t,options:s,optionUIDs:o=i}=e;let{__typename:l}=e;function a(){var x;const g=r.regular.amount.value,w=((x=r.final)==null?void 0:x.amount.value)??r.regular.amount.value,C=r.regular.amount.currency==="NONE"?"USD":r==null?void 0:r.regular.amount.currency;return[g,w,w,C]}function c(){var T,O,k,v,U,A,I,V,F,N,G,M;const g=(T=t==null?void 0:t.minimum)==null?void 0:T.final.amount.value,w=(O=t==null?void 0:t.maximum)==null?void 0:O.final.amount.value;let C;((v=(k=t==null?void 0:t.minimum)==null?void 0:k.regular)==null?void 0:v.amount.value)===((A=(U=t==null?void 0:t.maximum)==null?void 0:U.regular)==null?void 0:A.amount.value)&&(C=(V=(I=t==null?void 0:t.minimum)==null?void 0:I.regular)==null?void 0:V.amount.value);const x=((N=(F=t==null?void 0:t.minimum)==null?void 0:F.final)==null?void 0:N.amount.currency)==="NONE"?"USD":(M=(G=t==null?void 0:t.minimum)==null?void 0:G.final)==null?void 0:M.amount.currency;return[C,g,w,x]}function m(){var k,v,U,A,I,V,F,N,G,M,W,Y;let g=0,w=0;s==null||s.forEach(S=>{var J;const j=S==null?void 0:S.values;if(j&&Array.isArray(j)){const E=j.map(D=>{var $,L,Z,R;return(R=(Z=(L=($=D==null?void 0:D.product)==null?void 0:$.price)==null?void 0:L.regular)==null?void 0:Z.amount)==null?void 0:R.value}).filter(D=>D!==void 0),Q=E.length>0?Math.max(...E):0;g+=Q}(J=S==null?void 0:S.values)==null||J.forEach(E=>{var Q,D,$,L;o!=null&&o.includes(E.id)&&(w+=(L=($=(D=(Q=E==null?void 0:E.product)==null?void 0:Q.price)==null?void 0:D.final)==null?void 0:$.amount)==null?void 0:L.value)})});const C=(k=t==null?void 0:t.minimum)==null?void 0:k.final.amount.value,x=(v=t==null?void 0:t.maximum)==null?void 0:v.final.amount.value;let T;((A=(U=t==null?void 0:t.minimum)==null?void 0:U.regular)==null?void 0:A.amount.value)===((V=(I=t==null?void 0:t.maximum)==null?void 0:I.regular)==null?void 0:V.amount.value)&&(T=(N=(F=t==null?void 0:t.minimum)==null?void 0:F.regular)==null?void 0:N.amount.value);const O=((M=(G=t==null?void 0:t.minimum)==null?void 0:G.final)==null?void 0:M.amount.currency)==="NONE"?"USD":(Y=(W=t==null?void 0:t.minimum)==null?void 0:W.final)==null?void 0:Y.amount.currency;return n&&(o==null?void 0:o.length)<1?[T,C,x,O]:g===(t==null?void 0:t.maximum.regular.amount.value)?[w,w,w,O]:[T,C,x,O]}const[u,f,P,h]=l==="SimpleProductView"?a():n?m():c(),y=l==="SimpleProductView"?(d=r==null?void 0:r.roles)==null?void 0:d.includes("visible"):((X=(b=t==null?void 0:t.maximum)==null?void 0:b.roles)==null?void 0:X.includes("visible"))&&((z=(B=t==null?void 0:t.minimum)==null?void 0:B.roles)==null?void 0:z.includes("visible"));return P&&f===P?{regular:{amount:u,currency:h,variant:u&&f!==u?"strikethrough":"default"},final:{amount:P,currency:h,variant:"default"},visible:y}:{final:{minimumAmount:f,maximumAmount:P,currency:h},visible:y}}function Ee(e,n,i){var r;return n?((r=e==null?void 0:e.options)==null?void 0:r.map(({values:s})=>{var a;const o=((a=s==null?void 0:s.find(({isDefault:c})=>c))==null?void 0:a.id)??null,l=i?s[0].id:null;return o||l})).filter(s=>s!==null):e==null?void 0:e.optionUIDs}const H=new ae({init:async e=>{var a,c,m;const n=(c=(a=e==null?void 0:e.models)==null?void 0:a.ProductDetails)==null?void 0:c.initialData,i=le()||{},r=((m=i.optionsUIDs)==null?void 0:m.split(","))||(n==null?void 0:n.optionsUIDs);let t=1;const s=i.quantity;if(s){const u=parseInt(s,10);!isNaN(u)&&Number.isInteger(u)&&u>0&&(t=u)}const l={...{defaultLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:r},...e};if(H.config.setConfig({...l}),l!=null&&l.sku){const u=n?K(n):await te(l.sku,{preselectFirstOption:l.preselectFirstOption});p.emit("pdp/data",u);const f={sku:l.sku,quantity:t,optionsUIDs:u==null?void 0:u.optionUIDs};Ue(()=>({...f})),Ie(()=>{var P;return u!=null&&u.options?u.options.length===((P=u==null?void 0:u.optionUIDs)==null?void 0:P.length):!0}),l.acdl&&u&&he(u)}},listeners:()=>[p.on("locale",async()=>{const{sku:e}=H.config.getConfig();if(e){const n=await te(e);p.emit("pdp/data",n)}})]}),_=H.config,{setEndpoint:Le,setFetchGraphQlHeader:Qe,removeFetchGraphQlHeader:je,setFetchGraphQlHeaders:qe,fetchGraphQl:se,getConfig:He}=new ue().getMethods(),pe=`
3
+ import{merge as oe,Initializer as ue}from"@dropins/tools/lib.js";import{events as p}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as ne}from"../fragments.js";import{FetchGraphQL as le}from"@dropins/tools/fetch-graphql.js";function Le(e){const n=new URLSearchParams(window.location.search);Object.entries(e).forEach(([i,t])=>{t===null?n.delete(i):n.set(i,String(t))});let r=window.location.pathname;r+=`?${n.toString()}`,r+=window.location.hash,window.history.replaceState({},"",r)}function ie(){const e=new URLSearchParams(window.location.search),n={};return e.forEach((r,i)=>{n[i]=r}),n}function me(e=1){const r=(ie()||{}).quantity;if(r){const i=parseInt(r,10);if(!isNaN(i)&&Number.isInteger(i)&&i>0)return i}return e}function ce(e){var n,r,i,t,s,a,l,o,m,u,c,f;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((r=(n=e==null?void 0:e.prices)==null?void 0:n.regular)==null?void 0:r.amount)||0,minimalPrice:(t=(i=e==null?void 0:e.prices)==null?void 0:i.final)==null?void 0:t.minimumAmount,maximalPrice:(a=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:a.maximumAmount,specialPrice:(o=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:o.amount,tierPricing:void 0,currencyCode:((u=(m=e==null?void 0:e.prices)==null?void 0:m.final)==null?void 0:u.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(f=(c=e==null?void 0:e.images)==null?void 0:c[0])==null?void 0:f.url}}const fe={PRODUCT_CONTEXT:"productContext"},Pe={PRODUCT_PAGE_VIEW:"product-page-view"};function re(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function de(e,n){const r=re();r.push({[e]:null}),r.push({[e]:n})}function he(e,n){re().push(i=>{const t=i.getState?i.getState():{};i.push({event:e,eventInfo:{...t,...n}})})}function ye(e){const n=ce(e);de(fe.PRODUCT_CONTEXT,n),he(Pe.PRODUCT_PAGE_VIEW)}var q=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(q||{}),se=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(se||{});function K(e,n){var a,l,o,m,u,c,f,d,h,w,P,b;const r=((m=(o=(l=(a=e==null?void 0:e.options)==null?void 0:a[0])==null?void 0:l.values)==null?void 0:o[0])==null?void 0:m.__typename)==="ProductViewOptionValueProduct",i=pe(e,r,n==null?void 0:n.preselectFirstOption),t=(e==null?void 0:e.__typename)===se.SimpleProductView?q.SimpleProduct:q.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:r,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:we(e),prices:Ee(e,r,i),attributes:ge(e),options:De(e,r),optionUIDs:i,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,productType:t}:null;return oe(s,((d=(f=(c=(u=_.getConfig())==null?void 0:u.models)==null?void 0:c.ProductDetails)==null?void 0:f.transformer)==null?void 0:d.call(f,e))??((b=(P=(w=(h=_.getConfig())==null?void 0:h.models)==null?void 0:w.ProductDetails)==null?void 0:P.transform)==null?void 0:b.call(P,e)))}function we(e){var n,r;return(r=(n=e.images)==null?void 0:n.filter(i=>{var t;return!((t=i.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:r.map(i=>(i.url=i.url.replace(/^https?:/,""),i))}function ge(e){var n,r;return(r=(n=e.attributes)==null?void 0:n.filter(({roles:i})=>(i==null?void 0:i.indexOf("visible_in_pdp"))!==-1))==null?void 0:r.map(({label:i,value:t,name:s})=>({id:s,label:i,value:t.toString().split(",").join(", ")}))}function De(e,n){const{options:r,optionUIDs:i}=e;return r==null?void 0:r.map(({id:t,title:s,required:a,multi:l,values:o})=>{var c;const m=(c=o==null?void 0:o[0])==null?void 0:c.__typename;let u=o==null?void 0:o[0].type;return u?u=u.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):u="dropdown",{id:t,type:u,typename:m,label:s,required:a,multiple:l,items:n?Ce(o,i):xe(o,i,u)}})}function Ce(e,n){return e==null?void 0:e.filter(({enabled:r})=>typeof r>"u"||r).map(({id:r,title:i,inStock:t,isDefault:s,product:a})=>({id:r,inStock:t,label:i,selected:(n==null?void 0:n.indexOf(r))>-1||s,value:r,product:a}))}function xe(e,n,r){return e==null?void 0:e.map(({id:i,title:t,inStock:s,value:a})=>({id:i,inStock:s,label:t,selected:(n==null?void 0:n.indexOf(i))>-1,value:(r==null?void 0:r.toLowerCase())==="dropdown"?i:a==null?void 0:a.replace(/^https?:/,"")}))}function Ee(e,n,r){var P,b,X,B,z;const{price:i,priceRange:t,options:s,optionUIDs:a=r}=e;let{__typename:l}=e;function o(){var x;const D=i.regular.amount.value,y=((x=i.final)==null?void 0:x.amount.value)??i.regular.amount.value,C=i.regular.amount.currency==="NONE"?"USD":i==null?void 0:i.regular.amount.currency;return[D,y,y,C]}function m(){var T,O,k,v,U,A,I,V,F,N,G,M;const D=(T=t==null?void 0:t.minimum)==null?void 0:T.final.amount.value,y=(O=t==null?void 0:t.maximum)==null?void 0:O.final.amount.value;let C;((v=(k=t==null?void 0:t.minimum)==null?void 0:k.regular)==null?void 0:v.amount.value)===((A=(U=t==null?void 0:t.maximum)==null?void 0:U.regular)==null?void 0:A.amount.value)&&(C=(V=(I=t==null?void 0:t.minimum)==null?void 0:I.regular)==null?void 0:V.amount.value);const x=((N=(F=t==null?void 0:t.minimum)==null?void 0:F.final)==null?void 0:N.amount.currency)==="NONE"?"USD":(M=(G=t==null?void 0:t.minimum)==null?void 0:G.final)==null?void 0:M.amount.currency;return[C,D,y,x]}function u(){var k,v,U,A,I,V,F,N,G,M,W,Y;let D=0,y=0;s==null||s.forEach(S=>{var J;const j=S==null?void 0:S.values;if(j&&Array.isArray(j)){const E=j.map(g=>{var $,L,Z,R;return(R=(Z=(L=($=g==null?void 0:g.product)==null?void 0:$.price)==null?void 0:L.regular)==null?void 0:Z.amount)==null?void 0:R.value}).filter(g=>g!==void 0),Q=E.length>0?Math.max(...E):0;D+=Q}(J=S==null?void 0:S.values)==null||J.forEach(E=>{var Q,g,$,L;a!=null&&a.includes(E.id)&&(y+=(L=($=(g=(Q=E==null?void 0:E.product)==null?void 0:Q.price)==null?void 0:g.final)==null?void 0:$.amount)==null?void 0:L.value)})});const C=(k=t==null?void 0:t.minimum)==null?void 0:k.final.amount.value,x=(v=t==null?void 0:t.maximum)==null?void 0:v.final.amount.value;let T;((A=(U=t==null?void 0:t.minimum)==null?void 0:U.regular)==null?void 0:A.amount.value)===((V=(I=t==null?void 0:t.maximum)==null?void 0:I.regular)==null?void 0:V.amount.value)&&(T=(N=(F=t==null?void 0:t.minimum)==null?void 0:F.regular)==null?void 0:N.amount.value);const O=((M=(G=t==null?void 0:t.minimum)==null?void 0:G.final)==null?void 0:M.amount.currency)==="NONE"?"USD":(Y=(W=t==null?void 0:t.minimum)==null?void 0:W.final)==null?void 0:Y.amount.currency;return n&&(a==null?void 0:a.length)<1?[T,C,x,O]:D===(t==null?void 0:t.maximum.regular.amount.value)?[y,y,y,O]:[T,C,x,O]}const[c,f,d,h]=l==="SimpleProductView"?o():n?u():m(),w=l==="SimpleProductView"?(P=i==null?void 0:i.roles)==null?void 0:P.includes("visible"):((X=(b=t==null?void 0:t.maximum)==null?void 0:b.roles)==null?void 0:X.includes("visible"))&&((z=(B=t==null?void 0:t.minimum)==null?void 0:B.roles)==null?void 0:z.includes("visible"));return d&&f===d?{regular:{amount:c,currency:h,variant:c&&f!==c?"strikethrough":"default"},final:{amount:d,currency:h,variant:"default"},visible:w}:{final:{minimumAmount:f,maximumAmount:d,currency:h},visible:w}}function pe(e,n,r){var i;return n?((i=e==null?void 0:e.options)==null?void 0:i.map(({values:s})=>{var o;const a=((o=s==null?void 0:s.find(({isDefault:m})=>m))==null?void 0:o.id)??null,l=r?s[0].id:null;return a||l})).filter(s=>s!==null):e==null?void 0:e.optionUIDs}const H=new ue({init:async e=>{var l,o,m;const n=(o=(l=e==null?void 0:e.models)==null?void 0:l.ProductDetails)==null?void 0:o.initialData,i=((m=(ie()||{}).optionsUIDs)==null?void 0:m.split(","))||(n==null?void 0:n.optionsUIDs),t=me(1),a={...{defaultLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:i},...e};if(H.config.setConfig({...a}),a!=null&&a.sku){const u=n?K(n):await te(a.sku,{preselectFirstOption:a.preselectFirstOption});p.emit("pdp/data",u);const c={sku:a.sku,quantity:t,optionsUIDs:u==null?void 0:u.optionUIDs};Ae(()=>({...c})),Ve(()=>{var f;return u!=null&&u.options?u.options.length===((f=u==null?void 0:u.optionUIDs)==null?void 0:f.length):!0}),a.acdl&&u&&ye(u)}},listeners:()=>[p.on("locale",async()=>{const{sku:e}=H.config.getConfig();if(e){const n=await te(e);p.emit("pdp/data",n)}})]}),_=H.config,{setEndpoint:Qe,setFetchGraphQlHeader:je,removeFetchGraphQlHeader:qe,setFetchGraphQlHeaders:He,fetchGraphQl:ae,getConfig:Ke}=new le().getMethods(),Te=`
4
4
  query GET_PRODUCT_DATA($skus: [String]) {
5
5
  products(skus: $skus) {
6
6
  ...PRODUCT_FRAGMENT
@@ -8,7 +8,7 @@ query GET_PRODUCT_DATA($skus: [String]) {
8
8
  }
9
9
 
10
10
  ${ne}
11
- `,Te=async(e,n,i)=>{var s;const{data:r}=await se(pe,{method:"GET",variables:{skus:[e]}}),t=(s=r==null?void 0:r.products)==null?void 0:s[0];return n!=null&&n.optionsUIDs&&(t.optionUIDs=n.optionsUIDs),t?i?t:K(t,{preselectFirstOption:n==null?void 0:n.preselectFirstOption}):null},Oe=`
11
+ `,Oe=async(e,n,r)=>{var s;const{data:i}=await ae(Te,{method:"GET",variables:{skus:[e]}}),t=(s=i==null?void 0:i.products)==null?void 0:s[0];return n!=null&&n.optionsUIDs&&(t.optionUIDs=n.optionsUIDs),t?r?t:K(t,{preselectFirstOption:n==null?void 0:n.preselectFirstOption}):null},Se=`
12
12
  query REFINE_PRODUCT_QUERY(
13
13
  $optionIds: [String!]!
14
14
  $sku: String!
@@ -30,10 +30,10 @@ query REFINE_PRODUCT_QUERY(
30
30
  }
31
31
 
32
32
  ${ne}
33
- `;async function ee(e,n){const i=_e(n),r=be(i,e),t=Oe.replace("# %extendedPlaceholder%",r),{data:s}=await se(t,{method:"GET",variables:{optionIds:n,sku:e}});return s}const Se=async(e,n,i,r)=>{var P,h,y;const t=await ee(e,n);if(!t)return null;let{products:s,refineProduct:o,...l}=t;const a=s==null?void 0:s[0],c=ke(Object.values(l),a.options,i);if(i!=null&&i.length&&o===null){n=ve(c,n,i);const d=await ee(e,n);o=d==null?void 0:d.refineProduct}const m={...o||a,sku:a.sku,name:a.name,externalParentId:a==null?void 0:a.externalId,options:c,optionUIDs:n,variantSku:(o==null?void 0:o.__typename)==="SimpleProductView"?o==null?void 0:o.sku:void 0},u=r?m:K(m),f=(y=(h=(P=_==null?void 0:_.getConfig())==null?void 0:P.models)==null?void 0:h.ProductDetails)==null?void 0:y.fallbackData;return f?f(a,u):u};function _e(e){if(e.length<2)return[e];const n=[];return e.forEach(i=>{const r=[];e.forEach(t=>{i!==t&&r.push(t)}),n.push(r)}),n}function be(e,n){return e.map((i,r)=>`
34
- ProductOption${r}: refineProduct(
33
+ `;async function ee(e,n){const r=be(n),i=ke(r,e),t=Se.replace("# %extendedPlaceholder%",i),{data:s}=await ae(t,{method:"GET",variables:{optionIds:n,sku:e}});return s}const _e=async(e,n,r,i)=>{var d,h,w;const t=await ee(e,n);if(!t)return null;let{products:s,refineProduct:a,...l}=t;const o=s==null?void 0:s[0],m=ve(Object.values(l),o.options,r);if(r!=null&&r.length&&a===null){n=Ue(m,n,r);const P=await ee(e,n);a=P==null?void 0:P.refineProduct}const u={...a||o,sku:o.sku,name:o.name,externalParentId:o==null?void 0:o.externalId,options:m,optionUIDs:n,variantSku:(a==null?void 0:a.__typename)==="SimpleProductView"?a==null?void 0:a.sku:void 0},c=i?u:K(u),f=(w=(h=(d=_==null?void 0:_.getConfig())==null?void 0:d.models)==null?void 0:h.ProductDetails)==null?void 0:w.fallbackData;return f?f(o,c):c};function be(e){if(e.length<2)return[e];const n=[];return e.forEach(r=>{const i=[];e.forEach(t=>{r!==t&&i.push(t)}),n.push(i)}),n}function ke(e,n){return e.map((r,i)=>`
34
+ ProductOption${i}: refineProduct(
35
35
  optionIds: [
36
- ${i.map(t=>`"${t}"`).join(", ")}
36
+ ${r.map(t=>`"${t}"`).join(", ")}
37
37
  ]
38
38
  sku: "${n}"
39
39
  ) {
@@ -43,4 +43,5 @@ ${ne}
43
43
  }
44
44
  }
45
45
  }
46
- `).join("")}function ke(e,n=[],i){const r=Object.values(e).filter(s=>!!s).reduce((s,o)=>o.options?[...s,...o.options]:[...s],[]),t=new Map(n.map(s=>[s.id,s]));return r.forEach(s=>{i!=null&&i.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function ve(e,n,i){const r=[];let t;return e.forEach(s=>{var o,l,a,c;i.includes(s.id)?t=((l=(o=s.values)==null?void 0:o.find(m=>n.includes(m==null?void 0:m.id)))==null?void 0:l.id)||((a=s.values[0])==null?void 0:a.id):t=(c=s.values[0])==null?void 0:c.id,r.push(t)}),r}const te=async(e,n)=>{const{anchors:i,optionsUIDs:r}=_.getConfig(),{optionsUIDs:t=r,anchors:s=i,preselectFirstOption:o,isBundle:l,skipTransform:a}=n??{};return!l&&t?await Se(e,t,s,a):await Te(e,{preselectFirstOption:o,optionsUIDs:t},a)},Ue=e=>{const n=Ae(),i=e(n);p.emit("pdp/values",{...i})},Ae=()=>{var e;return((e=p._lastEvent["pdp/values"])==null?void 0:e.payload)??null},Ie=e=>{const n=Ve(),i=e(n);p.emit("pdp/valid",i)},Ve=()=>{var e;return((e=p._lastEvent["pdp/valid"])==null?void 0:e.payload)??null};export{Qe as a,qe as b,_ as c,Te as d,Se as e,se as f,He as g,te as h,H as i,Ue as j,Ae as k,Ie as l,Ve as m,le as n,$e as o,he as p,je as r,Le as s,K as t};
46
+ `).join("")}function ve(e,n=[],r){const i=Object.values(e).filter(s=>!!s).reduce((s,a)=>a.options?[...s,...a.options]:[...s],[]),t=new Map(n.map(s=>[s.id,s]));return i.forEach(s=>{r!=null&&r.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function Ue(e,n,r){const i=[];let t;return e.forEach(s=>{var a,l,o,m;r.includes(s.id)?t=((l=(a=s.values)==null?void 0:a.find(u=>n.includes(u==null?void 0:u.id)))==null?void 0:l.id)||((o=s.values[0])==null?void 0:o.id):t=(m=s.values[0])==null?void 0:m.id,i.push(t)}),i}const te=async(e,n)=>{const{anchors:r,optionsUIDs:i}=_.getConfig(),{optionsUIDs:t=i,anchors:s=r,preselectFirstOption:a,isBundle:l,skipTransform:o}=n??{};return!l&&t?await _e(e,t,s,o):await Oe(e,{preselectFirstOption:a,optionsUIDs:t},o)},Ae=e=>{const n=Ie(),r=e(n);p.emit("pdp/values",{...r})},Ie=()=>{var e;return((e=p._lastEvent["pdp/values"])==null?void 0:e.payload)??null},Ve=e=>{const n=Fe(),r=e(n);p.emit("pdp/valid",r)},Fe=()=>{var e;return((e=p._lastEvent["pdp/valid"])==null?void 0:e.payload)??null};export{je as a,He as b,_ as c,Oe as d,_e as e,ae as f,Ke as g,te as h,H as i,Ae as j,Ie as k,Ve as l,Fe as m,me as n,Le as o,ye as p,qe as r,Qe as s,K as t};
47
+ //# sourceMappingURL=isProductConfigurationValid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isProductConfigurationValid.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValues/setProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/getProductConfigurationValues/getProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValid/setProductConfigurationValid.ts","/@dropins/storefront-pdp/src/api/isProductConfigurationValid/isProductConfigurationValid.ts"],"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\nexport function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\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 { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\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\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n/**\n* Sets a context in the Adobe Client Data Layer (ACDL)\n* Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n*/\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\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\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple'\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView'\n}\n","/**\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 */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n }\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: transformOptions(data, isBundle),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data)\n );\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0].type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map(({ id, title, inStock, isDefault, product }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[]\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n let { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price.regular.amount.value;\n const finalPrice = price.final?.amount.value ?? price.regular.amount.value;\n\n const currency =\n price.regular.amount.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular.amount.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum.regular.amount.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n if (finalMaximumPrice && finalMinimumPrice === finalMaximumPrice) {\n const hasDiscount = regularPrice && finalMinimumPrice !== regularPrice;\n\n return {\n regular: {\n amount: regularPrice,\n currency,\n variant: hasDiscount ? 'strikethrough' : 'default',\n },\n final: {\n amount: finalMaximumPrice,\n currency,\n variant: 'default',\n },\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean\n): string[] {\n if (isBundle) {\n const selections: Array<string | null> = data?.options?.map(\n ({ values }: any) => {\n const defaultSelection =\n values?.find(({ isDefault }: any) => isDefault)?.id ?? null;\n const preselectedFirstOption = preselectFirstOption\n ? values[0].id\n : null;\n return defaultSelection || preselectedFirstOption;\n }\n );\n\n return selections.filter((selection) => selection !== null) as string[];\n }\n\n return data?.optionUIDs;\n}\n","/**\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 { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport {\n fetchProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n defaultLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n [name: string]: {\n initialData: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel\n ) => ProductModel;\n };\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data);\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }));\n\n setProductConfigurationValid(() => {\n // configurable product, check if all options are selected\n if (data?.options) {\n // all selections should be made\n return data.options.length === data?.optionUIDs?.length;\n }\n\n // simple product\n return true;\n });\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next);\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\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 { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\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 { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\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 { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\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 { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\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 { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n const optionPairCombinations = getPairCombination(optionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: optionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n let { products, refineProduct, ...refinedOptions } = data;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[]\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[]\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\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 { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform\n );\n};\n","/**\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 { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\nimport { getProductConfigurationValues } from '@/pdp/api';\n\nexport const setProductConfigurationValues = (\n callback: (prev: ValuesModel) => ValuesModel\n) => {\n const prev = getProductConfigurationValues();\n\n const next = callback(prev as ValuesModel);\n\n events.emit('pdp/values', { ...next });\n};\n","/**\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 { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\n\nexport const getProductConfigurationValues = (): ValuesModel | null => {\n return events._lastEvent['pdp/values']?.payload ?? null;\n};\n","/**\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 { events } from '@adobe-commerce/event-bus';\nimport { isProductConfigurationValid } from '@/pdp/api';\n\nexport const setProductConfigurationValid = (\n callback: (prev: boolean) => boolean\n) => {\n const prev = isProductConfigurationValid();\n\n const next = callback(prev as boolean);\n\n events.emit('pdp/valid', next);\n};\n","/**\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 { events } from '@adobe-commerce/event-bus';\n\nexport const isProductConfigurationValid = (): boolean | null => {\n return events._lastEvent['pdp/valid']?.payload ?? null;\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","setContext","name","data","adobeDataLayer","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","transformProductData","options","isBundle","optionUIDs","getOptionUIDs","productType","productData","transformImages","transformPrices","transformAttributes","transformOptions","merge","config","image","roles","label","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","getBundleProductPrice","maxSumRegular","bundlePrice","option","regularAmounts","amount","maxRegularAmount","visible","preselectFirstOption","defaultSelection","preselectedFirstOption","selection","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","next","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","raw","REFINE_PRODUCT_QUERY","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","products","refineProduct","refinedOptions","parent","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","item","temp","item2","ids","x","acc","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform","callback","prev","getProductConfigurationValues","isProductConfigurationValid"],"mappings":"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"}