@dropins/storefront-pdp 1.1.2-alpha2 → 1.2.0-alpha6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/fetch-graphql/fetch-graphql.d.ts +2 -2
- package/api/initialize/initialize.d.ts +3 -3
- package/api.js +1 -0
- package/api.js.map +1 -0
- package/chunks/PriceRange.js +1 -0
- package/chunks/PriceRange.js.map +1 -0
- package/chunks/Swatches.js +2 -1
- package/chunks/Swatches.js.map +1 -0
- package/chunks/Zoom.js +1 -0
- package/chunks/Zoom.js.map +1 -0
- package/chunks/date.js +1 -0
- package/chunks/date.js.map +1 -0
- package/chunks/getFetchedProductData.js +1 -0
- package/chunks/getFetchedProductData.js.map +1 -0
- package/chunks/isProductConfigurationValid.js +7 -6
- package/chunks/isProductConfigurationValid.js.map +1 -0
- package/components/Swatches/Swatches.d.ts +4 -2
- package/containers/ProductAttributes/ProductAttributes.d.ts +8 -1
- package/containers/ProductAttributes.js +2 -1
- package/containers/ProductAttributes.js.map +1 -0
- package/containers/ProductDescription/ProductDescription.d.ts +1 -1
- package/containers/ProductDescription.js +1 -0
- package/containers/ProductDescription.js.map +1 -0
- package/containers/ProductDetails/ProductDetails.d.ts +12 -3
- package/containers/ProductDetails.js +2 -1
- package/containers/ProductDetails.js.map +1 -0
- package/containers/ProductGallery/ProductGallery.d.ts +14 -1
- package/containers/ProductGallery.js +2 -1
- package/containers/ProductGallery.js.map +1 -0
- package/containers/ProductHeader/ProductHeader.d.ts +1 -1
- package/containers/ProductHeader.js +1 -0
- package/containers/ProductHeader.js.map +1 -0
- package/containers/ProductOptions/ProductOptions.d.ts +9 -2
- package/containers/ProductOptions.js +2 -1
- package/containers/ProductOptions.js.map +1 -0
- package/containers/ProductPrice/ProductPrice.d.ts +1 -1
- package/containers/ProductPrice.js +1 -0
- package/containers/ProductPrice.js.map +1 -0
- package/containers/ProductQuantity/ProductQuantity.d.ts +1 -1
- package/containers/ProductQuantity.js +2 -1
- package/containers/ProductQuantity.js.map +1 -0
- package/containers/ProductShortDescription/ProductShortDescription.d.ts +1 -1
- package/containers/ProductShortDescription.js +1 -0
- package/containers/ProductShortDescription.js.map +1 -0
- package/fragments.js +1 -0
- package/fragments.js.map +1 -0
- package/i18n/en_US.json.d.ts +0 -3
- package/lib/url-params.d.ts +1 -0
- package/package.json +1 -1
- package/render/render.d.ts +1 -1
- package/render.js +3 -2
- package/render.js.map +1 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { FunctionComponent } from 'preact';
|
|
2
|
-
import { HTMLAttributes } from 'preact/compat';
|
|
1
|
+
import { FunctionComponent, VNode } from 'preact';
|
|
2
|
+
import { HTMLAttributes, JSX } from 'preact/compat';
|
|
3
|
+
import { ImageNodeRenderProps } from '@dropins/tools/types/elsie/src/components';
|
|
3
4
|
|
|
4
5
|
declare const supportedTypes: string[];
|
|
5
6
|
type OptionValue = {
|
|
@@ -34,6 +35,7 @@ export interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
34
35
|
[id: string]: string;
|
|
35
36
|
}) => void;
|
|
36
37
|
selectedUIDs?: string[];
|
|
38
|
+
imageSwatchNode?: VNode | ((props: ImageNodeRenderProps) => JSX.Element);
|
|
37
39
|
}
|
|
38
40
|
export declare const Swatches: FunctionComponent<SwatchesProps>;
|
|
39
41
|
export {};
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container } from '
|
|
2
|
+
import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ProductModel } from '../../data/models';
|
|
4
4
|
|
|
5
|
+
type DefaultSlotContext = {
|
|
6
|
+
data: ProductModel | null;
|
|
7
|
+
};
|
|
5
8
|
export interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {
|
|
9
|
+
slots?: {
|
|
10
|
+
Attributes?: SlotProps<DefaultSlotContext>;
|
|
11
|
+
};
|
|
6
12
|
}
|
|
7
13
|
export declare const ProductAttributes: Container<ProductAttributesProps, ProductModel | null>;
|
|
14
|
+
export {};
|
|
8
15
|
//# sourceMappingURL=ProductAttributes.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as c,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as m,useMemo as h,useEffect as x}from"@dropins/tools/preact-compat.js";import{classes as P,Slot as A}from"@dropins/tools/lib.js";import{events as s}from"@dropins/tools/event-bus.js";import{i as L,t as j}from"../chunks/date.js";import{g as C}from"../chunks/getFetchedProductData.js";import{useText as I}from"@dropins/tools/i18n.js";import{c as M}from"../chunks/isProductConfigurationValid.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const N=({initialData:l=null,children:T,slots:e,...i})=>{var n;const u=I("PDP.Product.Details.label").label,{defaultLocale:f="en-US"}=M.getConfig(),[d,p]=m(f),[r,b]=m(l),g=h(()=>({data:r}),[r]);return x(()=>{const o=s.on("pdp/data",b),t=s.on("locale",p);return()=>{o==null||o.off(),t==null||t.off()}},[]),r?c("div",{...i,className:P(["pdp-attributes",i.className]),children:[u,e!=null&&e.Attributes?a(A,{name:"Attributes",slot:e==null?void 0:e.Attributes,context:{...g}}):a("ul",{children:(n=r==null?void 0:r.attributes)==null?void 0:n.map(({label:o,value:t},D)=>{const S=L(t)?j(t,d):t.toString();return c("li",{children:[o,": ",a("span",{dangerouslySetInnerHTML:{__html:S}})]},D)})})]}):null};N.getInitialData=C;export{N as ProductAttributes,N as default};
|
|
4
|
+
//# sourceMappingURL=ProductAttributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductAttributes.js","sources":["/@dropins/storefront-pdp/src/containers/ProductAttributes/ProductAttributes.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState, useMemo } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { config, getFetchedProductData } from '@/pdp/api';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {\n slots?: {\n Attributes?: SlotProps<DefaultSlotContext>;\n };\n}\n\nexport const ProductAttributes: Container<\n ProductAttributesProps,\n ProductModel | null\n> = ({ initialData = null, children, slots, ...props }) => {\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const { defaultLocale = 'en-US' } = config.getConfig();\n\n const [locale, setLocale] = useState<string>(defaultLocale);\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, []);\n\n if (!data) return null;\n\n return (\n <div {...props} className={classes(['pdp-attributes', props.className])}>\n {DetailsLabel}\n {slots?.Attributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n />\n ) : (\n <ul>\n {data?.attributes?.map(({ label, value }, key) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n};\n\nProductAttributes.getInitialData = getFetchedProductData;\n"],"names":["ProductAttributes","initialData","children","slots","props","DetailsLabel","useText","defaultLocale","config","locale","setLocale","useState","data","setData","defaultSlotContext","useMemo","useEffect","dataEvent","events","localeEvent","jsxs","classes","jsx","Slot","_a","label","value","key","__html","isDateValid","toDateString","getFetchedProductData"],"mappings":"6hBAkCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,SAAAC,EAAU,MAAAC,EAAO,GAAGC,KAAY,OACnD,MAAAC,EAAeC,EAAQ,2BAA2B,EAAE,MACpD,CAAE,cAAAC,EAAgB,SAAYC,EAAO,UAAU,EAE/C,CAACC,EAAQC,CAAS,EAAIC,EAAiBJ,CAAa,EAEpD,CAACK,EAAMC,CAAO,EAAIF,EAA8BV,CAAW,EAE3Da,EAAyCC,EAC7C,KAAO,CAAE,KAAAH,CAAK,GACd,CAACA,CAAI,CACP,EAYI,OAVJI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYL,CAAO,EACzCM,EAAcD,EAAO,GAAG,SAAUR,CAAS,EAEjD,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,EAAE,EAEAP,EAGHQ,EAAC,MAAK,CAAA,GAAGhB,EAAO,UAAWiB,EAAQ,CAAC,iBAAkBjB,EAAM,SAAS,CAAC,EACnE,SAAA,CAAAC,EACAF,GAAA,MAAAA,EAAO,WACNmB,EAACC,EAAA,CACC,KAAK,aACL,KAAMpB,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGW,CAAmB,CAAA,CACnC,EAECQ,EAAA,KAAA,CACE,UAAME,EAAAZ,GAAA,YAAAA,EAAA,aAAA,YAAAY,EAAY,IAAI,CAAC,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAGC,IAAQ,CAC1C,MAAAC,EAASC,EAAYH,CAAK,EAC5BI,EAAaJ,EAAOjB,CAAM,EAC1BiB,EAAM,SAAS,EAEnB,SACG,KAEE,CAAA,SAAA,CAAAD,EAAM,KAAGH,EAAA,OAAA,CAAK,wBAAyB,CAAE,OAAAM,EAAU,CAAA,CAAA,CAAA,EAF7CD,CAGT,CAAA,EAGN,CAAA,CAAA,EAEJ,EA3BgB,IA6BpB,EAEA3B,EAAkB,eAAiB+B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container } from '
|
|
2
|
+
import { Container } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ProductModel } from '../../data/models';
|
|
4
4
|
|
|
5
5
|
export interface ProductDescriptionProps extends HTMLAttributes<HTMLDivElement> {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{jsx as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as i,useEffect as a}from"@dropins/tools/preact-compat.js";import{classes as c}from"@dropins/tools/lib.js";import{events as m}from"@dropins/tools/event-bus.js";import{g as l}from"../chunks/getFetchedProductData.js";const f=({initialData:o=null,children:p,...r})=>{const[t,s]=i(o);return a(()=>{const e=m.on("pdp/data",s);return()=>{e==null||e.off()}},[]),t?n("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""},...r,className:c(["pdp-description",r.className])}):null};f.getInitialData=l;export{f as ProductDescription,f as default};
|
|
4
|
+
//# sourceMappingURL=ProductDescription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductDescription.js","sources":["/@dropins/storefront-pdp/src/containers/ProductDescription/ProductDescription.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductDescriptionProps\n extends HTMLAttributes<HTMLDivElement> {}\n\nexport const ProductDescription: Container<\n ProductDescriptionProps,\n ProductModel | null\n> = ({ initialData = null, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n\n return () => {\n dataEvent?.off();\n };\n }, []);\n\n if (!data) return null;\n\n return (\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n {...props}\n className={classes(['pdp-description', props.className])}\n />\n );\n};\n\nProductDescription.getInitialData = getFetchedProductData;\n"],"names":["ProductDescription","initialData","children","props","data","setData","useState","useEffect","dataEvent","events","jsx","classes","getFetchedProductData"],"mappings":"iSAyBa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,SAAAC,EAAU,GAAGC,KAAY,CAClD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BL,CAAW,EAU7D,OARJM,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,CAAO,EAE/C,MAAO,IAAM,CACXG,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAEAJ,EAGHM,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQN,GAAA,YAAAA,EAAM,cAAe,EAAG,EAC1D,GAAGD,EACJ,UAAWQ,EAAQ,CAAC,kBAAmBR,EAAM,SAAS,CAAC,CAAA,CACzD,EARgB,IAUpB,EAEAH,EAAmB,eAAiBY"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container, SlotProps, SlotMethod, ResolveImageUrlOptions } from '
|
|
3
|
-
import { ButtonProps } from '
|
|
2
|
+
import { Container, SlotProps, SlotMethod, ResolveImageUrlOptions } from '@dropins/tools/types/elsie/src/lib';
|
|
3
|
+
import { ButtonProps } from '@dropins/tools/types/elsie/src/components';
|
|
4
4
|
import { ProductModel } from '../../data/models';
|
|
5
5
|
|
|
6
|
-
type IconType = keyof typeof import('@
|
|
6
|
+
type IconType = keyof typeof import('@dropins/tools/types/elsie/src/icons');
|
|
7
|
+
/** @deprecated This type is part of the deprecated ProductDetails component. */
|
|
7
8
|
export type Values = {
|
|
8
9
|
sku: string;
|
|
9
10
|
quantity: number;
|
|
10
11
|
optionsUIDs?: string[];
|
|
11
12
|
};
|
|
13
|
+
/** @deprecated This type is part of the deprecated ProductDetails component. */
|
|
12
14
|
type DefaultSlotContext = {
|
|
13
15
|
data: ProductModel | null;
|
|
14
16
|
values: Values;
|
|
15
17
|
valid: boolean;
|
|
16
18
|
};
|
|
19
|
+
/** @deprecated This type is part of the deprecated ProductDetails component. */
|
|
17
20
|
export type CarouselConfig = {
|
|
18
21
|
controls?: {
|
|
19
22
|
desktop?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;
|
|
@@ -30,9 +33,11 @@ export type CarouselConfig = {
|
|
|
30
33
|
imageParams?: ResolveImageUrlOptions;
|
|
31
34
|
thumbnailParams?: ResolveImageUrlOptions;
|
|
32
35
|
};
|
|
36
|
+
/** @deprecated This type is part of the deprecated ProductDetails component. */
|
|
33
37
|
export type OptionsConfig = {
|
|
34
38
|
anchorOptions?: string[];
|
|
35
39
|
};
|
|
40
|
+
/** @deprecated This interface is part of the deprecated ProductDetails component. */
|
|
36
41
|
export interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {
|
|
37
42
|
sku: string;
|
|
38
43
|
productData?: ProductModel;
|
|
@@ -78,6 +83,10 @@ export interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
78
83
|
closeButton?: boolean;
|
|
79
84
|
disableDropdownPreselection?: boolean;
|
|
80
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* @deprecated This container has been deprecated and will be removed in a future release.
|
|
88
|
+
* Please use the different composable containers to build your product details page.xs
|
|
89
|
+
*/
|
|
81
90
|
export declare const ProductDetails: Container<ProductDetailsProps, ProductModel | null>;
|
|
82
91
|
export {};
|
|
83
92
|
//# sourceMappingURL=ProductDetails.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as w,Fragment as Dt}from"@dropins/tools/preact-jsx-runtime.js";import{useState as R,Children as ut,useEffect as $,useCallback as tt,useMemo as wt}from"@dropins/tools/preact-compat.js";import{VComponent as u,classes as D,Slot as A,toLanguageTag as bt}from"@dropins/tools/lib.js";import{Incrementer as Ut,Image as At,Button as Pt,Icon as dt,Breadcrumbs as lt}from"@dropins/tools/components.js";/* empty css */import{Z as Vt,C as et,O as kt}from"../chunks/Zoom.js";import{useText as U}from"@dropins/tools/i18n.js";import{P as st}from"../chunks/PriceRange.js";import{S as Bt}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as Nt,n as yt,h as ht,p as xt,o as St,t as Lt}from"../chunks/isProductConfigurationValid.js";import{events as W}from"@dropins/tools/event-bus.js";import{i as qt,t as Mt}from"../chunks/date.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Rt=({title:o,breadcrumbs:S,galleryContent:y,infoContent:N,productContent:I,sku:O,outOfStock:V,shortDescription:x,description:r,attributes:nt,images:c,options:a,price:b,specialPrice:X,className:Q,children:it,quantity:Y,actions:L,carouselConfig:n,zoomType:f="overlay",closeButton:g=!0,...rt})=>{var P,j,Z,z,K,E,m,J,G;const pt=U("PDP.Product.RegularPrice.label").label,ct=U("PDP.Product.SpecialPrice.label").label,k=U("PDP.Product.OutOfStock.label").label,B=U("PDP.Product.Image.label").label,[F,C]=R(null),t=c!=null&&c.length?c.map((H,s)=>{var M;const q=((M=o==null?void 0:o.props)==null?void 0:M.children)&&(B==null?void 0:B.replace("{product}",o.props.children.toString()).replace("{key}",String(s+1)).replace("{total}",String(c.length)));return f==="zoom"?e(Vt,{closeButton:g,children:e(u,{node:H,loading:s===0?"eager":"lazy",alt:q},s)}):e(u,{node:H,loading:s===0?"eager":"lazy",alt:q,onClick:()=>C(s)},s)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),T=(P=n==null?void 0:n.thumbnails)!=null&&P.length?n.thumbnails.map((H,s)=>{var q;return e(u,{node:H,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((q=o==null?void 0:o.props)==null?void 0:q.children)&&(B==null?void 0:B.replace("{product}",o.props.children.toString()).replace("{key}",String(s+1)).replace("{total}",String(c.length)))},s)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return w("div",{...rt,className:D(["pdp-product",Q]),children:[S&&e(u,{node:S,className:"pdp-product__breadcrumbs"}),w("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[e("div",{className:"pdp-product__column-body",children:(j=n==null?void 0:n.controls)!=null&&j.desktop?e(et,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?n.controls.desktop:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((Z=n==null?void 0:n.thumbnails)==null?void 0:Z.length)>1&&((z=n==null?void 0:n.peak)==null?void 0:z.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:F||0,thumbnails:T,children:t}):e(Tt,{className:"pdp-product__images",gap:"small",children:t})}),y&&e(u,{node:y,className:"pdp-product__gallery-content"})]}),w("div",{className:"pdp-product__column-container pdp-product__content-column",children:[w("div",{className:"pdp-product__column-body",children:[w("div",{className:"pdp-product__header",children:[o&&e(u,{node:o,className:"pdp-product__title"}),O&&e(u,{node:O,className:"pdp-product__sku"})]}),w("div",{className:"pdp-product__prices",children:[X&&e(u,{node:X,className:D(["pdp-product__price-special","pdp-product__price"]),"aria-label":ct,role:"text"}),b&&e(u,{node:b,className:D(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":pt,role:"text"})]}),(K=n==null?void 0:n.controls)!=null&&K.mobile&&((E=n==null?void 0:n.controls)==null?void 0:E.mobile)==="thumbnailsRow"?e(et,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((m=n==null?void 0:n.thumbnails)==null?void 0:m.length)>1&&((J=n==null?void 0:n.peak)==null?void 0:J.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:T,children:t}):e(et,{className:"pdp-product__images pdp-product__images--carousel",peak:((G=n==null?void 0:n.peak)==null?void 0:G.mobile)&&(c==null?void 0:c.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,children:t}),w("div",{className:D(["pdp-product__actions",["pdp-product__actions--out-of-stock",V]]),children:[V&&e("div",{className:"pdp-product__out-of-stock__text",children:k}),a&&e(u,{node:a,className:D(["pdp-product__options"])}),Y&&e("div",{className:"pdp-product__quantity",children:e(u,{node:Y})}),L&&e(u,{node:L,className:D(["pdp-product__buttons"])})]}),x&&e(u,{node:x,className:D(["pdp-product__short_description"])}),r&&e(u,{node:r,className:D(["pdp-product__description"])}),nt?e("div",{className:"pdp-product__attributes",children:nt}):null]}),N&&e(u,{node:N,className:"pdp-product__info-content"})]}),I&&e(u,{node:I,className:"pdp-product__content"}),F===null?null:e(kt,{className:"pdp-product__overlay",onClose:()=>C(null),centered:!0,children:e(et,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,width:"100%",height:"100%",defaultIndex:F||0,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,isZoomed:!0,children:t})})]})},Tt=({children:o,gap:S=null,className:y,style:N,...I})=>{const O=ut.count(o);return e("div",{...I,className:D(["pdp-gallery-grid",y]),style:{"--gap":S?`var(--spacing-${S})`:"0px",...N},children:ut.map(o,(V,x)=>e("div",{className:"pdp-gallery-grid__item",children:e(u,{node:V,loading:x===0?"eager":"lazy"},V.props.src)},O+x))})},jt=({sku:o,hideSku:S,hideQuantity:y,hideShortDescription:N,hideDescription:I,hideAttributes:O,hideURLParams:V,hideSelectedOptionValue:x,slots:r,children:nt,initialData:c,carousel:a,optionsConfig:b,useACDL:X,onAddToCart:Q,zoomType:it,closeButton:Y=!0,disableDropdownPreselection:L,...n})=>{var at,ot,mt,_t;const f=U("PDP.Product.AddToCart.label").label,g=U("PDP.Product.UpdateInCart.label").label,rt=U("PDP.Product.Incrementer.label").label,pt=U("PDP.Product.Details.label").label,ct=U("PDP.Swatches.ChooseOption.label").label,[k,B]=R(Nt.getConfig().defaultLocale||"en-US"),[F,C]=R(),[t=null,T]=R(c),[P,j]=R(()=>{const p=yt()||{};let d=1;const l=p.quantity;if(l){const i=parseInt(l,10);!isNaN(i)&&Number.isInteger(i)&&i>0&&(d=i)}const h={sku:o,quantity:d};return t!=null&&t.optionUIDs&&(h.optionsUIDs=t.optionUIDs),h}),[Z,z]=R(()=>{var p,d;return!(t!=null&&t.options&&((p=t==null?void 0:t.options)==null?void 0:p.length)>0&&((d=t==null?void 0:t.optionUIDs)==null?void 0:d.length)!==(t==null?void 0:t.options.length))}),[K,E]=R(!1),m={data:t,values:P,valid:Z};function J(p){return p==null?void 0:p.some(d=>(d==null?void 0:d.typename)==="ProductViewOptionValueProduct")}$(()=>{const p=W.on("pdp/data",l=>{l&&(T(l),j(h=>({...h,sku:l.sku,optionsUIDs:l.optionUIDs})))}),d=W.on("pdp/setValues",l=>{j(h=>({...h,...l}))});return()=>{d==null||d.off(),p==null||p.off()}},[]),$(()=>{const d=(yt()||{}).itemUid;if(!d){E(!1);return}const l=W.on("cart/data",h=>{const i=h==null?void 0:h.items;if(i&&Array.isArray(i)){const _=i.some(v=>v.uid===d);E(_)}else E(!1)});return()=>{l==null||l.off()}},[]),$(()=>{const p=W.on("locale",d=>{d!==k&&(B(d),ht(o,{preselectFirstOption:!L,anchors:b==null?void 0:b.anchorOptions}).then(T))});return()=>{p==null||p.off()}},[L,k,b==null?void 0:b.anchorOptions,o]),$(()=>{X&&c&&Object.keys(c).length>0&&xt(c)},[c]);const G=tt(p=>{j(d=>({...d,...p}))},[]);$(()=>{W.emit("pdp/values",P)},[JSON.stringify(P)]);const H=tt(async p=>{var h,i;let d=Object.entries(p).filter(([_,v])=>v.label!==ct).map(([_,v])=>p[_].value).filter(_=>_!==void 0);!V&&(t!=null&&t.options)&&!J(t.options)&&St({optionsUIDs:d.join(",")}),G({optionsUIDs:d}),z((d==null?void 0:d.length)===((h=t==null?void 0:t.options)==null?void 0:h.length));const l=await ht(o,{anchors:b==null?void 0:b.anchorOptions,isBundle:t==null?void 0:t.isBundle,optionsUIDs:d,preselectFirstOption:!L});T(l),(i=b==null?void 0:b.anchorOptions)!=null&&i.length&&s(l,d)},[o]),s=tt((p,d)=>{var i;const l=(p==null?void 0:p.optionUIDs)??[];d.every(_=>l.includes(_))||(C(p==null?void 0:p.options),G({optionsUIDs:l}),z((l==null?void 0:l.length)===((i=p==null?void 0:p.options)==null?void 0:i.length)))},[o]),q=tt(p=>{Object.keys(p).length!==0&&z(!1)},[]),M=wt(()=>{var p;return(p=t==null?void 0:t.attributes)==null?void 0:p.map(({label:d,value:l},h)=>{const i=qt(l)?Mt(l,k):l.toString();return w("li",{children:[d,": ",e("span",{dangerouslySetInnerHTML:{__html:i}})]},h)})},[t==null?void 0:t.attributes,k]),It=!y&&(t!=null&&t.inStock)?e(A,{name:"Quantity",slot:r==null?void 0:r.Quantity,context:{...m},children:e(Ut,{name:"quantity",defaultValue:P.quantity.toString(),value:P.quantity.toString(),min:1,"aria-label":rt,className:"pdp-product__quantity",onValue:p=>{const d=Number(p);G({quantity:d}),!V&&(t!=null&&t.options)&&(J(t.options)||St({quantity:d}))}},"quantity")}):void 0,Ot=()=>{if(t!=null&&t.options)return e(A,{name:"Options",slot:r==null?void 0:r.Options,context:{...m},children:e(Bt,{selectedUIDs:P.optionsUIDs,options:t.options,defaultOptions:P.optionsUIDs,selectionsToUpdate:F,hideSelectedValue:x,disablePreselections:L,onValues:H,onErrors:q})})};return e("div",{...n,children:e(Rt,{title:e(A,{name:"Title",slot:r==null?void 0:r.Title,context:{...m},children:t==null?void 0:t.name}),sku:S?void 0:e(A,{name:"SKU",slot:r==null?void 0:r.SKU,context:{...m},children:t==null?void 0:t.sku}),options:Ot(),breadcrumbs:(r==null?void 0:r.Breadcrumbs)&&e(A,{name:"Breadcrumbs",slot:r==null?void 0:r.Breadcrumbs,context:{...m,setSeparator(p){this._registerMethod((...d)=>{const l=p(...d),h=l&&e(dt,{source:l});this._setProps(i=>({...i,separator:h,children:[e(lt,{separator:h,categories:i.categories})]}))})},appendLink(p){this._registerMethod((...d)=>{const{text:l,...h}=p(...d),i=e("a",{...h,children:l});this._setProps(_=>{const v=[..._.categories||[],i];return{..._,categories:v,children:[e(lt,{separator:_.separator,categories:v})]}})})},appendHTMLElement(p){this._registerMethod((...d)=>{const l=p(...d),h=this._htmlElementToVNode(l);this._setProps(i=>{const _=[...i.categories||[],h];return{...i,categories:_,children:[e(lt,{separator:i.separator,categories:_})]}})})}}}),quantity:It,actions:e(A,{name:"Actions",slot:r==null?void 0:r.Actions,context:{...m,appendButton(p){this._registerMethod((...d)=>{const l=p(...d);if(!l)return;const{text:h,icon:i,..._}=l,v=e(Pt,{type:"button",..._,icon:i&&e(dt,{source:i}),children:h});this._setProps(vt=>({children:[...vt.children||[],v]}))})}},children:!(r!=null&&r.Actions)&&e(Pt,{size:"medium",type:"submit",icon:e(dt,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!Z,"aria-label":K?g:f,onClick:()=>Q==null?void 0:Q(P),children:K?g:f})}),shortDescription:N?void 0:e(A,{name:"ShortDescription",slot:r==null?void 0:r.ShortDescription,context:{...m},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:I?void 0:e(A,{name:"Description",slot:r==null?void 0:r.Description,context:{...m},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((at=t==null?void 0:t.images)==null?void 0:at.map(({label:p,url:d})=>{var l,h;return e(At,{title:p,alt:p,src:d,width:((l=a==null?void 0:a.imageParams)==null?void 0:l.width)??960,height:((h=a==null?void 0:a.imageParams)==null?void 0:h.height)??1191,params:(a==null?void 0:a.imageParams)??{width:960}},d)}))??[],specialPrice:(ot=t==null?void 0:t.prices)!=null&&ot.visible?e(A,{name:"SpecialPrice",slot:r==null?void 0:r.SpecialPrice,context:{...m},children:e(st,{...t.prices.final,locale:bt(k)})}):void 0,price:(mt=t==null?void 0:t.prices)!=null&&mt.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?e(A,{name:"RegularPrice",slot:r==null?void 0:r.RegularPrice,context:{...m},children:e(st,{...t.prices.regular,locale:bt(k)})}):void 0,zoomType:it,closeButton:Y,carouselConfig:{...a,thumbnails:a&&Object.keys(a).length?((_t=t==null?void 0:t.images)==null?void 0:_t.map(({label:p,url:d})=>{var l,h;return e(At,{title:p,alt:p,src:d,width:((l=a==null?void 0:a.thumbnailParams)==null?void 0:l.width)??200,height:((h=a==null?void 0:a.thumbnailParams)==null?void 0:h.height)??248,params:(a==null?void 0:a.thumbnailParams)??{width:200}},d)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:O?void 0:e(A,{name:"Attributes",slot:r==null?void 0:r.Attributes,context:{...m},children:M!=null&&M.length?w(Dt,{children:[pt,e("ul",{children:M})]}):null}),galleryContent:(r==null?void 0:r.GalleryContent)&&e(A,{name:"GalleryContent",slot:r.GalleryContent,context:{...m}}),infoContent:(r==null?void 0:r.InfoContent)&&e(A,{name:"InfoContent",slot:r.InfoContent,context:{...m}}),productContent:(r==null?void 0:r.Content)&&e(A,{name:"Content",slot:r.Content,context:{...m}})})})};jt.getInitialData=async function({sku:o,disableDropdownPreselection:S=!1,optionsConfig:y}){var I,O;const N=(O=(I=Nt.getConfig().models)==null?void 0:I.ProductDetails)==null?void 0:O.initialData;return N?Lt(N):ht(o,{preselectFirstOption:!S,anchors:y==null?void 0:y.anchorOptions})};export{jt as ProductDetails,jt as default};
|
|
3
|
+
import{jsx as e,jsxs as V,Fragment as vt}from"@dropins/tools/preact-jsx-runtime.js";import{useState as z,Children as mt,useEffect as f,useCallback as g,useMemo as Ot}from"@dropins/tools/preact-compat.js";import{VComponent as m,classes as w,Slot as A,toLanguageTag as ut}from"@dropins/tools/lib.js";import{Incrementer as It,Image as bt,Button as At,Icon as dt,Breadcrumbs as lt}from"@dropins/tools/components.js";/* empty css */import{Z as Dt,C,O as st}from"../chunks/Zoom.js";import{useText as x}from"@dropins/tools/i18n.js";import{P as Pt}from"../chunks/PriceRange.js";import{S as wt}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as St,n as Vt,h as ht,p as kt,o as yt,t as Ut}from"../chunks/isProductConfigurationValid.js";import{events as tt}from"@dropins/tools/event-bus.js";import{i as Bt,t as xt}from"../chunks/date.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Lt=({title:a,breadcrumbs:N,galleryContent:S,infoContent:v,productContent:O,sku:I,outOfStock:k,shortDescription:L,description:r,attributes:et,images:c,options:h,price:u,specialPrice:K,className:G,children:it,quantity:J,actions:M,carouselConfig:n,zoomType:$="overlay",closeButton:nt=!0,...rt})=>{var T,Q,E,_,F,j,W,X,Y;const pt=x("PDP.Product.RegularPrice.label").label,U=x("PDP.Product.SpecialPrice.label").label,ct=x("PDP.Product.OutOfStock.label").label,B=x("PDP.Product.Image.label").label,[H,t]=z(null),D=c!=null&&c.length?c.map((s,y)=>{var Z;const q=((Z=a==null?void 0:a.props)==null?void 0:Z.children)&&(B==null?void 0:B.replace("{product}",a.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)));return $==="zoom"?e(Dt,{closeButton:nt,children:e(m,{node:s,loading:y===0?"eager":"lazy",alt:q},y)}):e(m,{node:s,loading:y===0?"eager":"lazy",alt:q,onClick:()=>t(y)},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),P=(T=n==null?void 0:n.thumbnails)!=null&&T.length?n.thumbnails.map((s,y)=>{var q;return e(m,{node:s,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((q=a==null?void 0:a.props)==null?void 0:q.children)&&(B==null?void 0:B.replace("{product}",a.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)))},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return V("div",{...rt,className:w(["pdp-product",G]),children:[N&&e(m,{node:N,className:"pdp-product__breadcrumbs"}),V("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[e("div",{className:"pdp-product__column-body",children:(Q=n==null?void 0:n.controls)!=null&&Q.desktop?e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?n.controls.desktop:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((E=n==null?void 0:n.thumbnails)==null?void 0:E.length)>1&&((_=n==null?void 0:n.peak)==null?void 0:_.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:H||0,thumbnails:P,children:D}):e(Mt,{className:"pdp-product__images",gap:"small",children:D})}),S&&e(m,{node:S,className:"pdp-product__gallery-content"})]}),V("div",{className:"pdp-product__column-container pdp-product__content-column",children:[V("div",{className:"pdp-product__column-body",children:[V("div",{className:"pdp-product__header",children:[a&&e(m,{node:a,className:"pdp-product__title"}),I&&e(m,{node:I,className:"pdp-product__sku"})]}),V("div",{className:"pdp-product__prices",children:[K&&e(m,{node:K,className:w(["pdp-product__price-special","pdp-product__price"]),"aria-label":U,role:"text"}),u&&e(m,{node:u,className:w(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":pt,role:"text"})]}),(F=n==null?void 0:n.controls)!=null&&F.mobile&&((j=n==null?void 0:n.controls)==null?void 0:j.mobile)==="thumbnailsRow"?e(C,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((W=n==null?void 0:n.thumbnails)==null?void 0:W.length)>1&&((X=n==null?void 0:n.peak)==null?void 0:X.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:P,children:D}):e(C,{className:"pdp-product__images pdp-product__images--carousel",peak:((Y=n==null?void 0:n.peak)==null?void 0:Y.mobile)&&(c==null?void 0:c.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,children:D}),V("div",{className:w(["pdp-product__actions",["pdp-product__actions--out-of-stock",k]]),children:[k&&e("div",{className:"pdp-product__out-of-stock__text",children:ct}),h&&e(m,{node:h,className:w(["pdp-product__options"])}),J&&e("div",{className:"pdp-product__quantity",children:e(m,{node:J})}),M&&e(m,{node:M,className:w(["pdp-product__buttons"])})]}),L&&e(m,{node:L,className:w(["pdp-product__short_description"])}),r&&e(m,{node:r,className:w(["pdp-product__description"])}),et?e("div",{className:"pdp-product__attributes",children:et}):null]}),v&&e(m,{node:v,className:"pdp-product__info-content"})]}),O&&e(m,{node:O,className:"pdp-product__content"}),H===null?null:e(st,{className:"pdp-product__overlay",onClose:()=>t(null),centered:!0,children:e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,width:"100%",height:"100%",defaultIndex:H||0,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,isZoomed:!0,children:D})})]})},Mt=({children:a,gap:N=null,className:S,style:v,...O})=>{const I=mt.count(a);return e("div",{...O,className:w(["pdp-gallery-grid",S]),style:{"--gap":N?`var(--spacing-${N})`:"0px",...v},children:mt.map(a,(k,L)=>e("div",{className:"pdp-gallery-grid__item",children:e(m,{node:k,loading:L===0?"eager":"lazy"},k.props.src)},I+L))})},qt=({sku:a,hideSku:N,hideQuantity:S,hideShortDescription:v,hideDescription:O,hideAttributes:I,hideURLParams:k,hideSelectedOptionValue:L,slots:r,children:et,initialData:c,carousel:h,optionsConfig:u,useACDL:K,onAddToCart:G,zoomType:it,closeButton:J=!0,disableDropdownPreselection:M,...n})=>{var Z,at,ot,_t;const $=x("PDP.Product.AddToCart.label").label,nt=x("PDP.Product.Incrementer.label").label,rt=x("PDP.Product.Details.label").label,pt=x("PDP.Swatches.ChooseOption.label").label,[U,ct]=z(St.getConfig().defaultLocale||"en-US"),[B,H]=z(),[t=null,D]=z(c),[P,T]=z(()=>{const p=Vt(1),d={sku:a,quantity:p};return t!=null&&t.optionUIDs&&(d.optionsUIDs=t.optionUIDs),d}),[Q,E]=z(()=>{var p,d;return!(t!=null&&t.options&&((p=t==null?void 0:t.options)==null?void 0:p.length)>0&&((d=t==null?void 0:t.optionUIDs)==null?void 0:d.length)!==(t==null?void 0:t.options.length))}),_={data:t,values:P,valid:Q};function F(p){return p==null?void 0:p.some(d=>(d==null?void 0:d.typename)==="ProductViewOptionValueProduct")}f(()=>{const p=tt.on("pdp/data",l=>{l&&(D(l),T(i=>({...i,sku:l.sku,optionsUIDs:l.optionUIDs})))}),d=tt.on("pdp/setValues",l=>{T(i=>({...i,...l}))});return()=>{d==null||d.off(),p==null||p.off()}},[]),f(()=>{const p=tt.on("locale",d=>{d!==U&&(ct(d),ht(a,{preselectFirstOption:!M,anchors:u==null?void 0:u.anchorOptions}).then(D))});return()=>{p==null||p.off()}},[M,U,u==null?void 0:u.anchorOptions,a]),f(()=>{K&&c&&Object.keys(c).length>0&&kt(c)},[c]);const j=g(p=>{T(d=>({...d,...p}))},[]);f(()=>{tt.emit("pdp/values",P)},[JSON.stringify(P)]);const W=g(async p=>{var i,o;let d=Object.entries(p).filter(([b,R])=>R.label!==pt).map(([b,R])=>p[b].value).filter(b=>b!==void 0);!k&&(t!=null&&t.options)&&!F(t.options)&&yt({optionsUIDs:d.join(",")}),j({optionsUIDs:d}),E((d==null?void 0:d.length)===((i=t==null?void 0:t.options)==null?void 0:i.length));const l=await ht(a,{anchors:u==null?void 0:u.anchorOptions,isBundle:t==null?void 0:t.isBundle,optionsUIDs:d,preselectFirstOption:!M});D(l),(o=u==null?void 0:u.anchorOptions)!=null&&o.length&&X(l,d)},[a]),X=g((p,d)=>{var o;const l=(p==null?void 0:p.optionUIDs)??[];d.every(b=>l.includes(b))||(H(p==null?void 0:p.options),j({optionsUIDs:l}),E((l==null?void 0:l.length)===((o=p==null?void 0:p.options)==null?void 0:o.length)))},[a]),Y=g(p=>{Object.keys(p).length!==0&&E(!1)},[]),s=Ot(()=>{var p;return(p=t==null?void 0:t.attributes)==null?void 0:p.map(({label:d,value:l},i)=>{const o=Bt(l)?xt(l,U):l.toString();return V("li",{children:[d,": ",e("span",{dangerouslySetInnerHTML:{__html:o}})]},i)})},[t==null?void 0:t.attributes,U]),y=!S&&(t!=null&&t.inStock)?e(A,{name:"Quantity",slot:r==null?void 0:r.Quantity,context:{..._},children:e(It,{name:"quantity",defaultValue:P.quantity.toString(),value:P.quantity.toString(),min:1,"aria-label":nt,className:"pdp-product__quantity",onValue:p=>{const d=Number(p);j({quantity:d}),!k&&(t!=null&&t.options)&&(F(t.options)||yt({quantity:d}))}},"quantity")}):void 0,q=()=>{if(t!=null&&t.options)return e(A,{name:"Options",slot:r==null?void 0:r.Options,context:{..._},children:e(wt,{selectedUIDs:P.optionsUIDs,options:t.options,defaultOptions:P.optionsUIDs,selectionsToUpdate:B,hideSelectedValue:L,disablePreselections:M,onValues:W,onErrors:Y})})};return e("div",{...n,children:e(Lt,{title:e(A,{name:"Title",slot:r==null?void 0:r.Title,context:{..._},children:t==null?void 0:t.name}),sku:N?void 0:e(A,{name:"SKU",slot:r==null?void 0:r.SKU,context:{..._},children:t==null?void 0:t.sku}),options:q(),breadcrumbs:(r==null?void 0:r.Breadcrumbs)&&e(A,{name:"Breadcrumbs",slot:r==null?void 0:r.Breadcrumbs,context:{..._,setSeparator(p){this._registerMethod((...d)=>{const l=p(...d),i=l&&e(dt,{source:l});this._setProps(o=>({...o,separator:i,children:[e(lt,{separator:i,categories:o.categories})]}))})},appendLink(p){this._registerMethod((...d)=>{const{text:l,...i}=p(...d),o=e("a",{...i,children:l});this._setProps(b=>{const R=[...b.categories||[],o];return{...b,categories:R,children:[e(lt,{separator:b.separator,categories:R})]}})})},appendHTMLElement(p){this._registerMethod((...d)=>{const l=p(...d),i=this._htmlElementToVNode(l);this._setProps(o=>{const b=[...o.categories||[],i];return{...o,categories:b,children:[e(lt,{separator:o.separator,categories:b})]}})})}}}),quantity:y,actions:e(A,{name:"Actions",slot:r==null?void 0:r.Actions,context:{..._,appendButton(p){this._registerMethod((...d)=>{const l=p(...d);if(!l)return;const{text:i,icon:o,...b}=l,R=e(At,{type:"button",...b,icon:o&&e(dt,{source:o}),children:i});this._setProps(Nt=>({children:[...Nt.children||[],R]}))})}},children:!(r!=null&&r.Actions)&&e(At,{size:"medium",type:"submit",icon:e(dt,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!Q,"aria-label":$,onClick:()=>G==null?void 0:G(P),children:$})}),shortDescription:v?void 0:e(A,{name:"ShortDescription",slot:r==null?void 0:r.ShortDescription,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:O?void 0:e(A,{name:"Description",slot:r==null?void 0:r.Description,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((Z=t==null?void 0:t.images)==null?void 0:Z.map(({label:p,url:d})=>{var l,i;return e(bt,{title:p,alt:p,src:d,width:((l=h==null?void 0:h.imageParams)==null?void 0:l.width)??960,height:((i=h==null?void 0:h.imageParams)==null?void 0:i.height)??1191,params:(h==null?void 0:h.imageParams)??{width:960}},d)}))??[],specialPrice:(at=t==null?void 0:t.prices)!=null&&at.visible?e(A,{name:"SpecialPrice",slot:r==null?void 0:r.SpecialPrice,context:{..._},children:e(Pt,{...t.prices.final,locale:ut(U)})}):void 0,price:(ot=t==null?void 0:t.prices)!=null&&ot.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?e(A,{name:"RegularPrice",slot:r==null?void 0:r.RegularPrice,context:{..._},children:e(Pt,{...t.prices.regular,locale:ut(U)})}):void 0,zoomType:it,closeButton:J,carouselConfig:{...h,thumbnails:h&&Object.keys(h).length?((_t=t==null?void 0:t.images)==null?void 0:_t.map(({label:p,url:d})=>{var l,i;return e(bt,{title:p,alt:p,src:d,width:((l=h==null?void 0:h.thumbnailParams)==null?void 0:l.width)??200,height:((i=h==null?void 0:h.thumbnailParams)==null?void 0:i.height)??248,params:(h==null?void 0:h.thumbnailParams)??{width:200}},d)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:I?void 0:e(A,{name:"Attributes",slot:r==null?void 0:r.Attributes,context:{..._},children:s!=null&&s.length?V(vt,{children:[rt,e("ul",{children:s})]}):null}),galleryContent:(r==null?void 0:r.GalleryContent)&&e(A,{name:"GalleryContent",slot:r.GalleryContent,context:{..._}}),infoContent:(r==null?void 0:r.InfoContent)&&e(A,{name:"InfoContent",slot:r.InfoContent,context:{..._}}),productContent:(r==null?void 0:r.Content)&&e(A,{name:"Content",slot:r.Content,context:{..._}})})})};qt.getInitialData=async function({sku:a,disableDropdownPreselection:N=!1,optionsConfig:S}){var O,I;const v=(I=(O=St.getConfig().models)==null?void 0:O.ProductDetails)==null?void 0:I.initialData;return v?Ut(v):ht(a,{preselectFirstOption:!N,anchors:S==null?void 0:S.anchorOptions})};export{qt as ProductDetails,qt as default};
|
|
4
|
+
//# sourceMappingURL=ProductDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductDetails.js","sources":["/@dropins/storefront-pdp/src/components/Product/Product.tsx","/@dropins/storefront-pdp/src/components/GalleryGrid/GalleryGrid.tsx","/@dropins/storefront-pdp/src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nimport { Carousel, GalleryGrid, Overlay, Zoom } from '@/pdp/components';\nimport '@/pdp/components/Product/Product.css';\n\nimport { CarouselConfig } from '@/pdp/containers';\n\ninterface ProductCarouselConfig extends CarouselConfig {\n thumbnails: VNode[];\n}\n\nexport interface ProductProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: VNode;\n breadcrumbs?: VNode;\n galleryContent?: VNode;\n infoContent?: VNode;\n productContent?: VNode;\n shortDescription?: VNode;\n description?: VNode;\n attributes?: VNode;\n images: VNode[];\n options?: VNode;\n sku?: VNode;\n price?: VNode;\n specialPrice?: VNode;\n outOfStock: boolean;\n actions?: VNode;\n quantity?: VNode;\n carouselConfig?: ProductCarouselConfig;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n}\n\nexport const Product: FunctionComponent<ProductProps> = ({\n title,\n breadcrumbs,\n galleryContent,\n infoContent,\n productContent,\n sku,\n outOfStock,\n shortDescription,\n description,\n attributes,\n images,\n options,\n price,\n specialPrice,\n className,\n children,\n quantity,\n actions,\n carouselConfig,\n zoomType = 'overlay',\n closeButton = true,\n ...props\n}) => {\n // i18n\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.label').label;\n const OutOfStockLabel = useText('PDP.Product.OutOfStock.label').label;\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [zoom, setZoom] = useState<number | null>(null);\n\n const galleryImages = images?.length ? (\n images.map((image, key) => {\n const alt =\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length));\n return zoomType === 'zoom' ? (\n <Zoom closeButton={closeButton}>\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={alt}\n />\n </Zoom>\n ) : (\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={alt}\n onClick={() => setZoom(key)}\n />\n );\n })\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n const localThumbnailsImages = carouselConfig?.thumbnails?.length ? (\n carouselConfig.thumbnails.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={carouselConfig?.thumbnailsLoadingMode || 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))\n }\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n return (\n <div {...props} className={classes(['pdp-product', className])}>\n {breadcrumbs && (\n <VComponent node={breadcrumbs} className=\"pdp-product__breadcrumbs\" />\n )}\n <div className=\"pdp-product__column-container pdp-product__gallery-column\">\n <div className=\"pdp-product__column-body\">\n {carouselConfig?.controls?.desktop ? (\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n controls={\n images?.length > 1 ? carouselConfig.controls.desktop : 'dots'\n }\n arrowsOnMainImage={carouselConfig?.arrowsOnMainImage}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={\n (carouselConfig?.thumbnails?.length > 1 &&\n carouselConfig?.peak?.desktop) ||\n false\n }\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n ) : (\n <GalleryGrid className=\"pdp-product__images\" gap=\"small\">\n {galleryImages}\n </GalleryGrid>\n )}\n </div>\n {galleryContent && (\n <VComponent\n node={galleryContent}\n className=\"pdp-product__gallery-content\"\n />\n )}\n </div>\n\n <div className=\"pdp-product__column-container pdp-product__content-column\">\n <div className=\"pdp-product__column-body\">\n <div className=\"pdp-product__header\">\n {title && (\n <VComponent node={title} className=\"pdp-product__title\" />\n )}\n\n {sku && <VComponent node={sku} className=\"pdp-product__sku\" />}\n </div>\n\n <div className=\"pdp-product__prices\">\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes([\n 'pdp-product__price-special',\n 'pdp-product__price',\n ])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes([\n 'pdp-product__price-regular',\n 'pdp-product__price--grey',\n ])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n </div>\n\n {/* Small Screen Gallery */}\n {carouselConfig?.controls?.mobile &&\n carouselConfig?.controls?.mobile === 'thumbnailsRow' ? (\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails\"\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'thumbnailsRow' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={\n (carouselConfig?.thumbnails?.length > 1 &&\n carouselConfig?.peak?.mobile) ||\n false\n }\n gap={carouselConfig?.gap || null}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n ) : (\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel\"\n peak={carouselConfig?.peak?.mobile && images?.length > 1}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n >\n {galleryImages}\n </Carousel>\n )}\n\n <div\n className={classes([\n 'pdp-product__actions',\n [`pdp-product__actions--out-of-stock`, outOfStock],\n ])}\n >\n {outOfStock && (\n <div className=\"pdp-product__out-of-stock__text\">\n {OutOfStockLabel}\n </div>\n )}\n\n {options && (\n <VComponent\n node={options}\n className={classes(['pdp-product__options'])}\n />\n )}\n\n {quantity && (\n <div className=\"pdp-product__quantity\">\n <VComponent node={quantity} />\n </div>\n )}\n\n {actions && (\n <VComponent\n node={actions}\n className={classes(['pdp-product__buttons'])}\n />\n )}\n </div>\n\n {shortDescription && (\n <VComponent\n node={shortDescription}\n className={classes(['pdp-product__short_description'])}\n />\n )}\n\n {description && (\n <VComponent\n node={description}\n className={classes(['pdp-product__description'])}\n />\n )}\n\n {attributes ? (\n <div className=\"pdp-product__attributes\">{attributes}</div>\n ) : null}\n </div>\n {infoContent && (\n <VComponent\n node={infoContent}\n className=\"pdp-product__info-content\"\n />\n )}\n </div>\n\n {productContent && (\n <VComponent node={productContent} className=\"pdp-product__content\" />\n )}\n\n {/* Zoom Overlay */}\n {zoom === null ? null : (\n <Overlay\n className=\"pdp-product__overlay\"\n onClose={() => setZoom(null)}\n centered\n >\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n loop={carouselConfig?.loopable && images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n isZoomed\n >\n {galleryImages}\n </Carousel>\n </Overlay>\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 { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, Children } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/pdp/components/GalleryGrid/GalleryGrid.css';\n\nexport interface GalleryGridProps extends HTMLAttributes<HTMLDivElement> {\n children: VNode[] | VNode;\n gap?: 'small' | 'medium' | 'large' | null;\n style?: Record<string, string | number>;\n}\n\nexport const GalleryGrid: FunctionComponent<GalleryGridProps> = ({\n children,\n gap = null,\n className,\n style,\n ...props\n}) => {\n const count = Children.count(children);\n\n return (\n <div\n {...props}\n className={classes(['pdp-gallery-grid', className])}\n style={{\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n ...style,\n }}\n >\n {Children.map(\n children,\n (child: VNode<HTMLAttributes<HTMLElement>>, key) => (\n <div key={count + key} className=\"pdp-gallery-grid__item\">\n <VComponent\n key={child.props.src}\n node={child}\n loading={key === 0 ? 'eager' : 'lazy'}\n />\n </div>\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 {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe-commerce/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe-commerce/elsie/components';\nimport { Product, Swatches, PriceRange, Option } from '@/pdp/components';\nimport { config, fetchProductData } from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Lang, useText } from '@adobe-commerce/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel, Option as ProductOption } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype IconType = keyof typeof import('@adobe-commerce/elsie/icons');\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type CarouselConfig = {\n controls?: {\n desktop?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n mobile?: 'dots' | 'thumbnailsRow' | null;\n };\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n desktop: boolean;\n mobile: boolean;\n };\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\n/** @deprecated This interface is part of the deprecated ProductDetails component. */\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<\n DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }\n >;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<\n DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }\n >;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n useACDL?: boolean;\n onAddToCart?: (values: Values) => void;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n disableDropdownPreselection?: boolean;\n}\n\n/**\n * @deprecated This container has been deprecated and will be removed in a future release.\n * Please use the different composable containers to build your product details page.xs\n */\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n useACDL,\n onAddToCart,\n zoomType,\n closeButton = true,\n disableDropdownPreselection,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(\n (config.getConfig().defaultLocale as Lang) || 'en-US'\n );\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1\n\n const defaultValues: Values = {\n sku,\n quantity: initialQuantity,\n };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n return !(\n data?.options &&\n data?.options?.length > 0 &&\n data?.optionUIDs?.length !== data?.options.length\n );\n });\n\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n function hasProductViewOptionValueProduct(options: ProductOption[]) {\n return options?.some(\n (option) => option?.typename === 'ProductViewOptionValueProduct'\n );\n }\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', (payload) => {\n if (payload) {\n setData(payload);\n // Preserve the current quantity value when updating from pdp/data event\n setValues((prev: Values) => ({\n ...prev,\n sku: payload.sku,\n optionsUIDs: payload.optionUIDs,\n }));\n }\n });\n\n // @ts-ignore - Type error with event bus events\n const updateDataEvent = events.on(\n 'pdp/setValues',\n (payload: Partial<Values>) => {\n setValues((prev: Values) => ({ ...prev, ...payload }));\n }\n );\n\n return () => {\n updateDataEvent?.off();\n dataEvent?.off();\n };\n }, []);\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n }).then(setData);\n });\n return () => {\n localeEvent?.off();\n };\n }, [disableDropdownPreselection, locale, optionsConfig?.anchorOptions, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback((newValues: Partial<Values>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n useEffect(() => {\n events.emit('pdp/values', values);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(values)]);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n // options Selected\n let optionsUIDs = Object.entries(selections)\n .filter(([_, value]) => value.label !== ChooseOptionLabel) // eslint-disable-line no-unused-vars\n .map(([id, _]) => selections[id].value) // eslint-disable-line no-unused-vars\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 hideURLParams is not set to true and the product is not a bundle type\n if (\n !hideURLParams &&\n data?.options &&\n !hasProductViewOptionValueProduct(data.options)\n ) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n handleOnValues({ optionsUIDs });\n setValid(optionsUIDs?.length === data?.options?.length);\n\n // get refined product data and update state\n const next = await fetchProductData(sku, {\n anchors: optionsConfig?.anchorOptions,\n isBundle: data?.isBundle,\n optionsUIDs,\n preselectFirstOption: !disableDropdownPreselection,\n });\n\n setData(next);\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const processUpdates = useCallback(\n (next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n handleOnValues({ optionsUIDs: updatedOptionsUIDs });\n setValid(updatedOptionsUIDs?.length === next?.options?.length);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value }, key: number) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n value={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n const quantityValue = Number(quantity);\n handleOnValues({ quantity: quantityValue });\n\n // Add quantity to URL parameters if not set to hide\n if (!hideURLParams && data?.options) {\n // Only update URL if the product is not a bundle type\n if (!hasProductViewOptionValueProduct(data.options)) {\n setUrlParams({ quantity: quantityValue });\n }\n }\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot\n name=\"Options\"\n slot={slots?.Options}\n context={{ ...defaultSlotContext }}\n >\n <Swatches\n selectedUIDs={values.optionsUIDs}\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n disablePreselections={disableDropdownPreselection}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n />\n </Slot>\n );\n }\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && (\n <Icon source={nextSeparator} />\n );\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n separator,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={separator}\n categories={prev.categories}\n />,\n ],\n };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), link];\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), vnode];\n\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: data?.shortDescription ?? '',\n }}\n />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.final}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data.prices.regular &&\n data.prices.final.amount !== data?.prices.regular.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n zoomType={zoomType}\n closeButton={closeButton}\n carouselConfig={{\n ...carousel,\n thumbnails:\n carousel && Object.keys(carousel).length\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\n/** @deprecated This method is part of the deprecated ProductDetails component. */\nProductDetails.getInitialData = async function ({\n sku,\n disableDropdownPreselection = false,\n optionsConfig,\n}) {\n const initialData = config.getConfig().models?.ProductDetails?.initialData;\n\n return initialData\n ? transformProductData(initialData)\n : fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n });\n};\n"],"names":["Product","title","breadcrumbs","galleryContent","infoContent","productContent","sku","outOfStock","shortDescription","description","attributes","images","options","price","specialPrice","className","children","quantity","actions","carouselConfig","zoomType","closeButton","props","RegularPriceLabel","useText","SpecialPriceLabel","OutOfStockLabel","ImagesLabel","zoom","setZoom","useState","galleryImages","image","key","alt","_a","jsx","Zoom","VComponent","localThumbnailsImages","jsxs","classes","_b","Carousel","_c","_d","GalleryGrid","_e","_f","_g","_h","_i","Overlay","gap","style","count","Children","child","ProductDetails","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","initialData","carousel","optionsConfig","useACDL","onAddToCart","disableDropdownPreselection","AddToCartLabel","IncrementerLabel","DetailsLabel","ChooseOptionLabel","locale","setLocale","config","selectionsToUpdate","setSelectionsToUpdate","data","setData","values","setValues","initialQuantity","getValidatedQuantityFromUrl","defaultValues","valid","setValid","defaultSlotContext","hasProductViewOptionValueProduct","option","useEffect","dataEvent","events","payload","prev","updateDataEvent","localeEvent","fetchProductData","publishProductPageViewEvent","handleOnValues","useCallback","newValues","handleOptionSelected","selections","optionsUIDs","_","value","id","element","setUrlParams","next","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","item","handleOnErrors","_errors","useMemo","label","__html","isDateValid","toDateString","Slot","Incrementer","quantityValue","renderOptions","Swatches","callback","attrs","nextSeparator","separator","Icon","Breadcrumbs","text","p","link","categories","domElement","vnode","_button","icon","buttonProps","button","Button","url","Image","PriceRange","toLanguageTag","Fragment","transformProductData"],"mappings":"65BAqDO,MAAMA,GAA2C,CAAC,CACvD,MAAAC,EACA,YAAAC,EACA,eAAAC,EACA,YAAAC,EACA,eAAAC,EACA,IAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,WAAAC,GACA,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,aAAAC,EACA,UAAAC,EACA,SAAAC,GACA,SAAAC,EACA,QAAAC,EACA,eAAAC,EACA,SAAAC,EAAW,UACX,YAAAC,GAAc,GACd,GAAGC,EACL,IAAM,uBAEE,MAAAC,GAAoBC,EAAQ,gCAAgC,EAAE,MAC9DC,EAAoBD,EAAQ,gCAAgC,EAAE,MAC9DE,GAAkBF,EAAQ,8BAA8B,EAAE,MAC1DG,EAAcH,EAAQ,yBAAyB,EAAE,MAEjD,CAACI,EAAMC,CAAO,EAAIC,EAAwB,IAAI,EAE9CC,EAAgBpB,GAAA,MAAAA,EAAQ,OAC5BA,EAAO,IAAI,CAACqB,EAAOC,IAAQ,OACnB,MAAAC,IACJC,EAAAlC,GAAA,YAAAA,EAAO,QAAP,YAAAkC,EAAc,YACdR,GAAA,YAAAA,EAAa,QAAQ,YAAa1B,EAAM,MAAM,SAAS,SAAS,GAC7D,QAAQ,QAAS,OAAOgC,EAAM,CAAC,GAC/B,QAAQ,UAAW,OAAOtB,EAAO,MAAM,IAC5C,OAAOS,IAAa,OACjBgB,EAAAC,GAAA,CAAK,YAAAhB,GACJ,SAAAe,EAACE,EAAA,CAEC,KAAMN,EACN,QAASC,IAAQ,EAAI,QAAU,OAC/B,IAAAC,CAAA,EAHKD,GAKT,EAEAG,EAACE,EAAA,CAEC,KAAMN,EACN,QAASC,IAAQ,EAAI,QAAU,OAC/B,IAAAC,EACA,QAAS,IAAML,EAAQI,CAAG,CAAA,EAJrBA,CAKP,CAEH,CAAA,EAEDG,EAAC,MAAA,CACC,IAAI,iFACJ,UAAU,mCACV,cAAW,EAAA,CACb,EAGIG,GAAwBJ,EAAAhB,GAAA,YAAAA,EAAgB,aAAhB,MAAAgB,EAA4B,OACxDhB,EAAe,WAAW,IAAI,CAACa,EAAOC,WACpC,OAAAG,EAACE,EAAA,CAEC,KAAMN,EACN,SAASb,GAAA,YAAAA,EAAgB,wBAAyB,OAClD,MACEgB,EAAAlC,GAAA,YAAAA,EAAO,QAAP,YAAAkC,EAAc,YACdR,GAAA,YAAAA,EAAa,QAAQ,YAAa1B,EAAM,MAAM,SAAS,SAAS,GAC7D,QAAQ,QAAS,OAAOgC,EAAM,CAAC,GAC/B,QAAQ,UAAW,OAAOtB,EAAO,MAAM,GAAC,EAPxCsB,CAUR,EAAA,EAEDG,EAAC,MAAA,CACC,IAAI,iFACJ,UAAU,mCACV,cAAW,EAAA,CACb,EAIA,OAAAI,EAAC,MAAK,CAAA,GAAGlB,GAAO,UAAWmB,EAAQ,CAAC,cAAe1B,CAAS,CAAC,EAC1D,SAAA,CAAAb,GACEkC,EAAAE,EAAA,CAAW,KAAMpC,EAAa,UAAU,2BAA2B,EAEtEsC,EAAC,MAAI,CAAA,UAAU,4DACb,SAAA,CAAAJ,EAAC,MAAI,CAAA,UAAU,2BACZ,UAAAM,EAAAvB,GAAA,YAAAA,EAAgB,WAAhB,MAAAuB,EAA0B,QACzBN,EAACO,EAAA,CACC,UAAU,iCACV,QAAQhC,GAAA,YAAAA,EAAQ,QAAS,EACzB,UACEA,GAAA,YAAAA,EAAQ,QAAS,EAAIQ,EAAe,SAAS,QAAU,OAEzD,kBAAmBA,GAAA,YAAAA,EAAgB,kBACnC,MAAMA,GAAA,YAAAA,EAAgB,YAAYR,GAAA,YAAAA,EAAQ,QAAS,EACnD,OACGiC,EAAAzB,GAAA,YAAAA,EAAgB,aAAhB,YAAAyB,EAA4B,QAAS,KACpCC,EAAA1B,GAAA,YAAAA,EAAgB,OAAhB,YAAA0B,EAAsB,UACxB,GAEF,KAAK1B,GAAA,YAAAA,EAAgB,MAAO,KAC5B,MAAM,OACN,OAAO,OACP,aAAcS,GAAQ,EACtB,WAAYW,EAEX,SAAAR,CAAA,CACH,IAECe,GAAY,CAAA,UAAU,sBAAsB,IAAI,QAC9C,UACH,CAAA,EAEJ,EACC3C,GACCiC,EAACE,EAAA,CACC,KAAMnC,EACN,UAAU,8BAAA,CAAA,CACZ,EAEJ,EAEAqC,EAAC,MAAI,CAAA,UAAU,4DACb,SAAA,CAACA,EAAA,MAAA,CAAI,UAAU,2BACb,SAAA,CAACA,EAAA,MAAA,CAAI,UAAU,sBACZ,SAAA,CAAAvC,GACEmC,EAAAE,EAAA,CAAW,KAAMrC,EAAO,UAAU,qBAAqB,EAGzDK,GAAQ8B,EAAAE,EAAA,CAAW,KAAMhC,EAAK,UAAU,kBAAmB,CAAA,CAAA,EAC9D,EAEAkC,EAAC,MAAI,CAAA,UAAU,sBACZ,SAAA,CACC1B,GAAAsB,EAACE,EAAA,CACC,KAAMxB,EACN,UAAW2B,EAAQ,CACjB,6BACA,oBAAA,CACD,EACD,aAAYhB,EACZ,KAAK,MAAA,CACP,EAEDZ,GACCuB,EAACE,EAAA,CACC,KAAMzB,EACN,UAAW4B,EAAQ,CACjB,6BACA,0BAAA,CACD,EACD,aAAYlB,GACZ,KAAK,MAAA,CAAA,CACP,EAEJ,GAGCwB,EAAA5B,GAAA,YAAAA,EAAgB,WAAhB,MAAA4B,EAA0B,UAC3BC,EAAA7B,GAAA,YAAAA,EAAgB,WAAhB,YAAA6B,EAA0B,UAAW,gBACnCZ,EAACO,EAAA,CACC,UAAU,8FACV,MAAM,OACN,OAAO,OACP,QAAQhC,GAAA,YAAAA,EAAQ,QAAS,EACzB,UAAUA,GAAA,YAAAA,EAAQ,QAAS,EAAI,gBAAkB,KACjD,MAAMQ,GAAA,YAAAA,EAAgB,YAAYR,GAAA,YAAAA,EAAQ,QAAS,EACnD,OACGsC,EAAA9B,GAAA,YAAAA,EAAgB,aAAhB,YAAA8B,EAA4B,QAAS,KACpCC,EAAA/B,GAAA,YAAAA,EAAgB,OAAhB,YAAA+B,EAAsB,SACxB,GAEF,KAAK/B,GAAA,YAAAA,EAAgB,MAAO,KAC5B,WAAYoB,EAEX,SAAAR,CAAA,CAAA,EAGHK,EAACO,EAAA,CACC,UAAU,oDACV,OAAMQ,EAAAhC,GAAA,YAAAA,EAAgB,OAAhB,YAAAgC,EAAsB,UAAUxC,GAAA,YAAAA,EAAQ,QAAS,EACvD,KAAKQ,GAAA,YAAAA,EAAgB,MAAO,KAC5B,MAAM,OACN,OAAO,OACP,QAAQR,GAAA,YAAAA,EAAQ,QAAS,EACzB,UAAUA,GAAA,YAAAA,EAAQ,QAAS,EAAI,OAAS,KACxC,MAAMQ,GAAA,YAAAA,EAAgB,YAAYR,GAAA,YAAAA,EAAQ,QAAS,EAElD,SAAAoB,CAAA,CACH,EAGFS,EAAC,MAAA,CACC,UAAWC,EAAQ,CACjB,uBACA,CAAC,qCAAsClC,CAAU,CAAA,CAClD,EAEA,SAAA,CAAAA,GACE6B,EAAA,MAAA,CAAI,UAAU,kCACZ,SACHV,GAAA,EAGDd,GACCwB,EAACE,EAAA,CACC,KAAM1B,EACN,UAAW6B,EAAQ,CAAC,sBAAsB,CAAC,CAAA,CAC7C,EAGDxB,KACE,MAAI,CAAA,UAAU,wBACb,SAACmB,EAAAE,EAAA,CAAW,KAAMrB,CAAA,CAAU,CAC9B,CAAA,EAGDC,GACCkB,EAACE,EAAA,CACC,KAAMpB,EACN,UAAWuB,EAAQ,CAAC,sBAAsB,CAAC,CAAA,CAAA,CAC7C,CAAA,CAEJ,EAECjC,GACC4B,EAACE,EAAA,CACC,KAAM9B,EACN,UAAWiC,EAAQ,CAAC,gCAAgC,CAAC,CAAA,CACvD,EAGDhC,GACC2B,EAACE,EAAA,CACC,KAAM7B,EACN,UAAWgC,EAAQ,CAAC,0BAA0B,CAAC,CAAA,CACjD,EAGD/B,GACE0B,EAAA,MAAA,CAAI,UAAU,0BAA2B,YAAW,EACnD,IAAA,EACN,EACChC,GACCgC,EAACE,EAAA,CACC,KAAMlC,EACN,UAAU,2BAAA,CAAA,CACZ,EAEJ,EAECC,GACE+B,EAAAE,EAAA,CAAW,KAAMjC,EAAgB,UAAU,uBAAuB,EAIpEuB,IAAS,KAAO,KACfQ,EAACgB,GAAA,CACC,UAAU,uBACV,QAAS,IAAMvB,EAAQ,IAAI,EAC3B,SAAQ,GAER,SAAAO,EAACO,EAAA,CACC,UAAU,iCACV,QAAQhC,GAAA,YAAAA,EAAQ,QAAS,EACzB,MAAM,OACN,OAAO,OACP,aAAciB,GAAQ,EACtB,MAAMT,GAAA,YAAAA,EAAgB,YAAYR,GAAA,YAAAA,EAAQ,QAAS,EACnD,UAAUA,GAAA,YAAAA,EAAQ,QAAS,EAAI,OAAS,KACxC,SAAQ,GAEP,SAAAoB,CAAA,CAAA,CACH,CAAA,CACF,EAEJ,CAEJ,ECzTae,GAAmD,CAAC,CAC/D,SAAA9B,EACA,IAAAqC,EAAM,KACN,UAAAtC,EACA,MAAAuC,EACA,GAAGhC,CACL,IAAM,CACE,MAAAiC,EAAQC,GAAS,MAAMxC,CAAQ,EAGnC,OAAAoB,EAAC,MAAA,CACE,GAAGd,EACJ,UAAWmB,EAAQ,CAAC,mBAAoB1B,CAAS,CAAC,EAClD,MAAO,CACL,QAASsC,EAAM,iBAAiBA,CAAG,IAAM,MACzC,GAAGC,CACL,EAEC,SAASE,GAAA,IACRxC,EACA,CAACyC,EAA2CxB,IACzCG,EAAA,MAAA,CAAsB,UAAU,yBAC/B,SAAAA,EAACE,EAAA,CAEC,KAAMmB,EACN,QAASxB,IAAQ,EAAI,QAAU,MAAA,EAF1BwB,EAAM,MAAM,GAAA,CAGnB,EALQF,EAAQtB,CAMlB,CAAA,CAEJ,CACF,CAEJ,EC0GayB,GAGT,CAAC,CACH,IAAApD,EACA,QAAAqD,EACA,aAAAC,EACA,qBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,cAAAC,EACA,wBAAAC,EACA,MAAAC,EACA,SAAAlD,GACA,YAAAmD,EACA,SAAAC,EACA,cAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAAnD,GACA,YAAAC,EAAc,GACd,4BAAAmD,EACA,GAAGlD,CACL,IAAM,gBAEE,MAAAmD,EAAiBjD,EAAQ,6BAA6B,EAAE,MACxDkD,GAAmBlD,EAAQ,+BAA+B,EAAE,MAC5DmD,GAAenD,EAAQ,2BAA2B,EAAE,MACpDoD,GAAoBpD,EAAQ,iCAAiC,EAAE,MAG/D,CAACqD,EAAQC,EAAS,EAAIhD,EACzBiD,GAAO,UAAU,EAAE,eAA0B,OAChD,EAEM,CAACC,EAAoBC,CAAqB,EAAInD,EAAmB,EAEjE,CAACoD,EAAO,KAAMC,CAAO,EAAIrD,EAASqC,CAAW,EAE7C,CAACiB,EAAQC,CAAS,EAAIvD,EAAiB,IAAM,CAC3C,MAAAwD,EAAkBC,GAA4B,CAAC,EAE/CC,EAAwB,CAC5B,IAAAlF,EACA,SAAUgF,CACZ,EAEA,OAAIJ,GAAA,MAAAA,EAAM,aACRM,EAAc,YAAcN,EAAK,YAE5BM,CAAA,CACR,EAGK,CAACC,EAAOC,CAAQ,EAAI5D,EAAS,IAAM,SAChC,MAAA,EACLoD,GAAA,MAAAA,EAAM,WACN/C,EAAA+C,GAAA,YAAAA,EAAM,UAAN,YAAA/C,EAAe,QAAS,KACxBO,EAAAwC,GAAA,YAAAA,EAAM,aAAN,YAAAxC,EAAkB,WAAWwC,GAAA,YAAAA,EAAM,QAAQ,QAAA,CAE9C,EAEKS,EAAyC,CAAE,KAAAT,EAAM,OAAAE,EAAQ,MAAAK,CAAM,EAErE,SAASG,EAAiChF,EAA0B,CAClE,OAAOA,GAAA,YAAAA,EAAS,KACbiF,IAAWA,GAAA,YAAAA,EAAQ,YAAa,gCACnC,CAGFC,EAAU,IAAM,CACd,MAAMC,EAAYC,GAAO,GAAG,WAAaC,GAAY,CAC/CA,IACFd,EAAQc,CAAO,EAEfZ,EAAWa,IAAkB,CAC3B,GAAGA,EACH,IAAKD,EAAQ,IACb,YAAaA,EAAQ,UAAA,EACrB,EACJ,CACD,EAGKE,EAAkBH,GAAO,GAC7B,gBACCC,GAA6B,CAC5BZ,EAAWa,IAAkB,CAAE,GAAGA,EAAM,GAAGD,GAAU,CAAA,CAEzD,EAEA,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAiB,MACjBJ,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAGLD,EAAU,IAAM,CACd,MAAMM,EAAcJ,GAAO,GAAG,SAAWC,GAAoB,CACvDA,IAAYpB,IAEhBC,GAAUmB,CAAe,EAEzBI,GAAiB/F,EAAK,CACpB,qBAAsB,CAACkE,EACvB,QAASH,GAAA,YAAAA,EAAe,aAAA,CACzB,EAAE,KAAKc,CAAO,EAAA,CAChB,EACD,MAAO,IAAM,CACXiB,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAAC5B,EAA6BK,EAAQR,GAAA,YAAAA,EAAe,cAAe/D,CAAG,CAAC,EAE3EwF,EAAU,IAAM,CACVxB,GAAWH,GAAe,OAAO,KAAKA,CAAW,EAAE,OAAS,GAC9DmC,GAA4BnC,CAAW,CACzC,EAEC,CAACA,CAAW,CAAC,EAGV,MAAAoC,EAAiBC,EAAaC,GAA+B,CACjEpB,EAAWa,IAAU,CAAE,GAAGA,EAAM,GAAGO,GAAY,CACjD,EAAG,EAAE,EAELX,EAAU,IAAM,CACPE,GAAA,KAAK,aAAcZ,CAAM,GAE/B,CAAC,KAAK,UAAUA,CAAM,CAAC,CAAC,EAE3B,MAAMsB,EAAuBF,EAC3B,MAAOG,GAAmE,SAExE,IAAIC,EAAc,OAAO,QAAQD,CAAU,EACxC,OAAO,CAAC,CAACE,EAAGC,CAAK,IAAMA,EAAM,QAAUlC,EAAiB,EACxD,IAAI,CAAC,CAACmC,EAAIF,CAAC,IAAMF,EAAWI,CAAE,EAAE,KAAK,EACrC,OAAQC,GAAYA,IAAY,MAAS,EAM1C,CAAChD,IACDkB,GAAA,MAAAA,EAAM,UACN,CAACU,EAAiCV,EAAK,OAAO,GAE9C+B,GAAa,CAAE,YAAaL,EAAY,KAAK,GAAG,EAAG,EAItCL,EAAA,CAAE,YAAAK,EAAa,EAC9BlB,GAASkB,GAAA,YAAAA,EAAa,YAAWzE,EAAA+C,GAAA,YAAAA,EAAM,UAAN,YAAA/C,EAAe,OAAM,EAGhD,MAAA+E,EAAO,MAAMb,GAAiB/F,EAAK,CACvC,QAAS+D,GAAA,YAAAA,EAAe,cACxB,SAAUa,GAAA,YAAAA,EAAM,SAChB,YAAA0B,EACA,qBAAsB,CAACpC,CAAA,CACxB,EAEDW,EAAQ+B,CAAI,GAGRxE,EAAA2B,GAAA,YAAAA,EAAe,gBAAf,MAAA3B,EAA8B,QAChCyE,EAAeD,EAAMN,CAAW,CAEpC,EAEA,CAACtG,CAAG,CACN,EAEM6G,EAAiBX,EACrB,CAACU,EAA2BE,IAAkC,OACtD,MAAAC,GAAqBH,GAAA,YAAAA,EAAM,aAAc,CAAC,EACzBE,EAAoB,MAAOE,GAChDD,EAAmB,SAASC,CAAI,CAClC,IAEErC,EAAsBiC,GAAA,YAAAA,EAAM,OAAO,EACpBX,EAAA,CAAE,YAAac,EAAoB,EAClD3B,GAAS2B,GAAA,YAAAA,EAAoB,YAAWlF,EAAA+E,GAAA,YAAAA,EAAM,UAAN,YAAA/E,EAAe,OAAM,EAEjE,EAEA,CAAC7B,CAAG,CACN,EAEMiH,EAAiBf,EAAagB,GAAsC,CACpE,OAAO,KAAKA,CAAO,EAAE,SAAW,KAAY,EAAK,CACvD,EAAG,EAAE,EAGC9G,EAAa+G,GAAQ,IAAM,OACxB,OAAAtF,EAAA+C,GAAA,YAAAA,EAAM,aAAN,YAAA/C,EAAkB,IAAI,CAAC,CAAE,MAAAuF,EAAO,MAAAZ,GAAS7E,IAAgB,CACxD,MAAA0F,EAASC,GAAYd,CAAK,EAC5Be,GAAaf,EAAOjC,CAAM,EAC1BiC,EAAM,SAAS,EAEnB,SACG,KAEE,CAAA,SAAA,CAAAY,EAAM,KAAGtF,EAAA,OAAA,CAAK,wBAAyB,CAAE,OAAAuF,EAAU,CAAA,CAAA,CAAA,EAF7C1F,CAGT,CAAA,EAGH,EAAA,CAACiD,GAAA,YAAAA,EAAM,WAAYL,CAAM,CAAC,EAEvB5D,EACJ,CAAC2C,IAAgBsB,GAAA,MAAAA,EAAM,SACrB9C,EAAC0F,EAAA,CACC,KAAK,WACL,KAAM5D,GAAA,YAAAA,EAAO,SACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAAC2F,GAAA,CAEC,KAAK,WACL,aAAc3C,EAAO,SAAS,SAAS,EACvC,MAAOA,EAAO,SAAS,SAAS,EAChC,IAAK,EACL,aAAYV,GACZ,UAAU,wBACV,QAAUzD,GAAa,CACf,MAAA+G,EAAgB,OAAO/G,CAAQ,EACtBsF,EAAA,CAAE,SAAUyB,EAAe,EAGtC,CAAChE,IAAiBkB,GAAA,MAAAA,EAAM,WAErBU,EAAiCV,EAAK,OAAO,GACnC+B,GAAA,CAAE,SAAUe,EAAe,EAE5C,CACF,EAlBI,UAAA,CAmBN,CAAA,EAEA,OAEAC,EAAgB,IAAM,CAC1B,GAAI/C,GAAA,MAAAA,EAAM,QAEN,OAAA9C,EAAC0F,EAAA,CACC,KAAK,UACL,KAAM5D,GAAA,YAAAA,EAAO,QACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAAC8F,GAAA,CACC,aAAc9C,EAAO,YACrB,QAASF,EAAK,QACd,eAAgBE,EAAO,YACvB,mBAAAJ,EACA,kBAAmBf,EACnB,qBAAsBO,EACtB,SAAUkC,EACV,SAAUa,CAAA,CAAA,CACZ,CACF,CAGN,EAGE,OAAAnF,EAAC,MAAK,CAAA,GAAGd,EACP,SAAAc,EAACpC,GAAA,CACC,MACEoC,EAAC0F,EAAA,CACC,KAAK,QACL,KAAM5D,GAAA,YAAAA,EAAO,MACb,QAAS,CAAE,GAAGyB,CAAmB,EAEhC,SAAMT,GAAA,YAAAA,EAAA,IAAA,CACT,EAEF,IACGvB,EAQG,OAPFvB,EAAC0F,EAAA,CACC,KAAK,MACL,KAAM5D,GAAA,YAAAA,EAAO,IACb,QAAS,CAAE,GAAGyB,CAAmB,EAEhC,SAAMT,GAAA,YAAAA,EAAA,GAAA,CAAA,EAIb,QAAS+C,EAAc,EACvB,aACE/D,GAAA,YAAAA,EAAO,cACL9B,EAAC0F,EAAA,CACC,KAAK,cACL,KAAM5D,GAAA,YAAAA,EAAO,YACb,QAAS,CACP,GAAGyB,EAEH,aAAawC,EAAU,CAChB,KAAA,gBAAgB,IAAIC,IAAU,CAC3B,MAAAC,EAAgBF,EAAS,GAAGC,CAAK,EAEjCE,EAAYD,GACfjG,EAAAmG,GAAA,CAAK,OAAQF,EAAe,EAG1B,KAAA,UAAWnC,IACP,CACL,GAAGA,EACH,UAAAoC,EACA,SAAU,CAERlG,EAACoG,GAAA,CACC,UAAAF,EACA,WAAYpC,EAAK,UAAA,CAAA,CACnB,CAEJ,EACD,CAAA,CACF,CACH,EAEA,WAAWiC,EAAU,CACd,KAAA,gBAAgB,IAAIC,IAAU,CACjC,KAAM,CAAE,KAAAK,EAAM,GAAGC,CAAM,EAAAP,EAAS,GAAGC,CAAK,EAElCO,EAAOvG,EAAC,IAAG,CAAA,GAAGsG,EAAI,SAAKD,EAAA,EAExB,KAAA,UAAWvC,GAAc,CAC5B,MAAM0C,EAAa,CAAC,GAAI1C,EAAK,YAAc,CAAA,EAAKyC,CAAI,EAC7C,MAAA,CACL,GAAGzC,EACH,WAAA0C,EACA,SAAU,CAERxG,EAACoG,GAAA,CACC,UAAWtC,EAAK,UAChB,WAAA0C,CAAA,CAAA,CACF,CAEJ,CAAA,CACD,CAAA,CACF,CACH,EAEA,kBAAkBT,EAAU,CACrB,KAAA,gBAAgB,IAAIC,IAAU,CAC3B,MAAAS,EAAaV,EAAS,GAAGC,CAAK,EAE9BU,EAAQ,KAAK,oBAAoBD,CAAU,EAE5C,KAAA,UAAW3C,GAAc,CAC5B,MAAM0C,EAAa,CAAC,GAAI1C,EAAK,YAAc,CAAA,EAAK4C,CAAK,EAE9C,MAAA,CACL,GAAG5C,EACH,WAAA0C,EACA,SAAU,CAERxG,EAACoG,GAAA,CACC,UAAWtC,EAAK,UAChB,WAAA0C,CAAA,CAAA,CACF,CAEJ,CAAA,CACD,CAAA,CACF,CAAA,CACH,CACF,CACF,EAGJ,SAAA3H,EACA,QACEmB,EAAC0F,EAAA,CACC,KAAK,UACL,KAAM5D,GAAA,YAAAA,EAAO,QACb,QAAS,CACP,GAAGyB,EAEH,aAAawC,EAAU,CAChB,KAAA,gBAAgB,IAAIC,IAAU,CAC3B,MAAAW,EAAUZ,EAAS,GAAGC,CAAK,EAEjC,GAAI,CAACW,EAAS,OAEd,KAAM,CAAE,KAAAN,EAAM,KAAAO,EAAM,GAAGC,CAAgB,EAAAF,EAEjCG,EACJ9G,EAAC+G,GAAA,CACC,KAAK,SACJ,GAAGF,EACJ,KAAMD,GAAS5G,EAAAmG,GAAA,CAAK,OAAQS,EAAM,EAEjC,SAAAP,CAAA,CACH,EAGG,KAAA,UAAWvC,KAAe,CAC7B,SAAU,CAAC,GAAIA,GAAK,UAAY,GAAKgD,CAAM,CAAA,EAC3C,CAAA,CACH,CAAA,CAEL,EAIE,SAAA,EAAChF,GAAA,MAAAA,EAAO,UACN9B,EAAC+G,GAAA,CACC,KAAK,SACL,KAAK,SACL,KAAM/G,EAACmG,GAAK,CAAA,OAAO,MAAO,CAAA,EAC1B,SAAU,EAACrD,GAAA,MAAAA,EAAM,UAAW,CAACO,EAC7B,aAAYhB,EACZ,QAAS,IACAF,GAAA,YAAAA,EAAca,GAGtB,SAAAX,CAAA,CAAA,CACH,CAGN,EAEF,iBACGZ,EAaG,OAZFzB,EAAC0F,EAAA,CACC,KAAK,mBACL,KAAM5D,GAAA,YAAAA,EAAO,iBACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAAC,MAAA,CAEC,wBAAyB,CACvB,QAAQ8C,GAAA,YAAAA,EAAM,mBAAoB,EAAA,CACpC,CAAA,CACF,CAAA,EAIN,YACGpB,EAWG,OAVF1B,EAAC0F,EAAA,CACC,KAAK,cACL,KAAM5D,GAAA,YAAAA,EAAO,YACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQ8C,GAAA,YAAAA,EAAM,cAAe,EAAG,CAAA,CAAA,CAC7D,CAAA,EAIN,SACE/C,EAAA+C,GAAA,YAAAA,EAAM,SAAN,YAAA/C,EAAc,IAAI,CAAC,CAAE,MAAAuF,EAAO,IAAA0B,cAC1B,OAAAhH,EAACiH,GAAA,CAEC,MAAO3B,EACP,IAAKA,EACL,IAAK0B,EAGL,QAAOjH,EAAAiC,GAAA,YAAAA,EAAU,cAAV,YAAAjC,EAAuB,QAAS,IACvC,SAAQO,EAAA0B,GAAA,YAAAA,EAAU,cAAV,YAAA1B,EAAuB,SAAU,KACzC,QAAQ0B,GAAA,YAAAA,EAAU,cAAe,CAAE,MAAO,GAAI,CAAA,EARzCgF,CAUR,MAAK,CAAC,EAET,cACE1G,GAAAwC,GAAA,YAAAA,EAAM,SAAN,MAAAxC,GAAc,QACZN,EAAC0F,EAAA,CACC,KAAK,eACL,KAAM5D,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAACkH,GAAA,CACE,GAAGpE,EAAK,OAAO,MAChB,OAAQqE,GAAc1E,CAAM,CAAA,CAAA,CAC9B,CAAA,EAEA,OAEN,OACEjC,GAAAsC,GAAA,YAAAA,EAAM,SAAN,MAAAtC,GAAc,SACdsC,EAAK,OAAO,SACZA,EAAK,OAAO,MAAM,UAAWA,GAAA,YAAAA,EAAM,OAAO,QAAQ,QAChD9C,EAAC0F,EAAA,CACC,KAAK,eACL,KAAM5D,GAAA,YAAAA,EAAO,aACb,QAAS,CAAE,GAAGyB,CAAmB,EAEjC,SAAAvD,EAACkH,GAAA,CACE,GAAGpE,EAAK,OAAO,QAChB,OAAQqE,GAAc1E,CAAM,CAAA,CAAA,CAC9B,CAAA,EAEA,OAEN,SAAAzD,GACA,YAAAC,EACA,eAAgB,CACd,GAAG+C,EACH,WACEA,GAAY,OAAO,KAAKA,CAAQ,EAAE,SAC9BvB,GAAAqC,GAAA,YAAAA,EAAM,SAAN,YAAArC,GAAc,IAAI,CAAC,CAAE,MAAA6E,EAAO,IAAA0B,CAC1B,IAAA,SAAA,OAAAhH,EAACiH,GAAA,CAEC,MAAO3B,EACP,IAAKA,EACL,IAAK0B,EAGL,QAAOjH,EAAAiC,GAAA,YAAAA,EAAU,kBAAV,YAAAjC,EAA2B,QAAS,IAC3C,SAAQO,EAAA0B,GAAA,YAAAA,EAAU,kBAAV,YAAA1B,EAA2B,SAAU,IAC7C,QAAQ0B,GAAA,YAAAA,EAAU,kBAAmB,CAAE,MAAO,GAAI,CAAA,EAR7CgF,CAUR,MAAK,CAAA,EACN,CAAA,CACR,EACA,WAAY,EAAClE,GAAA,MAAAA,EAAM,SACnB,WACGnB,EAaG,OAZF3B,EAAC0F,EAAA,CACC,KAAK,aACL,KAAM5D,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGyB,CAAmB,EAEhC,SAAAjF,GAAA,MAAAA,EAAY,OAER8B,EAAAgH,GAAA,CAAA,SAAA,CAAA7E,GACDvC,EAAC,MAAI,SAAW1B,CAAA,CAAA,CAAA,CAAA,CAClB,EACE,IAAA,CAAA,EAIV,gBACEwD,GAAA,YAAAA,EAAO,iBACL9B,EAAC0F,EAAA,CACC,KAAK,iBACL,KAAM5D,EAAM,eACZ,QAAS,CAAE,GAAGyB,CAAmB,CAAA,CACnC,EAGJ,aACEzB,GAAA,YAAAA,EAAO,cACL9B,EAAC0F,EAAA,CACC,KAAK,cACL,KAAM5D,EAAM,YACZ,QAAS,CAAE,GAAGyB,CAAmB,CAAA,CACnC,EAGJ,gBACEzB,GAAA,YAAAA,EAAO,UACL9B,EAAC0F,EAAA,CACC,KAAK,UACL,KAAM5D,EAAM,QACZ,QAAS,CAAE,GAAGyB,CAAmB,CAAA,CAAA,CACnC,CAAA,EAIR,CAEJ,EAGAjC,GAAe,eAAiB,eAAgB,CAC9C,IAAApD,EACA,4BAAAkE,EAA8B,GAC9B,cAAAH,CACF,EAAG,SACD,MAAMF,GAAczB,GAAAP,EAAA4C,GAAO,UAAU,EAAE,SAAnB,YAAA5C,EAA2B,iBAA3B,YAAAO,EAA2C,YAE/D,OAAOyB,EACHsF,GAAqBtF,CAAW,EAChCkC,GAAiB/F,EAAK,CACpB,qBAAsB,CAACkE,EACvB,QAASH,GAAA,YAAAA,EAAe,aAAA,CACzB,CACP"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container, ResolveImageUrlOptions } from '
|
|
2
|
+
import { Container, ResolveImageUrlOptions, SlotProps } from '@dropins/tools/types/elsie/src/lib';
|
|
3
|
+
import { ImageProps } from '@dropins/tools/types/elsie/src/components';
|
|
3
4
|
import { ProductModel } from '../../data/models/product-model';
|
|
4
5
|
|
|
6
|
+
type DefaultSlotContext = {
|
|
7
|
+
data: ProductModel | null;
|
|
8
|
+
};
|
|
5
9
|
export interface ProductGalleryProps extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {
|
|
6
10
|
controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;
|
|
7
11
|
loop?: boolean;
|
|
@@ -14,6 +18,15 @@ export interface ProductGalleryProps extends Omit<HTMLAttributes<HTMLDivElement>
|
|
|
14
18
|
zoom?: {
|
|
15
19
|
closeButton: boolean;
|
|
16
20
|
} | boolean;
|
|
21
|
+
slots?: {
|
|
22
|
+
CarouselThumbnail?: SlotProps<DefaultSlotContext & {
|
|
23
|
+
defaultImageProps: ImageProps;
|
|
24
|
+
}>;
|
|
25
|
+
CarouselMainImage?: SlotProps<DefaultSlotContext & {
|
|
26
|
+
defaultImageProps: ImageProps;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
17
29
|
}
|
|
18
30
|
export declare const ProductGallery: Container<ProductGalleryProps, ProductModel | null>;
|
|
31
|
+
export {};
|
|
19
32
|
//# sourceMappingURL=ProductGallery.d.ts.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as A,jsxs as
|
|
3
|
+
import{jsx as A,jsxs as z}from"@dropins/tools/preact-jsx-runtime.js";import{useState as O,useEffect as J,useMemo as w}from"@dropins/tools/preact-compat.js";import{Slot as R}from"@dropins/tools/lib.js";import{Image as Z}from"@dropins/tools/components.js";import{events as K}from"@dropins/tools/event-bus.js";import{g as U}from"../chunks/getFetchedProductData.js";import{Z as V,C as j,O as W}from"../chunks/Zoom.js";/* empty css */import{useText as X}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const Y=({initialData:v=null,controls:G="dots",loop:I=!0,peak:k=!1,gap:H=null,arrows:N=!0,arrowsOnMainImage:Q=!1,zoom:h=!1,imageParams:t,thumbnailParams:o,children:$,slots:l,...F})=>{var x,y,T,_,S,D;const c=X("PDP.Product.Image.label").label,[e,q]=O(v),[f,C]=O(null);J(()=>{const n=K.on("pdp/data",q);return()=>{n==null||n.off()}},[]);const g=w(()=>({data:e}),[e]),B=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:p,url:r},i)=>{const d=({...u})=>{var M;const E={title:p,src:r,alt:c==null?void 0:c.replace("{product}",p).replace("{key}",String(i+1)).replace("{total}",String((M=e==null?void 0:e.images)==null?void 0:M.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:i===0?"eager":"lazy",...u};return A(R,{name:"CarouselMainImage",slot:l==null?void 0:l.CarouselMainImage,context:{...g,defaultImageProps:E},children:A(Z,{...E})})};return h?A(V,{closeButton:typeof h=="object"?h.closeButton:!1,children:A(d,{})},r):A(d,{onClick:()=>C(i)},r)}))??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")},[c,e==null?void 0:e.images,t,h,g,l==null?void 0:l.CarouselMainImage]),s=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:p,url:r},i)=>{var u;const d={title:p,src:r,alt:c==null?void 0:c.replace("{product}",p).replace("{key}",String(i+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(R,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:l==null?void 0:l.CarouselThumbnail,context:{...g,defaultImageProps:d},children:A(Z,{...d})},r)}))??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")},[c,e==null?void 0:e.images,o,g,l==null?void 0:l.CarouselThumbnail]);return e?z("div",{...F,children:[A(j,{arrows:!!((x=e==null?void 0:e.images)!=null&&x.length)&&N,arrowsOnMainImage:Q,controls:(y=e==null?void 0:e.images)!=null&&y.length?G:void 0,loop:I&&!!((T=e.images)!=null&&T.length),peak:!!((_=e==null?void 0:e.images)!=null&&_.length)&&k,gap:H,defaultIndex:f||0,thumbnails:s,children:B}),f===null?null:A(W,{onClose:()=>C(null),centered:!0,children:A(j,{arrows:!!((S=e==null?void 0:e.images)!=null&&S.length),width:"100%",height:"100%",defaultIndex:f,loop:I&&!!((D=e.images)!=null&&D.length),controls:"dots",isZoomed:!0,children:B})})]}):null};Y.getInitialData=U;export{Y as ProductGallery,Y as default};
|
|
4
|
+
//# sourceMappingURL=ProductGallery.js.map
|
|
@@ -0,0 +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 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 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);\n return () => {\n dataEvent?.off();\n };\n }, []);\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","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,5 +1,5 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container } from '
|
|
2
|
+
import { Container } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ProductModel } from '../../data/models';
|
|
4
4
|
|
|
5
5
|
export interface ProductHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{jsxs as c,jsx as e,Fragment as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as m,useEffect as p}from"@dropins/tools/preact-compat.js";import{classes as u,VComponent as l}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact.js";import{events as f}from"@dropins/tools/event-bus.js";import{g as h}from"../chunks/getFetchedProductData.js";const g=({className:r,title:a,sku:n,hideSku:s=!1,children:t,...d})=>c("div",{...d,className:u(["pdp-header",r]),children:[e("div",{className:"pdp-header__title",children:e(l,{node:a})}),!s&&e("div",{className:"pdp-header__sku",children:e(l,{node:n})})]}),_=({initialData:r=null,hideSku:a=!1,children:n,...s})=>{const[t,d]=m(r);return p(()=>{const o=f.on("pdp/data",d);return()=>{o==null||o.off()}},[]),t?e(g,{...s,title:e(i,{children:t.name}),sku:e(i,{children:t.sku}),hideSku:a}):null};_.getInitialData=h;export{_ as ProductHeader,_ as default};
|
|
4
|
+
//# sourceMappingURL=ProductHeader.js.map
|
|
@@ -0,0 +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 hideSku?: boolean;\n}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({ initialData = null, hideSku = false, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n\n return () => {\n dataEvent?.off();\n };\n }, []);\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","data","setData","useState","useEffect","dataEvent","events","Fragment","getFetchedProductData"],"mappings":"0aA4BO,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,ECnBSQ,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,QAAAR,EAAU,GAAO,SAAAC,EAAU,GAAGC,KAAY,CACnE,KAAM,CAACO,EAAMC,CAAO,EAAIC,EAA8BH,CAAW,EAU7D,OARJI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,CAAO,EAE/C,MAAO,IAAM,CACXG,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAEAJ,EAGHJ,EAACT,EAAA,CACE,GAAGM,EACJ,MAAUG,EAAAU,EAAA,CAAA,SAAAN,EAAK,KAAK,EACpB,IAAQJ,EAAAU,EAAA,CAAA,SAAAN,EAAK,IAAI,EACjB,QAAAT,CAAA,CACF,EARgB,IAUpB,EAEAO,EAAc,eAAiBS"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container, SlotProps } from '
|
|
2
|
+
import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ProductModel } from '../../data/models';
|
|
4
|
+
import { ImageNodeRenderProps, ImageProps } from '@dropins/tools/types/elsie/src/components';
|
|
4
5
|
|
|
5
6
|
export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
|
|
6
7
|
hideSelectedValue?: boolean;
|
|
@@ -9,10 +10,16 @@ export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
9
10
|
[id: string]: string;
|
|
10
11
|
}) => void;
|
|
11
12
|
slots?: {
|
|
12
|
-
Swatches
|
|
13
|
+
Swatches?: SlotProps<{
|
|
13
14
|
data: ProductModel | null;
|
|
14
15
|
optionsUIDs: string[];
|
|
15
16
|
}>;
|
|
17
|
+
SwatchImage?: SlotProps<{
|
|
18
|
+
data: ProductModel | null;
|
|
19
|
+
optionsUIDs: string[];
|
|
20
|
+
imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];
|
|
21
|
+
defaultImageProps: ImageProps;
|
|
22
|
+
}>;
|
|
16
23
|
};
|
|
17
24
|
}
|
|
18
25
|
export declare const ProductOptions: Container<ProductOptionsProps, {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as
|
|
3
|
+
import{jsx as g}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as q,useCallback as k}from"@dropins/tools/preact-compat.js";import{Slot as j}from"@dropins/tools/lib.js";import{events as h}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";/* empty css */import{S as z}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as C,o as A,k as y,j as v,h as G,l as b,p as H}from"../chunks/isProductConfigurationValid.js";import{g as J}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const K=({initialData:r={data:null,optionsUIDs:[]},hideSelectedValue:l=!1,slots:o,onValues:p,onErrors:f,children:Q,...O})=>{var S;const[t,B]=d(r.data),[u,T]=d(r.optionsUIDs),[F,M]=d();q(()=>{const i=h.on("pdp/data",B),s=h.on("pdp/values",({optionsUIDs:a})=>{a&&T(a)});return()=>{i==null||i.off(),s==null||s.off()}},[]);const L=k(async i=>{var I,P,U,w;if(!(t!=null&&t.sku))return;const{persistURLParams:s,anchors:a,acdl:R}=C.getConfig()??{};let n=Object.keys(i).map(e=>i[e].value).filter(e=>e!==void 0);if(s&&!(t!=null&&t.isBundle)&&A({optionsUIDs:n.join(",")}),((P=(I=y())==null?void 0:I.optionsUIDs)==null?void 0:P.join("|"))!==(n==null?void 0:n.join("|"))){v(c=>({...c,optionsUIDs:n})),p==null||p(n);const e=await G(t.sku,{optionsUIDs:n??[],isBundle:t==null?void 0:t.isBundle,anchors:a});h.emit("pdp/data",e);let D=(n==null?void 0:n.length)===((U=e==null?void 0:e.options)==null?void 0:U.length);if(a!=null&&a.length){const c=(e==null?void 0:e.optionUIDs)??[];n.every(m=>c.includes(m))||(M(e==null?void 0:e.options),v(m=>({...m,optionsUIDs:c})),D=(c==null?void 0:c.length)===((w=e==null?void 0:e.options)==null?void 0:w.length))}b(()=>D),R&&e&&(e==null?void 0:e.variantSku)!==t.sku&&H(e)}},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,p]),N=k(i=>{Object.keys(i).length!==0&&(b(()=>!1),f==null||f(i))},[f]);return!t||!t.options?null:g(j,{name:"Swatches",slot:o==null?void 0:o.Swatches,context:{data:t,optionsUIDs:u},children:g(z,{...O,options:t.options,selectedUIDs:u,defaultOptions:u,selectionsToUpdate:F,hideSelectedValue:l,disablePreselections:!((S=C.getConfig())!=null&&S.preselectFirstOption),onValues:L,onErrors:N,imageSwatchNode:o!=null&&o.SwatchImage?({imageSwatchContext:i,...s})=>g(j,{name:"SwatchImage",slot:o==null?void 0:o.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:u,defaultImageProps:s,imageSwatchContext:i}}):void 0})})};K.getInitialData=async function(){var o;const r=await J(),l=((o=y())==null?void 0:o.optionsUIDs)??[];return{data:r,optionsUIDs:l}};export{K as ProductOptions,K as default};
|
|
4
|
+
//# sourceMappingURL=ProductOptions.js.map
|
|
@@ -0,0 +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 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 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);\n\n const valuesEvent = events.on('pdp/values', ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\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\n if (\n getProductConfigurationValues()?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }));\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);\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((prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }));\n\n valid = updatedOptionsUIDs?.length === next?.options?.length;\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid);\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n }\n },\n [data?.isBundle, data?.sku, onValues]\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);\n onErrors?.(errors);\n }\n },\n [onErrors]\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 () {\n const data = await getFetchedProductData();\n const optionsUIDs = getProductConfigurationValues()?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","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","getFetchedProductData"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HTMLAttributes } from 'preact/compat';
|
|
2
|
-
import { Container } from '
|
|
2
|
+
import { Container } from '@dropins/tools/types/elsie/src/lib';
|
|
3
3
|
import { ProductModel } from '../../data/models';
|
|
4
4
|
|
|
5
5
|
export interface ProductPriceProps extends HTMLAttributes<HTMLDivElement> {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{jsxs as D,jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as L}from"@dropins/tools/preact-compat.js";import{classes as s,VComponent as f,toLanguageTag as g}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import{P}from"../chunks/PriceRange.js";import"@dropins/tools/preact.js";import{useText as b}from"@dropins/tools/i18n.js";import{events as _}from"@dropins/tools/event-bus.js";import{g as h}from"../chunks/getFetchedProductData.js";import{c as v}from"../chunks/isProductConfigurationValid.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const S=({className:t,price:i,specialPrice:a,children:n,...e})=>{const c=b("PDP.Product.RegularPrice.label").label,o=b("PDP.Product.SpecialPrice.label").label;return D("div",{...e,className:s(["pdp-price",t]),children:[a&&r(f,{node:a,className:s(["pdp-price__amount-special","pdp-price__amount"]),"aria-label":o,role:"text"}),i&&r(f,{node:i,className:s(["pdp-price__amount-regular","pdp-price__amount--grey"]),"aria-label":c,role:"text"})]})},N=({initialData:t=null,children:i,...a})=>{var m,u;const{defaultLocale:n="en-US"}=v.getConfig(),[e,c]=d(t),[o,x]=d(n);return L(()=>{const l=_.on("pdp/data",c),p=_.on("locale",x);return()=>{l==null||l.off(),p==null||p.off()}},[]),e?r(S,{...a,specialPrice:(m=e.prices)!=null&&m.visible?r(P,{...e.prices.final,locale:g(o)}):void 0,price:(u=e.prices)!=null&&u.visible&&e.prices.regular&&e.prices.final.amount!==e.prices.regular.amount?r(P,{...e.prices.regular,locale:g(o)}):void 0}):null};N.getInitialData=h;export{N as ProductPrice,N as default};
|
|
4
|
+
//# sourceMappingURL=ProductPrice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductPrice.js","sources":["/@dropins/storefront-pdp/src/components/Price/Price.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 */import { FunctionComponent, VNode } from 'preact';\n\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}\n\nexport const Price: FunctionComponent<PriceProps> = ({\n className,\n price,\n specialPrice,\n children,\n ...props\n}) => {\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.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 </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 { 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\nexport const ProductPrice: Container<\n ProductPriceProps,\n ProductModel | null\n> = ({ initialData = null, children, ...props }) => {\n const { defaultLocale = 'en-US' } = config.getConfig();\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [locale, setLocale] = useState<string>(defaultLocale);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, []);\n\n if (!data) 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 {...data.prices.regular} locale={toLanguageTag(locale)} />\n ) : undefined\n }\n />\n );\n};\n\nProductPrice.getInitialData = getFetchedProductData;\n"],"names":["Price","className","price","specialPrice","children","props","RegularPriceLabel","useText","SpecialPriceLabel","jsxs","classes","jsx","VComponent","ProductPrice","initialData","defaultLocale","config","data","setData","useState","locale","setLocale","useEffect","dataEvent","events","localeEvent","_a","PriceRange","toLanguageTag","_b","getFetchedProductData"],"mappings":"ooBA2BO,MAAMA,EAAuC,CAAC,CACnD,UAAAC,EACA,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAM,CACE,MAAAC,EAAoBC,EAAQ,gCAAgC,EAAE,MAC9DC,EAAoBD,EAAQ,gCAAgC,EAAE,MAGlE,OAAAE,EAAC,MAAK,CAAA,GAAGJ,EAAO,UAAWK,EAAQ,CAAC,YAAaT,CAAS,CAAC,EACxD,SAAA,CACCE,GAAAQ,EAACC,EAAA,CACC,KAAMT,EACN,UAAWO,EAAQ,CACjB,4BACA,mBAAA,CACD,EACD,aAAYF,EACZ,KAAK,MAAA,CACP,EAEDN,GACCS,EAACC,EAAA,CACC,KAAMV,EACN,UAAWQ,EAAQ,CACjB,4BACA,yBAAA,CACD,EACD,aAAYJ,EACZ,KAAK,MAAA,CAAA,CACP,EAEJ,CAEJ,ECtCaO,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,SAAAV,EAAU,GAAGC,KAAY,SAClD,KAAM,CAAE,cAAAU,EAAgB,SAAYC,EAAO,UAAU,EAE/C,CAACC,EAAMC,CAAO,EAAIC,EAA8BL,CAAW,EAE3D,CAACM,EAAQC,CAAS,EAAIF,EAAiBJ,CAAa,EAYtD,OAVJO,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYN,CAAO,EACzCO,EAAcD,EAAO,GAAG,SAAUH,CAAS,EAEjD,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,EAAE,EAEAR,EAGHN,EAACX,EAAA,CACE,GAAGK,EACJ,cACEqB,EAAAT,EAAK,SAAL,MAAAS,EAAa,UACVC,EAAY,CAAA,GAAGV,EAAK,OAAO,MAAO,OAAQW,EAAcR,CAAM,CAAG,CAAA,EAChE,OAEN,OACES,EAAAZ,EAAK,SAAL,MAAAY,EAAa,SACbZ,EAAK,OAAO,SACZA,EAAK,OAAO,MAAM,SAAWA,EAAK,OAAO,QAAQ,OAC9CN,EAAAgB,EAAA,CAAY,GAAGV,EAAK,OAAO,QAAS,OAAQW,EAAcR,CAAM,CAAG,CAAA,EAClE,MAAA,CAER,EAjBgB,IAmBpB,EAEAP,EAAa,eAAiBiB"}
|