@dropins/storefront-pdp 0.2.3-alpha2 → 0.2.3-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,2 +1,2 @@
1
- import*as ie from"@dropins/tools/preact-compat.js";import{useState as K,Children as te,useRef as Se,useMemo as ve,useEffect as re,useCallback as Q}from"@dropins/tools/preact-compat.js";import{debounce as ge,classes as $,VComponent as V,toLanguageTag as Ne,Slot as T}from"@dropins/tools/lib.js";import{Button as we,Icon as be,Price as ye,Picker as Ve,ColorSwatch as He,ImageSwatch as qe,TextSwatch as ze,Incrementer as Ge,Breadcrumbs as Ue,Image as xe}from"@dropins/tools/components.js";import{jsxs as W,jsx as e,Fragment as Pe}from"@dropins/tools/preact-jsx-runtime.js";import{useText as G}from"@dropins/tools/i18n.js";import{c as Be,d as Ie}from"../chunks/getRefinedProduct.js";import{events as Te}from"@dropins/tools/event-bus.js";import{c as Ee}from"../chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";const je=l=>ie.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l},ie.createElement("path",{d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round"})),Fe=l=>ie.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l},ie.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),ie.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),me=({show:l=1,scrollbar:s=!1,peak:_=!1,arrows:b=!1,controls:p="dots",arrowsOnMainImage:y=!1,loop:u=!1,gap:D=null,direction:n="horizontal",width:C="100%",height:a="100%",defaultIndex:v=0,className:H,children:q,thumbnails:ee=null,isZoomed:A,...P})=>{const h=G("PDP.Carousel.label").label,t=G("PDP.Carousel.Slide.label").label,k=G("PDP.Carousel.Previous.label").label,O=G("PDP.Carousel.Next.label").label,f=G("PDP.Carousel.Controls.label").label,r=G("PDP.Carousel.Controls.Button.label").label,[g,Z]=K(()=>$e(l)),M=Math.ceil(te.toArray(q).length/g),J={small:16,medium:24,large:64},R=_?24:0,B=D?J[D]:0,X=te.toArray(q).length%g,ne=16,Y=2,ce="32",[x,le]=K(u?v+1:v),U=Se([]),[j,pe]=K(0),[oe,se]=K(0),i=ve(()=>te.toArray(ee),[ee]),o=ve(()=>{const c=te.toArray(q).reduce((d,L,S)=>S%g===0?[...d,[L]]:[...d.slice(0,-1),[...d[d.length-1],L]],[]);return!u||c.length===1?c:u&&te.toArray(q).length%g===0?[c[M-1]].concat(c).concat([c[0],c[1]]):[te.toArray(q).slice(-g)].concat(c).concat([c[0],c[1]])},[q,g,M,u]),m=Se(null),N=Se(null),w=p==="thumbnailsRow"||p==="thumbnailsColumn";re(()=>{const c=document.body,d=ge(()=>{var I,Ae;pe(((I=m.current)==null?void 0:I.offsetWidth)??0),se(((Ae=m.current)==null?void 0:Ae.offsetHeight)??0);const S=window.innerWidth,E=$e(l,S);E!==g&&Z(E)},50),L=new ResizeObserver(d);return L.observe(c),()=>{L.unobserve(c)}},[g,l]);const F=Q(c=>{const d=u?c-1:c,L=U==null?void 0:U.current[0],S=(L==null?void 0:L.offsetWidth)+ne,E=(L==null?void 0:L.offsetHeight)+ne,I=N.current;p==="thumbnailsRow"&&(I!=null&&I.offsetWidth)&&(S*(d+1)>I.offsetWidth&&(I.style.scrollBehavior="smooth",I.scrollLeft=(d+Y)*S),I.scrollLeft>S*d&&(I.style.scrollBehavior="smooth",I.scrollLeft=(d-Y)*S)),p==="thumbnailsColumn"&&(I!=null&&I.offsetHeight)&&(E*(d+1)>I.offsetHeight&&(I.style.scrollBehavior="smooth",I.scrollTop=(d+Y)*E),I.scrollTop>E*d&&(I.style.scrollBehavior="smooth",I.scrollTop=(d-Y)*E))},[p,u]),z=Q((c,d,L)=>{(p==="thumbnailsRow"||p==="thumbnailsColumn")&&F(c);const S=m.current,E=R?S.offsetWidth-R:S.offsetWidth-R+B;if(!Array.from(S.querySelectorAll("[data-index]")).filter(_e=>{const de=Number(_e.getAttribute("data-index"));return!isNaN(de)&&de>-1})[c])return;if(L){const _e=c===0?M:0,de=E*(M+(X||g)/g);if(S.scrollLeft>=0&&S.scrollLeft<E-5){z(1,!0);return}if(S.scrollLeft>de-E&&S.scrollLeft<=de){z(M,!0);return}S.style.scrollBehavior="auto",S.scrollLeft=_e===0?0:de,z(_e===0?1:M,!0);return}const We=(S.offsetWidth-B)/g*o[c].length-R;S.style.scrollBehavior=d?"smooth":"auto",S.scrollLeft=o[c].length===g?E*c:E*(c-1)+We},[B,M,R,g,X,o,F,p]),ae=Q(()=>{if(u){const d=x-1;z(d,!0,x===1);return}const c=x<=0?0:x-1;z(c,!0)},[x,z,u]),he=Q(()=>{const c=o.length-1;if(u){const L=x+1;z(L,!0,x===M);return}const d=x>=c?c:x+1;z(d,!0)},[o.length,u,x,z,M]);re(()=>{const c=d=>{d.key==="ArrowLeft"&&(d.preventDefault(),ae()),d.key==="ArrowRight"&&(d.preventDefault(),he())};return window.addEventListener("keydown",c),()=>{window.removeEventListener("keydown",c)}},[he,ae]),re(()=>{z(u?v+1:v,!1)},[v,z,u]);const fe=ge(()=>{const c=m.current,d=R?c.offsetWidth-R:c.offsetWidth-R+B,L=c.scrollLeft/d,S=Math.round(L)-L<1?Math.round(L):Math.ceil(L);if(w&&F(S),u){const E=d*(M+(X||g)/g);if(Math.ceil(c.scrollLeft)>=Math.ceil(E)-5){c.style.scrollBehavior="auto",c.scrollLeft=c.offsetWidth*1+(Math.ceil(c.scrollLeft)-Math.ceil(E)-R);return}if(c.scrollLeft===0){c.style.scrollBehavior="auto",c.scrollLeft=E-c.offsetWidth+R;return}}x!==S&&le(S)},100);re(()=>{const c=m.current;return c==null||c.addEventListener("scroll",fe),()=>{c==null||c.removeEventListener("scroll",fe)}},[fe]);const ue=(c,d,L)=>e(we,{className:$([["pdp-carousel__button",!c],[`pdp-carousel__button--${d}`,!c],[`pdp-carousel__button--${p}`,c]]),style:{"--height":`${oe}px`},variant:"tertiary","aria-label":d==="next"?O:k,onClick:L,disabled:u?!1:d==="next"?x>=o.length-1:x<1,children:e(be,{className:$([["pdp-carousel__button__icon",!c],[`pdp-carousel__button__icon--${d}`,!c],[`pdp-carousel__button__icon--${p}--${d}`,c]]),size:ce,source:je})}),Le=b&&o.length!=1&&ue(w,"prev",ae),De=b&&o.length!=1&&ue(w,"next",he),Oe=b&&o.length!=1&&ue(!1,"prev",ae),Re=b&&o.length!=1&&ue(!1,"next",he);return W("div",{role:"region","aria-roledescription":h,className:$(["pdp-carousel",["pdp-carousel--main-image-controls",y],["pdp-carousel--arrows",b&&!w],[`pdp-carousel--${p}`,w],H]),style:{"--flex-carousel":p==="thumbnailsColumn"?"row-reverse":"column","--gap":w?"0":"var(--spacing-small)","--width":C},...P,children:[e("div",{ref:m,className:$(["pdp-carousel__wrapper",`pdp-carousel__wrapper--${n}`,["pdp-carousel__wrapper--scrollbar",s],["pdp-carousel__wrapper--peak",_]]),style:{"--total-width":p==="thumbnailsColumn"?"81.6%":"100%","--height":p==="thumbnailsColumn"?"auto":a,"--gap":D?`var(--spacing-${D})`:"0px","--per-page":g},tabIndex:0,children:o.map((c,d)=>{const L=c.length<g;return e("div",{role:"group","aria-roledescription":t,"data-index":d,className:$(["pdp-carousel__slide",`pdp-carousel__slide--${n}`,["pdp-carousel__slide--active",x===d],["pdp-carousel__slide--orphan",L]]),style:{"--length":c.length},children:c},d)})}),!w&&W(Pe,{children:[Le,De]}),w&&y&&W(Pe,{children:[Oe,Re]}),p&&o.length!=1&&W("div",{className:$([[`pdp-carousel__controls__container--${p}`,w],["pdp-carousel__controls__container--no-arrows",!b||y]]),style:{"--width":p==="thumbnailsRow"?`${j}px`:C,"--height":`${oe}px`,"--nr-thumbnails":i.length},children:[(w||A)&&!y&&Le,e("div",{ref:N,className:$([[`pdp-carousel__controls__wrapper--${p}`,w],["pdp-carousel__controls__wrapper",w]]),children:e("div",{role:"group","aria-label":f,className:$(["pdp-carousel__controls",[`pdp-carousel__controls--${p}`,w]]),children:(u?o.slice(0,M):o).map((c,d)=>{const L=u?M:o.length,S=u?x-1===d:x===d;return w?W("label",{className:$(["pdp-carousel__thumbnail__container"]),ref:E=>{E&&(U.current[d]=E)},children:[e("input",{type:"radio",name:"carousel-thumbnails","aria-label":r.replace("{key}",String(d+1)).replace("{total}",String(L)),checked:S&&j!==0,onChange:()=>{z(u?d+1:d,!0)},...P,className:$(["pdp-carousel__thumbnail",["pdp-carousel__thumbnail--selected",S&&j!==0]])}),e("span",{className:$(["pdp-carousel__thumbnail__span"]),children:i[d]})]},d):e("button",{"aria-label":r.replace("{key}",String(d+1)).replace("{total}",String(L)),onClick:()=>{z(u?d+1:d,!0)},className:$(["pdp-carousel__controls__button",["pdp-carousel__controls__button--active",S]])},d)})})}),(w||A)&&!y&&De]})]})};function $e(l,s=0){if(typeof l=="number")return l;const{small:_,medium:b,large:p}=l,y=786;return s>1024?p:s>y?b:_}const Ke=({title:l,breadcrumbs:s,galleryContent:_,infoContent:b,productContent:p,sku:y,outOfStock:u,shortDescription:D,description:n,attributes:C,images:a,options:v,price:H,specialPrice:q,className:ee,children:A,quantity:P,actions:h,carouselConfig:t,...k})=>{var B,X,ne,Y,ce,x;const O=G("PDP.Product.RegularPrice.label").label,f=G("PDP.Product.SpecialPrice.label").label,r=G("PDP.Product.OutOfStock.label").label,g=G("PDP.Product.Image.label").label,[Z,M]=K(null),J=a!=null&&a.length?a.map((le,U)=>{var j;return e(V,{node:le,loading:U===0?"eager":"lazy",alt:((j=l==null?void 0:l.props)==null?void 0:j.children)&&(g==null?void 0:g.replace("{product}",l.props.children.toString()).replace("{key}",String(U+1)).replace("{total}",String(a.length))),onClick:()=>M(U)},U)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),R=(B=t==null?void 0:t.thumbnails)!=null&&B.length?t.thumbnails.map((le,U)=>{var j;return e(V,{node:le,loading:(t==null?void 0:t.thumbnailsLoadingMode)||"lazy",alt:((j=l==null?void 0:l.props)==null?void 0:j.children)&&(g==null?void 0:g.replace("{product}",l.props.children.toString()).replace("{key}",String(U+1)).replace("{total}",String(a.length)))},U)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return W("div",{...k,className:$(["pdp-product",ee]),children:[s&&e(V,{node:s,className:"pdp-product__breadcrumbs"}),W("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[e("div",{className:"pdp-product__column-body",children:t!=null&&t.controls?e(me,{className:"pdp-product__overlay__carousel",arrows:(a==null?void 0:a.length)>1,controls:(a==null?void 0:a.length)>1?t.controls:"dots",arrowsOnMainImage:t==null?void 0:t.arrowsOnMainImage,loop:(t==null?void 0:t.loopable)&&(a==null?void 0:a.length)>1,peak:((X=t==null?void 0:t.thumbnails)==null?void 0:X.length)>1&&((ne=t==null?void 0:t.peak)==null?void 0:ne.desktop)||!1,gap:(t==null?void 0:t.gap)||null,width:"100%",height:"100%",defaultIndex:Z||0,thumbnails:R,children:J}):e(Qe,{className:"pdp-product__images",gap:"small",children:J})}),_&&e(V,{node:_,className:"pdp-product__gallery-content"})]}),W("div",{className:"pdp-product__column-container pdp-product__content-column",children:[W("div",{className:"pdp-product__column-body",children:[W("div",{className:"pdp-product__header",children:[l&&e(V,{node:l,className:"pdp-product__title"}),y&&e(V,{node:y,className:"pdp-product__sku"})]}),W("div",{className:"pdp-product__prices",children:[q&&e(V,{node:q,className:$(["pdp-product__price-special","pdp-product__price"]),"aria-label":f,role:"text"}),H&&e(V,{node:H,className:$(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":O,role:"text"})]}),t!=null&&t.mobile?e(me,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(a==null?void 0:a.length)>1,controls:(a==null?void 0:a.length)>1?"thumbnailsRow":null,loop:(t==null?void 0:t.loopable)&&(a==null?void 0:a.length)>1,peak:((Y=t==null?void 0:t.thumbnails)==null?void 0:Y.length)>1&&((ce=t==null?void 0:t.peak)==null?void 0:ce.mobile)||!1,gap:(t==null?void 0:t.gap)||null,thumbnails:R,children:J}):e(me,{className:"pdp-product__images pdp-product__images--carousel",peak:((x=t==null?void 0:t.peak)==null?void 0:x.mobile)&&(a==null?void 0:a.length)>1,gap:(t==null?void 0:t.gap)||null,width:"100%",height:"auto",arrows:(a==null?void 0:a.length)>1,controls:(a==null?void 0:a.length)>1?"dots":null,loop:(t==null?void 0:t.loopable)&&(a==null?void 0:a.length)>1,children:J}),W("div",{className:$(["pdp-product__actions",["pdp-product__actions--out-of-stock",u]]),children:[u&&e("div",{className:"pdp-product__out-of-stock__text",children:r}),v&&e(V,{node:v,className:$(["pdp-product__options"])}),P&&e("div",{className:"pdp-product__quantity",children:e(V,{node:P})}),h&&e(V,{node:h,className:$(["pdp-product__buttons"])})]}),D&&e(V,{node:D,className:$(["pdp-product__short_description"])}),n&&e(V,{node:n,className:$(["pdp-product__description"])}),C?e("div",{className:"pdp-product__attributes",children:C}):null]}),b&&e(V,{node:b,className:"pdp-product__info-content"})]}),p&&e(V,{node:p,className:"pdp-product__content"}),Z===null?null:e(Ze,{className:"pdp-product__overlay",onClose:()=>M(null),centered:!0,children:e(me,{className:"pdp-product__overlay__carousel",arrows:(a==null?void 0:a.length)>1,width:"100%",height:"100%",defaultIndex:Z||0,loop:(a==null?void 0:a.length)>1,controls:(a==null?void 0:a.length)>1?"dots":null,isZoomed:!0,children:J})})]})},Qe=({children:l,gap:s=null,className:_,style:b,...p})=>{const y=te.count(l);return e("div",{...p,className:$(["pdp-gallery-grid",_]),style:{"--gap":s?`var(--spacing-${s})`:"0px",...b},children:te.map(l,(u,D)=>e("div",{className:"pdp-gallery-grid__item",children:e(V,{node:u,loading:D===0?"eager":"lazy"},u.props.src)},y+D))})},ke=({amount:l,currency:s,locale:_,variant:b,sale:p,minimumAmount:y,maximumAmount:u,className:D,...n})=>e(Pe,{children:l||y===u?e("div",{className:"pdp-price-range",...n,children:e(ye,{amount:l||y,currency:s,locale:_,variant:b,sale:p,className:D})}):W("div",{className:"pdp-price-range",...n,children:[e(ye,{amount:y,currency:s,locale:_,className:D}),e("span",{className:"pdp-price-range__label",children:"-"}),e(ye,{amount:u,currency:s,locale:_,className:D})]})}),Ze=({centered:l,onClose:s,className:_,children:b,...p})=>{const y=G("PDP.Overlay.Close.label").label,u=Q(()=>{s==null||s()},[s]);return re(()=>{const D=n=>{n.key==="Escape"&&u()};return document.addEventListener("keydown",D),()=>{document.removeEventListener("keydown",D)}},[u]),re(()=>{const D=document.scrollingElement,n=D.style.overflow;return D.style.overflow="hidden",()=>{D.style.overflow=n}},[]),W("div",{...p,className:$(["pdp-overlay",["pdp-overlay--centered",l],_]),children:[e("div",{className:"pdp-overlay__content",children:b}),e(we,{"aria-label":y,variant:"tertiary",className:"pdp-overlay__close-button",onClick:u,icon:e(Fe,{})})]})},Je=["text","image","color","dropdown"],Xe=l=>l.map(s=>({...s,text:s.label,disabled:!s.inStock})),Ye=({options:l,hideSelectedValue:s,onValues:_,onErrors:b,defaultOptions:p,selectionsToUpdate:y,className:u,children:D,...n})=>{const C=G("PDP.Swatches.Required.label").label,[a,v]=K(()=>l==null?void 0:l.reduce((P,h)=>{const{items:t}=h,k=t==null?void 0:t.find(f=>p==null?void 0:p.includes(f.id)),O=t==null?void 0:t.find(f=>f.selected);return k?{...P,[h.id]:{label:k.label,value:k.id}}:O?{...P,[h.id]:{label:O.label,value:O.id}}:P},{}));re(()=>{y==null||y.forEach(A=>{v(P=>{var k;const h=(k=A==null?void 0:A.items)==null?void 0:k.find(O=>O.selected);return h?{...P,[A.id]:{label:h==null?void 0:h.label,value:h==null?void 0:h.id}}:P})})},[y,v]),ve(()=>{const A=l==null?void 0:l.reduce((P,h)=>{var t;return(t=h==null?void 0:h.items)==null||t.forEach(k=>{var f;const O=((f=a[h.id])==null?void 0:f.value)===k.id;h.required&&!O&&(P[h.id]=C)}),P},{});return b==null||b(A),A},[a]);const H=Q((A,P,h)=>{v(t=>{const k={...t,[A]:{label:P,value:h}};return _==null||_(k,h),k})},[_]),q=(A,P)=>{var t;const h=((t=P.selectedOptions[0])==null?void 0:t.label)??"";H(A,h,P.value)},ee=Q(({items:A,id:P,required:h,type:t,selected:k,label:O})=>e("div",{className:$(["pdp-swatches__options"]),children:(t==null?void 0:t.toLowerCase())==="dropdown"?e(Ve,{"aria-label":O,handleSelect:f=>q(P,f.target),options:Xe(A),value:k}):A==null?void 0:A.map(f=>{const r={key:f.id,id:f.id,name:P,value:f.value,label:f.label,groupAriaLabel:O,selected:k===f.id,outOfStock:!f.inStock,required:h===null?!0:h,onValue:()=>{H(P,f.label,f.id)}};switch(t){case"text":return e(ze,{...r,label:f.label});case"image":return e(qe,{...r,src:f.value,alt:f.label});case"color":return e(He,{...r,size:"large",color:f.value});default:return console.warn(`Invalid swatch type ${t}`),null}})}),[H]);return e("div",{...n,className:$(["pdp-swatches",u]),children:l==null?void 0:l.map(({type:A,label:P,id:h,multiple:t,required:k,items:O})=>{var f;if(!A){console.warn("Bundle product not supported on UI.");return}return Je.includes(A)||console.warn(`Invalid swatch type ${A}`),t&&console.warn("Multiple selection swatches are not currently supported."),W("div",{id:`swatch-item-${h}`,"data-slot-key":`product-swatch--${h}`,className:"pdp-swatches__field",children:[e("div",{className:"pdp-swatches__field__label",children:a[h]?s?`${P}`:`${P}: ${a[h].label}`:P}),e(ee,{id:h,type:A,required:k,items:O,label:P,selected:(f=a[h])==null?void 0:f.value})]},`swatch-item-${h}`)})})};function Ce(l,s="en_US"){if(!Me(l))throw Error("Invalid date string");return l.split(" ")[1]||(l=`${l} 00:00:00`),new Date(l).toLocaleDateString(Ne(s)).toString()}function Me(l){if(![/^\d{4}-\d{2}-\d{2}$/,/^\d{1,2}\/\d{1,2}\/\d{4}$/,/^\d{2}\/\d{2}\/\d{4}$/,/^\d{4}\/\d{2}\/\d{2}$/,/^\d{1,2}\.\d{1,2}\.\d{4}$/,/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/].some(b=>b.test(l)))return!1;const _=new Date(l);return!isNaN(_.getTime())}function et(l){const s=new URLSearchParams(window.location.search);Object.entries(l).forEach(([b,p])=>{p===null?s.delete(b):s.set(b,String(p))});let _=window.location.pathname;_+=`?${s.toString()}`,_+=window.location.hash,window.history.replaceState({},"",_)}function tt(){const l=new URLSearchParams(window.location.search),s={};return l.forEach((_,b)=>{s[b]=_}),s}const rt=({sku:l,hideSku:s,hideQuantity:_,hideShortDescription:b,hideDescription:p,hideAttributes:y,hideURLParams:u,hideSelectedOptionValue:D,slots:n,children:C,initialData:a,carousel:v,optionsConfig:H,onAddToCart:q,...ee})=>{var j,pe,oe,se;const A=G("PDP.Product.AddToCart.label").label,P=G("PDP.Product.Incrementer.label").label,h=G("PDP.Product.Details.label").label,[t,k]=K(Ee.getConfig().defaultLocale||"en-US"),[O,f]=K(),[r=null,g]=K(a),[Z,M]=K(()=>{const i={sku:l,quantity:1};return r!=null&&r.optionUIDs&&(i.optionsUIDs=r.optionUIDs),i}),[J,R]=K(()=>{var i,o;return!(r!=null&&r.options&&((i=r==null?void 0:r.options)==null?void 0:i.length)>0&&((o=r==null?void 0:r.optionUIDs)==null?void 0:o.length)!==(r==null?void 0:r.options.length))}),B={data:r,values:Z,valid:J};re(()=>{const i=Te.on("locale",o=>{o!==t&&(k(o),Be(l).then(g))});return()=>{i==null||i.off()}},[t,l]);const X=Q(i=>{M(o=>({...o,...i}))},[]),ne=Q(i=>{var m;let o=Object.keys(i).map(N=>i[N].value).filter(N=>N!==void 0);u||et({optionsUIDs:o.join(",")}),M(N=>({...N,optionsUIDs:o})),R((o==null?void 0:o.length)===((m=r==null?void 0:r.options)==null?void 0:m.length)),Ie(l,o,H==null?void 0:H.anchorOptions).then(N=>{var w;g(N),(w=H==null?void 0:H.anchorOptions)!=null&&w.length&&Y(N,o)})},[l]),Y=Q((i,o)=>{var w;const m=(i==null?void 0:i.optionUIDs)??[];o.every(F=>m.includes(F))||(f(i==null?void 0:i.options),M(F=>({...F,optionsUIDs:m})),R((m==null?void 0:m.length)===((w=i==null?void 0:i.options)==null?void 0:w.length)))},[l]),ce=Q(i=>{Object.keys(i).length!==0&&R(!1)},[]),x=ve(()=>{var i;return(i=r==null?void 0:r.attributes)==null?void 0:i.map(({label:o,value:m},N)=>{const w=Me(m)?Ce(m,t):m.toString();return W("li",{children:[o,": ",e("span",{dangerouslySetInnerHTML:{__html:w}})]},N)})},[r==null?void 0:r.attributes,t]),le=!_&&(r!=null&&r.inStock)?e(T,{name:"Quantity",slot:n==null?void 0:n.Quantity,context:{...B},children:e(Ge,{name:"quantity",defaultValue:Z.quantity.toString(),min:1,"aria-label":P,className:"pdp-product__quantity",onValue:i=>{X({quantity:Number(i)})}},"quantity")}):void 0,U=()=>{if(r!=null&&r.options)return e(T,{name:"Options",slot:n==null?void 0:n.Options,context:{...B},children:e(Ye,{options:r.options,defaultOptions:Z.optionsUIDs,selectionsToUpdate:O,hideSelectedValue:D,onValues:ne,onErrors:ce})})};return e("div",{...ee,children:e(Ke,{title:e(T,{name:"Title",slot:n==null?void 0:n.Title,context:{...B},children:r==null?void 0:r.name}),sku:s?void 0:e(T,{name:"SKU",slot:n==null?void 0:n.SKU,context:{...B},children:r==null?void 0:r.sku}),options:U(),breadcrumbs:(n==null?void 0:n.Breadcrumbs)&&e(T,{name:"Breadcrumbs",slot:n==null?void 0:n.Breadcrumbs,context:{...B,setSeparator(i){this._registerMethod((...o)=>{const m=i(...o),N=m&&e(be,{source:m});this._setProps(w=>({...w,separator:N}))})},appendLink(i){this._registerMethod((...o)=>{const{text:m,...N}=i(...o),w=e("a",{...N,children:m});this._setProps(F=>({...F,categories:[...F.categories||[],w]}))})},appendHTMLElement(i){this._registerMethod((...o)=>{const m=i(...o),N=this._htmlElementToVNode(m);this._setProps(w=>({...w,categories:[...w.categories||[],N]}))})}},render:({separator:i,categories:o})=>e(Ue,{separator:i,categories:o})}),quantity:le,actions:e(T,{name:"Actions",slot:n==null?void 0:n.Actions,context:{...B,appendButton(i){this._registerMethod((...o)=>{const m=i(...o);if(!m)return;const{text:N,icon:w,...F}=m,z=e(we,{type:"button",...F,icon:w&&e(be,{source:w}),children:N});this._setProps(ae=>({children:[...ae.children||[],z]}))})}},children:!(n!=null&&n.Actions)&&e(we,{size:"medium",type:"submit",icon:e(be,{source:"Cart"}),disabled:!(r!=null&&r.inStock)||!J,"aria-label":A,onClick:()=>q==null?void 0:q(Z),children:A})}),shortDescription:b?void 0:e(T,{name:"ShortDescription",slot:n==null?void 0:n.ShortDescription,context:{...B},children:e("div",{dangerouslySetInnerHTML:{__html:(r==null?void 0:r.shortDescription)??""}})}),description:p?void 0:e(T,{name:"Description",slot:n==null?void 0:n.Description,context:{...B},children:e("div",{dangerouslySetInnerHTML:{__html:(r==null?void 0:r.description)??""}})}),images:((j=r==null?void 0:r.images)==null?void 0:j.map(({label:i,url:o})=>{var m,N;return e(xe,{title:i,alt:i,src:o,width:((m=v==null?void 0:v.imageParams)==null?void 0:m.width)??960,height:((N=v==null?void 0:v.imageParams)==null?void 0:N.height)??1191,params:(v==null?void 0:v.imageParams)??{width:960}},o)}))??[],specialPrice:(pe=r==null?void 0:r.prices)!=null&&pe.visible?e(T,{name:"SpecialPrice",slot:n==null?void 0:n.SpecialPrice,context:{...B},children:e(ke,{...r.prices.final,locale:Ne(t)})}):void 0,price:(oe=r==null?void 0:r.prices)!=null&&oe.visible&&r.prices.regular&&r.prices.final.amount!==(r==null?void 0:r.prices.regular.amount)?e(T,{name:"RegularPrice",slot:n==null?void 0:n.RegularPrice,context:{...B},children:e(ke,{...r.prices.regular,locale:Ne(t)})}):void 0,carouselConfig:{...v,thumbnails:v?((se=r==null?void 0:r.images)==null?void 0:se.map(({label:i,url:o})=>{var m,N;return e(xe,{title:i,alt:i,src:o,width:((m=v==null?void 0:v.thumbnailParams)==null?void 0:m.width)??200,height:((N=v==null?void 0:v.thumbnailParams)==null?void 0:N.height)??248,params:(v==null?void 0:v.thumbnailParams)??{width:200}},o)}))??[]:[]},outOfStock:!(r!=null&&r.inStock),attributes:y?void 0:e(T,{name:"Attributes",slot:n==null?void 0:n.Attributes,context:{...B},children:x!=null&&x.length?W(Pe,{children:[h,e("ul",{children:x})]}):null}),galleryContent:(n==null?void 0:n.GalleryContent)&&e(T,{name:"GalleryContent",slot:n.GalleryContent,context:{...B}}),infoContent:(n==null?void 0:n.InfoContent)&&e(T,{name:"InfoContent",slot:n.InfoContent,context:{...B}}),productContent:(n==null?void 0:n.Content)&&e(T,{name:"Content",slot:n.Content,context:{...B}})})})};rt.getInitialData=async function({sku:l,optionsConfig:s}){var b,p,y,u,D,n;const _=((b=tt().optionsUIDs)==null?void 0:b.split(","))||((n=(D=(u=(y=(p=Ee)==null?void 0:p.getConfig())==null?void 0:y.models)==null?void 0:u.ProductDetails)==null?void 0:D.initialData)==null?void 0:n.optionsUIDs);return _!=null&&_.length?await Ie(l,_,s==null?void 0:s.anchorOptions):await Be(l)};export{rt as ProductDetails,rt as default};
1
+ import*as se from"@dropins/tools/preact-compat.js";import{useState as K,Children as re,useRef as ye,useMemo as ve,useEffect as C,useCallback as Q}from"@dropins/tools/preact-compat.js";import{debounce as ge,classes as g,VComponent as T,toLanguageTag as Ne,Slot as z}from"@dropins/tools/lib.js";import{Button as we,Icon as be,Price as Se,Picker as Ve,ColorSwatch as He,ImageSwatch as qe,TextSwatch as ze,Incrementer as Ge,Breadcrumbs as je,Image as Ie}from"@dropins/tools/components.js";import{jsxs as M,jsx as r,Fragment as Pe}from"@dropins/tools/preact-jsx-runtime.js";import{useText as V}from"@dropins/tools/i18n.js";import{c as $e,d as Oe}from"../chunks/getRefinedProduct.js";import{events as Fe}from"@dropins/tools/event-bus.js";import{c as Be}from"../chunks/initialize.js";import"@dropins/tools/fetch-graphql.js";const Ke=e=>se.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},se.createElement("path",{d:"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"square",strokeLinejoin:"round"})),Qe=e=>se.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},se.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),se.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),me=({show:e=1,scrollbar:o=!1,peak:p=!1,arrows:b=!1,controls:s="dots",arrowsOnMainImage:P=!1,loop:u=!1,gap:A=null,direction:l="horizontal",width:ee="100%",height:d="100%",defaultIndex:v=0,className:U,children:H,thumbnails:X=null,isZoomed:N,...w})=>{const m=V("PDP.Carousel.label").label,n=V("PDP.Carousel.Slide.label").label,D=V("PDP.Carousel.Previous.label").label,R=V("PDP.Carousel.Next.label").label,y=V("PDP.Carousel.Controls.label").label,Z=V("PDP.Carousel.Controls.Button.label").label,[t,te]=K(()=>ke(e)),O=Math.ceil(re.toArray(H).length/t),G={small:16,medium:24,large:64},W=p?24:0,j=A?G[A]:0,I=re.toArray(H).length%t,ne=16,Y=2,le="32",[E,J]=K(u?v+1:v),q=ye([]),[F,he]=K(0),[ie,pe]=K(0),oe=ve(()=>re.toArray(X),[X]),c=ve(()=>{const a=re.toArray(H).reduce((i,L,S)=>S%t===0?[...i,[L]]:[...i.slice(0,-1),[...i[i.length-1],L]],[]);return!u||a.length===1?a:u&&re.toArray(H).length%t===0?[a[O-1]].concat(a).concat([a[0],a[1]]):[re.toArray(H).slice(-t)].concat(a).concat([a[0],a[1]])},[H,t,O,u]),_=ye(null),f=ye(null),h=s==="thumbnailsRow"||s==="thumbnailsColumn";C(()=>{const a=document.body,i=ge(()=>{var x,Ae;he(((x=_.current)==null?void 0:x.offsetWidth)??0),pe(((Ae=_.current)==null?void 0:Ae.offsetHeight)??0);const S=window.innerWidth,B=ke(e,S);B!==t&&te(B)},50),L=new ResizeObserver(i);return L.observe(a),()=>{L.unobserve(a)}},[t,e]);const $=Q(a=>{const i=u?a-1:a,L=q==null?void 0:q.current[0],S=(L==null?void 0:L.offsetWidth)+ne,B=(L==null?void 0:L.offsetHeight)+ne,x=f.current;s==="thumbnailsRow"&&(x!=null&&x.offsetWidth)&&(S*(i+1)>x.offsetWidth&&(x.style.scrollBehavior="smooth",x.scrollLeft=(i+Y)*S),x.scrollLeft>S*i&&(x.style.scrollBehavior="smooth",x.scrollLeft=(i-Y)*S)),s==="thumbnailsColumn"&&(x!=null&&x.offsetHeight)&&(B*(i+1)>x.offsetHeight&&(x.style.scrollBehavior="smooth",x.scrollTop=(i+Y)*B),x.scrollTop>B*i&&(x.style.scrollBehavior="smooth",x.scrollTop=(i-Y)*B))},[s,u]),k=Q((a,i,L)=>{(s==="thumbnailsRow"||s==="thumbnailsColumn")&&$(a);const S=_.current,B=W?S.offsetWidth-W:S.offsetWidth-W+j;if(!Array.from(S.querySelectorAll("[data-index]")).filter(_e=>{const de=Number(_e.getAttribute("data-index"));return!isNaN(de)&&de>-1})[a])return;if(L){const _e=a===0?O:0,de=B*(O+(I||t)/t);if(S.scrollLeft>=0&&S.scrollLeft<B-5){k(1,!0);return}if(S.scrollLeft>de-B&&S.scrollLeft<=de){k(O,!0);return}S.style.scrollBehavior="auto",S.scrollLeft=_e===0?0:de,k(_e===0?1:O,!0);return}const Ue=(S.offsetWidth-j)/t*c[a].length-W;S.style.scrollBehavior=i?"smooth":"auto",S.scrollLeft=c[a].length===t?B*a:B*(a-1)+Ue},[j,O,W,t,I,c,$,s]),ce=Q(()=>{if(u){const i=E-1;k(i,!0,E===1);return}const a=E<=0?0:E-1;k(a,!0)},[E,k,u]),ae=Q(()=>{const a=c.length-1;if(u){const L=E+1;k(L,!0,E===O);return}const i=E>=a?a:E+1;k(i,!0)},[c.length,u,E,k,O]);C(()=>{const a=i=>{i.key==="ArrowLeft"&&(i.preventDefault(),ce()),i.key==="ArrowRight"&&(i.preventDefault(),ae())};return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[ae,ce]),C(()=>{k(u?v+1:v,!1)},[v,k,u]);const fe=ge(()=>{const a=_.current,i=W?a.offsetWidth-W:a.offsetWidth-W+j,L=a.scrollLeft/i,S=Math.round(L)-L<1?Math.round(L):Math.ceil(L);if(h&&$(S),u){const B=i*(O+(I||t)/t);if(Math.ceil(a.scrollLeft)>=Math.ceil(B)-5){a.style.scrollBehavior="auto",a.scrollLeft=a.offsetWidth*1+(Math.ceil(a.scrollLeft)-Math.ceil(B)-W);return}if(a.scrollLeft===0){a.style.scrollBehavior="auto",a.scrollLeft=B-a.offsetWidth+W;return}}E!==S&&J(S)},100);C(()=>{const a=_.current;return a==null||a.addEventListener("scroll",fe),()=>{a==null||a.removeEventListener("scroll",fe)}},[fe]);const ue=(a,i,L)=>r(we,{className:g([["pdp-carousel__button",!a],[`pdp-carousel__button--${i}`,!a],[`pdp-carousel__button--${s}`,a]]),style:{"--height":`${ie}px`},variant:"tertiary","aria-label":i==="next"?R:D,onClick:L,disabled:u?!1:i==="next"?E>=c.length-1:E<1,children:r(be,{className:g([["pdp-carousel__button__icon",!a],[`pdp-carousel__button__icon--${i}`,!a],[`pdp-carousel__button__icon--${s}--${i}`,a]]),size:le,source:Ke})}),Le=b&&c.length!=1&&ue(h,"prev",ce),De=b&&c.length!=1&&ue(h,"next",ae),We=b&&c.length!=1&&ue(!1,"prev",ce),Te=b&&c.length!=1&&ue(!1,"next",ae);return M("div",{role:"region","aria-roledescription":m,className:g(["pdp-carousel",["pdp-carousel--main-image-controls",P],["pdp-carousel--arrows",b&&!h],[`pdp-carousel--${s}`,h],U]),style:{"--flex-carousel":s==="thumbnailsColumn"?"row-reverse":"column","--gap":h?"0":"var(--spacing-small)","--width":ee},...w,children:[r("div",{ref:_,className:g(["pdp-carousel__wrapper",`pdp-carousel__wrapper--${l}`,["pdp-carousel__wrapper--scrollbar",o],["pdp-carousel__wrapper--peak",p]]),style:{"--total-width":s==="thumbnailsColumn"?"81.6%":"100%","--height":s==="thumbnailsColumn"?"auto":d,"--gap":A?`var(--spacing-${A})`:"0px","--per-page":t},tabIndex:0,children:c.map((a,i)=>{const L=a.length<t;return r("div",{role:"group","aria-roledescription":n,"data-index":i,className:g(["pdp-carousel__slide",`pdp-carousel__slide--${l}`,["pdp-carousel__slide--active",E===i],["pdp-carousel__slide--orphan",L]]),style:{"--length":a.length},children:a},i)})}),!h&&M(Pe,{children:[Le,De]}),h&&P&&M(Pe,{children:[We,Te]}),s&&c.length!=1&&M("div",{className:g([[`pdp-carousel__controls__container--${s}`,h],["pdp-carousel__controls__container--no-arrows",!b||P]]),style:{"--width":s==="thumbnailsRow"?`${F}px`:ee,"--height":`${ie}px`,"--nr-thumbnails":oe.length},children:[(h||N)&&!P&&Le,r("div",{ref:f,className:g([[`pdp-carousel__controls__wrapper--${s}`,h],["pdp-carousel__controls__wrapper",h]]),children:r("div",{role:"group","aria-label":y,className:g(["pdp-carousel__controls",[`pdp-carousel__controls--${s}`,h]]),children:(u?c.slice(0,O):c).map((a,i)=>{const L=u?O:c.length,S=u?E-1===i:E===i;return h?M("label",{className:g(["pdp-carousel__thumbnail__container"]),ref:B=>{B&&(q.current[i]=B)},children:[r("input",{type:"radio",name:"carousel-thumbnails","aria-label":Z.replace("{key}",String(i+1)).replace("{total}",String(L)),checked:S&&F!==0,onChange:()=>{k(u?i+1:i,!0)},...w,className:g(["pdp-carousel__thumbnail",["pdp-carousel__thumbnail--selected",S&&F!==0]])}),r("span",{className:g(["pdp-carousel__thumbnail__span"]),children:oe[i]})]},i):r("button",{"aria-label":Z.replace("{key}",String(i+1)).replace("{total}",String(L)),onClick:()=>{k(u?i+1:i,!0)},className:g(["pdp-carousel__controls__button",["pdp-carousel__controls__button--active",S]])},i)})})}),(h||N)&&!P&&De]})]})};function ke(e,o=0){if(typeof e=="number")return e;const{small:p,medium:b,large:s}=e,P=786;return o>1024?s:o>P?b:p}const Xe=({title:e,breadcrumbs:o,galleryContent:p,infoContent:b,productContent:s,sku:P,outOfStock:u,shortDescription:A,description:l,attributes:ee,images:d,options:v,price:U,specialPrice:H,className:X,children:N,quantity:w,actions:m,carouselConfig:n,...D})=>{var j,I,ne,Y,le,E;const R=V("PDP.Product.RegularPrice.label").label,y=V("PDP.Product.SpecialPrice.label").label,Z=V("PDP.Product.OutOfStock.label").label,t=V("PDP.Product.Image.label").label,[te,O]=K(null),G=d!=null&&d.length?d.map((J,q)=>{var F;return r(T,{node:J,loading:q===0?"eager":"lazy",alt:((F=e==null?void 0:e.props)==null?void 0:F.children)&&(t==null?void 0:t.replace("{product}",e.props.children.toString()).replace("{key}",String(q+1)).replace("{total}",String(d.length))),onClick:()=>O(q)},q)}):r("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),W=(j=n==null?void 0:n.thumbnails)!=null&&j.length?n.thumbnails.map((J,q)=>{var F;return r(T,{node:J,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((F=e==null?void 0:e.props)==null?void 0:F.children)&&(t==null?void 0:t.replace("{product}",e.props.children.toString()).replace("{key}",String(q+1)).replace("{total}",String(d.length)))},q)}):r("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return M("div",{...D,className:g(["pdp-product",X]),children:[o&&r(T,{node:o,className:"pdp-product__breadcrumbs"}),M("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[r("div",{className:"pdp-product__column-body",children:n!=null&&n.controls?r(me,{className:"pdp-product__overlay__carousel",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?n.controls:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,peak:((I=n==null?void 0:n.thumbnails)==null?void 0:I.length)>1&&((ne=n==null?void 0:n.peak)==null?void 0:ne.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:te||0,thumbnails:W,children:G}):r(Ze,{className:"pdp-product__images",gap:"small",children:G})}),p&&r(T,{node:p,className:"pdp-product__gallery-content"})]}),M("div",{className:"pdp-product__column-container pdp-product__content-column",children:[M("div",{className:"pdp-product__column-body",children:[M("div",{className:"pdp-product__header",children:[e&&r(T,{node:e,className:"pdp-product__title"}),P&&r(T,{node:P,className:"pdp-product__sku"})]}),M("div",{className:"pdp-product__prices",children:[H&&r(T,{node:H,className:g(["pdp-product__price-special","pdp-product__price"]),"aria-label":y,role:"text"}),U&&r(T,{node:U,className:g(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":R,role:"text"})]}),n!=null&&n.mobile?r(me,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,peak:((Y=n==null?void 0:n.thumbnails)==null?void 0:Y.length)>1&&((le=n==null?void 0:n.peak)==null?void 0:le.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:W,children:G}):r(me,{className:"pdp-product__images pdp-product__images--carousel",peak:((E=n==null?void 0:n.peak)==null?void 0:E.mobile)&&(d==null?void 0:d.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(d==null?void 0:d.length)>1,children:G}),M("div",{className:g(["pdp-product__actions",["pdp-product__actions--out-of-stock",u]]),children:[u&&r("div",{className:"pdp-product__out-of-stock__text",children:Z}),v&&r(T,{node:v,className:g(["pdp-product__options"])}),w&&r("div",{className:"pdp-product__quantity",children:r(T,{node:w})}),m&&r(T,{node:m,className:g(["pdp-product__buttons"])})]}),A&&r(T,{node:A,className:g(["pdp-product__short_description"])}),l&&r(T,{node:l,className:g(["pdp-product__description"])}),ee?r("div",{className:"pdp-product__attributes",children:ee}):null]}),b&&r(T,{node:b,className:"pdp-product__info-content"})]}),s&&r(T,{node:s,className:"pdp-product__content"}),te===null?null:r(Je,{className:"pdp-product__overlay",onClose:()=>O(null),centered:!0,children:r(me,{className:"pdp-product__overlay__carousel",arrows:(d==null?void 0:d.length)>1,width:"100%",height:"100%",defaultIndex:te||0,loop:(d==null?void 0:d.length)>1,controls:(d==null?void 0:d.length)>1?"dots":null,isZoomed:!0,children:G})})]})},Ze=({children:e,gap:o=null,className:p,style:b,...s})=>{const P=re.count(e);return r("div",{...s,className:g(["pdp-gallery-grid",p]),style:{"--gap":o?`var(--spacing-${o})`:"0px",...b},children:re.map(e,(u,A)=>r("div",{className:"pdp-gallery-grid__item",children:r(T,{node:u,loading:A===0?"eager":"lazy"},u.props.src)},P+A))})},xe=({amount:e,currency:o,locale:p,variant:b,sale:s,minimumAmount:P,maximumAmount:u,className:A,...l})=>r(Pe,{children:e||P===u?r("div",{className:"pdp-price-range",...l,children:r(Se,{amount:e||P,currency:o,locale:p,variant:b,sale:s,className:A})}):M("div",{className:"pdp-price-range",...l,children:[r(Se,{amount:P,currency:o,locale:p,className:A}),r("span",{className:"pdp-price-range__label",children:"-"}),r(Se,{amount:u,currency:o,locale:p,className:A})]})}),Je=({centered:e,onClose:o,className:p,children:b,...s})=>{const P=V("PDP.Overlay.Close.label").label,u=Q(()=>{o==null||o()},[o]);return C(()=>{const A=l=>{l.key==="Escape"&&u()};return document.addEventListener("keydown",A),()=>{document.removeEventListener("keydown",A)}},[u]),C(()=>{const A=document.scrollingElement,l=A.style.overflow;return A.style.overflow="hidden",()=>{A.style.overflow=l}},[]),M("div",{...s,className:g(["pdp-overlay",["pdp-overlay--centered",e],p]),children:[r("div",{className:"pdp-overlay__content",children:b}),r(we,{"aria-label":P,variant:"tertiary",className:"pdp-overlay__close-button",onClick:u,icon:r(Qe,{})})]})},Ye=["text","image","color","dropdown"],Ce=e=>e.map(o=>({...o,text:o.label,disabled:!o.inStock})),et=({options:e,hideSelectedValue:o,onValues:p,onErrors:b,defaultOptions:s,selectionsToUpdate:P,className:u,children:A,...l})=>{const ee=V("PDP.Swatches.Required.label").label,[d,v]=K(()=>e==null?void 0:e.reduce((w,m)=>{const{items:n}=m,D=n==null?void 0:n.find(y=>s==null?void 0:s.includes(y.id)),R=n==null?void 0:n.find(y=>y.selected);return D?{...w,[m.id]:{label:D.label,value:D.id}}:R?{...w,[m.id]:{label:R.label,value:R.id}}:w},{}));C(()=>{P==null||P.forEach(N=>{v(w=>{var D;const m=(D=N==null?void 0:N.items)==null?void 0:D.find(R=>R.selected);return m?{...w,[N.id]:{label:m==null?void 0:m.label,value:m==null?void 0:m.id}}:w})})},[P,v]),ve(()=>{const N=e==null?void 0:e.reduce((w,m)=>{var n;return(n=m==null?void 0:m.items)==null||n.forEach(D=>{var y;const R=((y=d[m.id])==null?void 0:y.value)===D.id;m.required&&!R&&(w[m.id]=ee)}),w},{});return b==null||b(N),N},[d]);const U=Q((N,w,m)=>{v(n=>{const D={...n,[N]:{label:w,value:m}};return p==null||p(D,m),D})},[p]),H=(N,w)=>{var n;const m=((n=w.selectedOptions[0])==null?void 0:n.label)??"";U(N,m,w.value)},X=Q(({items:N,id:w,required:m,type:n,selected:D,label:R})=>r("div",{className:g(["pdp-swatches__options"]),children:(n==null?void 0:n.toLowerCase())==="dropdown"?r(Ve,{"aria-label":R,handleSelect:y=>H(w,y.target),options:Ce(N),value:D}):N==null?void 0:N.map(y=>{const Z={key:y.id,id:y.id,name:w,value:y.value,label:y.label,groupAriaLabel:R,selected:D===y.id,outOfStock:!y.inStock,required:m===null?!0:m,onValue:()=>{U(w,y.label,y.id)}};switch(n){case"text":return r(ze,{...Z,label:y.label});case"image":return r(qe,{...Z,src:y.value,alt:y.label});case"color":return r(He,{...Z,size:"large",color:y.value});default:return console.warn(`Invalid swatch type ${n}`),null}})}),[U]);return r("div",{...l,className:g(["pdp-swatches",u]),children:e==null?void 0:e.map(({type:N,label:w,id:m,multiple:n,required:D,items:R})=>{var y;if(!N){console.warn("Bundle product not supported on UI.");return}return Ye.includes(N)||console.warn(`Invalid swatch type ${N}`),n&&console.warn("Multiple selection swatches are not currently supported."),M("div",{id:`swatch-item-${m}`,"data-slot-key":`product-swatch--${m}`,className:"pdp-swatches__field",children:[r("div",{className:"pdp-swatches__field__label",children:d[m]?o?`${w}`:`${w}: ${d[m].label}`:w}),r(X,{id:m,type:N,required:D,items:R,label:w,selected:(y=d[m])==null?void 0:y.value})]},`swatch-item-${m}`)})})};function tt(e,o="en_US"){if(!Re(e))throw Error("Invalid date string");return e.split(" ")[1]||(e=`${e} 00:00:00`),new Date(e).toLocaleDateString(Ne(o)).toString()}function Re(e){if(![/^\d{4}-\d{2}-\d{2}$/,/^\d{1,2}\/\d{1,2}\/\d{4}$/,/^\d{2}\/\d{2}\/\d{4}$/,/^\d{4}\/\d{2}\/\d{2}$/,/^\d{1,2}\.\d{1,2}\.\d{4}$/,/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/].some(b=>b.test(e)))return!1;const p=new Date(e);return!isNaN(p.getTime())}function rt(e){const o=new URLSearchParams(window.location.search);Object.entries(e).forEach(([b,s])=>{s===null?o.delete(b):o.set(b,String(s))});let p=window.location.pathname;p+=`?${o.toString()}`,p+=window.location.hash,window.history.replaceState({},"",p)}function nt(){const e=new URLSearchParams(window.location.search),o={};return e.forEach((p,b)=>{o[b]=p}),o}function lt(e){var o,p,b,s,P,u,A,l;return{productId:e==null?void 0:e.externalId,name:e==null?void 0:e.name,sku:e==null?void 0:e.sku,topLevelSku:e==null?void 0:e.externalParentId,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:void 0,pricing:{regularPrice:((p=(o=e==null?void 0:e.prices)==null?void 0:o.regular)==null?void 0:p.amount)||0,minimalPrice:void 0,maximalPrice:void 0,specialPrice:(s=(b=e==null?void 0:e.prices)==null?void 0:b.final)==null?void 0:s.amount,tierPricing:void 0,currencyCode:((u=(P=e==null?void 0:e.prices)==null?void 0:P.final)==null?void 0:u.currency)||"USD"},canonicalUrl:e==null?void 0:e.urlKey,mainImageUrl:(l=(A=e==null?void 0:e.images)==null?void 0:A[0])==null?void 0:l.url}}const ct={PRODUCT_CONTEXT:"productContext"},at={PRODUCT_PAGE_VIEW:"product-page-view"};function Me(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function dt(e,o){const p=Me();p.push({[e]:null}),p.push({[e]:o})}function it(e,o){Me().push(b=>{const s=b.getState?b.getState():{};b.push({event:e,eventInfo:{...s,...o}})})}function Ee(e){const o=lt(e);dt(ct.PRODUCT_CONTEXT,o),it(at.PRODUCT_PAGE_VIEW)}const ot=({sku:e,hideSku:o,hideQuantity:p,hideShortDescription:b,hideDescription:s,hideAttributes:P,hideURLParams:u,hideSelectedOptionValue:A,slots:l,children:ee,initialData:d,carousel:v,optionsConfig:U,useACDL:H,onAddToCart:X,...N})=>{var he,ie,pe,oe;const w=V("PDP.Product.AddToCart.label").label,m=V("PDP.Product.Incrementer.label").label,n=V("PDP.Product.Details.label").label,[D,R]=K(Be.getConfig().defaultLocale||"en-US"),[y,Z]=K(),[t=null,te]=K(d),[O,G]=K(()=>{const c={sku:e,quantity:1};return t!=null&&t.optionUIDs&&(c.optionsUIDs=t.optionUIDs),c}),[W,j]=K(()=>{var c,_;return!(t!=null&&t.options&&((c=t==null?void 0:t.options)==null?void 0:c.length)>0&&((_=t==null?void 0:t.optionUIDs)==null?void 0:_.length)!==(t==null?void 0:t.options.length))}),I={data:t,values:O,valid:W};C(()=>{const c=Fe.on("locale",_=>{_!==D&&(R(_),$e(e).then(te))});return()=>{c==null||c.off()}},[D,e]),C(()=>{H&&d&&Object.keys(d).length>0&&Ee(d)},[d]);const ne=Q(c=>{G(_=>({..._,...c}))},[]),Y=Q(c=>{var f;let _=Object.keys(c).map(h=>c[h].value).filter(h=>h!==void 0);u||rt({optionsUIDs:_.join(",")}),G(h=>({...h,optionsUIDs:_})),j((_==null?void 0:_.length)===((f=t==null?void 0:t.options)==null?void 0:f.length)),Oe(e,_,U==null?void 0:U.anchorOptions).then(h=>{var $;te(h),($=U==null?void 0:U.anchorOptions)!=null&&$.length&&le(h,_),H&&(h==null?void 0:h.sku)!==e&&Ee(h)})},[e]),le=Q((c,_)=>{var $;const f=(c==null?void 0:c.optionUIDs)??[];_.every(k=>f.includes(k))||(Z(c==null?void 0:c.options),G(k=>({...k,optionsUIDs:f})),j((f==null?void 0:f.length)===(($=c==null?void 0:c.options)==null?void 0:$.length)))},[e]),E=Q(c=>{Object.keys(c).length!==0&&j(!1)},[]),J=ve(()=>{var c;return(c=t==null?void 0:t.attributes)==null?void 0:c.map(({label:_,value:f},h)=>{const $=Re(f)?tt(f,D):f.toString();return M("li",{children:[_,": ",r("span",{dangerouslySetInnerHTML:{__html:$}})]},h)})},[t==null?void 0:t.attributes,D]),q=!p&&(t!=null&&t.inStock)?r(z,{name:"Quantity",slot:l==null?void 0:l.Quantity,context:{...I},children:r(Ge,{name:"quantity",defaultValue:O.quantity.toString(),min:1,"aria-label":m,className:"pdp-product__quantity",onValue:c=>{ne({quantity:Number(c)})}},"quantity")}):void 0,F=()=>{if(t!=null&&t.options)return r(z,{name:"Options",slot:l==null?void 0:l.Options,context:{...I},children:r(et,{options:t.options,defaultOptions:O.optionsUIDs,selectionsToUpdate:y,hideSelectedValue:A,onValues:Y,onErrors:E})})};return r("div",{...N,children:r(Xe,{title:r(z,{name:"Title",slot:l==null?void 0:l.Title,context:{...I},children:t==null?void 0:t.name}),sku:o?void 0:r(z,{name:"SKU",slot:l==null?void 0:l.SKU,context:{...I},children:t==null?void 0:t.sku}),options:F(),breadcrumbs:(l==null?void 0:l.Breadcrumbs)&&r(z,{name:"Breadcrumbs",slot:l==null?void 0:l.Breadcrumbs,context:{...I,setSeparator(c){this._registerMethod((..._)=>{const f=c(..._),h=f&&r(be,{source:f});this._setProps($=>({...$,separator:h}))})},appendLink(c){this._registerMethod((..._)=>{const{text:f,...h}=c(..._),$=r("a",{...h,children:f});this._setProps(k=>({...k,categories:[...k.categories||[],$]}))})},appendHTMLElement(c){this._registerMethod((..._)=>{const f=c(..._),h=this._htmlElementToVNode(f);this._setProps($=>({...$,categories:[...$.categories||[],h]}))})}},render:({separator:c,categories:_})=>r(je,{separator:c,categories:_})}),quantity:q,actions:r(z,{name:"Actions",slot:l==null?void 0:l.Actions,context:{...I,appendButton(c){this._registerMethod((..._)=>{const f=c(..._);if(!f)return;const{text:h,icon:$,...k}=f,ce=r(we,{type:"button",...k,icon:$&&r(be,{source:$}),children:h});this._setProps(ae=>({children:[...ae.children||[],ce]}))})}},children:!(l!=null&&l.Actions)&&r(we,{size:"medium",type:"submit",icon:r(be,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!W,"aria-label":w,onClick:()=>X==null?void 0:X(O),children:w})}),shortDescription:b?void 0:r(z,{name:"ShortDescription",slot:l==null?void 0:l.ShortDescription,context:{...I},children:r("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:s?void 0:r(z,{name:"Description",slot:l==null?void 0:l.Description,context:{...I},children:r("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((he=t==null?void 0:t.images)==null?void 0:he.map(({label:c,url:_})=>{var f,h;return r(Ie,{title:c,alt:c,src:_,width:((f=v==null?void 0:v.imageParams)==null?void 0:f.width)??960,height:((h=v==null?void 0:v.imageParams)==null?void 0:h.height)??1191,params:(v==null?void 0:v.imageParams)??{width:960}},_)}))??[],specialPrice:(ie=t==null?void 0:t.prices)!=null&&ie.visible?r(z,{name:"SpecialPrice",slot:l==null?void 0:l.SpecialPrice,context:{...I},children:r(xe,{...t.prices.final,locale:Ne(D)})}):void 0,price:(pe=t==null?void 0:t.prices)!=null&&pe.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?r(z,{name:"RegularPrice",slot:l==null?void 0:l.RegularPrice,context:{...I},children:r(xe,{...t.prices.regular,locale:Ne(D)})}):void 0,carouselConfig:{...v,thumbnails:v?((oe=t==null?void 0:t.images)==null?void 0:oe.map(({label:c,url:_})=>{var f,h;return r(Ie,{title:c,alt:c,src:_,width:((f=v==null?void 0:v.thumbnailParams)==null?void 0:f.width)??200,height:((h=v==null?void 0:v.thumbnailParams)==null?void 0:h.height)??248,params:(v==null?void 0:v.thumbnailParams)??{width:200}},_)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:P?void 0:r(z,{name:"Attributes",slot:l==null?void 0:l.Attributes,context:{...I},children:J!=null&&J.length?M(Pe,{children:[n,r("ul",{children:J})]}):null}),galleryContent:(l==null?void 0:l.GalleryContent)&&r(z,{name:"GalleryContent",slot:l.GalleryContent,context:{...I}}),infoContent:(l==null?void 0:l.InfoContent)&&r(z,{name:"InfoContent",slot:l.InfoContent,context:{...I}}),productContent:(l==null?void 0:l.Content)&&r(z,{name:"Content",slot:l.Content,context:{...I}})})})};ot.getInitialData=async function({sku:e,optionsConfig:o}){var b,s,P,u,A,l;const p=((b=nt().optionsUIDs)==null?void 0:b.split(","))||((l=(A=(u=(P=(s=Be)==null?void 0:s.getConfig())==null?void 0:P.models)==null?void 0:u.ProductDetails)==null?void 0:A.initialData)==null?void 0:l.optionsUIDs);return p!=null&&p.length?await Oe(e,p,o==null?void 0:o.anchorOptions):await $e(e)};export{ot as ProductDetails,ot as default};
2
2
  //# sourceMappingURL=ProductDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductDetails.js","sources":["../../node_modules/@adobe/elsie/src/icons/ChevronDown.svg","../../node_modules/@adobe/elsie/src/icons/Close.svg","../../src/components/Carousel/Carousel.tsx","../../src/components/Product/Product.tsx","../../src/components/GalleryGrid/GalleryGrid.tsx","../../src/components/PriceRange/PriceRange.tsx","../../src/components/Overlay/Overlay.tsx","../../src/components/Swatches/Swatches.tsx","../../src/lib/date.ts","../../src/lib/url-params.ts","../../src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","import { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n Children,\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from 'preact/compat';\nimport { classes, debounce } from '@adobe/elsie/lib';\nimport { Button, Icon } from '@adobe/elsie/components';\nimport { ChevronDown } from '@adobe/elsie/icons';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport '@/pdp/components/Carousel/Carousel.css';\n\ntype Show = number;\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n children: VNode[] | VNode;\n thumbnails?: VNode[] | VNode;\n show?: Show | { small: Show; medium: Show; large: Show };\n gap?: 'small' | 'medium' | 'large' | null;\n scrollbar?: boolean;\n peak?: boolean;\n arrows?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loop?: boolean;\n direction?: 'horizontal';\n style?: Record<string, string | number>;\n width?: string;\n height?: string;\n defaultIndex?: number;\n infinite?: boolean;\n isZoomed?: boolean;\n}\n\nexport const Carousel: FunctionComponent<CarouselProps> = ({\n show = 1,\n scrollbar = false,\n peak = false,\n arrows = false,\n controls = 'dots',\n arrowsOnMainImage = false,\n loop = false,\n gap = null,\n direction = 'horizontal',\n width = '100%',\n height = '100%',\n defaultIndex = 0,\n className,\n children,\n thumbnails = null,\n isZoomed,\n ...props\n}) => {\n // i18n\n const Label = useText('PDP.Carousel.label').label;\n const SlideLabel = useText('PDP.Carousel.Slide.label').label;\n const PreviousLabel = useText('PDP.Carousel.Previous.label').label;\n const NextLabel = useText('PDP.Carousel.Next.label').label;\n const ControlsLabel = useText('PDP.Carousel.Controls.label').label;\n const ControlsBtnLabel = useText('PDP.Carousel.Controls.Button.label').label;\n\n // States\n const [perPage, setPerPage] = useState(() => getPerPageFromBreakpoint(show));\n\n // Constants\n const length = Math.ceil(Children.toArray(children).length / perPage);\n const gapSizes = { small: 16, medium: 24, large: 64 };\n const peakWidth = peak ? 24 : 0;\n const gapWidth = gap ? gapSizes[gap] : 0;\n const rest = Children.toArray(children).length % perPage;\n const thumbGap = 16;\n const thumbSeen = 2;\n const iconSize = '32';\n\n // States\n const [current, setCurrent] = useState(\n loop ? defaultIndex + 1 : defaultIndex\n );\n\n // Thumbnails\n const thumbnailsRefs = useRef<HTMLLabelElement[]>([]);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbHeight, setThumbHeight] = useState(0);\n \n const thumbnailSlides = useMemo<VNode[]>(() => {\n return Children.toArray(thumbnails);\n }, [thumbnails]);\n\n // Slides\n const slides = useMemo<VNode[][]>(() => {\n const returnValue = Children.toArray(children).reduce((acc, child, i) => {\n if (i % perPage === 0) {\n return [...acc, [child]];\n }\n\n return [...acc.slice(0, -1), [...acc[acc.length - 1], child]];\n }, [] as VNode[][]);\n\n if (!loop || returnValue.length === 1) {\n return returnValue;\n }\n\n if (loop && !(Children.toArray(children).length % perPage !== 0)) {\n return [returnValue[length - 1]]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }\n\n return [Children.toArray(children).slice(-perPage)]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }, [children, perPage, length, loop]);\n\n // Wrapper\n const wrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailsWrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailControls = controls === 'thumbnailsRow' || controls === 'thumbnailsColumn';\n\n // Observe Window Resize (responsive)\n useEffect(() => {\n const wrapper = document.body;\n\n const handleResize = debounce(() => {\n setThumbWidth(wrapperRef.current?.offsetWidth ?? 0)\n setThumbHeight(wrapperRef.current?.offsetHeight ?? 0)\n const width = window.innerWidth;\n const newPerPage = getPerPageFromBreakpoint(show, width);\n\n if (newPerPage !== perPage) {\n setPerPage(newPerPage);\n }\n }, 50);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapper);\n\n return () => {\n observer.unobserve(wrapper);\n };\n }, [perPage, show]);\n\n // Scrolling logic controls\n const handleThumbnailsScroll = useCallback((nextSlideIndex: number) => {\n const nextItem = loop ? nextSlideIndex - 1 : nextSlideIndex;\n const thumbnailRef = thumbnailsRefs?.current[0];\n const oneItemWidth = thumbnailRef?.offsetWidth + thumbGap;\n const oneItemHeight = thumbnailRef?.offsetHeight + thumbGap;\n const thumbnailsWrapper = thumbnailsWrapperRef.current!;\n\n if (controls === 'thumbnailsRow' && thumbnailsWrapper?.offsetWidth) {\n if (oneItemWidth * (nextItem + 1) > thumbnailsWrapper.offsetWidth) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem + thumbSeen) * oneItemWidth;\n }\n\n if (thumbnailsWrapper.scrollLeft > oneItemWidth * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem - thumbSeen) * oneItemWidth;\n }\n }\n\n if (controls === 'thumbnailsColumn' && thumbnailsWrapper?.offsetHeight) {\n if (oneItemHeight * (nextItem + 1) > thumbnailsWrapper.offsetHeight) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem + thumbSeen) * oneItemHeight;\n }\n\n if (thumbnailsWrapper.scrollTop > oneItemHeight * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem - thumbSeen) * oneItemHeight;\n }\n }\n }, [controls, loop]);\n\n // Navigation\n const handleScrollTo = useCallback(\n (nextSlideIndex: number, smooth?: boolean, reset?: boolean) => {\n if (controls === 'thumbnailsRow' || controls === 'thumbnailsColumn') {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n\n const items = Array.from(wrapper.querySelectorAll('[data-index]')).filter(\n (element) => {\n const dataIndex = Number(element.getAttribute('data-index')!);\n return !isNaN(dataIndex) && dataIndex > -1;\n }\n );\n\n const item = items[nextSlideIndex];\n\n if (!item) {\n return;\n }\n\n if (reset) {\n const futureIndex = nextSlideIndex === 0 ? length : 0;\n const scrollWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (wrapper.scrollLeft >= 0 && wrapper.scrollLeft < realWidth - 5) {\n handleScrollTo(1, true);\n return;\n }\n\n if (\n wrapper.scrollLeft > scrollWidth - realWidth &&\n wrapper.scrollLeft <= scrollWidth\n ) {\n handleScrollTo(length, true);\n return;\n }\n\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = futureIndex === 0 ? 0 : scrollWidth;\n handleScrollTo(futureIndex === 0 ? 1 : length, true);\n return;\n }\n\n const diff =\n ((wrapper.offsetWidth - gapWidth) / perPage) *\n slides[nextSlideIndex].length -\n peakWidth;\n\n wrapper.style.scrollBehavior = smooth ? 'smooth' : 'auto';\n wrapper.scrollLeft =\n slides[nextSlideIndex].length === perPage\n ? realWidth * nextSlideIndex\n : realWidth * (nextSlideIndex - 1) + diff;\n return;\n },\n [gapWidth, length, peakWidth, perPage, rest, slides, handleThumbnailsScroll, controls]\n );\n\n const handleGoToPrev = useCallback(() => {\n if (loop) {\n const nextSlideIndex = current - 1;\n handleScrollTo(nextSlideIndex, true, current === 1);\n return;\n }\n\n const nextSlideIndex = current <= 0 ? 0 : current - 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [current, handleScrollTo, loop]);\n\n const handleGoToNext = useCallback(() => {\n const lastSlideIndex = slides.length - 1;\n\n if (loop) {\n const nextSlideIndex = current + 1;\n handleScrollTo(nextSlideIndex, true, current === length);\n return;\n }\n\n const nextSlideIndex =\n current >= lastSlideIndex ? lastSlideIndex : current + 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [slides.length, loop, current, handleScrollTo, length]);\n\n // Navigate with keyboard\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n handleGoToPrev();\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleGoToNext();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleGoToNext, handleGoToPrev]);\n\n // Set default index\n useEffect(() => {\n handleScrollTo(loop ? defaultIndex + 1 : defaultIndex, false);\n }, [defaultIndex, handleScrollTo, loop]);\n\n // Track scrolling (swipes)\n const handleOnScroll = debounce(() => {\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n const dividing = wrapper.scrollLeft / realWidth;\n const nextSlideIndex = Math.round(dividing) - dividing < 1 ? Math.round(dividing) : Math.ceil(dividing);\n\n if (thumbnailControls) {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n if (loop) {\n const totalWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (Math.ceil(wrapper.scrollLeft) >= Math.ceil(totalWidth) - 5) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft =\n wrapper.offsetWidth * 1 +\n (Math.ceil(wrapper.scrollLeft) - Math.ceil(totalWidth) - peakWidth);\n return;\n }\n\n if (wrapper.scrollLeft === 0) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = totalWidth - wrapper.offsetWidth + peakWidth;\n return;\n }\n }\n\n if (current !== nextSlideIndex) {\n setCurrent(nextSlideIndex);\n }\n }, 100);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n wrapper?.addEventListener('scroll', handleOnScroll);\n\n return () => {\n wrapper?.removeEventListener('scroll', handleOnScroll);\n };\n }, [handleOnScroll]);\n\n // thumbnails is column -> container is row reverse, controls is column\n // thumbnails is row -> container is column, controls is row\n const getArrow = (forThumbnails: boolean, direction: string, callback: () => void) => {\n return <Button\n className={classes([\n ['pdp-carousel__button', !forThumbnails],\n [`pdp-carousel__button--${direction}`, !forThumbnails],\n [`pdp-carousel__button--${controls}`, forThumbnails]\n ])}\n style={{\n '--height': `${thumbHeight}px`,\n }}\n variant=\"tertiary\"\n aria-label={direction === 'next' ? NextLabel : PreviousLabel}\n onClick={callback}\n disabled={loop ? false : direction === 'next' ? current >= slides.length - 1 : current < 1}\n >\n <Icon\n className={classes([\n ['pdp-carousel__button__icon', !forThumbnails],\n [`pdp-carousel__button__icon--${direction}`, !forThumbnails],\n [`pdp-carousel__button__icon--${controls}--${direction}`, forThumbnails]\n ])}\n size={iconSize}\n source={ChevronDown}\n />\n </Button>\n }\n\n const prevArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'prev', handleGoToPrev);\n\n const nextArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'next', handleGoToNext);\n\n const prevArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'prev', handleGoToPrev);\n \n const nextArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'next', handleGoToNext);\n\n return (\n <div\n role=\"region\"\n aria-roledescription={Label}\n className={classes([\n 'pdp-carousel',\n ['pdp-carousel--main-image-controls', arrowsOnMainImage],\n ['pdp-carousel--arrows', arrows && !thumbnailControls],\n [`pdp-carousel--${controls}`, thumbnailControls],\n className,\n ])}\n style={{\n '--flex-carousel': controls === 'thumbnailsColumn' ? 'row-reverse' : 'column',\n '--gap': thumbnailControls ? '0' : 'var(--spacing-small)',\n '--width': width,\n }}\n {...props}\n >\n\n {/* Slideshow */}\n <div\n ref={wrapperRef}\n className={classes([\n 'pdp-carousel__wrapper',\n `pdp-carousel__wrapper--${direction}`,\n ['pdp-carousel__wrapper--scrollbar', scrollbar],\n ['pdp-carousel__wrapper--peak', peak],\n ])}\n style={{\n '--total-width': controls === 'thumbnailsColumn' ? `81.6%` : `100%`,\n '--height': controls === 'thumbnailsColumn' ? 'auto' : height,\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n '--per-page': perPage,\n }}\n tabIndex={0}\n >\n {slides.map((page, index) => {\n const orphan = page.length < perPage;\n\n return (\n <div\n key={index}\n role=\"group\"\n aria-roledescription={SlideLabel}\n data-index={index}\n className={classes([\n 'pdp-carousel__slide',\n `pdp-carousel__slide--${direction}`,\n ['pdp-carousel__slide--active', current === index],\n ['pdp-carousel__slide--orphan', orphan],\n ])}\n style={{\n '--length': page.length,\n }}\n >\n {page}\n </div>\n );\n })}\n </div>\n\n {/* Previous and next arrows for Carousel without thumbnails */}\n {\n (!thumbnailControls) && (\n <>\n {prevArrow}\n {nextArrow}\n </>\n )\n }\n\n {\n (thumbnailControls && arrowsOnMainImage) && (\n <>\n {prevArrowMainImage}\n {nextArrowMainImage}\n </>\n )\n }\n\n {/* Controls */}\n {controls && slides.length != 1 && (\n <div\n className={classes([\n [`pdp-carousel__controls__container--${controls}`, thumbnailControls],\n ['pdp-carousel__controls__container--no-arrows', !arrows || arrowsOnMainImage],\n ])}\n style={{\n '--width': controls === 'thumbnailsRow' ? `${thumbWidth}px` : width,\n '--height': `${thumbHeight}px`,\n '--nr-thumbnails': thumbnailSlides.length,\n }}\n >\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && prevArrow}\n <div\n ref={thumbnailsWrapperRef}\n className={classes([\n [`pdp-carousel__controls__wrapper--${controls}`, thumbnailControls],\n [`pdp-carousel__controls__wrapper`, thumbnailControls],\n ])}\n >\n <div\n role=\"group\"\n aria-label={ControlsLabel}\n className={classes([\n 'pdp-carousel__controls',\n [`pdp-carousel__controls--${controls}`, thumbnailControls],\n ])}\n >\n {(loop ? slides.slice(0, length) : slides).map((_, key) => {\n const buttonsLength = loop ? length : slides.length;\n const active = loop ? current - 1 === key : current === key;\n\n if (!thumbnailControls) {\n return (\n <button\n key={key}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n onClick={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n className={classes([\n 'pdp-carousel__controls__button',\n ['pdp-carousel__controls__button--active', active],\n ])}\n />\n );\n }\n return (\n <label\n className={classes(['pdp-carousel__thumbnail__container'])}\n key={key}\n ref={(el: HTMLLabelElement | null) => {\n if (el) {\n thumbnailsRefs.current[key] = el;\n }\n }}\n >\n <input\n type=\"radio\"\n name={\"carousel-thumbnails\"}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n checked={active && thumbWidth !== 0}\n onChange={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n {...props}\n className={classes([\n 'pdp-carousel__thumbnail',\n ['pdp-carousel__thumbnail--selected', active && thumbWidth !== 0],\n ])}\n />\n\n <span\n className={classes([\n 'pdp-carousel__thumbnail__span',\n ])}\n >\n {thumbnailSlides[key]}\n </span>\n </label>\n )\n })}\n </div>\n </div>\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && nextArrow}\n </div>\n )}\n </div>\n );\n};\n\n// Utilities\nfunction getPerPageFromBreakpoint(\n breakpoints:\n | {\n small: number;\n medium: number;\n large: number;\n }\n | number,\n width = 0\n) {\n if (typeof breakpoints === 'number') return breakpoints;\n\n const { small, medium, large } = breakpoints;\n const mediumViewport = 786;\n const largeVierport = 1024;\n\n if (width > largeVierport) return large;\n if (width > mediumViewport) return medium;\n return small;\n}\n","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport { Carousel, GalleryGrid, Overlay } from '@/pdp/components';\nimport '@/pdp/components/Product/Product.css';\n\nimport { CarouselConfig } from '@/pdp/containers';\n\ninterface ProductCarouselConfig extends CarouselConfig {\n thumbnails: VNode[];\n}\n\nexport interface ProductProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: VNode;\n breadcrumbs?: VNode;\n galleryContent?: VNode;\n infoContent?: VNode;\n productContent?: VNode;\n shortDescription?: VNode;\n description?: VNode;\n attributes?: VNode;\n images: VNode[];\n options?: VNode;\n sku?: VNode;\n price?: VNode;\n specialPrice?: VNode;\n outOfStock: boolean;\n actions?: VNode;\n quantity?: VNode;\n carouselConfig?: ProductCarouselConfig;\n}\n\nexport const Product: FunctionComponent<ProductProps> = ({\n title,\n breadcrumbs,\n galleryContent,\n infoContent,\n productContent,\n sku,\n outOfStock,\n shortDescription,\n description,\n attributes,\n images,\n options,\n price,\n specialPrice,\n className,\n children,\n quantity,\n actions,\n carouselConfig,\n ...props\n}) => {\n // i18n\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.label').label;\n const OutOfStockLabel = useText('PDP.Product.OutOfStock.label').label;\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [zoom, setZoom] = useState<number | null>(null);\n\n const galleryImages = images?.length ? (\n images.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))\n }\n onClick={() => setZoom(key)}\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n const localThumbnailsImages = carouselConfig?.thumbnails?.length ? (\n carouselConfig.thumbnails.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={carouselConfig?.thumbnailsLoadingMode || 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))}\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n return (\n <div {...props} className={classes(['pdp-product', className])}>\n {breadcrumbs && (\n <VComponent node={breadcrumbs} className=\"pdp-product__breadcrumbs\" />\n )}\n <div className=\"pdp-product__column-container pdp-product__gallery-column\">\n <div className=\"pdp-product__column-body\">\n {\n carouselConfig?.controls ?\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? carouselConfig.controls : 'dots'}\n arrowsOnMainImage={carouselConfig?.arrowsOnMainImage}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.desktop || false}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n :\n <GalleryGrid className=\"pdp-product__images\" gap=\"small\">\n {galleryImages}\n </GalleryGrid>\n }\n </div>\n {galleryContent && (\n <VComponent\n node={galleryContent}\n className=\"pdp-product__gallery-content\"\n />\n )}\n </div>\n\n <div className=\"pdp-product__column-container pdp-product__content-column\">\n <div className=\"pdp-product__column-body\">\n <div className=\"pdp-product__header\">\n {title && (\n <VComponent\n node={title}\n className=\"pdp-product__title\"\n />\n )}\n\n {sku && (\n <VComponent node={sku} className=\"pdp-product__sku\" />\n )}\n </div>\n\n <div className=\"pdp-product__prices\">\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes(['pdp-product__price-special', 'pdp-product__price'])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes(['pdp-product__price-regular', 'pdp-product__price--grey'])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n </div>\n\n {/* Small Screen Gallery */}\n {\n carouselConfig?.mobile ?\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails\"\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'thumbnailsRow' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.mobile || false}\n gap={carouselConfig?.gap || null}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n :\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel\"\n peak={carouselConfig?.peak?.mobile && images?.length > 1}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n >\n {galleryImages}\n </Carousel>\n }\n\n <div\n className={classes([\n 'pdp-product__actions',\n [`pdp-product__actions--out-of-stock`, outOfStock],\n ])}\n >\n {outOfStock && (\n <div className=\"pdp-product__out-of-stock__text\">\n {OutOfStockLabel}\n </div>\n )}\n\n {options && (\n <VComponent\n node={options}\n className={classes(['pdp-product__options'])}\n />\n )}\n\n {quantity && (\n <div className=\"pdp-product__quantity\">\n <VComponent node={quantity} />\n </div>\n )}\n\n {actions && (\n <VComponent\n node={actions}\n className={classes(['pdp-product__buttons'])}\n />\n )}\n </div>\n\n {shortDescription && (\n <VComponent\n node={shortDescription}\n className={classes(['pdp-product__short_description'])}\n />\n )}\n\n {description && (\n <VComponent\n node={description}\n className={classes(['pdp-product__description'])}\n />\n )}\n\n {attributes ? (\n <div className=\"pdp-product__attributes\">{attributes}</div>\n ) : null}\n </div>\n {infoContent && (\n <VComponent\n node={infoContent}\n className=\"pdp-product__info-content\" />\n )}\n </div>\n\n {productContent && (\n <VComponent\n node={productContent}\n className=\"pdp-product__content\"\n />\n )}\n\n {/* Zoom Overlay */}\n {zoom === null ? null : (\n <Overlay\n className=\"pdp-product__overlay\"\n onClose={() => setZoom(null)}\n centered\n >\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n loop={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n isZoomed\n >\n {galleryImages}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, Children } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/elsie/lib';\nimport '@/pdp/components/GalleryGrid/GalleryGrid.css';\n\nexport interface GalleryGridProps extends HTMLAttributes<HTMLDivElement> {\n children: VNode[] | VNode;\n gap?: 'small' | 'medium' | 'large' | null;\n style?: Record<string, string | number>;\n}\n\nexport const GalleryGrid: FunctionComponent<GalleryGridProps> = ({\n children,\n gap = null,\n className,\n style,\n ...props\n}) => {\n const count = Children.count(children);\n\n return (\n <div\n {...props}\n className={classes(['pdp-gallery-grid', className])}\n style={{\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n ...style,\n }}\n >\n {Children.map(\n children,\n (child: VNode<HTMLAttributes<HTMLElement>>, key) => (\n <div key={count + key} className=\"pdp-gallery-grid__item\">\n <VComponent\n key={child.props.src}\n node={child}\n loading={key === 0 ? 'eager' : 'lazy'}\n />\n </div>\n )\n )}\n </div>\n );\n};\n","/*\nADOBE CONFIDENTIAL\nCopyright 2023 Adobe\nAll Rights Reserved.\nNOTICE: All information contained herein is, and remains\nthe property of Adobe and its suppliers, if any. The intellectual\nand technical concepts contained herein are proprietary to Adobe\nand its suppliers and are protected by all applicable intellectual\nproperty laws, including trade secret and copyright laws.\nDissemination of this information or reproduction of this material\nis strictly forbidden unless prior written permission is obtained\nfrom Adobe.\n*/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport '@/pdp/components/PriceRange/PriceRange.css';\nimport { FunctionalComponent } from 'preact';\nimport { Price } from '@adobe/elsie/components';\n\nexport interface PriceRangeProps extends HTMLAttributes<HTMLDivElement> {\n locale?: string;\n variant?: 'default' | 'strikethrough';\n currency?: string;\n\n // Simple product\n amount?: number;\n sale?: boolean;\n\n // Complex product (range)\n minimumAmount?: number;\n maximumAmount?: number;\n}\n\nexport const PriceRange: FunctionalComponent<PriceRangeProps> = ({\n amount,\n currency,\n locale,\n variant,\n sale,\n minimumAmount,\n maximumAmount,\n className,\n ...props\n}) => {\n return (\n <>\n {amount || minimumAmount === maximumAmount ? (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={amount ? amount : minimumAmount}\n currency={currency}\n locale={locale}\n variant={variant}\n sale={sale}\n className={className}\n />\n </div>\n ) : (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={minimumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n <span className=\"pdp-price-range__label\">{'-'}</span>\n <Price\n amount={maximumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n </div>\n )}\n </>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { Close as CloseSVG } from '@adobe/elsie/icons';\nimport { Button } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Overlay/Overlay.css';\n\nexport interface OverlayProps extends HTMLAttributes<HTMLDivElement> {\n centered?: boolean;\n onClose?: () => void;\n}\n\nexport const Overlay: FunctionComponent<OverlayProps> = ({\n centered,\n onClose,\n className,\n children,\n ...props\n}) => {\n // i18n\n const CloseLabel = useText('PDP.Overlay.Close.label').label;\n\n const handleOnClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n // Close on ESC\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleOnClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleOnClose]);\n\n // Prevent document scrolling\n useEffect(() => {\n const scrollingElement = document.scrollingElement as HTMLElement;\n\n const defaultOverflowValue = scrollingElement.style.overflow;\n\n scrollingElement.style.overflow = 'hidden';\n\n return () => {\n scrollingElement.style.overflow = defaultOverflowValue;\n };\n }, []);\n\n return (\n <div\n {...props}\n className={classes([\n 'pdp-overlay',\n ['pdp-overlay--centered', centered],\n className,\n ])}\n >\n <div className=\"pdp-overlay__content\">{children}</div>\n\n <Button\n aria-label={CloseLabel}\n variant=\"tertiary\"\n className=\"pdp-overlay__close-button\"\n onClick={handleOnClose}\n icon={<CloseSVG />}\n />\n </div>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useState, useMemo, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { ColorSwatch, ImageSwatch, TextSwatch, Picker, PickerOption } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Swatches/Swatches.css';\n\nconst supportedTypes = ['text', 'image', 'color', 'dropdown'];\n\nconst mapToPickerOptions = (items: OptionValue[]): PickerOption[] => {\n return items.map((item: OptionValue) => ({ ...item, text: item.label, disabled: !item.inStock, }));\n}\n\ntype OptionValue = {\n id: string;\n label: string;\n inStock: boolean;\n value: string;\n selected?: boolean;\n};\n\nexport type Option = {\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n};\n\ntype Selection = { [id: string]: { label: string; value: string } };\n\nexport interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {\n options: Array<{\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n }>;\n hideSelectedValue?: boolean;\n\n defaultOptions?: string[];\n selectionsToUpdate?: Option[];\n onValues?: (uids: Selection, current: string) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n}\n\nexport const Swatches: FunctionComponent<SwatchesProps> = ({\n options,\n hideSelectedValue,\n onValues,\n onErrors,\n defaultOptions,\n selectionsToUpdate,\n className,\n children,\n ...props\n}) => {\n // i18n\n const RequiredLabel = useText('PDP.Swatches.Required.label').label;\n\n const [selections, setSelections] = useState<Selection>(() => {\n const initial = options?.reduce((accum, option) => {\n const { items } = option;\n const defaultSelection = items?.find((item) => defaultOptions?.includes(item.id));\n const selected = items?.find((item) => item.selected);\n if (defaultSelection) {\n return {\n ...accum,\n [option.id]: { label: defaultSelection.label, value: defaultSelection.id },\n };\n } else if (selected) {\n return {\n ...accum,\n [option.id]: { label: selected.label, value: selected.id },\n };\n }\n return accum;\n }, {} as Selection);\n\n return initial;\n });\n\n // this only applies for the case with anchor options\n // update selections in the swatches if they are updated in the parent component\n useEffect(() => {\n selectionsToUpdate?.forEach((selectionToUpdate) => {\n setSelections((prev) => {\n const selectedItem = selectionToUpdate\n ?.items?.find((item) => item.selected);\n if (!selectedItem) return prev;\n\n const next = {\n ...prev,\n [selectionToUpdate.id]: {\n label: selectedItem?.label,\n value: selectedItem?.id\n },\n };\n return next;\n });\n });\n }, [selectionsToUpdate, setSelections]);\n\n // Update invalid options\n useMemo(() => {\n const errors = options?.reduce((accum, option) => {\n option?.items?.forEach((item) => {\n const selected = selections[option.id]?.value === item.id;\n\n // Validate required\n if (option.required && !selected) {\n accum[option.id] = RequiredLabel;\n }\n });\n\n return accum;\n }, {} as { [id: string]: string });\n\n // Call the callback\n onErrors?.(errors);\n\n return errors;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selections]);\n\n const handleOnSelection = useCallback(\n (id: string, label: string, optionId: string) => {\n setSelections((prev) => {\n const next = {\n ...prev,\n [id]: { label, value: optionId },\n };\n\n // Call the callback\n onValues?.(next, optionId);\n\n // Return the next state\n return next;\n });\n },\n [onValues]\n );\n\n // Function to handle the picker selection\n const handlePickerSelect = (optionId: string, selection: any ) => {\n const label = selection.selectedOptions[0]?.label ?? '';\n handleOnSelection(optionId, label, selection.value);\n };\n\n const Swatches = useCallback(\n ({ items, id, required, type, selected, label }: any) => {\n return (\n <div className={classes(['pdp-swatches__options'])}>\n {\n type?.toLowerCase() === 'dropdown' ?\n <Picker aria-label={label} handleSelect={(event) => handlePickerSelect(id, event.target)} options={mapToPickerOptions(items)} value={selected} />\n :\n items?.map((option: any) => {\n const common = {\n key: option.id,\n id: option.id,\n name: id,\n value: option.value,\n label: option.label,\n groupAriaLabel: label,\n selected: selected === option.id,\n outOfStock: !option.inStock,\n // API may return null, we default to true as all swatches are required.\n // we still comply to this in case the api return \"false\".\n required: required === null ? true : required,\n onValue: () => {\n handleOnSelection(id, option.label, option.id);\n },\n };\n\n switch (type) {\n case 'text':\n return <TextSwatch {...common} label={option.label} />;\n\n case 'image':\n return (\n <ImageSwatch\n {...common}\n src={option.value}\n alt={option.label}\n />\n );\n\n case 'color':\n return (\n <ColorSwatch {...common} size=\"large\" color={option.value} />\n );\n\n default:\n console.warn(`Invalid swatch type ${type}`);\n return null;\n }\n })}\n </div>\n );\n },\n [handleOnSelection]\n );\n\n return (\n <div {...props} className={classes(['pdp-swatches', className])}>\n {options?.map(({ type, label, id, multiple, required, items }) => {\n if (!type) {\n console.warn(`Bundle product not supported on UI.`);\n return;\n }\n\n // Only render supported types\n if (!supportedTypes.includes(type)) {\n console.warn(`Invalid swatch type ${type}`);\n }\n\n if (multiple) {\n console.warn(\n 'Multiple selection swatches are not currently supported.'\n );\n }\n\n return (\n <div\n key={`swatch-item-${id}`}\n id={`swatch-item-${id}`}\n data-slot-key={`product-swatch--${id}`}\n className=\"pdp-swatches__field\"\n >\n <div className=\"pdp-swatches__field__label\">\n {selections[id] ? (hideSelectedValue ? `${label}` : `${label}: ${selections[id].label}`) : label}\n </div>\n\n <Swatches\n id={id}\n type={type}\n required={required}\n items={items}\n label={label} //label referring to the name of the swatchGroup\n selected={selections[id]?.value}\n />\n </div>\n );\n })}\n </div>\n );\n};\n","import { toLanguageTag } from '@adobe/elsie/lib';\n\nexport function toDateString(value: string, locale = 'en_US') {\n if (!isDateValid(value)) throw Error('Invalid date string');\n\n // normalize time to 00:00:00\n const time = value.split(' ')[1];\n if (!time) value = `${value} 00:00:00`;\n\n return new Date(value).toLocaleDateString(toLanguageTag(locale)).toString();\n}\n\nexport function isDateValid(dateString: string) {\n const acceptedFormats = [\n /^\\d{4}-\\d{2}-\\d{2}$/, // YYYY-MM-DD\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{2}\\/\\d{2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{4}\\/\\d{2}\\/\\d{2}$/, // YYYY/MM/DD\n /^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$/, // DD.MM.YYYY\n /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/, // YYYY-MM-DD HH:mm:ss\n ];\n\n if (!acceptedFormats.some((format) => format.test(dateString))) return false;\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n","export function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n","import {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe/elsie/components';\nimport { Product, Swatches, PriceRange, Option } from '@/pdp/components';\nimport { config, getProductData, getRefinedProduct } from '@/pdp/api';\nimport { events } from '@adobe/event-bus';\nimport { Lang, useText } from '@adobe/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { getUrlParams, setUrlParams } from '@/pdp/lib/url-params';\nimport { ProductModel } from '@/pdp/data/models';\n\ntype IconType = keyof typeof import('@adobe/elsie/icons');\n\ntype Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n};\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\nexport type CarouselConfig = {\n mobile?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n mobile: boolean,\n desktop: boolean,\n }\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions,\n thumbnailParams?: ResolveImageUrlOptions\n};\n\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }>;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }>;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n onAddToCart?: (values: Values) => void;\n}\n\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n onAddToCart,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(config.getConfig().defaultLocale as Lang || 'en-US');\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const defaultValues: Values = { sku, quantity: 1 };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n return !(\n data?.options &&\n data?.options?.length > 0 &&\n data?.optionUIDs?.length !== data?.options.length\n );\n });\n\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n getProductData(sku).then(setData);\n\n // TODO: need to keep the optionsUIDs when locale changes\n // if (values?.optionsUIDs) {\n // getRefinedProduct(sku, values?.optionsUIDs).then(setData);\n // } else {\n // getProductData(sku).then(setData);\n // }\n });\n return () => {\n localeEvent?.off();\n };\n }, [locale, sku]);\n\n // Callbacks\n const handleOnValues = useCallback(\n (newValues: { [key: string]: string | number }) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n },\n []\n );\n\n const handleOptionSelected = useCallback(\n (selections: { [id: string]: { label: string; value: string } }) => {\n // options Selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n if (!hideURLParams) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n setValues((prev) => ({ ...prev, optionsUIDs }));\n setValid(optionsUIDs?.length === data?.options?.length);\n\n // get refined product data and update state\n getRefinedProduct(sku, optionsUIDs, optionsConfig?.anchorOptions).then((next) => {\n setData(next);\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n });\n },\n [sku]\n );\n\n const processUpdates = useCallback((next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every(item => updatedOptionsUIDs.includes(item));\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n setValues((prev) => ({ ...prev, optionsUIDs: updatedOptionsUIDs }));\n setValid(updatedOptionsUIDs?.length === next?.options?.length);\n }\n }, [sku]);\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value }, key: number) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n handleOnValues({ quantity: Number(quantity) });\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot name=\"Options\" slot={slots?.Options} context={{ ...defaultSlotContext }}>\n <Swatches\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n />\n </Slot>\n );\n }\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && <Icon source={nextSeparator} />;\n\n this._setProps((prev: any) => {\n return { ...prev, separator };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n categories: [...(prev.categories || []), link],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n categories: [...(prev.categories || []), vnode],\n };\n });\n });\n },\n }}\n render={({ separator, categories }) => {\n return (\n <Breadcrumbs separator={separator} categories={categories} />\n );\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.shortDescription ?? '' }} />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.description ?? '' }} />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange {...data.prices.final} locale={toLanguageTag(locale)} />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data.prices.regular &&\n data.prices.final.amount !== data?.prices.regular.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n carouselConfig={{\n ...carousel,\n thumbnails: carousel\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\nProductDetails.getInitialData = async function ({ sku, optionsConfig }) {\n // check if default selections are made\n const defaultSelections = getUrlParams().optionsUIDs?.split(',') || config?.getConfig()?.models?.ProductDetails?.initialData?.optionsUIDs;\n\n // if it has selections, refine the product data\n if (defaultSelections?.length) {\n return await getRefinedProduct(sku, defaultSelections, optionsConfig?.anchorOptions);\n }\n\n // otherwise return the product data\n return await getProductData(sku);\n};\n"],"names":["SvgChevronDown","props","React","SvgClose","Carousel","show","scrollbar","peak","arrows","controls","arrowsOnMainImage","loop","gap","direction","width","height","defaultIndex","className","children","thumbnails","isZoomed","Label","useText","label","SlideLabel","PreviousLabel","NextLabel","ControlsLabel","ControlsBtnLabel","perPage","setPerPage","useState","getPerPageFromBreakpoint","length","Math","ceil","Children","toArray","gapSizes","small","medium","large","peakWidth","gapWidth","rest","thumbGap","thumbSeen","iconSize","current","setCurrent","thumbnailsRefs","useRef","thumbWidth","setThumbWidth","thumbHeight","setThumbHeight","thumbnailSlides","useMemo","slides","returnValue","reduce","acc","child","i","slice","concat","wrapperRef","thumbnailsWrapperRef","thumbnailControls","useEffect","wrapper","document","body","handleResize","debounce","offsetWidth","offsetHeight","window","innerWidth","newPerPage","observer","ResizeObserver","observe","unobserve","handleThumbnailsScroll","useCallback","nextSlideIndex","nextItem","thumbnailRef","oneItemWidth","oneItemHeight","thumbnailsWrapper","style","scrollBehavior","scrollLeft","scrollTop","handleScrollTo","smooth","reset","realWidth","Array","from","querySelectorAll","filter","element","dataIndex","Number","getAttribute","isNaN","futureIndex","scrollWidth","diff","handleGoToPrev","handleGoToNext","lastSlideIndex","handleKeyDown","event","key","preventDefault","addEventListener","removeEventListener","handleOnScroll","dividing","round","totalWidth","getArrow","forThumbnails","callback","_jsx","Button","classes","variant","onClick","disabled","Icon","size","source","ChevronDown","prevArrow","nextArrow","prevArrowMainImage","nextArrowMainImage","_jsxs","role","ref","tabIndex","map","page","index","orphan","_Fragment","_","buttonsLength","active","el","type","name","replace","String","checked","onChange","breakpoints","mediumViewport","Product","title","breadcrumbs","galleryContent","infoContent","productContent","sku","outOfStock","shortDescription","description","attributes","images","options","price","specialPrice","quantity","actions","carouselConfig","RegularPriceLabel","SpecialPriceLabel","OutOfStockLabel","ImagesLabel","zoom","setZoom","galleryImages","image","VComponent","node","loading","alt","toString","src","localThumbnailsImages","thumbnailsLoadingMode","loopable","desktop","GalleryGrid","mobile","Overlay","onClose","centered","count","PriceRange","amount","currency","locale","sale","minimumAmount","maximumAmount","Price","CloseLabel","handleOnClose","scrollingElement","defaultOverflowValue","overflow","icon","CloseSVG","supportedTypes","mapToPickerOptions","items","item","text","inStock","Swatches","hideSelectedValue","onValues","onErrors","defaultOptions","selectionsToUpdate","RequiredLabel","selections","setSelections","accum","option","defaultSelection","find","includes","id","selected","value","forEach","selectionToUpdate","prev","selectedItem","next","errors","required","handleOnSelection","optionId","handlePickerSelect","selection","selectedOptions","toLowerCase","Picker","handleSelect","target","common","groupAriaLabel","onValue","TextSwatch","ImageSwatch","ColorSwatch","color","warn","multiple","console","toDateString","isDateValid","Error","split","Date","toLocaleDateString","toLanguageTag","dateString","some","format","test","date","getTime","setUrlParams","params","urlSearchParams","URLSearchParams","location","search","entries","delete","set","url","pathname","hash","history","replaceState","getUrlParams","ProductDetails","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","initialData","carousel","optionsConfig","onAddToCart","AddToCartLabel","IncrementerLabel","DetailsLabel","setLocale","config","getConfig","defaultLocale","setSelectionsToUpdate","data","setData","values","setValues","defaultValues","optionUIDs","optionsUIDs","valid","setValid","defaultSlotContext","localeEvent","events","on","payload","then","off","handleOnValues","newValues","handleOptionSelected","Object","keys","undefined","join","getRefinedProduct","anchorOptions","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","every","handleOnErrors","_errors","__html","dangerouslySetInnerHTML","Slot","slot","Quantity","context","Incrementer","defaultValue","min","renderOptions","Options","Title","SKU","Breadcrumbs","setSeparator","_registerMethod","attrs","nextSeparator","separator","_setProps","appendLink","p","link","categories","appendHTMLElement","domElement","vnode","_htmlElementToVNode","render","Actions","appendButton","_button","buttonProps","button","ShortDescription","Description","Image","imageParams","prices","visible","SpecialPrice","final","regular","RegularPrice","thumbnailParams","Attributes","GalleryContent","InfoContent","Content","getInitialData","defaultSelections","models","getProductData"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"ProductDetails.js","sources":["../../node_modules/@adobe/elsie/src/icons/ChevronDown.svg","../../node_modules/@adobe/elsie/src/icons/Close.svg","../../src/components/Carousel/Carousel.tsx","../../src/components/Product/Product.tsx","../../src/components/GalleryGrid/GalleryGrid.tsx","../../src/components/PriceRange/PriceRange.tsx","../../src/components/Overlay/Overlay.tsx","../../src/components/Swatches/Swatches.tsx","../../src/lib/date.ts","../../src/lib/url-params.ts","../../src/data/transforms/acdl-context.ts","../../src/lib/acdl.ts","../../src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.74512 9.87701L12.0001 14.132L16.2551 9.87701\", stroke: \"currentColor\", strokeWidth: 1.5, strokeLinecap: \"square\", strokeLinejoin: \"round\" }));\nexport default SvgChevronDown;\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 5.64001L5.62988 18.37\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M18.3599 18.37L5.62988 5.64001\", stroke: \"currentColor\" }));\nexport default SvgClose;\n","import { FunctionComponent, VNode } from 'preact';\nimport {\n HTMLAttributes,\n Children,\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from 'preact/compat';\nimport { classes, debounce } from '@adobe/elsie/lib';\nimport { Button, Icon } from '@adobe/elsie/components';\nimport { ChevronDown } from '@adobe/elsie/icons';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport '@/pdp/components/Carousel/Carousel.css';\n\ntype Show = number;\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n children: VNode[] | VNode;\n thumbnails?: VNode[] | VNode;\n show?: Show | { small: Show; medium: Show; large: Show };\n gap?: 'small' | 'medium' | 'large' | null;\n scrollbar?: boolean;\n peak?: boolean;\n arrows?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loop?: boolean;\n direction?: 'horizontal';\n style?: Record<string, string | number>;\n width?: string;\n height?: string;\n defaultIndex?: number;\n infinite?: boolean;\n isZoomed?: boolean;\n}\n\nexport const Carousel: FunctionComponent<CarouselProps> = ({\n show = 1,\n scrollbar = false,\n peak = false,\n arrows = false,\n controls = 'dots',\n arrowsOnMainImage = false,\n loop = false,\n gap = null,\n direction = 'horizontal',\n width = '100%',\n height = '100%',\n defaultIndex = 0,\n className,\n children,\n thumbnails = null,\n isZoomed,\n ...props\n}) => {\n // i18n\n const Label = useText('PDP.Carousel.label').label;\n const SlideLabel = useText('PDP.Carousel.Slide.label').label;\n const PreviousLabel = useText('PDP.Carousel.Previous.label').label;\n const NextLabel = useText('PDP.Carousel.Next.label').label;\n const ControlsLabel = useText('PDP.Carousel.Controls.label').label;\n const ControlsBtnLabel = useText('PDP.Carousel.Controls.Button.label').label;\n\n // States\n const [perPage, setPerPage] = useState(() => getPerPageFromBreakpoint(show));\n\n // Constants\n const length = Math.ceil(Children.toArray(children).length / perPage);\n const gapSizes = { small: 16, medium: 24, large: 64 };\n const peakWidth = peak ? 24 : 0;\n const gapWidth = gap ? gapSizes[gap] : 0;\n const rest = Children.toArray(children).length % perPage;\n const thumbGap = 16;\n const thumbSeen = 2;\n const iconSize = '32';\n\n // States\n const [current, setCurrent] = useState(\n loop ? defaultIndex + 1 : defaultIndex\n );\n\n // Thumbnails\n const thumbnailsRefs = useRef<HTMLLabelElement[]>([]);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbHeight, setThumbHeight] = useState(0);\n \n const thumbnailSlides = useMemo<VNode[]>(() => {\n return Children.toArray(thumbnails);\n }, [thumbnails]);\n\n // Slides\n const slides = useMemo<VNode[][]>(() => {\n const returnValue = Children.toArray(children).reduce((acc, child, i) => {\n if (i % perPage === 0) {\n return [...acc, [child]];\n }\n\n return [...acc.slice(0, -1), [...acc[acc.length - 1], child]];\n }, [] as VNode[][]);\n\n if (!loop || returnValue.length === 1) {\n return returnValue;\n }\n\n if (loop && !(Children.toArray(children).length % perPage !== 0)) {\n return [returnValue[length - 1]]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }\n\n return [Children.toArray(children).slice(-perPage)]\n .concat(returnValue)\n .concat([returnValue[0], returnValue[1]]);\n }, [children, perPage, length, loop]);\n\n // Wrapper\n const wrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailsWrapperRef = useRef<HTMLDivElement>(null);\n const thumbnailControls = controls === 'thumbnailsRow' || controls === 'thumbnailsColumn';\n\n // Observe Window Resize (responsive)\n useEffect(() => {\n const wrapper = document.body;\n\n const handleResize = debounce(() => {\n setThumbWidth(wrapperRef.current?.offsetWidth ?? 0)\n setThumbHeight(wrapperRef.current?.offsetHeight ?? 0)\n const width = window.innerWidth;\n const newPerPage = getPerPageFromBreakpoint(show, width);\n\n if (newPerPage !== perPage) {\n setPerPage(newPerPage);\n }\n }, 50);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapper);\n\n return () => {\n observer.unobserve(wrapper);\n };\n }, [perPage, show]);\n\n // Scrolling logic controls\n const handleThumbnailsScroll = useCallback((nextSlideIndex: number) => {\n const nextItem = loop ? nextSlideIndex - 1 : nextSlideIndex;\n const thumbnailRef = thumbnailsRefs?.current[0];\n const oneItemWidth = thumbnailRef?.offsetWidth + thumbGap;\n const oneItemHeight = thumbnailRef?.offsetHeight + thumbGap;\n const thumbnailsWrapper = thumbnailsWrapperRef.current!;\n\n if (controls === 'thumbnailsRow' && thumbnailsWrapper?.offsetWidth) {\n if (oneItemWidth * (nextItem + 1) > thumbnailsWrapper.offsetWidth) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem + thumbSeen) * oneItemWidth;\n }\n\n if (thumbnailsWrapper.scrollLeft > oneItemWidth * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollLeft = (nextItem - thumbSeen) * oneItemWidth;\n }\n }\n\n if (controls === 'thumbnailsColumn' && thumbnailsWrapper?.offsetHeight) {\n if (oneItemHeight * (nextItem + 1) > thumbnailsWrapper.offsetHeight) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem + thumbSeen) * oneItemHeight;\n }\n\n if (thumbnailsWrapper.scrollTop > oneItemHeight * nextItem) {\n thumbnailsWrapper.style.scrollBehavior = 'smooth';\n thumbnailsWrapper.scrollTop = (nextItem - thumbSeen) * oneItemHeight;\n }\n }\n }, [controls, loop]);\n\n // Navigation\n const handleScrollTo = useCallback(\n (nextSlideIndex: number, smooth?: boolean, reset?: boolean) => {\n if (controls === 'thumbnailsRow' || controls === 'thumbnailsColumn') {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n\n const items = Array.from(wrapper.querySelectorAll('[data-index]')).filter(\n (element) => {\n const dataIndex = Number(element.getAttribute('data-index')!);\n return !isNaN(dataIndex) && dataIndex > -1;\n }\n );\n\n const item = items[nextSlideIndex];\n\n if (!item) {\n return;\n }\n\n if (reset) {\n const futureIndex = nextSlideIndex === 0 ? length : 0;\n const scrollWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (wrapper.scrollLeft >= 0 && wrapper.scrollLeft < realWidth - 5) {\n handleScrollTo(1, true);\n return;\n }\n\n if (\n wrapper.scrollLeft > scrollWidth - realWidth &&\n wrapper.scrollLeft <= scrollWidth\n ) {\n handleScrollTo(length, true);\n return;\n }\n\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = futureIndex === 0 ? 0 : scrollWidth;\n handleScrollTo(futureIndex === 0 ? 1 : length, true);\n return;\n }\n\n const diff =\n ((wrapper.offsetWidth - gapWidth) / perPage) *\n slides[nextSlideIndex].length -\n peakWidth;\n\n wrapper.style.scrollBehavior = smooth ? 'smooth' : 'auto';\n wrapper.scrollLeft =\n slides[nextSlideIndex].length === perPage\n ? realWidth * nextSlideIndex\n : realWidth * (nextSlideIndex - 1) + diff;\n return;\n },\n [gapWidth, length, peakWidth, perPage, rest, slides, handleThumbnailsScroll, controls]\n );\n\n const handleGoToPrev = useCallback(() => {\n if (loop) {\n const nextSlideIndex = current - 1;\n handleScrollTo(nextSlideIndex, true, current === 1);\n return;\n }\n\n const nextSlideIndex = current <= 0 ? 0 : current - 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [current, handleScrollTo, loop]);\n\n const handleGoToNext = useCallback(() => {\n const lastSlideIndex = slides.length - 1;\n\n if (loop) {\n const nextSlideIndex = current + 1;\n handleScrollTo(nextSlideIndex, true, current === length);\n return;\n }\n\n const nextSlideIndex =\n current >= lastSlideIndex ? lastSlideIndex : current + 1;\n\n handleScrollTo(nextSlideIndex, true);\n }, [slides.length, loop, current, handleScrollTo, length]);\n\n // Navigate with keyboard\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n handleGoToPrev();\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleGoToNext();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleGoToNext, handleGoToPrev]);\n\n // Set default index\n useEffect(() => {\n handleScrollTo(loop ? defaultIndex + 1 : defaultIndex, false);\n }, [defaultIndex, handleScrollTo, loop]);\n\n // Track scrolling (swipes)\n const handleOnScroll = debounce(() => {\n const wrapper = wrapperRef.current!;\n const realWidth = peakWidth\n ? wrapper.offsetWidth - peakWidth\n : wrapper.offsetWidth - peakWidth + gapWidth;\n const dividing = wrapper.scrollLeft / realWidth;\n const nextSlideIndex = Math.round(dividing) - dividing < 1 ? Math.round(dividing) : Math.ceil(dividing);\n\n if (thumbnailControls) {\n handleThumbnailsScroll(nextSlideIndex);\n }\n\n if (loop) {\n const totalWidth =\n realWidth * (length + (rest ? rest : perPage) / perPage);\n\n if (Math.ceil(wrapper.scrollLeft) >= Math.ceil(totalWidth) - 5) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft =\n wrapper.offsetWidth * 1 +\n (Math.ceil(wrapper.scrollLeft) - Math.ceil(totalWidth) - peakWidth);\n return;\n }\n\n if (wrapper.scrollLeft === 0) {\n wrapper.style.scrollBehavior = 'auto';\n wrapper.scrollLeft = totalWidth - wrapper.offsetWidth + peakWidth;\n return;\n }\n }\n\n if (current !== nextSlideIndex) {\n setCurrent(nextSlideIndex);\n }\n }, 100);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n wrapper?.addEventListener('scroll', handleOnScroll);\n\n return () => {\n wrapper?.removeEventListener('scroll', handleOnScroll);\n };\n }, [handleOnScroll]);\n\n // thumbnails is column -> container is row reverse, controls is column\n // thumbnails is row -> container is column, controls is row\n const getArrow = (forThumbnails: boolean, direction: string, callback: () => void) => {\n return <Button\n className={classes([\n ['pdp-carousel__button', !forThumbnails],\n [`pdp-carousel__button--${direction}`, !forThumbnails],\n [`pdp-carousel__button--${controls}`, forThumbnails]\n ])}\n style={{\n '--height': `${thumbHeight}px`,\n }}\n variant=\"tertiary\"\n aria-label={direction === 'next' ? NextLabel : PreviousLabel}\n onClick={callback}\n disabled={loop ? false : direction === 'next' ? current >= slides.length - 1 : current < 1}\n >\n <Icon\n className={classes([\n ['pdp-carousel__button__icon', !forThumbnails],\n [`pdp-carousel__button__icon--${direction}`, !forThumbnails],\n [`pdp-carousel__button__icon--${controls}--${direction}`, forThumbnails]\n ])}\n size={iconSize}\n source={ChevronDown}\n />\n </Button>\n }\n\n const prevArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'prev', handleGoToPrev);\n\n const nextArrow = arrows && slides.length != 1 && getArrow(thumbnailControls, 'next', handleGoToNext);\n\n const prevArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'prev', handleGoToPrev);\n \n const nextArrowMainImage = arrows && slides.length != 1 && getArrow(false, 'next', handleGoToNext);\n\n return (\n <div\n role=\"region\"\n aria-roledescription={Label}\n className={classes([\n 'pdp-carousel',\n ['pdp-carousel--main-image-controls', arrowsOnMainImage],\n ['pdp-carousel--arrows', arrows && !thumbnailControls],\n [`pdp-carousel--${controls}`, thumbnailControls],\n className,\n ])}\n style={{\n '--flex-carousel': controls === 'thumbnailsColumn' ? 'row-reverse' : 'column',\n '--gap': thumbnailControls ? '0' : 'var(--spacing-small)',\n '--width': width,\n }}\n {...props}\n >\n\n {/* Slideshow */}\n <div\n ref={wrapperRef}\n className={classes([\n 'pdp-carousel__wrapper',\n `pdp-carousel__wrapper--${direction}`,\n ['pdp-carousel__wrapper--scrollbar', scrollbar],\n ['pdp-carousel__wrapper--peak', peak],\n ])}\n style={{\n '--total-width': controls === 'thumbnailsColumn' ? `81.6%` : `100%`,\n '--height': controls === 'thumbnailsColumn' ? 'auto' : height,\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n '--per-page': perPage,\n }}\n tabIndex={0}\n >\n {slides.map((page, index) => {\n const orphan = page.length < perPage;\n\n return (\n <div\n key={index}\n role=\"group\"\n aria-roledescription={SlideLabel}\n data-index={index}\n className={classes([\n 'pdp-carousel__slide',\n `pdp-carousel__slide--${direction}`,\n ['pdp-carousel__slide--active', current === index],\n ['pdp-carousel__slide--orphan', orphan],\n ])}\n style={{\n '--length': page.length,\n }}\n >\n {page}\n </div>\n );\n })}\n </div>\n\n {/* Previous and next arrows for Carousel without thumbnails */}\n {\n (!thumbnailControls) && (\n <>\n {prevArrow}\n {nextArrow}\n </>\n )\n }\n\n {\n (thumbnailControls && arrowsOnMainImage) && (\n <>\n {prevArrowMainImage}\n {nextArrowMainImage}\n </>\n )\n }\n\n {/* Controls */}\n {controls && slides.length != 1 && (\n <div\n className={classes([\n [`pdp-carousel__controls__container--${controls}`, thumbnailControls],\n ['pdp-carousel__controls__container--no-arrows', !arrows || arrowsOnMainImage],\n ])}\n style={{\n '--width': controls === 'thumbnailsRow' ? `${thumbWidth}px` : width,\n '--height': `${thumbHeight}px`,\n '--nr-thumbnails': thumbnailSlides.length,\n }}\n >\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && prevArrow}\n <div\n ref={thumbnailsWrapperRef}\n className={classes([\n [`pdp-carousel__controls__wrapper--${controls}`, thumbnailControls],\n [`pdp-carousel__controls__wrapper`, thumbnailControls],\n ])}\n >\n <div\n role=\"group\"\n aria-label={ControlsLabel}\n className={classes([\n 'pdp-carousel__controls',\n [`pdp-carousel__controls--${controls}`, thumbnailControls],\n ])}\n >\n {(loop ? slides.slice(0, length) : slides).map((_, key) => {\n const buttonsLength = loop ? length : slides.length;\n const active = loop ? current - 1 === key : current === key;\n\n if (!thumbnailControls) {\n return (\n <button\n key={key}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n onClick={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n className={classes([\n 'pdp-carousel__controls__button',\n ['pdp-carousel__controls__button--active', active],\n ])}\n />\n );\n }\n return (\n <label\n className={classes(['pdp-carousel__thumbnail__container'])}\n key={key}\n ref={(el: HTMLLabelElement | null) => {\n if (el) {\n thumbnailsRefs.current[key] = el;\n }\n }}\n >\n <input\n type=\"radio\"\n name={\"carousel-thumbnails\"}\n aria-label={ControlsBtnLabel.replace(\n '{key}',\n String(key + 1)\n ).replace('{total}', String(buttonsLength))}\n checked={active && thumbWidth !== 0}\n onChange={() => {\n handleScrollTo(loop ? key + 1 : key, true);\n }}\n {...props}\n className={classes([\n 'pdp-carousel__thumbnail',\n ['pdp-carousel__thumbnail--selected', active && thumbWidth !== 0],\n ])}\n />\n\n <span\n className={classes([\n 'pdp-carousel__thumbnail__span',\n ])}\n >\n {thumbnailSlides[key]}\n </span>\n </label>\n )\n })}\n </div>\n </div>\n {(thumbnailControls || isZoomed) && !arrowsOnMainImage && nextArrow}\n </div>\n )}\n </div>\n );\n};\n\n// Utilities\nfunction getPerPageFromBreakpoint(\n breakpoints:\n | {\n small: number;\n medium: number;\n large: number;\n }\n | number,\n width = 0\n) {\n if (typeof breakpoints === 'number') return breakpoints;\n\n const { small, medium, large } = breakpoints;\n const mediumViewport = 786;\n const largeVierport = 1024;\n\n if (width > largeVierport) return large;\n if (width > mediumViewport) return medium;\n return small;\n}\n","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\n\nimport { Carousel, GalleryGrid, Overlay } from '@/pdp/components';\nimport '@/pdp/components/Product/Product.css';\n\nimport { CarouselConfig } from '@/pdp/containers';\n\ninterface ProductCarouselConfig extends CarouselConfig {\n thumbnails: VNode[];\n}\n\nexport interface ProductProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: VNode;\n breadcrumbs?: VNode;\n galleryContent?: VNode;\n infoContent?: VNode;\n productContent?: VNode;\n shortDescription?: VNode;\n description?: VNode;\n attributes?: VNode;\n images: VNode[];\n options?: VNode;\n sku?: VNode;\n price?: VNode;\n specialPrice?: VNode;\n outOfStock: boolean;\n actions?: VNode;\n quantity?: VNode;\n carouselConfig?: ProductCarouselConfig;\n}\n\nexport const Product: FunctionComponent<ProductProps> = ({\n title,\n breadcrumbs,\n galleryContent,\n infoContent,\n productContent,\n sku,\n outOfStock,\n shortDescription,\n description,\n attributes,\n images,\n options,\n price,\n specialPrice,\n className,\n children,\n quantity,\n actions,\n carouselConfig,\n ...props\n}) => {\n // i18n\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.label').label;\n const OutOfStockLabel = useText('PDP.Product.OutOfStock.label').label;\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [zoom, setZoom] = useState<number | null>(null);\n\n const galleryImages = images?.length ? (\n images.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))\n }\n onClick={() => setZoom(key)}\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n const localThumbnailsImages = carouselConfig?.thumbnails?.length ? (\n carouselConfig.thumbnails.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={carouselConfig?.thumbnailsLoadingMode || 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))}\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n return (\n <div {...props} className={classes(['pdp-product', className])}>\n {breadcrumbs && (\n <VComponent node={breadcrumbs} className=\"pdp-product__breadcrumbs\" />\n )}\n <div className=\"pdp-product__column-container pdp-product__gallery-column\">\n <div className=\"pdp-product__column-body\">\n {\n carouselConfig?.controls ?\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? carouselConfig.controls : 'dots'}\n arrowsOnMainImage={carouselConfig?.arrowsOnMainImage}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.desktop || false}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n :\n <GalleryGrid className=\"pdp-product__images\" gap=\"small\">\n {galleryImages}\n </GalleryGrid>\n }\n </div>\n {galleryContent && (\n <VComponent\n node={galleryContent}\n className=\"pdp-product__gallery-content\"\n />\n )}\n </div>\n\n <div className=\"pdp-product__column-container pdp-product__content-column\">\n <div className=\"pdp-product__column-body\">\n <div className=\"pdp-product__header\">\n {title && (\n <VComponent\n node={title}\n className=\"pdp-product__title\"\n />\n )}\n\n {sku && (\n <VComponent node={sku} className=\"pdp-product__sku\" />\n )}\n </div>\n\n <div className=\"pdp-product__prices\">\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes(['pdp-product__price-special', 'pdp-product__price'])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes(['pdp-product__price-regular', 'pdp-product__price--grey'])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n </div>\n\n {/* Small Screen Gallery */}\n {\n carouselConfig?.mobile ?\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails\"\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'thumbnailsRow' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={carouselConfig?.thumbnails?.length > 1 && carouselConfig?.peak?.mobile || false}\n gap={carouselConfig?.gap || null}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n :\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel\"\n peak={carouselConfig?.peak?.mobile && images?.length > 1}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n >\n {galleryImages}\n </Carousel>\n }\n\n <div\n className={classes([\n 'pdp-product__actions',\n [`pdp-product__actions--out-of-stock`, outOfStock],\n ])}\n >\n {outOfStock && (\n <div className=\"pdp-product__out-of-stock__text\">\n {OutOfStockLabel}\n </div>\n )}\n\n {options && (\n <VComponent\n node={options}\n className={classes(['pdp-product__options'])}\n />\n )}\n\n {quantity && (\n <div className=\"pdp-product__quantity\">\n <VComponent node={quantity} />\n </div>\n )}\n\n {actions && (\n <VComponent\n node={actions}\n className={classes(['pdp-product__buttons'])}\n />\n )}\n </div>\n\n {shortDescription && (\n <VComponent\n node={shortDescription}\n className={classes(['pdp-product__short_description'])}\n />\n )}\n\n {description && (\n <VComponent\n node={description}\n className={classes(['pdp-product__description'])}\n />\n )}\n\n {attributes ? (\n <div className=\"pdp-product__attributes\">{attributes}</div>\n ) : null}\n </div>\n {infoContent && (\n <VComponent\n node={infoContent}\n className=\"pdp-product__info-content\" />\n )}\n </div>\n\n {productContent && (\n <VComponent\n node={productContent}\n className=\"pdp-product__content\"\n />\n )}\n\n {/* Zoom Overlay */}\n {zoom === null ? null : (\n <Overlay\n className=\"pdp-product__overlay\"\n onClose={() => setZoom(null)}\n centered\n >\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n loop={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n isZoomed\n >\n {galleryImages}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n","import { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, Children } from 'preact/compat';\nimport { classes, VComponent } from '@adobe/elsie/lib';\nimport '@/pdp/components/GalleryGrid/GalleryGrid.css';\n\nexport interface GalleryGridProps extends HTMLAttributes<HTMLDivElement> {\n children: VNode[] | VNode;\n gap?: 'small' | 'medium' | 'large' | null;\n style?: Record<string, string | number>;\n}\n\nexport const GalleryGrid: FunctionComponent<GalleryGridProps> = ({\n children,\n gap = null,\n className,\n style,\n ...props\n}) => {\n const count = Children.count(children);\n\n return (\n <div\n {...props}\n className={classes(['pdp-gallery-grid', className])}\n style={{\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n ...style,\n }}\n >\n {Children.map(\n children,\n (child: VNode<HTMLAttributes<HTMLElement>>, key) => (\n <div key={count + key} className=\"pdp-gallery-grid__item\">\n <VComponent\n key={child.props.src}\n node={child}\n loading={key === 0 ? 'eager' : 'lazy'}\n />\n </div>\n )\n )}\n </div>\n );\n};\n","/*\nADOBE CONFIDENTIAL\nCopyright 2023 Adobe\nAll Rights Reserved.\nNOTICE: All information contained herein is, and remains\nthe property of Adobe and its suppliers, if any. The intellectual\nand technical concepts contained herein are proprietary to Adobe\nand its suppliers and are protected by all applicable intellectual\nproperty laws, including trade secret and copyright laws.\nDissemination of this information or reproduction of this material\nis strictly forbidden unless prior written permission is obtained\nfrom Adobe.\n*/\n\nimport { HTMLAttributes } from 'preact/compat';\nimport '@/pdp/components/PriceRange/PriceRange.css';\nimport { FunctionalComponent } from 'preact';\nimport { Price } from '@adobe/elsie/components';\n\nexport interface PriceRangeProps extends HTMLAttributes<HTMLDivElement> {\n locale?: string;\n variant?: 'default' | 'strikethrough';\n currency?: string;\n\n // Simple product\n amount?: number;\n sale?: boolean;\n\n // Complex product (range)\n minimumAmount?: number;\n maximumAmount?: number;\n}\n\nexport const PriceRange: FunctionalComponent<PriceRangeProps> = ({\n amount,\n currency,\n locale,\n variant,\n sale,\n minimumAmount,\n maximumAmount,\n className,\n ...props\n}) => {\n return (\n <>\n {amount || minimumAmount === maximumAmount ? (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={amount ? amount : minimumAmount}\n currency={currency}\n locale={locale}\n variant={variant}\n sale={sale}\n className={className}\n />\n </div>\n ) : (\n <div className={'pdp-price-range'} {...props}>\n <Price\n amount={minimumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n <span className=\"pdp-price-range__label\">{'-'}</span>\n <Price\n amount={maximumAmount}\n currency={currency}\n locale={locale}\n className={className}\n />\n </div>\n )}\n </>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { Close as CloseSVG } from '@adobe/elsie/icons';\nimport { Button } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Overlay/Overlay.css';\n\nexport interface OverlayProps extends HTMLAttributes<HTMLDivElement> {\n centered?: boolean;\n onClose?: () => void;\n}\n\nexport const Overlay: FunctionComponent<OverlayProps> = ({\n centered,\n onClose,\n className,\n children,\n ...props\n}) => {\n // i18n\n const CloseLabel = useText('PDP.Overlay.Close.label').label;\n\n const handleOnClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n // Close on ESC\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleOnClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleOnClose]);\n\n // Prevent document scrolling\n useEffect(() => {\n const scrollingElement = document.scrollingElement as HTMLElement;\n\n const defaultOverflowValue = scrollingElement.style.overflow;\n\n scrollingElement.style.overflow = 'hidden';\n\n return () => {\n scrollingElement.style.overflow = defaultOverflowValue;\n };\n }, []);\n\n return (\n <div\n {...props}\n className={classes([\n 'pdp-overlay',\n ['pdp-overlay--centered', centered],\n className,\n ])}\n >\n <div className=\"pdp-overlay__content\">{children}</div>\n\n <Button\n aria-label={CloseLabel}\n variant=\"tertiary\"\n className=\"pdp-overlay__close-button\"\n onClick={handleOnClose}\n icon={<CloseSVG />}\n />\n </div>\n );\n};\n","import { FunctionComponent } from 'preact';\nimport { HTMLAttributes, useState, useMemo, useCallback, useEffect } from 'preact/compat';\nimport { classes } from '@adobe/elsie/lib';\nimport { useText } from '@adobe/elsie/i18n';\nimport { ColorSwatch, ImageSwatch, TextSwatch, Picker, PickerOption } from '@adobe/elsie/components';\n\nimport '@/pdp/components/Swatches/Swatches.css';\n\nconst supportedTypes = ['text', 'image', 'color', 'dropdown'];\n\nconst mapToPickerOptions = (items: OptionValue[]): PickerOption[] => {\n return items.map((item: OptionValue) => ({ ...item, text: item.label, disabled: !item.inStock, }));\n}\n\ntype OptionValue = {\n id: string;\n label: string;\n inStock: boolean;\n value: string;\n selected?: boolean;\n};\n\nexport type Option = {\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n};\n\ntype Selection = { [id: string]: { label: string; value: string } };\n\nexport interface SwatchesProps extends HTMLAttributes<HTMLDivElement> {\n options: Array<{\n id: string;\n type: (typeof supportedTypes)[number];\n label: string;\n required?: boolean;\n multiple?: boolean;\n items: OptionValue[];\n }>;\n hideSelectedValue?: boolean;\n\n defaultOptions?: string[];\n selectionsToUpdate?: Option[];\n onValues?: (uids: Selection, current: string) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n}\n\nexport const Swatches: FunctionComponent<SwatchesProps> = ({\n options,\n hideSelectedValue,\n onValues,\n onErrors,\n defaultOptions,\n selectionsToUpdate,\n className,\n children,\n ...props\n}) => {\n // i18n\n const RequiredLabel = useText('PDP.Swatches.Required.label').label;\n\n const [selections, setSelections] = useState<Selection>(() => {\n const initial = options?.reduce((accum, option) => {\n const { items } = option;\n const defaultSelection = items?.find((item) => defaultOptions?.includes(item.id));\n const selected = items?.find((item) => item.selected);\n if (defaultSelection) {\n return {\n ...accum,\n [option.id]: { label: defaultSelection.label, value: defaultSelection.id },\n };\n } else if (selected) {\n return {\n ...accum,\n [option.id]: { label: selected.label, value: selected.id },\n };\n }\n return accum;\n }, {} as Selection);\n\n return initial;\n });\n\n // this only applies for the case with anchor options\n // update selections in the swatches if they are updated in the parent component\n useEffect(() => {\n selectionsToUpdate?.forEach((selectionToUpdate) => {\n setSelections((prev) => {\n const selectedItem = selectionToUpdate\n ?.items?.find((item) => item.selected);\n if (!selectedItem) return prev;\n\n const next = {\n ...prev,\n [selectionToUpdate.id]: {\n label: selectedItem?.label,\n value: selectedItem?.id\n },\n };\n return next;\n });\n });\n }, [selectionsToUpdate, setSelections]);\n\n // Update invalid options\n useMemo(() => {\n const errors = options?.reduce((accum, option) => {\n option?.items?.forEach((item) => {\n const selected = selections[option.id]?.value === item.id;\n\n // Validate required\n if (option.required && !selected) {\n accum[option.id] = RequiredLabel;\n }\n });\n\n return accum;\n }, {} as { [id: string]: string });\n\n // Call the callback\n onErrors?.(errors);\n\n return errors;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selections]);\n\n const handleOnSelection = useCallback(\n (id: string, label: string, optionId: string) => {\n setSelections((prev) => {\n const next = {\n ...prev,\n [id]: { label, value: optionId },\n };\n\n // Call the callback\n onValues?.(next, optionId);\n\n // Return the next state\n return next;\n });\n },\n [onValues]\n );\n\n // Function to handle the picker selection\n const handlePickerSelect = (optionId: string, selection: any ) => {\n const label = selection.selectedOptions[0]?.label ?? '';\n handleOnSelection(optionId, label, selection.value);\n };\n\n const Swatches = useCallback(\n ({ items, id, required, type, selected, label }: any) => {\n return (\n <div className={classes(['pdp-swatches__options'])}>\n {\n type?.toLowerCase() === 'dropdown' ?\n <Picker aria-label={label} handleSelect={(event) => handlePickerSelect(id, event.target)} options={mapToPickerOptions(items)} value={selected} />\n :\n items?.map((option: any) => {\n const common = {\n key: option.id,\n id: option.id,\n name: id,\n value: option.value,\n label: option.label,\n groupAriaLabel: label,\n selected: selected === option.id,\n outOfStock: !option.inStock,\n // API may return null, we default to true as all swatches are required.\n // we still comply to this in case the api return \"false\".\n required: required === null ? true : required,\n onValue: () => {\n handleOnSelection(id, option.label, option.id);\n },\n };\n\n switch (type) {\n case 'text':\n return <TextSwatch {...common} label={option.label} />;\n\n case 'image':\n return (\n <ImageSwatch\n {...common}\n src={option.value}\n alt={option.label}\n />\n );\n\n case 'color':\n return (\n <ColorSwatch {...common} size=\"large\" color={option.value} />\n );\n\n default:\n console.warn(`Invalid swatch type ${type}`);\n return null;\n }\n })}\n </div>\n );\n },\n [handleOnSelection]\n );\n\n return (\n <div {...props} className={classes(['pdp-swatches', className])}>\n {options?.map(({ type, label, id, multiple, required, items }) => {\n if (!type) {\n console.warn(`Bundle product not supported on UI.`);\n return;\n }\n\n // Only render supported types\n if (!supportedTypes.includes(type)) {\n console.warn(`Invalid swatch type ${type}`);\n }\n\n if (multiple) {\n console.warn(\n 'Multiple selection swatches are not currently supported.'\n );\n }\n\n return (\n <div\n key={`swatch-item-${id}`}\n id={`swatch-item-${id}`}\n data-slot-key={`product-swatch--${id}`}\n className=\"pdp-swatches__field\"\n >\n <div className=\"pdp-swatches__field__label\">\n {selections[id] ? (hideSelectedValue ? `${label}` : `${label}: ${selections[id].label}`) : label}\n </div>\n\n <Swatches\n id={id}\n type={type}\n required={required}\n items={items}\n label={label} //label referring to the name of the swatchGroup\n selected={selections[id]?.value}\n />\n </div>\n );\n })}\n </div>\n );\n};\n","import { toLanguageTag } from '@adobe/elsie/lib';\n\nexport function toDateString(value: string, locale = 'en_US') {\n if (!isDateValid(value)) throw Error('Invalid date string');\n\n // normalize time to 00:00:00\n const time = value.split(' ')[1];\n if (!time) value = `${value} 00:00:00`;\n\n return new Date(value).toLocaleDateString(toLanguageTag(locale)).toString();\n}\n\nexport function isDateValid(dateString: string) {\n const acceptedFormats = [\n /^\\d{4}-\\d{2}-\\d{2}$/, // YYYY-MM-DD\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{2}\\/\\d{2}\\/\\d{4}$/, // MM/DD/YYYY\n /^\\d{4}\\/\\d{2}\\/\\d{2}$/, // YYYY/MM/DD\n /^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$/, // DD.MM.YYYY\n /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/, // YYYY-MM-DD HH:mm:ss\n ];\n\n if (!acceptedFormats.some((format) => format.test(dateString))) return false;\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n","export function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n","import { ProductModel } from '../models';\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: product?.externalId as any,\n name: product?.name,\n sku: product?.sku,\n topLevelSku: product?.externalParentId,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: undefined,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: undefined,\n maximalPrice: undefined,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.urlKey,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n/**\n* Sets a context in the Adobe Client Data Layer (ACDL)\n* Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n*/\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","import {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe/elsie/components';\nimport { Product, Swatches, PriceRange, Option } from '@/pdp/components';\nimport { config, getProductData, getRefinedProduct } from '@/pdp/api';\nimport { events } from '@adobe/event-bus';\nimport { Lang, useText } from '@adobe/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { getUrlParams, setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel } from '@/pdp/data/models';\n\ntype IconType = keyof typeof import('@adobe/elsie/icons');\n\ntype Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n};\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\nexport type CarouselConfig = {\n mobile?: boolean;\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n mobile: boolean,\n desktop: boolean,\n }\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions,\n thumbnailParams?: ResolveImageUrlOptions\n};\n\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }>;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }>;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n useACDL?: boolean;\n onAddToCart?: (values: Values) => void;\n}\n\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n useACDL,\n onAddToCart,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(config.getConfig().defaultLocale as Lang || 'en-US');\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const defaultValues: Values = { sku, quantity: 1 };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n return !(\n data?.options &&\n data?.options?.length > 0 &&\n data?.optionUIDs?.length !== data?.options.length\n );\n });\n\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n getProductData(sku).then(setData);\n\n // TODO: need to keep the optionsUIDs when locale changes\n // if (values?.optionsUIDs) {\n // getRefinedProduct(sku, values?.optionsUIDs).then(setData);\n // } else {\n // getProductData(sku).then(setData);\n // }\n });\n return () => {\n localeEvent?.off();\n };\n }, [locale, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback(\n (newValues: { [key: string]: string | number }) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n },\n []\n );\n\n const handleOptionSelected = useCallback(\n (selections: { [id: string]: { label: string; value: string } }) => {\n // options Selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n if (!hideURLParams) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n setValues((prev) => ({ ...prev, optionsUIDs }));\n setValid(optionsUIDs?.length === data?.options?.length);\n\n // get refined product data and update state\n getRefinedProduct(sku, optionsUIDs, optionsConfig?.anchorOptions).then((next) => {\n setData(next);\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n\n if (useACDL && next?.sku !== sku) { // TODO: sku of simple product once added to the model\n publishProductPageViewEvent(next as ProductModel);\n }\n });\n },\n [sku]\n );\n\n const processUpdates = useCallback((next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every(item => updatedOptionsUIDs.includes(item));\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n setValues((prev) => ({ ...prev, optionsUIDs: updatedOptionsUIDs }));\n setValid(updatedOptionsUIDs?.length === next?.options?.length);\n }\n }, [sku]);\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value }, key: number) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n handleOnValues({ quantity: Number(quantity) });\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot name=\"Options\" slot={slots?.Options} context={{ ...defaultSlotContext }}>\n <Swatches\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n />\n </Slot>\n );\n }\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && <Icon source={nextSeparator} />;\n\n this._setProps((prev: any) => {\n return { ...prev, separator };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n categories: [...(prev.categories || []), link],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n categories: [...(prev.categories || []), vnode],\n };\n });\n });\n },\n }}\n render={({ separator, categories }) => {\n return (\n <Breadcrumbs separator={separator} categories={categories} />\n );\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.shortDescription ?? '' }} />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: data?.description ?? '' }} />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange {...data.prices.final} locale={toLanguageTag(locale)} />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data.prices.regular &&\n data.prices.final.amount !== data?.prices.regular.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n carouselConfig={{\n ...carousel,\n thumbnails: carousel\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\nProductDetails.getInitialData = async function ({ sku, optionsConfig }) {\n // check if default selections are made\n const defaultSelections = getUrlParams().optionsUIDs?.split(',') || config?.getConfig()?.models?.ProductDetails?.initialData?.optionsUIDs;\n\n // if it has selections, refine the product data\n if (defaultSelections?.length) {\n return await getRefinedProduct(sku, defaultSelections, optionsConfig?.anchorOptions);\n }\n\n // otherwise return the product data\n return await getProductData(sku);\n};\n"],"names":["SvgChevronDown","props","React","SvgClose","Carousel","show","scrollbar","peak","arrows","controls","arrowsOnMainImage","loop","gap","direction","width","height","defaultIndex","className","children","thumbnails","isZoomed","Label","useText","label","SlideLabel","PreviousLabel","NextLabel","ControlsLabel","ControlsBtnLabel","perPage","setPerPage","useState","getPerPageFromBreakpoint","length","Math","ceil","Children","toArray","gapSizes","small","medium","large","peakWidth","gapWidth","rest","thumbGap","thumbSeen","iconSize","current","setCurrent","thumbnailsRefs","useRef","thumbWidth","setThumbWidth","thumbHeight","setThumbHeight","thumbnailSlides","useMemo","slides","returnValue","reduce","acc","child","i","slice","concat","wrapperRef","thumbnailsWrapperRef","thumbnailControls","useEffect","wrapper","document","body","handleResize","debounce","offsetWidth","offsetHeight","window","innerWidth","newPerPage","observer","ResizeObserver","observe","unobserve","handleThumbnailsScroll","useCallback","nextSlideIndex","nextItem","thumbnailRef","oneItemWidth","oneItemHeight","thumbnailsWrapper","style","scrollBehavior","scrollLeft","scrollTop","handleScrollTo","smooth","reset","realWidth","Array","from","querySelectorAll","filter","element","dataIndex","Number","getAttribute","isNaN","futureIndex","scrollWidth","diff","handleGoToPrev","handleGoToNext","lastSlideIndex","handleKeyDown","event","key","preventDefault","addEventListener","removeEventListener","handleOnScroll","dividing","round","totalWidth","getArrow","forThumbnails","callback","_jsx","Button","classes","variant","onClick","disabled","Icon","size","source","ChevronDown","prevArrow","nextArrow","prevArrowMainImage","nextArrowMainImage","_jsxs","role","ref","tabIndex","map","page","index","orphan","_Fragment","_","buttonsLength","active","el","type","name","replace","String","checked","onChange","breakpoints","mediumViewport","Product","title","breadcrumbs","galleryContent","infoContent","productContent","sku","outOfStock","shortDescription","description","attributes","images","options","price","specialPrice","quantity","actions","carouselConfig","RegularPriceLabel","SpecialPriceLabel","OutOfStockLabel","ImagesLabel","zoom","setZoom","galleryImages","image","VComponent","node","loading","alt","toString","src","localThumbnailsImages","thumbnailsLoadingMode","loopable","desktop","GalleryGrid","mobile","Overlay","onClose","centered","count","PriceRange","amount","currency","locale","sale","minimumAmount","maximumAmount","Price","CloseLabel","handleOnClose","scrollingElement","defaultOverflowValue","overflow","icon","CloseSVG","supportedTypes","mapToPickerOptions","items","item","text","inStock","Swatches","hideSelectedValue","onValues","onErrors","defaultOptions","selectionsToUpdate","RequiredLabel","selections","setSelections","accum","option","defaultSelection","find","includes","id","selected","value","forEach","selectionToUpdate","prev","selectedItem","next","errors","required","handleOnSelection","optionId","handlePickerSelect","selection","selectedOptions","toLowerCase","Picker","handleSelect","target","common","groupAriaLabel","onValue","TextSwatch","ImageSwatch","ColorSwatch","color","warn","multiple","console","toDateString","isDateValid","Error","split","Date","toLocaleDateString","toLanguageTag","dateString","some","format","test","date","getTime","setUrlParams","params","urlSearchParams","URLSearchParams","location","search","entries","delete","set","url","pathname","hash","history","replaceState","getUrlParams","transformProduct","product","productId","externalId","topLevelSku","externalParentId","specialToDate","undefined","specialFromDate","newToDate","newFromDate","createdAt","updatedAt","manufacturer","countryOfManufacture","categories","productType","pricing","regularPrice","prices","regular","minimalPrice","maximalPrice","final","tierPricing","currencyCode","canonicalUrl","urlKey","mainImageUrl","contexts","PRODUCT_CONTEXT","events","PRODUCT_PAGE_VIEW","getAdobeDataLayer","adobeDataLayer","setContext","data","push","pushEvent","additionalContext","acdl","state","getState","eventInfo","publishProductPageViewEvent","productItem","ProductDetails","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","initialData","carousel","optionsConfig","useACDL","onAddToCart","AddToCartLabel","IncrementerLabel","DetailsLabel","setLocale","config","getConfig","defaultLocale","setSelectionsToUpdate","setData","values","setValues","defaultValues","optionUIDs","optionsUIDs","valid","setValid","defaultSlotContext","localeEvent","on","payload","then","off","Object","keys","handleOnValues","newValues","handleOptionSelected","join","getRefinedProduct","anchorOptions","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","every","handleOnErrors","_errors","__html","dangerouslySetInnerHTML","Slot","slot","Quantity","context","Incrementer","defaultValue","min","renderOptions","Options","Title","SKU","Breadcrumbs","setSeparator","_registerMethod","attrs","nextSeparator","separator","_setProps","appendLink","p","link","appendHTMLElement","domElement","vnode","_htmlElementToVNode","render","Actions","appendButton","_button","buttonProps","button","ShortDescription","Description","Image","imageParams","visible","SpecialPrice","RegularPrice","thumbnailParams","Attributes","GalleryContent","InfoContent","Content","getInitialData","defaultSelections","models","getProductData"],"mappings":"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","x_google_ignoreList":[0,1]}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-pdp", "version": "0.2.3-alpha2", "@dropins/tools": "0.23.0"}
1
+ {"name": "@dropins/storefront-pdp", "version": "0.2.3-alpha3", "@dropins/tools": "0.23.0"}