@dropins/storefront-pdp 3.0.1-alpha1 → 3.0.1-alpha3

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.
@@ -1,7 +1,18 @@
1
1
  import { Initializer } from '@dropins/tools/types/elsie/src/lib';
2
2
  import { Lang } from '@dropins/tools/types/elsie/src/i18n';
3
- import { ProductModel } from '../../data/models';
3
+ import { ProductModel, Option } from '../../data/models';
4
4
 
5
+ export type OptionsTransformer = (options: Option[]) => Option[];
6
+ type ModelConfig = {
7
+ initialData?: any;
8
+ /** @deprecated Use "transformer" instead */
9
+ transform?: (data?: ProductModel) => ProductModel;
10
+ transformer?: (data?: ProductModel) => ProductModel;
11
+ fallbackData?: (parentProduct: any, simpleProduct: ProductModel) => ProductModel;
12
+ };
13
+ type ProductOptionsConfig = {
14
+ optionsTransformer?: OptionsTransformer;
15
+ };
5
16
  type ConfigProps = {
6
17
  scope?: string;
7
18
  langDefinitions?: Lang;
@@ -14,13 +25,9 @@ type ConfigProps = {
14
25
  preselectFirstOption?: boolean;
15
26
  optionsUIDs?: string[];
16
27
  models?: {
17
- [name: string]: {
18
- initialData: any;
19
- /** @deprecated Use "transformer" instead */
20
- transform?: (data?: ProductModel) => ProductModel;
21
- transformer?: (data?: ProductModel) => ProductModel;
22
- fallbackData?: (parentProduct: any, simpleProduct: ProductModel) => ProductModel;
23
- };
28
+ ProductDetails?: ModelConfig;
29
+ ProductOptions?: ProductOptionsConfig;
30
+ [name: string]: ModelConfig | ProductOptionsConfig | undefined;
24
31
  };
25
32
  };
26
33
  export declare const initialize: Initializer<ConfigProps>;
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{merge as fe,Initializer as Pe}from"@dropins/tools/lib.js";import{events as q}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as se}from"../fragments.js";import{FetchGraphQL as de}from"@dropins/tools/fetch-graphql.js";import{s as he}from"./getProductConfigurationValues.js";import{s as ye}from"./isProductConfigurationValid.js";function Xe(e){const r=new URLSearchParams(window.location.search);Object.entries(e).forEach(([n,t])=>{t===null?r.delete(n):r.set(n,String(t))});let i=window.location.pathname;i+=`?${r.toString()}`,i+=window.location.hash,window.history.replaceState({},"",i)}function ae(){const e=new URLSearchParams(window.location.search),r={};return e.forEach((i,n)=>{r[n]=i}),r}function ge(e=1){const i=(ae()||{}).quantity;if(i){const n=parseInt(i,10);if(!isNaN(n)&&Number.isInteger(n)&&n>0)return n}return e}function we(e){var r,i,n,t,s,a,l,o,m,u,f,c;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((i=(r=e==null?void 0:e.prices)==null?void 0:r.regular)==null?void 0:i.amount)||0,minimalPrice:(t=(n=e==null?void 0:e.prices)==null?void 0:n.final)==null?void 0:t.minimumAmount,maximalPrice:(a=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:a.maximumAmount,specialPrice:(o=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:o.amount,tierPricing:void 0,currencyCode:((u=(m=e==null?void 0:e.prices)==null?void 0:m.final)==null?void 0:u.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(c=(f=e==null?void 0:e.images)==null?void 0:f[0])==null?void 0:c.url}}const oe={PRODUCT_CONTEXT:"productContext",CHANNEL_CONTEXT:"channelContext"},Ce={PRODUCT_PAGE_VIEW:"product-page-view"};function ue(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function xe(){return{_id:"https://ns.adobe.com/xdm/channels/web",_type:"https://ns.adobe.com/xdm/channel-types/web"}}function le(e,r){const i=ue();i.push({[e]:null}),i.push({[e]:r})}function De(){typeof window>"u"||le(oe.CHANNEL_CONTEXT,xe())}function Te(e,r){ue().push(n=>{const t=n.getState?n.getState():{};n.push({event:e,eventInfo:{...t,...r}})})}function Oe(e){const r=we(e);le(oe.PRODUCT_CONTEXT,r),De(),Te(Ce.PRODUCT_PAGE_VIEW)}var H=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(H||{}),me=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(me||{});function K(e,r){var a,l,o,m,u,f,c,g,w,T,h,A;const i=((m=(o=(l=(a=e==null?void 0:e.options)==null?void 0:a[0])==null?void 0:l.values)==null?void 0:o[0])==null?void 0:m.__typename)==="ProductViewOptionValueProduct",n=be(e,i,r==null?void 0:r.preselectFirstOption),t=(e==null?void 0:e.__typename)===me.SimpleProductView?H.SimpleProduct:H.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:i,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:Se(e),prices:Ae(e,i,n),attributes:pe(e),options:Ee(e,i),optionUIDs:n,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,productType:t}:null;return fe(s,((g=(c=(f=(u=k.getConfig())==null?void 0:u.models)==null?void 0:f.ProductDetails)==null?void 0:c.transformer)==null?void 0:g.call(c,e))??((A=(h=(T=(w=k.getConfig())==null?void 0:w.models)==null?void 0:T.ProductDetails)==null?void 0:h.transform)==null?void 0:A.call(h,e)))}function Se(e){var r,i;return(i=(r=e.images)==null?void 0:r.filter(n=>{var t;return!((t=n.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:i.map(n=>(n.url=n.url.replace(/^https?:/,""),n))}function pe(e){var r,i;return(i=(r=e.attributes)==null?void 0:r.filter(({roles:n})=>(n==null?void 0:n.indexOf("visible_in_pdp"))!==-1))==null?void 0:i.map(({label:n,value:t,name:s})=>{if(s!=null&&s.startsWith("ac_"))try{let a;typeof t=="string"?a=JSON.parse(t):typeof t=="object"&&(a=t);const l=j(a);return{id:s,label:n,value:JSON.stringify(l)}}catch{return{id:s,label:n,value:t.toString().split(",").join(", ")}}return{id:s,label:n,value:t.toString().split(",").join(", ")}})}function j(e){if(Array.isArray(e))return e.map(j);if(e!==null&&typeof e=="object"){const r={};for(const[i,n]of Object.entries(e)){let t=i;i==="validation_rule"?t="validationRule":i==="min_length"?t="minLength":i==="max_length"?t="maxLength":i==="purchase_separately"&&(t="purchaseSeparately"),r[t]=j(n)}return r}return e}function Ee(e,r){const{options:i,optionUIDs:n}=e;return i==null?void 0:i.map(({id:t,title:s,required:a,multi:l,values:o})=>{var f,c;const m=(f=o==null?void 0:o[0])==null?void 0:f.__typename;let u=(c=o==null?void 0:o[0])==null?void 0:c.type;return u?u=u.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):u="dropdown",{id:t,type:u,typename:m,label:s,required:a,multiple:l,items:r?_e(o,n):ke(o,n,u)}})}function _e(e,r){return e==null?void 0:e.filter(({enabled:i})=>typeof i>"u"||i).map(({id:i,title:n,inStock:t,isDefault:s,product:a})=>({id:i,inStock:t,label:n,selected:(r==null?void 0:r.indexOf(i))>-1||s,value:i,product:a}))}function ke(e,r,i){return e==null?void 0:e.map(({id:n,title:t,inStock:s,value:a})=>({id:n,inStock:s,label:t,selected:(r==null?void 0:r.indexOf(n))>-1,value:(i==null?void 0:i.toLowerCase())==="dropdown"?n:a==null?void 0:a.replace(/^https?:/,"")}))}function Ae(e,r,i){var A,B,W,z,J;const{price:n,priceRange:t,options:s,optionUIDs:a=i}=e;let{__typename:l}=e;function o(){var C;const y=n==null?void 0:n.regular.amount.value,P=((C=n==null?void 0:n.final)==null?void 0:C.amount.value)??(n==null?void 0:n.regular.amount.value),d=(n==null?void 0:n.regular.amount.currency)==="NONE"?"USD":n==null?void 0:n.regular.amount.currency;return[y,P,P,d]}function m(){var x,D,O,S,b,U,N,I,v,F,V,L;const y=(x=t==null?void 0:t.minimum)==null?void 0:x.final.amount.value,P=(D=t==null?void 0:t.maximum)==null?void 0:D.final.amount.value;let d;((S=(O=t==null?void 0:t.minimum)==null?void 0:O.regular)==null?void 0:S.amount.value)===((U=(b=t==null?void 0:t.maximum)==null?void 0:b.regular)==null?void 0:U.amount.value)&&(d=(I=(N=t==null?void 0:t.minimum)==null?void 0:N.regular)==null?void 0:I.amount.value);const C=((F=(v=t==null?void 0:t.minimum)==null?void 0:v.final)==null?void 0:F.amount.currency)==="NONE"?"USD":(L=(V=t==null?void 0:t.minimum)==null?void 0:V.final)==null?void 0:L.amount.currency;return[d,y,P,C]}function u(){var O,S,b,U,N,I,v,F,V,L,Y,Z,R;let y=0,P=0;s==null||s.forEach(_=>{var ee;const Q=_==null?void 0:_.values;if(Q&&Array.isArray(Q)){const E=Q.map(p=>{var G,M,te,ne;return(ne=(te=(M=(G=p==null?void 0:p.product)==null?void 0:G.price)==null?void 0:M.regular)==null?void 0:te.amount)==null?void 0:ne.value}).filter(p=>p!==void 0),$=E.length>0?Math.max(...E):0;y+=$}(ee=_==null?void 0:_.values)==null||ee.forEach(E=>{var $,p,G,M;a!=null&&a.includes(E.id)&&(P+=(M=(G=(p=($=E==null?void 0:E.product)==null?void 0:$.price)==null?void 0:p.final)==null?void 0:G.amount)==null?void 0:M.value)})});const d=(O=t==null?void 0:t.minimum)==null?void 0:O.final.amount.value,C=(S=t==null?void 0:t.maximum)==null?void 0:S.final.amount.value;let x;((U=(b=t==null?void 0:t.minimum)==null?void 0:b.regular)==null?void 0:U.amount.value)===((I=(N=t==null?void 0:t.maximum)==null?void 0:N.regular)==null?void 0:I.amount.value)&&(x=(F=(v=t==null?void 0:t.minimum)==null?void 0:v.regular)==null?void 0:F.amount.value);const D=((L=(V=t==null?void 0:t.minimum)==null?void 0:V.final)==null?void 0:L.amount.currency)==="NONE"?"USD":(Z=(Y=t==null?void 0:t.minimum)==null?void 0:Y.final)==null?void 0:Z.amount.currency;return r&&(a==null?void 0:a.length)<1?[x,d,C,D]:y===((R=t==null?void 0:t.maximum)==null?void 0:R.regular.amount.value)?[P,P,P,D]:[x,d,C,D]}const[f,c,g,w]=l==="SimpleProductView"?o():r?u():m(),T=l==="SimpleProductView"?(A=n==null?void 0:n.roles)==null?void 0:A.includes("visible"):((W=(B=t==null?void 0:t.maximum)==null?void 0:B.roles)==null?void 0:W.includes("visible"))&&((J=(z=t==null?void 0:t.minimum)==null?void 0:z.roles)==null?void 0:J.includes("visible"));function h(y){return!y||!Array.isArray(y)?[]:y.map(P=>{var d,C,x,D,O,S;return{tier:{amount:(C=(d=P.tier)==null?void 0:d.amount)==null?void 0:C.value,currency:((D=(x=P.tier)==null?void 0:x.amount)==null?void 0:D.currency)||w},quantity:((O=P.quantity[0])==null?void 0:O.gte)||((S=P.quantity[0])==null?void 0:S.lt)||0}}).sort((P,d)=>P.quantity-d.quantity)}return g&&c===g?{regular:{amount:f,currency:w,variant:f&&c!==f?"strikethrough":"default"},final:{amount:g,currency:w,variant:"default"},tiers:h(n==null?void 0:n.tiers),visible:T}:{final:{minimumAmount:c,maximumAmount:g,currency:w},tiers:h(n==null?void 0:n.tiers),visible:T}}function be(e,r,i){var n;return r?((n=e==null?void 0:e.options)==null?void 0:n.map(({values:s})=>{var o,m;const a=((o=s==null?void 0:s.find(({isDefault:u})=>u))==null?void 0:o.id)??null,l=i?(m=s[0])==null?void 0:m.id:null;return a||l})).filter(s=>s!==null):e==null?void 0:e.optionUIDs}const X=new Pe({init:async e=>{var l,o,m;const r=(o=(l=e==null?void 0:e.models)==null?void 0:l.ProductDetails)==null?void 0:o.initialData,n=((m=(ae()||{}).optionsUIDs)==null?void 0:m.split(","))||(r==null?void 0:r.optionsUIDs),t=ge(1),a={...{defaultLocale:"en-US",globalLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:n},...e};if(X.config.setConfig({...a}),a!=null&&a.sku){const u=r?K(r):await ie(a.sku,{preselectFirstOption:a.preselectFirstOption});q.emit("pdp/data",u,{scope:a.scope});const f={sku:a.sku,quantity:t,optionsUIDs:u==null?void 0:u.optionUIDs};he(()=>({...f}),{scope:a.scope}),ye(()=>{var c;return u!=null&&u.options?u.options.length===((c=u==null?void 0:u.optionUIDs)==null?void 0:c.length):!0},{scope:a.scope}),a.acdl&&u&&Oe(u)}},listeners:()=>[q.on("locale",async()=>{const{sku:e,scope:r}=X.config.getConfig();if(e){const i=await ie(e);q.emit("pdp/data",i,{scope:r})}})]}),k=X.config,{setEndpoint:Ke,setFetchGraphQlHeader:Be,removeFetchGraphQlHeader:We,setFetchGraphQlHeaders:ze,getFetchGraphQlHeader:Je,fetchGraphQl:ce,getConfig:Ye}=new de().getMethods(),Ue=`
3
+ import{merge as fe,Initializer as de}from"@dropins/tools/lib.js";import{events as q}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as se}from"../fragments.js";import{FetchGraphQL as Pe}from"@dropins/tools/fetch-graphql.js";import{s as he}from"./getProductConfigurationValues.js";import{s as ye}from"./isProductConfigurationValid.js";function Be(e){const i=new URLSearchParams(window.location.search);Object.entries(e).forEach(([n,t])=>{t===null?i.delete(n):i.set(n,String(t))});let r=window.location.pathname;r+=`?${i.toString()}`,r+=window.location.hash,window.history.replaceState({},"",r)}function oe(){const e=new URLSearchParams(window.location.search),i={};return e.forEach((r,n)=>{i[n]=r}),i}function ge(e=1){const r=(oe()||{}).quantity;if(r){const n=parseInt(r,10);if(!isNaN(n)&&Number.isInteger(n)&&n>0)return n}return e}function pe(e){var i,r,n,t,s,o,l,a,m,u,f,c;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((r=(i=e==null?void 0:e.prices)==null?void 0:i.regular)==null?void 0:r.amount)||0,minimalPrice:(t=(n=e==null?void 0:e.prices)==null?void 0:n.final)==null?void 0:t.minimumAmount,maximalPrice:(o=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:o.maximumAmount,specialPrice:(a=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:a.amount,tierPricing:void 0,currencyCode:((u=(m=e==null?void 0:e.prices)==null?void 0:m.final)==null?void 0:u.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(c=(f=e==null?void 0:e.images)==null?void 0:f[0])==null?void 0:c.url}}const ae={PRODUCT_CONTEXT:"productContext",CHANNEL_CONTEXT:"channelContext"},we={PRODUCT_PAGE_VIEW:"product-page-view"};function ue(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function Ce(){return{_id:"https://ns.adobe.com/xdm/channels/web",_type:"https://ns.adobe.com/xdm/channel-types/web"}}function le(e,i){const r=ue();r.push({[e]:null}),r.push({[e]:i})}function Te(){typeof window>"u"||le(ae.CHANNEL_CONTEXT,Ce())}function xe(e,i){ue().push(n=>{const t=n.getState?n.getState():{};n.push({event:e,eventInfo:{...t,...i}})})}function De(e){const i=pe(e);le(ae.PRODUCT_CONTEXT,i),Te(),xe(we.PRODUCT_PAGE_VIEW)}var H=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(H||{}),me=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(me||{});function K(e,i){var o,l,a,m,u,f,c,g,p,x,h,k;const r=((m=(a=(l=(o=e==null?void 0:e.options)==null?void 0:o[0])==null?void 0:l.values)==null?void 0:a[0])==null?void 0:m.__typename)==="ProductViewOptionValueProduct",n=Ne(e,r,i==null?void 0:i.preselectFirstOption),t=(e==null?void 0:e.__typename)===me.SimpleProductView?H.SimpleProduct:H.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:r,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:Se(e),videos:Ee(e),prices:Ue(e,r,n),attributes:_e(e),options:Oe(be(e,r)),optionUIDs:n,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,productType:t}:null;return fe(s,((g=(c=(f=(u=_.getConfig())==null?void 0:u.models)==null?void 0:f.ProductDetails)==null?void 0:c.transformer)==null?void 0:g.call(c,e))??((k=(h=(x=(p=_.getConfig())==null?void 0:p.models)==null?void 0:x.ProductDetails)==null?void 0:h.transform)==null?void 0:k.call(h,e)))}function Oe(e){var r,n,t;if(!e)return;const i=(t=(n=(r=_.getConfig())==null?void 0:r.models)==null?void 0:n.ProductOptions)==null?void 0:t.optionsTransformer;if(!i)return e;try{return i(e)??e}catch(s){return console.error("product-transform: optionsTransformer threw an error, using original options",s),e}}function Se(e){var i,r;return(r=(i=e.images)==null?void 0:i.filter(n=>{var t;return!((t=n.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:r.map(n=>(n.url=n.url.replace(/^https?:/,""),n))}function Ee(e){var i;return(i=e.videos)==null?void 0:i.map(r=>{var n,t;return{url:(n=r.url)==null?void 0:n.replace(/^https?:/,""),title:r.title,description:r.description,preview:r.preview?{url:(t=r.preview.url)==null?void 0:t.replace(/^https?:/,""),label:r.preview.label,roles:r.preview.roles}:void 0}})}function _e(e){var i,r;return(r=(i=e.attributes)==null?void 0:i.filter(({roles:n})=>(n==null?void 0:n.indexOf("visible_in_pdp"))!==-1))==null?void 0:r.map(({label:n,value:t,name:s})=>{if(s!=null&&s.startsWith("ac_"))try{let o;typeof t=="string"?o=JSON.parse(t):typeof t=="object"&&(o=t);const l=j(o);return{id:s,label:n,value:JSON.stringify(l)}}catch{return{id:s,label:n,value:t.toString().split(",").join(", ")}}return{id:s,label:n,value:t.toString().split(",").join(", ")}})}function j(e){if(Array.isArray(e))return e.map(j);if(e!==null&&typeof e=="object"){const i={};for(const[r,n]of Object.entries(e)){let t=r;r==="validation_rule"?t="validationRule":r==="min_length"?t="minLength":r==="max_length"?t="maxLength":r==="purchase_separately"&&(t="purchaseSeparately"),i[t]=j(n)}return i}return e}function be(e,i){const{options:r,optionUIDs:n}=e;return r==null?void 0:r.map(({id:t,title:s,required:o,multi:l,values:a})=>{var f,c;const m=(f=a==null?void 0:a[0])==null?void 0:f.__typename;let u=(c=a==null?void 0:a[0])==null?void 0:c.type;return u?u=u.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):u="dropdown",{id:t,type:u,typename:m,label:s,required:o,multiple:l,items:i?ke(a,n):Ae(a,n,u)}})}function ke(e,i){return e==null?void 0:e.filter(({enabled:r})=>typeof r>"u"||r).map(({id:r,title:n,inStock:t,isDefault:s,product:o})=>({id:r,inStock:t,label:n,selected:(i==null?void 0:i.indexOf(r))>-1||s,value:r,product:o}))}function Ae(e,i,r){return e==null?void 0:e.map(({id:n,title:t,inStock:s,value:o})=>({id:n,inStock:s,label:t,selected:(i==null?void 0:i.indexOf(n))>-1,value:(r==null?void 0:r.toLowerCase())==="dropdown"?n:o==null?void 0:o.replace(/^https?:/,"")}))}function Ue(e,i,r){var k,B,W,z,J;const{price:n,priceRange:t,options:s,optionUIDs:o=r}=e;let{__typename:l}=e;function a(){var w;const y=n==null?void 0:n.regular.amount.value,d=((w=n==null?void 0:n.final)==null?void 0:w.amount.value)??(n==null?void 0:n.regular.amount.value),P=(n==null?void 0:n.regular.amount.currency)==="NONE"?"USD":n==null?void 0:n.regular.amount.currency;return[y,d,d,P]}function m(){var C,T,D,O,A,U,N,v,I,V,F,L;const y=(C=t==null?void 0:t.minimum)==null?void 0:C.final.amount.value,d=(T=t==null?void 0:t.maximum)==null?void 0:T.final.amount.value;let P;((O=(D=t==null?void 0:t.minimum)==null?void 0:D.regular)==null?void 0:O.amount.value)===((U=(A=t==null?void 0:t.maximum)==null?void 0:A.regular)==null?void 0:U.amount.value)&&(P=(v=(N=t==null?void 0:t.minimum)==null?void 0:N.regular)==null?void 0:v.amount.value);const w=((V=(I=t==null?void 0:t.minimum)==null?void 0:I.final)==null?void 0:V.amount.currency)==="NONE"?"USD":(L=(F=t==null?void 0:t.minimum)==null?void 0:F.final)==null?void 0:L.amount.currency;return[P,y,d,w]}function u(){var D,O,A,U,N,v,I,V,F,L,Y,Z,R;let y=0,d=0;s==null||s.forEach(b=>{var ee;const Q=b==null?void 0:b.values;if(Q&&Array.isArray(Q)){const E=Q.map(S=>{var G,M,te,ne;return(ne=(te=(M=(G=S==null?void 0:S.product)==null?void 0:G.price)==null?void 0:M.regular)==null?void 0:te.amount)==null?void 0:ne.value}).filter(S=>S!==void 0),$=E.length>0?Math.max(...E):0;y+=$}(ee=b==null?void 0:b.values)==null||ee.forEach(E=>{var $,S,G,M;o!=null&&o.includes(E.id)&&(d+=(M=(G=(S=($=E==null?void 0:E.product)==null?void 0:$.price)==null?void 0:S.final)==null?void 0:G.amount)==null?void 0:M.value)})});const P=(D=t==null?void 0:t.minimum)==null?void 0:D.final.amount.value,w=(O=t==null?void 0:t.maximum)==null?void 0:O.final.amount.value;let C;((U=(A=t==null?void 0:t.minimum)==null?void 0:A.regular)==null?void 0:U.amount.value)===((v=(N=t==null?void 0:t.maximum)==null?void 0:N.regular)==null?void 0:v.amount.value)&&(C=(V=(I=t==null?void 0:t.minimum)==null?void 0:I.regular)==null?void 0:V.amount.value);const T=((L=(F=t==null?void 0:t.minimum)==null?void 0:F.final)==null?void 0:L.amount.currency)==="NONE"?"USD":(Z=(Y=t==null?void 0:t.minimum)==null?void 0:Y.final)==null?void 0:Z.amount.currency;return i&&(o==null?void 0:o.length)<1?[C,P,w,T]:y===((R=t==null?void 0:t.maximum)==null?void 0:R.regular.amount.value)?[d,d,d,T]:[C,P,w,T]}const[f,c,g,p]=l==="SimpleProductView"?a():i?u():m(),x=l==="SimpleProductView"?(k=n==null?void 0:n.roles)==null?void 0:k.includes("visible"):((W=(B=t==null?void 0:t.maximum)==null?void 0:B.roles)==null?void 0:W.includes("visible"))&&((J=(z=t==null?void 0:t.minimum)==null?void 0:z.roles)==null?void 0:J.includes("visible"));function h(y){return!y||!Array.isArray(y)?[]:y.map(d=>{var P,w,C,T,D,O;return{tier:{amount:(w=(P=d.tier)==null?void 0:P.amount)==null?void 0:w.value,currency:((T=(C=d.tier)==null?void 0:C.amount)==null?void 0:T.currency)||p},quantity:((D=d.quantity[0])==null?void 0:D.gte)||((O=d.quantity[0])==null?void 0:O.lt)||0}}).sort((d,P)=>d.quantity-P.quantity)}return g&&c===g?{regular:{amount:f,currency:p,variant:f&&c!==f?"strikethrough":"default"},final:{amount:g,currency:p,variant:"default"},tiers:h(n==null?void 0:n.tiers),visible:x}:{final:{minimumAmount:c,maximumAmount:g,currency:p},tiers:h(n==null?void 0:n.tiers),visible:x}}function Ne(e,i,r){var n;return i?((n=e==null?void 0:e.options)==null?void 0:n.map(({values:s})=>{var a,m;const o=((a=s==null?void 0:s.find(({isDefault:u})=>u))==null?void 0:a.id)??null,l=r?(m=s[0])==null?void 0:m.id:null;return o||l})).filter(s=>s!==null):e==null?void 0:e.optionUIDs}const X=new de({init:async e=>{var l,a,m;const i=(a=(l=e==null?void 0:e.models)==null?void 0:l.ProductDetails)==null?void 0:a.initialData,n=((m=(oe()||{}).optionsUIDs)==null?void 0:m.split(","))||(i==null?void 0:i.optionsUIDs),t=ge(1),o={...{defaultLocale:"en-US",globalLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:n},...e};if(X.config.setConfig({...o}),o!=null&&o.sku){const u=i?K(i):await ie(o.sku,{preselectFirstOption:o.preselectFirstOption});q.emit("pdp/data",u,{scope:o.scope});const f={sku:o.sku,quantity:t,optionsUIDs:u==null?void 0:u.optionUIDs};he(()=>({...f}),{scope:o.scope}),ye(()=>{var c;return u!=null&&u.options?u.options.length===((c=u==null?void 0:u.optionUIDs)==null?void 0:c.length):!0},{scope:o.scope}),o.acdl&&u&&De(u)}},listeners:()=>[q.on("locale",async()=>{const{sku:e,scope:i}=X.config.getConfig();if(e){const r=await ie(e);q.emit("pdp/data",r,{scope:i})}})]}),_=X.config,{setEndpoint:We,setFetchGraphQlHeader:ze,removeFetchGraphQlHeader:Je,setFetchGraphQlHeaders:Ye,getFetchGraphQlHeader:Ze,fetchGraphQl:ce,getConfig:Re}=new Pe().getMethods(),ve=`
4
4
  query GET_PRODUCT_DATA($skus: [String]) {
5
5
  products(skus: $skus) {
6
6
  ...PRODUCT_FRAGMENT
@@ -8,7 +8,7 @@ query GET_PRODUCT_DATA($skus: [String]) {
8
8
  }
9
9
 
10
10
  ${se}
11
- `,Ne=async(e,r,i)=>{var s;const{data:n}=await ce(Ue,{method:"GET",variables:{skus:[e]}}),t=(s=n==null?void 0:n.products)==null?void 0:s[0];return r!=null&&r.optionsUIDs&&(t.optionUIDs=r.optionsUIDs),t?i?t:K(t,{preselectFirstOption:r==null?void 0:r.preselectFirstOption}):null},Ie=`
11
+ `,Ie=async(e,i,r)=>{var s;const{data:n}=await ce(ve,{method:"GET",variables:{skus:[e]}}),t=(s=n==null?void 0:n.products)==null?void 0:s[0];return i!=null&&i.optionsUIDs&&(t.optionUIDs=i.optionsUIDs),t?r?t:K(t,{preselectFirstOption:i==null?void 0:i.preselectFirstOption}):null},Ve=`
12
12
  query REFINE_PRODUCT_QUERY(
13
13
  $optionIds: [String!]!
14
14
  $sku: String!
@@ -30,12 +30,12 @@ query REFINE_PRODUCT_QUERY(
30
30
  }
31
31
 
32
32
  ${se}
33
- `;async function re(e,r){const i=Fe(r),n=Ve(i,e),t=Ie.replace("# %extendedPlaceholder%",n),{data:s}=await ce(t,{method:"GET",variables:{optionIds:r,sku:e}});return s}const ve=async(e,r,i,n)=>{var g,w,T;const t=await re(e,r);if(!t)return null;let{products:s,refineProduct:a,...l}=t;const o=s==null?void 0:s[0],m=Le(Object.values(l),o.options,i);if(i!=null&&i.length&&a===null){r=Ge(m,r,i);const h=await re(e,r);a=h==null?void 0:h.refineProduct}const u={...a||o,sku:o.sku,name:o.name,externalParentId:o==null?void 0:o.externalId,options:m,optionUIDs:r,variantSku:(a==null?void 0:a.__typename)==="SimpleProductView"?a==null?void 0:a.sku:void 0},f=n?u:K(u),c=(T=(w=(g=k==null?void 0:k.getConfig())==null?void 0:g.models)==null?void 0:w.ProductDetails)==null?void 0:T.fallbackData;return c?c(o,f):f};function Fe(e){if(e.length<2)return[e];const r=[];return e.forEach(i=>{const n=[];e.forEach(t=>{i!==t&&n.push(t)}),r.push(n)}),r}function Ve(e,r){return e.map((i,n)=>`
33
+ `;async function re(e,i){const r=Le(i),n=Ge(r,e),t=Ve.replace("# %extendedPlaceholder%",n),{data:s}=await ce(t,{method:"GET",variables:{optionIds:i,sku:e}});return s}const Fe=async(e,i,r,n)=>{var g,p,x;const t=await re(e,i);if(!t)return null;let{products:s,refineProduct:o,...l}=t;const a=s==null?void 0:s[0],m=Me(Object.values(l),a.options,r);if(r!=null&&r.length&&o===null){i=$e(m,i,r);const h=await re(e,i);o=h==null?void 0:h.refineProduct}const u={...o||a,sku:a.sku,name:a.name,externalParentId:a==null?void 0:a.externalId,options:m,optionUIDs:i,variantSku:(o==null?void 0:o.__typename)==="SimpleProductView"?o==null?void 0:o.sku:void 0},f=n?u:K(u),c=(x=(p=(g=_==null?void 0:_.getConfig())==null?void 0:g.models)==null?void 0:p.ProductDetails)==null?void 0:x.fallbackData;return c?c(a,f):f};function Le(e){if(e.length<2)return[e];const i=[];return e.forEach(r=>{const n=[];e.forEach(t=>{r!==t&&n.push(t)}),i.push(n)}),i}function Ge(e,i){return e.map((r,n)=>`
34
34
  ProductOption${n}: refineProduct(
35
35
  optionIds: [
36
- ${i.map(t=>`"${t}"`).join(", ")}
36
+ ${r.map(t=>`"${t}"`).join(", ")}
37
37
  ]
38
- sku: "${r}"
38
+ sku: "${i}"
39
39
  ) {
40
40
  ... on ComplexProductView {
41
41
  options {
@@ -43,5 +43,5 @@ ${se}
43
43
  }
44
44
  }
45
45
  }
46
- `).join("")}function Le(e,r=[],i){const n=Object.values(e).filter(s=>!!s).reduce((s,a)=>a.options?[...s,...a.options]:[...s],[]),t=new Map(r.map(s=>[s.id,s]));return n.forEach(s=>{i!=null&&i.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function Ge(e,r,i){const n=[];let t;return e.forEach(s=>{var a,l,o,m;i.includes(s.id)?t=((l=(a=s.values)==null?void 0:a.find(u=>r.includes(u==null?void 0:u.id)))==null?void 0:l.id)||((o=s.values[0])==null?void 0:o.id):t=(m=s.values[0])==null?void 0:m.id,n.push(t)}),n}const ie=async(e,r)=>{const{anchors:i,optionsUIDs:n}=k.getConfig(),{optionsUIDs:t=n,anchors:s=i,preselectFirstOption:a,isBundle:l,skipTransform:o}=r??{};return!l&&t&&t.length>0?await ve(e,t,s,o):await Ne(e,{preselectFirstOption:a,optionsUIDs:t},o)};export{Be as a,ze as b,k as c,Ye as d,Ne as e,ce as f,Je as g,ve as h,X as i,ie as j,ge as k,Xe as l,Oe as p,We as r,Ke as s,K as t};
46
+ `).join("")}function Me(e,i=[],r){const n=Object.values(e).filter(s=>!!s).reduce((s,o)=>o.options?[...s,...o.options]:[...s],[]),t=new Map(i.map(s=>[s.id,s]));return n.forEach(s=>{r!=null&&r.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function $e(e,i,r){const n=[];let t;return e.forEach(s=>{var o,l,a,m;r.includes(s.id)?t=((l=(o=s.values)==null?void 0:o.find(u=>i.includes(u==null?void 0:u.id)))==null?void 0:l.id)||((a=s.values[0])==null?void 0:a.id):t=(m=s.values[0])==null?void 0:m.id,n.push(t)}),n}const ie=async(e,i)=>{const{anchors:r,optionsUIDs:n}=_.getConfig(),{optionsUIDs:t=n,anchors:s=r,preselectFirstOption:o,isBundle:l,skipTransform:a}=i??{};return!l&&t&&t.length>0?await Fe(e,t,s,a):await Ie(e,{preselectFirstOption:o,optionsUIDs:t},a)};export{ze as a,Ye as b,_ as c,Re as d,Ie as e,ce as f,Ze as g,Fe as h,X as i,ie as j,ge as k,Be as l,De as p,Je as r,We as s,K as t};
47
47
  //# sourceMappingURL=fetchProductData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchProductData.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n CHANNEL_CONTEXT: 'channelContext',\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\nexport function getChannelContext() {\n return {\n _id: 'https://ns.adobe.com/xdm/channels/web',\n _type: 'https://ns.adobe.com/xdm/channel-types/web',\n };\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\nexport function setChannelContext() {\n if (typeof window === 'undefined') {\n return;\n }\n\n setContext(contexts.CHANNEL_CONTEXT, getChannelContext());\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 setChannelContext();\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple'\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView'\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n }\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: transformOptions(data, isBundle),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data)\n );\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n // Special handling for ac_giftcard attribute\n if (name?.startsWith('ac_')) {\n try {\n let parsedValue;\n\n if (typeof value === 'string') {\n parsedValue = JSON.parse(value);\n } else if (typeof value === 'object') {\n parsedValue = value;\n }\n // Transform specific snake_case fields to camelCase\n const transformedValue = transformSnakeToCamel(parsedValue);\n\n return {\n id: name,\n label,\n value: JSON.stringify(transformedValue),\n };\n } catch {\n // If parsing fails, return original value\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n }\n }\n\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformSnakeToCamel(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(transformSnakeToCamel);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const transformed: any = {};\n for (const [key, value] of Object.entries(obj)) {\n // Only transform specific snake_case fields to camelCase\n let camelKey = key;\n if (key === 'validation_rule') {\n camelKey = 'validationRule';\n } else if (key === 'min_length') {\n camelKey = 'minLength';\n } else if (key === 'max_length') {\n camelKey = 'maxLength';\n } else if (key === 'purchase_separately') {\n camelKey = 'purchaseSeparately';\n }\n\n transformed[camelKey] = transformSnakeToCamel(value);\n }\n return transformed;\n }\n\n return obj;\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0]?.type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map(({ id, title, inStock, isDefault, product }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[]\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n let { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price?.regular.amount.value;\n const finalPrice =\n price?.final?.amount.value ?? price?.regular.amount.value;\n\n const currency =\n price?.regular.amount.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular.amount.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum?.regular.amount.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n function transformTiers(tiers: any[]): any[] {\n if (!tiers || !Array.isArray(tiers)) {\n return [];\n }\n\n return tiers\n .map((tier) => ({\n tier: {\n amount: tier.tier?.amount?.value,\n currency: tier.tier?.amount?.currency || currency,\n },\n quantity: tier.quantity[0]?.gte || tier.quantity[0]?.lt || 0,\n }))\n .sort((a, b) => a.quantity - b.quantity);\n }\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 tiers: transformTiers(price?.tiers),\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean\n): string[] {\n if (isBundle) {\n const selections: Array<string | null> = data?.options?.map(\n ({ values }: any) => {\n const defaultSelection =\n values?.find(({ isDefault }: any) => isDefault)?.id ?? null;\n const preselectedFirstOption = preselectFirstOption\n ? values[0]?.id\n : null;\n return defaultSelection || preselectedFirstOption;\n }\n );\n\n return selections.filter((selection) => selection !== null) as string[];\n }\n\n return data?.optionUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport {\n fetchProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype ConfigProps = {\n scope?: string;\n langDefinitions?: Lang;\n defaultLocale?: string;\n globalLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n [name: string]: {\n initialData: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel\n ) => ProductModel;\n };\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n globalLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data, { scope: config.scope });\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }), {\n scope: config.scope,\n });\n\n setProductConfigurationValid(\n () => {\n // configurable product, check if all options are selected\n if (data?.options) {\n // all selections should be made\n return data.options.length === data?.optionUIDs?.length;\n }\n\n // simple product\n return true;\n },\n { scope: config.scope }\n );\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku, scope } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next, { scope });\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n const optionPairCombinations = getPairCombination(optionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: optionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n let { products, refineProduct, ...refinedOptions } = data;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[]\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[]\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs && optionsUIDs.length > 0\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform\n );\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","getChannelContext","setContext","name","data","adobeDataLayer","setChannelContext","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","transformProductData","options","isBundle","optionUIDs","getOptionUIDs","productType","productData","transformImages","transformPrices","transformAttributes","transformOptions","merge","config","image","roles","label","parsedValue","transformedValue","transformSnakeToCamel","obj","transformed","camelKey","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","getBundleProductPrice","maxSumRegular","bundlePrice","option","regularAmounts","amount","maxRegularAmount","_m","visible","transformTiers","tiers","tier","a","b","preselectFirstOption","defaultSelection","preselectedFirstOption","selection","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","scope","next","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","raw","REFINE_PRODUCT_QUERY","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","products","refineProduct","refinedOptions","parent","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","item","temp","item2","ids","i","x","acc","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform"],"mappings":"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"}
1
+ {"version":3,"file":"fetchProductData.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n CHANNEL_CONTEXT: 'channelContext',\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\nexport function getChannelContext() {\n return {\n _id: 'https://ns.adobe.com/xdm/channels/web',\n _type: 'https://ns.adobe.com/xdm/channel-types/web',\n };\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\nexport function setChannelContext() {\n if (typeof window === 'undefined') {\n return;\n }\n\n setContext(contexts.CHANNEL_CONTEXT, getChannelContext());\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 setChannelContext();\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple'\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView'\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n }\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n videos: transformVideos(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: applyOptionsTransformer(transformOptions(data, isBundle)),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data)\n );\n}\n\nfunction applyOptionsTransformer(\n options: Option[] | undefined\n): Option[] | undefined {\n if (!options) return undefined;\n\n const optionsTransformer =\n config.getConfig()?.models?.ProductOptions?.optionsTransformer;\n\n if (!optionsTransformer) {\n return options;\n }\n\n try {\n const transformed = optionsTransformer(options);\n return transformed ?? options;\n } catch (error) {\n console.error(\n 'product-transform: optionsTransformer threw an error, using original options',\n error\n );\n return options;\n }\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformVideos(data: any) {\n return data.videos?.map((video: any) => ({\n url: video.url?.replace(/^https?:/, ''),\n title: video.title,\n description: video.description,\n preview: video.preview\n ? {\n url: video.preview.url?.replace(/^https?:/, ''),\n label: video.preview.label,\n roles: video.preview.roles,\n }\n : undefined,\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 // Special handling for ac_giftcard attribute\n if (name?.startsWith('ac_')) {\n try {\n let parsedValue;\n\n if (typeof value === 'string') {\n parsedValue = JSON.parse(value);\n } else if (typeof value === 'object') {\n parsedValue = value;\n }\n // Transform specific snake_case fields to camelCase\n const transformedValue = transformSnakeToCamel(parsedValue);\n\n return {\n id: name,\n label,\n value: JSON.stringify(transformedValue),\n };\n } catch {\n // If parsing fails, return original value\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n }\n }\n\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformSnakeToCamel(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(transformSnakeToCamel);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const transformed: any = {};\n for (const [key, value] of Object.entries(obj)) {\n // Only transform specific snake_case fields to camelCase\n let camelKey = key;\n if (key === 'validation_rule') {\n camelKey = 'validationRule';\n } else if (key === 'min_length') {\n camelKey = 'minLength';\n } else if (key === 'max_length') {\n camelKey = 'maxLength';\n } else if (key === 'purchase_separately') {\n camelKey = 'purchaseSeparately';\n }\n\n transformed[camelKey] = transformSnakeToCamel(value);\n }\n return transformed;\n }\n\n return obj;\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0]?.type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map(({ id, title, inStock, isDefault, product }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[]\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n let { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price?.regular.amount.value;\n const finalPrice =\n price?.final?.amount.value ?? price?.regular.amount.value;\n\n const currency =\n price?.regular.amount.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular.amount.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum?.regular.amount.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n function transformTiers(tiers: any[]): any[] {\n if (!tiers || !Array.isArray(tiers)) {\n return [];\n }\n\n return tiers\n .map((tier) => ({\n tier: {\n amount: tier.tier?.amount?.value,\n currency: tier.tier?.amount?.currency || currency,\n },\n quantity: tier.quantity[0]?.gte || tier.quantity[0]?.lt || 0,\n }))\n .sort((a, b) => a.quantity - b.quantity);\n }\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 tiers: transformTiers(price?.tiers),\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean\n): string[] {\n if (isBundle) {\n const selections: Array<string | null> = data?.options?.map(\n ({ values }: any) => {\n const defaultSelection =\n values?.find(({ isDefault }: any) => isDefault)?.id ?? null;\n const preselectedFirstOption = preselectFirstOption\n ? values[0]?.id\n : null;\n return defaultSelection || preselectedFirstOption;\n }\n );\n\n return selections.filter((selection) => selection !== null) as string[];\n }\n\n return data?.optionUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport {\n fetchProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\nexport type OptionsTransformer = (options: Option[]) => Option[];\n\ntype ModelConfig = {\n initialData?: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel\n ) => ProductModel;\n};\n\ntype ProductOptionsConfig = {\n optionsTransformer?: OptionsTransformer;\n};\n\ntype ConfigProps = {\n scope?: string;\n langDefinitions?: Lang;\n defaultLocale?: string;\n globalLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n ProductDetails?: ModelConfig;\n ProductOptions?: ProductOptionsConfig;\n [name: string]: ModelConfig | ProductOptionsConfig | undefined;\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n globalLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data, { scope: config.scope });\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }), {\n scope: config.scope,\n });\n\n setProductConfigurationValid(\n () => {\n // configurable product, check if all options are selected\n if (data?.options) {\n // all selections should be made\n return data.options.length === data?.optionUIDs?.length;\n }\n\n // simple product\n return true;\n },\n { scope: config.scope }\n );\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku, scope } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next, { scope });\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n const optionPairCombinations = getPairCombination(optionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: optionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n let { products, refineProduct, ...refinedOptions } = data;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[]\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[]\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs && optionsUIDs.length > 0\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform\n );\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","getChannelContext","setContext","name","data","adobeDataLayer","setChannelContext","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","transformProductData","options","isBundle","optionUIDs","getOptionUIDs","productType","productData","transformImages","transformVideos","transformPrices","transformAttributes","applyOptionsTransformer","transformOptions","merge","config","optionsTransformer","error","image","video","roles","label","parsedValue","transformedValue","transformSnakeToCamel","obj","transformed","camelKey","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","getBundleProductPrice","maxSumRegular","bundlePrice","option","regularAmounts","amount","maxRegularAmount","_m","visible","transformTiers","tiers","tier","a","b","preselectFirstOption","defaultSelection","preselectedFirstOption","selection","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","scope","next","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","raw","REFINE_PRODUCT_QUERY","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","products","refineProduct","refinedOptions","parent","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","item","temp","item2","ids","i","x","acc","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform"],"mappings":"wVAgBO,SAASA,GACdC,EACM,CACN,MAAMC,EAAkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAE3D,OAAA,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC3CA,IAAU,KACZF,EAAgB,OAAOC,CAAG,EAE1BD,EAAgB,IAAIC,EAAK,OAAOC,CAAK,CAAC,CACxC,CACD,EAEG,IAAAC,EAAM,OAAO,SAAS,SACnBA,GAAA,IAAIH,EAAgB,SAAU,CAAA,GACrCG,GAAO,OAAO,SAAS,KAEvB,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAIA,CAAG,CACzC,CAEO,SAASC,IAAuC,CACrD,MAAMJ,EAAkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC5DD,EAAiC,CAAC,EAExB,OAAAC,EAAA,QAAQ,CAACE,EAAOD,IAAQ,CACtCF,EAAOE,CAAG,EAAIC,CAAA,CACf,EAEMH,CACT,CAEgB,SAAAM,GACdC,EAA0B,EAClB,CAER,MAAMC,GADYH,GAAa,GAAK,CAAC,GACL,SAEhC,GAAIG,EAAe,CACX,MAAAC,EAAiB,SAASD,EAAe,EAAE,EAG/C,GAAA,CAAC,MAAMC,CAAc,GACrB,OAAO,UAAUA,CAAc,GAC/BA,EAAiB,EAGV,OAAAA,CACT,CAIK,OAAAF,CACT,CChDO,SAASG,GAAiBC,EAAgC,6BACxD,MAAA,CACL,UAAW,OAAOA,GAAA,YAAAA,EAAS,UAAU,EACrC,KAAMA,GAAA,YAAAA,EAAS,KACf,KAAKA,GAAA,YAAAA,EAAS,cAAcA,GAAA,YAAAA,EAAS,KACrC,YAAaA,GAAA,YAAAA,EAAS,IACtB,cAAe,OACf,gBAAiB,OACjB,UAAW,OACX,YAAa,OACb,UAAW,OACX,UAAW,OACX,aAAc,OACd,qBAAsB,OACtB,WAAY,OACZ,YAAaA,GAAA,YAAAA,EAAS,YACtB,QAAS,CACP,eAAcC,GAAAC,EAAAF,GAAA,YAAAA,EAAS,SAAT,YAAAE,EAAiB,UAAjB,YAAAD,EAA0B,SAAU,EAClD,cAAcE,GAAAC,EAAAJ,GAAA,YAAAA,EAAS,SAAT,YAAAI,EAAiB,QAAjB,YAAAD,EAAwB,cACtC,cAAcE,GAAAC,EAAAN,GAAA,YAAAA,EAAS,SAAT,YAAAM,EAAiB,QAAjB,YAAAD,EAAwB,cACtC,cAAcE,GAAAC,EAAAR,GAAA,YAAAA,EAAS,SAAT,YAAAQ,EAAiB,QAAjB,YAAAD,EAAwB,OACtC,YAAa,OACb,eAAcE,GAAAC,EAAAV,GAAA,YAAAA,EAAS,SAAT,YAAAU,EAAiB,QAAjB,YAAAD,EAAwB,WAAY,KACpD,EACA,aAAcT,GAAA,YAAAA,EAAS,IACvB,cAAcW,GAAAC,EAAAZ,GAAA,YAAAA,EAAS,SAAT,YAAAY,EAAkB,KAAlB,YAAAD,EAAsB,GACtC,CACF,CCvBO,MAAME,GAAW,CACtB,gBAAiB,iBACjB,gBAAiB,gBACnB,EAKaC,GAAS,CACpB,kBAAmB,mBACrB,EAEO,SAASC,IAAoB,CAE3B,cAAA,eAAiB,OAAO,gBAAkB,CAAC,EAE3C,OAAO,cAChB,CAEO,SAASC,IAAoB,CAC3B,MAAA,CACL,IAAK,wCACL,MAAO,4CACT,CACF,CAMA,SAASC,GAAWC,EAAcC,EAAW,CAC3C,MAAMC,EAAiBL,GAAkB,EAGzCK,EAAe,KAAK,CAClB,CAACF,CAAI,EAAG,IAAA,CACT,EAGDE,EAAe,KAAK,CAClB,CAACF,CAAI,EAAGC,CAAA,CACT,CACH,CAEO,SAASE,IAAoB,CAC9B,OAAO,OAAW,KAIXJ,GAAAJ,GAAS,gBAAiBG,IAAmB,CAC1D,CAMA,SAASM,GAAUC,EAAeC,EAAyB,CAClCT,GAAkB,EAE1B,KAAMU,GAAc,CACjC,MAAMC,EAAQD,EAAK,SAAWA,EAAK,WAAa,CAAC,EAEjDA,EAAK,KAAK,CACR,MAAAF,EACA,UAAW,CACT,GAAGG,EACH,GAAGF,CAAA,CACL,CACD,CAAA,CACF,CACH,CAGO,SAASG,GAA4B3B,EAAuB,CAC3D,MAAA4B,EAAc7B,GAAiBC,CAAO,EACjCiB,GAAAJ,GAAS,gBAAiBe,CAAW,EAC9BP,GAAA,EAClBC,GAAUR,GAAO,iBAAiB,CACpC,CClDY,IAAAe,GAAAA,IACVA,EAAA,eAAiB,UACjBA,EAAA,cAAgB,SAFNA,IAAAA,GAAA,CAAA,CAAA,EAKAC,IAAAA,IACVA,EAAA,mBAAqB,qBACrBA,EAAA,kBAAoB,oBAFVA,IAAAA,IAAA,CAAA,CAAA,ECrCI,SAAAC,EACdZ,EACAa,EAGqB,6BACf,MAAAC,IACJ9B,GAAAC,GAAAH,GAAAC,EAAAiB,GAAA,YAAAA,EAAM,UAAN,YAAAjB,EAAgB,KAAhB,YAAAD,EAAoB,SAApB,YAAAG,EAA6B,KAA7B,YAAAD,EAAiC,cACjC,gCACI+B,EAAaC,GACjBhB,EACAc,EACAD,GAAA,YAAAA,EAAS,oBACX,EACMI,GACJjB,GAAA,YAAAA,EAAM,cAAeW,GAAgB,kBACjCD,EAAY,cACZA,EAAY,eAEZQ,EAAclB,EACf,CACC,KAAMA,EAAK,KACX,IAAKA,EAAK,IACV,SAAAc,EACA,iBAAkBd,EAAK,iBACvB,QAASA,EAAK,QACd,iBAAkBA,EAAK,iBACvB,gBAAiBA,EAAK,gBACtB,YAAaA,EAAK,YAClB,UAAWA,EAAK,UAChB,YAAaA,EAAK,YAClB,OAAQmB,GAAgBnB,CAAI,EAC5B,OAAQoB,GAAgBpB,CAAI,EAC5B,OAAQqB,GAAgBrB,EAAMc,EAAUC,CAAU,EAClD,WAAYO,GAAoBtB,CAAI,EACpC,QAASuB,GAAwBC,GAAiBxB,EAAMc,CAAQ,CAAC,EACjE,WAAAC,EACA,IAAKf,EAAK,IACV,OAAQA,EAAK,OACb,WAAYA,EAAK,WACjB,iBAAkBA,EAAK,iBACvB,WAAYA,EAAK,WACjB,YAAAiB,CAAA,EAEF,KAGG,OAAAQ,GACLP,IACA9B,GAAAC,GAAAH,GAAAC,EAAAuC,EAAO,UAAa,IAApB,YAAAvC,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,cAA5C,YAAAD,EAAA,KAAAC,EAA0DW,OACxDR,GAAAC,GAAAH,GAAAC,EAAAmC,EAAO,UAAU,IAAjB,YAAAnC,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,YAA5C,YAAAD,EAAA,KAAAC,EAAwDO,GAC5D,CACF,CAEA,SAASuB,GACPV,EACsB,WAClB,GAAA,CAACA,EAAgB,OAErB,MAAMc,GACJ1C,GAAAH,GAAAC,EAAA2C,EAAO,UAAU,IAAjB,YAAA3C,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,mBAE9C,GAAI,CAAC0C,EACI,OAAAd,EAGL,GAAA,CAEF,OADoBc,EAAmBd,CAAO,GACxBA,QACfe,EAAO,CACN,eAAA,MACN,+EACAA,CACF,EACOf,CAAA,CAEX,CAEA,SAASM,GAAgBnB,EAAW,SAClC,OAAOlB,GAAAC,EAAAiB,EAAK,SAAL,YAAAjB,EACH,OAAQ8C,UAAe,SAAC9C,EAAA8C,EAAM,QAAN,MAAA9C,EAAa,SAAS,sBAD3C,YAAAD,EAEH,IAAK+C,IAELA,EAAM,IAAMA,EAAM,IAAI,QAAQ,WAAY,EAAE,EAErCA,GAEb,CAEA,SAAST,GAAgBpB,EAAW,OAClC,OAAOjB,EAAAiB,EAAK,SAAL,YAAAjB,EAAa,IAAK+C,GAAgB,SAAA,OACvC,KAAK/C,EAAA+C,EAAM,MAAN,YAAA/C,EAAW,QAAQ,WAAY,IACpC,MAAO+C,EAAM,MACb,YAAaA,EAAM,YACnB,QAASA,EAAM,QACX,CACE,KAAKhD,EAAAgD,EAAM,QAAQ,MAAd,YAAAhD,EAAmB,QAAQ,WAAY,IAC5C,MAAOgD,EAAM,QAAQ,MACrB,MAAOA,EAAM,QAAQ,KAAA,EAEvB,MAAA,GAER,CAEA,SAASR,GAAoBtB,EAAW,SACtC,OACElB,GAAAC,EAAAiB,EAAK,aAAL,YAAAjB,EAEI,OAAO,CAAC,CAAE,MAAAgD,CAAA,KAAiBA,GAAA,YAAAA,EAAO,QAAQ,qBAAsB,MAFpE,YAAAjD,EAII,IAAI,CAAC,CAAE,MAAAkD,EAAO,MAAA3D,EAAO,KAAA0B,KAAgB,CAEjC,GAAAA,GAAA,MAAAA,EAAM,WAAW,OACf,GAAA,CACE,IAAAkC,EAEA,OAAO5D,GAAU,SACL4D,EAAA,KAAK,MAAM5D,CAAK,EACrB,OAAOA,GAAU,WACZ4D,EAAA5D,GAGV,MAAA6D,EAAmBC,EAAsBF,CAAW,EAEnD,MAAA,CACL,GAAIlC,EACJ,MAAAiC,EACA,MAAO,KAAK,UAAUE,CAAgB,CACxC,CAAA,MACM,CAEC,MAAA,CACL,GAAInC,EACJ,MAAAiC,EACA,MAAO3D,EAAM,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAC9C,CAAA,CAIG,MAAA,CACL,GAAI0B,EACJ,MAAAiC,EACA,MAAO3D,EAAM,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAC9C,CAAA,EAGR,CAEA,SAAS8D,EAAsBC,EAAe,CACxC,GAAA,MAAM,QAAQA,CAAG,EACZ,OAAAA,EAAI,IAAID,CAAqB,EAGtC,GAAIC,IAAQ,MAAQ,OAAOA,GAAQ,SAAU,CAC3C,MAAMC,EAAmB,CAAC,EAC1B,SAAW,CAACjE,EAAKC,CAAK,IAAK,OAAO,QAAQ+D,CAAG,EAAG,CAE9C,IAAIE,EAAWlE,EACXA,IAAQ,kBACCkE,EAAA,iBACFlE,IAAQ,aACNkE,EAAA,YACFlE,IAAQ,aACNkE,EAAA,YACFlE,IAAQ,wBACNkE,EAAA,sBAGDD,EAAAC,CAAQ,EAAIH,EAAsB9D,CAAK,CAAA,CAE9C,OAAAgE,CAAA,CAGF,OAAAD,CACT,CAEA,SAASZ,GAAiBxB,EAAWc,EAAoB,CACjD,KAAA,CAAE,QAAAD,EAAS,WAAAE,CAAA,EAAef,EAEzB,OAAAa,GAAA,YAAAA,EAAS,IAAI,CAAC,CAAE,GAAA0B,EAAI,MAAAC,EAAO,SAAAC,EAAU,MAAAC,EAAO,OAAAC,KAAkB,SAC7D,MAAAC,GAAW7D,EAAA4D,GAAA,YAAAA,EAAS,KAAT,YAAA5D,EAAa,WAC1B,IAAA8D,GAAe/D,EAAA6D,GAAA,YAAAA,EAAS,KAAT,YAAA7D,EAAa,KAEhC,OAAI+D,EACKA,EAAAA,EACJ,QAAQ,YAAa,OAAO,EAC5B,QAAQ,OAAQ,MAAM,EACtB,QAAQ,QAAS,OAAO,EAEpBA,EAAA,WAGF,CACL,GAAAN,EACA,KAAAM,EACA,SAAAD,EACA,MAAOJ,EACP,SAAAC,EACA,SAAUC,EACV,MAAO5B,EACHgC,GAAsBH,EAAQ5B,CAAU,EACxCgC,GAAgBJ,EAAQ5B,EAAY8B,CAAI,CAC9C,CAAA,EAEJ,CAEA,SAASC,GAAsBH,EAAa5B,EAAsB,CAChE,OAAO4B,GAAA,YAAAA,EACH,OAAO,CAAC,CAAE,QAAAK,CAAQ,IAAW,OAAOA,EAAY,KAAeA,GAChE,IAAI,CAAC,CAAE,GAAAT,EAAI,MAAAC,EAAO,QAAAS,EAAS,UAAAC,EAAW,QAAArE,MAC9B,CACL,GAAA0D,EACA,QAAAU,EACA,MAAOT,EACP,UAAUzB,GAAA,YAAAA,EAAY,QAAQwB,IAAM,IAAMW,EAC1C,MAAOX,EACP,QAAA1D,CACF,GAEN,CAEA,SAASkE,GAAgBJ,EAAa5B,EAAsB8B,EAAc,CACjE,OAAAF,GAAA,YAAAA,EAAQ,IAAI,CAAC,CAAE,GAAAJ,EAAI,MAAAC,EAAO,QAAAS,EAAS,MAAA5E,MACjC,CACL,GAAAkE,EACA,QAAAU,EACA,MAAOT,EACP,UAAUzB,GAAA,YAAAA,EAAY,QAAQwB,IAAM,GACpC,OACEM,GAAA,YAAAA,EAAM,iBAAkB,WACpBN,EACAlE,GAAA,YAAAA,EAAO,QAAQ,WAAY,GACnC,GAEJ,CAEA,SAASgD,GACPrB,EACAc,EACAqC,EACA,eACA,KAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,QAAAxC,EAAS,WAAAE,EAAaoC,GAAsBnD,EACnE,GAAA,CAAE,WAAY6C,CAAA,EAAS7C,EAE3B,SAASsD,GAAyB,OAC1BC,MAAAA,EAAeH,GAAA,YAAAA,EAAO,QAAQ,OAAO,MACrCI,IACJzE,EAAAqE,GAAA,YAAAA,EAAO,QAAP,YAAArE,EAAc,OAAO,SAASqE,GAAA,YAAAA,EAAO,QAAQ,OAAO,OAEhDK,GACJL,GAAA,YAAAA,EAAO,QAAQ,OAAO,YAAa,OAC/B,MACAA,GAAA,YAAAA,EAAO,QAAQ,OAAO,SAE5B,MAAO,CAACG,EAAcC,EAAYA,EAAYC,CAAQ,CAAA,CAGxD,SAASC,GAA0B,6BACjC,MAAMC,GAAoB5E,EAAAsE,GAAA,YAAAA,EAAY,UAAZ,YAAAtE,EAAqB,MAAM,OAAO,MACtD6E,GAAoB9E,EAAAuE,GAAA,YAAAA,EAAY,UAAZ,YAAAvE,EAAqB,MAAM,OAAO,MACxDyE,IAAAA,IAGFvE,GAAAC,EAAAoE,GAAA,YAAAA,EAAY,UAAZ,YAAApE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,WACrCE,GAAAC,EAAAkE,GAAA,YAAAA,EAAY,UAAZ,YAAAlE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,SAErCqE,GAAenE,GAAAC,EAAAgE,GAAA,YAAAA,EAAY,UAAZ,YAAAhE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,OAGhDqE,MAAAA,IACJnE,GAAAC,EAAA8D,GAAA,YAAAA,EAAY,UAAZ,YAAA9D,EAAqB,QAArB,YAAAD,EAA4B,OAAO,YAAa,OAC5C,OACAE,GAAAC,EAAA4D,GAAA,YAAAA,EAAY,UAAZ,YAAA5D,EAAqB,QAArB,YAAAD,EAA4B,OAAO,SAEzC,MAAO,CAAC+D,EAAcI,EAAmBC,EAAmBH,CAAQ,CAAA,CAGtE,SAASI,GAAwB,+BAS/B,IAAIC,EAAgB,EAChBC,EAAc,EACTlD,GAAA,MAAAA,EAAA,QAASmD,GAAgB,QAChC,MAAMrB,EAASqB,GAAA,YAAAA,EAAQ,OACvB,GAAIrB,GAAU,MAAM,QAAQA,CAAM,EAAG,CACnC,MAAMsB,EAAiBtB,EACpB,IAAKtE,GAAA,eAAU,OAAAW,IAAAC,IAAAH,GAAAC,EAAAV,GAAA,YAAAA,EAAO,UAAP,YAAAU,EAAgB,QAAhB,YAAAD,EAAuB,UAAvB,YAAAG,GAAgC,SAAhC,YAAAD,GAAwC,MAAK,EAC5D,OAAQkF,GAAWA,IAAW,MAAS,EAEpCC,EACJF,EAAe,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAc,EAAI,EAC3CH,GAAAK,CAAA,EAEXpF,GAAAiF,GAAA,YAAAA,EAAA,SAAA,MAAAjF,GAAQ,QAASV,GAAe,aAClC0C,GAAA,MAAAA,EAAY,SAAS1C,EAAM,MAC7B0F,IAAe/E,GAAAC,GAAAH,GAAAC,EAAAV,GAAA,YAAAA,EAAO,UAAP,YAAAU,EAAgB,QAAhB,YAAAD,EAAuB,QAAvB,YAAAG,EAA8B,SAA9B,YAAAD,EAAsC,MACvD,EACD,GAGH,MAAM2E,GAAoB5E,EAAAsE,GAAA,YAAAA,EAAY,UAAZ,YAAAtE,EAAqB,MAAM,OAAO,MACtD6E,GAAoB9E,EAAAuE,GAAA,YAAAA,EAAY,UAAZ,YAAAvE,EAAqB,MAAM,OAAO,MACxDyE,IAAAA,IAGFvE,GAAAC,EAAAoE,GAAA,YAAAA,EAAY,UAAZ,YAAApE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,WACrCE,GAAAC,EAAAkE,GAAA,YAAAA,EAAY,UAAZ,YAAAlE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,SAErCqE,GAAenE,GAAAC,EAAAgE,GAAA,YAAAA,EAAY,UAAZ,YAAAhE,EAAqB,UAArB,YAAAD,EAA8B,OAAO,OAGhDqE,MAAAA,IACJnE,GAAAC,EAAA8D,GAAA,YAAAA,EAAY,UAAZ,YAAA9D,EAAqB,QAArB,YAAAD,EAA4B,OAAO,YAAa,OAC5C,OACAE,GAAAC,EAAA4D,GAAA,YAAAA,EAAY,UAAZ,YAAA5D,EAAqB,QAArB,YAAAD,EAA4B,OAAO,SAErC,OAAAsB,IAAYC,GAAA,YAAAA,EAAY,QAAS,EAC5B,CAACwC,EAAcI,EAAmBC,EAAmBH,CAAQ,EAG/DK,MAAkBM,EAAAf,GAAA,YAAAA,EAAY,UAAZ,YAAAe,EAAqB,QAAQ,OAAO,OACzD,CAACL,EAAaA,EAAaA,EAAaN,CAAQ,EAChD,CAACF,EAAcI,EAAmBC,EAAmBH,CAAQ,CAAA,CAGnE,KAAM,CAACF,EAAcI,EAAmBC,EAAmBH,CAAQ,EACjEZ,IAAS,oBACLS,EAAuB,EACvBxC,EACA+C,EAAA,EACAH,EAAwB,EAExBW,EACJxB,IAAS,qBACL9D,EAAAqE,GAAA,YAAAA,EAAO,QAAP,YAAArE,EAAc,SAAS,aACvBE,GAAAH,EAAAuE,GAAA,YAAAA,EAAY,UAAZ,YAAAvE,EAAqB,QAArB,YAAAG,EAA4B,SAAS,eACrCE,GAAAH,EAAAqE,GAAA,YAAAA,EAAY,UAAZ,YAAArE,EAAqB,QAArB,YAAAG,EAA4B,SAAS,YAE3C,SAASmF,EAAeC,EAAqB,CAC3C,MAAI,CAACA,GAAS,CAAC,MAAM,QAAQA,CAAK,EACzB,CAAC,EAGHA,EACJ,IAAKC,GAAU,iBAAA,OACd,KAAM,CACJ,QAAQ1F,GAAAC,EAAAyF,EAAK,OAAL,YAAAzF,EAAW,SAAX,YAAAD,EAAmB,MAC3B,WAAUE,GAAAC,EAAAuF,EAAK,OAAL,YAAAvF,EAAW,SAAX,YAAAD,EAAmB,WAAYyE,CAC3C,EACA,WAAUtE,EAAAqF,EAAK,SAAS,CAAC,IAAf,YAAArF,EAAkB,QAAOD,EAAAsF,EAAK,SAAS,CAAC,IAAf,YAAAtF,EAAkB,KAAM,CAAA,EAC3D,EACD,KAAK,CAACuF,EAAGC,IAAMD,EAAE,SAAWC,EAAE,QAAQ,CAAA,CAGvC,OAAAd,GAAqBD,IAAsBC,EAGtC,CACL,QAAS,CACP,OAAQL,EACR,SAAAE,EACA,QANgBF,GAAgBI,IAAsBJ,EAM/B,gBAAkB,SAC3C,EACA,MAAO,CACL,OAAQK,EACR,SAAAH,EACA,QAAS,SACX,EACA,MAAOa,EAAelB,GAAA,YAAAA,EAAO,KAAK,EAClC,QAAAiB,CACF,EAGK,CACL,MAAO,CACL,cAAeV,EACf,cAAeC,EACf,SAAAH,CACF,EACA,MAAOa,EAAelB,GAAA,YAAAA,EAAO,KAAK,EAClC,QAAAiB,CACF,CACF,CAEA,SAASrD,GACPhB,EACAc,EACA6D,EACU,OACV,OAAI7D,IACuC/B,EAAAiB,GAAA,YAAAA,EAAM,UAAN,YAAAjB,EAAe,IACtD,CAAC,CAAE,OAAA4D,CAAA,IAAkB,SACb,MAAAiC,IACJ7F,EAAA4D,GAAA,YAAAA,EAAQ,KAAK,CAAC,CAAE,UAAAO,KAAqBA,KAArC,YAAAnE,EAAiD,KAAM,KACnD8F,EAAyBF,GAC3B7F,EAAA6D,EAAO,CAAC,IAAR,YAAA7D,EAAW,GACX,KACJ,OAAO8F,GAAoBC,CAAA,IAIb,OAAQC,GAAcA,IAAc,IAAI,EAGrD9E,GAAA,YAAAA,EAAM,UACf,CC5Wa,MAAA+E,EAAa,IAAIC,GAAyB,CACrD,KAAM,MAAOC,GAAY,WACjB,MAAAC,GAAcpG,GAAAC,EAAAkG,GAAA,YAAAA,EAAS,SAAT,YAAAlG,EAAiB,iBAAjB,YAAAD,EAAiC,YAM/CqG,IACJlG,GAJgBV,GAAa,GAAK,CAAC,GAIzB,cAAV,YAAAU,EAAuB,MAAM,QAAQiG,GAAA,YAAAA,EAAa,aAG9CE,EAAkB5G,GAA4B,CAAC,EAW/CkD,EAAS,CAAE,GARkB,CACjC,cAAe,QACf,aAAc,QACd,iBAAkB,GAClB,KAAM,GACN,YAAAyD,CACF,EAEmC,GAAGF,CAAQ,EAI9C,GAFAF,EAAW,OAAO,UAAU,CAAE,GAAGrD,EAAQ,EAErCA,GAAAA,MAAAA,EAAQ,IAAK,CAET,MAAA1B,EAAOkF,EACTtE,EAAqBsE,CAAW,EAChC,MAAMG,GAAiB3D,EAAO,IAAK,CACjC,qBAAsBA,EAAO,oBAAA,CAC9B,EAGL/B,EAAO,KAAK,WAAYK,EAAM,CAAE,MAAO0B,EAAO,MAAO,EAGrD,MAAM4D,EAAgB,CACpB,IAAK5D,EAAO,IACZ,SAAU0D,EACV,YAAapF,GAAA,YAAAA,EAAM,UACrB,EAEAuF,GAA8B,KAAO,CAAE,GAAGD,CAAA,GAAkB,CAC1D,MAAO5D,EAAO,KAAA,CACf,EAED8D,GACE,IAAM,OAEJ,OAAIxF,GAAA,MAAAA,EAAM,QAEDA,EAAK,QAAQ,WAAWjB,EAAAiB,GAAA,YAAAA,EAAM,aAAN,YAAAjB,EAAkB,QAI5C,EACT,EACA,CAAE,MAAO2C,EAAO,KAAM,CACxB,EAGIA,EAAO,MAAQ1B,GACjBQ,GAA4BR,CAAI,CAClC,CAEJ,EAEA,UAAW,IAAM,CACfL,EAAO,GAAG,SAAU,SAAY,CAC9B,KAAM,CAAE,IAAA8F,EAAK,MAAAC,CAAA,EAAUX,EAAW,OAAO,UAAU,EAEnD,GAAIU,EAAK,CACD,MAAAE,EAAO,MAAMN,GAAiBI,CAAG,EACvC9F,EAAO,KAAK,WAAYgG,EAAM,CAAE,MAAAD,EAAO,CAAA,CAE1C,CAAA,CAAA,CAEL,CAAC,EAEYhE,EAASqD,EAAW,OCnIpB,CACX,YAAAa,GACA,sBAAAC,GACA,yBAAAC,GACA,uBAAAC,GACA,sBAAAC,GACA,aAAAC,GACA,UAAAC,EACF,EAAI,IAAIC,GAAa,EAAE,WAAW,ECRrBC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9BC,EAAgB;AAAA,ECJLC,GAAiB,MAC5Bb,EACA5E,EAIA0F,IACiC,OACjC,KAAM,CAAE,KAAAvG,CAAA,EAAS,MAAMiG,GAAaG,GAAkB,CACpD,OAAQ,MACR,UAAW,CAAE,KAAM,CAACX,CAAG,CAAE,CAAA,CAC1B,EAEK5G,GAAUE,EAAAiB,GAAA,YAAAA,EAAM,WAAN,YAAAjB,EAAiB,GAOjC,OAJI8B,GAAA,MAAAA,EAAS,cACXhC,EAAQ,WAAagC,EAAQ,aAG1BhC,EAGE0H,EACH1H,EACA+B,EAAqB/B,EAAS,CAC5B,qBAAsBgC,GAAA,YAAAA,EAAS,oBAAA,CAChC,EANI,IAOX,EC/Ba2F,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBlCH,EAAgB;AAAA,EClBlB,eAAeC,GAAeb,EAAa1E,EAAoC,CACvE,MAAA0F,EAAyBC,GAAmB3F,CAAU,EACtD4F,EAAgBC,GAAsBH,EAAwBhB,CAAG,EAEjEoB,EAAgBL,GAAqB,QACzC,0BACAG,CACF,EAEM,CAAE,KAAA3G,CAAA,EAAS,MAAMiG,GAAaY,EAAe,CACjD,OAAQ,MACR,UAAW,CAAE,UAAW9F,EAAY,IAAA0E,CAAI,CAAA,CACzC,EACM,OAAAzF,CACT,CAEO,MAAM8G,GAAoB,MAC/BrB,EACA1E,EACAgG,EACAR,IACiC,WACjC,MAAMvG,EAAO,MAAMsG,GAAeb,EAAK1E,CAAU,EAC7C,GAAA,CAACf,EAAa,OAAA,KAElB,GAAI,CAAE,SAAAgH,EAAU,cAAAC,EAAe,GAAGC,CAAmB,EAAAlH,EAE/C,MAAAmH,EAASH,GAAA,YAAAA,EAAW,GAEpBnG,EAAUuG,GACd,OAAO,OAAOF,CAAc,EAC5BC,EAAO,QACPJ,CACF,EAGI,GAAAA,GAAA,MAAAA,EAAe,QAAUE,IAAkB,KAAM,CACtClG,EAAAsG,GAAiBxG,EAASE,EAAYgG,CAAa,EAChE,MAAMO,EAAqB,MAAMhB,GAAeb,EAAK1E,CAAU,EAC/DkG,EAAgBK,GAAA,YAAAA,EAAoB,aAAA,CAGtC,MAAMC,EAAW,CACf,GAAIN,GAAiBE,EACrB,IAAKA,EAAO,IACZ,KAAMA,EAAO,KACb,iBAAkBA,GAAA,YAAAA,EAAQ,WAC1B,QAAAtG,EACA,WAAAE,EACA,YACEkG,GAAA,YAAAA,EAAe,cAAe,oBAC1BA,GAAA,YAAAA,EAAe,IACf,MACR,EAEMO,EAAcjB,EAAMgB,EAAW3G,EAAqB2G,CAAQ,EAE5DE,GAAWxI,GAAAH,GAAAC,EAAA2C,GAAA,YAAAA,EAAQ,cAAR,YAAA3C,EAAqB,SAArB,YAAAD,EAA6B,iBAA7B,YAAAG,EAA6C,aAE9D,OAAIwI,EACKA,EAASN,EAAQK,CAAY,EAG/BA,CACT,EAEA,SAASd,GAAmBgB,EAA2B,CACjD,GAAAA,EAAI,OAAS,EACf,MAAO,CAACA,CAAG,EAGb,MAAMC,EAAqB,CAAC,EAExB,OAAAD,EAAA,QAASE,GAAS,CACpB,MAAMC,EAAiB,CAAC,EAEpBH,EAAA,QAASI,GAAU,CACjBF,IAASE,GACXD,EAAK,KAAKC,CAAK,CACjB,CACD,EAEDH,EAAO,KAAKE,CAAI,CAAA,CACjB,EAEMF,CACT,CAEA,SAASf,GAAsB7F,EAAwB0E,EAAqB,CAC1E,OAAO1E,EACJ,IAAI,CAACgH,EAAeC,IACZ;AAAA,yBACYA,CAAC;AAAA;AAAA,gBAEVD,EAAI,IAAKxF,GAAO,IAAIA,CAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,oBAEjCkD,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SASlB,EACA,KAAK,EAAE,CACZ,CAEA,SAAS2B,GACPvG,EACAsG,EAAa,CAAA,EACbJ,EACA,CAEA,MAAMG,EAAsB,OAAO,OAAOrG,CAAO,EAC9C,OAAQoH,GAAM,CAAC,CAACA,CAAC,EACjB,OAAO,CAACC,EAAUC,IACZA,EAAK,QAEH,CAAC,GAAGD,EAAK,GAAGC,EAAK,OAAO,EAFL,CAAC,GAAGD,CAAG,EAGhC,EAAE,EAGDE,EAAM,IAAI,IAAIjB,EAAO,IAAKS,GAAc,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EAG/C,OAAAV,EAAA,QAASmB,GAAiB,CAEnCtB,GAAA,MAAAA,EAAe,SAASsB,EAAQ,KAIhCD,EAAA,IAAIC,EAAQ,GAAIA,CAAO,CAAA,CAC5B,EAEM,CAAC,GAAGD,EAAI,QAAQ,CACzB,CAEA,SAASf,GACPxG,EACAsE,EACA4B,EACU,CACV,MAAMuB,EAA+B,CAAC,EAElC,IAAAC,EACI,OAAA1H,EAAA,QAASmD,GAAgB,aAC3B+C,EAAc,SAAS/C,EAAO,EAAE,EAClCuE,IACEzJ,GAAAC,EAAAiF,EAAO,SAAP,YAAAjF,EAAe,KAAMV,GAAe8G,EAAY,SAAS9G,GAAA,YAAAA,EAAO,EAAE,KAAlE,YAAAS,EACI,OAAMG,EAAA+E,EAAO,OAAO,CAAC,IAAf,YAAA/E,EAAkB,IAEhBsJ,GAAAvJ,EAAAgF,EAAO,OAAO,CAAC,IAAf,YAAAhF,EAAkB,GAElCsJ,EAAmB,KAAKC,CAAW,CAAA,CACpC,EACMD,CACT,CCzJa,MAAAjD,GAAmB,MAAOI,EAAa5E,IAAsB,CAExE,KAAM,CAAE,QAAS2H,EAAgB,YAAaC,CAAmB,EAC/D/G,EAAO,UAAU,EAGb,CACJ,YAAAyD,EAAcsD,EACd,QAAAC,EAAUF,EACV,qBAAA7D,EACA,SAAA7D,EACA,cAAA6H,CACF,EAAI9H,GAAW,CAAC,EAQhB,MAAO,CAACC,GAAYqE,GAAeA,EAAY,OAAS,EACpD,MAAM2B,GAAkBrB,EAAKN,EAAauD,EAASC,CAAa,EAChE,MAAMrC,GACJb,EACA,CACE,qBAAAd,EACA,YAAAQ,CACF,EACAwD,CACF,CACN"}
@@ -19,12 +19,19 @@ export interface ProductGalleryProps extends Omit<HTMLAttributes<HTMLDivElement>
19
19
  zoom?: {
20
20
  closeButton: boolean;
21
21
  } | boolean;
22
+ videos?: boolean | {
23
+ position: 'first' | 'last';
24
+ };
22
25
  slots?: {
23
26
  CarouselThumbnail?: SlotProps<DefaultSlotContext & {
24
27
  defaultImageProps: ImageProps;
28
+ mediaType?: 'image' | 'video';
29
+ previewUrl?: string;
25
30
  }>;
26
31
  CarouselMainImage?: SlotProps<DefaultSlotContext & {
27
32
  defaultImageProps: ImageProps;
33
+ mediaType?: 'image' | 'video';
34
+ previewUrl?: string;
28
35
  }>;
29
36
  };
30
37
  }
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as A,jsxs as K}from"@dropins/tools/preact-jsx-runtime.js";import{useState as R,useEffect as U,useMemo as w}from"@dropins/tools/preact-compat.js";import{Slot as Z}from"@dropins/tools/lib.js";import{Image as j}from"@dropins/tools/components.js";import{events as V}from"@dropins/tools/event-bus.js";import{g as W}from"../chunks/getFetchedProductData.js";import{Z as X,C as v,O as Y}from"../chunks/Zoom.js";/* empty css */import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{useText as $}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const s=({initialData:G=null,scope:I,controls:k="dots",loop:C=!0,peak:H=!1,gap:N=null,arrows:Q=!0,arrowsOnMainImage:F=!1,zoom:h=!1,imageParams:t,thumbnailParams:o,children:L,slots:l,...q})=>{var y,T,_,S,D,E;const n=$("PDP.Product.Image.label").label,[e,z]=R(G),[f,B]=R(null);U(()=>{const r=V.on("pdp/data",z,{scope:I});return()=>{r==null||r.off()}},[I]);const g=w(()=>({data:e}),[e]),x=w(()=>{var r;return((r=e==null?void 0:e.images)==null?void 0:r.map(({label:i,url:c},p)=>{const d=({...u})=>{var O;const M={title:i,src:c,alt:n==null?void 0:n.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((O=e==null?void 0:e.images)==null?void 0:O.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:p===0?"eager":"lazy",...u};return A(Z,{name:"CarouselMainImage",slot:l==null?void 0:l.CarouselMainImage,context:{...g,defaultImageProps:M},children:A(j,{...M})})};return h?A(X,{closeButton:typeof h=="object"?h.closeButton:!1,children:A(d,{})},c):A(d,{onClick:()=>B(p)},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder")},[n,e==null?void 0:e.images,t,h,g,l==null?void 0:l.CarouselMainImage]),J=w(()=>{var r;return((r=e==null?void 0:e.images)==null?void 0:r.map(({label:i,url:c},p)=>{var u;const d={title:i,src:c,alt:n==null?void 0:n.replace("{product}",i).replace("{key}",String(p+1)).replace("{total}",String((u=e==null?void 0:e.images)==null?void 0:u.length)),width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,params:o??{width:200},loading:"lazy"};return A(Z,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:l==null?void 0:l.CarouselThumbnail,context:{...g,defaultImageProps:d},children:A(j,{...d})},c)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,"aria-hidden":!0},"pleaceholder")},[n,e==null?void 0:e.images,o,g,l==null?void 0:l.CarouselThumbnail]);return e?K("div",{...q,children:[A(v,{arrows:!!((y=e==null?void 0:e.images)!=null&&y.length)&&Q,arrowsOnMainImage:F,controls:(T=e==null?void 0:e.images)!=null&&T.length?k:void 0,loop:C&&!!((_=e.images)!=null&&_.length),peak:!!((S=e==null?void 0:e.images)!=null&&S.length)&&H,gap:N,defaultIndex:f||0,thumbnails:J,children:x}),f===null?null:A(Y,{onClose:()=>B(null),centered:!0,children:A(v,{arrows:!!((D=e==null?void 0:e.images)!=null&&D.length),width:"100%",height:"100%",defaultIndex:f,loop:C&&!!((E=e.images)!=null&&E.length),controls:"dots",isZoomed:!0,children:x})})]}):null};s.getInitialData=W;export{s as ProductGallery,s as default};
3
+ import{jsx as l,jsxs as B}from"@dropins/tools/preact-jsx-runtime.js";import{useState as D,useEffect as G,useMemo as I}from"@dropins/tools/preact-compat.js";import{Slot as E}from"@dropins/tools/lib.js";import{Image as M}from"@dropins/tools/components.js";import{events as H}from"@dropins/tools/event-bus.js";import{g as Q}from"../chunks/getFetchedProductData.js";import{Z as s,C as O,O as W}from"../chunks/Zoom.js";/* empty css */import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{useText as X}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const Y=[".mp4",".webm",".ogg",".mov",".avi",".mkv"];function q(c){if(!c)return!1;const n=c.toLowerCase();return Y.some(y=>n.includes(y))}function Z(c,n){if(n)return n;if(c!=null&&c.includes("adobeaemcloud.com")&&c.endsWith("/play"))return c.replace(/\/play$/,"/as/thumbnail.png")}function J(c){if(!c)return"";const n=c.match(/(?:youtube\.com\/(?:watch\?v=|embed\/)|youtu\.be\/)([a-zA-Z0-9_-]+)/);if(n)return`https://www.youtube.com/embed/${n[1]}?rel=0`;const y=c.match(/vimeo\.com\/(?:video\/)?(\d+)/);return y?`https://player.vimeo.com/video/${y[1]}`:c}const K=({initialData:c=null,scope:n,controls:y="dots",loop:T=!0,peak:j=!1,gap:R=null,arrows:V=!0,arrowsOnMainImage:$=!1,zoom:g=!1,videos:v=!1,imageParams:t,thumbnailParams:o,children:L,slots:p,...k})=>{const h=X("PDP.Product.Image.label").label,[d,z]=D(c),[C,S]=D(null);G(()=>{const e=H.on("pdp/data",z,{scope:n});return()=>{e==null||e.off()}},[n]);const _=I(()=>({data:d}),[d]),r=I(()=>{var A,f;const e=((A=d==null?void 0:d.images)==null?void 0:A.map(u=>({type:"image",url:u.url,label:u.label})))??[];if(!v)return e;const i=((f=d==null?void 0:d.videos)==null?void 0:f.map(u=>({type:"video",url:u.url,label:u.title??"",preview:u.preview})))??[];return(typeof v=="object"?v.position:"last")==="first"?[...i,...e]:[...e,...i]},[d==null?void 0:d.images,d==null?void 0:d.videos,v]),x=I(()=>r.length>0?r.map((e,i)=>{const w=({...A})=>{var N;const f={title:e.label,src:e.url,alt:h==null?void 0:h.replace("{product}",e.label).replace("{key}",String(i+1)).replace("{total}",String(r.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:i===0?"eager":"lazy",...A},u=e.type==="video"?Z(e.url,(N=e.preview)==null?void 0:N.url):void 0;return l(E,{name:"CarouselMainImage",slot:p==null?void 0:p.CarouselMainImage,context:{..._,defaultImageProps:f,mediaType:e.type,previewUrl:u},children:e.type==="video"?q(e.url)?B("video",{className:"pdp-product-gallery__video",controls:!0,preload:"metadata",poster:u,width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,children:[l("source",{src:e.url,type:"video/mp4"}),"Your browser does not support the video tag."]}):l("iframe",{className:"pdp-product-gallery__video-iframe",src:J(e.url),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,frameBorder:"0",loading:"lazy",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0}):l(M,{...f})})};return g?l(s,{closeButton:typeof g=="object"?g.closeButton:!1,children:l(w,{})},e.url):l(w,{onClick:()=>S(i)},e.url)}):l("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder"),[h,r,t,g,_,p==null?void 0:p.CarouselMainImage]),F=I(()=>r.length>0?r.map((e,i)=>{var f;const w={title:e.label,src:e.url,alt:h==null?void 0:h.replace("{product}",e.label).replace("{key}",String(i+1)).replace("{total}",String(r.length)),width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,params:o??{width:200},loading:"lazy"},A=e.type==="video"?Z(e.url,(f=e.preview)==null?void 0:f.url):void 0;return l(E,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:p==null?void 0:p.CarouselThumbnail,context:{..._,defaultImageProps:w,mediaType:e.type,previewUrl:A},children:e.type==="video"?B("span",{className:"pdp-product-gallery__video-thumbnail",children:[A?l("img",{src:A,alt:`Video: ${e.label}`,width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,loading:"lazy"}):l("span",{className:"pdp-product-gallery__video-thumbnail-placeholder",style:{width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248}}),l("span",{className:"pdp-product-gallery__video-icon",children:"▶"})]}):l(M,{...w})},e.url)}):l("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,"aria-hidden":!0},"pleaceholder"),[h,r,o,_,p==null?void 0:p.CarouselThumbnail]);return d?B("div",{...k,children:[l(O,{arrows:!!r.length&&V,arrowsOnMainImage:$,controls:r.length?y:void 0,loop:T&&!!r.length,peak:!!r.length&&j,gap:R,defaultIndex:C||0,thumbnails:F,children:x}),C===null?null:l(W,{onClose:()=>S(null),centered:!0,children:l(O,{arrows:!!r.length,width:"100%",height:"100%",defaultIndex:C,loop:T&&!!r.length,controls:"dots",isZoomed:!0,children:x})})]}):null};K.getInitialData=Q;export{K as ProductGallery,K as default};
4
4
  //# sourceMappingURL=ProductGallery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductGallery.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGallery/ProductGallery.tsx"],"sourcesContent":["import { HTMLAttributes, useEffect, useMemo, useState } from 'preact/compat';\nimport {\n Container,\n ResolveImageUrlOptions,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\n\nimport { Image, ImageProps } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\nimport { getFetchedProductData } from '@/pdp/api';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Carousel, Overlay, Zoom } from '@/pdp/components';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductGalleryProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n scope?: string;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n loop?: boolean;\n peak?: boolean;\n gap?: 'small' | 'medium' | 'large' | null;\n arrows?: boolean;\n arrowsOnMainImage?: boolean;\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n zoom?: { closeButton: boolean } | boolean;\n slots?: {\n CarouselThumbnail?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n CarouselMainImage?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n };\n}\n\nexport const ProductGallery: Container<\n ProductGalleryProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n controls = 'dots',\n loop = true,\n peak = false,\n gap = null,\n arrows = true,\n arrowsOnMainImage = false,\n zoom = false,\n imageParams,\n thumbnailParams,\n children,\n slots,\n ...props\n}) => {\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [zoomTo, setZoomTo] = useState<number | null>(null);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n const images = useMemo(\n () =>\n data?.images?.map(({ label, url }, key) => {\n const Item = ({ ...itemProps }) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: imageParams?.width ?? 960,\n height: imageParams?.height ?? 1191,\n params: imageParams ?? { width: 960 },\n loading: key === 0 ? 'eager' : 'lazy',\n ...itemProps,\n } as const;\n\n return (\n <Slot\n name=\"CarouselMainImage\"\n slot={slots?.CarouselMainImage}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n };\n\n return zoom ? (\n <Zoom\n key={url}\n closeButton={typeof zoom === 'object' ? zoom.closeButton : false}\n >\n <Item />\n </Zoom>\n ) : (\n <Item key={url} onClick={() => setZoomTo(key)} />\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__images__placeholder\"\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n aria-hidden\n />\n ),\n [\n ImagesLabel,\n data?.images,\n imageParams,\n zoom,\n defaultSlotContext,\n slots?.CarouselMainImage,\n ]\n );\n\n const thumbnails = useMemo(() => {\n return (\n data?.images?.map(({ label, url }, key) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n params: thumbnailParams ?? { width: 200 },\n loading: 'lazy',\n } as const;\n\n return (\n <Slot\n key={url}\n name=\"CarouselThumbnail\"\n slotTag=\"span\"\n contentTag=\"span\"\n slot={slots?.CarouselThumbnail}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__thumbnail__placeholder\"\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n aria-hidden\n />\n )\n );\n }, [\n ImagesLabel,\n data?.images,\n thumbnailParams,\n defaultSlotContext,\n slots?.CarouselThumbnail,\n ]);\n\n if (!data) return null;\n\n return (\n <div {...props}>\n {/* Carousel */}\n <Carousel\n arrows={!!data?.images?.length && arrows}\n arrowsOnMainImage={arrowsOnMainImage}\n controls={data?.images?.length ? controls : undefined}\n loop={loop && !!data.images?.length}\n peak={!!data?.images?.length && peak}\n gap={gap}\n defaultIndex={zoomTo || 0}\n thumbnails={thumbnails}\n >\n {images}\n </Carousel>\n\n {/* Zoom Overlay */}\n {zoomTo === null ? null : (\n <Overlay onClose={() => setZoomTo(null)} centered>\n <Carousel\n arrows={!!data?.images?.length}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoomTo}\n loop={loop && !!data.images?.length}\n controls=\"dots\"\n isZoomed\n >\n {images}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n\nProductGallery.getInitialData = getFetchedProductData;\n"],"names":["ProductGallery","initialData","scope","controls","loop","peak","gap","arrows","arrowsOnMainImage","zoom","imageParams","thumbnailParams","children","slots","props","ImagesLabel","useText","data","setData","useState","zoomTo","setZoomTo","useEffect","dataEvent","events","defaultSlotContext","useMemo","images","_a","label","url","key","Item","itemProps","defaultProps","jsx","Slot","Image","Zoom","thumbnails","jsxs","Carousel","_b","_c","_d","Overlay","_e","_f","getFetchedProductData"],"mappings":"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"}
1
+ {"version":3,"file":"ProductGallery.js","sources":["/@dropins/storefront-pdp/src/lib/videoUtils.ts","/@dropins/storefront-pdp/src/containers/ProductGallery/ProductGallery.tsx"],"sourcesContent":["/**\n * Video utility functions for ProductGallery\n */\n\nconst VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv'];\n\n/**\n * Checks if URL is a direct video file based on extension\n * @param url - The video URL\n * @returns true if direct video file\n */\nexport function isDirectVideoFile(url: string): boolean {\n if (!url) return false;\n const lowerUrl = url.toLowerCase();\n return VIDEO_EXTENSIONS.some((ext) => lowerUrl.includes(ext));\n}\n\n/**\n * Gets the preview image URL for a video.\n * Uses provided preview URL if available, otherwise tries to derive from video URL.\n * @param videoUrl - The video URL\n * @param previewUrl - The preview URL from data (if available)\n * @returns The preview image URL or undefined\n */\nexport function getVideoPreviewUrl(\n videoUrl: string,\n previewUrl?: string\n): string | undefined {\n // Use provided preview URL if available\n if (previewUrl) return previewUrl;\n\n // Fallback: Derive thumbnail for AEM Assets URLs\n // Pattern: .../urn:aaid:aem:.../play -> .../urn:aaid:aem:.../as/thumbnail.png\n if (videoUrl?.includes('adobeaemcloud.com') && videoUrl.endsWith('/play')) {\n return videoUrl.replace(/\\/play$/, '/as/thumbnail.png');\n }\n\n return undefined;\n}\n\n/**\n * Converts YouTube/Vimeo URLs to embeddable URLs.\n * Returns original URL for other video sources.\n * @param url - The original video URL\n * @returns The embed URL\n */\nexport function getEmbedUrl(url: string): string {\n if (!url) return '';\n\n // YouTube: various formats\n // https://www.youtube.com/watch?v=VIDEO_ID\n // https://youtu.be/VIDEO_ID\n // https://www.youtube.com/embed/VIDEO_ID\n const youtubeMatch = url.match(\n /(?:youtube\\.com\\/(?:watch\\?v=|embed\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]+)/\n );\n if (youtubeMatch) {\n return `https://www.youtube.com/embed/${youtubeMatch[1]}?rel=0`;\n }\n\n // Vimeo: various formats\n // https://vimeo.com/VIDEO_ID\n // https://player.vimeo.com/video/VIDEO_ID\n const vimeoMatch = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);\n if (vimeoMatch) {\n return `https://player.vimeo.com/video/${vimeoMatch[1]}`;\n }\n\n // Return original URL for other sources (AEM, etc.)\n return url;\n}\n","import { HTMLAttributes, useEffect, useMemo, useState } from 'preact/compat';\nimport {\n Container,\n ResolveImageUrlOptions,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\n\nimport { Image, ImageProps } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\nimport { getFetchedProductData } from '@/pdp/api';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Carousel, Overlay, Zoom } from '@/pdp/components';\nimport {\n isDirectVideoFile,\n getEmbedUrl,\n getVideoPreviewUrl,\n} from '@/pdp/lib/videoUtils';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductGalleryProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n scope?: string;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n loop?: boolean;\n peak?: boolean;\n gap?: 'small' | 'medium' | 'large' | null;\n arrows?: boolean;\n arrowsOnMainImage?: boolean;\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n zoom?: { closeButton: boolean } | boolean;\n videos?: boolean | { position: 'first' | 'last' };\n slots?: {\n CarouselThumbnail?: SlotProps<\n DefaultSlotContext & {\n defaultImageProps: ImageProps;\n mediaType?: 'image' | 'video';\n previewUrl?: string;\n }\n >;\n CarouselMainImage?: SlotProps<\n DefaultSlotContext & {\n defaultImageProps: ImageProps;\n mediaType?: 'image' | 'video';\n previewUrl?: string;\n }\n >;\n };\n}\n\nexport const ProductGallery: Container<\n ProductGalleryProps,\n ProductModel | null\n> = ({\n initialData = null,\n scope,\n controls = 'dots',\n loop = true,\n peak = false,\n gap = null,\n arrows = true,\n arrowsOnMainImage = false,\n zoom = false,\n videos = false,\n imageParams,\n thumbnailParams,\n children,\n slots,\n ...props\n}) => {\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [zoomTo, setZoomTo] = useState<number | null>(null);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n return () => {\n dataEvent?.off();\n };\n }, [scope]);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n // Combine images and videos into a single media array based on videos prop\n const mediaItems = useMemo(() => {\n const imageItems =\n data?.images?.map((img) => ({\n type: 'image' as const,\n url: img.url,\n label: img.label,\n })) ?? [];\n\n if (!videos) {\n return imageItems;\n }\n\n const videoItems =\n data?.videos?.map((video) => ({\n type: 'video' as const,\n url: video.url,\n label: video.title ?? '',\n preview: video.preview,\n })) ?? [];\n\n const position = typeof videos === 'object' ? videos.position : 'last';\n\n return position === 'first'\n ? [...videoItems, ...imageItems]\n : [...imageItems, ...videoItems];\n }, [data?.images, data?.videos, videos]);\n\n const galleryItems = useMemo(\n () =>\n mediaItems.length > 0 ? (\n mediaItems.map((item, key) => {\n const Item = ({ ...itemProps }) => {\n const defaultProps = {\n title: item.label,\n src: item.url,\n alt: ImagesLabel?.replace('{product}', item.label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(mediaItems.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: imageParams?.width ?? 960,\n height: imageParams?.height ?? 1191,\n params: imageParams ?? { width: 960 },\n loading: key === 0 ? 'eager' : 'lazy',\n ...itemProps,\n } as const;\n\n const previewUrl =\n item.type === 'video'\n ? getVideoPreviewUrl(item.url, item.preview?.url)\n : undefined;\n\n return (\n <Slot\n name=\"CarouselMainImage\"\n slot={slots?.CarouselMainImage}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n mediaType: item.type,\n previewUrl,\n }}\n >\n {item.type === 'video' ? (\n isDirectVideoFile(item.url) ? (\n <video\n className=\"pdp-product-gallery__video\"\n controls\n preload=\"metadata\"\n poster={previewUrl}\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n >\n <source src={item.url} type=\"video/mp4\" />\n Your browser does not support the video tag.\n </video>\n ) : (\n <iframe\n className=\"pdp-product-gallery__video-iframe\"\n src={getEmbedUrl(item.url)}\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n frameBorder=\"0\"\n loading=\"lazy\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n )\n ) : (\n <Image {...defaultProps} />\n )}\n </Slot>\n );\n };\n\n return zoom ? (\n <Zoom\n key={item.url}\n closeButton={typeof zoom === 'object' ? zoom.closeButton : false}\n >\n <Item />\n </Zoom>\n ) : (\n <Item key={item.url} onClick={() => setZoomTo(key)} />\n );\n })\n ) : (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__images__placeholder\"\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n aria-hidden\n />\n ),\n [\n ImagesLabel,\n mediaItems,\n imageParams,\n zoom,\n defaultSlotContext,\n slots?.CarouselMainImage,\n ]\n );\n\n const thumbnails = useMemo(() => {\n return mediaItems.length > 0 ? (\n mediaItems.map((item, key) => {\n const defaultProps = {\n title: item.label,\n src: item.url,\n alt: ImagesLabel?.replace('{product}', item.label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(mediaItems.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n params: thumbnailParams ?? { width: 200 },\n loading: 'lazy',\n } as const;\n\n const previewUrl =\n item.type === 'video'\n ? getVideoPreviewUrl(item.url, item.preview?.url)\n : undefined;\n\n return (\n <Slot\n key={item.url}\n name=\"CarouselThumbnail\"\n slotTag=\"span\"\n contentTag=\"span\"\n slot={slots?.CarouselThumbnail}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n mediaType: item.type,\n previewUrl,\n }}\n >\n {item.type === 'video' ? (\n <span className=\"pdp-product-gallery__video-thumbnail\">\n {previewUrl ? (\n <img\n src={previewUrl}\n alt={`Video: ${item.label}`}\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n loading=\"lazy\"\n />\n ) : (\n <span\n className=\"pdp-product-gallery__video-thumbnail-placeholder\"\n style={{\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n }}\n />\n )}\n <span className=\"pdp-product-gallery__video-icon\">▶</span>\n </span>\n ) : (\n <Image {...defaultProps} />\n )}\n </Slot>\n );\n })\n ) : (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__thumbnail__placeholder\"\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n aria-hidden\n />\n );\n }, [\n ImagesLabel,\n mediaItems,\n thumbnailParams,\n defaultSlotContext,\n slots?.CarouselThumbnail,\n ]);\n\n if (!data) return null;\n\n return (\n <div {...props}>\n {/* Carousel */}\n <Carousel\n arrows={!!mediaItems.length && arrows}\n arrowsOnMainImage={arrowsOnMainImage}\n controls={mediaItems.length ? controls : undefined}\n loop={loop && !!mediaItems.length}\n peak={!!mediaItems.length && peak}\n gap={gap}\n defaultIndex={zoomTo || 0}\n thumbnails={thumbnails}\n >\n {galleryItems}\n </Carousel>\n\n {/* Zoom Overlay */}\n {zoomTo === null ? null : (\n <Overlay onClose={() => setZoomTo(null)} centered>\n <Carousel\n arrows={!!mediaItems.length}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoomTo}\n loop={loop && !!mediaItems.length}\n controls=\"dots\"\n isZoomed\n >\n {galleryItems}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n\nProductGallery.getInitialData = getFetchedProductData;\n"],"names":["VIDEO_EXTENSIONS","isDirectVideoFile","url","lowerUrl","ext","getVideoPreviewUrl","videoUrl","previewUrl","getEmbedUrl","youtubeMatch","vimeoMatch","ProductGallery","initialData","scope","controls","loop","peak","gap","arrows","arrowsOnMainImage","zoom","videos","imageParams","thumbnailParams","children","slots","props","ImagesLabel","useText","data","setData","useState","zoomTo","setZoomTo","useEffect","dataEvent","events","defaultSlotContext","useMemo","mediaItems","imageItems","_a","img","videoItems","_b","video","galleryItems","item","key","Item","itemProps","defaultProps","jsx","Slot","jsxs","Image","Zoom","thumbnails","Carousel","Overlay","getFetchedProductData"],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
2
  import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
+ import { OptionsTransformer } from '../../api';
4
5
  import { ImageNodeRenderProps, ImageProps } from '@dropins/tools/types/elsie/src/components';
5
6
 
7
+ /** @deprecated Use OptionsTransformer from @/pdp/api instead */
8
+ export type ProductOptionsTransformer = OptionsTransformer;
6
9
  export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
7
10
  scope?: string;
8
11
  hideSelectedValue?: boolean;
@@ -10,6 +13,7 @@ export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
10
13
  onErrors?: (errors: {
11
14
  [id: string]: string;
12
15
  }) => void;
16
+ transformer?: ProductOptionsTransformer;
13
17
  slots?: {
14
18
  Swatches?: SlotProps<{
15
19
  data: ProductModel | null;
@@ -15,4 +15,5 @@
15
15
  */
16
16
  export * from './ProductOptions';
17
17
  export { ProductOptions as default } from './ProductOptions';
18
+ export type { ProductOptionsTransformer } from './ProductOptions';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as d}from"@dropins/tools/preact-jsx-runtime.js";import{useState as h,useEffect as z,useCallback as j}from"@dropins/tools/preact-compat.js";import{Slot as C}from"@dropins/tools/lib.js";import{events as S}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";/* empty css */import{S as A}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{c as v,l as G,j as H,p as J}from"../chunks/fetchProductData.js";import{g as O,s as b}from"../chunks/getProductConfigurationValues.js";import{s as y}from"../chunks/isProductConfigurationValid.js";import{g as K}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Q=({initialData:s={data:null,optionsUIDs:[]},scope:i,hideSelectedValue:l=!1,slots:o,onValues:m,onErrors:u,children:V,...B})=>{var I;const[t,T]=h(s.data),[p,F]=h(s.optionsUIDs),[M,L]=h();z(()=>{const n=S.on("pdp/data",T,{scope:i}),c=S.on("pdp/values",({optionsUIDs:f})=>{f&&F(f)},{scope:i});return()=>{n==null||n.off(),c==null||c.off()}},[]);const N=j(async n=>{var U,w,D,k;if(!(t!=null&&t.sku))return;const{persistURLParams:c,anchors:f,acdl:q}=v.getConfig()??{};let r=Object.keys(n).map(a=>n[a].value).filter(a=>a!==void 0);c&&!(t!=null&&t.isBundle)&&G({optionsUIDs:r.join(",")}),((w=(U=O({scope:i}))==null?void 0:U.optionsUIDs)==null?void 0:w.join("|"))!==(r==null?void 0:r.join("|"))&&b(a=>({...a,optionsUIDs:r}),{scope:i}),m==null||m(r);const e=await H(t.sku,{optionsUIDs:r??[],isBundle:t==null?void 0:t.isBundle,anchors:f});S.emit("pdp/data",e,{scope:i});let P=(r==null?void 0:r.length)===((D=e==null?void 0:e.options)==null?void 0:D.length);if(f!=null&&f.length){const a=(e==null?void 0:e.optionUIDs)??[];r.every(g=>a.includes(g))||(L(e==null?void 0:e.options),b(g=>({...g,optionsUIDs:a}),{scope:i}),P=(a==null?void 0:a.length)===((k=e==null?void 0:e.options)==null?void 0:k.length))}y(()=>P,{scope:i}),q&&e&&(e==null?void 0:e.variantSku)!==t.sku&&J(e)},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,m,i]),R=j(n=>{Object.keys(n).length!==0&&(y(()=>!1,{scope:i}),u==null||u(n))},[u,i]);return!t||!t.options?null:d(C,{name:"Swatches",slot:o==null?void 0:o.Swatches,context:{data:t,optionsUIDs:p},children:d(A,{...B,options:t.options,selectedUIDs:p,defaultOptions:p,selectionsToUpdate:M,hideSelectedValue:l,disablePreselections:!((I=v.getConfig())!=null&&I.preselectFirstOption),onValues:N,onErrors:R,imageSwatchNode:o!=null&&o.SwatchImage?({imageSwatchContext:n,...c})=>d(C,{name:"SwatchImage",slot:o==null?void 0:o.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:p,defaultImageProps:c,imageSwatchContext:n}}):void 0})})};Q.getInitialData=async function(s){var o;const i=await K({scope:s==null?void 0:s.scope}),l=((o=O({scope:s==null?void 0:s.scope}))==null?void 0:o.optionsUIDs)??[];return{data:i,optionsUIDs:l}};export{Q as ProductOptions,Q as default};
3
+ import{jsx as h}from"@dropins/tools/preact-jsx-runtime.js";import{useState as P,useEffect as G,useCallback as C,useMemo as H}from"@dropins/tools/preact-compat.js";import{Slot as O}from"@dropins/tools/lib.js";import{events as S}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";/* empty css */import{S as J}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import"@dropins/tools/preact-hooks.js";/* empty css *//* empty css */import{c as y,l as K,j as Q,p as V}from"../chunks/fetchProductData.js";import{g as T,s as b}from"../chunks/getProductConfigurationValues.js";import{s as B}from"../chunks/isProductConfigurationValid.js";import{g as W}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const X=({initialData:s={data:null,optionsUIDs:[]},scope:o,hideSelectedValue:g=!1,transformer:f,slots:a,onValues:p,onErrors:m,children:Y,...M})=>{var w;const[t,F]=P(s.data),[l,L]=P(s.optionsUIDs),[N,R]=P();G(()=>{const i=S.on("pdp/data",F,{scope:o}),c=S.on("pdp/values",({optionsUIDs:u})=>{u&&L(u)},{scope:o});return()=>{i==null||i.off(),c==null||c.off()}},[]);const q=C(async i=>{var D,k,j,v;if(!(t!=null&&t.sku))return;const{persistURLParams:c,anchors:u,acdl:A}=y.getConfig()??{};let r=Object.keys(i).map(n=>i[n].value).filter(n=>n!==void 0);c&&!(t!=null&&t.isBundle)&&K({optionsUIDs:r.join(",")}),((k=(D=T({scope:o}))==null?void 0:D.optionsUIDs)==null?void 0:k.join("|"))!==(r==null?void 0:r.join("|"))&&b(n=>({...n,optionsUIDs:r}),{scope:o}),p==null||p(r);const e=await Q(t.sku,{optionsUIDs:r??[],isBundle:t==null?void 0:t.isBundle,anchors:u});S.emit("pdp/data",e,{scope:o});let U=(r==null?void 0:r.length)===((j=e==null?void 0:e.options)==null?void 0:j.length);if(u!=null&&u.length){const n=(e==null?void 0:e.optionUIDs)??[];r.every(d=>n.includes(d))||(R(e==null?void 0:e.options),b(d=>({...d,optionsUIDs:n}),{scope:o}),U=(n==null?void 0:n.length)===((v=e==null?void 0:e.options)==null?void 0:v.length))}B(()=>U,{scope:o}),A&&e&&(e==null?void 0:e.variantSku)!==t.sku&&V(e)},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,p,o]),z=C(i=>{Object.keys(i).length!==0&&(B(()=>!1,{scope:o}),m==null||m(i))},[m,o]),I=H(()=>{if(t!=null&&t.options){if(!f)return t.options;try{return f(t.options)??t.options}catch(i){return console.error("ProductOptions: transformer threw an error, using original options",i),t.options}}},[t==null?void 0:t.options,f]);return!t||!I?null:h(O,{name:"Swatches",slot:a==null?void 0:a.Swatches,context:{data:t,optionsUIDs:l},children:h(J,{...M,options:I,selectedUIDs:l,defaultOptions:l,selectionsToUpdate:N,hideSelectedValue:g,disablePreselections:!((w=y.getConfig())!=null&&w.preselectFirstOption),onValues:q,onErrors:z,imageSwatchNode:a!=null&&a.SwatchImage?({imageSwatchContext:i,...c})=>h(O,{name:"SwatchImage",slot:a==null?void 0:a.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:l,defaultImageProps:c,imageSwatchContext:i}}):void 0})})};X.getInitialData=async function(s){var f;const o=await W({scope:s==null?void 0:s.scope}),g=((f=T({scope:s==null?void 0:s.scope}))==null?void 0:f.optionsUIDs)??[];return{data:o,optionsUIDs:g}};export{X as ProductOptions,X as default};
4
4
  //# sourceMappingURL=ProductOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductOptions/ProductOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Swatches } from '@/pdp/components';\nimport {\n setProductConfigurationValues,\n getProductConfigurationValues,\n setProductConfigurationValid,\n fetchProductData,\n getFetchedProductData,\n config,\n} from '@/pdp/api';\nimport { setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport {\n ImageNodeRenderProps,\n ImageProps,\n} from '@adobe-commerce/elsie/components';\n\nexport interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSelectedValue?: boolean;\n onValues?: (optionsUIDs: string[]) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n slots?: {\n Swatches?: SlotProps<{ data: ProductModel | null; optionsUIDs: string[] }>;\n SwatchImage?: SlotProps<{\n data: ProductModel | null;\n optionsUIDs: string[];\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];\n defaultImageProps: ImageProps;\n }>;\n };\n}\n\nexport const ProductOptions: Container<\n ProductOptionsProps,\n { data: ProductModel | null; optionsUIDs: string[] }\n> = ({\n initialData = { data: null, optionsUIDs: [] },\n scope,\n hideSelectedValue = false,\n slots,\n onValues,\n onErrors,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData.data);\n\n const [current, setCurrent] = useState<string[]>(initialData.optionsUIDs);\n\n const [selectionsToUpdate, setSelectionsToUpdate] =\n useState<ProductModel['options']>();\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\n },\n { scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n if (!data?.sku) return;\n\n const { persistURLParams, anchors, acdl } = config.getConfig() ?? {};\n\n // options selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the \"persistURLParams\" is set to true and the product is not a bundle type\n if (persistURLParams && !data?.isBundle) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // check if the options have changed and update the values only if they have changed\n if (\n getProductConfigurationValues({ scope })?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }), {\n scope,\n });\n }\n\n // pass the selected options to callback\n onValues?.(optionsUIDs);\n\n // refetch data\n const next = await fetchProductData(data.sku, {\n optionsUIDs: optionsUIDs ?? [],\n isBundle: data?.isBundle,\n anchors,\n });\n\n // emit the new data\n events.emit('pdp/data', next, { scope });\n\n let valid = optionsUIDs?.length === next?.options?.length;\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (anchors?.length) {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n\n const isMatching = optionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n\n if (!isMatching) {\n setSelectionsToUpdate(next?.options);\n setProductConfigurationValues(\n (prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }),\n { scope }\n );\n\n valid = updatedOptionsUIDs?.length === next?.options?.length;\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid, { scope });\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n },\n [data?.isBundle, data?.sku, onValues, scope]\n );\n\n const handleErrors = useCallback(\n (errors: { [id: string]: string }) => {\n const hasErrors = Object.keys(errors).length !== 0;\n\n if (hasErrors) {\n setProductConfigurationValid(() => false, { scope });\n onErrors?.(errors);\n }\n },\n [onErrors, scope]\n );\n\n if (!data) return null;\n\n // Only show if there are options in the data\n if (!data.options) return null;\n\n return (\n <Slot\n name=\"Swatches\"\n slot={slots?.Swatches}\n context={{ data, optionsUIDs: current }}\n >\n <Swatches\n {...props}\n options={data.options}\n selectedUIDs={current}\n defaultOptions={current}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedValue}\n disablePreselections={!config.getConfig()?.preselectFirstOption}\n onValues={handleOptionSelected}\n onErrors={handleErrors}\n imageSwatchNode={\n slots?.SwatchImage\n ? ({ imageSwatchContext, ...imageProps }) => (\n <Slot\n name=\"SwatchImage\"\n slot={slots?.SwatchImage}\n slotTag=\"span\"\n contentTag=\"span\"\n context={{\n data,\n optionsUIDs: current,\n defaultImageProps: imageProps,\n imageSwatchContext,\n }}\n />\n )\n : undefined\n }\n />\n </Slot>\n );\n};\n\nProductOptions.getInitialData = async function (options) {\n const data = await getFetchedProductData({ scope: options?.scope });\n const optionsUIDs =\n getProductConfigurationValues({ scope: options?.scope })?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","scope","hideSelectedValue","slots","onValues","onErrors","children","props","data","setData","useState","current","setCurrent","selectionsToUpdate","setSelectionsToUpdate","useEffect","dataEvent","events","valuesEvent","optionsUIDs","handleOptionSelected","useCallback","selections","persistURLParams","anchors","acdl","config","id","element","setUrlParams","_b","_a","getProductConfigurationValues","setProductConfigurationValues","prev","next","fetchProductData","valid","_c","updatedOptionsUIDs","item","_d","setProductConfigurationValid","publishProductPageViewEvent","handleErrors","errors","jsx","Slot","Swatches","imageSwatchContext","imageProps","options","getFetchedProductData"],"mappings":"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"}
1
+ {"version":3,"file":"ProductOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductOptions/ProductOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Swatches } from '@/pdp/components';\nimport {\n setProductConfigurationValues,\n getProductConfigurationValues,\n setProductConfigurationValid,\n fetchProductData,\n getFetchedProductData,\n config,\n OptionsTransformer,\n} from '@/pdp/api';\nimport { setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport {\n ImageNodeRenderProps,\n ImageProps,\n} from '@adobe-commerce/elsie/components';\n\n/** @deprecated Use OptionsTransformer from @/pdp/api instead */\nexport type ProductOptionsTransformer = OptionsTransformer;\n\nexport interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: string;\n hideSelectedValue?: boolean;\n onValues?: (optionsUIDs: string[]) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n transformer?: ProductOptionsTransformer;\n slots?: {\n Swatches?: SlotProps<{ data: ProductModel | null; optionsUIDs: string[] }>;\n SwatchImage?: SlotProps<{\n data: ProductModel | null;\n optionsUIDs: string[];\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];\n defaultImageProps: ImageProps;\n }>;\n };\n}\n\nexport const ProductOptions: Container<\n ProductOptionsProps,\n { data: ProductModel | null; optionsUIDs: string[] }\n> = ({\n initialData = { data: null, optionsUIDs: [] },\n scope,\n hideSelectedValue = false,\n transformer,\n slots,\n onValues,\n onErrors,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData.data);\n\n const [current, setCurrent] = useState<string[]>(initialData.optionsUIDs);\n\n const [selectionsToUpdate, setSelectionsToUpdate] =\n useState<ProductModel['options']>();\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData, { scope });\n\n const valuesEvent = events.on(\n 'pdp/values',\n ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\n },\n { scope }\n );\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n if (!data?.sku) return;\n\n const { persistURLParams, anchors, acdl } = config.getConfig() ?? {};\n\n // options selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the \"persistURLParams\" is set to true and the product is not a bundle type\n if (persistURLParams && !data?.isBundle) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // check if the options have changed and update the values only if they have changed\n if (\n getProductConfigurationValues({ scope })?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }), {\n scope,\n });\n }\n\n // pass the selected options to callback\n onValues?.(optionsUIDs);\n\n // refetch data\n const next = await fetchProductData(data.sku, {\n optionsUIDs: optionsUIDs ?? [],\n isBundle: data?.isBundle,\n anchors,\n });\n\n // emit the new data\n events.emit('pdp/data', next, { scope });\n\n let valid = optionsUIDs?.length === next?.options?.length;\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (anchors?.length) {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n\n const isMatching = optionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n\n if (!isMatching) {\n setSelectionsToUpdate(next?.options);\n setProductConfigurationValues(\n (prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }),\n { scope }\n );\n\n valid = updatedOptionsUIDs?.length === next?.options?.length;\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid, { scope });\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n },\n [data?.isBundle, data?.sku, onValues, scope]\n );\n\n const handleErrors = useCallback(\n (errors: { [id: string]: string }) => {\n const hasErrors = Object.keys(errors).length !== 0;\n\n if (hasErrors) {\n setProductConfigurationValid(() => false, { scope });\n onErrors?.(errors);\n }\n },\n [onErrors, scope]\n );\n\n // Apply transformer to options if provided\n const transformedOptions = useMemo(() => {\n if (!data?.options) return undefined;\n\n if (!transformer) {\n return data.options;\n }\n\n try {\n const transformed = transformer(data.options);\n // Fallback to original options if transformer returns null/undefined\n return transformed ?? data.options;\n } catch (error) {\n console.error(\n 'ProductOptions: transformer threw an error, using original options',\n error\n );\n return data.options;\n }\n }, [data?.options, transformer]);\n\n if (!data) return null;\n\n // Only show if there are options in the data\n if (!transformedOptions) return null;\n\n return (\n <Slot\n name=\"Swatches\"\n slot={slots?.Swatches}\n context={{ data, optionsUIDs: current }}\n >\n <Swatches\n {...props}\n options={transformedOptions}\n selectedUIDs={current}\n defaultOptions={current}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedValue}\n disablePreselections={!config.getConfig()?.preselectFirstOption}\n onValues={handleOptionSelected}\n onErrors={handleErrors}\n imageSwatchNode={\n slots?.SwatchImage\n ? ({ imageSwatchContext, ...imageProps }) => (\n <Slot\n name=\"SwatchImage\"\n slot={slots?.SwatchImage}\n slotTag=\"span\"\n contentTag=\"span\"\n context={{\n data,\n optionsUIDs: current,\n defaultImageProps: imageProps,\n imageSwatchContext,\n }}\n />\n )\n : undefined\n }\n />\n </Slot>\n );\n};\n\nProductOptions.getInitialData = async function (options) {\n const data = await getFetchedProductData({ scope: options?.scope });\n const optionsUIDs =\n getProductConfigurationValues({ scope: options?.scope })?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","scope","hideSelectedValue","transformer","slots","onValues","onErrors","children","props","data","setData","useState","current","setCurrent","selectionsToUpdate","setSelectionsToUpdate","useEffect","dataEvent","events","valuesEvent","optionsUIDs","handleOptionSelected","useCallback","selections","persistURLParams","anchors","acdl","config","id","element","setUrlParams","_b","_a","getProductConfigurationValues","setProductConfigurationValues","prev","next","fetchProductData","valid","_c","updatedOptionsUIDs","item","_d","setProductConfigurationValid","publishProductPageViewEvent","handleErrors","errors","transformedOptions","useMemo","error","jsx","Slot","Swatches","imageSwatchContext","imageProps","options","getFetchedProductData"],"mappings":"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"}
@@ -12,6 +12,7 @@ export interface ProductModel {
12
12
  metaTitle?: string;
13
13
  description?: string;
14
14
  images?: Image[];
15
+ videos?: Video[];
15
16
  prices: Prices;
16
17
  attributes?: Attribute[];
17
18
  options?: Option[];
@@ -28,6 +29,17 @@ interface Image {
28
29
  label: string;
29
30
  width: number;
30
31
  height: number;
32
+ roles?: string[];
33
+ }
34
+ interface Video {
35
+ url: string;
36
+ title?: string;
37
+ description?: string;
38
+ preview?: {
39
+ url: string;
40
+ label?: string;
41
+ roles?: string[];
42
+ };
31
43
  }
32
44
  interface Price {
33
45
  amount?: number;
package/fragments.js CHANGED
@@ -107,6 +107,17 @@ fragment PRODUCT_FRAGMENT on ProductView {
107
107
  roles
108
108
  }
109
109
 
110
+ videos {
111
+ description
112
+ url
113
+ title
114
+ preview {
115
+ label
116
+ roles
117
+ url
118
+ }
119
+ }
120
+
110
121
  attributes(roles: []) {
111
122
  name
112
123
  label
package/fragments.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.js","sources":["/@dropins/storefront-pdp/src/api/graphql/ProductOptionFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/PriceRangeFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/ProductFragment.graphql.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport const PRODUCT_OPTION_FRAGMENT = `\nfragment PRODUCT_OPTION_FRAGMENT on ProductViewOption {\n id\n title\n required\n multi\n values {\n id\n title\n inStock\n __typename\n ... on ProductViewOptionValueProduct {\n title\n quantity\n isDefault\n __typename\n product {\n sku\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n name\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n ... on ProductViewOptionValueSwatch {\n id\n title\n type\n value\n inStock\n }\n }\n }\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2025 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport const PRICE_RANGE_FRAGMENT = `\n fragment PRICE_RANGE_FRAGMENT on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_OPTION_FRAGMENT } from '@/pdp/api/graphql/ProductOptionFragment.graphql';\nimport { PRICE_RANGE_FRAGMENT } from './PriceRangeFragment.graphql';\n\nexport const PRODUCT_FRAGMENT = `\nfragment PRODUCT_FRAGMENT on ProductView {\n __typename\n id\n sku\n name\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n description\n inStock\n addToCartAllowed\n url\n urlKey\n externalId\n\n images(roles: []) {\n url\n label\n roles\n }\n\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n\n... on SimpleProductView {\n price {\n roles\n\n regular {\n amount {\n value\n currency\n }\n }\n\n final {\n amount {\n value\n currency\n }\n }\n tiers {\n tier {\n amount {\n value\n currency\n }\n }\n quantity {\n ... on ProductViewTierRangeCondition {\n gte\n lt\n }\n }\n }\n }\n }\n\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n\n ...PRICE_RANGE_FRAGMENT\n }\n}\n\n${PRODUCT_OPTION_FRAGMENT}\n${PRICE_RANGE_FRAGMENT}\n`;\n"],"names":["PRODUCT_OPTION_FRAGMENT","PRICE_RANGE_FRAGMENT","PRODUCT_FRAGMENT"],"mappings":"AAgBO,MAAMA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECA1BC,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECGvBC,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyE9BF,CAAuB;AAAA,EACvBC,CAAoB;"}
1
+ {"version":3,"file":"fragments.js","sources":["/@dropins/storefront-pdp/src/api/graphql/ProductOptionFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/PriceRangeFragment.graphql.ts","/@dropins/storefront-pdp/src/api/graphql/ProductFragment.graphql.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport const PRODUCT_OPTION_FRAGMENT = `\nfragment PRODUCT_OPTION_FRAGMENT on ProductViewOption {\n id\n title\n required\n multi\n values {\n id\n title\n inStock\n __typename\n ... on ProductViewOptionValueProduct {\n title\n quantity\n isDefault\n __typename\n product {\n sku\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n name\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n ... on ProductViewOptionValueSwatch {\n id\n title\n type\n value\n inStock\n }\n }\n }\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2025 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport const PRICE_RANGE_FRAGMENT = `\n fragment PRICE_RANGE_FRAGMENT on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n roles\n }\n }\n }\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_OPTION_FRAGMENT } from '@/pdp/api/graphql/ProductOptionFragment.graphql';\nimport { PRICE_RANGE_FRAGMENT } from './PriceRangeFragment.graphql';\n\nexport const PRODUCT_FRAGMENT = `\nfragment PRODUCT_FRAGMENT on ProductView {\n __typename\n id\n sku\n name\n shortDescription\n metaDescription\n metaKeyword\n metaTitle\n description\n inStock\n addToCartAllowed\n url\n urlKey\n externalId\n\n images(roles: []) {\n url\n label\n roles\n }\n\n videos {\n\t\tdescription\n\t\turl\n\t\ttitle\n\t\tpreview {\n\t\t\tlabel\n\t\t\troles\n\t\t\turl\n\t\t}\n\t}\n\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n\n... on SimpleProductView {\n price {\n roles\n\n regular {\n amount {\n value\n currency\n }\n }\n\n final {\n amount {\n value\n currency\n }\n }\n tiers {\n tier {\n amount {\n value\n currency\n }\n }\n quantity {\n ... on ProductViewTierRangeCondition {\n gte\n lt\n }\n }\n }\n }\n }\n\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n\n ...PRICE_RANGE_FRAGMENT\n }\n}\n\n${PRODUCT_OPTION_FRAGMENT}\n${PRICE_RANGE_FRAGMENT}\n`;\n"],"names":["PRODUCT_OPTION_FRAGMENT","PRICE_RANGE_FRAGMENT","PRODUCT_FRAGMENT"],"mappings":"AAgBO,MAAMA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECA1BC,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECGvBC,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoF9BF,CAAuB;AAAA,EACvBC,CAAoB;"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Video utility functions for ProductGallery
3
+ */
4
+ /**
5
+ * Checks if URL is a direct video file based on extension
6
+ * @param url - The video URL
7
+ * @returns true if direct video file
8
+ */
9
+ export declare function isDirectVideoFile(url: string): boolean;
10
+ /**
11
+ * Gets the preview image URL for a video.
12
+ * Uses provided preview URL if available, otherwise tries to derive from video URL.
13
+ * @param videoUrl - The video URL
14
+ * @param previewUrl - The preview URL from data (if available)
15
+ * @returns The preview image URL or undefined
16
+ */
17
+ export declare function getVideoPreviewUrl(videoUrl: string, previewUrl?: string): string | undefined;
18
+ /**
19
+ * Converts YouTube/Vimeo URLs to embeddable URLs.
20
+ * Returns original URL for other video sources.
21
+ * @param url - The original video URL
22
+ * @returns The embed URL
23
+ */
24
+ export declare function getEmbedUrl(url: string): string;
25
+ //# sourceMappingURL=videoUtils.d.ts.map
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-pdp", "version": "3.0.1-alpha1", "@dropins/tools": "~1.5.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-pdp", "version": "3.0.1-alpha3", "@dropins/tools": "~1.5.0", "license": "SEE LICENSE IN LICENSE.md"}
package/render.js CHANGED
@@ -2,6 +2,6 @@
2
2
  All Rights Reserved. */
3
3
  (function(e,a){try{if(typeof document<"u"){const o=document.createElement("style"),p=a.styleId;for(const r in a.attributes)o.setAttribute(r,a.attributes[r]);o.setAttribute("data-dropin",p),o.appendChild(document.createTextNode(e));const t=document.querySelector('style[data-dropin="sdk"]');if(t)t.after(o);else{const r=document.querySelector('link[rel="stylesheet"], style');r?r.before(o):document.head.append(o)}}}catch(o){console.error("dropin-styles (injectCodeFunction)",o)}})(`.pdp-gift-card-options{display:flex;flex-direction:column;gap:var(--spacing-xsmall)}.pdp-gift-card-options__grid{display:flex;flex-direction:column;gap:var(--spacing-small)}.pdp-gift-card-options__row{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--spacing-small)}.pdp-product__gift-card-options-container{grid-column:1 / -1}.pdp-gift-card-options__option-field{min-width:0;box-sizing:border-box}.pdp-gift-card-options__option-field--full-width{grid-column:1 / -1}.pdp-gift-card-options__label{font-weight:700;margin-bottom:var(--spacing-xsmall)}
4
4
  .pdp-downloadable-options{display:grid;grid-auto-flow:row;grid-gap:var(--grid-1-gutters);grid-auto-rows:max-content;position:relative;z-index:0}.pdp-downloadable-options__field{display:grid;font:var(--type-body-2-strong-font);grid-auto-rows:max-content;gap:var(--spacing-small)}.pdp-downloadable-options__field__label{font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing);color:var(--color-neutral-800);margin-bottom:var(--spacing-xxsmall)}.pdp-downloadable-options__list{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--spacing-small)}.pdp-downloadable-options__item{position:relative;min-width:0;display:flex;flex-direction:row;align-items:stretch}.pdp-downloadable-options__item--disabled{cursor:not-allowed;opacity:.6}.pdp-downloadable-options__item--disabled .pdp-downloadable-options__clickable{cursor:not-allowed}.pdp-downloadable-options__item--disabled:hover{border-color:var(--color-neutral-300);background-color:var(--color-neutral-50)}.pdp-downloadable-options__item--sample{cursor:default}.pdp-downloadable-options__item--sample:hover{border-color:var(--color-neutral-300);background-color:var(--color-neutral-50)}.pdp-downloadable-options__item--sample .pdp-downloadable-options__clickable{cursor:default;pointer-events:none}.pdp-downloadable-options__clickable{padding:var(--spacing-xsmall);outline:none;border-radius:var(--shape-border-radius-2) 0 0 var(--shape-border-radius-2);border:2px solid var(--color-neutral-300);background-color:var(--color-neutral-50);font:inherit;color:inherit;text-align:left;width:100%;cursor:pointer;display:flex;flex-direction:column;flex:1;transition:all .15s ease}.pdp-downloadable-options__clickable:hover:not(:disabled){border-color:var(--color-neutral-500);background-color:var(--color-neutral-100)}.pdp-downloadable-options__item--selected .pdp-downloadable-options__clickable{border-color:var(--color-brand-500);background-color:var(--color-brand-50)}.pdp-downloadable-options__item--selected .pdp-downloadable-options__clickable:hover:not(:disabled){border-color:var(--color-brand-600);background-color:var(--color-brand-100)}.pdp-downloadable-options__clickable:focus-visible{outline:2px solid var(--color-brand-500);outline-offset:2px}.pdp-downloadable-options__item:has(.pdp-downloadable-options__clickable:focus-visible){outline:2px solid var(--color-brand-500);outline-offset:2px}.pdp-downloadable-options__content{display:flex;flex-direction:column;gap:var(--spacing-xxsmall)}.pdp-downloadable-options__header{width:100%;display:flex;justify-content:space-between;align-items:baseline;gap:var(--spacing-small)}.pdp-downloadable-options__title{font:var(--type-body-2-font);color:var(--color-neutral-900);line-height:1.4;flex:1;min-width:0}.pdp-downloadable-options__sample-button{padding:var(--spacing-xsmall);font:var(--type-details-caption-2-font);color:var(--color-brand-600);background-color:var(--color-neutral-50);border:2px solid var(--color-neutral-300);border-left:none;border-radius:0 var(--shape-border-radius-2) var(--shape-border-radius-2) 0;cursor:pointer;flex-shrink:0;white-space:nowrap;text-decoration:none;display:flex;align-items:center}.pdp-downloadable-options__price{font:var(--type-body-2-strong-font);color:var(--color-neutral-900);white-space:nowrap;flex-shrink:0}.pdp-downloadable-options__sample{display:inline-block;padding:0 var(--spacing-xsmall) var(--spacing-xsmall) var(--spacing-xsmall);font:var(--type-details-caption-2-font);color:var(--color-brand-600);text-decoration:underline;text-underline-offset:2px;transition:color .15s ease;cursor:pointer}.pdp-downloadable-options__sample:hover{color:var(--color-brand-700);text-decoration-thickness:2px}
5
- .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 .dropin-button--tertiary--disabled:hover{color:var(--color-neutral-500)}.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}[dir=rtl] .pdp-carousel__button--prev{left:auto;right:0}[dir=rtl] .pdp-carousel__button--next{right:auto;left:0}.pdp-carousel__button__icon--next{transform:rotate(-90deg)}.pdp-carousel__button--next{right:0}.pdp-carousel__button__icon--prev{transform:rotate(90deg)}[dir=rtl] .pdp-carousel__button__icon--prev{transform:rotate(-90deg)}[dir=rtl] .pdp-carousel__button__icon--next{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)}[dir=rtl] .pdp-carousel__button__icon--thumbnailsRow--prev,.pdp-carousel__button__icon--thumbnailsRow--next{transform:rotate(-90deg)}[dir=rtl] .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%;width:100%;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__slide--hidden{opacity:0;pointer-events:none}.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%;margin-right:var(--thumbnails-rest);width:calc(var(--thumbnails-col-width) - 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-left:0;margin-right:var(--thumbnails-box-width)}[dir=rtl] .pdp-carousel__controls--thumbnailsRow>label>span:nth-last-child(1){margin-left:var(--thumbnails-box-width);margin-right:0}.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{--bg-color: var(--color-neutral-300);display:inline-block;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;width:fit-content}.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__content{display:flex;height:100%;width:100%}.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;position:relative;z-index:0}.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)}.pdp-zoom{cursor:zoom-in;overflow:hidden;margin:0;position:relative}.pdp-zoom img{height:100%;max-width:100%;min-width:100%;object-fit:contain;position:relative;transition:transform .2s ease-out;transform:var(--transform);vertical-align:middle;width:100%;will-change:transform;backface-visibility:hidden;transform-style:preserve-3d}.pdp-zoom .pdp-zoom__close-button{background-color:var(--color-neutral-50);border-radius:50%;position:absolute;right:var(--spacing-small);top:var(--spacing-small);width:10px;height:10px}.pdp-zoom.pdp-zoom--zoomed{cursor:zoom-out}.pdp-zoom.pdp-zoom--no-effects{cursor:default}@media only screen and (max-width: 768px){.pdp-zoom img{display:block;width:100%;height:100%;transition:transform .2s ease-out;transform:var(--transform);will-change:transform;backface-visibility:hidden}}.pdp-header{display:grid;grid-auto-rows:max-content}.pdp-header__title{font:var(--type-display-3-font);letter-spacing:var(--type-display-3-letter-spacing);margin:0}.pdp-header__sku{font:var(--type-body-1-default-font);max-width:600px}.pdp-price{display:flex;flex-wrap:wrap;gap:var(--spacing-xsmall);margin-top:var(--spacing-medium)}.pdp-price__amount,.pdp-price__amount-special{font:var(--type-headline-2-strong-font);letter-spacing:var(--type-headline-2-strong-letter-spacing)}.pdp-price__amount--grey{color:var(--color-neutral-500)}.pdp-price__tiers{flex:0 0 100%}.pdp-price-tiers{display:flex;flex-direction:column;gap:8px;margin-top:8px}.pdp-price-tiers__tier{font:var(--type-body-2-font);color:var(--color-text-primary);line-height:1.4}.pdp-price-tiers__text{display:inline}.pdp-price-tiers__price{font-weight:600;color:var(--color-text-primary)}.pdp-price-tiers__savings{font-weight:600;color:var(--color-success)}`,{styleId:"PDP"});
5
+ .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 .dropin-button--tertiary--disabled:hover{color:var(--color-neutral-500)}.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}[dir=rtl] .pdp-carousel__button--prev{left:auto;right:0}[dir=rtl] .pdp-carousel__button--next{right:auto;left:0}.pdp-carousel__button__icon--next{transform:rotate(-90deg)}.pdp-carousel__button--next{right:0}.pdp-carousel__button__icon--prev{transform:rotate(90deg)}[dir=rtl] .pdp-carousel__button__icon--prev{transform:rotate(-90deg)}[dir=rtl] .pdp-carousel__button__icon--next{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)}[dir=rtl] .pdp-carousel__button__icon--thumbnailsRow--prev,.pdp-carousel__button__icon--thumbnailsRow--next{transform:rotate(-90deg)}[dir=rtl] .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%;width:100%;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__slide--hidden{opacity:0;pointer-events:none}.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%;margin-right:var(--thumbnails-rest);width:calc(var(--thumbnails-col-width) - 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-left:0;margin-right:var(--thumbnails-box-width)}[dir=rtl] .pdp-carousel__controls--thumbnailsRow>label>span:nth-last-child(1){margin-left:var(--thumbnails-box-width);margin-right:0}.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{--bg-color: var(--color-neutral-300);display:inline-block;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-gallery__video,.pdp-product-gallery__video-iframe{width:100%;height:100%;object-fit:contain}.pdp-product-gallery__video-iframe{border:none}.pdp-product-gallery__video-thumbnail{position:relative;display:inline-block;width:100%;height:100%}.pdp-product-gallery__video-thumbnail-placeholder{display:block;background-color:var(--color-neutral-300)}.pdp-product-gallery__video-icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:#0009;border-radius:50%;color:var(--color-neutral-50);font-size:16px;pointer-events:none;transition:background-color .2s ease}.pdp-product-gallery__video-thumbnail:hover .pdp-product-gallery__video-icon{background-color:#000c}.pdp-product-gallery__video-thumbnail img{width:100%;height:100%;object-fit:cover}.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;width:fit-content}.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__content{display:flex;height:100%;width:100%}.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;position:relative;z-index:0}.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)}.pdp-zoom{cursor:zoom-in;overflow:hidden;margin:0;position:relative}.pdp-zoom img{height:100%;max-width:100%;min-width:100%;object-fit:contain;position:relative;transition:transform .2s ease-out;transform:var(--transform);vertical-align:middle;width:100%;will-change:transform;backface-visibility:hidden;transform-style:preserve-3d}.pdp-zoom .pdp-zoom__close-button{background-color:var(--color-neutral-50);border-radius:50%;position:absolute;right:var(--spacing-small);top:var(--spacing-small);width:10px;height:10px}.pdp-zoom.pdp-zoom--zoomed{cursor:zoom-out}.pdp-zoom.pdp-zoom--no-effects{cursor:default}@media only screen and (max-width: 768px){.pdp-zoom img{display:block;width:100%;height:100%;transition:transform .2s ease-out;transform:var(--transform);will-change:transform;backface-visibility:hidden}}.pdp-header{display:grid;grid-auto-rows:max-content}.pdp-header__title{font:var(--type-display-3-font);letter-spacing:var(--type-display-3-letter-spacing);margin:0}.pdp-header__sku{font:var(--type-body-1-default-font);max-width:600px}.pdp-price{display:flex;flex-wrap:wrap;gap:var(--spacing-xsmall);margin-top:var(--spacing-medium)}.pdp-price__amount,.pdp-price__amount-special{font:var(--type-headline-2-strong-font);letter-spacing:var(--type-headline-2-strong-letter-spacing)}.pdp-price__amount--grey{color:var(--color-neutral-500)}.pdp-price__tiers{flex:0 0 100%}.pdp-price-tiers{display:flex;flex-direction:column;gap:8px;margin-top:8px}.pdp-price-tiers__tier{font:var(--type-body-2-font);color:var(--color-text-primary);line-height:1.4}.pdp-price-tiers__text{display:inline}.pdp-price-tiers__price{font-weight:600;color:var(--color-text-primary)}.pdp-price-tiers__savings{font-weight:600;color:var(--color-success)}`,{styleId:"PDP"});
6
6
  import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{deepmerge as m,Render as u}from"@dropins/tools/lib.js";import{useState as c,useEffect as b}from"@dropins/tools/preact-hooks.js";import{UIProvider as d}from"@dropins/tools/components.js";import{events as f}from"@dropins/tools/event-bus.js";import{c as p}from"./chunks/fetchProductData.js";import"./fragments.js";import"@dropins/tools/fetch-graphql.js";import"./chunks/getProductConfigurationValues.js";import"./chunks/isProductConfigurationValid.js";const g={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"},TierPrice:{label:"Tier Price"},TierPricing:{label:"Buy {quantity} for {price} each and save {percent}%"},Image:{label:"{product} Image {key} of {total}"},GiftCardOptions:{ChooseAmount:{label:"Choose amount"},OtherAmount:{label:"Other amount"},RequiredFieldError:{label:"This field is required"},NumberError:{label:"Please enter a valid number"},MinError:{label:"Minimum value is {min}"},MaxError:{label:"Maximum value is {max}"},MinLengthError:{label:"Minimum length is {min_length} characters"},MaxLengthError:{label:"Maximum length is {max_length} characters"},EmailError:{label:"Please enter a valid email address"},InvalidValueError:{label:"Please select one of the allowed values: {values}"}}},Swatches:{Required:{label:"Required"},ChooseOption:{label:"Choose an option"}},DownloadableOptions:{Sample:{label:"Sample"},ViewSample:{label:"View sample for {label}"}},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"}},Zoom:{Close:{label:"Close"}}},h={PDP:g},P={default:h},C=({children:i})=>{var r;const[e,t]=c(),n=(r=p.getConfig())==null?void 0:r.langDefinitions;b(()=>{const l=f.on("locale",a=>{a!==e&&t(a)},{eager:!0});return()=>{l==null||l.off()}},[e]);const s=m(P,n??{});return o(d,{lang:e,langDefinitions:s,children:i})},q=new u(o(C,{}));export{q as render};
7
7
  //# sourceMappingURL=render.js.map