@dropins/storefront-pdp 3.2.0-beta.0 → 3.2.0-beta.2

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/CHANGELOG.md +16 -5
  2. package/api.js +216 -3
  3. package/api.js.map +1 -1
  4. package/chunks/components.js +4 -0
  5. package/chunks/components.js.map +1 -0
  6. package/components/Swatches/Swatches.d.ts +3 -8
  7. package/containers/ProductAttributes.js +1 -1
  8. package/containers/ProductAttributes.js.map +1 -1
  9. package/containers/ProductDescription.js +1 -1
  10. package/containers/ProductDescription.js.map +1 -1
  11. package/containers/ProductDetails.js +1 -1
  12. package/containers/ProductDetails.js.map +1 -1
  13. package/containers/ProductDownloadableOptions.js +1 -1
  14. package/containers/ProductDownloadableOptions.js.map +1 -1
  15. package/containers/ProductGallery.js +1 -1
  16. package/containers/ProductGallery.js.map +1 -1
  17. package/containers/ProductGiftCardOptions.js +1 -1
  18. package/containers/ProductGiftCardOptions.js.map +1 -1
  19. package/containers/ProductHeader.js +1 -1
  20. package/containers/ProductHeader.js.map +1 -1
  21. package/containers/ProductOptions.js +1 -1
  22. package/containers/ProductOptions.js.map +1 -1
  23. package/containers/ProductPrice.js +1 -1
  24. package/containers/ProductPrice.js.map +1 -1
  25. package/containers/ProductQuantity.js +1 -1
  26. package/containers/ProductQuantity.js.map +1 -1
  27. package/containers/ProductShortDescription.js +1 -1
  28. package/containers/ProductShortDescription.js.map +1 -1
  29. package/fragments.js +1 -171
  30. package/fragments.js.map +1 -1
  31. package/lib/product-option-selection.d.ts +27 -0
  32. package/package.json +2 -2
  33. package/render.js +3 -5
  34. package/render.js.map +1 -1
  35. package/chunks/DownloadableOptions2.js +0 -4
  36. package/chunks/DownloadableOptions2.js.map +0 -1
  37. package/chunks/GiftCardOptions2.js +0 -4
  38. package/chunks/GiftCardOptions2.js.map +0 -1
  39. package/chunks/PriceRange.js +0 -4
  40. package/chunks/PriceRange.js.map +0 -1
  41. package/chunks/Swatches.js +0 -4
  42. package/chunks/Swatches.js.map +0 -1
  43. package/chunks/Zoom.js +0 -4
  44. package/chunks/Zoom.js.map +0 -1
  45. package/chunks/fetchProductData.js +0 -47
  46. package/chunks/fetchProductData.js.map +0 -1
  47. package/chunks/getFetchedProductData.js +0 -4
  48. package/chunks/getFetchedProductData.js.map +0 -1
  49. package/chunks/getProductConfigurationValues.js +0 -4
  50. package/chunks/getProductConfigurationValues.js.map +0 -1
  51. package/chunks/isProductConfigurationValid.js +0 -4
  52. package/chunks/isProductConfigurationValid.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProductGiftCardOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGiftCardOptions/ProductGiftCardOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { Container, classes } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { Option } from '@/pdp/data/models/values-model';\nimport {\n getFetchedProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { GiftCardOptions } from '@/pdp/components/GiftCardOptions';\nimport { useProductData, getAttributesById } from '@/pdp/lib/useProductData';\n\nexport interface ProductGiftCardOptionsProps\n extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductGiftCardOptions: Container<\n ProductGiftCardOptionsProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const { data, values } = useProductData({\n scope,\n initialData,\n initialValues: { enteredOptions: [] },\n });\n\n const handleOptionChange = (uid: string, value: string) => {\n const prevOptions = values.enteredOptions || [];\n const idx = prevOptions.findIndex((field) => field.uid === uid);\n const newEnteredOptions =\n idx !== -1\n ? prevOptions.map((field) =>\n field.uid === uid ? { ...field, value } : field\n )\n : [...prevOptions, { uid, value }];\n\n setProductConfigurationValues((prev) => ({\n ...prev,\n enteredOptions: newEnteredOptions,\n }));\n };\n\n const handleValidationChange = (valid: boolean) => {\n setProductConfigurationValid(() => valid);\n };\n\n if (!data) return null;\n\n const giftcardAttributes = getAttributesById<{ options: Option[] }>(\n data,\n 'ac_giftcard'\n );\n\n if (giftcardAttributes.length === 0) return null;\n\n return (\n <div\n {...props}\n className={classes(['pdp-gift-card-options', props.className])}\n >\n {giftcardAttributes.map((giftcard, index) => (\n <GiftCardOptions\n key={`giftcard-${index}`}\n options={giftcard.value?.options || []}\n className={props.className}\n optionValues={(values.enteredOptions || []).map((opt) => ({\n id: opt.uid,\n value: opt.value,\n }))}\n currency={data.prices?.final?.currency}\n onOptionChange={handleOptionChange}\n onValidationChange={handleValidationChange}\n />\n ))}\n </div>\n );\n};\n\nProductGiftCardOptions.getInitialData = getFetchedProductData;\n"],"names":["ProductGiftCardOptions","initialData","scope","children","props","data","values","useProductData","handleOptionChange","uid","value","prevOptions","newEnteredOptions","field","setProductConfigurationValues","prev","handleValidationChange","valid","setProductConfigurationValid","giftcardAttributes","getAttributesById","jsx","classes","giftcard","index","GiftCardOptions","_a","opt","_c","_b","getFetchedProductData"],"mappings":"mmBAiCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAA,EAAWC,EAAe,CACtC,MAAAL,EACA,YAAAD,EACA,cAAe,CAAE,eAAgB,CAAA,CAAC,CAAE,CACrC,EAEKO,EAAqB,CAACC,EAAaC,IAAkB,CACzD,MAAMC,EAAcL,EAAO,gBAAkB,CAAA,EAEvCM,EADMD,EAAY,UAAWE,GAAUA,EAAM,MAAQJ,CAAG,IAEpD,GACJE,EAAY,IAAKE,GACfA,EAAM,MAAQJ,EAAM,CAAE,GAAGI,EAAO,MAAAH,GAAUG,CAAA,EAE5C,CAAC,GAAGF,EAAa,CAAE,IAAAF,EAAK,MAAAC,EAAO,EAErCI,EAA+BC,IAAU,CACvC,GAAGA,EACH,eAAgBH,CAAA,EAChB,CACJ,EAEMI,EAA0BC,GAAmB,CACjDC,EAA6B,IAAMD,CAAK,CAC1C,EAEA,GAAI,CAACZ,EAAM,OAAO,KAElB,MAAMc,EAAqBC,EACzBf,EACA,aAAA,EAGF,OAAIc,EAAmB,SAAW,EAAU,KAG1CE,EAAC,MAAA,CACE,GAAGjB,EACJ,UAAWkB,EAAQ,CAAC,wBAAyBlB,EAAM,SAAS,CAAC,EAE5D,SAAAe,EAAmB,IAAI,CAACI,EAAUC,IAAA,WACjC,OAAAH,EAACI,EAAA,CAEC,UAASC,EAAAH,EAAS,QAAT,YAAAG,EAAgB,UAAW,CAAA,EACpC,UAAWtB,EAAM,UACjB,cAAeE,EAAO,gBAAkB,CAAA,GAAI,IAAKqB,IAAS,CACxD,GAAIA,EAAI,IACR,MAAOA,EAAI,KAAA,EACX,EACF,UAAUC,GAAAC,EAAAxB,EAAK,SAAL,YAAAwB,EAAa,QAAb,YAAAD,EAAoB,SAC9B,eAAgBpB,EAChB,mBAAoBQ,CAAA,EATf,YAAYQ,CAAK,EAAA,EAWzB,CAAA,CAAA,CAGP,EAEAxB,EAAuB,eAAiB8B"}
1
+ {"version":3,"file":"ProductGiftCardOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGiftCardOptions/ProductGiftCardOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { Container, classes } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { Option } from '@/pdp/data/models/values-model';\nimport {\n getFetchedProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { GiftCardOptions } from '@/pdp/components/GiftCardOptions';\nimport { useProductData, getAttributesById } from '@/pdp/lib/useProductData';\n\nexport interface ProductGiftCardOptionsProps\n extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductGiftCardOptions: Container<\n ProductGiftCardOptionsProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const { data, values } = useProductData({\n scope,\n initialData,\n initialValues: { enteredOptions: [] },\n });\n\n const handleOptionChange = (uid: string, value: string) => {\n const prevOptions = values.enteredOptions || [];\n const idx = prevOptions.findIndex((field) => field.uid === uid);\n const newEnteredOptions =\n idx !== -1\n ? prevOptions.map((field) =>\n field.uid === uid ? { ...field, value } : field\n )\n : [...prevOptions, { uid, value }];\n\n setProductConfigurationValues((prev) => ({\n ...prev,\n enteredOptions: newEnteredOptions,\n }));\n };\n\n const handleValidationChange = (valid: boolean) => {\n setProductConfigurationValid(() => valid);\n };\n\n if (!data) return null;\n\n const giftcardAttributes = getAttributesById<{ options: Option[] }>(\n data,\n 'ac_giftcard'\n );\n\n if (giftcardAttributes.length === 0) return null;\n\n return (\n <div\n {...props}\n className={classes(['pdp-gift-card-options', props.className])}\n >\n {giftcardAttributes.map((giftcard, index) => (\n <GiftCardOptions\n key={`giftcard-${index}`}\n options={giftcard.value?.options || []}\n className={props.className}\n optionValues={(values.enteredOptions || []).map((opt) => ({\n id: opt.uid,\n value: opt.value,\n }))}\n currency={data.prices?.final?.currency}\n onOptionChange={handleOptionChange}\n onValidationChange={handleValidationChange}\n />\n ))}\n </div>\n );\n};\n\nProductGiftCardOptions.getInitialData = getFetchedProductData;\n"],"names":["ProductGiftCardOptions","initialData","scope","children","props","data","values","useProductData","handleOptionChange","uid","value","prevOptions","newEnteredOptions","field","setProductConfigurationValues","prev","handleValidationChange","valid","setProductConfigurationValid","giftcardAttributes","getAttributesById","jsx","classes","giftcard","index","GiftCardOptions","_a","opt","_c","_b","getFetchedProductData"],"mappings":"qkBAiCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAA,EAAWC,EAAe,CACtC,MAAAL,EACA,YAAAD,EACA,cAAe,CAAE,eAAgB,CAAA,CAAC,CAAE,CACrC,EAEKO,EAAqB,CAACC,EAAaC,IAAkB,CACzD,MAAMC,EAAcL,EAAO,gBAAkB,CAAA,EAEvCM,EADMD,EAAY,UAAWE,GAAUA,EAAM,MAAQJ,CAAG,IAEpD,GACJE,EAAY,IAAKE,GACfA,EAAM,MAAQJ,EAAM,CAAE,GAAGI,EAAO,MAAAH,GAAUG,CAAA,EAE5C,CAAC,GAAGF,EAAa,CAAE,IAAAF,EAAK,MAAAC,EAAO,EAErCI,EAA+BC,IAAU,CACvC,GAAGA,EACH,eAAgBH,CAAA,EAChB,CACJ,EAEMI,EAA0BC,GAAmB,CACjDC,EAA6B,IAAMD,CAAK,CAC1C,EAEA,GAAI,CAACZ,EAAM,OAAO,KAElB,MAAMc,EAAqBC,EACzBf,EACA,aAAA,EAGF,OAAIc,EAAmB,SAAW,EAAU,KAG1CE,EAAC,MAAA,CACE,GAAGjB,EACJ,UAAWkB,EAAQ,CAAC,wBAAyBlB,EAAM,SAAS,CAAC,EAE5D,SAAAe,EAAmB,IAAI,CAACI,EAAUC,IAAA,WACjC,OAAAH,EAACI,EAAA,CAEC,UAASC,EAAAH,EAAS,QAAT,YAAAG,EAAgB,UAAW,CAAA,EACpC,UAAWtB,EAAM,UACjB,cAAeE,EAAO,gBAAkB,CAAA,GAAI,IAAKqB,IAAS,CACxD,GAAIA,EAAI,IACR,MAAOA,EAAI,KAAA,EACX,EACF,UAAUC,GAAAC,EAAAxB,EAAK,SAAL,YAAAwB,EAAa,QAAb,YAAAD,EAAoB,SAC9B,eAAgBpB,EAChB,mBAAoBQ,CAAA,EATf,YAAYQ,CAAK,EAAA,EAWzB,CAAA,CAAA,CAGP,EAEAxB,EAAuB,eAAiB8B"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as m,jsx as e,Fragment as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useEffect as u}from"@dropins/tools/preact-compat.js";import{VComponent as s,classes as _}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{events as v}from"@dropins/tools/event-bus.js";import{g as N}from"../chunks/getFetchedProductData.js";const g=({className:i,title:d,sku:l,hideSku:o=!1,variantName:r,variantSku:t,children:c,...a})=>m("div",{...a,className:_(["pdp-header",i]),children:[e("div",{className:"pdp-header__title",children:e(s,{node:d})}),!o&&e("div",{className:"pdp-header__sku",children:e(s,{node:l})}),(r||t)&&m("div",{className:"pdp-header__variant",children:[r&&e("span",{className:"pdp-header__variant-name",children:e(s,{node:r})}),r&&t&&e("span",{className:"pdp-header__variant-separator",children:" – "}),t&&e("span",{className:"pdp-header__variant-sku",children:e(s,{node:t})})]})]}),k=({initialData:i=null,scope:d,hideSku:l=!1,showVariantSku:o=!1,showVariantName:r=!1,children:t,...c})=>{const[a,h]=f(i);return u(()=>{const p=v.on("pdp/data",h,{scope:d});return()=>{p==null||p.off()}},[d]),a?e(g,{...c,title:e(n,{children:a.name}),sku:e(n,{children:a.sku}),hideSku:l,variantName:r&&a.variantName?e(n,{children:a.variantName}):void 0,variantSku:o&&a.variantSku?e(n,{children:a.variantSku}):void 0}):null};k.getInitialData=N;export{k as ProductHeader,k as default};
3
+ import{jsx as r,Fragment as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as f,useEffect as s}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";import{H as p}from"../chunks/components.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{events as c}from"@dropins/tools/event-bus.js";import{getFetchedProductData as v}from"../api.js";import"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const h=({initialData:o=null,scope:i,hideSku:n=!1,showVariantSku:m=!1,showVariantName:d=!1,children:k,...l})=>{const[t,u]=f(o);return s(()=>{const e=c.on("pdp/data",u,{scope:i});return()=>{e==null||e.off()}},[i]),t?r(p,{...l,title:r(a,{children:t.name}),sku:r(a,{children:t.sku}),hideSku:n,variantName:d&&t.variantName?r(a,{children:t.variantName}):void 0,variantSku:m&&t.variantSku?r(a,{children:t.variantSku}):void 0}):null};h.getInitialData=v;export{h as ProductHeader,h as default};
4
4
  //# sourceMappingURL=ProductHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductHeader.js","sources":["/@dropins/storefront-pdp/src/components/Header/Header.tsx","/@dropins/storefront-pdp/src/containers/ProductHeader/ProductHeader.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/pdp/components/Header/Header.css';\n\nexport interface HeaderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: VNode;\n sku: VNode;\n hideSku?: boolean;\n /** When provided, displayed as variant name (e.g. when all options are selected on a configurable product) */\n variantName?: VNode;\n /** When provided, displayed as variant SKU (e.g. when all options are selected on a configurable product) */\n variantSku?: VNode;\n}\n\nexport const Header: FunctionComponent<HeaderProps> = ({\n className,\n title,\n sku,\n hideSku = false,\n variantName,\n variantSku,\n children,\n ...props\n}) => {\n return (\n <div {...props} className={classes(['pdp-header', className])}>\n <div className=\"pdp-header__title\">\n <VComponent node={title} />\n </div>\n {!hideSku && (\n <div className=\"pdp-header__sku\">\n <VComponent node={sku} />\n </div>\n )}\n {(variantName || variantSku) && (\n <div className=\"pdp-header__variant\">\n {variantName && (\n <span className=\"pdp-header__variant-name\">\n <VComponent node={variantName} />\n </span>\n )}\n {variantName && variantSku && (\n <span className=\"pdp-header__variant-separator\"> – </span>\n )}\n {variantSku && (\n <span className=\"pdp-header__variant-sku\">\n <VComponent node={variantSku} />\n </span>\n )}\n </div>\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 */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Header } from '@/pdp/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductHeaderProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSku?: boolean;\n /** When true, show variant SKU when all options are selected (configurable product). Default false. */\n showVariantSku?: boolean;\n /** When true, show variant name when all options are selected (configurable product). Default false. */\n showVariantName?: boolean;\n}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n hideSku = false,\n showVariantSku = false,\n showVariantName = false,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <Header\n {...props}\n title={<>{data.name}</>}\n sku={<>{data.sku}</>}\n hideSku={hideSku}\n variantName={\n showVariantName && data.variantName ? (\n <>{data.variantName}</>\n ) : undefined\n }\n variantSku={\n showVariantSku && data.variantSku ? <>{data.variantSku}</> : undefined\n }\n />\n );\n};\n\nProductHeader.getInitialData = getFetchedProductData;\n"],"names":["Header","className","title","sku","hideSku","variantName","variantSku","children","props","jsxs","classes","jsx","VComponent","ProductHeader","initialData","scope","showVariantSku","showVariantName","data","setData","useState","useEffect","dataEvent","events","Fragment","getFetchedProductData"],"mappings":"oiBAgCO,MAAMA,EAAyC,CAAC,CACrD,UAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,GACV,YAAAC,EACA,WAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAEIC,EAAC,MAAA,CAAK,GAAGD,EAAO,UAAWE,EAAQ,CAAC,aAAcT,CAAS,CAAC,EAC1D,SAAA,CAAAU,EAAC,OAAI,UAAU,oBACb,WAACC,EAAA,CAAW,KAAMV,EAAO,CAAA,CAC3B,EACC,CAACE,GACAO,EAAC,MAAA,CAAI,UAAU,kBACb,SAAAA,EAACC,EAAA,CAAW,KAAMT,CAAA,CAAK,CAAA,CACzB,GAEAE,GAAeC,IACfG,EAAC,MAAA,CAAI,UAAU,sBACZ,SAAA,CAAAJ,GACCM,EAAC,QAAK,UAAU,2BACd,WAACC,EAAA,CAAW,KAAMP,EAAa,CAAA,CACjC,EAEDA,GAAeC,GACdK,EAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,MAAG,EAEpDL,KACE,OAAA,CAAK,UAAU,0BACd,SAAAK,EAACC,EAAA,CAAW,KAAMN,CAAA,CAAY,CAAA,CAChC,CAAA,CAAA,CAEJ,CAAA,EAEJ,ECrCSO,EAGT,CAAC,CACH,YAAAC,EAAc,KACd,MAAAC,EACA,QAAAX,EAAU,GACV,eAAAY,EAAiB,GACjB,gBAAAC,EAAkB,GAClB,SAAAV,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACU,EAAMC,CAAO,EAAIC,EAA8BN,CAAW,EAUjE,OARAO,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAJ,EAAO,EAE1D,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,CAACP,CAAK,CAAC,EAELG,EAGHP,EAACX,EAAA,CACE,GAAGQ,EACJ,MAAOG,EAAAa,EAAA,CAAG,SAAAN,EAAK,KAAK,EACpB,IAAKP,EAAAa,EAAA,CAAG,SAAAN,EAAK,IAAI,EACjB,QAAAd,EACA,YACEa,GAAmBC,EAAK,YACtBP,EAAAa,EAAA,CAAG,SAAAN,EAAK,YAAY,EAClB,OAEN,WACEF,GAAkBE,EAAK,WAAaP,EAAAa,EAAA,CAAG,SAAAN,EAAK,WAAW,EAAM,MAAA,CAAA,EAdjD,IAkBpB,EAEAL,EAAc,eAAiBY"}
1
+ {"version":3,"file":"ProductHeader.js","sources":["/@dropins/storefront-pdp/src/containers/ProductHeader/ProductHeader.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Header } from '@/pdp/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductHeaderProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSku?: boolean;\n /** When true, show variant SKU when all options are selected (configurable product). Default false. */\n showVariantSku?: boolean;\n /** When true, show variant name when all options are selected (configurable product). Default false. */\n showVariantName?: boolean;\n}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n hideSku = false,\n showVariantSku = false,\n showVariantName = false,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <Header\n {...props}\n title={<>{data.name}</>}\n sku={<>{data.sku}</>}\n hideSku={hideSku}\n variantName={\n showVariantName && data.variantName ? (\n <>{data.variantName}</>\n ) : undefined\n }\n variantSku={\n showVariantSku && data.variantSku ? <>{data.variantSku}</> : undefined\n }\n />\n );\n};\n\nProductHeader.getInitialData = getFetchedProductData;\n"],"names":["ProductHeader","initialData","scope","hideSku","showVariantSku","showVariantName","children","props","data","setData","useState","useEffect","dataEvent","events","jsx","Header","Fragment","getFetchedProductData"],"mappings":"wfAgCO,MAAMA,EAGT,CAAC,CACH,YAAAC,EAAc,KACd,MAAAC,EACA,QAAAC,EAAU,GACV,eAAAC,EAAiB,GACjB,gBAAAC,EAAkB,GAClB,SAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BT,CAAW,EAUjE,OARAU,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAP,EAAO,EAE1D,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,CAACV,CAAK,CAAC,EAELM,EAGHM,EAACC,EAAA,CACE,GAAGR,EACJ,MAAOO,EAAAE,EAAA,CAAG,SAAAR,EAAK,KAAK,EACpB,IAAKM,EAAAE,EAAA,CAAG,SAAAR,EAAK,IAAI,EACjB,QAAAL,EACA,YACEE,GAAmBG,EAAK,YACtBM,EAAAE,EAAA,CAAG,SAAAR,EAAK,YAAY,EAClB,OAEN,WACEJ,GAAkBI,EAAK,WAAaM,EAAAE,EAAA,CAAG,SAAAR,EAAK,WAAW,EAAM,MAAA,CAAA,EAdjD,IAkBpB,EAEAR,EAAc,eAAiBiB"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as h}from"@dropins/tools/preact-jsx-runtime.js";import{useState as P,useEffect as G,useCallback as O,useMemo as H}from"@dropins/tools/preact-compat.js";import{Slot as j}from"@dropins/tools/lib.js";import{events as S}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";/* empty css */import{S as J}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{c as y,s as K,f as Q,p as V}from"../chunks/fetchProductData.js";import{g as T,s as b}from"../chunks/getProductConfigurationValues.js";import{s as B}from"../chunks/isProductConfigurationValid.js";import{g as W}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const X=({initialData:s={data:null,optionsUIDs:[]},scope:o,hideSelectedValue:g=!1,transformer:u,slots:a,onValues:p,onErrors:m,children:Y,...M})=>{var w;const[t,F]=P(s.data),[l,L]=P(s.optionsUIDs),[N,R]=P();G(()=>{const i=S.on("pdp/data",F,{scope:o}),c=S.on("pdp/values",({optionsUIDs:f})=>{f&&L(f)},{scope:o});return()=>{i==null||i.off(),c==null||c.off()}},[]);const q=O(async i=>{var D,k,v,C;if(!(t!=null&&t.sku))return;const{persistURLParams:c,anchors:f,acdl:A}=y.getConfig()??{};let r=Object.keys(i).map(n=>i[n].value).filter(n=>n!==void 0);c&&!(t!=null&&t.isBundle)&&K({optionsUIDs:r.join(",")}),((k=(D=T({scope:o}))==null?void 0:D.optionsUIDs)==null?void 0:k.join("|"))!==(r==null?void 0:r.join("|"))&&b(n=>({...n,optionsUIDs:r}),{scope:o}),p==null||p(r);const e=await Q(t.sku,{optionsUIDs:r??[],isBundle:t==null?void 0:t.isBundle,anchors:f});S.emit("pdp/data",e,{scope:o});let U=(r==null?void 0:r.length)===((v=e==null?void 0:e.options)==null?void 0:v.length);if(f!=null&&f.length){const n=(e==null?void 0:e.optionUIDs)??[];r.every(d=>n.includes(d))||(R(e==null?void 0:e.options),b(d=>({...d,optionsUIDs:n}),{scope:o}),U=(n==null?void 0:n.length)===((C=e==null?void 0:e.options)==null?void 0:C.length))}B(()=>U,{scope:o}),A&&e&&(e==null?void 0:e.variantSku)!==t.sku&&V(e)},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,p,o]),z=O(i=>{Object.keys(i).length!==0&&(B(()=>!1,{scope:o}),m==null||m(i))},[m,o]),I=H(()=>{if(t!=null&&t.options){if(!u)return t.options;try{return u(t.options)??t.options}catch(i){return console.error("ProductOptions: transformer threw an error, using original options",i),t.options}}},[t==null?void 0:t.options,u]);return!t||!I?null:h(j,{name:"Swatches",slot:a==null?void 0:a.Swatches,context:{data:t,optionsUIDs:l},children:h(J,{...M,options:I,selectedUIDs:l,defaultOptions:l,selectionsToUpdate:N,hideSelectedValue:g,disablePreselections:!((w=y.getConfig())!=null&&w.preselectFirstOption),onValues:q,onErrors:z,imageSwatchNode:a!=null&&a.SwatchImage?({imageSwatchContext:i,...c})=>h(j,{name:"SwatchImage",slot:a==null?void 0:a.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:l,defaultImageProps:c,imageSwatchContext:i}}):void 0})})};X.getInitialData=async function(s){var u;const o=await W({scope:s==null?void 0:s.scope}),g=((u=T({scope:s==null?void 0:s.scope}))==null?void 0:u.optionsUIDs)??[];return{data:o,optionsUIDs:g}};export{X as ProductOptions,X as default};
3
+ import{jsx as I}from"@dropins/tools/preact-jsx-runtime.js";import{useState as D,useMemo as G,useEffect as H,useCallback as C}from"@dropins/tools/preact-compat.js";import{Slot as j}from"@dropins/tools/lib.js";import{events as U}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";import{S as J}from"../chunks/components.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{config as k,s as K,c as Q,getProductConfigurationValues as y,setProductConfigurationValues as B,fetchProductData as V,i as T,setProductConfigurationValid as v,p as W,getFetchedProductData as X}from"../api.js";import{useText as Y}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const Z=({initialData:n={data:null,optionsUIDs:[]},scope:i,hideSelectedValue:g=!1,transformer:p,slots:s,onValues:f,onErrors:l,children:_,...M})=>{var S;const[t,F]=D(n.data),[d,L]=D(n.optionsUIDs),[z,N]=D(),P=Y("PDP.Swatches.ChooseOption.label").label,m=G(()=>{if(t!=null&&t.options){if(!p)return t.options;try{return p(t.options)??t.options}catch(o){return console.error("ProductOptions: transformer threw an error, using original options",o),t.options}}},[t==null?void 0:t.options,p]);H(()=>{const o=U.on("pdp/data",F,{scope:i}),c=U.on("pdp/values",({optionsUIDs:a})=>{a&&L(a)},{scope:i});return()=>{o==null||o.off(),c==null||c.off()}},[]);const R=C(async o=>{var w,b;if(!(t!=null&&t.sku))return;const{persistURLParams:c,anchors:a,acdl:A}=k.getConfig()??{},E=Object.fromEntries(Object.entries(o).filter(([,u])=>u.label!==P));let r=K(E,m);c&&!(t!=null&&t.isBundle)&&Q({optionsUIDs:r.join(",")}),((b=(w=y({scope:i}))==null?void 0:w.optionsUIDs)==null?void 0:b.join("|"))!==(r==null?void 0:r.join("|"))&&B(u=>({...u,optionsUIDs:r}),{scope:i}),f==null||f(r);const e=await V(t.sku,{optionsUIDs:r??[],isBundle:t==null?void 0:t.isBundle,anchors:a});U.emit("pdp/data",e,{scope:i});let O=T(e==null?void 0:e.options,(e==null?void 0:e.optionUIDs)??r,e==null?void 0:e.isBundle);if(a!=null&&a.length){const u=(e==null?void 0:e.optionUIDs)??[];r.every(h=>u.includes(h))||(N(e==null?void 0:e.options),B(h=>({...h,optionsUIDs:u}),{scope:i}),O=T(e==null?void 0:e.options,u,e==null?void 0:e.isBundle))}v(()=>O,{scope:i}),A&&e&&(e==null?void 0:e.variantSku)!==t.sku&&W(e)},[P,t==null?void 0:t.isBundle,t==null?void 0:t.sku,f,i,m]),q=C(o=>{Object.keys(o).length!==0&&(v(()=>!1,{scope:i}),l==null||l(o))},[l,i]);return!t||!m?null:I(j,{name:"Swatches",slot:s==null?void 0:s.Swatches,context:{data:t,optionsUIDs:d},children:I(J,{...M,options:m,selectedUIDs:d,defaultOptions:d,selectionsToUpdate:z,hideSelectedValue:g,disablePreselections:!((S=k.getConfig())!=null&&S.preselectFirstOption),onValues:R,onErrors:q,imageSwatchNode:s!=null&&s.SwatchImage?({imageSwatchContext:o,...c})=>I(j,{name:"SwatchImage",slot:s==null?void 0:s.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:d,defaultImageProps:c,imageSwatchContext:o}}):void 0})})};Z.getInitialData=async function(n){var p;const i=await X({scope:n==null?void 0:n.scope}),g=((p=y({scope:n==null?void 0:n.scope}))==null?void 0:p.optionsUIDs)??[];return{data:i,optionsUIDs:g}};export{Z as ProductOptions,Z as default};
4
4
  //# sourceMappingURL=ProductOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductOptions/ProductOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Swatches } from '@/pdp/components';\nimport {\n setProductConfigurationValues,\n getProductConfigurationValues,\n setProductConfigurationValid,\n fetchProductData,\n getFetchedProductData,\n config,\n OptionsTransformer,\n} from '@/pdp/api';\nimport { setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport {\n ImageNodeRenderProps,\n ImageProps,\n} from '@adobe-commerce/elsie/components';\n\n/** @deprecated Use OptionsTransformer from @/pdp/api instead */\nexport type ProductOptionsTransformer = OptionsTransformer;\n\nexport interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSelectedValue?: boolean;\n onValues?: (optionsUIDs: string[]) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n transformer?: ProductOptionsTransformer;\n slots?: {\n Swatches?: SlotProps<{ data: ProductModel | null; optionsUIDs: string[] }>;\n SwatchImage?: SlotProps<{\n data: ProductModel | null;\n optionsUIDs: string[];\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];\n defaultImageProps: ImageProps;\n }>;\n };\n}\n\nexport const ProductOptions: Container<\n ProductOptionsProps,\n { data: ProductModel | null; optionsUIDs: string[] }\n> = ({\n initialData = { data: null, optionsUIDs: [] },\n scope,\n hideSelectedValue = false,\n transformer,\n slots,\n onValues,\n onErrors,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData.data);\n\n const [current, setCurrent] = useState<string[]>(initialData.optionsUIDs);\n\n const [selectionsToUpdate, setSelectionsToUpdate] =\n useState<ProductModel['options']>();\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\n },\n { scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n if (!data?.sku) return;\n\n const { persistURLParams, anchors, acdl } = config.getConfig() ?? {};\n\n // options selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the \"persistURLParams\" is set to true and the product is not a bundle type\n if (persistURLParams && !data?.isBundle) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // check if the options have changed and update the values only if they have changed\n if (\n getProductConfigurationValues({ scope })?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }), {\n scope,\n });\n }\n\n // pass the selected options to callback\n onValues?.(optionsUIDs);\n\n // refetch data\n const next = await fetchProductData(data.sku, {\n optionsUIDs: optionsUIDs ?? [],\n isBundle: data?.isBundle,\n anchors,\n });\n\n // emit the new data\n events.emit('pdp/data', next, { scope });\n\n let valid = optionsUIDs?.length === next?.options?.length;\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (anchors?.length) {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n\n const isMatching = optionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n\n if (!isMatching) {\n setSelectionsToUpdate(next?.options);\n setProductConfigurationValues(\n (prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }),\n { scope }\n );\n\n valid = updatedOptionsUIDs?.length === next?.options?.length;\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid, { scope });\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n },\n [data?.isBundle, data?.sku, onValues, scope]\n );\n\n const handleErrors = useCallback(\n (errors: { [id: string]: string }) => {\n const hasErrors = Object.keys(errors).length !== 0;\n\n if (hasErrors) {\n setProductConfigurationValid(() => false, { scope });\n onErrors?.(errors);\n }\n },\n [onErrors, scope]\n );\n\n // Apply transformer to options if provided\n const transformedOptions = useMemo(() => {\n if (!data?.options) return undefined;\n\n if (!transformer) {\n return data.options;\n }\n\n try {\n const transformed = transformer(data.options);\n // Fallback to original options if transformer returns null/undefined\n return transformed ?? data.options;\n } catch (error) {\n console.error(\n 'ProductOptions: transformer threw an error, using original options',\n error\n );\n return data.options;\n }\n }, [data?.options, transformer]);\n\n if (!data) return null;\n\n // Only show if there are options in the data\n if (!transformedOptions) return null;\n\n return (\n <Slot\n name=\"Swatches\"\n slot={slots?.Swatches}\n context={{ data, optionsUIDs: current }}\n >\n <Swatches\n {...props}\n options={transformedOptions}\n selectedUIDs={current}\n defaultOptions={current}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedValue}\n disablePreselections={!config.getConfig()?.preselectFirstOption}\n onValues={handleOptionSelected}\n onErrors={handleErrors}\n imageSwatchNode={\n slots?.SwatchImage\n ? ({ imageSwatchContext, ...imageProps }) => (\n <Slot\n name=\"SwatchImage\"\n slot={slots?.SwatchImage}\n slotTag=\"span\"\n contentTag=\"span\"\n context={{\n data,\n optionsUIDs: current,\n defaultImageProps: imageProps,\n imageSwatchContext,\n }}\n />\n )\n : undefined\n }\n />\n </Slot>\n );\n};\n\nProductOptions.getInitialData = async function (options) {\n const data = await getFetchedProductData({ scope: options?.scope });\n const optionsUIDs =\n getProductConfigurationValues({ scope: options?.scope })?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","scope","hideSelectedValue","transformer","slots","onValues","onErrors","children","props","data","setData","useState","current","setCurrent","selectionsToUpdate","setSelectionsToUpdate","useEffect","dataEvent","events","valuesEvent","optionsUIDs","handleOptionSelected","useCallback","selections","persistURLParams","anchors","acdl","config","id","element","setUrlParams","_b","_a","getProductConfigurationValues","setProductConfigurationValues","prev","next","fetchProductData","valid","_c","updatedOptionsUIDs","item","_d","setProductConfigurationValid","publishProductPageViewEvent","handleErrors","errors","transformedOptions","useMemo","error","jsx","Slot","Swatches","imageSwatchContext","imageProps","options","getFetchedProductData"],"mappings":"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"}
1
+ {"version":3,"file":"ProductOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductOptions/ProductOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Swatches } from '@/pdp/components';\nimport {\n setProductConfigurationValues,\n getProductConfigurationValues,\n setProductConfigurationValid,\n fetchProductData,\n getFetchedProductData,\n config,\n OptionsTransformer,\n} from '@/pdp/api';\nimport { setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport {\n ImageNodeRenderProps,\n ImageProps,\n} from '@adobe-commerce/elsie/components';\nimport {\n type ProductOptionSelectionMap,\n isProductOptionsSelectionComplete,\n selectionMapToOptionUIDs,\n} from '@/pdp/lib/product-option-selection';\n\n/** @deprecated Use OptionsTransformer from @/pdp/api instead */\nexport type ProductOptionsTransformer = OptionsTransformer;\n\nexport interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSelectedValue?: boolean;\n onValues?: (optionsUIDs: string[]) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n transformer?: ProductOptionsTransformer;\n slots?: {\n Swatches?: SlotProps<{ data: ProductModel | null; optionsUIDs: string[] }>;\n SwatchImage?: SlotProps<{\n data: ProductModel | null;\n optionsUIDs: string[];\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];\n defaultImageProps: ImageProps;\n }>;\n };\n}\n\nexport const ProductOptions: Container<\n ProductOptionsProps,\n { data: ProductModel | null; optionsUIDs: string[] }\n> = ({\n initialData = { data: null, optionsUIDs: [] },\n scope,\n hideSelectedValue = false,\n transformer,\n slots,\n onValues,\n onErrors,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData.data);\n\n const [current, setCurrent] = useState<string[]>(initialData.optionsUIDs);\n\n const [selectionsToUpdate, setSelectionsToUpdate] =\n useState<ProductModel['options']>();\n\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n // Apply transformer to options if provided (must run before selection handlers)\n const transformedOptions = useMemo(() => {\n if (!data?.options) return undefined;\n\n if (!transformer) {\n return data.options;\n }\n\n try {\n const transformed = transformer(data.options);\n // Fallback to original options if transformer returns null/undefined\n return transformed ?? data.options;\n } catch (error) {\n console.error(\n 'ProductOptions: transformer threw an error, using original options',\n error\n );\n return data.options;\n }\n }, [data?.options, transformer]);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\n },\n { scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleOptionSelected = useCallback(\n async (selections: ProductOptionSelectionMap) => {\n if (!data?.sku) return;\n\n const { persistURLParams, anchors, acdl } = config.getConfig() ?? {};\n\n const sanitizedSelections = Object.fromEntries(\n Object.entries(selections).filter(\n ([, value]) => value.label !== ChooseOptionLabel\n )\n ) as ProductOptionSelectionMap;\n\n // options selected\n let optionsUIDs = selectionMapToOptionUIDs(\n sanitizedSelections,\n transformedOptions\n );\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the \"persistURLParams\" is set to true and the product is not a bundle type\n if (persistURLParams && !data?.isBundle) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // check if the options have changed and update the values only if they have changed\n if (\n getProductConfigurationValues({ scope })?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }), {\n scope,\n });\n }\n\n // pass the selected options to callback\n onValues?.(optionsUIDs);\n\n // refetch data\n const next = await fetchProductData(data.sku, {\n optionsUIDs: optionsUIDs ?? [],\n isBundle: data?.isBundle,\n anchors,\n });\n\n // emit the new data\n events.emit('pdp/data', next, { scope });\n\n let valid = isProductOptionsSelectionComplete(\n next?.options,\n next?.optionUIDs ?? optionsUIDs,\n next?.isBundle\n );\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (anchors?.length) {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n\n const isMatching = optionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n\n if (!isMatching) {\n setSelectionsToUpdate(next?.options);\n setProductConfigurationValues(\n (prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }),\n { scope }\n );\n\n valid = isProductOptionsSelectionComplete(\n next?.options,\n updatedOptionsUIDs,\n next?.isBundle\n );\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid, { scope });\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n },\n [\n ChooseOptionLabel,\n data?.isBundle,\n data?.sku,\n onValues,\n scope,\n transformedOptions,\n ]\n );\n\n const handleErrors = useCallback(\n (errors: { [id: string]: string }) => {\n const hasErrors = Object.keys(errors).length !== 0;\n\n if (hasErrors) {\n setProductConfigurationValid(() => false, { scope });\n onErrors?.(errors);\n }\n },\n [onErrors, scope]\n );\n\n if (!data) return null;\n\n // Only show if there are options in the data\n if (!transformedOptions) return null;\n\n return (\n <Slot\n name=\"Swatches\"\n slot={slots?.Swatches}\n context={{ data, optionsUIDs: current }}\n >\n <Swatches\n {...props}\n options={transformedOptions}\n selectedUIDs={current}\n defaultOptions={current}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedValue}\n disablePreselections={!config.getConfig()?.preselectFirstOption}\n onValues={handleOptionSelected}\n onErrors={handleErrors}\n imageSwatchNode={\n slots?.SwatchImage\n ? ({ imageSwatchContext, ...imageProps }) => (\n <Slot\n name=\"SwatchImage\"\n slot={slots?.SwatchImage}\n slotTag=\"span\"\n contentTag=\"span\"\n context={{\n data,\n optionsUIDs: current,\n defaultImageProps: imageProps,\n imageSwatchContext,\n }}\n />\n )\n : undefined\n }\n />\n </Slot>\n );\n};\n\nProductOptions.getInitialData = async function (options) {\n const data = await getFetchedProductData({ scope: options?.scope });\n const optionsUIDs =\n getProductConfigurationValues({ scope: options?.scope })?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","scope","hideSelectedValue","transformer","slots","onValues","onErrors","children","props","data","setData","useState","current","setCurrent","selectionsToUpdate","setSelectionsToUpdate","ChooseOptionLabel","useText","transformedOptions","useMemo","error","useEffect","dataEvent","events","valuesEvent","optionsUIDs","handleOptionSelected","useCallback","selections","persistURLParams","anchors","acdl","config","sanitizedSelections","value","selectionMapToOptionUIDs","setUrlParams","_b","_a","getProductConfigurationValues","setProductConfigurationValues","prev","next","fetchProductData","valid","isProductOptionsSelectionComplete","updatedOptionsUIDs","item","setProductConfigurationValid","publishProductPageViewEvent","handleErrors","errors","jsx","Slot","Swatches","imageSwatchContext","imageProps","options","getFetchedProductData"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as j,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as T,useEffect as C}from"@dropins/tools/preact-compat.js";import{VComponent as x,classes as g,toLanguageTag as v}from"@dropins/tools/lib.js";import{Price as A}from"@dropins/tools/components.js";/* empty css */import{P as q}from"../chunks/PriceRange.js";import"@dropins/tools/preact.js";import{useText as b}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{events as R}from"@dropins/tools/event-bus.js";import{g as B}from"../chunks/getFetchedProductData.js";import{c as F}from"../chunks/fetchProductData.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/getProductConfigurationValues.js";import"../chunks/isProductConfigurationValid.js";const I=({className:p,price:i,specialPrice:c,tiers:a,children:s,...e})=>{const n=b("PDP.Product.RegularPrice.label").label,r=b("PDP.Product.SpecialPrice.label").label,o=b("PDP.Product.TierPrice.label").label;return j("div",{...e,className:g(["pdp-price",p]),children:[c&&t(x,{node:c,className:g(["pdp-price__amount-special","pdp-price__amount"]),"aria-label":r,role:"text"}),i&&t(x,{node:i,className:g(["pdp-price__amount-regular","pdp-price__amount--grey"]),"aria-label":n,role:"text"}),a&&t(x,{node:a,className:g(["pdp-price__tiers"]),"aria-label":o,role:"text"})]})},M=({locale:p,tiers:i,regularPrice:c,...a})=>{const s=b("PDP.Product.TierPricing.label").label;return!i||i.length===0?null:t("div",{className:"pdp-price-tiers",...a,children:i.map((e,n)=>{var m,u;const r=((m=e==null?void 0:e.tier)==null?void 0:m.amount)??0,o=(e==null?void 0:e.quantity)??0,d=((u=e==null?void 0:e.tier)==null?void 0:u.currency)??"";let l=0;c&&r&&r<c&&(l=Math.round((c-r)/c*100));const P=s.replace("{quantity}",o.toString()).split("{price}")[0],f=s.replace("{quantity}",o.toString()).split("{price}")[1].replace("{percent}",l>0?l.toString():"0");return t("div",{className:"pdp-price-tiers__tier",children:j("span",{className:"pdp-price-tiers__text",children:[P,t(A,{amount:r,currency:d,locale:p,className:"pdp-price-tiers__price"}),f]})},n)})})},U=({initialData:p=null,scope:i,children:c,...a})=>{var d,l,P,f,m,u,N,y,D,L,S;const{globalLocale:s="en-US"}=F.getConfig(),[e,n]=T(p),[r,o]=T(s);return C(()=>{const _=R.on("pdp/data",n,{scope:i}),h=R.on("locale",o);return()=>{_==null||_.off(),h==null||h.off()}},[i]),!e||!e.prices?null:t(I,{...a,specialPrice:(d=e.prices)!=null&&d.visible?t(q,{...(l=e.prices)==null?void 0:l.final,locale:v(r)}):void 0,price:(P=e.prices)!=null&&P.visible&&((f=e.prices)!=null&&f.regular)&&((m=e.prices)==null?void 0:m.final.amount)!==((u=e.prices)==null?void 0:u.regular.amount)?t(q,{...(N=e.prices)==null?void 0:N.regular,locale:v(r)}):void 0,tiers:(y=e.prices)!=null&&y.visible&&((L=(D=e.prices)==null?void 0:D.tiers)==null?void 0:L.length)>0?t(M,{tiers:e.prices.tiers,locale:v(r),regularPrice:(S=e.prices.regular)==null?void 0:S.amount}):void 0})};U.getInitialData=B;export{U as ProductPrice,U as default};
3
+ import{jsx as e}from"@dropins/tools/preact-jsx-runtime.js";import{useState as v,useEffect as C}from"@dropins/tools/preact-compat.js";import{toLanguageTag as a}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";import{P as F,b as I,a as h}from"../chunks/components.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";import{events as D}from"@dropins/tools/event-bus.js";import{config as R,getFetchedProductData as U}from"../api.js";import"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const k=({initialData:L=null,scope:c,children:q,...x})=>{var s,l,p,n,m,u,f,g,d,P,b;const{globalLocale:S="en-US"}=R.getConfig(),[r,T]=v(L),[i,j]=v(S);return C(()=>{const t=D.on("pdp/data",T,{scope:c}),o=D.on("locale",j);return()=>{t==null||t.off(),o==null||o.off()}},[c]),!r||!r.prices?null:e(F,{...x,specialPrice:(s=r.prices)!=null&&s.visible?e(h,{...(l=r.prices)==null?void 0:l.final,locale:a(i)}):void 0,price:(p=r.prices)!=null&&p.visible&&((n=r.prices)!=null&&n.regular)&&((m=r.prices)==null?void 0:m.final.amount)!==((u=r.prices)==null?void 0:u.regular.amount)?e(h,{...(f=r.prices)==null?void 0:f.regular,locale:a(i)}):void 0,tiers:(g=r.prices)!=null&&g.visible&&((P=(d=r.prices)==null?void 0:d.tiers)==null?void 0:P.length)>0?e(I,{tiers:r.prices.tiers,locale:a(i),regularPrice:(b=r.prices.regular)==null?void 0:b.amount}):void 0})};k.getInitialData=U;export{k as ProductPrice,k as default};
4
4
  //# sourceMappingURL=ProductPrice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductPrice.js","sources":["/@dropins/storefront-pdp/src/components/Price/Price.tsx","/@dropins/storefront-pdp/src/components/PriceTiers/PriceTiers.tsx","/@dropins/storefront-pdp/src/containers/ProductPrice/ProductPrice.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { FunctionComponent, VNode } from 'preact';\n\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/pdp/components/Price/Price.css';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface PriceProps extends HTMLAttributes<HTMLDivElement> {\n price?: VNode;\n specialPrice?: VNode;\n tiers?: VNode;\n}\n\nexport const Price: FunctionComponent<PriceProps> = ({\n className,\n price,\n specialPrice,\n tiers,\n children,\n ...props\n}) => {\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.label').label;\n const TierPriceLabel = useText('PDP.Product.TierPrice.label').label;\n\n return (\n <div {...props} className={classes(['pdp-price', className])}>\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes([\n 'pdp-price__amount-special',\n 'pdp-price__amount',\n ])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes([\n 'pdp-price__amount-regular',\n 'pdp-price__amount--grey',\n ])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n {tiers && (\n <VComponent\n node={tiers}\n className={classes(['pdp-price__tiers'])}\n aria-label={TierPriceLabel}\n role=\"text\"\n />\n )}\n </div>\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 { HTMLAttributes } from 'preact/compat';\nimport '@/pdp/components/PriceTiers/PriceTiers.css';\nimport { FunctionalComponent } from 'preact';\nimport { Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Tier } from '@/pdp/data/models';\n\nexport interface PriceTiersProps extends HTMLAttributes<HTMLDivElement> {\n locale?: string;\n tiers: Tier[];\n regularPrice?: number; // Base price to calculate savings percentage\n}\n\nexport const PriceTiers: FunctionalComponent<PriceTiersProps> = ({\n locale,\n tiers,\n regularPrice,\n ...props\n}) => {\n const TierPricingLabel = useText('PDP.Product.TierPricing.label').label;\n\n if (!tiers || tiers.length === 0) {\n return null;\n }\n\n return (\n <div className=\"pdp-price-tiers\" {...props}>\n {tiers.map((tier, index) => {\n const tierPrice = tier?.tier?.amount ?? 0;\n const quantity = tier?.quantity ?? 0;\n const currency = tier?.tier?.currency ?? '';\n\n let savingsPercent = 0;\n if (regularPrice && tierPrice && tierPrice < regularPrice) {\n savingsPercent = Math.round(\n ((regularPrice - tierPrice) / regularPrice) * 100\n );\n }\n\n const textBeforePrice = TierPricingLabel.replace(\n '{quantity}',\n quantity.toString()\n ).split('{price}')[0];\n\n const textAfterPrice = TierPricingLabel.replace(\n '{quantity}',\n quantity.toString()\n )\n .split('{price}')[1]\n .replace(\n '{percent}',\n savingsPercent > 0 ? savingsPercent.toString() : '0'\n );\n\n return (\n <div key={index} className=\"pdp-price-tiers__tier\">\n <span className=\"pdp-price-tiers__text\">\n {textBeforePrice}\n <Price\n amount={tierPrice}\n currency={currency}\n locale={locale}\n className=\"pdp-price-tiers__price\"\n />\n {textAfterPrice}\n </span>\n </div>\n );\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 */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, toLanguageTag } from '@adobe-commerce/elsie/lib';\nimport { Price, PriceRange } from '@/pdp/components';\nimport PriceTiers from '@/pdp/components/PriceTiers';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { config, getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductPriceProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductPrice: Container<\n ProductPriceProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const { globalLocale = 'en-US' } = config.getConfig();\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [locale, setLocale] = useState<string>(globalLocale);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, [scope]);\n\n if (!data || !data.prices) return null;\n\n return (\n <Price\n {...props}\n specialPrice={\n data.prices?.visible ? (\n <PriceRange {...data.prices?.final} locale={toLanguageTag(locale)} />\n ) : undefined\n }\n price={\n data.prices?.visible &&\n data.prices?.regular &&\n data.prices?.final.amount !== data.prices?.regular.amount ? (\n <PriceRange\n {...data.prices?.regular}\n locale={toLanguageTag(locale)}\n />\n ) : undefined\n }\n tiers={\n data.prices?.visible && data.prices?.tiers?.length > 0 ? (\n <PriceTiers\n tiers={data.prices.tiers}\n locale={toLanguageTag(locale)}\n regularPrice={data.prices.regular?.amount}\n />\n ) : undefined\n }\n />\n );\n};\n\nProductPrice.getInitialData = getFetchedProductData;\n"],"names":["Price","className","price","specialPrice","tiers","children","props","RegularPriceLabel","useText","SpecialPriceLabel","TierPriceLabel","jsxs","classes","jsx","VComponent","PriceTiers","locale","regularPrice","TierPricingLabel","tier","index","tierPrice","_a","quantity","currency","_b","savingsPercent","textBeforePrice","textAfterPrice","ProductPrice","initialData","scope","globalLocale","config","data","setData","useState","setLocale","useEffect","dataEvent","events","localeEvent","PriceRange","toLanguageTag","_c","_d","_e","_f","_g","_h","_j","_i","_k","getFetchedProductData"],"mappings":"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"}
1
+ {"version":3,"file":"ProductPrice.js","sources":["/@dropins/storefront-pdp/src/containers/ProductPrice/ProductPrice.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, toLanguageTag } from '@adobe-commerce/elsie/lib';\nimport { Price, PriceRange } from '@/pdp/components';\nimport PriceTiers from '@/pdp/components/PriceTiers';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { config, getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductPriceProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductPrice: Container<\n ProductPriceProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const { globalLocale = 'en-US' } = config.getConfig();\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [locale, setLocale] = useState<string>(globalLocale);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, [scope]);\n\n if (!data || !data.prices) return null;\n\n return (\n <Price\n {...props}\n specialPrice={\n data.prices?.visible ? (\n <PriceRange {...data.prices?.final} locale={toLanguageTag(locale)} />\n ) : undefined\n }\n price={\n data.prices?.visible &&\n data.prices?.regular &&\n data.prices?.final.amount !== data.prices?.regular.amount ? (\n <PriceRange\n {...data.prices?.regular}\n locale={toLanguageTag(locale)}\n />\n ) : undefined\n }\n tiers={\n data.prices?.visible && data.prices?.tiers?.length > 0 ? (\n <PriceTiers\n tiers={data.prices.tiers}\n locale={toLanguageTag(locale)}\n regularPrice={data.prices.regular?.amount}\n />\n ) : undefined\n }\n />\n );\n};\n\nProductPrice.getInitialData = getFetchedProductData;\n"],"names":["ProductPrice","initialData","scope","children","props","globalLocale","config","data","setData","useState","locale","setLocale","useEffect","dataEvent","events","localeEvent","jsx","Price","_a","PriceRange","_b","toLanguageTag","_c","_d","_e","_f","_g","_h","_j","_i","PriceTiers","_k","getFetchedProductData"],"mappings":"4hBA4BO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,2BACzD,KAAM,CAAE,aAAAC,EAAe,SAAYC,EAAO,UAAA,EAEpC,CAACC,EAAMC,CAAO,EAAIC,EAA8BR,CAAW,EAE3D,CAACS,EAAQC,CAAS,EAAIF,EAAiBJ,CAAY,EAYzD,OAVAO,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYN,EAAS,CAAE,MAAAN,EAAO,EACpDa,EAAcD,EAAO,GAAG,SAAUH,CAAS,EAEjD,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAACb,CAAK,CAAC,EAEN,CAACK,GAAQ,CAACA,EAAK,OAAe,KAGhCS,EAACC,EAAA,CACE,GAAGb,EACJ,cACEc,EAAAX,EAAK,SAAL,MAAAW,EAAa,UACVC,EAAA,CAAY,IAAGC,EAAAb,EAAK,SAAL,YAAAa,EAAa,MAAO,OAAQC,EAAcX,CAAM,EAAG,EACjE,OAEN,OACEY,EAAAf,EAAK,SAAL,MAAAe,EAAa,WACbC,EAAAhB,EAAK,SAAL,MAAAgB,EAAa,YACbC,EAAAjB,EAAK,SAAL,YAAAiB,EAAa,MAAM,YAAWC,EAAAlB,EAAK,SAAL,YAAAkB,EAAa,QAAQ,QACjDT,EAACG,EAAA,CACE,IAAGO,EAAAnB,EAAK,SAAL,YAAAmB,EAAa,QACjB,OAAQL,EAAcX,CAAM,CAAA,CAAA,EAE5B,OAEN,OACEiB,EAAApB,EAAK,SAAL,MAAAoB,EAAa,WAAWC,GAAAC,EAAAtB,EAAK,SAAL,YAAAsB,EAAa,QAAb,YAAAD,EAAoB,QAAS,EACnDZ,EAACc,EAAA,CACC,MAAOvB,EAAK,OAAO,MACnB,OAAQc,EAAcX,CAAM,EAC5B,cAAcqB,EAAAxB,EAAK,OAAO,UAAZ,YAAAwB,EAAqB,MAAA,CAAA,EAEnC,MAAA,CAAA,CAIZ,EAEA/B,EAAa,eAAiBgC"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as P}from"@dropins/tools/preact-jsx-runtime.js";import{useState as i,useEffect as y}from"@dropins/tools/preact-compat.js";import{classes as I}from"@dropins/tools/lib.js";import{Incrementer as b}from"@dropins/tools/components.js";import{events as m}from"@dropins/tools/event-bus.js";import{s as q}from"../chunks/getProductConfigurationValues.js";import{g as D}from"../chunks/getFetchedProductData.js";import{g as h,c as x,s as C}from"../chunks/fetchProductData.js";import{useText as S}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/isProductConfigurationValid.js";const U=({initialData:u=null,scope:a,onValue:e,children:F,...o})=>{const l=S("PDP.Product.Incrementer.label").label,[c,f]=i(u),[s,p]=i(()=>h(1));y(()=>{const r=m.on("pdp/data",f,{scope:a}),t=m.on("pdp/values",({quantity:n})=>{p(n)},{eager:!0,scope:a});return()=>{r==null||r.off(),t==null||t.off()}},[a]);const d=r=>{const t=parseInt(r,10);q(g=>({...g,quantity:t}),{scope:a});const{persistURLParams:n}=x.getConfig()??{};n&&C({quantity:t}),e==null||e(t)};return c?P(b,{name:"quantity",defaultValue:String(s),value:String(s),min:1,"aria-label":l,onValue:d,...o,className:I(["pdp-quantity",o.className])},"quantity"):null};U.getInitialData=D;export{U as ProductQuantity,U as default};
3
+ import{jsx as P}from"@dropins/tools/preact-jsx-runtime.js";import{useState as i,useEffect as y}from"@dropins/tools/preact-compat.js";import{classes as I}from"@dropins/tools/lib.js";import{Incrementer as b}from"@dropins/tools/components.js";import{events as m}from"@dropins/tools/event-bus.js";import{g as q,setProductConfigurationValues as D,config as h,c as x,getFetchedProductData as C}from"../api.js";import{useText as S}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const U=({initialData:u=null,scope:e,onValue:a,children:F,...o})=>{const l=S("PDP.Product.Incrementer.label").label,[c,f]=i(u),[s,d]=i(()=>q(1));y(()=>{const r=m.on("pdp/data",f,{scope:e}),t=m.on("pdp/values",({quantity:n})=>{d(n)},{eager:!0,scope:e});return()=>{r==null||r.off(),t==null||t.off()}},[e]);const p=r=>{const t=parseInt(r,10);D(g=>({...g,quantity:t}),{scope:e});const{persistURLParams:n}=h.getConfig()??{};n&&x({quantity:t}),a==null||a(t)};return c?P(b,{name:"quantity",defaultValue:String(s),value:String(s),min:1,"aria-label":l,onValue:p,...o,className:I(["pdp-quantity",o.className])},"quantity"):null};U.getInitialData=C;export{U as ProductQuantity,U as default};
4
4
  //# sourceMappingURL=ProductQuantity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductQuantity.js","sources":["/@dropins/storefront-pdp/src/containers/ProductQuantity/ProductQuantity.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { Incrementer } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport {\n setProductConfigurationValues,\n getFetchedProductData,\n} from '@/pdp/api';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { config } from '@/pdp/api/initialize';\n\nexport interface ProductQuantityProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n onValue?: (quantity: number) => void;\n}\n\nexport const ProductQuantity: Container<\n ProductQuantityProps,\n ProductModel | null\n> = ({ initialData = null, scope, onValue, children, ...props }) => {\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [current, setCurrent] = useState(() => getValidatedQuantityFromUrl(1)); // Default quantity to 1\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ quantity }) => {\n setCurrent(quantity);\n },\n { eager: true, scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n }, [scope]);\n\n const handleOnValue = (value: string) => {\n const quantity = parseInt(value, 10);\n setProductConfigurationValues((prev) => ({ ...prev, quantity }), { scope });\n\n // Update URL parameters if persistURLParams is enabled\n const { persistURLParams } = config.getConfig() ?? {};\n if (persistURLParams) {\n setUrlParams({ quantity });\n }\n\n onValue?.(quantity);\n };\n\n if (!data) return null;\n\n return (\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={String(current)}\n value={String(current)}\n min={1}\n aria-label={IncrementerLabel}\n onValue={handleOnValue}\n {...props}\n className={classes(['pdp-quantity', props.className])}\n />\n );\n};\n\nProductQuantity.getInitialData = getFetchedProductData;\n"],"names":["ProductQuantity","initialData","scope","onValue","children","props","IncrementerLabel","useText","data","setData","useState","current","setCurrent","getValidatedQuantityFromUrl","useEffect","dataEvent","events","valuesEvent","quantity","handleOnValue","value","setProductConfigurationValues","prev","persistURLParams","config","setUrlParams","jsx","Incrementer","classes","getFetchedProductData"],"mappings":"6nBAqCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,GAAGC,KAAY,CAClE,MAAMC,EAAmBC,EAAQ,+BAA+B,EAAE,MAE5D,CAACC,EAAMC,CAAO,EAAIC,EAA8BT,CAAW,EAE3D,CAACU,EAASC,CAAU,EAAIF,EAAS,IAAMG,EAA4B,CAAC,CAAC,EAE3EC,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYP,EAAS,CAAE,MAAAP,EAAO,EAEpDe,EAAcD,EAAO,GACzB,aACA,CAAC,CAAE,SAAAE,CAAA,IAAe,CAChBN,EAAWM,CAAQ,CACrB,EACA,CAAE,MAAO,GAAM,MAAAhB,CAAA,CAAM,EAGvB,MAAO,IAAM,CACXa,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAACf,CAAK,CAAC,EAEV,MAAMiB,EAAiBC,GAAkB,CACvC,MAAMF,EAAW,SAASE,EAAO,EAAE,EACnCC,EAA+BC,IAAU,CAAE,GAAGA,EAAM,SAAAJ,IAAa,CAAE,MAAAhB,EAAO,EAG1E,KAAM,CAAE,iBAAAqB,CAAA,EAAqBC,EAAO,UAAA,GAAe,CAAA,EAC/CD,GACFE,EAAa,CAAE,SAAAP,EAAU,EAG3Bf,GAAA,MAAAA,EAAUe,EACZ,EAEA,OAAKV,EAGHkB,EAACC,EAAA,CAEC,KAAK,WACL,aAAc,OAAOhB,CAAO,EAC5B,MAAO,OAAOA,CAAO,EACrB,IAAK,EACL,aAAYL,EACZ,QAASa,EACR,GAAGd,EACJ,UAAWuB,EAAQ,CAAC,eAAgBvB,EAAM,SAAS,CAAC,CAAA,EARhD,UAAA,EAJU,IAepB,EAEAL,EAAgB,eAAiB6B"}
1
+ {"version":3,"file":"ProductQuantity.js","sources":["/@dropins/storefront-pdp/src/containers/ProductQuantity/ProductQuantity.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { Incrementer } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport {\n setProductConfigurationValues,\n getFetchedProductData,\n} from '@/pdp/api';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { config } from '@/pdp/api/initialize';\n\nexport interface ProductQuantityProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n onValue?: (quantity: number) => void;\n}\n\nexport const ProductQuantity: Container<\n ProductQuantityProps,\n ProductModel | null\n> = ({ initialData = null, scope, onValue, children, ...props }) => {\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [current, setCurrent] = useState(() => getValidatedQuantityFromUrl(1)); // Default quantity to 1\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ quantity }) => {\n setCurrent(quantity);\n },\n { eager: true, scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n }, [scope]);\n\n const handleOnValue = (value: string) => {\n const quantity = parseInt(value, 10);\n setProductConfigurationValues((prev) => ({ ...prev, quantity }), { scope });\n\n // Update URL parameters if persistURLParams is enabled\n const { persistURLParams } = config.getConfig() ?? {};\n if (persistURLParams) {\n setUrlParams({ quantity });\n }\n\n onValue?.(quantity);\n };\n\n if (!data) return null;\n\n return (\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={String(current)}\n value={String(current)}\n min={1}\n aria-label={IncrementerLabel}\n onValue={handleOnValue}\n {...props}\n className={classes(['pdp-quantity', props.className])}\n />\n );\n};\n\nProductQuantity.getInitialData = getFetchedProductData;\n"],"names":["ProductQuantity","initialData","scope","onValue","children","props","IncrementerLabel","useText","data","setData","useState","current","setCurrent","getValidatedQuantityFromUrl","useEffect","dataEvent","events","valuesEvent","quantity","handleOnValue","value","setProductConfigurationValues","prev","persistURLParams","config","setUrlParams","jsx","Incrementer","classes","getFetchedProductData"],"mappings":"6eAqCO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,GAAGC,KAAY,CAClE,MAAMC,EAAmBC,EAAQ,+BAA+B,EAAE,MAE5D,CAACC,EAAMC,CAAO,EAAIC,EAA8BT,CAAW,EAE3D,CAACU,EAASC,CAAU,EAAIF,EAAS,IAAMG,EAA4B,CAAC,CAAC,EAE3EC,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYP,EAAS,CAAE,MAAAP,EAAO,EAEpDe,EAAcD,EAAO,GACzB,aACA,CAAC,CAAE,SAAAE,CAAA,IAAe,CAChBN,EAAWM,CAAQ,CACrB,EACA,CAAE,MAAO,GAAM,MAAAhB,CAAA,CAAM,EAGvB,MAAO,IAAM,CACXa,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAACf,CAAK,CAAC,EAEV,MAAMiB,EAAiBC,GAAkB,CACvC,MAAMF,EAAW,SAASE,EAAO,EAAE,EACnCC,EAA+BC,IAAU,CAAE,GAAGA,EAAM,SAAAJ,IAAa,CAAE,MAAAhB,EAAO,EAG1E,KAAM,CAAE,iBAAAqB,CAAA,EAAqBC,EAAO,UAAA,GAAe,CAAA,EAC/CD,GACFE,EAAa,CAAE,SAAAP,EAAU,EAG3Bf,GAAA,MAAAA,EAAUe,EACZ,EAEA,OAAKV,EAGHkB,EAACC,EAAA,CAEC,KAAK,WACL,aAAc,OAAOhB,CAAO,EAC5B,MAAO,OAAOA,CAAO,EACrB,IAAK,EACL,aAAYL,EACZ,QAASa,EACR,GAAGd,EACJ,UAAWuB,EAAQ,CAAC,eAAgBvB,EAAM,SAAS,CAAC,CAAA,EARhD,UAAA,EAJU,IAepB,EAEAL,EAAgB,eAAiB6B"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as a,useEffect as c}from"@dropins/tools/preact-compat.js";import{classes as m}from"@dropins/tools/lib.js";import{events as l}from"@dropins/tools/event-bus.js";import{g as f}from"../chunks/getFetchedProductData.js";const u=({initialData:s=null,scope:e,children:p,...o})=>{const[t,n]=a(s);return c(()=>{const r=l.on("pdp/data",n,{scope:e});return()=>{r==null||r.off()}},[e]),t?i("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""},...o,className:m(["pdp-short-description",o.className])}):null};u.getInitialData=f;export{u as ProductShortDescription,u as default};
3
+ import{jsx as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as a,useEffect as m}from"@dropins/tools/preact-compat.js";import{classes as c}from"@dropins/tools/lib.js";import{events as l}from"@dropins/tools/event-bus.js";import{getFetchedProductData as f}from"../api.js";import"@dropins/tools/fetch-graphql.js";const p=({initialData:s=null,scope:e,children:u,...o})=>{const[t,i]=a(s);return m(()=>{const r=l.on("pdp/data",i,{scope:e});return()=>{r==null||r.off()}},[e]),t?n("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""},...o,className:c(["pdp-short-description",o.className])}):null};p.getInitialData=f;export{p as ProductShortDescription,p as default};
4
4
  //# sourceMappingURL=ProductShortDescription.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductShortDescription.js","sources":["/@dropins/storefront-pdp/src/containers/ProductShortDescription/ProductShortDescription.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductShortDescriptionProps\n extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductShortDescription: Container<\n ProductShortDescriptionProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.shortDescription ?? '' }}\n {...props}\n className={classes(['pdp-short-description', props.className])}\n />\n );\n};\n\nProductShortDescription.getInitialData = getFetchedProductData;\n"],"names":["ProductShortDescription","initialData","scope","children","props","data","setData","useState","useEffect","dataEvent","events","jsx","classes","getFetchedProductData"],"mappings":"iSA2BO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BN,CAAW,EAUjE,OARAO,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAJ,EAAO,EAE1D,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,CAACP,CAAK,CAAC,EAELG,EAGHM,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQN,GAAA,YAAAA,EAAM,mBAAoB,EAAA,EAC5D,GAAGD,EACJ,UAAWQ,EAAQ,CAAC,wBAAyBR,EAAM,SAAS,CAAC,CAAA,CAAA,EAP/C,IAUpB,EAEAJ,EAAwB,eAAiBa"}
1
+ {"version":3,"file":"ProductShortDescription.js","sources":["/@dropins/storefront-pdp/src/containers/ProductShortDescription/ProductShortDescription.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductShortDescriptionProps\n extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductShortDescription: Container<\n ProductShortDescriptionProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n if (!data) return null;\n\n return (\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.shortDescription ?? '' }}\n {...props}\n className={classes(['pdp-short-description', props.className])}\n />\n );\n};\n\nProductShortDescription.getInitialData = getFetchedProductData;\n"],"names":["ProductShortDescription","initialData","scope","children","props","data","setData","useState","useEffect","dataEvent","events","jsx","classes","getFetchedProductData"],"mappings":"oUA2BO,MAAMA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BN,CAAW,EAUjE,OARAO,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAJ,EAAO,EAE1D,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,CAACP,CAAK,CAAC,EAELG,EAGHM,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQN,GAAA,YAAAA,EAAM,mBAAoB,EAAA,EAC5D,GAAGD,EACJ,UAAWQ,EAAQ,CAAC,wBAAyBR,EAAM,SAAS,CAAC,CAAA,CAAA,EAP/C,IAUpB,EAEAJ,EAAwB,eAAiBa"}
package/fragments.js CHANGED
@@ -1,174 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- const e=`
4
- fragment PRODUCT_OPTION_FRAGMENT on ProductViewOption {
5
- id
6
- title
7
- required
8
- multi
9
- values {
10
- id
11
- title
12
- inStock
13
- __typename
14
- ... on ProductViewOptionValueProduct {
15
- title
16
- quantity
17
- isDefault
18
- __typename
19
- product {
20
- sku
21
- shortDescription
22
- metaDescription
23
- metaKeyword
24
- metaTitle
25
- name
26
- price {
27
- final {
28
- amount {
29
- value
30
- currency
31
- }
32
- }
33
- regular {
34
- amount {
35
- value
36
- currency
37
- }
38
- }
39
- roles
40
- }
41
- }
42
- }
43
- ... on ProductViewOptionValueSwatch {
44
- id
45
- title
46
- type
47
- value
48
- inStock
49
- }
50
- }
51
- }
52
- `,t=`
53
- fragment PRICE_RANGE_FRAGMENT on ComplexProductView {
54
- priceRange {
55
- maximum {
56
- final {
57
- amount {
58
- value
59
- currency
60
- }
61
- }
62
- regular {
63
- amount {
64
- value
65
- currency
66
- }
67
- }
68
- roles
69
- }
70
- minimum {
71
- final {
72
- amount {
73
- value
74
- currency
75
- }
76
- }
77
- regular {
78
- amount {
79
- value
80
- currency
81
- }
82
- }
83
- roles
84
- }
85
- }
86
- }
87
- `,r=`
88
- fragment PRODUCT_FRAGMENT on ProductView {
89
- __typename
90
- id
91
- sku
92
- name
93
- shortDescription
94
- metaDescription
95
- metaKeyword
96
- metaTitle
97
- description
98
- inStock
99
- addToCartAllowed
100
- url
101
- urlKey
102
- externalId
103
-
104
- images(roles: []) {
105
- url
106
- label
107
- roles
108
- }
109
-
110
- videos {
111
- description
112
- url
113
- title
114
- preview {
115
- label
116
- roles
117
- url
118
- }
119
- }
120
-
121
- attributes(roles: []) {
122
- name
123
- label
124
- value
125
- roles
126
- }
127
-
128
- ... on SimpleProductView {
129
- price {
130
- roles
131
-
132
- regular {
133
- amount {
134
- value
135
- currency
136
- }
137
- }
138
-
139
- final {
140
- amount {
141
- value
142
- currency
143
- }
144
- }
145
- tiers {
146
- tier {
147
- amount {
148
- value
149
- currency
150
- }
151
- }
152
- quantity {
153
- ... on ProductViewTierRangeCondition {
154
- gte
155
- lt
156
- }
157
- }
158
- }
159
- }
160
- }
161
-
162
- ... on ComplexProductView {
163
- options {
164
- ...PRODUCT_OPTION_FRAGMENT
165
- }
166
-
167
- ...PRICE_RANGE_FRAGMENT
168
- }
169
- }
170
-
171
- ${e}
172
- ${t}
173
- `;export{t as PRICE_RANGE_FRAGMENT,r as PRODUCT_FRAGMENT,e as PRODUCT_OPTION_FRAGMENT};
3
+ import{P as N,a as P,b as _}from"./api.js";import"@dropins/tools/lib.js";import"@dropins/tools/event-bus.js";import"@dropins/tools/fetch-graphql.js";export{N as PRICE_RANGE_FRAGMENT,P as PRODUCT_FRAGMENT,_ as PRODUCT_OPTION_FRAGMENT};
174
4
  //# sourceMappingURL=fragments.js.map
package/fragments.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.js","sources":["/@dropins/storefront-pdp/src/api/graphql/ProductOptionFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/PriceRangeFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/ProductFragment.graphql.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 const PRODUCT_OPTION_FRAGMENT = `\nfragment PRODUCT_OPTION_FRAGMENT on ProductViewOption {\n id\n title\n required\n multi\n values {\n id\n title\n inStock\n __typename\n ... on ProductViewOptionValueProduct {\n title\n quantity\n isDefault\n __typename\n product {\n sku\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n name\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n ... on ProductViewOptionValueSwatch {\n id\n title\n type\n value\n inStock\n }\n }\n }\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2025 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 const PRICE_RANGE_FRAGMENT = `\n fragment PRICE_RANGE_FRAGMENT on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\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_OPTION_FRAGMENT } from '@/pdp/api/graphql/ProductOptionFragment.graphql';\nimport { PRICE_RANGE_FRAGMENT } from './PriceRangeFragment.graphql';\n\nexport const PRODUCT_FRAGMENT = `\nfragment PRODUCT_FRAGMENT on ProductView {\n __typename\n id\n sku\n name\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n description\n inStock\n addToCartAllowed\n url\n urlKey\n externalId\n\n images(roles: []) {\n url\n label\n roles\n }\n\n videos {\n\t\tdescription\n\t\turl\n\t\ttitle\n\t\tpreview {\n\t\t\tlabel\n\t\t\troles\n\t\t\turl\n\t\t}\n\t}\n\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n\n... on SimpleProductView {\n price {\n roles\n\n regular {\n amount {\n value\n currency\n }\n }\n\n final {\n amount {\n value\n currency\n }\n }\n tiers {\n tier {\n amount {\n value\n currency\n }\n }\n quantity {\n ... on ProductViewTierRangeCondition {\n gte\n lt\n }\n }\n }\n }\n }\n\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n\n ...PRICE_RANGE_FRAGMENT\n }\n}\n\n${PRODUCT_OPTION_FRAGMENT}\n${PRICE_RANGE_FRAGMENT}\n`;\n"],"names":["PRODUCT_OPTION_FRAGMENT","PRICE_RANGE_FRAGMENT","PRODUCT_FRAGMENT"],"mappings":"AAgBO,MAAMA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECA1BC,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECGvBC,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoF9BF,CAAuB;AAAA,EACvBC,CAAoB;"}
1
+ {"version":3,"file":"fragments.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { Option } from '../data/models';
2
+
3
+ /** Single-select option group (one chosen item UID). */
4
+ export type ProductOptionSelectionSingle = {
5
+ label: string;
6
+ value: string;
7
+ };
8
+ /** Multi-select option group (one or more chosen item UIDs). */
9
+ export type ProductOptionSelectionMulti = {
10
+ label: string;
11
+ values: string[];
12
+ };
13
+ export type ProductOptionSelectionEntry = ProductOptionSelectionSingle | ProductOptionSelectionMulti;
14
+ export type ProductOptionSelectionMap = {
15
+ [optionId: string]: ProductOptionSelectionEntry;
16
+ };
17
+ /**
18
+ * Flatten selection map to UID list. When `optionsOrder` is provided (e.g. `data.options`),
19
+ * UIDs are emitted in that order for stable URLs and API payloads.
20
+ */
21
+ export declare function selectionMapToOptionUIDs(selections: ProductOptionSelectionMap, optionsOrder?: Option[]): string[];
22
+ /**
23
+ * Whether the shopper has satisfied all option groups for add-to-cart.
24
+ * Bundle multi-select may contribute more than one UID while still satisfying one group.
25
+ */
26
+ export declare function isProductOptionsSelectionComplete(options: Option[] | undefined, optionUIDs: string[] | undefined, isBundle: boolean | undefined): boolean;
27
+ //# sourceMappingURL=product-option-selection.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropins/storefront-pdp",
3
- "version": "3.2.0-beta.0",
4
- "@dropins/tools": "~1.8.1",
3
+ "version": "3.2.0-beta.2",
4
+ "@dropins/tools": "1.9.0-beta.1",
5
5
  "license": "SEE LICENSE IN LICENSE.md"
6
6
  }