@dropins/storefront-pdp 0.2.3-alpha3 → 0.2.3-alpha4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/api/fetch-graphql/fetch-graphql.d.ts +8 -0
  2. package/api/fetch-graphql/index.d.ts +2 -0
  3. package/api/getProductData/getProductData.d.ts +4 -0
  4. package/api/getProductData/graphql/getProductData.graphql.d.ts +2 -0
  5. package/api/getProductData/index.d.ts +2 -0
  6. package/api/getRefinedProduct/getRefinedProduct.d.ts +4 -0
  7. package/api/getRefinedProduct/graphql/RefineProductQuery.graphql.d.ts +2 -0
  8. package/api/getRefinedProduct/index.d.ts +2 -0
  9. package/api/graphql/ProductFragment.graphql.d.ts +2 -0
  10. package/api/graphql/ProductOptionFragment.graphql.d.ts +2 -0
  11. package/api/index.d.ts +5 -0
  12. package/api/initialize/index.d.ts +2 -0
  13. package/api/initialize/initialize.d.ts +19 -0
  14. package/api.d.ts +1 -0
  15. package/api.js +0 -1
  16. package/chunks/getRefinedProduct.js +0 -1
  17. package/chunks/initialize.js +0 -1
  18. package/components/Carousel/Carousel.d.ts +30 -0
  19. package/components/Carousel/index.d.ts +3 -0
  20. package/components/GalleryGrid/GalleryGrid.d.ts +10 -0
  21. package/components/GalleryGrid/index.d.ts +3 -0
  22. package/components/Overlay/Overlay.d.ts +9 -0
  23. package/components/Overlay/index.d.ts +3 -0
  24. package/components/PriceRange/PriceRange.d.ts +14 -0
  25. package/components/PriceRange/index.d.ts +3 -0
  26. package/components/Product/Product.d.ts +29 -0
  27. package/components/Product/index.d.ts +3 -0
  28. package/components/Swatches/Swatches.d.ts +45 -0
  29. package/components/Swatches/index.d.ts +3 -0
  30. package/components/index.d.ts +7 -0
  31. package/containers/ProductDetails/ProductDetails.d.ts +78 -0
  32. package/containers/ProductDetails/index.d.ts +3 -0
  33. package/containers/ProductDetails.d.ts +3 -0
  34. package/containers/ProductDetails.js +0 -1
  35. package/containers/index.d.ts +2 -0
  36. package/data/models/acdl-models.d.ts +35 -0
  37. package/data/models/index.d.ts +2 -0
  38. package/data/models/product-model.d.ts +61 -0
  39. package/data/transforms/acdl-context.d.ts +5 -0
  40. package/data/transforms/index.d.ts +2 -0
  41. package/data/transforms/product-transform.d.ts +4 -0
  42. package/i18n/en_US.json.d.ts +69 -0
  43. package/lib/acdl.d.ts +17 -0
  44. package/lib/date.d.ts +3 -0
  45. package/lib/url-params.d.ts +3 -0
  46. package/package.json +1 -1
  47. package/render/Provider.d.ts +8 -0
  48. package/render/index.d.ts +2 -0
  49. package/render/render.d.ts +4 -0
  50. package/render.d.ts +1 -0
  51. package/render.js +0 -1
  52. package/api.js.map +0 -1
  53. package/chunks/getRefinedProduct.js.map +0 -1
  54. package/chunks/initialize.js.map +0 -1
  55. package/containers/ProductDetails.js.map +0 -1
  56. package/render.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, setFetchGraphQlHeaders: (header: import('@adobe/fetch-graphql').Header) => void, fetchGraphQl: <T = any>(query: string, options?: import('@adobe/fetch-graphql').FetchOptions | undefined) => Promise<{
2
+ errors?: import('@adobe/fetch-graphql').FetchQueryError | undefined;
3
+ data: T;
4
+ }>, getConfig: () => {
5
+ endpoint: string | undefined;
6
+ fetchGraphQlHeaders: import('@adobe/fetch-graphql').Header | undefined;
7
+ };
8
+ //# sourceMappingURL=fetch-graphql.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './fetch-graphql';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { ProductModel } from '../../data/models';
2
+
3
+ export declare const getProductData: (sku: string) => Promise<ProductModel | null>;
4
+ //# sourceMappingURL=getProductData.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare const GET_PRODUCT_DATA: string;
2
+ //# sourceMappingURL=getProductData.graphql.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './getProductData';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { ProductModel } from '../../data/models';
2
+
3
+ export declare const getRefinedProduct: (sku: string, optionUIDs: string[], anchorOptions?: string[]) => Promise<ProductModel | null>;
4
+ //# sourceMappingURL=getRefinedProduct.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare const REFINE_PRODUCT_QUERY: string;
2
+ //# sourceMappingURL=RefineProductQuery.graphql.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './getRefinedProduct';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare const ProductFragment: string;
2
+ //# sourceMappingURL=ProductFragment.graphql.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare const ProductOptionFragment = "\nfragment ProductOptionFragment on ProductViewOption {\n id\n title\n required\n multi\n values {\n id\n title\n inStock\n __typename\n ... on ProductViewOptionValueProduct {\n title\n quantity\n isDefault\n product {\n sku\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n name\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n ... on ProductViewOptionValueSwatch {\n id\n title\n type\n value\n inStock\n }\n }\n }\n";
2
+ //# sourceMappingURL=ProductOptionFragment.graphql.d.ts.map
package/api/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './initialize';
2
+ export * from './fetch-graphql';
3
+ export * from './getProductData';
4
+ export * from './getRefinedProduct';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './initialize';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { Initializer } from '@dropins/tools/types/elsie/src/lib';
2
+ import { Lang } from '@dropins/tools/types/elsie/src/i18n';
3
+ import { ProductModel } from '../../data/models';
4
+
5
+ type ConfigProps = {
6
+ langDefinitions?: Lang;
7
+ defaultLocale?: string;
8
+ models?: {
9
+ [name: string]: {
10
+ initialData: any;
11
+ transform: (data?: ProductModel) => ProductModel;
12
+ fallbackData?: (parentProduct: any, simpleProduct: ProductModel) => ProductModel;
13
+ };
14
+ };
15
+ };
16
+ export declare const initialize: Initializer<ConfigProps>;
17
+ export declare const config: import('@dropins/tools/types/elsie/src/lib').Config<ConfigProps>;
18
+ export {};
19
+ //# sourceMappingURL=initialize.d.ts.map
package/api.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './api/index'
package/api.js CHANGED
@@ -1,2 +1 @@
1
1
  import{f as s,g as o,c as i,d as c,r as p,s as d,a as h,b as f}from"./chunks/getRefinedProduct.js";import{c as n,i as l}from"./chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/lib.js";export{n as config,s as fetchGraphQl,o as getConfig,i as getProductData,c as getRefinedProduct,l as initialize,p as removeFetchGraphQlHeader,d as setEndpoint,h as setFetchGraphQlHeader,f as setFetchGraphQlHeaders};
2
- //# sourceMappingURL=api.js.map
@@ -182,4 +182,3 @@ ${G}
182
182
  }
183
183
  }
184
184
  `).join("")}function X(e,r,t){const o=Object.values(e).filter(n=>!!n).reduce((n,c)=>c.options?[...n,...c.options]:[...n],[]),u=new Map(r.map(n=>[n.id,n]));return o.forEach(n=>{t!=null&&t.includes(n.id)||u.set(n.id,n)}),[...u.values()]}function Y(e,r,t){const o=[];let u;return e.forEach(n=>{var c,i,l,a;t.includes(n.id)?u=((i=(c=n.values)==null?void 0:c.find(s=>r.includes(s==null?void 0:s.id)))==null?void 0:i.id)||((l=n.values[0])==null?void 0:l.id):u=(a=n.values[0])==null?void 0:a.id,o.push(u)}),o}export{Z as a,tt as b,rt as c,nt as d,A as f,et as g,R as r,W as s};
185
- //# sourceMappingURL=getRefinedProduct.js.map
@@ -1,2 +1 @@
1
1
  import{Initializer as t}from"@dropins/tools/lib.js";const i=new t({init:async n=>{const o={defaultLocale:"en-US"};i.config.setConfig({...o,...n})},listeners:()=>[]}),c=i.config;export{c,i};
2
- //# sourceMappingURL=initialize.js.map
@@ -0,0 +1,30 @@
1
+ import { FunctionComponent, VNode } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+
4
+ type Show = number;
5
+ export interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {
6
+ children: VNode[] | VNode;
7
+ thumbnails?: VNode[] | VNode;
8
+ show?: Show | {
9
+ small: Show;
10
+ medium: Show;
11
+ large: Show;
12
+ };
13
+ gap?: 'small' | 'medium' | 'large' | null;
14
+ scrollbar?: boolean;
15
+ peak?: boolean;
16
+ arrows?: boolean;
17
+ controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;
18
+ arrowsOnMainImage?: boolean;
19
+ loop?: boolean;
20
+ direction?: 'horizontal';
21
+ style?: Record<string, string | number>;
22
+ width?: string;
23
+ height?: string;
24
+ defaultIndex?: number;
25
+ infinite?: boolean;
26
+ isZoomed?: boolean;
27
+ }
28
+ export declare const Carousel: FunctionComponent<CarouselProps>;
29
+ export {};
30
+ //# sourceMappingURL=Carousel.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './Carousel';
2
+ export { Carousel as default } from './Carousel';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { FunctionComponent, VNode } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+
4
+ export interface GalleryGridProps extends HTMLAttributes<HTMLDivElement> {
5
+ children: VNode[] | VNode;
6
+ gap?: 'small' | 'medium' | 'large' | null;
7
+ style?: Record<string, string | number>;
8
+ }
9
+ export declare const GalleryGrid: FunctionComponent<GalleryGridProps>;
10
+ //# sourceMappingURL=GalleryGrid.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './GalleryGrid';
2
+ export { GalleryGrid as default } from './GalleryGrid';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+
4
+ export interface OverlayProps extends HTMLAttributes<HTMLDivElement> {
5
+ centered?: boolean;
6
+ onClose?: () => void;
7
+ }
8
+ export declare const Overlay: FunctionComponent<OverlayProps>;
9
+ //# sourceMappingURL=Overlay.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './Overlay';
2
+ export { Overlay as default } from './Overlay';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { HTMLAttributes } from 'preact/compat';
2
+ import { FunctionalComponent } from 'preact';
3
+
4
+ export interface PriceRangeProps extends HTMLAttributes<HTMLDivElement> {
5
+ locale?: string;
6
+ variant?: 'default' | 'strikethrough';
7
+ currency?: string;
8
+ amount?: number;
9
+ sale?: boolean;
10
+ minimumAmount?: number;
11
+ maximumAmount?: number;
12
+ }
13
+ export declare const PriceRange: FunctionalComponent<PriceRangeProps>;
14
+ //# sourceMappingURL=PriceRange.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './PriceRange';
2
+ export { PriceRange as default } from './PriceRange';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,29 @@
1
+ import { FunctionComponent, VNode } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+ import { CarouselConfig } from '../../containers';
4
+
5
+ interface ProductCarouselConfig extends CarouselConfig {
6
+ thumbnails: VNode[];
7
+ }
8
+ export interface ProductProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
9
+ title?: VNode;
10
+ breadcrumbs?: VNode;
11
+ galleryContent?: VNode;
12
+ infoContent?: VNode;
13
+ productContent?: VNode;
14
+ shortDescription?: VNode;
15
+ description?: VNode;
16
+ attributes?: VNode;
17
+ images: VNode[];
18
+ options?: VNode;
19
+ sku?: VNode;
20
+ price?: VNode;
21
+ specialPrice?: VNode;
22
+ outOfStock: boolean;
23
+ actions?: VNode;
24
+ quantity?: VNode;
25
+ carouselConfig?: ProductCarouselConfig;
26
+ }
27
+ export declare const Product: FunctionComponent<ProductProps>;
28
+ export {};
29
+ //# sourceMappingURL=Product.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './Product';
2
+ export { Product as default } from './Product';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,45 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+
4
+ declare const supportedTypes: string[];
5
+ type OptionValue = {
6
+ id: string;
7
+ label: string;
8
+ inStock: boolean;
9
+ value: string;
10
+ selected?: boolean;
11
+ };
12
+ export type Option = {
13
+ id: string;
14
+ type: (typeof supportedTypes)[number];
15
+ label: string;
16
+ required?: boolean;
17
+ multiple?: boolean;
18
+ items: OptionValue[];
19
+ };
20
+ type Selection = {
21
+ [id: string]: {
22
+ label: string;
23
+ value: string;
24
+ };
25
+ };
26
+ export interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {
27
+ options: Array<{
28
+ id: string;
29
+ type: (typeof supportedTypes)[number];
30
+ label: string;
31
+ required?: boolean;
32
+ multiple?: boolean;
33
+ items: OptionValue[];
34
+ }>;
35
+ hideSelectedValue?: boolean;
36
+ defaultOptions?: string[];
37
+ selectionsToUpdate?: Option[];
38
+ onValues?: (uids: Selection, current: string) => void;
39
+ onErrors?: (errors: {
40
+ [id: string]: string;
41
+ }) => void;
42
+ }
43
+ export declare const Swatches: FunctionComponent<SwatchesProps>;
44
+ export {};
45
+ //# sourceMappingURL=Swatches.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './Swatches';
2
+ export { Swatches as default } from './Swatches';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,7 @@
1
+ export * from './Carousel';
2
+ export * from './Product';
3
+ export * from './GalleryGrid';
4
+ export * from './PriceRange';
5
+ export * from './Overlay';
6
+ export * from './Swatches';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,78 @@
1
+ import { HTMLAttributes } from 'preact/compat';
2
+ import { Container, SlotProps, SlotMethod, ResolveImageUrlOptions } from '@dropins/tools/types/elsie/src/lib';
3
+ import { ButtonProps } from '@dropins/tools/types/elsie/src/components';
4
+ import { ProductModel } from '../../data/models';
5
+
6
+ type IconType = keyof typeof import('@dropins/tools/types/elsie/src/icons');
7
+ type Values = {
8
+ sku: string;
9
+ quantity: number;
10
+ optionsUIDs?: string[];
11
+ };
12
+ type DefaultSlotContext = {
13
+ data: ProductModel | null;
14
+ values: Values;
15
+ valid: boolean;
16
+ };
17
+ export type CarouselConfig = {
18
+ mobile?: boolean;
19
+ controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;
20
+ arrowsOnMainImage?: boolean;
21
+ loopable?: boolean;
22
+ peak?: {
23
+ mobile: boolean;
24
+ desktop: boolean;
25
+ };
26
+ gap?: 'small' | 'medium' | 'large' | null;
27
+ thumbnailsLoadingMode?: 'lazy' | 'eager';
28
+ imageParams?: ResolveImageUrlOptions;
29
+ thumbnailParams?: ResolveImageUrlOptions;
30
+ };
31
+ export type OptionsConfig = {
32
+ anchorOptions?: string[];
33
+ };
34
+ export interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {
35
+ sku: string;
36
+ productData?: ProductModel;
37
+ hideSku?: boolean;
38
+ hideQuantity?: boolean;
39
+ hideShortDescription?: boolean;
40
+ hideDescription?: boolean;
41
+ hideAttributes?: boolean;
42
+ hideSelectedOptionValue?: boolean;
43
+ hideURLParams?: boolean;
44
+ slots?: {
45
+ Title?: SlotProps<DefaultSlotContext>;
46
+ SKU?: SlotProps<DefaultSlotContext>;
47
+ RegularPrice?: SlotProps<DefaultSlotContext>;
48
+ SpecialPrice?: SlotProps<DefaultSlotContext>;
49
+ Options?: SlotProps<DefaultSlotContext>;
50
+ Quantity?: SlotProps<DefaultSlotContext>;
51
+ Actions?: SlotProps<DefaultSlotContext & {
52
+ appendButton: SlotMethod<Omit<ButtonProps, 'icon'> & {
53
+ text?: string;
54
+ icon?: IconType;
55
+ }>;
56
+ }>;
57
+ ShortDescription?: SlotProps<DefaultSlotContext>;
58
+ Description?: SlotProps<DefaultSlotContext>;
59
+ Attributes?: SlotProps<DefaultSlotContext>;
60
+ Breadcrumbs?: SlotProps<DefaultSlotContext & {
61
+ setSeparator: SlotMethod<IconType>;
62
+ appendLink: SlotMethod<HTMLAttributes<HTMLAnchorElement> & {
63
+ text?: string;
64
+ }>;
65
+ appendHTMLElement: SlotMethod<HTMLElement>;
66
+ }>;
67
+ GalleryContent?: SlotProps<DefaultSlotContext>;
68
+ InfoContent?: SlotProps<DefaultSlotContext>;
69
+ Content?: SlotProps<DefaultSlotContext>;
70
+ };
71
+ carousel?: CarouselConfig;
72
+ optionsConfig?: OptionsConfig;
73
+ useACDL?: boolean;
74
+ onAddToCart?: (values: Values) => void;
75
+ }
76
+ export declare const ProductDetails: Container<ProductDetailsProps, ProductModel | null>;
77
+ export {};
78
+ //# sourceMappingURL=ProductDetails.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './ProductDetails';
2
+ export { ProductDetails as default } from './ProductDetails';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './ProductDetails/index'
2
+ import _default from './ProductDetails/index'
3
+ export default _default
@@ -1,2 +1 @@
1
1
  import*as se from"@dropins/tools/preact-compat.js";import{useState as K,Children as re,useRef as ye,useMemo as ve,useEffect as C,useCallback as Q}from"@dropins/tools/preact-compat.js";import{debounce as ge,classes as g,VComponent as T,toLanguageTag as Ne,Slot as z}from"@dropins/tools/lib.js";import{Button as we,Icon as be,Price as Se,Picker as Ve,ColorSwatch as He,ImageSwatch as qe,TextSwatch as ze,Incrementer as Ge,Breadcrumbs as je,Image as Ie}from"@dropins/tools/components.js";import{jsxs as M,jsx as r,Fragment as Pe}from"@dropins/tools/preact-jsx-runtime.js";import{useText as V}from"@dropins/tools/i18n.js";import{c as $e,d as Oe}from"../chunks/getRefinedProduct.js";import{events as Fe}from"@dropins/tools/event-bus.js";import{c as Be}from"../chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";const Ke=e=>se.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},se.createElement("path",{d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round"})),Qe=e=>se.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},se.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),se.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),me=({show:e=1,scrollbar:o=!1,peak:p=!1,arrows:b=!1,controls:s="dots",arrowsOnMainImage:P=!1,loop:u=!1,gap:A=null,direction:l="horizontal",width:ee="100%",height:d="100%",defaultIndex:v=0,className:U,children:H,thumbnails:X=null,isZoomed:N,...w})=>{const m=V("PDP.Carousel.label").label,n=V("PDP.Carousel.Slide.label").label,D=V("PDP.Carousel.Previous.label").label,R=V("PDP.Carousel.Next.label").label,y=V("PDP.Carousel.Controls.label").label,Z=V("PDP.Carousel.Controls.Button.label").label,[t,te]=K(()=>ke(e)),O=Math.ceil(re.toArray(H).length/t),G={small:16,medium:24,large:64},W=p?24:0,j=A?G[A]:0,I=re.toArray(H).length%t,ne=16,Y=2,le="32",[E,J]=K(u?v+1:v),q=ye([]),[F,he]=K(0),[ie,pe]=K(0),oe=ve(()=>re.toArray(X),[X]),c=ve(()=>{const a=re.toArray(H).reduce((i,L,S)=>S%t===0?[...i,[L]]:[...i.slice(0,-1),[...i[i.length-1],L]],[]);return!u||a.length===1?a:u&&re.toArray(H).length%t===0?[a[O-1]].concat(a).concat([a[0],a[1]]):[re.toArray(H).slice(-t)].concat(a).concat([a[0],a[1]])},[H,t,O,u]),_=ye(null),f=ye(null),h=s==="thumbnailsRow"||s==="thumbnailsColumn";C(()=>{const a=document.body,i=ge(()=>{var x,Ae;he(((x=_.current)==null?void 0:x.offsetWidth)??0),pe(((Ae=_.current)==null?void 0:Ae.offsetHeight)??0);const S=window.innerWidth,B=ke(e,S);B!==t&&te(B)},50),L=new ResizeObserver(i);return L.observe(a),()=>{L.unobserve(a)}},[t,e]);const $=Q(a=>{const i=u?a-1:a,L=q==null?void 0:q.current[0],S=(L==null?void 0:L.offsetWidth)+ne,B=(L==null?void 0:L.offsetHeight)+ne,x=f.current;s==="thumbnailsRow"&&(x!=null&&x.offsetWidth)&&(S*(i+1)>x.offsetWidth&&(x.style.scrollBehavior="smooth",x.scrollLeft=(i+Y)*S),x.scrollLeft>S*i&&(x.style.scrollBehavior="smooth",x.scrollLeft=(i-Y)*S)),s==="thumbnailsColumn"&&(x!=null&&x.offsetHeight)&&(B*(i+1)>x.offsetHeight&&(x.style.scrollBehavior="smooth",x.scrollTop=(i+Y)*B),x.scrollTop>B*i&&(x.style.scrollBehavior="smooth",x.scrollTop=(i-Y)*B))},[s,u]),k=Q((a,i,L)=>{(s==="thumbnailsRow"||s==="thumbnailsColumn")&&$(a);const S=_.current,B=W?S.offsetWidth-W:S.offsetWidth-W+j;if(!Array.from(S.querySelectorAll("[data-index]")).filter(_e=>{const de=Number(_e.getAttribute("data-index"));return!isNaN(de)&&de>-1})[a])return;if(L){const _e=a===0?O:0,de=B*(O+(I||t)/t);if(S.scrollLeft>=0&&S.scrollLeft<B-5){k(1,!0);return}if(S.scrollLeft>de-B&&S.scrollLeft<=de){k(O,!0);return}S.style.scrollBehavior="auto",S.scrollLeft=_e===0?0:de,k(_e===0?1:O,!0);return}const Ue=(S.offsetWidth-j)/t*c[a].length-W;S.style.scrollBehavior=i?"smooth":"auto",S.scrollLeft=c[a].length===t?B*a:B*(a-1)+Ue},[j,O,W,t,I,c,$,s]),ce=Q(()=>{if(u){const i=E-1;k(i,!0,E===1);return}const a=E<=0?0:E-1;k(a,!0)},[E,k,u]),ae=Q(()=>{const a=c.length-1;if(u){const L=E+1;k(L,!0,E===O);return}const i=E>=a?a:E+1;k(i,!0)},[c.length,u,E,k,O]);C(()=>{const a=i=>{i.key==="ArrowLeft"&&(i.preventDefault(),ce()),i.key==="ArrowRight"&&(i.preventDefault(),ae())};return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[ae,ce]),C(()=>{k(u?v+1:v,!1)},[v,k,u]);const fe=ge(()=>{const a=_.current,i=W?a.offsetWidth-W:a.offsetWidth-W+j,L=a.scrollLeft/i,S=Math.round(L)-L<1?Math.round(L):Math.ceil(L);if(h&&$(S),u){const B=i*(O+(I||t)/t);if(Math.ceil(a.scrollLeft)>=Math.ceil(B)-5){a.style.scrollBehavior="auto",a.scrollLeft=a.offsetWidth*1+(Math.ceil(a.scrollLeft)-Math.ceil(B)-W);return}if(a.scrollLeft===0){a.style.scrollBehavior="auto",a.scrollLeft=B-a.offsetWidth+W;return}}E!==S&&J(S)},100);C(()=>{const a=_.current;return a==null||a.addEventListener("scroll",fe),()=>{a==null||a.removeEventListener("scroll",fe)}},[fe]);const ue=(a,i,L)=>r(we,{className:g([["pdp-carousel__button",!a],[`pdp-carousel__button--${i}`,!a],[`pdp-carousel__button--${s}`,a]]),style:{"--height":`${ie}px`},variant:"tertiary","aria-label":i==="next"?R:D,onClick:L,disabled:u?!1:i==="next"?E>=c.length-1:E<1,children:r(be,{className:g([["pdp-carousel__button__icon",!a],[`pdp-carousel__button__icon--${i}`,!a],[`pdp-carousel__button__icon--${s}--${i}`,a]]),size:le,source:Ke})}),Le=b&&c.length!=1&&ue(h,"prev",ce),De=b&&c.length!=1&&ue(h,"next",ae),We=b&&c.length!=1&&ue(!1,"prev",ce),Te=b&&c.length!=1&&ue(!1,"next",ae);return M("div",{role:"region","aria-roledescription":m,className:g(["pdp-carousel",["pdp-carousel--main-image-controls",P],["pdp-carousel--arrows",b&&!h],[`pdp-carousel--${s}`,h],U]),style:{"--flex-carousel":s==="thumbnailsColumn"?"row-reverse":"column","--gap":h?"0":"var(--spacing-small)","--width":ee},...w,children:[r("div",{ref:_,className:g(["pdp-carousel__wrapper",`pdp-carousel__wrapper--${l}`,["pdp-carousel__wrapper--scrollbar",o],["pdp-carousel__wrapper--peak",p]]),style:{"--total-width":s==="thumbnailsColumn"?"81.6%":"100%","--height":s==="thumbnailsColumn"?"auto":d,"--gap":A?`var(--spacing-${A})`:"0px","--per-page":t},tabIndex:0,children:c.map((a,i)=>{const L=a.length<t;return r("div",{role:"group","aria-roledescription":n,"data-index":i,className:g(["pdp-carousel__slide",`pdp-carousel__slide--${l}`,["pdp-carousel__slide--active",E===i],["pdp-carousel__slide--orphan",L]]),style:{"--length":a.length},children:a},i)})}),!h&&M(Pe,{children:[Le,De]}),h&&P&&M(Pe,{children:[We,Te]}),s&&c.length!=1&&M("div",{className:g([[`pdp-carousel__controls__container--${s}`,h],["pdp-carousel__controls__container--no-arrows",!b||P]]),style:{"--width":s==="thumbnailsRow"?`${F}px`:ee,"--height":`${ie}px`,"--nr-thumbnails":oe.length},children:[(h||N)&&!P&&Le,r("div",{ref:f,className:g([[`pdp-carousel__controls__wrapper--${s}`,h],["pdp-carousel__controls__wrapper",h]]),children:r("div",{role:"group","aria-label":y,className:g(["pdp-carousel__controls",[`pdp-carousel__controls--${s}`,h]]),children:(u?c.slice(0,O):c).map((a,i)=>{const L=u?O:c.length,S=u?E-1===i:E===i;return h?M("label",{className:g(["pdp-carousel__thumbnail__container"]),ref:B=>{B&&(q.current[i]=B)},children:[r("input",{type:"radio",name:"carousel-thumbnails","aria-label":Z.replace("{key}",String(i+1)).replace("{total}",String(L)),checked:S&&F!==0,onChange:()=>{k(u?i+1:i,!0)},...w,className:g(["pdp-carousel__thumbnail",["pdp-carousel__thumbnail--selected",S&&F!==0]])}),r("span",{className:g(["pdp-carousel__thumbnail__span"]),children:oe[i]})]},i):r("button",{"aria-label":Z.replace("{key}",String(i+1)).replace("{total}",String(L)),onClick:()=>{k(u?i+1:i,!0)},className:g(["pdp-carousel__controls__button",["pdp-carousel__controls__button--active",S]])},i)})})}),(h||N)&&!P&&De]})]})};function ke(e,o=0){if(typeof e=="number")return e;const{small:p,medium:b,large:s}=e,P=786;return o>1024?s:o>P?b:p}const Xe=({title:e,breadcrumbs:o,galleryContent:p,infoContent:b,productContent:s,sku:P,outOfStock:u,shortDescription:A,description:l,attributes:ee,images:d,options:v,price:U,specialPrice:H,className:X,children:N,quantity:w,actions:m,carouselConfig:n,...D})=>{var j,I,ne,Y,le,E;const R=V("PDP.Product.RegularPrice.label").label,y=V("PDP.Product.SpecialPrice.label").label,Z=V("PDP.Product.OutOfStock.label").label,t=V("PDP.Product.Image.label").label,[te,O]=K(null),G=d!=null&&d.length?d.map((J,q)=>{var F;return r(T,{node:J,loading:q===0?"eager":"lazy",alt:((F=e==null?void 0:e.props)==null?void 0:F.children)&&(t==null?void 0:t.replace("{product}",e.props.children.toString()).replace("{key}",String(q+1)).replace("{total}",String(d.length))),onClick:()=>O(q)},q)}):r("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),W=(j=n==null?void 0:n.thumbnails)!=null&&j.length?n.thumbnails.map((J,q)=>{var F;return r(T,{node:J,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((F=e==null?void 0:e.props)==null?void 0:F.children)&&(t==null?void 0:t.replace("{product}",e.props.children.toString()).replace("{key}",String(q+1)).replace("{total}",String(d.length)))},q)}):r("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return M("div",{...D,className:g(["pdp-product",X]),children:[o&&r(T,{node:o,className:"pdp-product__breadcrumbs"}),M("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[r("div",{className:"pdp-product__column-body",children:n!=null&&n.controls?r(me,{className:"pdp-product__overlay__carousel",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?n.controls:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,peak:((I=n==null?void 0:n.thumbnails)==null?void 0:I.length)>1&&((ne=n==null?void 0:n.peak)==null?void 0:ne.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:te||0,thumbnails:W,children:G}):r(Ze,{className:"pdp-product__images",gap:"small",children:G})}),p&&r(T,{node:p,className:"pdp-product__gallery-content"})]}),M("div",{className:"pdp-product__column-container pdp-product__content-column",children:[M("div",{className:"pdp-product__column-body",children:[M("div",{className:"pdp-product__header",children:[e&&r(T,{node:e,className:"pdp-product__title"}),P&&r(T,{node:P,className:"pdp-product__sku"})]}),M("div",{className:"pdp-product__prices",children:[H&&r(T,{node:H,className:g(["pdp-product__price-special","pdp-product__price"]),"aria-label":y,role:"text"}),U&&r(T,{node:U,className:g(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":R,role:"text"})]}),n!=null&&n.mobile?r(me,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,peak:((Y=n==null?void 0:n.thumbnails)==null?void 0:Y.length)>1&&((le=n==null?void 0:n.peak)==null?void 0:le.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:W,children:G}):r(me,{className:"pdp-product__images pdp-product__images--carousel",peak:((E=n==null?void 0:n.peak)==null?void 0:E.mobile)&&(d==null?void 0:d.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,children:G}),M("div",{className:g(["pdp-product__actions",["pdp-product__actions--out-of-stock",u]]),children:[u&&r("div",{className:"pdp-product__out-of-stock__text",children:Z}),v&&r(T,{node:v,className:g(["pdp-product__options"])}),w&&r("div",{className:"pdp-product__quantity",children:r(T,{node:w})}),m&&r(T,{node:m,className:g(["pdp-product__buttons"])})]}),A&&r(T,{node:A,className:g(["pdp-product__short_description"])}),l&&r(T,{node:l,className:g(["pdp-product__description"])}),ee?r("div",{className:"pdp-product__attributes",children:ee}):null]}),b&&r(T,{node:b,className:"pdp-product__info-content"})]}),s&&r(T,{node:s,className:"pdp-product__content"}),te===null?null:r(Je,{className:"pdp-product__overlay",onClose:()=>O(null),centered:!0,children:r(me,{className:"pdp-product__overlay__carousel",arrows:(d==null?void 0:d.length)>1,width:"100%",height:"100%",defaultIndex:te||0,loop:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"dots":null,isZoomed:!0,children:G})})]})},Ze=({children:e,gap:o=null,className:p,style:b,...s})=>{const P=re.count(e);return r("div",{...s,className:g(["pdp-gallery-grid",p]),style:{"--gap":o?`var(--spacing-${o})`:"0px",...b},children:re.map(e,(u,A)=>r("div",{className:"pdp-gallery-grid__item",children:r(T,{node:u,loading:A===0?"eager":"lazy"},u.props.src)},P+A))})},xe=({amount:e,currency:o,locale:p,variant:b,sale:s,minimumAmount:P,maximumAmount:u,className:A,...l})=>r(Pe,{children:e||P===u?r("div",{className:"pdp-price-range",...l,children:r(Se,{amount:e||P,currency:o,locale:p,variant:b,sale:s,className:A})}):M("div",{className:"pdp-price-range",...l,children:[r(Se,{amount:P,currency:o,locale:p,className:A}),r("span",{className:"pdp-price-range__label",children:"-"}),r(Se,{amount:u,currency:o,locale:p,className:A})]})}),Je=({centered:e,onClose:o,className:p,children:b,...s})=>{const P=V("PDP.Overlay.Close.label").label,u=Q(()=>{o==null||o()},[o]);return C(()=>{const A=l=>{l.key==="Escape"&&u()};return document.addEventListener("keydown",A),()=>{document.removeEventListener("keydown",A)}},[u]),C(()=>{const A=document.scrollingElement,l=A.style.overflow;return A.style.overflow="hidden",()=>{A.style.overflow=l}},[]),M("div",{...s,className:g(["pdp-overlay",["pdp-overlay--centered",e],p]),children:[r("div",{className:"pdp-overlay__content",children:b}),r(we,{"aria-label":P,variant:"tertiary",className:"pdp-overlay__close-button",onClick:u,icon:r(Qe,{})})]})},Ye=["text","image","color","dropdown"],Ce=e=>e.map(o=>({...o,text:o.label,disabled:!o.inStock})),et=({options:e,hideSelectedValue:o,onValues:p,onErrors:b,defaultOptions:s,selectionsToUpdate:P,className:u,children:A,...l})=>{const ee=V("PDP.Swatches.Required.label").label,[d,v]=K(()=>e==null?void 0:e.reduce((w,m)=>{const{items:n}=m,D=n==null?void 0:n.find(y=>s==null?void 0:s.includes(y.id)),R=n==null?void 0:n.find(y=>y.selected);return D?{...w,[m.id]:{label:D.label,value:D.id}}:R?{...w,[m.id]:{label:R.label,value:R.id}}:w},{}));C(()=>{P==null||P.forEach(N=>{v(w=>{var D;const m=(D=N==null?void 0:N.items)==null?void 0:D.find(R=>R.selected);return m?{...w,[N.id]:{label:m==null?void 0:m.label,value:m==null?void 0:m.id}}:w})})},[P,v]),ve(()=>{const N=e==null?void 0:e.reduce((w,m)=>{var n;return(n=m==null?void 0:m.items)==null||n.forEach(D=>{var y;const R=((y=d[m.id])==null?void 0:y.value)===D.id;m.required&&!R&&(w[m.id]=ee)}),w},{});return b==null||b(N),N},[d]);const U=Q((N,w,m)=>{v(n=>{const D={...n,[N]:{label:w,value:m}};return p==null||p(D,m),D})},[p]),H=(N,w)=>{var n;const m=((n=w.selectedOptions[0])==null?void 0:n.label)??"";U(N,m,w.value)},X=Q(({items:N,id:w,required:m,type:n,selected:D,label:R})=>r("div",{className:g(["pdp-swatches__options"]),children:(n==null?void 0:n.toLowerCase())==="dropdown"?r(Ve,{"aria-label":R,handleSelect:y=>H(w,y.target),options:Ce(N),value:D}):N==null?void 0:N.map(y=>{const Z={key:y.id,id:y.id,name:w,value:y.value,label:y.label,groupAriaLabel:R,selected:D===y.id,outOfStock:!y.inStock,required:m===null?!0:m,onValue:()=>{U(w,y.label,y.id)}};switch(n){case"text":return r(ze,{...Z,label:y.label});case"image":return r(qe,{...Z,src:y.value,alt:y.label});case"color":return r(He,{...Z,size:"large",color:y.value});default:return console.warn(`Invalid swatch type ${n}`),null}})}),[U]);return r("div",{...l,className:g(["pdp-swatches",u]),children:e==null?void 0:e.map(({type:N,label:w,id:m,multiple:n,required:D,items:R})=>{var y;if(!N){console.warn("Bundle product not supported on UI.");return}return Ye.includes(N)||console.warn(`Invalid swatch type ${N}`),n&&console.warn("Multiple selection swatches are not currently supported."),M("div",{id:`swatch-item-${m}`,"data-slot-key":`product-swatch--${m}`,className:"pdp-swatches__field",children:[r("div",{className:"pdp-swatches__field__label",children:d[m]?o?`${w}`:`${w}: ${d[m].label}`:w}),r(X,{id:m,type:N,required:D,items:R,label:w,selected:(y=d[m])==null?void 0:y.value})]},`swatch-item-${m}`)})})};function tt(e,o="en_US"){if(!Re(e))throw Error("Invalid date string");return e.split(" ")[1]||(e=`${e} 00:00:00`),new Date(e).toLocaleDateString(Ne(o)).toString()}function Re(e){if(![/^\d{4}-\d{2}-\d{2}$/,/^\d{1,2}\/\d{1,2}\/\d{4}$/,/^\d{2}\/\d{2}\/\d{4}$/,/^\d{4}\/\d{2}\/\d{2}$/,/^\d{1,2}\.\d{1,2}\.\d{4}$/,/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/].some(b=>b.test(e)))return!1;const p=new Date(e);return!isNaN(p.getTime())}function rt(e){const o=new URLSearchParams(window.location.search);Object.entries(e).forEach(([b,s])=>{s===null?o.delete(b):o.set(b,String(s))});let p=window.location.pathname;p+=`?${o.toString()}`,p+=window.location.hash,window.history.replaceState({},"",p)}function nt(){const e=new URLSearchParams(window.location.search),o={};return e.forEach((p,b)=>{o[b]=p}),o}function lt(e){var o,p,b,s,P,u,A,l;return{productId:e==null?void 0:e.externalId,name:e==null?void 0:e.name,sku:e==null?void 0:e.sku,topLevelSku:e==null?void 0:e.externalParentId,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:void 0,pricing:{regularPrice:((p=(o=e==null?void 0:e.prices)==null?void 0:o.regular)==null?void 0:p.amount)||0,minimalPrice:void 0,maximalPrice:void 0,specialPrice:(s=(b=e==null?void 0:e.prices)==null?void 0:b.final)==null?void 0:s.amount,tierPricing:void 0,currencyCode:((u=(P=e==null?void 0:e.prices)==null?void 0:P.final)==null?void 0:u.currency)||"USD"},canonicalUrl:e==null?void 0:e.urlKey,mainImageUrl:(l=(A=e==null?void 0:e.images)==null?void 0:A[0])==null?void 0:l.url}}const ct={PRODUCT_CONTEXT:"productContext"},at={PRODUCT_PAGE_VIEW:"product-page-view"};function Me(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function dt(e,o){const p=Me();p.push({[e]:null}),p.push({[e]:o})}function it(e,o){Me().push(b=>{const s=b.getState?b.getState():{};b.push({event:e,eventInfo:{...s,...o}})})}function Ee(e){const o=lt(e);dt(ct.PRODUCT_CONTEXT,o),it(at.PRODUCT_PAGE_VIEW)}const ot=({sku:e,hideSku:o,hideQuantity:p,hideShortDescription:b,hideDescription:s,hideAttributes:P,hideURLParams:u,hideSelectedOptionValue:A,slots:l,children:ee,initialData:d,carousel:v,optionsConfig:U,useACDL:H,onAddToCart:X,...N})=>{var he,ie,pe,oe;const w=V("PDP.Product.AddToCart.label").label,m=V("PDP.Product.Incrementer.label").label,n=V("PDP.Product.Details.label").label,[D,R]=K(Be.getConfig().defaultLocale||"en-US"),[y,Z]=K(),[t=null,te]=K(d),[O,G]=K(()=>{const c={sku:e,quantity:1};return t!=null&&t.optionUIDs&&(c.optionsUIDs=t.optionUIDs),c}),[W,j]=K(()=>{var c,_;return!(t!=null&&t.options&&((c=t==null?void 0:t.options)==null?void 0:c.length)>0&&((_=t==null?void 0:t.optionUIDs)==null?void 0:_.length)!==(t==null?void 0:t.options.length))}),I={data:t,values:O,valid:W};C(()=>{const c=Fe.on("locale",_=>{_!==D&&(R(_),$e(e).then(te))});return()=>{c==null||c.off()}},[D,e]),C(()=>{H&&d&&Object.keys(d).length>0&&Ee(d)},[d]);const ne=Q(c=>{G(_=>({..._,...c}))},[]),Y=Q(c=>{var f;let _=Object.keys(c).map(h=>c[h].value).filter(h=>h!==void 0);u||rt({optionsUIDs:_.join(",")}),G(h=>({...h,optionsUIDs:_})),j((_==null?void 0:_.length)===((f=t==null?void 0:t.options)==null?void 0:f.length)),Oe(e,_,U==null?void 0:U.anchorOptions).then(h=>{var $;te(h),($=U==null?void 0:U.anchorOptions)!=null&&$.length&&le(h,_),H&&(h==null?void 0:h.sku)!==e&&Ee(h)})},[e]),le=Q((c,_)=>{var $;const f=(c==null?void 0:c.optionUIDs)??[];_.every(k=>f.includes(k))||(Z(c==null?void 0:c.options),G(k=>({...k,optionsUIDs:f})),j((f==null?void 0:f.length)===(($=c==null?void 0:c.options)==null?void 0:$.length)))},[e]),E=Q(c=>{Object.keys(c).length!==0&&j(!1)},[]),J=ve(()=>{var c;return(c=t==null?void 0:t.attributes)==null?void 0:c.map(({label:_,value:f},h)=>{const $=Re(f)?tt(f,D):f.toString();return M("li",{children:[_,": ",r("span",{dangerouslySetInnerHTML:{__html:$}})]},h)})},[t==null?void 0:t.attributes,D]),q=!p&&(t!=null&&t.inStock)?r(z,{name:"Quantity",slot:l==null?void 0:l.Quantity,context:{...I},children:r(Ge,{name:"quantity",defaultValue:O.quantity.toString(),min:1,"aria-label":m,className:"pdp-product__quantity",onValue:c=>{ne({quantity:Number(c)})}},"quantity")}):void 0,F=()=>{if(t!=null&&t.options)return r(z,{name:"Options",slot:l==null?void 0:l.Options,context:{...I},children:r(et,{options:t.options,defaultOptions:O.optionsUIDs,selectionsToUpdate:y,hideSelectedValue:A,onValues:Y,onErrors:E})})};return r("div",{...N,children:r(Xe,{title:r(z,{name:"Title",slot:l==null?void 0:l.Title,context:{...I},children:t==null?void 0:t.name}),sku:o?void 0:r(z,{name:"SKU",slot:l==null?void 0:l.SKU,context:{...I},children:t==null?void 0:t.sku}),options:F(),breadcrumbs:(l==null?void 0:l.Breadcrumbs)&&r(z,{name:"Breadcrumbs",slot:l==null?void 0:l.Breadcrumbs,context:{...I,setSeparator(c){this._registerMethod((..._)=>{const f=c(..._),h=f&&r(be,{source:f});this._setProps($=>({...$,separator:h}))})},appendLink(c){this._registerMethod((..._)=>{const{text:f,...h}=c(..._),$=r("a",{...h,children:f});this._setProps(k=>({...k,categories:[...k.categories||[],$]}))})},appendHTMLElement(c){this._registerMethod((..._)=>{const f=c(..._),h=this._htmlElementToVNode(f);this._setProps($=>({...$,categories:[...$.categories||[],h]}))})}},render:({separator:c,categories:_})=>r(je,{separator:c,categories:_})}),quantity:q,actions:r(z,{name:"Actions",slot:l==null?void 0:l.Actions,context:{...I,appendButton(c){this._registerMethod((..._)=>{const f=c(..._);if(!f)return;const{text:h,icon:$,...k}=f,ce=r(we,{type:"button",...k,icon:$&&r(be,{source:$}),children:h});this._setProps(ae=>({children:[...ae.children||[],ce]}))})}},children:!(l!=null&&l.Actions)&&r(we,{size:"medium",type:"submit",icon:r(be,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!W,"aria-label":w,onClick:()=>X==null?void 0:X(O),children:w})}),shortDescription:b?void 0:r(z,{name:"ShortDescription",slot:l==null?void 0:l.ShortDescription,context:{...I},children:r("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:s?void 0:r(z,{name:"Description",slot:l==null?void 0:l.Description,context:{...I},children:r("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((he=t==null?void 0:t.images)==null?void 0:he.map(({label:c,url:_})=>{var f,h;return r(Ie,{title:c,alt:c,src:_,width:((f=v==null?void 0:v.imageParams)==null?void 0:f.width)??960,height:((h=v==null?void 0:v.imageParams)==null?void 0:h.height)??1191,params:(v==null?void 0:v.imageParams)??{width:960}},_)}))??[],specialPrice:(ie=t==null?void 0:t.prices)!=null&&ie.visible?r(z,{name:"SpecialPrice",slot:l==null?void 0:l.SpecialPrice,context:{...I},children:r(xe,{...t.prices.final,locale:Ne(D)})}):void 0,price:(pe=t==null?void 0:t.prices)!=null&&pe.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?r(z,{name:"RegularPrice",slot:l==null?void 0:l.RegularPrice,context:{...I},children:r(xe,{...t.prices.regular,locale:Ne(D)})}):void 0,carouselConfig:{...v,thumbnails:v?((oe=t==null?void 0:t.images)==null?void 0:oe.map(({label:c,url:_})=>{var f,h;return r(Ie,{title:c,alt:c,src:_,width:((f=v==null?void 0:v.thumbnailParams)==null?void 0:f.width)??200,height:((h=v==null?void 0:v.thumbnailParams)==null?void 0:h.height)??248,params:(v==null?void 0:v.thumbnailParams)??{width:200}},_)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:P?void 0:r(z,{name:"Attributes",slot:l==null?void 0:l.Attributes,context:{...I},children:J!=null&&J.length?M(Pe,{children:[n,r("ul",{children:J})]}):null}),galleryContent:(l==null?void 0:l.GalleryContent)&&r(z,{name:"GalleryContent",slot:l.GalleryContent,context:{...I}}),infoContent:(l==null?void 0:l.InfoContent)&&r(z,{name:"InfoContent",slot:l.InfoContent,context:{...I}}),productContent:(l==null?void 0:l.Content)&&r(z,{name:"Content",slot:l.Content,context:{...I}})})})};ot.getInitialData=async function({sku:e,optionsConfig:o}){var b,s,P,u,A,l;const p=((b=nt().optionsUIDs)==null?void 0:b.split(","))||((l=(A=(u=(P=(s=Be)==null?void 0:s.getConfig())==null?void 0:P.models)==null?void 0:u.ProductDetails)==null?void 0:A.initialData)==null?void 0:l.optionsUIDs);return p!=null&&p.length?await Oe(e,p,o==null?void 0:o.anchorOptions):await $e(e)};export{ot as ProductDetails,ot as default};
2
- //# sourceMappingURL=ProductDetails.js.map
@@ -0,0 +1,2 @@
1
+ export * from './ProductDetails';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ACDL Product Types from:
3
+ * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts
4
+ */
5
+ export type Product = {
6
+ productId: number;
7
+ name: string;
8
+ sku: string;
9
+ topLevelSku?: string | null;
10
+ specialToDate?: string | null;
11
+ specialFromDate?: string | null;
12
+ newToDate?: string | null;
13
+ newFromDate?: string | null;
14
+ createdAt?: string | null;
15
+ updatedAt?: string | null;
16
+ manufacturer?: string | null;
17
+ countryOfManufacture?: string | null;
18
+ categories?: string[] | null;
19
+ productType?: string | null;
20
+ pricing?: {
21
+ regularPrice: number;
22
+ minimalPrice?: number;
23
+ maximalPrice?: number;
24
+ specialPrice?: number;
25
+ tierPricing?: {
26
+ customerGroupId?: number | null;
27
+ qty: number;
28
+ value: number;
29
+ }[];
30
+ currencyCode: string | null;
31
+ };
32
+ canonicalUrl?: string | null;
33
+ mainImageUrl?: string | null;
34
+ };
35
+ //# sourceMappingURL=acdl-models.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './product-model';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,61 @@
1
+ export interface ProductModel {
2
+ name: string;
3
+ sku: string;
4
+ addToCartAllowed: boolean;
5
+ inStock: boolean | null;
6
+ shortDescription?: string;
7
+ metaDescription?: string;
8
+ metaKeyword?: string;
9
+ metaTitle?: string;
10
+ description?: string;
11
+ images?: Image[];
12
+ prices: Prices;
13
+ attributes?: Attribute[];
14
+ options?: Option[];
15
+ optionUIDs?: string[];
16
+ url?: string;
17
+ urlKey?: string;
18
+ externalId?: string;
19
+ externalParentId?: string;
20
+ variantSku?: string;
21
+ }
22
+ interface Image {
23
+ url: string;
24
+ label: string;
25
+ width: number;
26
+ height: number;
27
+ }
28
+ interface Price {
29
+ amount?: number;
30
+ currency?: string;
31
+ maximumAmount?: number;
32
+ minimumAmount?: number;
33
+ variant?: 'default' | 'strikethrough';
34
+ }
35
+ interface Prices {
36
+ regular: Price;
37
+ final: Price;
38
+ visible: boolean;
39
+ }
40
+ interface Option {
41
+ id: string;
42
+ type: 'text' | 'image' | 'color';
43
+ typename: 'ProductViewOptionValueProduct' | 'ProductViewOptionValueSwatch' | 'ProductViewOptionValueConfiguration';
44
+ label: string;
45
+ required: boolean;
46
+ multiple: boolean;
47
+ items: OptionValue[];
48
+ }
49
+ interface OptionValue {
50
+ id: string;
51
+ label: string;
52
+ inStock: boolean;
53
+ value: string;
54
+ selected: boolean;
55
+ }
56
+ interface Attribute {
57
+ label: string;
58
+ value: string;
59
+ }
60
+ export {};
61
+ //# sourceMappingURL=product-model.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { ProductModel } from '../models';
2
+ import { Product } from '../models/acdl-models';
3
+
4
+ export declare function transformProduct(product: ProductModel): Product;
5
+ //# sourceMappingURL=acdl-context.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './product-transform';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { ProductModel } from '../models';
2
+
3
+ export declare function transformProductData(data: any): ProductModel | null;
4
+ //# sourceMappingURL=product-transform.d.ts.map
@@ -0,0 +1,69 @@
1
+ declare const _default: {
2
+ "PDP": {
3
+ "Product": {
4
+ "Incrementer": {
5
+ "label": "Item Quantity"
6
+ },
7
+ "OutOfStock": {
8
+ "label": "Out of Stock"
9
+ },
10
+ "AddToCart": {
11
+ "label": "Add to Cart"
12
+ },
13
+ "Details": {
14
+ "label": "Details"
15
+ },
16
+ "RegularPrice": {
17
+ "label": "Regular Price"
18
+ },
19
+ "SpecialPrice": {
20
+ "label": "Special Price"
21
+ },
22
+ "PriceRange": {
23
+ "From": {
24
+ "label": "From"
25
+ },
26
+ "To": {
27
+ "label": "to"
28
+ }
29
+ },
30
+ "Image": {
31
+ "label": "{product} Image {key} of {total}"
32
+ }
33
+ },
34
+ "Swatches": {
35
+ "Required": {
36
+ "label": "Required"
37
+ }
38
+ },
39
+ "Carousel": {
40
+ "label": "Carousel",
41
+ "Next": {
42
+ "label": "Next"
43
+ },
44
+ "Previous": {
45
+ "label": "Previous"
46
+ },
47
+ "Slide": {
48
+ "label": "Slide"
49
+ },
50
+ "Controls": {
51
+ "label": "Carousel Controls",
52
+ "Button": {
53
+ "label": "Show slide {key} of {total}"
54
+ }
55
+ }
56
+ },
57
+ "Overlay": {
58
+ "Close": {
59
+ "label": "Close"
60
+ }
61
+ }
62
+ },
63
+ "Custom": {
64
+ "quantityLabel": "Passengers"
65
+ }
66
+ }
67
+ ;
68
+
69
+ export default _default;
package/lib/acdl.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { ProductModel } from '../data/models';
2
+
3
+ /**
4
+ * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts
5
+ */
6
+ export declare const contexts: {
7
+ PRODUCT_CONTEXT: string;
8
+ };
9
+ /**
10
+ * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts
11
+ */
12
+ export declare const events: {
13
+ PRODUCT_PAGE_VIEW: string;
14
+ };
15
+ export declare function getAdobeDataLayer(): any;
16
+ export declare function publishProductPageViewEvent(product: ProductModel): void;
17
+ //# sourceMappingURL=acdl.d.ts.map
package/lib/date.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function toDateString(value: string, locale?: string): string;
2
+ export declare function isDateValid(dateString: string): boolean;
3
+ //# sourceMappingURL=date.d.ts.map
@@ -0,0 +1,3 @@
1
+ export declare function setUrlParams(params: Record<string, string | number | null>): void;
2
+ export declare function getUrlParams(): Record<string, string>;
3
+ //# sourceMappingURL=url-params.d.ts.map
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-pdp", "version": "0.2.3-alpha3", "@dropins/tools": "0.23.0"}
1
+ {"name": "@dropins/storefront-pdp", "version": "0.2.3-alpha4", "@dropins/tools": "0.25.0"}
@@ -0,0 +1,8 @@
1
+ import { FunctionComponent } from 'preact';
2
+
3
+ interface CartProviderProps {
4
+ children?: any;
5
+ }
6
+ export declare const Provider: FunctionComponent<CartProviderProps>;
7
+ export {};
8
+ //# sourceMappingURL=Provider.d.ts.map
@@ -0,0 +1,2 @@
1
+ export * from './render';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { Render } from '@dropins/tools/types/elsie/src/lib';
2
+
3
+ export declare const render: Render;
4
+ //# sourceMappingURL=render.d.ts.map
package/render.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './render/index'
package/render.js CHANGED
@@ -1,3 +1,2 @@
1
1
  (function(p,t){try{if(typeof document<"u"){const r=document.createElement("style"),e=t.styleId;for(const a in t.attributes)r.setAttribute(a,t.attributes[a]);r.setAttribute("data-dropin",e),r.appendChild(document.createTextNode(p));const o=document.querySelector('style[data-dropin="sdk"]');if(o)o.after(r);else{const a=document.querySelector('link[rel="stylesheet"], style');a?a.before(r):document.head.append(r)}}}catch(r){console.error("dropin-styles (injectCodeFunction)",r)}})(".pdp-carousel{--icon-size: 32px;--icon-extra-padding: 8px;--thumb-peak: 32px;--thumbnails-col-width: 18.6%;position:relative;display:flex;flex-direction:var(--flex-carousel);align-items:center;gap:var(--gap);width:var(--width)}.pdp-carousel--thumbnailsColumn{justify-content:flex-end;align-items:start}.pdp-carousel--thumbnailsRow{align-items:center}.pdp-carousel--arrows{padding-left:calc(var(--icon-size) + var(--icon-extra-padding));padding-right:calc(var(--icon-size) + var(--icon-extra-padding));width:calc(var(--width) - 2 * var(--icon-size) - 2 * var(--icon-extra-padding))}.pdp-carousel__button{position:absolute;top:50%;transform:translateY(-50%);padding:0}.pdp-carousel__button--prev{left:0}.pdp-carousel__button--next{right:0}.pdp-carousel__button__icon--prev{transform:rotate(90deg)}.pdp-carousel__button__icon--next{right:0;transform:rotate(-90deg)}.pdp-carousel--main-image-controls.pdp-carousel--thumbnailsColumn .pdp-carousel__button--prev{left:var(--thumbnails-col-width)}.pdp-carousel--main-image-controls.pdp-carousel--thumbnailsRow .pdp-carousel__button--prev,.pdp-carousel--main-image-controls.pdp-carousel--thumbnailsRow .pdp-carousel__button--next{top:calc(var(--height) / 2)}.pdp-carousel__button--thumbnailsColumn{margin:auto;padding:0}.pdp-carousel__button--thumbnailsRow{padding:0}.pdp-carousel__button__icon--thumbnailsColumn--prev{transform:rotate(180deg)}.pdp-carousel__button__icon--thumbnailsRow--prev{transform:rotate(90deg)}.pdp-carousel__button__icon--thumbnailsRow--next{transform:rotate(-90deg)}.pdp-carousel__wrapper{--peak: 0px;scroll-padding:var(--peak);width:var(--total-width);height:var(--height);display:flex;flex-wrap:nowrap;gap:var(--gap);-webkit-overflow-scrolling:touch}.pdp-carousel__wrapper--horizontal{overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory}.pdp-carousel__slide{display:grid;grid-gap:var(--gap);grid-auto-columns:1fr;grid-auto-rows:100%;scroll-snap-align:end;scroll-snap-stop:always;flex-shrink:0}.pdp-carousel__slide--horizontal{grid-auto-flow:column;width:calc(100% - var(--peak))}.pdp-carousel__slide--horizontal.pdp-carousel__slide--orphan{width:calc((100% / var(--per-page) * var(--length)) - var(--peak) / var(--per-page) * var(--length) - var(--gap) / var(--per-page) * (var(--per-page) - var(--length)))}.pdp-carousel__slide>*{vertical-align:middle;max-width:100%;max-height:100%}.pdp-carousel__slide>img{object-fit:contain;width:100%;height:100%}.pdp-carousel__wrapper--peak{--peak: calc(var(--spacing-medium) + var(--gap))}.pdp-carousel__wrapper--scrollbar{--scroll-foreground: var(--color-neutral-600);--scroll-background: var(--color-neutral-400);scrollbar-color:var(--scroll-foreground) var(--scroll-background);scrollbar-width:thin}.pdp-carousel__wrapper:not(.pdp-carousel__wrapper--scrollbar){scrollbar-width:none}.pdp-carousel__wrapper:not(.pdp-carousel__wrapper--scrollbar)::-webkit-scrollbar{display:none}.pdp-carousel__wrapper--scrollbar::-webkit-scrollbar{width:4px;height:4px}.pdp-carousel__wrapper--scrollbar::-webkit-scrollbar-thumb{background:var(--scroll-foreground)}.pdp-carousel__wrapper--scrollbar::-webkit-scrollbar-track{background:var(--scroll-background)}.pdp-carousel__controls__container--thumbnailsRow{--thumbnails-spacing: var(--spacing-small);--thumbnails-box-width: var(--spacing-xxsmall);--thumbnails-rest: calc(var(--thumbnails-spacing) - var(--thumbnails-box-width));--thumbnails-width: calc((var(--width) - 2 * var(--icon-size) - 4 * var(--thumbnails-spacing) - var(--thumb-peak) - 2 * var(--thumbnails-box-width)) / 4);margin-top:var(--thumbnails-rest);width:var(--width);display:flex}.pdp-carousel__controls__container--thumbnailsColumn{--thumbnails-spacing: var(--spacing-small);--thumbnails-box-width: var(--spacing-xxsmall);--thumbnails-rest: calc(var(--thumbnails-spacing) - var(--thumbnails-box-width));--thumbnails-width: 100%;width:calc(var(--thumbnails-col-width) - var(--thumbnails-rest));margin-right:var(--thumbnails-rest)}.pdp-carousel__controls__container--thumbnailsColumn:not(.pdp-carousel__controls__container--no-arrows){height:calc(max(var(--height),4 * var(--thumbnails-spacing)) - 4 * var(--thumbnails-spacing))}.pdp-carousel__controls__container--thumbnailsColumn.pdp-carousel__controls__container--no-arrows{height:var(--height)}.pdp-carousel__controls__wrapper--thumbnailsColumn{max-height:100%;overflow-y:scroll}.pdp-carousel__controls__wrapper--thumbnailsRow{max-width:100%;overflow-x:scroll}.pdp-carousel__controls--thumbnailsRow>label>span:nth-last-child(1){margin-right:var(--thumbnails-box-width)}.pdp-carousel__controls__wrapper::-webkit-scrollbar{display:none}.pdp-carousel__controls__wrapper{-ms-overflow-style:none;scrollbar-width:none}.pdp-carousel__controls{display:flex;flex-direction:row;gap:var(--spacing-xsmall)}.pdp-carousel__controls--thumbnailsColumn{display:grid;grid-template-columns:repeat(1,1fr);grid-auto-rows:1fr;grid-row-gap:var(--thumbnails-spacing);padding:var(--thumbnails-box-width)}.pdp-carousel__controls--thumbnailsRow{grid-column-gap:var(--thumbnails-spacing);padding:var(--thumbnails-box-width)}.pdp-carousel__controls__button{border-radius:50%;width:10px;height:10px;padding:0;border:none;background:var(--color-neutral-400);cursor:pointer}.pdp-carousel__controls__button:hover{background:var(--color-neutral-500)}.pdp-carousel__controls__button:active,.pdp-carousel__controls__button--active{background:var(--color-neutral-600)}.pdp-carousel__slide--last{width:100%}.pdp-carousel__thumbnail__container input[type=radio]{opacity:0;position:absolute;width:0;height:0}.pdp-carousel__thumbnail__container .pdp-carousel__thumbnail__span{display:inline-block;--bg-color: var(--color-neutral-300);box-shadow:0 0 0 var(--shape-border-width-1) var(--color-neutral-400);position:relative;cursor:pointer;background-color:var(--bg-color);background-image:var(--background-image);background-repeat:no-repeat;background-size:cover;height:100%;width:100%;overflow:hidden}.pdp-carousel__thumbnail__content{width:inherit;position:absolute;top:-9999px;bottom:-9999px;left:-9999px;right:-9999px;margin:auto;overflow:hidden}.pdp-carousel__thumbnail__span:hover{box-shadow:0 0 0 var(--shape-border-width-3) var(--color-neutral-50),0 0 0 var(--shape-border-width-4) var(--color-neutral-500);outline:none}.pdp-carousel__controls__wrapper--thumbnailsRow .pdp-carousel__thumbnail__container{min-width:100px}.pdp-carousel__thumbnail__container input[type=radio]:not(:checked):active~.pdp-carousel-thumbnail__span{box-shadow:0 0 0 var(--shape-border-width-1) var(--color-neutral-500);outline:none}.pdp-carousel__thumbnail__container input[type=radio]:checked~.pdp-carousel__thumbnail__span,.pdp-carousel__thumbnail--selected{box-shadow:0 0 0 var(--shape-border-width-3) var(--color-neutral-50),0 0 0 var(--shape-border-width-4) var(--color-neutral-800)}.pdp-carousel__thumbnail__container input[type=radio]:checked:active~.pdp-carousel__thumbnail__span{box-shadow:0 0 0 var(--shape-border-width-3) var(--color-neutral-50),0 0 0 var(--shape-border-width-4) var(--color-neutral-600)}.pdp-carousel__thumbnail__container input[type=radio]:focus-visible+.pdp-carousel__thumbnail__span{box-shadow:0 0 0 var(--shape-border-width-3) var(--color-neutral-900),0 0 0 6px var(--color-neutral-400)}.pdp-carousel__thumbnail__span>img{object-fit:cover;width:100%;height:100%}.pdp-product{display:grid;grid-template-columns:repeat(var(--grid-1-columns),1fr);grid-column-gap:var(--grid-1-gutters);margin:0 var(--grid-1-margins)}.pdp-product__gallery-column{display:none}.pdp-product__content-column{grid-column:1 / span 4;color:var(--color-neutral-800)}.pdp-product__header{display:grid;grid-auto-rows:max-content;margin-bottom:var(--spacing-medium)}.pdp-product__breadcrumbs{grid-column:1 / -1;padding:var(--spacing-medium) 0 var(--spacing-xxbig)}.pdp-product__title{font:var(--type-display-3-font);letter-spacing:var(--type-display-3-letter-spacing);margin:0}.pdp-product__sku{font:var(--type-body-1-default-font);max-width:600px}.pdp-product__prices{display:flex;gap:var(--spacing-xsmall);margin-top:var(--spacing-medium)}.pdp-product__out-of-stock__text{font:var(--type-headline-2-strong-font)}.pdp-product__options{grid-column:1 / span 4}.pdp-product__price,.pdp-product__price-special{font:var(--type-headline-2-strong-font)}.pdp-product__price,.pdp-product__sku,.pdp-product__price-special,.pdp-product__out-of-stock__text{letter-spacing:var(--type-headline-2-strong-letter-spacing)}.pdp-product__price--grey{color:var(--color-neutral-500)}.pdp-product__actions,.pdp-product__actions--out-of-stock{display:grid;grid-auto-flow:row;gap:var(--grid-1-gutters);grid-auto-rows:max-content;margin-bottom:var(--spacing-xxbig);margin-top:var(--spacing-big)}.pdp-product__short_description,.pdp-product__attributes{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing);margin-bottom:var(--spacing-small)}.pdp-product__description,.pdp-product__attributes li{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.pdp-product__attributes{margin-top:var(--spacing-xsmall)}.pdp-product__short_description p,.pdp-product__description p,.pdp-product__attributes li p{margin:0}.pdp-product__short_description figure,.pdp-product__description figure{margin:0}.pdp-product__short_description img,.pdp-product__description img{max-width:100%}.pdp-product__images--carousel{max-height:60vh}.pdp-product__images--carousel--thumbnails{max-height:90vh}.pdp-product__images__placeholder{background-color:var(--color-neutral-200)}.pdp-product__buttons{display:grid;grid-auto-rows:max-content;grid-gap:var(--grid-1-gutters)}.pdp-product__buttons a{text-align:center}.pdp-product__buttons a:hover{text-decoration:none}.pdp-product__overlay .pdp-overlay__content{width:100%;height:100%}.pdp-product__overlay__carousel{width:100%;height:100%;box-sizing:border-box}.pdp-product__overlay__carousel img{width:100%;height:100%;object-fit:contain}.pdp-carousel__controls__container--thumbnailsRow img,.pdp-carousel__controls__container--thumbnailsColumn img{object-fit:cover}.pdp-product__quantity,.pdp-product__buttons{grid-column:1 / span 4}@media only screen and (min-width: 1024px){.pdp-product__breadcrumbs{grid-column:2 / -2}.pdp-product{grid-template-columns:repeat(var(--grid-3-columns),1fr);grid-column-gap:var(--grid-3-gutters);margin:0 var(--grid-3-margins);position:relative}.pdp-product__column-container{position:relative;display:flex;flex-direction:column}.pdp-product__column-body{position:sticky;bottom:30%;align-self:flex-end}.pdp-product__gallery-column{display:block;grid-column:2 / span 6}.pdp-product__content-column{grid-column:8 / span 4;padding-top:var(--spacing-medium)}.pdp-product__images--carousel{display:none}.pdp-product__header{margin-bottom:var(--spacing-small)}.pdp-product__actions{grid-template-columns:repeat(var(--grid-1-columns),1fr);grid-column-gap:var(--grid-1-gutters);grid-row-gap:var(--spacing-xxbig);margin-top:var(--spacing-xxbig)}.pdp-product__quantity{grid-column:1 / span 2}.pdp-product__actions--out-of-stock{grid-template-columns:repeat(var(--grid-1-columns),1fr);grid-column-gap:var(--grid-1-gutters);grid-row-gap:var(--spacing-xxbig);margin-top:var(--spacing-small)}.pdp-product__buttons{grid-column:1 / span 4}.pdp-product__out-of-stock__text{grid-column:1 / span 2}.pdp-product__gallery-content,.pdp-product__content{grid-column:2 / span 6}}.pdp-gallery-grid{display:grid;grid-gap:var(--gap);grid-template-columns:repeat(1,1fr);grid-auto-rows:max-content}.pdp-gallery-grid__item>*{height:100%;max-width:100%;min-width:100%;vertical-align:middle;width:100%;object-fit:contain}.pdp-gallery-grid__item:only-child{grid-column:1 / span 2}.pdp-gallery-grid__item:first-child:nth-last-child(2){grid-column:1 / span 2;grid-row:1}.pdp-gallery-grid__item:nth-child(2):last-child{grid-column:1 / 3;grid-row:2}@media only screen and (min-width: 1024px){.pdp-gallery-grid{grid-template-columns:repeat(2,1fr)}}.pdp-price-range .dropin-price{letter-spacing:var(--type-headline-2-strong-letter-spacing);font:var(--type-headline-2-strong-font)}.pdp-price-range__label{font:var(--type-headline-2-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing);margin-left:5px;margin-right:5px}.pdp-overlay{position:fixed;top:0;left:0;z-index:1000;right:0;bottom:0;background-color:var(--color-neutral-50);display:flex;padding:var(--spacing-medium)}.pdp-overlay--centered{align-items:center;justify-content:center}.pdp-overlay__close-button{position:absolute;top:var(--spacing-medium);right:var(--spacing-medium);z-index:1001}.pdp-swatches{display:grid;grid-auto-flow:row;grid-gap:var(--grid-1-gutters);grid-auto-rows:max-content}.pdp-swatches__field{display:grid;font:var(--type-body-2-strong-font);grid-auto-rows:max-content;gap:var(--spacing-xsmall)}.pdp-swatches__field__label{font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing);color:var(--color-neutral-800)}.pdp-swatches__options{display:flex;flex-wrap:wrap;gap:var(--spacing-xsmall)}",{styleId:"PDP"});
2
2
  import{deepmerge as c,Render as u}from"@dropins/tools/lib.js";import{useState as f,useEffect as m}from"@dropins/tools/preact-hooks.js";import{UIProvider as b}from"@dropins/tools/components.js";import{events as d}from"@dropins/tools/event-bus.js";import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{c as g}from"./chunks/initialize.js";const P={Product:{Incrementer:{label:"Item Quantity"},OutOfStock:{label:"Out of Stock"},AddToCart:{label:"Add to Cart"},Details:{label:"Details"},RegularPrice:{label:"Regular Price"},SpecialPrice:{label:"Special Price"},PriceRange:{From:{label:"From"},To:{label:"to"}},Image:{label:"{product} Image {key} of {total}"}},Swatches:{Required:{label:"Required"}},Carousel:{label:"Carousel",Next:{label:"Next"},Previous:{label:"Previous"},Slide:{label:"Slide"},Controls:{label:"Carousel Controls",Button:{label:"Show slide {key} of {total}"}}},Overlay:{Close:{label:"Close"}}},C={quantityLabel:"Passengers"},p={PDP:P,Custom:C},S={default:p},D=({children:a})=>{var t;const[e,i]=f(),n=(t=g.getConfig())==null?void 0:t.langDefinitions;m(()=>{const o=d.on("locale",l=>{l!==e&&i(l)},{eager:!0});return()=>{o==null||o.off()}},[e]);const s=c(S,n??{});return r(b,{lang:e,langDefinitions:s,children:a})},O=new u(r(D,{}));export{O as render};
3
- //# sourceMappingURL=render.js.map
package/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"getRefinedProduct.js","sources":["../../src/api/fetch-graphql/fetch-graphql.ts","../../src/data/transforms/product-transform.ts","../../src/api/graphql/ProductOptionFragment.graphql.ts","../../src/api/graphql/ProductFragment.graphql.ts","../../src/api/getProductData/graphql/getProductData.graphql.ts","../../src/api/getProductData/getProductData.ts","../../src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","../../src/api/getRefinedProduct/getRefinedProduct.ts"],"sourcesContent":["import { FetchGraphQL } from '@adobe/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","import { config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\n\nexport function transformProductData(data: any): ProductModel | null {\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n prices: transformPrices(data),\n attributes: transformAttributes(data),\n options: transformOptions(data),\n optionUIDs: data.optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n } as ProductModel)\n : null;\n\n const transform = config.getConfig()?.models?.ProductDetails?.transform;\n if (transform && productData) {\n return transform(productData);\n }\n\n return productData;\n}\n\nfunction transformImages(data: any) {\n return data.images?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n return { id: name, label, value: value.toString().split(',').join(', ') };\n })\n );\n}\n\nfunction transformOptions(data: any) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: any = values?.[0].type;\n\n const isBundle = values?.[0]?.__typename === 'ProductViewOptionValueProduct';\n\n if (isBundle) {\n type = undefined;\n } else {\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n label: title,\n inStock,\n value: type?.toLowerCase() === 'dropdown' ? id : value?.replace(/^https?:/, ''),\n selected: optionUIDs?.indexOf(id) > -1,\n };\n }),\n };\n });\n}\n\nfunction transformPrices(data: any) {\n const { price, priceRange, __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price.regular.amount.value;\n const finalPrice = price.final?.amount.value ?? price.regular.amount.value;\n\n const currency = price.regular.amount.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular.amount.currency\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (priceRange?.minimum?.regular?.amount.value === priceRange?.maximum?.regular?.amount.value) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency = priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] = type === 'SimpleProductView'\n ? getSimpleProductPrices() : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n if (finalMaximumPrice && finalMinimumPrice === finalMaximumPrice) {\n const hasDiscount = regularPrice && finalMinimumPrice !== regularPrice;\n\n return {\n regular: {\n amount: regularPrice,\n currency,\n variant: hasDiscount ? 'strikethrough' : 'default',\n },\n final: {\n amount: finalMaximumPrice,\n currency,\n variant: 'default',\n },\n visible\n }\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency\n },\n visible\n }\n}\n","export const ProductOptionFragment = `\nfragment ProductOptionFragment on ProductViewOption {\n id\n title\n required\n multi\n values {\n id\n title\n inStock\n __typename\n ... on ProductViewOptionValueProduct {\n title\n quantity\n isDefault\n product {\n sku\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n name\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n ... on ProductViewOptionValueSwatch {\n id\n title\n type\n value\n inStock\n }\n }\n }\n`;\n","import { ProductOptionFragment } from '@/pdp/api/graphql/ProductOptionFragment.graphql';\n\nexport const ProductFragment = `\nfragment ProductFragment on ProductView {\n __typename\n id\n sku\n name\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n description\n inStock\n addToCartAllowed\n url\n urlKey\n externalId\n\n images(roles: []) {\n url\n label\n roles\n }\n\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n\n... on SimpleProductView {\n price {\n roles\n\n regular {\n amount {\n value\n currency\n }\n }\n\n final {\n amount {\n value\n currency\n }\n }\n }\n}\n\n\n ... on ComplexProductView {\n options {\n ...ProductOptionFragment\n }\n\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n}\n\n${ProductOptionFragment}\n`;\n","import { ProductFragment } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...ProductFragment\n }\n}\n\n${ProductFragment}\n`;\n","import { config, fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\n\nexport const getProductData = async (\n sku: string\n): Promise<ProductModel | null> => {\n\n const initialData = config?.getConfig()?.models?.ProductDetails?.initialData;\n\n if (initialData) {\n return transformProductData(initialData);\n }\n\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n return transformProductData(product);\n};\n","import { ProductFragment } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...ProductFragment\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...ProductFragment\n }\n\n # %extendedPlaceholder%\n}\n\n${ProductFragment}\n`;\n","import { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n const optionPairCombinations = getPairCombination(optionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: optionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[]\n): Promise<ProductModel | null> => {\n\n const data = await getProductData(sku, optionUIDs);\n\n if (!data) return null;\n let { products, refineProduct, ...refinedOptions } = data;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options, anchorOptions\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const refinedData = transformProductData({\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku: refineProduct?.__typename === 'SimpleProductView' ? refineProduct?.sku : undefined,\n });\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...ProductOptionFragment\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(options: {}, parent: [], anchorOptions?: string[]) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(options: any[], optionsUIDs: string[], anchorOptions: string[]): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue = option.values?.find((value: any) => optionsUIDs.includes(value?.id))?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","getMethods","transformProductData","data","productData","name","sku","addToCartAllowed","inStock","shortDescription","metaDescription","metaKeyword","metaTitle","description","images","transformImages","prices","transformPrices","attributes","transformAttributes","options","transformOptions","optionUIDs","url","urlKey","externalId","externalParentId","variantSku","transform","config","models","ProductDetails","map","image","replace","filter","roles","indexOf","label","value","id","toString","split","join","title","required","multi","values","typename","__typename","type","undefined","multiple","items","toLowerCase","selected","price","priceRange","getSimpleProductPrices","regularPrice","regular","amount","finalPrice","final","currency","getComplexProductPrices","finalMinimumPrice","minimum","finalMaximumPrice","maximum","visible","includes","variant","minimumAmount","maximumAmount","ProductOptionFragment","ProductFragment","GET_PRODUCT_DATA","getProductData","initialData","method","variables","skus","product","products","REFINE_PRODUCT_QUERY","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","optionIds","getRefinedProduct","anchorOptions","refineProduct","refinedOptions","parent","mergeRefinedOptions","Object","length","updateSelections","updatedRefinedData","refinedData","fallback","fallbackData","arr","result","forEach","item","temp","item2","push","ids","i","x","reduce","acc","curr","Map","current","set","optionsUIDs","updatedOptionsUIDs","optionValue","option","find"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"initialize.js","sources":["../../src/api/initialize/initialize.ts"],"sourcesContent":["import { Initializer } from '@adobe/elsie/lib';\nimport { Lang } from '@adobe/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n defaultLocale?: string;\n models?: {\n [name: string]: {\n initialData: any;\n transform: (data?: ProductModel) => ProductModel;\n fallbackData?: (parentProduct: any, simpleProduct: ProductModel) => ProductModel;\n }\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = { defaultLocale: 'en-US' };\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\n"],"names":["initialize","Initializer","init","config","defaultConfig","defaultLocale","setConfig","listeners"],"mappings":"oDAgBaA,MAAAA,EAAa,IAAIC,EAAyB,CACrDC,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAgB,CAAEC,cAAe,OAAA,EACvCL,EAAWG,OAAOG,UAAU,CAAE,GAAGF,EAAe,GAAGD,CAAAA,CAAQ,CAC7D,EAEAI,UAAWA,IAAM,CAAA,CACnB,CAAC,EAEYJ,EAASH,EAAWG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProductDetails.js","sources":["../../node_modules/@adobe/elsie/src/icons/ChevronDown.svg","../../node_modules/@adobe/elsie/src/icons/Close.svg","../../src/components/Carousel/Carousel.tsx","../../src/components/Product/Product.tsx","../../src/components/GalleryGrid/GalleryGrid.tsx","../../src/components/PriceRange/PriceRange.tsx","../../src/components/Overlay/Overlay.tsx","../../src/components/Swatches/Swatches.tsx","../../src/lib/date.ts","../../src/lib/url-params.ts","../../src/data/transforms/acdl-context.ts","../../src/lib/acdl.ts","../../src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","import { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n Children,\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from 'preact/compat';\nimport { classes, debounce } from '@adobe/elsie/lib';\nimport { Button, Icon } from '@adobe/elsie/components';\nimport { ChevronDown } from '@adobe/elsie/icons';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport '@/pdp/components/Carousel/Carousel.css';\n\ntype Show = number;\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n children: VNode[] | VNode;\n thumbnails?: VNode[] | VNode;\n show?: Show | { small: Show; medium: Show; large: Show };\n gap?: 'small' | 'medium' | 'large' | null;\n scrollbar?: boolean;\n peak?: boolean;\n arrows?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loop?: boolean;\n direction?: 'horizontal';\n style?: Record<string, string | number>;\n width?: string;\n height?: string;\n defaultIndex?: number;\n infinite?: boolean;\n isZoomed?: boolean;\n}\n\nexport const Carousel: FunctionComponent<CarouselProps> = ({\n show = 1,\n scrollbar = false,\n peak = false,\n arrows = false,\n controls = 'dots',\n arrowsOnMainImage = false,\n loop = false,\n gap = null,\n direction = 'horizontal',\n width = '100%',\n height = '100%',\n defaultIndex = 0,\n className,\n children,\n thumbnails = null,\n isZoomed,\n ...props\n}) => {\n // i18n\n const Label = useText('PDP.Carousel.label').label;\n const SlideLabel = useText('PDP.Carousel.Slide.label').label;\n const PreviousLabel = useText('PDP.Carousel.Previous.label').label;\n const NextLabel = useText('PDP.Carousel.Next.label').label;\n const ControlsLabel = useText('PDP.Carousel.Controls.label').label;\n const ControlsBtnLabel = useText('PDP.Carousel.Controls.Button.label').label;\n\n // States\n const [perPage, setPerPage] = useState(() => getPerPageFromBreakpoint(show));\n\n // Constants\n const length = Math.ceil(Children.toArray(children).length / perPage);\n const gapSizes = { small: 16, medium: 24, large: 64 };\n const peakWidth = peak ? 24 : 0;\n const gapWidth = gap ? gapSizes[gap] : 0;\n const rest = Children.toArray(children).length % perPage;\n const thumbGap = 16;\n const thumbSeen = 2;\n const iconSize = '32';\n\n // States\n const [current, setCurrent] = useState(\n loop ? defaultIndex + 1 : defaultIndex\n );\n\n // Thumbnails\n const thumbnailsRefs = useRef<HTMLLabelElement[]>([]);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbHeight, setThumbHeight] = useState(0);\n \n const thumbnailSlides = useMemo<VNode[]>(() => {\n return Children.toArray(thumbnails);\n }, [thumbnails]);\n\n // Slides\n const slides = useMemo<VNode[][]>(() => {\n const returnValue = Children.toArray(children).reduce((acc, child, i) => {\n if (i % perPage === 0) {\n return [...acc, [child]];\n }\n\n return [...acc.slice(0, -1), [...acc[acc.length - 1], child]];\n }, [] as VNode[][]);\n\n if (!loop || returnValue.length === 1) {\n return returnValue;\n }\n\n if (loop && !(Children.toArray(children).length % perPage !== 0)) {\n return [returnValue[length - 1]]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }\n\n return [Children.toArray(children).slice(-perPage)]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }, [children, perPage, length, loop]);\n\n // Wrapper\n const wrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailsWrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailControls = controls === 'thumbnailsRow' || controls === 'thumbnailsColumn';\n\n // Observe Window Resize (responsive)\n useEffect(() => {\n const wrapper = document.body;\n\n const handleResize = debounce(() => {\n setThumbWidth(wrapperRef.current?.offsetWidth ?? 0)\n setThumbHeight(wrapperRef.current?.offsetHeight ?? 0)\n const width = window.innerWidth;\n const newPerPage = getPerPageFromBreakpoint(show, width);\n\n if (newPerPage !== perPage) {\n setPerPage(newPerPage);\n }\n }, 50);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapper);\n\n return () => {\n observer.unobserve(wrapper);\n };\n }, [perPage, show]);\n\n // Scrolling logic controls\n const handleThumbnailsScroll = useCallback((nextSlideIndex: number) => {\n const nextItem = loop ? nextSlideIndex - 1 : nextSlideIndex;\n const thumbnailRef = thumbnailsRefs?.current[0];\n const oneItemWidth = thumbnailRef?.offsetWidth + thumbGap;\n const oneItemHeight = thumbnailRef?.offsetHeight + thumbGap;\n const thumbnailsWrapper = thumbnailsWrapperRef.current!;\n\n if (controls === 'thumbnailsRow' && thumbnailsWrapper?.offsetWidth) {\n if (oneItemWidth * (nextItem + 1) > thumbnailsWrapper.offsetWidth) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem + thumbSeen) * oneItemWidth;\n }\n\n if (thumbnailsWrapper.scrollLeft > oneItemWidth * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem - thumbSeen) * oneItemWidth;\n }\n }\n\n if (controls === 'thumbnailsColumn' && thumbnailsWrapper?.offsetHeight) {\n if (oneItemHeight * (nextItem + 1) > thumbnailsWrapper.offsetHeight) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem + thumbSeen) * oneItemHeight;\n }\n\n if (thumbnailsWrapper.scrollTop > oneItemHeight * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem - thumbSeen) * oneItemHeight;\n }\n }\n }, [controls, loop]);\n\n // Navigation\n const handleScrollTo = useCallback(\n (nextSlideIndex: number, smooth?: boolean, reset?: boolean) => {\n if (controls === 'thumbnailsRow' || controls === 'thumbnailsColumn') {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n\n const items = Array.from(wrapper.querySelectorAll('[data-index]')).filter(\n (element) => {\n const dataIndex = Number(element.getAttribute('data-index')!);\n return !isNaN(dataIndex) && dataIndex > -1;\n }\n );\n\n const item = items[nextSlideIndex];\n\n if (!item) {\n return;\n }\n\n if (reset) {\n const futureIndex = nextSlideIndex === 0 ? length : 0;\n const scrollWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (wrapper.scrollLeft >= 0 && wrapper.scrollLeft < realWidth - 5) {\n handleScrollTo(1, true);\n return;\n }\n\n if (\n wrapper.scrollLeft > scrollWidth - realWidth &&\n wrapper.scrollLeft <= scrollWidth\n ) {\n handleScrollTo(length, true);\n return;\n }\n\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = futureIndex === 0 ? 0 : scrollWidth;\n handleScrollTo(futureIndex === 0 ? 1 : length, true);\n return;\n }\n\n const diff =\n ((wrapper.offsetWidth - gapWidth) / perPage) *\n slides[nextSlideIndex].length -\n peakWidth;\n\n wrapper.style.scrollBehavior = smooth ? 'smooth' : 'auto';\n wrapper.scrollLeft =\n slides[nextSlideIndex].length === perPage\n ? realWidth * nextSlideIndex\n : realWidth * (nextSlideIndex - 1) + diff;\n return;\n },\n [gapWidth, length, peakWidth, perPage, rest, slides, handleThumbnailsScroll, controls]\n );\n\n const handleGoToPrev = useCallback(() => {\n if (loop) {\n const nextSlideIndex = current - 1;\n handleScrollTo(nextSlideIndex, true, current === 1);\n return;\n }\n\n const nextSlideIndex = current <= 0 ? 0 : current - 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [current, handleScrollTo, loop]);\n\n const handleGoToNext = useCallback(() => {\n const lastSlideIndex = slides.length - 1;\n\n if (loop) {\n const nextSlideIndex = current + 1;\n handleScrollTo(nextSlideIndex, true, current === length);\n return;\n }\n\n const nextSlideIndex =\n current >= lastSlideIndex ? lastSlideIndex : current + 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [slides.length, loop, current, handleScrollTo, length]);\n\n // Navigate with keyboard\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n handleGoToPrev();\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleGoToNext();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleGoToNext, handleGoToPrev]);\n\n // Set default index\n useEffect(() => {\n handleScrollTo(loop ? defaultIndex + 1 : defaultIndex, false);\n }, [defaultIndex, handleScrollTo, loop]);\n\n // Track scrolling (swipes)\n const handleOnScroll = debounce(() => {\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n const dividing = wrapper.scrollLeft / realWidth;\n const nextSlideIndex = Math.round(dividing) - dividing < 1 ? Math.round(dividing) : Math.ceil(dividing);\n\n if (thumbnailControls) {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n if (loop) {\n const totalWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (Math.ceil(wrapper.scrollLeft) >= Math.ceil(totalWidth) - 5) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft =\n wrapper.offsetWidth * 1 +\n (Math.ceil(wrapper.scrollLeft) - Math.ceil(totalWidth) - peakWidth);\n return;\n }\n\n if (wrapper.scrollLeft === 0) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = totalWidth - wrapper.offsetWidth + peakWidth;\n return;\n }\n }\n\n if (current !== nextSlideIndex) {\n setCurrent(nextSlideIndex);\n }\n }, 100);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n wrapper?.addEventListener('scroll', handleOnScroll);\n\n return () => {\n wrapper?.removeEventListener('scroll', handleOnScroll);\n };\n }, [handleOnScroll]);\n\n // thumbnails is column -> container is row reverse, controls is column\n // thumbnails is row -> container is column, controls is row\n const getArrow = (forThumbnails: boolean, direction: string, callback: () => void) => {\n return <Button\n className={classes([\n ['pdp-carousel__button', !forThumbnails],\n [`pdp-carousel__button--${direction}`, !forThumbnails],\n [`pdp-carousel__button--${controls}`, forThumbnails]\n ])}\n style={{\n '--height': `${thumbHeight}px`,\n }}\n variant=\"tertiary\"\n aria-label={direction === 'next' ? NextLabel : PreviousLabel}\n onClick={callback}\n disabled={loop ? false : direction === 'next' ? current >= slides.length - 1 : current < 1}\n >\n <Icon\n className={classes([\n ['pdp-carousel__button__icon', !forThumbnails],\n [`pdp-carousel__button__icon--${direction}`, !forThumbnails],\n [`pdp-carousel__button__icon--${controls}--${direction}`, forThumbnails]\n ])}\n size={iconSize}\n source={ChevronDown}\n />\n </Button>\n }\n\n const prevArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'prev', handleGoToPrev);\n\n const nextArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'next', handleGoToNext);\n\n const prevArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'prev', handleGoToPrev);\n \n const nextArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'next', handleGoToNext);\n\n return (\n <div\n role=\"region\"\n aria-roledescription={Label}\n className={classes([\n 'pdp-carousel',\n ['pdp-carousel--main-image-controls', arrowsOnMainImage],\n ['pdp-carousel--arrows', arrows && !thumbnailControls],\n [`pdp-carousel--${controls}`, thumbnailControls],\n className,\n ])}\n style={{\n '--flex-carousel': controls === 'thumbnailsColumn' ? 'row-reverse' : 'column',\n '--gap': thumbnailControls ? '0' : 'var(--spacing-small)',\n '--width': width,\n }}\n {...props}\n >\n\n {/* Slideshow */}\n <div\n ref={wrapperRef}\n className={classes([\n 'pdp-carousel__wrapper',\n `pdp-carousel__wrapper--${direction}`,\n ['pdp-carousel__wrapper--scrollbar', scrollbar],\n ['pdp-carousel__wrapper--peak', peak],\n ])}\n style={{\n '--total-width': controls === 'thumbnailsColumn' ? `81.6%` : `100%`,\n '--height': controls === 'thumbnailsColumn' ? 'auto' : height,\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n '--per-page': perPage,\n }}\n tabIndex={0}\n >\n {slides.map((page, index) => {\n const orphan = page.length < perPage;\n\n return (\n <div\n key={index}\n role=\"group\"\n aria-roledescription={SlideLabel}\n data-index={index}\n className={classes([\n 'pdp-carousel__slide',\n `pdp-carousel__slide--${direction}`,\n ['pdp-carousel__slide--active', current === index],\n ['pdp-carousel__slide--orphan', orphan],\n ])}\n style={{\n '--length': page.length,\n }}\n >\n {page}\n </div>\n );\n })}\n </div>\n\n {/* Previous and next arrows for Carousel without thumbnails */}\n {\n (!thumbnailControls) && (\n <>\n {prevArrow}\n {nextArrow}\n </>\n )\n }\n\n {\n (thumbnailControls && arrowsOnMainImage) && (\n <>\n {prevArrowMainImage}\n {nextArrowMainImage}\n </>\n )\n }\n\n {/* Controls */}\n {controls && slides.length != 1 && (\n <div\n className={classes([\n [`pdp-carousel__controls__container--${controls}`, thumbnailControls],\n ['pdp-carousel__controls__container--no-arrows', !arrows || arrowsOnMainImage],\n ])}\n style={{\n '--width': controls === 'thumbnailsRow' ? `${thumbWidth}px` : width,\n '--height': `${thumbHeight}px`,\n '--nr-thumbnails': thumbnailSlides.length,\n }}\n >\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && prevArrow}\n <div\n ref={thumbnailsWrapperRef}\n className={classes([\n [`pdp-carousel__controls__wrapper--${controls}`, thumbnailControls],\n [`pdp-carousel__controls__wrapper`, thumbnailControls],\n ])}\n >\n <div\n role=\"group\"\n aria-label={ControlsLabel}\n className={classes([\n 'pdp-carousel__controls',\n [`pdp-carousel__controls--${controls}`, thumbnailControls],\n ])}\n >\n {(loop ? slides.slice(0, length) : slides).map((_, key) => {\n const buttonsLength = loop ? length : slides.length;\n const active = loop ? current - 1 === key : current === key;\n\n if (!thumbnailControls) {\n return (\n <button\n key={key}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n onClick={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n className={classes([\n 'pdp-carousel__controls__button',\n ['pdp-carousel__controls__button--active', active],\n ])}\n />\n );\n }\n return (\n <label\n className={classes(['pdp-carousel__thumbnail__container'])}\n key={key}\n ref={(el: HTMLLabelElement | null) => {\n if (el) {\n thumbnailsRefs.current[key] = el;\n }\n }}\n >\n <input\n type=\"radio\"\n name={\"carousel-thumbnails\"}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n checked={active && thumbWidth !== 0}\n onChange={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n {...props}\n className={classes([\n 'pdp-carousel__thumbnail',\n ['pdp-carousel__thumbnail--selected', active && thumbWidth !== 0],\n ])}\n />\n\n <span\n className={classes([\n 'pdp-carousel__thumbnail__span',\n ])}\n >\n {thumbnailSlides[key]}\n </span>\n </label>\n )\n })}\n </div>\n </div>\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && nextArrow}\n </div>\n )}\n </div>\n );\n};\n\n// Utilities\nfunction getPerPageFromBreakpoint(\n breakpoints:\n | {\n small: number;\n medium: number;\n large: number;\n }\n | number,\n width = 0\n) {\n if (typeof breakpoints === 'number') return breakpoints;\n\n const { small, medium, large } = breakpoints;\n const mediumViewport = 786;\n const largeVierport = 1024;\n\n if (width > largeVierport) return large;\n if (width > mediumViewport) return medium;\n return small;\n}\n","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport { Carousel, GalleryGrid, Overlay } 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}\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 ...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 <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : '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 onClick={() => setZoom(key)}\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 <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 {\n carouselConfig?.controls ?\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? carouselConfig.controls : 'dots'}\n arrowsOnMainImage={carouselConfig?.arrowsOnMainImage}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.desktop || false}\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\n node={title}\n className=\"pdp-product__title\"\n />\n )}\n\n {sku && (\n <VComponent node={sku} className=\"pdp-product__sku\" />\n )}\n </div>\n\n <div className=\"pdp-product__prices\">\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes(['pdp-product__price-special', 'pdp-product__price'])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes(['pdp-product__price-regular', 'pdp-product__price--grey'])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n </div>\n\n {/* Small Screen Gallery */}\n {\n carouselConfig?.mobile ?\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={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.mobile || false}\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 </div>\n\n {productContent && (\n <VComponent\n node={productContent}\n className=\"pdp-product__content\"\n />\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={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","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, Children } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/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","/*\nADOBE CONFIDENTIAL\nCopyright 2023 Adobe\nAll Rights Reserved.\nNOTICE: All information contained herein is, and remains\nthe property of Adobe and its suppliers, if any. The intellectual\nand technical concepts contained herein are proprietary to Adobe\nand its suppliers and are protected by all applicable intellectual\nproperty laws, including trade secret and copyright laws.\nDissemination of this information or reproduction of this material\nis strictly forbidden unless prior written permission is obtained\nfrom Adobe.\n*/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport '@/pdp/components/PriceRange/PriceRange.css';\nimport { FunctionalComponent } from 'preact';\nimport { Price } from '@adobe/elsie/components';\n\nexport interface PriceRangeProps extends HTMLAttributes<HTMLDivElement> {\n locale?: string;\n variant?: 'default' | 'strikethrough';\n currency?: string;\n\n // Simple product\n amount?: number;\n sale?: boolean;\n\n // Complex product (range)\n minimumAmount?: number;\n maximumAmount?: number;\n}\n\nexport const PriceRange: FunctionalComponent<PriceRangeProps> = ({\n amount,\n currency,\n locale,\n variant,\n sale,\n minimumAmount,\n maximumAmount,\n className,\n ...props\n}) => {\n return (\n <>\n {amount || minimumAmount === maximumAmount ? (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={amount ? amount : minimumAmount}\n currency={currency}\n locale={locale}\n variant={variant}\n sale={sale}\n className={className}\n />\n </div>\n ) : (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={minimumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n <span className=\"pdp-price-range__label\">{'-'}</span>\n <Price\n amount={maximumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n </div>\n )}\n </>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { Close as CloseSVG } from '@adobe/elsie/icons';\nimport { Button } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Overlay/Overlay.css';\n\nexport interface OverlayProps extends HTMLAttributes<HTMLDivElement> {\n centered?: boolean;\n onClose?: () => void;\n}\n\nexport const Overlay: FunctionComponent<OverlayProps> = ({\n centered,\n onClose,\n className,\n children,\n ...props\n}) => {\n // i18n\n const CloseLabel = useText('PDP.Overlay.Close.label').label;\n\n const handleOnClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n // Close on ESC\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleOnClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleOnClose]);\n\n // Prevent document scrolling\n useEffect(() => {\n const scrollingElement = document.scrollingElement as HTMLElement;\n\n const defaultOverflowValue = scrollingElement.style.overflow;\n\n scrollingElement.style.overflow = 'hidden';\n\n return () => {\n scrollingElement.style.overflow = defaultOverflowValue;\n };\n }, []);\n\n return (\n <div\n {...props}\n className={classes([\n 'pdp-overlay',\n ['pdp-overlay--centered', centered],\n className,\n ])}\n >\n <div className=\"pdp-overlay__content\">{children}</div>\n\n <Button\n aria-label={CloseLabel}\n variant=\"tertiary\"\n className=\"pdp-overlay__close-button\"\n onClick={handleOnClose}\n icon={<CloseSVG />}\n />\n </div>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useState, useMemo, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { ColorSwatch, ImageSwatch, TextSwatch, Picker, PickerOption } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Swatches/Swatches.css';\n\nconst supportedTypes = ['text', 'image', 'color', 'dropdown'];\n\nconst mapToPickerOptions = (items: OptionValue[]): PickerOption[] => {\n return items.map((item: OptionValue) => ({ ...item, text: item.label, disabled: !item.inStock, }));\n}\n\ntype OptionValue = {\n id: string;\n label: string;\n inStock: boolean;\n value: string;\n selected?: boolean;\n};\n\nexport type Option = {\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n};\n\ntype Selection = { [id: string]: { label: string; value: string } };\n\nexport interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {\n options: Array<{\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n }>;\n hideSelectedValue?: boolean;\n\n defaultOptions?: string[];\n selectionsToUpdate?: Option[];\n onValues?: (uids: Selection, current: string) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n}\n\nexport const Swatches: FunctionComponent<SwatchesProps> = ({\n options,\n hideSelectedValue,\n onValues,\n onErrors,\n defaultOptions,\n selectionsToUpdate,\n className,\n children,\n ...props\n}) => {\n // i18n\n const RequiredLabel = useText('PDP.Swatches.Required.label').label;\n\n const [selections, setSelections] = useState<Selection>(() => {\n const initial = options?.reduce((accum, option) => {\n const { items } = option;\n const defaultSelection = items?.find((item) => defaultOptions?.includes(item.id));\n const selected = items?.find((item) => item.selected);\n if (defaultSelection) {\n return {\n ...accum,\n [option.id]: { label: defaultSelection.label, value: defaultSelection.id },\n };\n } else if (selected) {\n return {\n ...accum,\n [option.id]: { label: selected.label, value: selected.id },\n };\n }\n return accum;\n }, {} as Selection);\n\n return initial;\n });\n\n // this only applies for the case with anchor options\n // update selections in the swatches if they are updated in the parent component\n useEffect(() => {\n selectionsToUpdate?.forEach((selectionToUpdate) => {\n setSelections((prev) => {\n const selectedItem = selectionToUpdate\n ?.items?.find((item) => item.selected);\n if (!selectedItem) return prev;\n\n const next = {\n ...prev,\n [selectionToUpdate.id]: {\n label: selectedItem?.label,\n value: selectedItem?.id\n },\n };\n return next;\n });\n });\n }, [selectionsToUpdate, setSelections]);\n\n // Update invalid options\n useMemo(() => {\n const errors = options?.reduce((accum, option) => {\n option?.items?.forEach((item) => {\n const selected = selections[option.id]?.value === item.id;\n\n // Validate required\n if (option.required && !selected) {\n accum[option.id] = RequiredLabel;\n }\n });\n\n return accum;\n }, {} as { [id: string]: string });\n\n // Call the callback\n onErrors?.(errors);\n\n return errors;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selections]);\n\n const handleOnSelection = useCallback(\n (id: string, label: string, optionId: string) => {\n setSelections((prev) => {\n const next = {\n ...prev,\n [id]: { label, value: optionId },\n };\n\n // Call the callback\n onValues?.(next, optionId);\n\n // Return the next state\n return next;\n });\n },\n [onValues]\n );\n\n // Function to handle the picker selection\n const handlePickerSelect = (optionId: string, selection: any ) => {\n const label = selection.selectedOptions[0]?.label ?? '';\n handleOnSelection(optionId, label, selection.value);\n };\n\n const Swatches = useCallback(\n ({ items, id, required, type, selected, label }: any) => {\n return (\n <div className={classes(['pdp-swatches__options'])}>\n {\n type?.toLowerCase() === 'dropdown' ?\n <Picker aria-label={label} handleSelect={(event) => handlePickerSelect(id, event.target)} options={mapToPickerOptions(items)} value={selected} />\n :\n items?.map((option: any) => {\n const common = {\n key: option.id,\n id: option.id,\n name: id,\n value: option.value,\n label: option.label,\n groupAriaLabel: label,\n selected: selected === option.id,\n outOfStock: !option.inStock,\n // API may return null, we default to true as all swatches are required.\n // we still comply to this in case the api return \"false\".\n required: required === null ? true : required,\n onValue: () => {\n handleOnSelection(id, option.label, option.id);\n },\n };\n\n switch (type) {\n case 'text':\n return <TextSwatch {...common} label={option.label} />;\n\n case 'image':\n return (\n <ImageSwatch\n {...common}\n src={option.value}\n alt={option.label}\n />\n );\n\n case 'color':\n return (\n <ColorSwatch {...common} size=\"large\" color={option.value} />\n );\n\n default:\n console.warn(`Invalid swatch type ${type}`);\n return null;\n }\n })}\n </div>\n );\n },\n [handleOnSelection]\n );\n\n return (\n <div {...props} className={classes(['pdp-swatches', className])}>\n {options?.map(({ type, label, id, multiple, required, items }) => {\n if (!type) {\n console.warn(`Bundle product not supported on UI.`);\n return;\n }\n\n // Only render supported types\n if (!supportedTypes.includes(type)) {\n console.warn(`Invalid swatch type ${type}`);\n }\n\n if (multiple) {\n console.warn(\n 'Multiple selection swatches are not currently supported.'\n );\n }\n\n return (\n <div\n key={`swatch-item-${id}`}\n id={`swatch-item-${id}`}\n data-slot-key={`product-swatch--${id}`}\n className=\"pdp-swatches__field\"\n >\n <div className=\"pdp-swatches__field__label\">\n {selections[id] ? (hideSelectedValue ? `${label}` : `${label}: ${selections[id].label}`) : label}\n </div>\n\n <Swatches\n id={id}\n type={type}\n required={required}\n items={items}\n label={label} //label referring to the name of the swatchGroup\n selected={selections[id]?.value}\n />\n </div>\n );\n })}\n </div>\n );\n};\n","import { toLanguageTag } from '@adobe/elsie/lib';\n\nexport function toDateString(value: string, locale = 'en_US') {\n if (!isDateValid(value)) throw Error('Invalid date string');\n\n // normalize time to 00:00:00\n const time = value.split(' ')[1];\n if (!time) value = `${value} 00:00:00`;\n\n return new Date(value).toLocaleDateString(toLanguageTag(locale)).toString();\n}\n\nexport function isDateValid(dateString: string) {\n const acceptedFormats = [\n /^\\d{4}-\\d{2}-\\d{2}$/, // YYYY-MM-DD\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{2}\\/\\d{2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{4}\\/\\d{2}\\/\\d{2}$/, // YYYY/MM/DD\n /^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$/, // DD.MM.YYYY\n /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/, // YYYY-MM-DD HH:mm:ss\n ];\n\n if (!acceptedFormats.some((format) => format.test(dateString))) return false;\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n","export function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n","import { ProductModel } from '../models';\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: product?.externalId as any,\n name: product?.name,\n sku: product?.sku,\n topLevelSku: product?.externalParentId,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: undefined,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: undefined,\n maximalPrice: undefined,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.urlKey,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n/**\n* Sets a context in the Adobe Client Data Layer (ACDL)\n* Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n*/\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","import {\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/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe/elsie/components';\nimport { Product, Swatches, PriceRange, Option } from '@/pdp/components';\nimport { config, getProductData, getRefinedProduct } from '@/pdp/api';\nimport { events } from '@adobe/event-bus';\nimport { Lang, useText } from '@adobe/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { getUrlParams, setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel } from '@/pdp/data/models';\n\ntype IconType = keyof typeof import('@adobe/elsie/icons');\n\ntype Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n};\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\nexport type CarouselConfig = {\n mobile?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n mobile: boolean,\n desktop: boolean,\n }\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions,\n thumbnailParams?: ResolveImageUrlOptions\n};\n\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\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<DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }>;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\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}\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 ...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\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(config.getConfig().defaultLocale as Lang || 'en-US');\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const defaultValues: Values = { sku, quantity: 1 };\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 // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n getProductData(sku).then(setData);\n\n // TODO: need to keep the optionsUIDs when locale changes\n // if (values?.optionsUIDs) {\n // getRefinedProduct(sku, values?.optionsUIDs).then(setData);\n // } else {\n // getProductData(sku).then(setData);\n // }\n });\n return () => {\n localeEvent?.off();\n };\n }, [locale, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback(\n (newValues: { [key: string]: string | number }) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n },\n []\n );\n\n const handleOptionSelected = useCallback(\n (selections: { [id: string]: { label: string; value: string } }) => {\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 if (!hideURLParams) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n setValues((prev) => ({ ...prev, optionsUIDs }));\n setValid(optionsUIDs?.length === data?.options?.length);\n\n // get refined product data and update state\n getRefinedProduct(sku, optionsUIDs, optionsConfig?.anchorOptions).then((next) => {\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 if (useACDL && next?.sku !== sku) { // TODO: sku of simple product once added to the model\n publishProductPageViewEvent(next as ProductModel);\n }\n });\n },\n [sku]\n );\n\n const processUpdates = useCallback((next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every(item => updatedOptionsUIDs.includes(item));\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n setValues((prev) => ({ ...prev, optionsUIDs: updatedOptionsUIDs }));\n setValid(updatedOptionsUIDs?.length === next?.options?.length);\n }\n }, [sku]);\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 min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n handleOnValues({ quantity: Number(quantity) });\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot name=\"Options\" slot={slots?.Options} context={{ ...defaultSlotContext }}>\n <Swatches\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\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 && <Icon source={nextSeparator} />;\n\n this._setProps((prev: any) => {\n return { ...prev, separator };\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 return {\n ...prev,\n categories: [...(prev.categories || []), link],\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 return {\n ...prev,\n categories: [...(prev.categories || []), vnode],\n };\n });\n });\n },\n }}\n render={({ separator, categories }) => {\n return (\n <Breadcrumbs separator={separator} categories={categories} />\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 {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.shortDescription ?? '' }} />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.description ?? '' }} />\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 {...data.prices.final} locale={toLanguageTag(locale)} />\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 carouselConfig={{\n ...carousel,\n thumbnails: carousel\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\nProductDetails.getInitialData = async function ({ sku, optionsConfig }) {\n // check if default selections are made\n const defaultSelections = getUrlParams().optionsUIDs?.split(',') || config?.getConfig()?.models?.ProductDetails?.initialData?.optionsUIDs;\n\n // if it has selections, refine the product data\n if (defaultSelections?.length) {\n return await getRefinedProduct(sku, defaultSelections, optionsConfig?.anchorOptions);\n }\n\n // otherwise return the product data\n return await getProductData(sku);\n};\n"],"names":["SvgChevronDown","props","React","SvgClose","Carousel","show","scrollbar","peak","arrows","controls","arrowsOnMainImage","loop","gap","direction","width","height","defaultIndex","className","children","thumbnails","isZoomed","Label","useText","label","SlideLabel","PreviousLabel","NextLabel","ControlsLabel","ControlsBtnLabel","perPage","setPerPage","useState","getPerPageFromBreakpoint","length","Math","ceil","Children","toArray","gapSizes","small","medium","large","peakWidth","gapWidth","rest","thumbGap","thumbSeen","iconSize","current","setCurrent","thumbnailsRefs","useRef","thumbWidth","setThumbWidth","thumbHeight","setThumbHeight","thumbnailSlides","useMemo","slides","returnValue","reduce","acc","child","i","slice","concat","wrapperRef","thumbnailsWrapperRef","thumbnailControls","useEffect","wrapper","document","body","handleResize","debounce","offsetWidth","offsetHeight","window","innerWidth","newPerPage","observer","ResizeObserver","observe","unobserve","handleThumbnailsScroll","useCallback","nextSlideIndex","nextItem","thumbnailRef","oneItemWidth","oneItemHeight","thumbnailsWrapper","style","scrollBehavior","scrollLeft","scrollTop","handleScrollTo","smooth","reset","realWidth","Array","from","querySelectorAll","filter","element","dataIndex","Number","getAttribute","isNaN","futureIndex","scrollWidth","diff","handleGoToPrev","handleGoToNext","lastSlideIndex","handleKeyDown","event","key","preventDefault","addEventListener","removeEventListener","handleOnScroll","dividing","round","totalWidth","getArrow","forThumbnails","callback","_jsx","Button","classes","variant","onClick","disabled","Icon","size","source","ChevronDown","prevArrow","nextArrow","prevArrowMainImage","nextArrowMainImage","_jsxs","role","ref","tabIndex","map","page","index","orphan","_Fragment","_","buttonsLength","active","el","type","name","replace","String","checked","onChange","breakpoints","mediumViewport","Product","title","breadcrumbs","galleryContent","infoContent","productContent","sku","outOfStock","shortDescription","description","attributes","images","options","price","specialPrice","quantity","actions","carouselConfig","RegularPriceLabel","SpecialPriceLabel","OutOfStockLabel","ImagesLabel","zoom","setZoom","galleryImages","image","VComponent","node","loading","alt","toString","src","localThumbnailsImages","thumbnailsLoadingMode","loopable","desktop","GalleryGrid","mobile","Overlay","onClose","centered","count","PriceRange","amount","currency","locale","sale","minimumAmount","maximumAmount","Price","CloseLabel","handleOnClose","scrollingElement","defaultOverflowValue","overflow","icon","CloseSVG","supportedTypes","mapToPickerOptions","items","item","text","inStock","Swatches","hideSelectedValue","onValues","onErrors","defaultOptions","selectionsToUpdate","RequiredLabel","selections","setSelections","accum","option","defaultSelection","find","includes","id","selected","value","forEach","selectionToUpdate","prev","selectedItem","next","errors","required","handleOnSelection","optionId","handlePickerSelect","selection","selectedOptions","toLowerCase","Picker","handleSelect","target","common","groupAriaLabel","onValue","TextSwatch","ImageSwatch","ColorSwatch","color","warn","multiple","console","toDateString","isDateValid","Error","split","Date","toLocaleDateString","toLanguageTag","dateString","some","format","test","date","getTime","setUrlParams","params","urlSearchParams","URLSearchParams","location","search","entries","delete","set","url","pathname","hash","history","replaceState","getUrlParams","transformProduct","product","productId","externalId","topLevelSku","externalParentId","specialToDate","undefined","specialFromDate","newToDate","newFromDate","createdAt","updatedAt","manufacturer","countryOfManufacture","categories","productType","pricing","regularPrice","prices","regular","minimalPrice","maximalPrice","final","tierPricing","currencyCode","canonicalUrl","urlKey","mainImageUrl","contexts","PRODUCT_CONTEXT","events","PRODUCT_PAGE_VIEW","getAdobeDataLayer","adobeDataLayer","setContext","data","push","pushEvent","additionalContext","acdl","state","getState","eventInfo","publishProductPageViewEvent","productItem","ProductDetails","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","initialData","carousel","optionsConfig","useACDL","onAddToCart","AddToCartLabel","IncrementerLabel","DetailsLabel","setLocale","config","getConfig","defaultLocale","setSelectionsToUpdate","setData","values","setValues","defaultValues","optionUIDs","optionsUIDs","valid","setValid","defaultSlotContext","localeEvent","on","payload","then","off","Object","keys","handleOnValues","newValues","handleOptionSelected","join","getRefinedProduct","anchorOptions","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","every","handleOnErrors","_errors","__html","dangerouslySetInnerHTML","Slot","slot","Quantity","context","Incrementer","defaultValue","min","renderOptions","Options","Title","SKU","Breadcrumbs","setSeparator","_registerMethod","attrs","nextSeparator","separator","_setProps","appendLink","p","link","appendHTMLElement","domElement","vnode","_htmlElementToVNode","render","Actions","appendButton","_button","buttonProps","button","ShortDescription","Description","Image","imageParams","visible","SpecialPrice","RegularPrice","thumbnailParams","Attributes","GalleryContent","InfoContent","Content","getInitialData","defaultSelections","models","getProductData"],"mappings":"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","x_google_ignoreList":[0,1]}
package/render.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sources":["../src/render/Provider.tsx","../src/render/render.tsx"],"sourcesContent":["import { FunctionComponent } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { UIProvider } from '@adobe/elsie/components';\nimport { Lang } from '@adobe/elsie/i18n';\nimport { events } from '@adobe/event-bus';\nimport { config } from '../api';\nimport { deepmerge } from '@adobe/elsie/lib';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface CartProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<CartProviderProps> = ({\n children,\n}) => {\n const [locale, setLang] = useState<Lang>();\n\n const userLangDefinitions = config.getConfig()?.langDefinitions;\n\n // Events\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (payload) => {\n if (payload !== locale) setLang(payload as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, [locale]);\n\n // Merge language definitions with user language definitions\n const definitions = deepmerge(langDefinitions, userLangDefinitions ?? {});\n\n return (\n <UIProvider lang={locale} langDefinitions={definitions}>\n {children}\n </UIProvider>\n );\n};\n","import { Render } from '@adobe/elsie/lib';\nimport { Provider } from './Provider';\n\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","default","en_US","Provider","children","locale","setLang","useState","userLangDefinitions","config","getConfig","useEffect","localeEvent","events","on","payload","eager","off","definitions","deepmerge","_jsx","UIProvider","lang","render","Render"],"mappings":"y8BAWMA,EAAkB,CACtBC,QAASC,CACX,EAMaC,EAAiDA,CAAC,CAC7DC,SAAAA,CACF,IAAM,OACJ,KAAM,CAACC,EAAQC,CAAO,EAAIC,EAAe,EAEnCC,GAAsBC,EAAAA,EAAOC,UAAAA,IAAPD,YAAAA,EAAoBT,gBAGhDW,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAOC,GACzB,SACaC,GAAA,CACPA,IAAYV,GAAQC,EAAQS,CAAgB,CAAA,EAElD,CAAEC,MAAO,EAAA,CACX,EACA,MAAO,IAAM,CACXJ,GAAAA,MAAAA,EAAaK,KAAI,CACnB,EACC,CAACZ,CAAM,CAAC,EAGX,MAAMa,EAAcC,EAAUnB,EAAiBQ,GAAuB,CAAE,CAAA,EAExE,OACEY,EAACC,EAAU,CAACC,KAAMjB,EAAQL,gBAAiBkB,EAAYd,SAAAA,CAAAA,CAE3C,CAEhB,EC7CamB,EAAS,IAAIC,EAAOJ,EAACjB,EAAU,CAAA,CAAA,CAAC"}