@dropins/storefront-pdp 3.0.0 → 3.0.1-alpha2

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 (51) hide show
  1. package/api/getProductsData/getProductsData.d.ts +30 -0
  2. package/api/getProductsData/graphql/getProductsData.graphql.d.ts +17 -0
  3. package/api/getProductsData/index.d.ts +17 -0
  4. package/api/index.d.ts +1 -0
  5. package/api/initialize/initialize.d.ts +15 -8
  6. package/api.js +9 -1
  7. package/api.js.map +1 -1
  8. package/chunks/DownloadableOptions2.js +4 -0
  9. package/chunks/DownloadableOptions2.js.map +1 -0
  10. package/chunks/fetchProductData.js +4 -4
  11. package/chunks/fetchProductData.js.map +1 -1
  12. package/chunks/getProductConfigurationValues.js +4 -0
  13. package/chunks/getProductConfigurationValues.js.map +1 -0
  14. package/chunks/isProductConfigurationValid.js +1 -1
  15. package/chunks/isProductConfigurationValid.js.map +1 -1
  16. package/chunks/useProductData.js +4 -0
  17. package/chunks/useProductData.js.map +1 -0
  18. package/components/DownloadableOptions/DownloadableOptions.d.ts +29 -0
  19. package/components/DownloadableOptions/index.d.ts +18 -0
  20. package/components/Product/Product.d.ts +1 -0
  21. package/components/index.d.ts +1 -0
  22. package/containers/ProductAttributes.js +1 -1
  23. package/containers/ProductAttributes.js.map +1 -1
  24. package/containers/ProductDetails.js +1 -1
  25. package/containers/ProductDetails.js.map +1 -1
  26. package/containers/ProductDownloadableOptions/ProductDownloadableOptions.d.ts +9 -0
  27. package/containers/ProductDownloadableOptions/index.d.ts +18 -0
  28. package/containers/ProductDownloadableOptions.d.ts +3 -0
  29. package/containers/ProductDownloadableOptions.js +4 -0
  30. package/containers/ProductDownloadableOptions.js.map +1 -0
  31. package/containers/ProductGallery.js +1 -1
  32. package/containers/ProductGallery.js.map +1 -1
  33. package/containers/ProductGiftCardOptions.js +1 -1
  34. package/containers/ProductGiftCardOptions.js.map +1 -1
  35. package/containers/ProductHeader.js +1 -1
  36. package/containers/ProductHeader.js.map +1 -1
  37. package/containers/ProductOptions/ProductOptions.d.ts +4 -0
  38. package/containers/ProductOptions/index.d.ts +1 -0
  39. package/containers/ProductOptions.js +1 -1
  40. package/containers/ProductOptions.js.map +1 -1
  41. package/containers/ProductPrice.js +1 -1
  42. package/containers/ProductPrice.js.map +1 -1
  43. package/containers/ProductQuantity.js +1 -1
  44. package/containers/ProductQuantity.js.map +1 -1
  45. package/containers/index.d.ts +1 -0
  46. package/data/models/product-model.d.ts +1 -0
  47. package/i18n/en_US.json.d.ts +8 -11
  48. package/lib/useProductData.d.ts +31 -0
  49. package/package.json +1 -1
  50. package/render.js +4 -3
  51. package/render.js.map +1 -1
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2026 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{classes as p}from"@dropins/tools/lib.js";import{s as f}from"../chunks/getProductConfigurationValues.js";import"@dropins/tools/event-bus.js";import{g as D}from"../chunks/getFetchedProductData.js";import{D as b}from"../chunks/DownloadableOptions2.js";import{u as g,g as h}from"../chunks/useProductData.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";const I=({initialData:c=null,scope:m,children:w,...o})=>{const{data:s,values:u}=g({scope:m,initialData:c,initialValues:{optionsUIDs:[]}}),d=(e,l)=>{const t=u.optionsUIDs||[];let a;l?t.includes(e)?a=t:a=[...t,e]:a=t.filter(n=>n!==e),f(n=>({...n,optionsUIDs:a}))},i=h(s,"ac_downloadable");return!s||i.length===0?null:r("div",{...o,className:p(["pdp-downloadable-options",o.className]),children:i.map((e,l)=>{var t,a;return r(b,{label:e.label,value:e.value,onLinkChange:d,currency:(a=(t=s.prices)==null?void 0:t.final)==null?void 0:a.currency,className:o.className},`downloadable-${l}`)})})};I.getInitialData=D;export{I as ProductDownloadableOptions,I as default};
4
+ //# sourceMappingURL=ProductDownloadableOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDownloadableOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductDownloadableOptions/ProductDownloadableOptions.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 {\n getFetchedProductData,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { DownloadableOptions } from '@/pdp/components/DownloadableOptions';\nimport { useProductData, getAttributesById } from '@/pdp/lib/useProductData';\n\nexport interface ProductDownloadableOptionsProps\n extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n}\n\nexport const ProductDownloadableOptions: Container<\n ProductDownloadableOptionsProps,\n ProductModel | null\n> = ({ initialData = null, scope, children, ...props }) => {\n const { data, values } = useProductData({\n scope,\n initialData,\n initialValues: { optionsUIDs: [] },\n });\n\n const handleLinkChange = (uid: string, selected: boolean) => {\n const prevUIDs = values.optionsUIDs || [];\n let newOptionsUIDs;\n\n if (!selected) {\n newOptionsUIDs = prevUIDs.filter((id) => id !== uid);\n } else if (prevUIDs.includes(uid)) {\n newOptionsUIDs = prevUIDs;\n } else {\n newOptionsUIDs = [...prevUIDs, uid];\n }\n\n setProductConfigurationValues((prev) => ({\n ...prev,\n optionsUIDs: newOptionsUIDs,\n }));\n };\n\n const downloadableAttributes = getAttributesById(data, 'ac_downloadable');\n\n if (!data) return null;\n\n if (downloadableAttributes.length === 0) return null;\n\n return (\n <div\n {...props}\n className={classes(['pdp-downloadable-options', props.className])}\n >\n {downloadableAttributes.map((downloadable, index) => (\n <DownloadableOptions\n key={`downloadable-${index}`}\n label={downloadable.label}\n value={downloadable.value}\n onLinkChange={handleLinkChange}\n currency={data.prices?.final?.currency}\n className={props.className}\n />\n ))}\n </div>\n );\n};\n\nProductDownloadableOptions.getInitialData = getFetchedProductData;\n"],"names":["ProductDownloadableOptions","initialData","scope","children","props","data","values","useProductData","handleLinkChange","uid","selected","prevUIDs","newOptionsUIDs","id","setProductConfigurationValues","prev","downloadableAttributes","getAttributesById","jsx","classes","downloadable","index","DownloadableOptions","_b","_a","getFetchedProductData"],"mappings":"ugBA+Ba,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAIC,EAAe,CACtC,MAAAL,EACA,YAAAD,EACA,cAAe,CAAE,YAAa,CAAG,CAAA,CAAA,CAClC,EAEKO,EAAmB,CAACC,EAAaC,IAAsB,CACrD,MAAAC,EAAWL,EAAO,aAAe,CAAC,EACpC,IAAAM,EAECF,EAEMC,EAAS,SAASF,CAAG,EACbG,EAAAD,EAEAC,EAAA,CAAC,GAAGD,EAAUF,CAAG,EAJlCG,EAAiBD,EAAS,OAAQE,GAAOA,IAAOJ,CAAG,EAOrDK,EAA+BC,IAAU,CACvC,GAAGA,EACH,YAAaH,CAAA,EACb,CACJ,EAEMI,EAAyBC,EAAkBZ,EAAM,iBAAiB,EAIpE,MAFA,CAACA,GAEDW,EAAuB,SAAW,EAAU,KAG9CE,EAAC,MAAA,CACE,GAAGd,EACJ,UAAWe,EAAQ,CAAC,2BAA4Bf,EAAM,SAAS,CAAC,EAE/D,SAAuBY,EAAA,IAAI,CAACI,EAAcC,IACzC,SAAA,OAAAH,EAACI,EAAA,CAEC,MAAOF,EAAa,MACpB,MAAOA,EAAa,MACpB,aAAcZ,EACd,UAAUe,GAAAC,EAAAnB,EAAK,SAAL,YAAAmB,EAAa,QAAb,YAAAD,EAAoB,SAC9B,UAAWnB,EAAM,SAAA,EALZ,gBAAgBiB,CAAK,EAO7B,EAAA,CAAA,CACH,CAEJ,EAEArB,EAA2B,eAAiByB"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as A,jsxs as K}from"@dropins/tools/preact-jsx-runtime.js";import{useState as R,useEffect as U,useMemo as w}from"@dropins/tools/preact-compat.js";import{Slot as Z}from"@dropins/tools/lib.js";import{Image as j}from"@dropins/tools/components.js";import{events as V}from"@dropins/tools/event-bus.js";import{g as W}from"../chunks/getFetchedProductData.js";import{Z as X,C as v,O as Y}from"../chunks/Zoom.js";/* empty css */import"@dropins/tools/preact-hooks.js";/* empty css */import{useText as $}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const s=({initialData:G=null,scope:I,controls:k="dots",loop:C=!0,peak:H=!1,gap:N=null,arrows:Q=!0,arrowsOnMainImage:F=!1,zoom:h=!1,imageParams:t,thumbnailParams:o,children:L,slots:l,...q})=>{var y,T,_,S,D,E;const r=$("PDP.Product.Image.label").label,[e,z]=R(G),[f,B]=R(null);U(()=>{const n=V.on("pdp/data",z,{scope:I});return()=>{n==null||n.off()}},[I]);const g=w(()=>({data:e}),[e]),x=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:i,url:c},p)=>{const d=({...u})=>{var O;const M={title:i,src:c,alt:r==null?void 0:r.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((O=e==null?void 0:e.images)==null?void 0:O.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:p===0?"eager":"lazy",...u};return A(Z,{name:"CarouselMainImage",slot:l==null?void 0:l.CarouselMainImage,context:{...g,defaultImageProps:M},children:A(j,{...M})})};return h?A(X,{closeButton:typeof h=="object"?h.closeButton:!1,children:A(d,{})},c):A(d,{onClick:()=>B(p)},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder")},[r,e==null?void 0:e.images,t,h,g,l==null?void 0:l.CarouselMainImage]),J=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:i,url:c},p)=>{var u;const d={title:i,src:c,alt:r==null?void 0:r.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((u=e==null?void 0:e.images)==null?void 0:u.length)),width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,params:o??{width:200},loading:"lazy"};return A(Z,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:l==null?void 0:l.CarouselThumbnail,context:{...g,defaultImageProps:d},children:A(j,{...d})},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,"aria-hidden":!0},"pleaceholder")},[r,e==null?void 0:e.images,o,g,l==null?void 0:l.CarouselThumbnail]);return e?K("div",{...q,children:[A(v,{arrows:!!((y=e==null?void 0:e.images)!=null&&y.length)&&Q,arrowsOnMainImage:F,controls:(T=e==null?void 0:e.images)!=null&&T.length?k:void 0,loop:C&&!!((_=e.images)!=null&&_.length),peak:!!((S=e==null?void 0:e.images)!=null&&S.length)&&H,gap:N,defaultIndex:f||0,thumbnails:J,children:x}),f===null?null:A(Y,{onClose:()=>B(null),centered:!0,children:A(v,{arrows:!!((D=e==null?void 0:e.images)!=null&&D.length),width:"100%",height:"100%",defaultIndex:f,loop:C&&!!((E=e.images)!=null&&E.length),controls:"dots",isZoomed:!0,children:x})})]}):null};s.getInitialData=W;export{s as ProductGallery,s as default};
3
+ import{jsx as A,jsxs as K}from"@dropins/tools/preact-jsx-runtime.js";import{useState as R,useEffect as U,useMemo as w}from"@dropins/tools/preact-compat.js";import{Slot as Z}from"@dropins/tools/lib.js";import{Image as j}from"@dropins/tools/components.js";import{events as V}from"@dropins/tools/event-bus.js";import{g as W}from"../chunks/getFetchedProductData.js";import{Z as X,C as v,O as Y}from"../chunks/Zoom.js";/* empty css */import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{useText as $}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const s=({initialData:G=null,scope:I,controls:k="dots",loop:C=!0,peak:H=!1,gap:N=null,arrows:Q=!0,arrowsOnMainImage:F=!1,zoom:h=!1,imageParams:t,thumbnailParams:o,children:L,slots:l,...q})=>{var y,T,_,S,D,E;const n=$("PDP.Product.Image.label").label,[e,z]=R(G),[f,B]=R(null);U(()=>{const r=V.on("pdp/data",z,{scope:I});return()=>{r==null||r.off()}},[I]);const g=w(()=>({data:e}),[e]),x=w(()=>{var r;return((r=e==null?void 0:e.images)==null?void 0:r.map(({label:i,url:c},p)=>{const d=({...u})=>{var O;const M={title:i,src:c,alt:n==null?void 0:n.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((O=e==null?void 0:e.images)==null?void 0:O.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:p===0?"eager":"lazy",...u};return A(Z,{name:"CarouselMainImage",slot:l==null?void 0:l.CarouselMainImage,context:{...g,defaultImageProps:M},children:A(j,{...M})})};return h?A(X,{closeButton:typeof h=="object"?h.closeButton:!1,children:A(d,{})},c):A(d,{onClick:()=>B(p)},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder")},[n,e==null?void 0:e.images,t,h,g,l==null?void 0:l.CarouselMainImage]),J=w(()=>{var r;return((r=e==null?void 0:e.images)==null?void 0:r.map(({label:i,url:c},p)=>{var u;const d={title:i,src:c,alt:n==null?void 0:n.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((u=e==null?void 0:e.images)==null?void 0:u.length)),width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,params:o??{width:200},loading:"lazy"};return A(Z,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:l==null?void 0:l.CarouselThumbnail,context:{...g,defaultImageProps:d},children:A(j,{...d})},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,"aria-hidden":!0},"pleaceholder")},[n,e==null?void 0:e.images,o,g,l==null?void 0:l.CarouselThumbnail]);return e?K("div",{...q,children:[A(v,{arrows:!!((y=e==null?void 0:e.images)!=null&&y.length)&&Q,arrowsOnMainImage:F,controls:(T=e==null?void 0:e.images)!=null&&T.length?k:void 0,loop:C&&!!((_=e.images)!=null&&_.length),peak:!!((S=e==null?void 0:e.images)!=null&&S.length)&&H,gap:N,defaultIndex:f||0,thumbnails:J,children:x}),f===null?null:A(Y,{onClose:()=>B(null),centered:!0,children:A(v,{arrows:!!((D=e==null?void 0:e.images)!=null&&D.length),width:"100%",height:"100%",defaultIndex:f,loop:C&&!!((E=e.images)!=null&&E.length),controls:"dots",isZoomed:!0,children:x})})]}):null};s.getInitialData=W;export{s as ProductGallery,s as default};
4
4
  //# sourceMappingURL=ProductGallery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductGallery.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGallery/ProductGallery.tsx"],"sourcesContent":["import { HTMLAttributes, useEffect, useMemo, useState } from 'preact/compat';\nimport {\n Container,\n ResolveImageUrlOptions,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\n\nimport { Image, ImageProps } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\nimport { getFetchedProductData } from '@/pdp/api';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Carousel, Overlay, Zoom } from '@/pdp/components';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductGalleryProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n scope?: string;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n loop?: boolean;\n peak?: boolean;\n gap?: 'small' | 'medium' | 'large' | null;\n arrows?: boolean;\n arrowsOnMainImage?: boolean;\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n zoom?: { closeButton: boolean } | boolean;\n slots?: {\n CarouselThumbnail?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n CarouselMainImage?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n };\n}\n\nexport const ProductGallery: Container<\n ProductGalleryProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n controls = 'dots',\n loop = true,\n peak = false,\n gap = null,\n arrows = true,\n arrowsOnMainImage = false,\n zoom = false,\n imageParams,\n thumbnailParams,\n children,\n slots,\n ...props\n}) => {\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [zoomTo, setZoomTo] = useState<number | null>(null);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n const images = useMemo(\n () =>\n data?.images?.map(({ label, url }, key) => {\n const Item = ({ ...itemProps }) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: imageParams?.width ?? 960,\n height: imageParams?.height ?? 1191,\n params: imageParams ?? { width: 960 },\n loading: key === 0 ? 'eager' : 'lazy',\n ...itemProps,\n } as const;\n\n return (\n <Slot\n name=\"CarouselMainImage\"\n slot={slots?.CarouselMainImage}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n };\n\n return zoom ? (\n <Zoom\n key={url}\n closeButton={typeof zoom === 'object' ? zoom.closeButton : false}\n >\n <Item />\n </Zoom>\n ) : (\n <Item key={url} onClick={() => setZoomTo(key)} />\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__images__placeholder\"\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n aria-hidden\n />\n ),\n [\n ImagesLabel,\n data?.images,\n imageParams,\n zoom,\n defaultSlotContext,\n slots?.CarouselMainImage,\n ]\n );\n\n const thumbnails = useMemo(() => {\n return (\n data?.images?.map(({ label, url }, key) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n params: thumbnailParams ?? { width: 200 },\n loading: 'lazy',\n } as const;\n\n return (\n <Slot\n key={url}\n name=\"CarouselThumbnail\"\n slotTag=\"span\"\n contentTag=\"span\"\n slot={slots?.CarouselThumbnail}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__thumbnail__placeholder\"\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n aria-hidden\n />\n )\n );\n }, [\n ImagesLabel,\n data?.images,\n thumbnailParams,\n defaultSlotContext,\n slots?.CarouselThumbnail,\n ]);\n\n if (!data) return null;\n\n return (\n <div {...props}>\n {/* Carousel */}\n <Carousel\n arrows={!!data?.images?.length && arrows}\n arrowsOnMainImage={arrowsOnMainImage}\n controls={data?.images?.length ? controls : undefined}\n loop={loop && !!data.images?.length}\n peak={!!data?.images?.length && peak}\n gap={gap}\n defaultIndex={zoomTo || 0}\n thumbnails={thumbnails}\n >\n {images}\n </Carousel>\n\n {/* Zoom Overlay */}\n {zoomTo === null ? null : (\n <Overlay onClose={() => setZoomTo(null)} centered>\n <Carousel\n arrows={!!data?.images?.length}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoomTo}\n loop={loop && !!data.images?.length}\n controls=\"dots\"\n isZoomed\n >\n {images}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n\nProductGallery.getInitialData = getFetchedProductData;\n"],"names":["ProductGallery","initialData","scope","controls","loop","peak","gap","arrows","arrowsOnMainImage","zoom","imageParams","thumbnailParams","children","slots","props","ImagesLabel","useText","data","setData","useState","zoomTo","setZoomTo","useEffect","dataEvent","events","defaultSlotContext","useMemo","images","_a","label","url","key","Item","itemProps","defaultProps","jsx","Slot","Image","Zoom","thumbnails","jsxs","Carousel","_b","_c","_d","Overlay","_e","_f","getFetchedProductData"],"mappings":"4lBAyCO,MAAMA,EAGT,CAAC,CACH,YAAAC,EAAc,KACd,MAAAC,EACA,SAAAC,EAAW,OACX,KAAAC,EAAO,GACP,KAAAC,EAAO,GACP,IAAAC,EAAM,KACN,OAAAC,EAAS,GACT,kBAAAC,EAAoB,GACpB,KAAAC,EAAO,GACP,YAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,MAAAC,EACA,GAAGC,CACL,IAAM,iBACE,MAAAC,EAAcC,EAAQ,yBAAyB,EAAE,MAEjD,CAACC,EAAMC,CAAO,EAAIC,EAA8BlB,CAAW,EAE3D,CAACmB,EAAQC,CAAS,EAAIF,EAAwB,IAAI,EAExDG,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYN,EAAS,CAAE,MAAAhB,EAAO,EAC1D,MAAO,IAAM,CACXqB,GAAA,MAAAA,EAAW,KACb,CAAA,EACC,CAACrB,CAAK,CAAC,EAEV,MAAMuB,EAAyCC,EAC7C,KAAO,CAAE,KAAAT,CAAK,GACd,CAACA,CAAI,CACP,EAEMU,EAASD,EACb,IACE,OAAA,QAAAE,EAAAX,GAAA,YAAAA,EAAM,SAAN,YAAAW,EAAc,IAAI,CAAC,CAAE,MAAAC,EAAO,IAAAC,CAAI,EAAGC,IAAQ,CACzC,MAAMC,EAAO,CAAC,CAAE,GAAGC,KAAgB,OACjC,MAAMC,EAAe,CACnB,MAAOL,EACP,IAAKC,EACL,IAAKf,GAAA,YAAAA,EAAa,QAAQ,YAAac,GACpC,QAAQ,QAAS,OAAOE,EAAM,CAAC,GAC/B,QAAQ,UAAW,QAAOH,EAAAX,GAAA,YAAAA,EAAM,SAAN,YAAAW,EAAc,MAAM,GAIjD,OAAOlB,GAAA,YAAAA,EAAa,QAAS,IAC7B,QAAQA,GAAA,YAAAA,EAAa,SAAU,KAC/B,OAAQA,GAAe,CAAE,MAAO,GAAI,EACpC,QAASqB,IAAQ,EAAI,QAAU,OAC/B,GAAGE,CACL,EAGE,OAAAE,EAACC,EAAA,CACC,KAAK,oBACL,KAAMvB,GAAA,YAAAA,EAAO,kBACb,QAAS,CACP,GAAGY,EACH,kBAAmBS,CACrB,EAEA,SAAAC,EAACE,EAAO,CAAA,GAAGH,CAAc,CAAA,CAAA,CAC3B,CAEJ,EAEA,OAAOzB,EACL0B,EAACG,EAAA,CAEC,YAAa,OAAO7B,GAAS,SAAWA,EAAK,YAAc,GAE3D,WAACuB,EAAK,CAAA,CAAA,CAAA,EAHDF,CAAA,IAMNE,EAAe,CAAA,QAAS,IAAMX,EAAUU,CAAG,GAAjCD,CAAoC,CAElD,KACCK,EAAC,MAAA,CAEC,IAAI,iFACJ,UAAU,2CACV,OAAOzB,GAAA,YAAAA,EAAa,QAAS,IAC7B,QAAQA,GAAA,YAAAA,EAAa,SAAU,KAC/B,cAAW,EAAA,EALP,cAMN,GAEJ,CACEK,EACAE,GAAA,YAAAA,EAAM,OACNP,EACAD,EACAgB,EACAZ,GAAA,YAAAA,EAAO,iBAAA,CAEX,EAEM0B,EAAab,EAAQ,IAAM,OAE7B,QAAAE,EAAAX,GAAA,YAAAA,EAAM,SAAN,YAAAW,EAAc,IAAI,CAAC,CAAE,MAAAC,EAAO,IAAAC,GAAOC,IAAQ,OACzC,MAAMG,EAAe,CACnB,MAAOL,EACP,IAAKC,EACL,IAAKf,GAAA,YAAAA,EAAa,QAAQ,YAAac,GACpC,QAAQ,QAAS,OAAOE,EAAM,CAAC,GAC/B,QAAQ,UAAW,QAAOH,EAAAX,GAAA,YAAAA,EAAM,SAAN,YAAAW,EAAc,MAAM,GAIjD,OAAOjB,GAAA,YAAAA,EAAiB,QAAS,IACjC,QAAQA,GAAA,YAAAA,EAAiB,SAAU,IACnC,OAAQA,GAAmB,CAAE,MAAO,GAAI,EACxC,QAAS,MACX,EAGE,OAAAwB,EAACC,EAAA,CAEC,KAAK,oBACL,QAAQ,OACR,WAAW,OACX,KAAMvB,GAAA,YAAAA,EAAO,kBACb,QAAS,CACP,GAAGY,EACH,kBAAmBS,CACrB,EAEA,SAAAC,EAACE,EAAO,CAAA,GAAGH,CAAc,CAAA,CAAA,EAVpBJ,CAWP,CAEH,KACCK,EAAC,MAAA,CAEC,IAAI,iFACJ,UAAU,8CACV,OAAOxB,GAAA,YAAAA,EAAiB,QAAS,IACjC,QAAQA,GAAA,YAAAA,EAAiB,SAAU,IACnC,cAAW,EAAA,EALP,cAMN,CAAA,EAGH,CACDI,EACAE,GAAA,YAAAA,EAAM,OACNN,EACAc,EACAZ,GAAA,YAAAA,EAAO,iBAAA,CACR,EAEG,OAACI,EAGHuB,EAAC,MAAK,CAAA,GAAG1B,EAEP,SAAA,CAAAqB,EAACM,EAAA,CACC,OAAQ,CAAC,GAACb,EAAAX,GAAA,YAAAA,EAAM,SAAN,MAAAW,EAAc,SAAUrB,EAClC,kBAAAC,EACA,UAAUkC,EAAAzB,GAAA,YAAAA,EAAM,SAAN,MAAAyB,EAAc,OAASvC,EAAW,OAC5C,KAAMC,GAAQ,CAAC,GAACuC,EAAA1B,EAAK,SAAL,MAAA0B,EAAa,QAC7B,KAAM,CAAC,GAACC,EAAA3B,GAAA,YAAAA,EAAM,SAAN,MAAA2B,EAAc,SAAUvC,EAChC,IAAAC,EACA,aAAcc,GAAU,EACxB,WAAAmB,EAEC,SAAAZ,CAAA,CACH,EAGCP,IAAW,KAAO,KAChBe,EAAAU,EAAA,CAAQ,QAAS,IAAMxB,EAAU,IAAI,EAAG,SAAQ,GAC/C,SAAAc,EAACM,EAAA,CACC,OAAQ,CAAC,GAACK,EAAA7B,GAAA,YAAAA,EAAM,SAAN,MAAA6B,EAAc,QACxB,MAAM,OACN,OAAO,OACP,aAAc1B,EACd,KAAMhB,GAAQ,CAAC,GAAC2C,EAAA9B,EAAK,SAAL,MAAA8B,EAAa,QAC7B,SAAS,OACT,SAAQ,GAEP,SAAApB,CAAA,CAAA,CAEL,CAAA,CAAA,EAEJ,EAlCgB,IAoCpB,EAEA3B,EAAe,eAAiBgD"}
1
+ {"version":3,"file":"ProductGallery.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGallery/ProductGallery.tsx"],"sourcesContent":["import { HTMLAttributes, useEffect, useMemo, useState } from 'preact/compat';\nimport {\n Container,\n ResolveImageUrlOptions,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\n\nimport { Image, ImageProps } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\nimport { getFetchedProductData } from '@/pdp/api';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Carousel, Overlay, Zoom } from '@/pdp/components';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductGalleryProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n scope?: string;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n loop?: boolean;\n peak?: boolean;\n gap?: 'small' | 'medium' | 'large' | null;\n arrows?: boolean;\n arrowsOnMainImage?: boolean;\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n zoom?: { closeButton: boolean } | boolean;\n slots?: {\n CarouselThumbnail?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n CarouselMainImage?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n };\n}\n\nexport const ProductGallery: Container<\n ProductGalleryProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n controls = 'dots',\n loop = true,\n peak = false,\n gap = null,\n arrows = true,\n arrowsOnMainImage = false,\n zoom = false,\n imageParams,\n thumbnailParams,\n children,\n slots,\n ...props\n}) => {\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [zoomTo, setZoomTo] = useState<number | null>(null);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n const images = useMemo(\n () =>\n data?.images?.map(({ label, url }, key) => {\n const Item = ({ ...itemProps }) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: imageParams?.width ?? 960,\n height: imageParams?.height ?? 1191,\n params: imageParams ?? { width: 960 },\n loading: key === 0 ? 'eager' : 'lazy',\n ...itemProps,\n } as const;\n\n return (\n <Slot\n name=\"CarouselMainImage\"\n slot={slots?.CarouselMainImage}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n };\n\n return zoom ? (\n <Zoom\n key={url}\n closeButton={typeof zoom === 'object' ? zoom.closeButton : false}\n >\n <Item />\n </Zoom>\n ) : (\n <Item key={url} onClick={() => setZoomTo(key)} />\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__images__placeholder\"\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n aria-hidden\n />\n ),\n [\n ImagesLabel,\n data?.images,\n imageParams,\n zoom,\n defaultSlotContext,\n slots?.CarouselMainImage,\n ]\n );\n\n const thumbnails = useMemo(() => {\n return (\n data?.images?.map(({ label, url }, key) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n params: thumbnailParams ?? { width: 200 },\n loading: 'lazy',\n } as const;\n\n return (\n <Slot\n key={url}\n name=\"CarouselThumbnail\"\n slotTag=\"span\"\n contentTag=\"span\"\n slot={slots?.CarouselThumbnail}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__thumbnail__placeholder\"\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n aria-hidden\n />\n )\n );\n }, [\n ImagesLabel,\n data?.images,\n thumbnailParams,\n defaultSlotContext,\n slots?.CarouselThumbnail,\n ]);\n\n if (!data) return null;\n\n return (\n <div {...props}>\n {/* Carousel */}\n <Carousel\n arrows={!!data?.images?.length && arrows}\n arrowsOnMainImage={arrowsOnMainImage}\n controls={data?.images?.length ? controls : undefined}\n loop={loop && !!data.images?.length}\n peak={!!data?.images?.length && peak}\n gap={gap}\n defaultIndex={zoomTo || 0}\n thumbnails={thumbnails}\n >\n {images}\n </Carousel>\n\n {/* Zoom Overlay */}\n {zoomTo === null ? null : (\n <Overlay onClose={() => setZoomTo(null)} centered>\n <Carousel\n arrows={!!data?.images?.length}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoomTo}\n loop={loop && !!data.images?.length}\n controls=\"dots\"\n isZoomed\n >\n {images}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n\nProductGallery.getInitialData = getFetchedProductData;\n"],"names":["ProductGallery","initialData","scope","controls","loop","peak","gap","arrows","arrowsOnMainImage","zoom","imageParams","thumbnailParams","children","slots","props","ImagesLabel","useText","data","setData","useState","zoomTo","setZoomTo","useEffect","dataEvent","events","defaultSlotContext","useMemo","images","_a","label","url","key","Item","itemProps","defaultProps","jsx","Slot","Image","Zoom","thumbnails","jsxs","Carousel","_b","_c","_d","Overlay","_e","_f","getFetchedProductData"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as l}from"@dropins/tools/preact-jsx-runtime.js";import{useState as m,useEffect as N}from"@dropins/tools/preact-compat.js";import{classes as x}from"@dropins/tools/lib.js";import{events as f}from"@dropins/tools/event-bus.js";import{a as y,s as D}from"../chunks/isProductConfigurationValid.js";import{g as P}from"../chunks/getFetchedProductData.js";import{G as v}from"../chunks/GiftCardOptions2.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";const G=({initialData:g=null,scope:p,children:I,...s})=>{var d;const[a,O]=m(g),[c,h]=m({sku:"",quantity:1,enteredOptions:[]});N(()=>{const t=f.on("pdp/data",O,{scope:p}),n=f.on("pdp/values",h,{eager:!0});return()=>{t==null||t.off(),n==null||n.off()}},[p]);const C=(t,n)=>{const r=c.enteredOptions||[],i=r.findIndex(e=>e.uid===t);let o;i!==-1?o=r.map(e=>e.uid===t?{...e,value:n}:e):o=[...r,{uid:t,value:n}],D(e=>({...e,enteredOptions:o}))},V=t=>{y(()=>t)};return a?l("div",{...s,className:x(["pdp-gift-card-options",s.className]),children:(d=a==null?void 0:a.attributes)==null?void 0:d.map(({id:t,value:n},r)=>{var o,e;if(t!=="ac_giftcard")return null;let i={options:[]};try{i=JSON.parse(n)}catch{}return l(v,{options:i.options,className:s.className,optionValues:(c.enteredOptions||[]).map(u=>({id:u.uid,value:u.value})),currency:(e=(o=a.prices)==null?void 0:o.final)==null?void 0:e.currency,onOptionChange:C,onValidationChange:V},`giftcard-${r}`)})}):null};G.getInitialData=P;export{G as ProductGiftCardOptions,G as default};
3
+ import{jsx as p}from"@dropins/tools/preact-jsx-runtime.js";import{classes as g}from"@dropins/tools/lib.js";import{s as h}from"../chunks/getProductConfigurationValues.js";import"@dropins/tools/event-bus.js";import{s as O}from"../chunks/isProductConfigurationValid.js";import{g as C}from"../chunks/getFetchedProductData.js";import{G as V}from"../chunks/GiftCardOptions2.js";import{u as v,g as x}from"../chunks/useProductData.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";const P=({initialData:l=null,scope:m,children:N,...e})=>{const{data:r,values:d}=v({scope:m,initialData:l,initialValues:{enteredOptions:[]}}),u=(i,a)=>{const n=d.enteredOptions||[],o=n.findIndex(t=>t.uid===i)!==-1?n.map(t=>t.uid===i?{...t,value:a}:t):[...n,{uid:i,value:a}];h(t=>({...t,enteredOptions:o}))},f=i=>{O(()=>i)};if(!r)return null;const c=x(r,"ac_giftcard");return c.length===0?null:p("div",{...e,className:g(["pdp-gift-card-options",e.className]),children:c.map((i,a)=>{var n,s,o;return p(V,{options:((n=i.value)==null?void 0:n.options)||[],className:e.className,optionValues:(d.enteredOptions||[]).map(t=>({id:t.uid,value:t.value})),currency:(o=(s=r.prices)==null?void 0:s.final)==null?void 0:o.currency,onOptionChange:u,onValidationChange:f},`giftcard-${a}`)})})};P.getInitialData=C;export{P as ProductGiftCardOptions,P as default};
4
4
  //# sourceMappingURL=ProductGiftCardOptions.js.map
@@ -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, useEffect, useState } from 'preact/compat';\nimport { Container, classes } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { Option, ValuesModel } from '@/pdp/data/models/values-model';\nimport {\n getFetchedProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { GiftCardOptions } from '@/pdp/components/GiftCardOptions';\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, setData] = useState<ProductModel | null>(initialData);\n const [values, setValues] = useState<ValuesModel>({\n sku: '',\n quantity: 1,\n enteredOptions: [],\n });\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n const valuesEvent = events.on('pdp/values', setValues, { eager: true });\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n }, [scope]);\n\n const handleOptionChange = (uid: string, value: string) => {\n const prevOptions = values.enteredOptions || [];\n const idx = prevOptions.findIndex((field) => field.uid === uid);\n let newEnteredOptions;\n if (idx !== -1) {\n newEnteredOptions = prevOptions.map((field) =>\n field.uid === uid ? { ...field, value } : field\n );\n } else {\n newEnteredOptions = [...prevOptions, { uid, value }];\n }\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 return (\n <div\n {...props}\n className={classes(['pdp-gift-card-options', props.className])}\n >\n {data?.attributes?.map(\n ({ id, value }: { id: string; value: any }, index: number) => {\n if (id !== 'ac_giftcard') {\n return null;\n }\n let optionData: { options: Option[] } = { options: [] };\n try {\n optionData = JSON.parse(value);\n } catch {}\n\n return (\n <GiftCardOptions\n key={`giftcard-${index}`}\n options={optionData.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 }\n )}\n </div>\n );\n};\n\nProductGiftCardOptions.getInitialData = getFetchedProductData;\n"],"names":["ProductGiftCardOptions","initialData","scope","children","props","data","setData","useState","values","setValues","useEffect","dataEvent","events","valuesEvent","handleOptionChange","uid","value","prevOptions","idx","field","newEnteredOptions","setProductConfigurationValues","prev","handleValidationChange","valid","setProductConfigurationValid","jsx","classes","id","index","optionData","GiftCardOptions","opt","_b","_a","getFetchedProductData"],"mappings":"uiBAiCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,OACzD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BN,CAAW,EAC3D,CAACO,EAAQC,CAAS,EAAIF,EAAsB,CAChD,IAAK,GACL,SAAU,EACV,eAAgB,CAAA,CAAC,CAClB,EAEDG,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYN,EAAS,CAAE,MAAAJ,EAAO,EACpDW,EAAcD,EAAO,GAAG,aAAcH,EAAW,CAAE,MAAO,GAAM,EAEtE,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACX,CAAK,CAAC,EAEJ,MAAAY,EAAqB,CAACC,EAAaC,IAAkB,CACnD,MAAAC,EAAcT,EAAO,gBAAkB,CAAC,EACxCU,EAAMD,EAAY,UAAWE,GAAUA,EAAM,MAAQJ,CAAG,EAC1D,IAAAK,EACAF,IAAQ,GACVE,EAAoBH,EAAY,IAAKE,GACnCA,EAAM,MAAQJ,EAAM,CAAE,GAAGI,EAAO,MAAAH,GAAUG,CAC5C,EAEAC,EAAoB,CAAC,GAAGH,EAAa,CAAE,IAAAF,EAAK,MAAAC,EAAO,EAGrDK,EAA+BC,IAAU,CACvC,GAAGA,EACH,eAAgBF,CAAA,EAChB,CACJ,EAEMG,EAA0BC,GAAmB,CACjDC,EAA6B,IAAMD,CAAK,CAC1C,EAEI,OAACnB,EAGHqB,EAAC,MAAA,CACE,GAAGtB,EACJ,UAAWuB,EAAQ,CAAC,wBAAyBvB,EAAM,SAAS,CAAC,EAE5D,6BAAM,2BAAY,IACjB,CAAC,CAAE,GAAAwB,EAAI,MAAAZ,GAAqCa,IAAkB,SAC5D,GAAID,IAAO,cACF,OAAA,KAET,IAAIE,EAAoC,CAAE,QAAS,EAAG,EAClD,GAAA,CACWA,EAAA,KAAK,MAAMd,CAAK,CAAA,MACvB,CAAA,CAGN,OAAAU,EAACK,EAAA,CAEC,QAASD,EAAW,QACpB,UAAW1B,EAAM,UACjB,cAAeI,EAAO,gBAAkB,CAAA,GAAI,IAAKwB,IAAS,CACxD,GAAIA,EAAI,IACR,MAAOA,EAAI,KAAA,EACX,EACF,UAAUC,GAAAC,EAAA7B,EAAK,SAAL,YAAA6B,EAAa,QAAb,YAAAD,EAAoB,SAC9B,eAAgBnB,EAChB,mBAAoBS,CAAA,EATf,YAAYM,CAAK,EAUxB,CAAA,EAGN,CACF,EAjCgB,IAmCpB,EAEA7B,EAAuB,eAAiBmC"}
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":"mmBAiCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,SAAAC,EAAU,GAAGC,KAAY,CACzD,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAIC,EAAe,CACtC,MAAAL,EACA,YAAAD,EACA,cAAe,CAAE,eAAgB,CAAG,CAAA,CAAA,CACrC,EAEKO,EAAqB,CAACC,EAAaC,IAAkB,CACnD,MAAAC,EAAcL,EAAO,gBAAkB,CAAC,EAExCM,EADMD,EAAY,UAAWE,GAAUA,EAAM,MAAQJ,CAAG,IAEpD,GACJE,EAAY,IAAKE,GACfA,EAAM,MAAQJ,EAAM,CAAE,GAAGI,EAAO,MAAAH,GAAUG,GAE5C,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,EAEI,GAAA,CAACZ,EAAa,OAAA,KAElB,MAAMc,EAAqBC,EACzBf,EACA,aACF,EAEI,OAAAc,EAAmB,SAAW,EAAU,KAG1CE,EAAC,MAAA,CACE,GAAGjB,EACJ,UAAWkB,EAAQ,CAAC,wBAAyBlB,EAAM,SAAS,CAAC,EAE5D,SAAmBe,EAAA,IAAI,CAACI,EAAUC,IACjC,WAAA,OAAAH,EAACI,EAAA,CAEC,UAASC,EAAAH,EAAS,QAAT,YAAAG,EAAgB,UAAW,CAAC,EACrC,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,EAWzB,EAAA,CAAA,CACH,CAEJ,EAEAxB,EAAuB,eAAiB8B"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as p,jsx as e,Fragment as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useEffect as u}from"@dropins/tools/preact-compat.js";import{classes as f,VComponent as l}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 */import{events as h}from"@dropins/tools/event-bus.js";import{g}from"../chunks/getFetchedProductData.js";const _=({className:a,title:r,sku:o,hideSku:s=!1,children:i,...t})=>p("div",{...t,className:f(["pdp-header",a]),children:[e("div",{className:"pdp-header__title",children:e(l,{node:r})}),!s&&e("div",{className:"pdp-header__sku",children:e(l,{node:o})})]}),k=({initialData:a=null,scope:r,hideSku:o=!1,children:s,...i})=>{const[t,m]=c(a);return u(()=>{const d=h.on("pdp/data",m,{scope:r});return()=>{d==null||d.off()}},[r]),t?e(_,{...i,title:e(n,{children:t.name}),sku:e(n,{children:t.sku}),hideSku:o}):null};k.getInitialData=g;export{k as ProductHeader,k as default};
3
+ import{jsxs as p,jsx as e,Fragment as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useEffect as u}from"@dropins/tools/preact-compat.js";import{classes as f,VComponent as m}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 h}from"@dropins/tools/event-bus.js";import{g}from"../chunks/getFetchedProductData.js";const _=({className:a,title:r,sku:o,hideSku:i=!1,children:s,...t})=>p("div",{...t,className:f(["pdp-header",a]),children:[e("div",{className:"pdp-header__title",children:e(m,{node:r})}),!i&&e("div",{className:"pdp-header__sku",children:e(m,{node:o})})]}),k=({initialData:a=null,scope:r,hideSku:o=!1,children:i,...s})=>{const[t,l]=c(a);return u(()=>{const d=h.on("pdp/data",l,{scope:r});return()=>{d==null||d.off()}},[r]),t?e(_,{...s,title:e(n,{children:t.name}),sku:e(n,{children:t.sku}),hideSku:o}):null};k.getInitialData=g;export{k as ProductHeader,k 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}\n\nexport const Header: FunctionComponent<HeaderProps> = ({\n className,\n title,\n sku,\n hideSku = false,\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 </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}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({ initialData = null, scope, hideSku = false, 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 <Header\n {...props}\n title={<>{data.name}</>}\n sku={<>{data.sku}</>}\n hideSku={hideSku}\n />\n );\n};\n\nProductHeader.getInitialData = getFetchedProductData;\n"],"names":["Header","className","title","sku","hideSku","children","props","jsxs","classes","jsx","VComponent","ProductHeader","initialData","scope","data","setData","useState","useEffect","dataEvent","events","Fragment","getFetchedProductData"],"mappings":"sfA4BO,MAAMA,EAAyC,CAAC,CACrD,UAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,GACV,SAAAC,EACA,GAAGC,CACL,IAEIC,EAAC,MAAK,CAAA,GAAGD,EAAO,UAAWE,EAAQ,CAAC,aAAcP,CAAS,CAAC,EAC1D,SAAA,CAAAQ,EAAC,OAAI,UAAU,oBACb,WAACC,EAAW,CAAA,KAAMR,EAAO,CAC3B,CAAA,EACC,CAACE,GACAK,EAAC,MAAI,CAAA,UAAU,kBACb,SAACA,EAAAC,EAAA,CAAW,KAAMP,CAAK,CAAA,CACzB,CAAA,CAAA,EAEJ,EClBSQ,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAT,EAAU,GAAO,SAAAC,EAAU,GAAGC,KAAY,CAC1E,KAAM,CAACQ,EAAMC,CAAO,EAAIC,EAA8BJ,CAAW,EAU7D,OARJK,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAF,EAAO,EAE1D,MAAO,IAAM,CACXK,GAAA,MAAAA,EAAW,KACb,CAAA,EACC,CAACL,CAAK,CAAC,EAELC,EAGHL,EAACT,EAAA,CACE,GAAGM,EACJ,MAAUG,EAAAW,EAAA,CAAA,SAAAN,EAAK,KAAK,EACpB,IAAQL,EAAAW,EAAA,CAAA,SAAAN,EAAK,IAAI,EACjB,QAAAV,CAAA,CACF,EARgB,IAUpB,EAEAO,EAAc,eAAiBU"}
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}\n\nexport const Header: FunctionComponent<HeaderProps> = ({\n className,\n title,\n sku,\n hideSku = false,\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 </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}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({ initialData = null, scope, hideSku = false, 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 <Header\n {...props}\n title={<>{data.name}</>}\n sku={<>{data.sku}</>}\n hideSku={hideSku}\n />\n );\n};\n\nProductHeader.getInitialData = getFetchedProductData;\n"],"names":["Header","className","title","sku","hideSku","children","props","jsxs","classes","jsx","VComponent","ProductHeader","initialData","scope","data","setData","useState","useEffect","dataEvent","events","Fragment","getFetchedProductData"],"mappings":"+hBA4BO,MAAMA,EAAyC,CAAC,CACrD,UAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,GACV,SAAAC,EACA,GAAGC,CACL,IAEIC,EAAC,MAAK,CAAA,GAAGD,EAAO,UAAWE,EAAQ,CAAC,aAAcP,CAAS,CAAC,EAC1D,SAAA,CAAAQ,EAAC,OAAI,UAAU,oBACb,WAACC,EAAW,CAAA,KAAMR,EAAO,CAC3B,CAAA,EACC,CAACE,GACAK,EAAC,MAAI,CAAA,UAAU,kBACb,SAACA,EAAAC,EAAA,CAAW,KAAMP,CAAK,CAAA,CACzB,CAAA,CAAA,EAEJ,EClBSQ,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAT,EAAU,GAAO,SAAAC,EAAU,GAAGC,KAAY,CAC1E,KAAM,CAACQ,EAAMC,CAAO,EAAIC,EAA8BJ,CAAW,EAU7D,OARJK,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,EAAS,CAAE,MAAAF,EAAO,EAE1D,MAAO,IAAM,CACXK,GAAA,MAAAA,EAAW,KACb,CAAA,EACC,CAACL,CAAK,CAAC,EAELC,EAGHL,EAACT,EAAA,CACE,GAAGM,EACJ,MAAUG,EAAAW,EAAA,CAAA,SAAAN,EAAK,KAAK,EACpB,IAAQL,EAAAW,EAAA,CAAA,SAAAN,EAAK,IAAI,EACjB,QAAAV,CAAA,CACF,EARgB,IAUpB,EAEAO,EAAc,eAAiBU"}
@@ -1,8 +1,11 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
2
  import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
+ import { OptionsTransformer } from '../../api';
4
5
  import { ImageNodeRenderProps, ImageProps } from '@dropins/tools/types/elsie/src/components';
5
6
 
7
+ /** @deprecated Use OptionsTransformer from @/pdp/api instead */
8
+ export type ProductOptionsTransformer = OptionsTransformer;
6
9
  export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
7
10
  scope?: string;
8
11
  hideSelectedValue?: boolean;
@@ -10,6 +13,7 @@ export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
10
13
  onErrors?: (errors: {
11
14
  [id: string]: string;
12
15
  }) => void;
16
+ transformer?: ProductOptionsTransformer;
13
17
  slots?: {
14
18
  Swatches?: SlotProps<{
15
19
  data: ProductModel | null;
@@ -15,4 +15,5 @@
15
15
  */
16
16
  export * from './ProductOptions';
17
17
  export { ProductOptions as default } from './ProductOptions';
18
+ export type { ProductOptionsTransformer } from './ProductOptions';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as d}from"@dropins/tools/preact-jsx-runtime.js";import{useState as h,useEffect as z,useCallback as j}from"@dropins/tools/preact-compat.js";import{Slot as C}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 A}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css */import{c as v,l as G,j as H,p as J}from"../chunks/fetchProductData.js";import{g as O,s as b,a as y}from"../chunks/isProductConfigurationValid.js";import{g as K}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Q=({initialData:s={data:null,optionsUIDs:[]},scope:i,hideSelectedValue:l=!1,slots:n,onValues:u,onErrors:m,children:V,...B})=>{var I;const[t,T]=h(s.data),[p,F]=h(s.optionsUIDs),[M,L]=h();z(()=>{const o=S.on("pdp/data",T,{scope:i}),c=S.on("pdp/values",({optionsUIDs:f})=>{f&&F(f)},{scope:i});return()=>{o==null||o.off(),c==null||c.off()}},[]);const N=j(async o=>{var U,w,D,k;if(!(t!=null&&t.sku))return;const{persistURLParams:c,anchors:f,acdl:q}=v.getConfig()??{};let a=Object.keys(o).map(r=>o[r].value).filter(r=>r!==void 0);c&&!(t!=null&&t.isBundle)&&G({optionsUIDs:a.join(",")}),((w=(U=O({scope:i}))==null?void 0:U.optionsUIDs)==null?void 0:w.join("|"))!==(a==null?void 0:a.join("|"))&&b(r=>({...r,optionsUIDs:a}),{scope:i}),u==null||u(a);const e=await H(t.sku,{optionsUIDs:a??[],isBundle:t==null?void 0:t.isBundle,anchors:f});S.emit("pdp/data",e,{scope:i});let P=(a==null?void 0:a.length)===((D=e==null?void 0:e.options)==null?void 0:D.length);if(f!=null&&f.length){const r=(e==null?void 0:e.optionUIDs)??[];a.every(g=>r.includes(g))||(L(e==null?void 0:e.options),b(g=>({...g,optionsUIDs:r}),{scope:i}),P=(r==null?void 0:r.length)===((k=e==null?void 0:e.options)==null?void 0:k.length))}y(()=>P,{scope:i}),q&&e&&(e==null?void 0:e.variantSku)!==t.sku&&J(e)},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,u,i]),R=j(o=>{Object.keys(o).length!==0&&(y(()=>!1,{scope:i}),m==null||m(o))},[m,i]);return!t||!t.options?null:d(C,{name:"Swatches",slot:n==null?void 0:n.Swatches,context:{data:t,optionsUIDs:p},children:d(A,{...B,options:t.options,selectedUIDs:p,defaultOptions:p,selectionsToUpdate:M,hideSelectedValue:l,disablePreselections:!((I=v.getConfig())!=null&&I.preselectFirstOption),onValues:N,onErrors:R,imageSwatchNode:n!=null&&n.SwatchImage?({imageSwatchContext:o,...c})=>d(C,{name:"SwatchImage",slot:n==null?void 0:n.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:p,defaultImageProps:c,imageSwatchContext:o}}):void 0})})};Q.getInitialData=async function(s){var n;const i=await K({scope:s==null?void 0:s.scope}),l=((n=O({scope:s==null?void 0:s.scope}))==null?void 0:n.optionsUIDs)??[];return{data:i,optionsUIDs:l}};export{Q as ProductOptions,Q as default};
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};
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 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} 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\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 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 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 if (!data) return null;\n\n // Only show if there are options in the data\n if (!data.options) 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={data.options}\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","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","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 { 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,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{classes as g,VComponent as x,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 */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/isProductConfigurationValid.js";const I=({className:s,price:i,specialPrice:c,tiers:a,children:p,...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",s]),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:s,tiers:i,regularPrice:c,...a})=>{const p=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=p.replace("{quantity}",o.toString()).split("{price}")[0],f=p.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:s,className:"pdp-price-tiers__price"}),f]})},n)})})},U=({initialData:s=null,scope:i,children:c,...a})=>{var d,l,P,f,m,u,N,y,D,L,S;const{globalLocale:p="en-US"}=F.getConfig(),[e,n]=T(s),[r,o]=T(p);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{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{classes as g,VComponent as x,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};
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/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,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/isProductConfigurationValid.js";import{g as D}from"../chunks/getFetchedProductData.js";import{k as h,c as x,l as C}from"../chunks/fetchProductData.js";import{useText as S}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.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,d]=i(()=>h(1));y(()=>{const r=m.on("pdp/data",f,{scope:a}),t=m.on("pdp/values",({quantity:n})=>{d(n)},{eager:!0,scope:a});return()=>{r==null||r.off(),t==null||t.off()}},[a]);const p=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:p,...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{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};
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":"0kBAqCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,GAAGC,KAAY,CAC5D,MAAAC,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,CAAM,CACvB,EAEA,MAAO,IAAM,CACXa,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACf,CAAK,CAAC,EAEJ,MAAAiB,EAAiBC,GAAkB,CACjC,MAAAF,EAAW,SAASE,EAAO,EAAE,EACLC,EAACC,IAAU,CAAE,GAAGA,EAAM,SAAAJ,IAAa,CAAE,MAAAhB,EAAO,EAG1E,KAAM,CAAE,iBAAAqB,CAAiB,EAAIC,EAAO,aAAe,CAAC,EAChDD,GACWE,EAAA,CAAE,SAAAP,EAAU,EAG3Bf,GAAA,MAAAA,EAAUe,EACZ,EAEI,OAACV,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,UASN,EAbgB,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":"6nBAqCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,GAAGC,KAAY,CAC5D,MAAAC,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,CAAM,CACvB,EAEA,MAAO,IAAM,CACXa,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACf,CAAK,CAAC,EAEJ,MAAAiB,EAAiBC,GAAkB,CACjC,MAAAF,EAAW,SAASE,EAAO,EAAE,EACLC,EAACC,IAAU,CAAE,GAAGA,EAAM,SAAAJ,IAAa,CAAE,MAAAhB,EAAO,EAG1E,KAAM,CAAE,iBAAAqB,CAAiB,EAAIC,EAAO,aAAe,CAAC,EAChDD,GACWE,EAAA,CAAE,SAAAP,EAAU,EAG3Bf,GAAA,MAAAA,EAAUe,EACZ,EAEI,OAACV,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,UASN,EAbgB,IAepB,EAEAL,EAAgB,eAAiB6B"}
@@ -21,6 +21,7 @@ export * from './ProductShortDescription';
21
21
  export * from './ProductDescription';
22
22
  export * from './ProductAttributes';
23
23
  export * from './ProductGiftCardOptions';
24
+ export * from './ProductDownloadableOptions';
24
25
  export * from './ProductGallery';
25
26
  export * from './ProductHeader';
26
27
  //# sourceMappingURL=index.d.ts.map
@@ -67,6 +67,7 @@ interface Attribute {
67
67
  id: string;
68
68
  label: string;
69
69
  value: string;
70
+ roles?: string[];
70
71
  }
71
72
  export {};
72
73
  //# sourceMappingURL=product-model.d.ts.map
@@ -25,14 +25,6 @@ declare const _default: {
25
25
  "TierPricing": {
26
26
  "label": "Buy {quantity} for {price} each and save {percent}%"
27
27
  },
28
- "PriceRange": {
29
- "From": {
30
- "label": "From"
31
- },
32
- "To": {
33
- "label": "to"
34
- }
35
- },
36
28
  "Image": {
37
29
  "label": "{product} Image {key} of {total}"
38
30
  },
@@ -77,6 +69,14 @@ declare const _default: {
77
69
  "label": "Choose an option"
78
70
  }
79
71
  },
72
+ "DownloadableOptions": {
73
+ "Sample": {
74
+ "label": "Sample"
75
+ },
76
+ "ViewSample": {
77
+ "label": "View sample for {label}"
78
+ }
79
+ },
80
80
  "Carousel": {
81
81
  "label": "Carousel",
82
82
  "Next": {
@@ -105,9 +105,6 @@ declare const _default: {
105
105
  "label": "Close"
106
106
  }
107
107
  }
108
- },
109
- "Custom": {
110
- "quantityLabel": "Quantity"
111
108
  }
112
109
  }
113
110
  ;
@@ -0,0 +1,31 @@
1
+ import { ProductModel } from '../data/models';
2
+ import { ValuesModel } from '../data/models/values-model';
3
+
4
+ export interface UseProductDataOptions {
5
+ scope?: string;
6
+ initialData?: ProductModel | null;
7
+ initialValues?: Partial<ValuesModel>;
8
+ }
9
+ export interface UseProductDataResult {
10
+ data: ProductModel | null;
11
+ values: ValuesModel;
12
+ }
13
+ /**
14
+ * Custom hook for subscribing to PDP data and values events.
15
+ * Provides a reusable way to access product data and configuration values
16
+ * across container components.
17
+ */
18
+ export declare function useProductData({ scope, initialData, initialValues, }?: UseProductDataOptions): UseProductDataResult;
19
+ export interface AttributeResult<T = any> {
20
+ id: string;
21
+ label: string;
22
+ value: T;
23
+ }
24
+ /**
25
+ * Utility function to find and parse all attributes by their ID from product data.
26
+ * Returns an array of all matching attributes.
27
+ * Handles JSON parsing of attribute values and provides type safety.
28
+ * If JSON parsing fails, returns the attribute with the raw value or a default empty structure.
29
+ */
30
+ export declare function getAttributesById<T = any>(data: ProductModel | null, attributeId: string): AttributeResult<T>[];
31
+ //# sourceMappingURL=useProductData.d.ts.map
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-pdp", "version": "3.0.0", "@dropins/tools": "~1.5.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-pdp", "version": "3.0.1-alpha2", "@dropins/tools": "~1.5.0", "license": "SEE LICENSE IN LICENSE.md"}