@dropins/storefront-product-discovery 3.0.0-alpha18 → 3.0.0-alpha19

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.
@@ -2,19 +2,7 @@ import { ProductSearchResult, Scope, SearchVariables } from '../../data/models';
2
2
 
3
3
  type SearchOptions = {
4
4
  scope?: Scope;
5
- syncUrl?: boolean;
6
- replaceFilters?: boolean;
7
5
  };
8
- /**
9
- * Performs a product search with the given parameters.
10
- *
11
- * State Management:
12
- * - For main search (scope=undefined): Uses centralized searchState for state management
13
- * - For scoped searches (scope='popover'): Operates independently without state management
14
- *
15
- * @param request - Search parameters. Pass null to clear results.
16
- * @param options - Search options including scope and URL sync preference
17
- */
18
6
  export declare const search: (request: SearchVariables | null, options?: SearchOptions) => Promise<ProductSearchResult>;
19
7
  export {};
20
8
  //# sourceMappingURL=search.d.ts.map
package/chunks/search.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- var ue=Object.defineProperty;var le=(e,r,t)=>r in e?ue(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var P=(e,r,t)=>le(e,typeof r!="symbol"?r+"":r,t);import{merge as se}from"@dropins/tools/lib.js";import{c as oe}from"./initialize.js";import{events as y}from"@dropins/tools/event-bus.js";import{ProductView as ce,Facet as me}from"../fragments.js";import{S as pe,P as ge,u as fe,s as he,a as ye,b as Se}from"./acdlEvents.js";import{FetchGraphQL as we}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:Ae,setFetchGraphQlHeader:De,removeFetchGraphQlHeader:ke,setFetchGraphQlHeaders:Ee,getFetchGraphQlHeader:Te,fetchGraphQl:Pe,getConfig:Be}=new we().getMethods(),h=e=>!e||!Intl.supportedValuesOf("currency").includes(e)?"USD":e,be=e=>{var t,i,n,o,s,u,l,c,p,m,g,f,a,F,R,_,I,v,$,U,N,z,x,O,A,D,k,E,T,B,J,Q,G,H,K,M,W,j,L,Y,q,X,Z,V,d,ee,te,S,re;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const r={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((t=e==null?void 0:e.images)==null?void 0:t.map(w=>{var ie;return{label:w.label||"",roles:w.roles||[],url:((ie=w.url)==null?void 0:ie.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((o=(n=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:n.amount)==null?void 0:o.value)||0,currency:h((l=(u=(s=e==null?void 0:e.price)==null?void 0:s.final)==null?void 0:u.amount)==null?void 0:l.currency)}},regular:{amount:{value:((m=(p=(c=e==null?void 0:e.price)==null?void 0:c.regular)==null?void 0:p.amount)==null?void 0:m.value)||0,currency:h((a=(f=(g=e==null?void 0:e.price)==null?void 0:g.regular)==null?void 0:f.amount)==null?void 0:a.currency)}},roles:((F=e==null?void 0:e.price)==null?void 0:F.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((v=(I=(_=(R=e==null?void 0:e.priceRange)==null?void 0:R.minimum)==null?void 0:_.final)==null?void 0:I.amount)==null?void 0:v.value)||0,currency:h((z=(N=(U=($=e==null?void 0:e.priceRange)==null?void 0:$.minimum)==null?void 0:U.final)==null?void 0:N.amount)==null?void 0:z.currency)}},regular:{amount:{value:((D=(A=(O=(x=e==null?void 0:e.priceRange)==null?void 0:x.minimum)==null?void 0:O.regular)==null?void 0:A.amount)==null?void 0:D.value)||0,currency:h((B=(T=(E=(k=e==null?void 0:e.priceRange)==null?void 0:k.minimum)==null?void 0:E.regular)==null?void 0:T.amount)==null?void 0:B.currency)}}},maximum:{final:{amount:{value:((H=(G=(Q=(J=e==null?void 0:e.priceRange)==null?void 0:J.maximum)==null?void 0:Q.final)==null?void 0:G.amount)==null?void 0:H.value)||0,currency:h((j=(W=(M=(K=e==null?void 0:e.priceRange)==null?void 0:K.maximum)==null?void 0:M.final)==null?void 0:W.amount)==null?void 0:j.currency)}},regular:{amount:{value:((X=(q=(Y=(L=e==null?void 0:e.priceRange)==null?void 0:L.maximum)==null?void 0:Y.regular)==null?void 0:q.amount)==null?void 0:X.value)||0,currency:h((ee=(d=(V=(Z=e==null?void 0:e.priceRange)==null?void 0:Z.maximum)==null?void 0:V.regular)==null?void 0:d.amount)==null?void 0:ee.currency)}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return se(r,(re=(S=(te=oe.getConfig().models)==null?void 0:te.Product)==null?void 0:S.transformer)==null?void 0:re.call(S,e))};function Ce(e,r){var n,o,s,u,l,c,p,m,g;const t=e==null?void 0:e.productSearch,i={facets:Fe((t==null?void 0:t.facets)||[],r),items:(t==null?void 0:t.items.map(f=>be(f==null?void 0:f.productView)))||[],pageInfo:{currentPage:((n=t==null?void 0:t.page_info)==null?void 0:n.current_page)||1,totalPages:((o=t==null?void 0:t.page_info)==null?void 0:o.total_pages)||1,totalItems:((s=t==null?void 0:t.page_info)==null?void 0:s.total_items)||0,pageSize:((u=t==null?void 0:t.page_info)==null?void 0:u.page_size)||10},totalCount:(t==null?void 0:t.total_count)||0,metadata:{filterableAttributes:((l=e==null?void 0:e.attributeMetadata)==null?void 0:l.filterableInSearch)||[],sortableAttributes:ae(((c=e==null?void 0:e.attributeMetadata)==null?void 0:c.sortable)||[],r)}};return se(i,(g=(m=(p=oe.getConfig().models)==null?void 0:p.ProductSearchResult)==null?void 0:m.transformer)==null?void 0:g.call(m,e))}function ae(e=[],r){return!e||e.length===0?[]:e.filter(t=>{var i;return t.attribute==="position"?(i=r==null?void 0:r.filter)==null?void 0:i.some(o=>o.attribute==="categoryPath"):!0}).map(t=>({...t,bidirectional:t.attribute==="price"}))}function Fe(e=[],r){var o,s;if(!e||e.length===0)return[];if((o=r==null?void 0:r.filter)==null?void 0:o.some(u=>u.attribute==="categoryPath"))return e.filter(u=>u.attribute!=="categories");const i=(s=r==null?void 0:r.filter)==null?void 0:s.find(u=>u.attribute==="categories"),n=(i==null?void 0:i.in)||[];return e.map(u=>u.attribute==="categories"?Re(u,n):u)}function Re(e,r){if(!e.buckets||e.buckets.length===0||r.length===0)return e;const t=new Map;return r.forEach(i=>{if(e.buckets.filter(o=>o.path?o.path.startsWith(i+"/"):!1).length>0&&e.buckets.every(s=>s.path?s.path.startsWith(i+"/")||s.path===i:!1)){const s=e.buckets.find(u=>u.path===i);if(s)t.set(i,s);else{const u=e.buckets.reduce((l,c)=>l+(c.count||0),0);t.set(i,{title:i,__typename:"CategoryView",count:u,path:i})}}}),t.size>0?{...e,buckets:Array.from(t.values())}:e}const _e=`
3
+ import{merge as re}from"@dropins/tools/lib.js";import{c as ie}from"./initialize.js";import{events as x}from"@dropins/tools/event-bus.js";import{ProductView as ne,Facet as oe}from"../fragments.js";import{S as te,P as se,u as le,s as ue,a as ce,b as me}from"./acdlEvents.js";import{FetchGraphQL as pe}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:ve,setFetchGraphQlHeader:xe,removeFetchGraphQlHeader:Fe,setFetchGraphQlHeaders:$e,getFetchGraphQlHeader:De,fetchGraphQl:fe,getConfig:Ue}=new pe().getMethods(),F=e=>!e||!Intl.supportedValuesOf("currency").includes(e)?"USD":e,ge=e=>{var r,s,n,u,c,R,f,I,g,l,m,h,S,_,P,N,A,T,E,$,v,o,i,p,C,b,z,y,w,Q,D,U,H,K,M,k,L,B,j,W,Y,J,X,Z,V,q,a,G,d;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const t={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((r=e==null?void 0:e.images)==null?void 0:r.map(O=>{var ee;return{label:O.label||"",roles:O.roles||[],url:((ee=O.url)==null?void 0:ee.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((u=(n=(s=e==null?void 0:e.price)==null?void 0:s.final)==null?void 0:n.amount)==null?void 0:u.value)||0,currency:F((f=(R=(c=e==null?void 0:e.price)==null?void 0:c.final)==null?void 0:R.amount)==null?void 0:f.currency)}},regular:{amount:{value:((l=(g=(I=e==null?void 0:e.price)==null?void 0:I.regular)==null?void 0:g.amount)==null?void 0:l.value)||0,currency:F((S=(h=(m=e==null?void 0:e.price)==null?void 0:m.regular)==null?void 0:h.amount)==null?void 0:S.currency)}},roles:((_=e==null?void 0:e.price)==null?void 0:_.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((T=(A=(N=(P=e==null?void 0:e.priceRange)==null?void 0:P.minimum)==null?void 0:N.final)==null?void 0:A.amount)==null?void 0:T.value)||0,currency:F((o=(v=($=(E=e==null?void 0:e.priceRange)==null?void 0:E.minimum)==null?void 0:$.final)==null?void 0:v.amount)==null?void 0:o.currency)}},regular:{amount:{value:((b=(C=(p=(i=e==null?void 0:e.priceRange)==null?void 0:i.minimum)==null?void 0:p.regular)==null?void 0:C.amount)==null?void 0:b.value)||0,currency:F((Q=(w=(y=(z=e==null?void 0:e.priceRange)==null?void 0:z.minimum)==null?void 0:y.regular)==null?void 0:w.amount)==null?void 0:Q.currency)}}},maximum:{final:{amount:{value:((K=(H=(U=(D=e==null?void 0:e.priceRange)==null?void 0:D.maximum)==null?void 0:U.final)==null?void 0:H.amount)==null?void 0:K.value)||0,currency:F((B=(L=(k=(M=e==null?void 0:e.priceRange)==null?void 0:M.maximum)==null?void 0:k.final)==null?void 0:L.amount)==null?void 0:B.currency)}},regular:{amount:{value:((J=(Y=(W=(j=e==null?void 0:e.priceRange)==null?void 0:j.maximum)==null?void 0:W.regular)==null?void 0:Y.amount)==null?void 0:J.value)||0,currency:F((q=(V=(Z=(X=e==null?void 0:e.priceRange)==null?void 0:X.maximum)==null?void 0:Z.regular)==null?void 0:V.amount)==null?void 0:q.currency)}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return re(t,(d=(G=(a=ie.getConfig().models)==null?void 0:a.Product)==null?void 0:G.transformer)==null?void 0:d.call(G,e))};function he(e,t){var n,u,c,R,f,I,g,l,m;const r=e==null?void 0:e.productSearch,s={facets:Ce((r==null?void 0:r.facets)||[],t),items:(r==null?void 0:r.items.map(h=>ge(h==null?void 0:h.productView)))||[],pageInfo:{currentPage:((n=r==null?void 0:r.page_info)==null?void 0:n.current_page)||1,totalPages:((u=r==null?void 0:r.page_info)==null?void 0:u.total_pages)||1,totalItems:((c=r==null?void 0:r.page_info)==null?void 0:c.total_items)||0,pageSize:((R=r==null?void 0:r.page_info)==null?void 0:R.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0,metadata:{filterableAttributes:((f=e==null?void 0:e.attributeMetadata)==null?void 0:f.filterableInSearch)||[],sortableAttributes:ye(((I=e==null?void 0:e.attributeMetadata)==null?void 0:I.sortable)||[],t)}};return re(s,(m=(l=(g=ie.getConfig().models)==null?void 0:g.ProductSearchResult)==null?void 0:l.transformer)==null?void 0:m.call(l,e))}function ye(e=[],t){return!e||e.length===0?[]:e.filter(r=>{var s;return r.attribute==="position"?(s=t==null?void 0:t.filter)==null?void 0:s.some(u=>u.attribute==="categories"):!0}).map(r=>({...r,bidirectional:r.attribute==="price"}))}function Ce(e=[],t){var s;return!e||e.length===0?[]:((s=t==null?void 0:t.filter)==null?void 0:s.some(n=>n.attribute==="categories"))?e.filter(n=>n.attribute!=="categories"):e}const be=`
4
4
  query productSearch(
5
5
  $phrase: String!
6
6
  $pageSize: Int
@@ -44,7 +44,7 @@ var ue=Object.defineProperty;var le=(e,r,t)=>r in e?ue(e,r,{enumerable:!0,config
44
44
  }
45
45
  }
46
46
  }
47
- ${ce}
48
- ${me}
49
- `;class Ie{constructor(){P(this,"state",{});P(this,"initialized",!1)}initialize(){var u;if(this.initialized)return this.state;const r=new URLSearchParams(window.location.search),t=((u=r.get("q"))==null?void 0:u.trim())||"",i=Number(r.get("page"))||1,n=this.parseSortFromUrl(r.get("sort")),o=this.parseFiltersFromUrl(r.get("filter")),s=this.getCategoryFromPath();return this.state={phrase:t,currentPage:i,sort:n,filter:this.mergeCategoryFilter(o,s),pageSize:12},this.initialized=!0,this.state}getState(){return this.initialized?{...this.state}:this.initialize()}updateState(r,t=!0,i=!1){const n={...this.state};if(this.state={...this.state,...r},r.filter!==void 0){const o=r.filter||[];if(i||o.length===0)this.state.filter=o;else{const s=n.filter||[];this.state.filter=this.deduplicateFilters([...s,...o])}}if(!r.currentPage){const o=r.filter!==void 0&&JSON.stringify(n.filter)!==JSON.stringify(this.state.filter),s=r.sort&&JSON.stringify(n.sort)!==JSON.stringify(this.state.sort);(o||s)&&(this.state.currentPage=1)}return t&&this.syncUrlFromState(),this.hasStateChanged(n,this.state)}reset(){this.state={},this.initialized=!1}syncUrlFromState(){var s;const r=new URLSearchParams;if(this.state.phrase&&r.set("q",this.state.phrase),this.state.currentPage&&this.state.currentPage>1&&r.set("page",String(this.state.currentPage)),this.state.sort&&this.state.sort.length>0){const u=this.state.sort.map(l=>`${l.attribute}:${l.direction}`).join(",");r.set("sort",u)}const t=((s=this.state.filter)==null?void 0:s.filter(u=>u.attribute!=="categoryPath"))||[],i=this.deduplicateFilters(t);if(i.length>0){const u=i.map(l=>{var c;return l.range?`${l.attribute}:${l.range.from}-${l.range.to}`:(c=l.in)!=null&&c.length?`${l.attribute}:${l.in.join(",")}`:null}).filter(Boolean).join("|");u&&r.set("filter",u)}const n=r.toString(),o=n?`${window.location.pathname}?${n}`:window.location.pathname;window.history.replaceState({},"",o)}deduplicateFilters(r){return r.reduce((i,n)=>{if(n.in&&n.in.length===0||!n.in&&!n.range&&!n.eq&&!n.contains&&!n.startsWith)return i;const s=i.findIndex(u=>u.attribute===n.attribute);return s===-1?i.push(n):i[s]=n,i},[])}parseSortFromUrl(r){return!r||!r.trim()?[]:r.split(",").map(t=>{if(t=t.trim(),!t)return null;let i="",n="ASC";if(t.includes(":"))[i,n]=t.split(":");else if(t.includes("_")){const o=t.lastIndexOf("_");i=t.slice(0,o),n=t.slice(o+1).toUpperCase()==="DESC"?"DESC":"ASC"}else i=t;return i==="position"?null:{attribute:i,direction:n}}).filter(Boolean)}parseFiltersFromUrl(r){return!r||!r.trim()?[]:decodeURIComponent(r.replace(/\+/g,"%20")).split(/\||;/).reduce((i,n)=>{const o=n.trim();if(!o.includes(":"))return i;const[s,...u]=o.split(":"),l=u.join(":").trim();if(!s||!l)return i;if(s==="price"&&l.includes("-")){const[c,p]=l.split("-"),m=Number(c),g=Number(p);return!Number.isNaN(m)&&!Number.isNaN(g)&&i.push({attribute:"price",range:{from:m,to:g}}),i}if(s==="visibility"){const c=/,(?!\s)/,p=l.includes(",")&&c.test(l)?l.split(c).map(m=>m.trim()):[l];return i.push({attribute:s,in:p}),i}return i.push({attribute:s,in:l.split(/[|,]/).map(c=>c.trim()).filter(Boolean)}),i},[])}getCategoryFromPath(){const r=window.location.pathname.replace(/^\/|\/$/g,"");return!r||r.startsWith("search")?null:r.split("/").pop()||null}mergeCategoryFilter(r,t){if(!t)return r;const i=r.filter(n=>n.attribute!=="categoryPath");return[{attribute:"categoryPath",in:[t]},...i]}hasStateChanged(r,t){return r.phrase!==t.phrase||r.currentPage!==t.currentPage||r.pageSize!==t.pageSize||JSON.stringify(r.sort)!==JSON.stringify(t.sort)||JSON.stringify(r.filter)!==JSON.stringify(t.filter)}}const b=new Ie,C={request:{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}},Je=async(e,r={})=>{const{scope:t,syncUrl:i=!0,replaceFilters:n=!1}=r,o=!t||t==="search";if(e===null)return y.emit("search/result",C,{scope:t}),C.result;if(o){b.getState();const s=i&&!n;b.updateState(e,s,n);const u=b.getState();return ne(u,t)}return ne(e,t)};async function ne(e,r){y.emit("search/loading",!0,{scope:r});try{const t=r==="popover"?pe:ge,i=window.crypto.randomUUID();fe(t,i,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),he(t);const{errors:n,data:o}=await Pe(_e,{method:"GET",variables:{...e}});if(n&&!o)throw new Error("Error fetching product search");const s=Ce(o,e);return ye(t,i,s),Se(t),y.emit("search/result",{request:e,result:s},{scope:r}),s}catch(t){throw y.emit("search/error",t.message,{scope:r}),y.emit("search/result",C,{scope:r}),t}finally{y.emit("search/loading",!1,{scope:r})}}export{De as a,Ee as b,Be as c,Je as d,Pe as f,Te as g,ke as r,Ae as s};
47
+ ${ne}
48
+ ${oe}
49
+ `,Ne=async(e,t={})=>{const r=t.scope==="search"?void 0:t.scope,s={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}};if(e===null)return x.emit("search/result",s,{scope:r}),s.result;x.emit("search/loading",!0,{scope:r});try{const n=r==="popover"?te:se,u=window.crypto.randomUUID(),c=new URLSearchParams(window.location.search),R=Number(c.get("page"))||1,f=c.get("q"),I=(e==null?void 0:e.phrase)||f!==null&&f.trim().length>0&&f||"",g=r!=="undefined"?null:c.get("sort"),l=g&&g.trim().length>0?g.split(",").map(o=>{if(o=o.trim(),!o)return null;let i="",p="ASC";if(o.includes(":"))[i,p]=o.split(":");else if(o.includes("_")){const C=o.lastIndexOf("_");i=o.slice(0,C),p=o.slice(C+1).toUpperCase()==="DESC"?"DESC":"ASC"}else i=o;return i==="position"?null:{attribute:i,direction:p}}).filter(Boolean):[],m=r!=="undefined"?null:c.get("filter"),h=m&&m.trim()?decodeURIComponent(m.replace(/\+/g,"%20")).split(/\||;/).reduce((i,p)=>{const C=p.trim();if(!C.includes(":"))return i;const[b,...z]=C.split(":"),y=z.join(":").trim();if(!b||!y)return i;if(b==="price"&&y.includes("-")){const[w,Q]=y.split("-"),D=Number(w),U=Number(Q);return!Number.isNaN(D)&&!Number.isNaN(U)&&i.push({attribute:"price",range:{from:D,to:U}}),i}if(b==="visibility"){const w=y.indexOf(",");return i.push({attribute:b,in:w===-1?[y.trim()]:["Catalog, Search"]}),i}return i.push({attribute:b,in:y.split(/[|,]/).map(w=>w.trim()).filter(Boolean)}),i},[]):e==null?void 0:e.filter,S=h?[...h]:[],_=window.location.pathname.replace(/^\/|\/$/g,""),P=!r&&_&&!_.startsWith("search")?_.split("/").pop():null;if(P){let o=S.find(p=>p.attribute==="categories");const i={attribute:"categories",in:[P]};o?o=i:S.unshift(i)}const N=I||e.phrase,A=l!=null&&l.length?l:e.sort,T=m!==null||P?S:e.filter;e={...e,phrase:N,sort:A,filter:T,currentPage:R},le(n,u,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),ue(n);const{errors:E,data:$}=await fe(be,{method:"GET",variables:{...e}});if(E&&!$)throw new Error("Error fetching product search");const v=he($,e);return ce(n,u,v),me(n),x.emit("search/result",{request:e,result:v},{scope:r}),v}catch(n){throw x.emit("search/error",n.message,{scope:r}),x.emit("search/result",s,{scope:r}),n}finally{x.emit("search/loading",!1,{scope:r})}};export{xe as a,$e as b,Ue as c,Ne as d,fe as f,De as g,Fe as r,ve as s};
50
50
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/searchState.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(data?.price?.regular?.amount?.currency),\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.regular?.amount?.currency),\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n // Get the currently filtered categories (if any)\n const categoriesFilter = searchVariables?.filter?.find(\n (filter) => filter.attribute === 'categories'\n );\n const filteredCategories = categoriesFilter?.in || [];\n\n // Transform categories facet based on filtered state\n return facets.map((facet) => {\n if (facet.attribute === 'categories') {\n return transformCategoriesFacet(facet, filteredCategories);\n }\n return facet;\n });\n}\n\n/**\n * Transforms the categories facet based on what's currently filtered.\n * Note: This transform does NOT create synthetic buckets for filtered categories.\n * That responsibility belongs to the component layer where full bucket data is available.\n * \n * @param facet - The categories facet from the API\n * @param filteredCategories - Currently filtered category values\n */\nfunction transformCategoriesFacet(facet: any, filteredCategories: string[]): any {\n // If no buckets or no filtering, return as-is\n if (!facet.buckets || facet.buckets.length === 0 || filteredCategories.length === 0) {\n return facet;\n }\n\n // Check if all returned categories are children of a filtered parent\n // If so, we might want to aggregate them\n const parentCategories = new Map<string, any>();\n\n filteredCategories.forEach(filteredCategory => {\n // Check if all buckets are children of this filtered category\n const childBuckets = facet.buckets.filter((bucket: any) => {\n if (!bucket.path) return false;\n // A child starts with \"parent/\" pattern\n return bucket.path.startsWith(filteredCategory + '/');\n });\n\n // Only transform if we found children AND all buckets are either children or the parent itself\n if (childBuckets.length > 0) {\n const allBucketsAreChildrenOrParent = facet.buckets.every((bucket: any) => {\n if (!bucket.path) return false;\n return bucket.path.startsWith(filteredCategory + '/') || bucket.path === filteredCategory;\n });\n\n if (allBucketsAreChildrenOrParent) {\n // Check if the parent bucket already exists in the response\n const parentBucket = facet.buckets.find((b: any) => b.path === filteredCategory);\n \n if (parentBucket) {\n // Use the existing parent bucket data (preserves name, etc.)\n parentCategories.set(filteredCategory, parentBucket);\n } else {\n // Aggregate all child counts into the parent\n // Note: We don't have the parent's name here, component will need to enrich it\n const totalCount = facet.buckets.reduce((sum: number, bucket: any) => {\n return sum + (bucket.count || 0);\n }, 0);\n\n parentCategories.set(filteredCategory, {\n title: filteredCategory,\n __typename: 'CategoryView',\n count: totalCount,\n path: filteredCategory\n });\n }\n }\n }\n });\n\n // If we identified parent categories to show, return them instead of children\n if (parentCategories.size > 0) {\n return {\n ...facet,\n buckets: Array.from(parentCategories.values())\n };\n }\n\n // Otherwise, return original buckets\n return facet;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { SearchVariables, SearchFilter, SortOrder } from '@/plp/data/models';\n\n/**\n * SearchState manages the centralized search state and URL synchronization.\n * This is the single source of truth for search parameters.\n */\nclass SearchState {\n private state: SearchVariables = {};\n private initialized = false;\n\n /**\n * Initialize state from URL on first load\n */\n initialize(): SearchVariables {\n if (this.initialized) {\n return this.state;\n }\n\n const params = new URLSearchParams(window.location.search);\n \n // Parse phrase\n const phrase = params.get('q')?.trim() || '';\n \n // Parse page\n const currentPage = Number(params.get('page')) || 1;\n \n // Parse sort\n const sort = this.parseSortFromUrl(params.get('sort'));\n \n // Parse filters\n const filter = this.parseFiltersFromUrl(params.get('filter'));\n \n // Parse category from pathname\n const categoryFromPath = this.getCategoryFromPath();\n \n this.state = {\n phrase,\n currentPage,\n sort,\n filter: this.mergeCategoryFilter(filter, categoryFromPath),\n pageSize: 12, // Default page size\n };\n \n this.initialized = true;\n return this.state;\n }\n\n /**\n * Get current state\n */\n getState(): SearchVariables {\n if (!this.initialized) {\n return this.initialize();\n }\n return { ...this.state };\n }\n\n /**\n * Update state and sync to URL\n * Returns true if state changed (API call needed)\n */\n updateState(updates: Partial<SearchVariables>, syncUrl = true, replaceFilters = false): boolean {\n const prevState = { ...this.state };\n \n // Merge updates\n this.state = {\n ...this.state,\n ...updates,\n };\n \n // If filters were updated, decide whether to merge or replace\n if (updates.filter !== undefined) {\n const newFilters = updates.filter || [];\n \n // If replaceFilters is true OR empty array is passed, replace entirely\n if (replaceFilters || newFilters.length === 0) {\n this.state.filter = newFilters;\n } else {\n // Otherwise, merge with existing filters and deduplicate\n // This ensures we don't lose existing filters when new ones are added\n const existingFilters = prevState.filter || [];\n // Combine existing + new, then deduplicate (last wins, skip empty)\n this.state.filter = this.deduplicateFilters([...existingFilters, ...newFilters]);\n }\n }\n\n // Reset to page 1 when filters or sort ACTUALLY change (not just when they're present)\n if (!updates.currentPage) {\n const filtersChanged = updates.filter !== undefined && JSON.stringify(prevState.filter) !== JSON.stringify(this.state.filter);\n const sortChanged = updates.sort && JSON.stringify(prevState.sort) !== JSON.stringify(this.state.sort);\n \n if (filtersChanged || sortChanged) {\n this.state.currentPage = 1;\n }\n }\n\n // Sync URL if requested\n if (syncUrl) {\n this.syncUrlFromState();\n }\n\n // Check if state actually changed (determines if API call needed)\n return this.hasStateChanged(prevState, this.state);\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.state = {};\n this.initialized = false;\n }\n\n /**\n * Sync URL from current state\n */\n private syncUrlFromState(): void {\n const params = new URLSearchParams();\n \n // Add phrase\n if (this.state.phrase) {\n params.set('q', this.state.phrase);\n }\n \n // Add page (only if not page 1)\n if (this.state.currentPage && this.state.currentPage > 1) {\n params.set('page', String(this.state.currentPage));\n }\n \n // Add sort\n if (this.state.sort && this.state.sort.length > 0) {\n const sortParam = this.state.sort\n .map(s => `${s.attribute}:${s.direction}`)\n .join(',');\n params.set('sort', sortParam);\n }\n \n // Add filters (excluding categoryPath which comes from URL path)\n const filtersWithoutCategory = this.state.filter?.filter(\n f => f.attribute !== 'categoryPath'\n ) || [];\n \n const deduplicatedFilters = this.deduplicateFilters(filtersWithoutCategory);\n \n if (deduplicatedFilters.length > 0) {\n const filterParam = deduplicatedFilters\n .map(filter => {\n if (filter.range) {\n return `${filter.attribute}:${filter.range.from}-${filter.range.to}`;\n }\n if (filter.in?.length) {\n return `${filter.attribute}:${filter.in.join(',')}`;\n }\n return null;\n })\n .filter(Boolean)\n .join('|'); // Use pipe separator to match aem-boilerplate-commerce format\n \n if (filterParam) {\n params.set('filter', filterParam);\n }\n }\n \n const queryString = params.toString();\n const newUrl = queryString \n ? `${window.location.pathname}?${queryString}`\n : window.location.pathname;\n \n window.history.replaceState({}, '', newUrl);\n }\n\n /**\n * Deduplicate filters by attribute\n * Later filters with the same attribute replace earlier ones, UNLESS the new filter is empty\n * Empty filters are discarded and don't override existing values\n */\n private deduplicateFilters(filters: SearchFilter[]): SearchFilter[] {\n const deduplicated = filters.reduce<SearchFilter[]>((acc, filter) => {\n // Check if filter has empty values\n const isEmpty = \n (filter.in && filter.in.length === 0) ||\n (!filter.in && !filter.range && !filter.eq && !filter.contains && !filter.startsWith);\n \n if (isEmpty) {\n // Skip empty filters - don't add them or use them to replace existing\n return acc;\n }\n \n const existingIndex = acc.findIndex(f => f.attribute === filter.attribute);\n if (existingIndex === -1) {\n // New attribute, add it\n acc.push(filter);\n } else {\n // Same attribute already exists, replace it with the newer non-empty one\n acc[existingIndex] = filter;\n }\n return acc;\n }, []);\n \n return deduplicated;\n }\n\n /**\n * Parse sort parameter from URL\n */\n private parseSortFromUrl(sortParam: string | null): SortOrder[] {\n if (!sortParam || !sortParam.trim()) {\n return [];\n }\n\n return sortParam\n .split(',')\n .map(token => {\n token = token.trim();\n if (!token) return null;\n\n let attribute = '';\n let direction: 'ASC' | 'DESC' = 'ASC';\n\n if (token.includes(':')) {\n [attribute, direction] = token.split(':') as [string, 'ASC' | 'DESC'];\n } else if (token.includes('_')) {\n const lastUnderscore = token.lastIndexOf('_');\n attribute = token.slice(0, lastUnderscore);\n direction = token.slice(lastUnderscore + 1).toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n } else {\n attribute = token;\n }\n\n if (attribute === 'position') {\n return null;\n }\n\n return { attribute, direction };\n })\n .filter(Boolean) as SortOrder[];\n }\n\n /**\n * Parse filter parameter from URL\n */\n private parseFiltersFromUrl(filterParam: string | null): SearchFilter[] {\n if (!filterParam || !filterParam.trim()) {\n return [];\n }\n\n const decoded = decodeURIComponent(filterParam.replace(/\\+/g, '%20'));\n\n return decoded.split(/\\||;/).reduce<SearchFilter[]>((acc, part) => {\n const trimmed = part.trim();\n if (!trimmed.includes(':')) return acc;\n\n const [attribute, ...rest] = trimmed.split(':');\n const rawValue = rest.join(':').trim();\n if (!attribute || !rawValue) return acc;\n\n // Handle price range\n if (attribute === 'price' && rawValue.includes('-')) {\n const [fromRaw, toRaw] = rawValue.split('-');\n const from = Number(fromRaw);\n const to = Number(toRaw);\n\n if (!Number.isNaN(from) && !Number.isNaN(to)) {\n acc.push({\n attribute: 'price',\n range: { from, to },\n });\n }\n return acc;\n }\n\n // Handle visibility - split on comma not followed by space to match aem-boilerplate-commerce format\n // This preserves values like \"Catalog, Search\" while splitting \"Search,Catalog, Search\" correctly\n if (attribute === 'visibility') {\n const commaNotFollowedBySpace = /,(?!\\s)/;\n const values = rawValue.includes(',') && commaNotFollowedBySpace.test(rawValue)\n ? rawValue.split(commaNotFollowedBySpace).map(v => v.trim())\n : [rawValue];\n acc.push({\n attribute,\n in: values,\n });\n return acc;\n }\n\n // Handle other filters\n acc.push({\n attribute,\n in: rawValue.split(/[|,]/).map(v => v.trim()).filter(Boolean),\n });\n\n return acc;\n }, []);\n }\n\n /**\n * Extract category from pathname\n */\n private getCategoryFromPath(): string | null {\n const pathname = window.location.pathname.replace(/^\\/|\\/$/g, '');\n \n // If we're on the search page, don't add category filter\n if (!pathname || pathname.startsWith('search')) {\n return null;\n }\n\n return pathname.split('/').pop() || null;\n }\n\n /**\n * Merge category filter from path with existing filters\n */\n private mergeCategoryFilter(filters: SearchFilter[], categoryFromPath: string | null): SearchFilter[] {\n if (!categoryFromPath) {\n return filters;\n }\n\n // Remove existing categoryPath filters and add the one from path\n const filtersWithoutCategory = filters.filter(f => f.attribute !== 'categoryPath');\n \n return [\n { attribute: 'categoryPath', in: [categoryFromPath] },\n ...filtersWithoutCategory,\n ];\n }\n\n /**\n * Check if state has changed in meaningful ways\n */\n private hasStateChanged(prev: SearchVariables, next: SearchVariables): boolean {\n // Compare primitive values\n if (prev.phrase !== next.phrase) return true;\n if (prev.currentPage !== next.currentPage) return true;\n if (prev.pageSize !== next.pageSize) return true;\n\n // Compare sort arrays\n if (JSON.stringify(prev.sort) !== JSON.stringify(next.sort)) return true;\n\n // Compare filter arrays\n if (JSON.stringify(prev.filter) !== JSON.stringify(next.filter)) return true;\n\n return false;\n }\n}\n\n// Export singleton instance\nexport const searchState = new SearchState();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\nimport { searchState } from './searchState';\n\ntype SearchOptions = {\n scope?: Scope;\n syncUrl?: boolean; // Whether to sync state to URL (default: true)\n replaceFilters?: boolean; // Whether to replace filters instead of merging (default: false)\n}\n\nconst emptyResult = {\n request: {} as SearchVariables,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n};\n\n/**\n * Performs a product search with the given parameters.\n * \n * State Management:\n * - For main search (scope=undefined): Uses centralized searchState for state management\n * - For scoped searches (scope='popover'): Operates independently without state management\n * \n * @param request - Search parameters. Pass null to clear results.\n * @param options - Search options including scope and URL sync preference\n */\nexport const search = async (request: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const { scope, syncUrl = true, replaceFilters = false } = options;\n const isMainSearch = !scope || scope === 'search';\n\n // Clear search results if null request\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n // For main search, use centralized state management\n if (isMainSearch) {\n // Initialize state from URL on first call\n searchState.getState();\n \n // Merge request with current state and sync to URL\n // When replaceFilters is true (from Facets), don't sync URL here\n // because the consuming app (aem-boilerplate) will sync it from search/result event\n const shouldSyncUrl = syncUrl && !replaceFilters;\n searchState.updateState(request, shouldSyncUrl, replaceFilters);\n \n // Get the final merged state\n const finalRequest = searchState.getState();\n \n // Always perform API call for now (can optimize later to skip if !stateChanged)\n return executeSearch(finalRequest, scope);\n }\n\n // For scoped searches (popover), execute directly without state management\n return executeSearch(request, scope);\n};\n\n/**\n * Execute the actual search API call\n */\nasync function executeSearch(request: SearchVariables, scope?: Scope): Promise<ProductSearchResult> {\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId);\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n}"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","getCurrency","currency","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","categoriesFilter","filteredCategories","transformCategoriesFacet","parentCategories","filteredCategory","bucket","parentBucket","b","totalCount","sum","PRODUCT_SEARCH_QUERY","ProductView","Facet","SearchState","__publicField","params","phrase","currentPage","sort","categoryFromPath","updates","syncUrl","replaceFilters","prevState","newFilters","existingFilters","filtersChanged","sortChanged","sortParam","s","filtersWithoutCategory","f","deduplicatedFilters","filterParam","queryString","newUrl","filters","acc","existingIndex","token","attribute","direction","lastUnderscore","part","trimmed","rest","rawValue","fromRaw","toRaw","from","to","commaNotFollowedBySpace","values","v","pathname","prev","next","searchState","emptyResult","search","request","options","scope","isMainSearch","events","shouldSyncUrl","finalRequest","executeSearch","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(data?.price?.regular?.amount?.currency),\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.regular?.amount?.currency),\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categories'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoriesFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categories'\n );\n\n // if hasCategoriesFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoriesFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables, SortOrder, SearchFilter } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (request: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n const params = new URLSearchParams(window.location.search);\n \n const currentPage = Number(params.get('page')) || 1;\n const qParam = params.get('q');\n // if we are passed a phrase, use it, otherwise use the q param\n const phrase = request?.phrase || (qParam !== null && qParam.trim().length > 0 && qParam) || '';\n \n const sortParam = scope !== 'undefined' ? null : params.get('sort');\n const sort: SortOrder[] = sortParam && sortParam.trim().length > 0\n ? sortParam.split(',').map(token => {\n token = token.trim();\n if (!token) return null;\n\n let attribute = '';\n let direction: 'ASC' | 'DESC' = 'ASC';\n\n if (token.includes(':')) {\n [attribute, direction] = token.split(':') as [string, 'ASC' | 'DESC'];\n } \n else if (token.includes('_')) {\n const lastUnderscore = token.lastIndexOf('_');\n attribute = token.slice(0, lastUnderscore); \n direction = token.slice(lastUnderscore + 1).toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n } \n else {\n attribute = token;\n }\n \n if (attribute === 'position') {\n return null;\n }\n \n return { attribute, direction };\n }).filter(Boolean) as SortOrder[]\n : [];\n \n // if we are passed a scope, don't use the filter param\n const filterParam = scope !== 'undefined' ? null : params.get('filter');\n const filter: SearchFilter[] | undefined =\n filterParam && filterParam.trim()\n ? (() => {\n \n const decoded = decodeURIComponent(\n filterParam.replace(/\\+/g, '%20')\n );\n \n return decoded.split(/\\||;/).reduce<SearchFilter[]>((acc, part) => {\n const trimmed = part.trim();\n if (!trimmed.includes(':')) return acc;\n const [attribute, ...rest] = trimmed.split(':');\n const rawValue = rest.join(':').trim();\n if (!attribute || !rawValue) return acc;\n if (attribute === 'price' && rawValue.includes('-')) {\n const [fromRaw, toRaw] = rawValue.split('-');\n \n const from = Number(fromRaw);\n const to = Number(toRaw);\n \n if (!Number.isNaN(from) && !Number.isNaN(to)) {\n acc.push({\n attribute: 'price',\n range: {\n from,\n to,\n },\n });\n }\n \n return acc;\n }\n \n if (attribute === 'visibility') {\n const firstCommaIndex = rawValue.indexOf(',');\n acc.push({\n attribute,\n in:\n firstCommaIndex === -1\n ? [rawValue.trim()]\n : [\n `Catalog, Search`\n ],\n });\n return acc;\n }\n \n acc.push({\n attribute,\n in: rawValue\n .split(/[|,]/)\n .map(v => v.trim())\n .filter(Boolean),\n });\n \n return acc;\n }, []);\n })()\n : request?.filter;\n\n const finalFilters: SearchFilter[] = filter ? [...filter] : [];\n\n const pathname = window.location.pathname.replace(/^\\/|\\/$/g, '');\n // if we are passed a scope or on the search page, don't add the categories filter\n const categoryFromPath =\n !scope && pathname && !pathname.startsWith('search')\n ? pathname.split('/').pop()\n : null;\n\n // cagetoryFromPath overrides any other categories filters\n if (categoryFromPath) {\n let existingCategoriesFilter = finalFilters.find(f => f.attribute === 'categories');\n const newCategoriesFilter = {\n attribute: 'categories',\n in: [categoryFromPath],\n };\n\n if (existingCategoriesFilter) {\n existingCategoriesFilter = newCategoriesFilter;\n } else {\n finalFilters.unshift(newCategoriesFilter);\n }\n }\n\n const phraseSearch = phrase || request.phrase;\n const sortSearch = sort?.length ? sort : request.sort;\n const filterSearch = filterParam !== null || categoryFromPath ? finalFilters : request.filter;\n\n request = {\n ...request,\n phrase: phraseSearch,\n sort: sortSearch,\n filter: filterSearch,\n currentPage,\n };\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","getCurrency","currency","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","params","currentPage","qParam","phrase","sortParam","sort","token","attribute","direction","lastUnderscore","filterParam","acc","part","trimmed","rest","rawValue","fromRaw","toRaw","from","to","firstCommaIndex","v","finalFilters","pathname","categoryFromPath","existingCategoriesFilter","f","newCategoriesFilter","phraseSearch","sortSearch","filterSearch","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as b,jsx as i,Fragment as P}from"@dropins/tools/preact-jsx-runtime.js";import*as S from"@dropins/tools/preact-compat.js";import{useState as A,useRef as $,useEffect as D}from"@dropins/tools/preact-compat.js";import{classes as ee,VComponent as N,Slot as E}from"@dropins/tools/lib.js";import{Button as M,Icon as q,PriceRange as T,Checkbox as te,RadioButton as ne}from"@dropins/tools/components.js";/* empty css */import{useText as J}from"@dropins/tools/i18n.js";import{events as re}from"@dropins/tools/event-bus.js";import{d as ce}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const ie=r=>S.createElement("svg",{id:"Icon_Add_Base","data-name":"Icon \\u2013 Add \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...r},S.createElement("g",{id:"Large"},S.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),S.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},S.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_579","data-name":"Line 579",y2:12.7,transform:"translate(2.216 -4.087)",fill:"none",stroke:"currentColor"}),S.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_580","data-name":"Line 580",x2:12.7,transform:"translate(-4.079 2.263)",fill:"none",stroke:"currentColor"})))),ae=r=>S.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r},S.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),S.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),se=r=>S.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r},S.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),le=({numberOfOptionsConfig:r=5,header:e,buckets:u,last:h})=>{const p=J({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),y=r,[k,B]=A(u.length<y),R=k?u.length:y;return b("div",{className:ee(["product-discovery-facet",["product-discovery-facet--last",h]]),children:[i(N,{className:"product-discovery-facet__header",node:e}),u.slice(0,R).map((_,C)=>i(N,{className:"product-discovery-facet__bucket",node:_},C)),!k&&u.length>y&&i(M,{variant:"tertiary",icon:i(q,{source:ie,size:"24"}),onClick:()=>B(!k),children:p.showMore}),k&&u.length>y&&i(M,{variant:"tertiary",icon:i(q,{source:se,size:"24"}),onClick:()=>B(!k),children:p.showLess})]})},oe=({selectedFacets:r,facets:e})=>b(P,{children:[i(N,{className:"product-discovery-facet-list__selected-filters",node:r}),i(N,{className:"product-discovery-facet-list__facet-options",node:e})]}),ue="no",de="yes",me=r=>{const e=r.buckets.find(u=>u.selected);return e?{attribute:r.attribute,range:{from:e.from,to:e.to}}:null},he=r=>{const e=r.buckets.reduce((u,h)=>(h.selected&&u.push(h.title),u),[]);return e.length===0?null:{attribute:r.attribute,in:e}},U=r=>{var e;switch((e=r.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return me(r);case"ScalarBucket":case"CategoryView":return he(r)}},ge=r=>{var u,h,p,y,k,B,R,_,C,L,x;const e=r[0];return(p=(h=(u=e==null?void 0:e.price)==null?void 0:u.regular)==null?void 0:h.amount)!=null&&p.currency?e.price.regular.amount.currency:(R=(B=(k=(y=e==null?void 0:e.priceRange)==null?void 0:y.minimum)==null?void 0:k.regular)==null?void 0:B.amount)!=null&&R.currency?(x=(L=(C=(_=e==null?void 0:e.priceRange)==null?void 0:_.minimum)==null?void 0:C.regular)==null?void 0:L.amount)==null?void 0:x.currency:"USD"},fe=(r,e,u)=>(e==null?void 0:e.attribute)==="price"?r.from===0?b("div",{style:"display:flex",children:[i(T,{amount:r.from,currency:u||"USD"}),i("span",{style:"padding: 0 2px",children:"-"}),i(T,{amount:r.to,currency:u||"USD"})]}):i(T,{minimumAmount:r.from,maximumAmount:r.to,currency:u||"USD",display:"dash"}):r.title,pe=(r,e)=>r.title===ue?`Not ${e.title}`:r.title===de?e.title:r.name||r.title,j=(r,e,u)=>{switch(r.__typename){case"RangeBucket":return fe(r,e,u);case"ScalarBucket":case"CategoryView":return pe(r,e)}},Ee=({scope:r,slots:e})=>{const u=J({clearAll:"Search.Facet.clearAll"}),[h,p]=A([]),[y,k]=A(null),[B,R]=A(),[_,C]=A(null),L=$(null),x=$(null),O=$(new Map),W=n=>{var c;const m=[...((c=B==null?void 0:B.filter)==null?void 0:c.filter(t=>t.attribute==="categoryPath"))||[],...n.filter||[]];x.current=m,ce({...n,filter:m},{scope:r,replaceFilters:!0})},Z=n=>{if(!n||!n.result.facets&&!n.result.items&&!n.request.filter){p([]);return}if(_!==null&&x.current!==null){if(!(JSON.stringify(n.request.filter)===JSON.stringify(x.current)))return;C(null),x.current=null}R(n.request);const{facets:d,items:m}=n.result;k(ge(m));const c=n.request.filter;if(d){const t=d.map(a=>{const s=h.find(l=>l.attribute===a.attribute),v=a.buckets.map(l=>{l.name&&l.title&&O.current.set(l.title,l.name);const o=s==null?void 0:s.buckets.find(w=>w.title===l.title),f=l.name?l:{...l,name:(o==null?void 0:o.name)||O.current.get(l.title)},F=c==null?void 0:c.find(w=>w.attribute===a.attribute);if(F){const w=F.range;if(w&&f.from===w.from&&f.to===w.to)return{...f,selected:!0};if(F.in&&F.in.includes(f.title))return{...f,selected:!0}}return{...f,selected:!1}});let g=v;if(a.attribute==="categories"){const l=c==null?void 0:c.find(o=>o.attribute==="categories");if(l!=null&&l.in&&l.in.length>0){const o=new Set(v.map(F=>F.title)),f=l.in.filter(F=>!o.has(F));f.length>0&&(g=[...f.map(w=>{const V=s==null?void 0:s.buckets.find(I=>I.title===w);return V?{...V,selected:!0,count:0}:{title:w,__typename:"CategoryView",name:O.current.get(w),count:0,path:w,selected:!0}}),...v])}}return{...a,buckets:g}});p(t)}else{const t=c==null?void 0:c.find(a=>a.attribute==="categories");if(t!=null&&t.in&&t.in.length>0&&h.length>0){const a=h.map(s=>{if(s.attribute==="categories"){const v=s.buckets.map(g=>{var l;return{...g,selected:((l=t.in)==null?void 0:l.includes(g.title))||!1}});return{...s,buckets:v}}return s});p(a)}}},H=n=>{p(d=>{const m=d.map(t=>{const a=n.find(s=>s.attribute===t.attribute);return a||t}),c=m.reduce((t,a)=>{const s=U(a);return s&&t.push(s),t},[]);return C(c),m})},Y=(n,d)=>{const m=n.buckets.map(t=>t.title===d?{...t,selected:!1}:t),c={...n,buckets:m};H([c])},G=()=>{const n=h.map(d=>{const m=d.buckets.map(c=>({...c,selected:!1}));return{...d,buckets:m}});p(n),C([])},z=(n,d)=>{const m=n.target.value,c=n.target.checked;p(t=>{const a=t.find(o=>o.attribute===d);if(!a)return t;const s=a.buckets.map(o=>{var f;return((f=a.buckets[0])==null?void 0:f.__typename)==="RangeBucket"?o.title===m?{...o,selected:c}:{...o,selected:!1}:o.title===m?{...o,selected:c}:{...o}}),v={...a,buckets:s},g=t.map(o=>o.attribute===d?v:o),l=g.reduce((o,f)=>{const F=U(f);return F&&o.push(F),o},[]);return C(l),g})},K=(n,d)=>{const m=i("span",{children:n.title}),c=n.buckets.map(t=>{var v;const a=j(t,n,y),s=g=>b(E,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:t},children:[a," ",g?`(${g})`:""]});switch((v=n.buckets[0])==null?void 0:v.__typename){case"RangeBucket":return i(E,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:t},children:i(ne,{"data-testid":`${t.title}-radio`,label:s(),name:n.attribute,value:t.title,checked:t.selected,onChange:g=>{z(g,n.attribute)}})});case"ScalarBucket":case"CategoryView":return i(E,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:t},children:i(te,{id:`${n.attribute}-${t.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,"data-testid":`${t.title}-checkbox`,label:s(t.selected?void 0:t.count),name:`${n.attribute}-${t.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,value:t.title,checked:t.selected,onChange:g=>{z(g,n.attribute)}})});default:return null}}).filter(t=>t!==null);return i(le,{header:m,buckets:c,last:d===h.length-1})},Q=()=>i(E,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:h},children:h.map((n,d)=>n.buckets.length>0?i(P,{children:i(E,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:n},children:K(n,d)})}):null)}),X=()=>{const n=h.reduce((c,t)=>(t.buckets.filter(s=>s.selected).length>0&&c.push(t),c),[]),d=n.map(c=>c.buckets.map(t=>{if(t.selected){const a=j(t,c,y);return i(M,{"data-testid":`${t.title}-selected-btn`,"aria-label":`Remove ${c.title} filter: ${a}`,variant:"secondary",children:b(P,{children:[i("span",{children:a}),i(q,{source:ae,size:"16"})]}),onClick:()=>{Y(c,t.title)}})}return null})),m=d.length>0?i(M,{variant:"secondary",onClick:()=>{G()},children:i("span",{children:u.clearAll})}):null;return b(E,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:n},children:[d,m]})};return D(()=>{const n=re.on("search/result",Z,{eager:!0,scope:r});return()=>{n==null||n.off()}},[r]),D(()=>{if(_!==null)return L.current&&clearTimeout(L.current),L.current=setTimeout(()=>{B&&W({...B,filter:_})},150),()=>{L.current&&clearTimeout(L.current)}},[_]),i(oe,{selectedFacets:X(),facets:Q()})};export{Ee as Facets,Ee as default};
3
+ import{jsxs as x,jsx as a,Fragment as N}from"@dropins/tools/preact-jsx-runtime.js";import*as F from"@dropins/tools/preact-compat.js";import{useState as C,useRef as J,useEffect as P}from"@dropins/tools/preact-compat.js";import{classes as K,VComponent as $,Slot as k}from"@dropins/tools/lib.js";import{Button as A,Icon as M,PriceRange as b,Checkbox as Q,RadioButton as X}from"@dropins/tools/components.js";/* empty css */import{useText as q}from"@dropins/tools/i18n.js";import{events as I}from"@dropins/tools/event-bus.js";import{d as ee}from"../chunks/search.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const te=n=>F.createElement("svg",{id:"Icon_Add_Base","data-name":"Icon \\u2013 Add \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...n},F.createElement("g",{id:"Large"},F.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),F.createElement("g",{id:"Add_icon","data-name":"Add icon",transform:"translate(9.734 9.737)"},F.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_579","data-name":"Line 579",y2:12.7,transform:"translate(2.216 -4.087)",fill:"none",stroke:"currentColor"}),F.createElement("line",{vectorEffect:"non-scaling-stroke",id:"Line_580","data-name":"Line 580",x2:12.7,transform:"translate(-4.079 2.263)",fill:"none",stroke:"currentColor"})))),re=n=>F.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},F.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 5.64001L5.62988 18.37",stroke:"currentColor"}),F.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M18.3599 18.37L5.62988 5.64001",stroke:"currentColor"})),ne=n=>F.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},F.createElement("path",{d:"M17.3332 11.75H6.6665",strokeWidth:1,strokeLinecap:"square",strokeLinejoin:"round",vectorEffect:"non-scaling-stroke",fill:"none",stroke:"currentColor"})),ce=({numberOfOptionsConfig:n=5,header:e,buckets:s,last:m})=>{const p=q({showMore:"Search.Facet.showMore",showLess:"Search.Facet.showLess"}),w=n,[S,g]=C(s.length<w),_=S?s.length:w;return x("div",{className:K(["product-discovery-facet",["product-discovery-facet--last",m]]),children:[a($,{className:"product-discovery-facet__header",node:e}),s.slice(0,_).map((B,v)=>a($,{className:"product-discovery-facet__bucket",node:B},v)),!S&&s.length>w&&a(A,{variant:"tertiary",icon:a(M,{source:te,size:"24"}),onClick:()=>g(!S),children:p.showMore}),S&&s.length>w&&a(A,{variant:"tertiary",icon:a(M,{source:ne,size:"24"}),onClick:()=>g(!S),children:p.showLess})]})},ae=({selectedFacets:n,facets:e})=>x(N,{children:[a($,{className:"product-discovery-facet-list__selected-filters",node:n}),a($,{className:"product-discovery-facet-list__facet-options",node:e})]}),ie="no",se="yes",le=n=>{const e=n.buckets.find(s=>s.selected);return e?{attribute:n.attribute,range:{from:e.from,to:e.to}}:null},oe=n=>{const e=n.buckets.reduce((s,m)=>(m.selected&&s.push(m.title),s),[]);return e.length===0?null:{attribute:n.attribute,in:e}},U=n=>{var e;switch((e=n.buckets[0])==null?void 0:e.__typename){case"RangeBucket":return le(n);case"ScalarBucket":case"CategoryView":return oe(n)}},ue=n=>{var s,m,p,w,S,g,_,B,v,y,E;const e=n[0];return(p=(m=(s=e==null?void 0:e.price)==null?void 0:s.regular)==null?void 0:m.amount)!=null&&p.currency?e.price.regular.amount.currency:(_=(g=(S=(w=e==null?void 0:e.priceRange)==null?void 0:w.minimum)==null?void 0:S.regular)==null?void 0:g.amount)!=null&&_.currency?(E=(y=(v=(B=e==null?void 0:e.priceRange)==null?void 0:B.minimum)==null?void 0:v.regular)==null?void 0:y.amount)==null?void 0:E.currency:"USD"},de=(n,e,s)=>(e==null?void 0:e.attribute)==="price"?n.from===0?x("div",{style:"display:flex",children:[a(b,{amount:n.from,currency:s||"USD"}),a("span",{style:"padding: 0 2px",children:"-"}),a(b,{amount:n.to,currency:s||"USD"})]}):a(b,{minimumAmount:n.from,maximumAmount:n.to,currency:s||"USD",display:"dash"}):n.title,me=(n,e)=>n.title===ie?`Not ${e.title}`:n.title===se?e.title:n.title,j=(n,e,s)=>{switch(n.__typename){case"RangeBucket":return de(n,e,s);case"ScalarBucket":case"CategoryView":return me(n,e)}},ke=({scope:n,slots:e})=>{const s=q({clearAll:"Search.Facet.clearAll"}),[m,p]=C([]),[w,S]=C(null),[g,_]=C(),[B,v]=C(null),y=J(null),E=t=>{var l;const i=((l=g==null?void 0:g.filter)==null?void 0:l.filter(c=>c.attribute==="categories"))||[];ee({...t,filter:[...i,...t.filter||[]]},{scope:n})},z=t=>{const i=new URLSearchParams(window.location.search);if(!t.length)i.delete("filter");else{const l=t.map(c=>{var r;return c.range?`${c.attribute}:${c.range.from}-${c.range.to}`:(r=c.in)!=null&&r.length?`${c.attribute}:${c.in.join(",")}`:null}).filter(Boolean).join(";");i.set("filter",l)}i.set("page","1"),window.history.replaceState({},"",`${window.location.pathname}?${i.toString()}`)},D=t=>{if(!t||!t.result.facets&&!t.result.items&&!t.request.filter){p([]);return}_(t.request);const{facets:i,items:l}=t.result;S(ue(l));const c=t.request.filter;if(i){const r=i.map(o=>{const h=o.buckets.map(f=>{const u=c==null?void 0:c.find(L=>L.attribute===o.attribute);if(u){const L=u.range;if(L&&f.from===L.from&&f.to===L.to)return{...f,selected:!0};if(u.in&&u.in.includes(f.title))return{...f,selected:!0}}return{...f,selected:!1}});return{...o,buckets:h}});p(r)}},V=t=>{p(i=>{const l=i.map(r=>{const o=t.find(h=>h.attribute===r.attribute);return o||r}),c=l.reduce((r,o)=>{const h=U(o);return h&&r.push(h),r},[]);return v(c),l})},W=(t,i)=>{const l=t.buckets.map(r=>r.title===i?{...r,selected:!1}:r),c={...t,buckets:l};V([c])},Z=()=>{const t=m.map(i=>{const l=i.buckets.map(c=>({...c,selected:!1}));return{...i,buckets:l}});p(t),v([])},O=(t,i)=>{const l=t.target.value,c=t.target.checked;p(r=>{const o=r.find(d=>d.attribute===i);if(!o)return r;const h=o.buckets.map(d=>{var R;return((R=o.buckets[0])==null?void 0:R.__typename)==="RangeBucket"?d.title===l?{...d,selected:c}:{...d,selected:!1}:d.title===l?{...d,selected:c}:{...d}}),f={...o,buckets:h},u=r.map(d=>d.attribute===i?f:d),L=u.reduce((d,R)=>{const T=U(R);return T&&d.push(T),d},[]);return v(L),u})},H=(t,i)=>{const l=a("span",{children:t.title}),c=t.buckets.map(r=>{var f;const o=j(r,t,w),h=u=>x(k,{name:"FacetBucketLabel",slot:e==null?void 0:e.FacetBucketLabel,context:{data:r},children:[o," ",u?`(${u})`:""]});switch((f=t.buckets[0])==null?void 0:f.__typename){case"RangeBucket":return a(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(X,{"data-testid":`${r.title}-radio`,label:h(),name:t.attribute,value:r.title,checked:r.selected,onChange:u=>{O(u,t.attribute)}})});case"ScalarBucket":case"CategoryView":return a(k,{name:"FacetBucket",slot:e==null?void 0:e.FacetBucket,context:{data:r},children:a(Q,{id:`${t.attribute}-${r.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,"data-testid":`${r.title}-checkbox`,label:h(r.count),name:`${t.attribute}-${r.title.replace(/[^a-zA-Z0-9_-]/g,"")}`,value:r.title,checked:r.selected,onChange:u=>{O(u,t.attribute)}})});default:return null}}).filter(r=>r!==null);return a(ce,{header:l,buckets:c,last:i===m.length-1})},Y=()=>a(k,{name:"Facets",slot:e==null?void 0:e.Facets,context:{data:m},children:m.map((t,i)=>t.buckets.length>0?a(N,{children:a(k,{name:"Facet",slot:e==null?void 0:e.Facet,context:{data:t},children:H(t,i)})}):null)}),G=()=>{const t=m.reduce((c,r)=>(r.buckets.filter(h=>h.selected).length>0&&c.push(r),c),[]),i=t.map(c=>c.buckets.map(r=>{if(r.selected){const o=j(r,c,w);return a(A,{"data-testid":`${r.title}-selected-btn`,"aria-label":`Remove ${c.title} filter: ${r.title}`,variant:"secondary",children:x(N,{children:[a("span",{children:o}),a(M,{source:re,size:"16"})]}),onClick:()=>{W(c,r.title)}})}return null})),l=i.length>0?a(A,{variant:"secondary",onClick:()=>{Z()},children:a("span",{children:s.clearAll})}):null;return x(k,{name:"SelectedFacets",slot:e==null?void 0:e.SelectedFacets,context:{data:t},children:[i,l]})};return P(()=>{const t=I.on("search/result",D,{eager:!0,scope:n});return()=>{t==null||t.off()}},[]),P(()=>{if(B!==null)return y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{g&&(z(B),E({...g,filter:B})),v(null)},150),()=>{y.current&&clearTimeout(y.current)}},[B,g]),a(ae,{selectedFacets:G(),facets:Y()})};export{ke as Facets,ke as default};
4
4
  //# sourceMappingURL=Facets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Facets.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Minus.svg","/@dropins/storefront-product-discovery/src/components/Facet/Facet.tsx","/@dropins/storefront-product-discovery/src/components/FacetList/FacetList.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/utils/facetUtils.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/Facets.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Add_Base\", \"data-name\": \"Icon \\\\u2013 Add \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Add_icon\", \"data-name\": \"Add icon\", transform: \"translate(9.734 9.737)\" }, /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_579\", \"data-name\": \"Line 579\", y2: 12.7, transform: \"translate(2.216 -4.087)\", fill: \"none\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_580\", \"data-name\": \"Line 580\", x2: 12.7, transform: \"translate(-4.079 2.263)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgAdd;\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 * as React from \"react\";\nconst SvgMinus = (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: \"M17.3332 11.75H6.6665\", strokeWidth: 1, strokeLinecap: \"square\", strokeLinejoin: \"round\", vectorEffect: \"non-scaling-stroke\", fill: \"none\", stroke: \"currentColor\" }));\nexport default SvgMinus;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/plp/components/Facet/Facet.css';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n last?: boolean;\n} \n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets, last }) => {\n const translations = useText({\n showMore: 'Search.Facet.showMore',\n showLess: 'Search.Facet.showLess',\n });\n const numberOfOptionsShown = numberOfOptionsConfig;\n const [showMore, setShowMore] = useState(buckets.length < numberOfOptionsShown);\n\n const numberOfOptions = showMore ? buckets.length : numberOfOptionsShown;\n\n return (\n <div className={classes(['product-discovery-facet', ['product-discovery-facet--last', last]])}>\n <VComponent className=\"product-discovery-facet__header\" node={header} />\n {buckets.slice(0, numberOfOptions).map((bucket, index) => {\n return <VComponent key={index} className=\"product-discovery-facet__bucket\" node={bucket} />;\n })}\n {!showMore && buckets.length > numberOfOptionsShown && (\n <Button variant=\"tertiary\" icon={<Icon source={Add} size=\"24\" />} onClick={(): void => setShowMore(!showMore)}>\n {translations.showMore}\n </Button>\n )}\n {showMore && buckets.length > numberOfOptionsShown && (\n <Button\n variant=\"tertiary\"\n icon={<Icon source={Minus} size=\"24\" />}\n onClick={(): void => setShowMore(!showMore)}\n >\n {translations.showLess}\n </Button>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/FacetList/FacetList.css';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n return (\n <>\n <VComponent className=\"product-discovery-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent className=\"product-discovery-facet-list__facet-options\" node={facets} />\n </>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { SearchFacet } from '@/plp/data/models/api';\nimport { Product } from '@/plp/data/models/product';\nimport { PriceRange } from '@adobe-commerce/elsie/components';\n\nconst BOOLEAN_NO = 'no';\nconst BOOLEAN_YES = 'yes';\n\nconst getRangeFacetFilter = (facet: SearchFacet) => {\n const selectedRange = facet.buckets.find((bucket) => bucket.selected);\n if (!selectedRange) {\n return null;\n }\n return {\n attribute: facet.attribute,\n range: {\n from: selectedRange.from,\n to: selectedRange.to,\n },\n };\n};\n\nconst getScalarFacetFilter = (facet: SearchFacet) => {\n const scalarSelections = facet.buckets.reduce((accu, curr) => {\n if (curr.selected) {\n accu.push(curr.title);\n }\n return accu;\n }, [] as string[]);\n if (scalarSelections.length === 0) {\n return null;\n }\n return {\n attribute: facet.attribute,\n in: scalarSelections,\n };\n};\n\nconst getFilterSelection = (facet: SearchFacet) => {\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return getRangeFacetFilter(facet);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarFacetFilter(facet);\n default:\n break;\n }\n};\n\nconst getCurrencyType = (items: Product[]) => {\n const firstItem = items[0];\n if (firstItem?.price?.regular?.amount?.currency) {\n return firstItem.price.regular.amount.currency;\n } else if (firstItem?.priceRange?.minimum?.regular?.amount?.currency) {\n return firstItem?.priceRange?.minimum?.regular?.amount?.currency;\n }\n return 'USD'; // Default currency if not found\n};\n\nconst getRangeBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n if (facet?.attribute === 'price') {\n //Temp fix for Price range not handling value when minumum is zero\n if (bucket.from === 0) {\n return (\n <div style={'display:flex'}>\n <PriceRange amount={bucket.from} currency={currency || 'USD'} />\n <span style={'padding: 0 2px'}>{'-'}</span>\n <PriceRange amount={bucket.to} currency={currency || 'USD'} />\n </div>\n );\n }\n return (\n <PriceRange minimumAmount={bucket.from} maximumAmount={bucket.to} currency={currency || 'USD'} display=\"dash\" />\n );\n }\n return bucket.title;\n};\n\nconst getScalarBucketLabel = (bucket: any, facet: SearchFacet) => {\n if (bucket.title === BOOLEAN_NO) {\n return `Not ${facet.title}`;\n } else if (bucket.title === BOOLEAN_YES) {\n return facet.title;\n }\n // For CategoryView buckets, use bucket.name which contains the formatted display name\n // For other buckets, fall back to bucket.title\n return bucket.name || bucket.title;\n};\n\nconst getBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n switch (bucket.__typename) {\n case 'RangeBucket':\n return getRangeBucketLabel(bucket, facet, currency);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarBucketLabel(bucket, facet);\n default:\n break;\n }\n};\n\nexport { getBucketLabel, getCurrencyType, getFilterSelection };\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState, useRef } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket, Scope } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection } from './utils/facetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, Icon, RadioButton } from '@adobe-commerce/elsie/components';\nimport { Facet } from '@/plp/components';\nimport { VNode } from 'preact';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { search } from '@/plp/api';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n slots?: {\n Facet?: SlotProps<{ data: SearchFacet }>;\n SelectedFacets?: SlotProps<{ data: SearchFacet[] }>;\n Facets?: SlotProps<{ data: SearchFacet[] }>;\n FacetBucket?: SlotProps<{ data: FacetBucket }>;\n FacetBucketLabel?: SlotProps<{ data: FacetBucket }>;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ scope, slots }) => {\n const labels = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>();\n const [pendingFilters, setPendingFilters] = useState<SearchFilter[] | null>(null);\n const searchTimeoutRef = useRef<number | null>(null);\n const lastSearchFiltersRef = useRef<SearchFilter[] | null>(null);\n // Map to preserve bucket names (title -> name) across API calls\n const bucketNamesRef = useRef<Map<string, string>>(new Map());\n\n const handleSearchRequest = (searchVariables: SearchVariables): void => {\n // Preserve any existing categoryPath filters from currentSearchVariables\n const existingCategoryPathFilters = currentSearchVariables?.filter?.filter(\n (filter) => filter.attribute === 'categoryPath'\n ) || [];\n\n const finalFilters = [...existingCategoryPathFilters, ...(searchVariables.filter || [])];\n \n // Track what filters we're sending so we can match the response\n lastSearchFiltersRef.current = finalFilters;\n\n search({\n ...searchVariables,\n filter: finalFilters\n }, { scope, replaceFilters: true }); // Use replaceFilters to avoid merging with URL filters\n };\n \n\n const handleSearchResult = (payload: { result: ProductSearchResult; request: SearchVariables }): void => {\n if (!payload || (!payload.result.facets && !payload.result.items && !payload.request.filter)) {\n setFacetList([]);\n return;\n }\n\n // If we have pending filter changes, check if this result matches what we sent\n // If it does, process it and clear pending. If not, ignore it to avoid race conditions.\n if (pendingFilters !== null && lastSearchFiltersRef.current !== null) {\n const resultMatchesLastSearch = JSON.stringify(payload.request.filter) === JSON.stringify(lastSearchFiltersRef.current);\n \n if (!resultMatchesLastSearch) {\n // This is an old result, ignore it\n return;\n }\n // This matches our last search, clear pending state\n setPendingFilters(null);\n lastSearchFiltersRef.current = null;\n }\n\n setCurrentSearchVariables(payload.request);\n\n const { facets, items } = payload.result;\n\n setCurrency(getCurrencyType(items));\n\n const filterList = payload.request.filter;\n\n if (facets) {\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n // Get the previous version of this facet to look up bucket names\n const previousFacet = facetList.find(f => f.attribute === facet.attribute);\n \n const selectedBuckets = facet.buckets.map((bucket) => {\n // Store bucket names in the ref map for future use\n if (bucket.name && bucket.title) {\n bucketNamesRef.current.set(bucket.title, bucket.name);\n }\n \n // Try to find this bucket in the previous facet state to preserve the name\n const previousBucket = previousFacet?.buckets.find(b => b.title === bucket.title);\n \n // If bucket doesn't have a name, try to get it from:\n // 1. Previous bucket state\n // 2. Our persistent name map\n const enrichedBucket = !bucket.name\n ? { \n ...bucket, \n name: previousBucket?.name || bucketNamesRef.current.get(bucket.title)\n }\n : bucket;\n \n const selectedFilter = filterList?.find((filter) => filter.attribute === facet.attribute);\n if (selectedFilter) {\n const selectedRange = selectedFilter.range;\n if (selectedRange && enrichedBucket.from === selectedRange.from && enrichedBucket.to === selectedRange.to) {\n return { ...enrichedBucket, selected: true };\n } else if (selectedFilter.in && selectedFilter.in.includes(enrichedBucket.title)) {\n return { ...enrichedBucket, selected: true };\n }\n }\n return { ...enrichedBucket, selected: false };\n });\n \n // For categories facet, ensure filtered categories are visible even if API didn't return them\n let finalBuckets = selectedBuckets;\n if (facet.attribute === 'categories') {\n const categoriesFilter = filterList?.find(f => f.attribute === 'categories');\n if (categoriesFilter?.in && categoriesFilter.in.length > 0) {\n const bucketTitles = new Set(selectedBuckets.map(b => b.title));\n const missingFilteredCategories = categoriesFilter.in.filter(cat => !bucketTitles.has(cat));\n \n if (missingFilteredCategories.length > 0) {\n // Create buckets for missing filtered categories using data from previous state\n const additionalBuckets = missingFilteredCategories.map(cat => {\n const previousBucket = previousFacet?.buckets.find(b => b.title === cat);\n if (previousBucket) {\n // Use the full previous bucket data\n return { ...previousBucket, selected: true, count: 0 };\n }\n // Fallback: create minimal bucket (should rarely happen)\n return {\n title: cat,\n __typename: 'CategoryView',\n name: bucketNamesRef.current.get(cat),\n count: 0,\n path: cat,\n selected: true\n } as any;\n });\n finalBuckets = [...additionalBuckets, ...selectedBuckets];\n }\n }\n }\n \n return { ...facet, buckets: finalBuckets };\n });\n\n setFacetList(facetsWithSelections);\n } else {\n // Handle case where API returns no facets but we have filtered categories\n // We need to preserve the filtered categories so they remain visible\n const categoriesFilter = filterList?.find(f => f.attribute === 'categories');\n if (categoriesFilter?.in && categoriesFilter.in.length > 0 && facetList.length > 0) {\n // Keep the existing facet list with updated selection state\n const updatedFacetList = facetList.map(facet => {\n if (facet.attribute === 'categories') {\n const updatedBuckets = facet.buckets.map(bucket => ({\n ...bucket,\n selected: categoriesFilter.in?.includes(bucket.title) || false\n }));\n return { ...facet, buckets: updatedBuckets };\n }\n return facet;\n });\n setFacetList(updatedFacetList);\n }\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n // Use functional update to ensure we're working with latest state\n setFacetList(currentFacetList => {\n const updatedFacetList = currentFacetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selectedFilterList from the updated facet list\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n return { ...bucket, selected: false };\n }\n return bucket;\n });\n const newFacet = { ...facet, buckets: newBuckets };\n updateFacetSelections([newFacet]);\n };\n\n const clearAllSelections = (): void => {\n const updatedFacetList = facetList.map((facet) => {\n const updatedBuckets = facet.buckets.map((bucket) => {\n return { ...bucket, selected: false };\n });\n return { ...facet, buckets: updatedBuckets };\n });\n setFacetList(updatedFacetList);\n // Queue the search request with empty filters\n setPendingFilters([]);\n };\n\n const changeFilter = (event: any, facetAttribute: string): void => {\n const clickedValue = event.target.value;\n const isChecked = event.target.checked;\n \n // Use functional update to work with latest state\n setFacetList(currentFacetList => {\n const currentFacet = currentFacetList.find(f => f.attribute === facetAttribute);\n if (!currentFacet) {\n return currentFacetList;\n }\n \n const newBuckets = currentFacet.buckets.map((bucket) => {\n if (currentFacet.buckets[0]?.__typename === 'RangeBucket') {\n // For range buckets (radio buttons), only one can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n return { ...bucket, selected: false };\n }\n // For scalar buckets (checkboxes), multiple can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n // Keep other buckets as-is, but create new objects to maintain immutability\n return { ...bucket };\n });\n \n const newFacet = { ...currentFacet, buckets: newBuckets };\n \n // Update the facet list with the new facet\n const updatedFacetList = currentFacetList.map((f) => {\n if (f.attribute === facetAttribute) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selected filters - will trigger search via useEffect\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const getFacetNode = (facet: SearchFacet, index: number): VNode => {\n const header = <span>{facet.title}</span>;\n const buckets = facet.buckets\n .map((bucket: FacetBucket) => {\n const bucketLabel = getBucketLabel(bucket, facet, currency);\n\n const renderedBucketLabel = (count?: number) => (\n <Slot name=\"FacetBucketLabel\"\n slot={slots?.FacetBucketLabel}\n context={{ data: bucket }}>\n {bucketLabel} {count ? `(${count})` : ''}\n </Slot>\n );\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n \n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={renderedBucketLabel()}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n case 'ScalarBucket':\n case 'CategoryView':\n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <Checkbox\n id={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n data-testid={`${bucket.title}-checkbox`}\n label={renderedBucketLabel(bucket.selected ? undefined : bucket.count)}\n name={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n default:\n return null;\n }\n })\n .filter((bucket) => bucket !== null);\n\n return <Facet header={header} buckets={buckets} last={index === facetList.length - 1} />\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet, index) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet, index)}\n </Slot>\n </>\n ) as VNode)\n : null;\n })}\n </Slot>\n );\n };\n\n const getSelectedFacetsNode = (): VNode => {\n const selectedFacets = facetList.reduce((accu, curr) => {\n const selected = curr.buckets.filter((bucket: FacetBucket) => bucket.selected);\n if (selected.length > 0) {\n accu.push(curr);\n }\n return accu;\n }, [] as SearchFacet[]);\n const selectedFilterBtns = selectedFacets.map((facet) => {\n return facet.buckets.map((bucket) => {\n if (bucket.selected) {\n const bucketTitle = getBucketLabel(bucket, facet, currency);\n return (\n <Button\n data-testid={`${bucket.title}-selected-btn`}\n aria-label={`Remove ${facet.title} filter: ${bucketTitle}`}\n variant=\"secondary\"\n children={\n <>\n <span>{bucketTitle}</span>\n <Icon source={Close} size=\"16\" />\n </>\n }\n onClick={(): void => {\n handleCancelSelection(facet, bucket.title);\n }}\n />\n ) as VNode;\n }\n return null;\n });\n });\n\n const clearAllBtn =\n selectedFilterBtns.length > 0 ? (\n <Button\n variant=\"secondary\"\n onClick={(): void => {\n clearAllSelections();\n }}\n >\n <span>{labels.clearAll}</span>\n </Button>\n ) : null;\n return (\n <Slot name=\"SelectedFacets\" slot={slots?.SelectedFacets} context={{ data: selectedFacets }}>\n {selectedFilterBtns}\n {clearAllBtn}\n </Slot>\n );\n };\n\n useEffect(() => {\n const dataEvents = events.on('search/result', handleSearchResult, { eager: true, scope });\n\n return () => {\n dataEvents?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scope]);\n\n // debounce search\n useEffect(() => {\n if (pendingFilters === null) {\n return;\n }\n\n // Clear any existing timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce search requests to avoid too many API calls\n searchTimeoutRef.current = setTimeout(() => {\n if (currentSearchVariables) {\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters });\n }\n }, 150);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingFilters]); // Remove currentSearchVariables to avoid loop\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","last","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsxs","classes","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","Fragment","BOOLEAN_NO","BOOLEAN_YES","getRangeFacetFilter","facet","selectedRange","getScalarFacetFilter","scalarSelections","accu","curr","getFilterSelection","_a","getCurrencyType","items","firstItem","_c","_b","_g","_f","_e","_d","_k","_j","_i","_h","getRangeBucketLabel","currency","PriceRange","getScalarBucketLabel","getBucketLabel","Facets","scope","slots","labels","facetList","setFacetList","setCurrency","currentSearchVariables","setCurrentSearchVariables","pendingFilters","setPendingFilters","searchTimeoutRef","useRef","lastSearchFiltersRef","bucketNamesRef","handleSearchRequest","searchVariables","finalFilters","filter","search","handleSearchResult","payload","filterList","facetsWithSelections","previousFacet","f","selectedBuckets","previousBucket","b","enrichedBucket","selectedFilter","finalBuckets","categoriesFilter","bucketTitles","missingFilteredCategories","cat","updatedFacetList","updatedBuckets","updateFacetSelections","currentFacetList","newFacet","selectedFilterList","handleCancelSelection","title","newBuckets","clearAllSelections","changeFilter","event","facetAttribute","clickedValue","isChecked","currentFacet","getFacetNode","bucketLabel","renderedBucketLabel","count","Slot","RadioButton","Checkbox","getFacetsNode","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect","dataEvents","events"],"mappings":"ssBACA,MAAMA,GAAUC,GAA0BC,EAAM,cAAc,MAAO,CAAE,GAAI,gBAAiB,YAAa,gCAAiC,MAAO,6BAA8B,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,GAAGD,GAAyBC,EAAM,cAAc,IAAK,CAAE,GAAI,OAAO,EAAoBA,EAAM,cAAc,OAAQ,CAAE,GAAI,iBAAkB,YAAa,iBAAkB,MAAO,GAAI,OAAQ,GAAI,KAAM,OAAQ,QAAS,CAAC,CAAE,EAAmBA,EAAM,cAAc,IAAK,CAAE,GAAI,WAAY,YAAa,WAAY,UAAW,wBAAwB,EAAoBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,GAAI,WAAY,YAAa,WAAY,GAAI,KAAM,UAAW,0BAA2B,KAAM,OAAQ,OAAQ,cAAc,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,GAAI,WAAY,YAAa,WAAY,GAAI,KAAM,UAAW,0BAA2B,KAAM,OAAQ,OAAQ,eAAgB,CAAC,CAAC,CAAC,ECAt9BC,GAAYF,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,iCAAkC,OAAQ,cAAc,CAAE,EAAmBA,EAAM,cAAc,OAAQ,CAAE,aAAc,qBAAsB,EAAG,iCAAkC,OAAQ,cAAc,CAAE,CAAC,ECAjdE,GAAYH,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAK,EAAoBC,EAAM,cAAc,OAAQ,CAAE,EAAG,wBAAyB,YAAa,EAAG,cAAe,SAAU,eAAgB,QAAS,aAAc,qBAAsB,KAAM,OAAQ,OAAQ,cAAc,CAAE,CAAC,EC+B/XG,GAAuC,CAAC,CAAE,sBAAAC,EAAwB,EAAG,OAAAC,EAAQ,QAAAC,EAAS,KAAAC,KAAW,CAC5G,MAAMC,EAAeC,EAAQ,CAC3B,SAAU,wBACV,SAAU,uBAAA,CACX,EACKC,EAAuBN,EACvB,CAACO,EAAUC,CAAW,EAAIC,EAASP,EAAQ,OAASI,CAAoB,EAExEI,EAAkBH,EAAWL,EAAQ,OAASI,EAEpD,OACEK,EAAC,MAAA,CAAI,UAAWC,GAAQ,CAAC,0BAA2B,CAAC,gCAAiCT,CAAI,CAAC,CAAC,EAC1F,SAAA,CAAAU,EAACC,EAAA,CAAW,UAAU,kCAAkC,KAAMb,EAAQ,EACrEC,EAAQ,MAAM,EAAGQ,CAAe,EAAE,IAAI,CAACK,EAAQC,MACtCF,EAAA,CAAuB,UAAU,kCAAkC,KAAMC,GAAzDC,CAAiE,CAC1F,EACA,CAACT,GAAYL,EAAQ,OAASI,KAC5BW,EAAA,CAAO,QAAQ,WAAW,KAAMJ,EAACK,EAAA,CAAK,OAAQC,GAAK,KAAK,IAAA,CAAK,EAAI,QAAS,IAAYX,EAAY,CAACD,CAAQ,EACzG,SAAAH,EAAa,QAAA,CAChB,EAEDG,GAAYL,EAAQ,OAASI,GAC5BO,EAACI,EAAA,CACC,QAAQ,WACR,KAAMJ,EAACK,EAAA,CAAK,OAAQE,GAAO,KAAK,KAAK,EACrC,QAAS,IAAYZ,EAAY,CAACD,CAAQ,EAEzC,SAAAH,EAAa,QAAA,CAAA,CAChB,EAEJ,CAEJ,ECrCaiB,GAA+C,CAAC,CAAE,eAAAC,EAAgB,OAAAC,KAE3EZ,EAAAa,EAAA,CACE,SAAA,CAAAX,EAACC,EAAA,CAAW,UAAU,iDAAiD,KAAMQ,EAAgB,EAC7FT,EAACC,EAAA,CAAW,UAAU,8CAA8C,KAAMS,CAAA,CAAQ,CAAA,EACpF,ECXEE,GAAa,KACbC,GAAc,MAEdC,GAAuBC,GAAuB,CAClD,MAAMC,EAAgBD,EAAM,QAAQ,KAAMb,GAAWA,EAAO,QAAQ,EACpE,OAAKc,EAGE,CACL,UAAWD,EAAM,UACjB,MAAO,CACL,KAAMC,EAAc,KACpB,GAAIA,EAAc,EAAA,CACpB,EAPO,IASX,EAEMC,GAAwBF,GAAuB,CACnD,MAAMG,EAAmBH,EAAM,QAAQ,OAAO,CAACI,EAAMC,KAC/CA,EAAK,UACPD,EAAK,KAAKC,EAAK,KAAK,EAEfD,GACN,CAAA,CAAc,EACjB,OAAID,EAAiB,SAAW,EACvB,KAEF,CACL,UAAWH,EAAM,UACjB,GAAIG,CAAA,CAER,EAEMG,EAAsBN,GAAuB,OACjD,QAAQO,EAAAP,EAAM,QAAQ,CAAC,IAAf,YAAAO,EAAkB,WAAA,CACxB,IAAK,cACH,OAAOR,GAAoBC,CAAK,EAClC,IAAK,eACL,IAAK,eACH,OAAOE,GAAqBF,CAAK,CAEjC,CAEN,EAEMQ,GAAmBC,GAAqB,2BAC5C,MAAMC,EAAYD,EAAM,CAAC,EACzB,OAAIE,GAAAC,GAAAL,EAAAG,GAAA,YAAAA,EAAW,QAAX,YAAAH,EAAkB,UAAlB,YAAAK,EAA2B,SAA3B,MAAAD,EAAmC,SAC9BD,EAAU,MAAM,QAAQ,OAAO,UAC7BG,GAAAC,GAAAC,GAAAC,EAAAN,GAAA,YAAAA,EAAW,aAAX,YAAAM,EAAuB,UAAvB,YAAAD,EAAgC,UAAhC,YAAAD,EAAyC,SAAzC,MAAAD,EAAiD,UACnDI,GAAAC,GAAAC,GAAAC,EAAAV,GAAA,YAAAA,EAAW,aAAX,YAAAU,EAAuB,UAAvB,YAAAD,EAAgC,UAAhC,YAAAD,EAAyC,SAAzC,YAAAD,EAAiD,SAEnD,KACT,EAEMI,GAAsB,CAAClC,EAAaa,EAAoBsB,KACxDtB,GAAA,YAAAA,EAAO,aAAc,QAEnBb,EAAO,OAAS,EAEhBJ,EAAC,MAAA,CAAI,MAAO,eACV,SAAA,CAAAE,EAACsC,GAAW,OAAQpC,EAAO,KAAM,SAAUmC,GAAY,MAAO,EAC9DrC,EAAC,OAAA,CAAK,MAAO,iBAAmB,SAAA,IAAI,IACnCsC,EAAA,CAAW,OAAQpC,EAAO,GAAI,SAAUmC,GAAY,KAAA,CAAO,CAAA,EAC9D,EAIFrC,EAACsC,EAAA,CAAW,cAAepC,EAAO,KAAM,cAAeA,EAAO,GAAI,SAAUmC,GAAY,MAAO,QAAQ,MAAA,CAAO,EAG3GnC,EAAO,MAGVqC,GAAuB,CAACrC,EAAaa,IACrCb,EAAO,QAAUU,GACZ,OAAOG,EAAM,KAAK,GAChBb,EAAO,QAAUW,GACnBE,EAAM,MAIRb,EAAO,MAAQA,EAAO,MAGzBsC,EAAiB,CAACtC,EAAaa,EAAoBsB,IAA4B,CACnF,OAAQnC,EAAO,WAAA,CACb,IAAK,cACH,OAAOkC,GAAoBlC,EAAQa,EAAOsB,CAAQ,EACpD,IAAK,eACL,IAAK,eACH,OAAOE,GAAqBrC,EAAQa,CAAK,CAEzC,CAEN,EC3Ea0B,GAAiC,CAAC,CAAE,MAAAC,EAAO,MAAAC,KAAY,CAClE,MAAMC,EAASpD,EAAQ,CACrB,SAAU,uBAAA,CACX,EAEK,CAACqD,EAAWC,CAAY,EAAIlD,EAAwB,CAAA,CAAE,EACtD,CAACyC,EAAUU,CAAW,EAAInD,EAAwB,IAAI,EACtD,CAACoD,EAAwBC,CAAyB,EAAIrD,EAAA,EACtD,CAACsD,EAAgBC,CAAiB,EAAIvD,EAAgC,IAAI,EAC1EwD,EAAmBC,EAAsB,IAAI,EAC7CC,EAAuBD,EAA8B,IAAI,EAEzDE,EAAiBF,EAA4B,IAAI,GAAK,EAEtDG,EAAuBC,GAA2C,OAMtE,MAAMC,EAAe,CAAC,KAJcpC,EAAA0B,GAAA,YAAAA,EAAwB,SAAxB,YAAA1B,EAAgC,OACjEqC,GAAWA,EAAO,YAAc,kBAC9B,CAAA,EAEiD,GAAIF,EAAgB,QAAU,EAAG,EAGvFH,EAAqB,QAAUI,EAE/BE,GAAO,CACL,GAAGH,EACH,OAAQC,CAAA,EACP,CAAE,MAAAhB,EAAO,eAAgB,GAAM,CACpC,EAGMmB,EAAsBC,GAA6E,CACvG,GAAI,CAACA,GAAY,CAACA,EAAQ,OAAO,QAAU,CAACA,EAAQ,OAAO,OAAS,CAACA,EAAQ,QAAQ,OAAS,CAC5FhB,EAAa,CAAA,CAAE,EACf,MACF,CAIA,GAAII,IAAmB,MAAQI,EAAqB,UAAY,KAAM,CAGpE,GAAI,EAF4B,KAAK,UAAUQ,EAAQ,QAAQ,MAAM,IAAM,KAAK,UAAUR,EAAqB,OAAO,GAIpH,OAGFH,EAAkB,IAAI,EACtBG,EAAqB,QAAU,IACjC,CAEAL,EAA0Ba,EAAQ,OAAO,EAEzC,KAAM,CAAE,OAAApD,EAAQ,MAAAc,CAAA,EAAUsC,EAAQ,OAElCf,EAAYxB,GAAgBC,CAAK,CAAC,EAElC,MAAMuC,EAAaD,EAAQ,QAAQ,OAEnC,GAAIpD,EAAQ,CACV,MAAMsD,EAAuBtD,EAAO,IAAKK,GAAuB,CAE9D,MAAMkD,EAAgBpB,EAAU,QAAUqB,EAAE,YAAcnD,EAAM,SAAS,EAEnEoD,EAAkBpD,EAAM,QAAQ,IAAKb,GAAW,CAEhDA,EAAO,MAAQA,EAAO,OACxBqD,EAAe,QAAQ,IAAIrD,EAAO,MAAOA,EAAO,IAAI,EAItD,MAAMkE,EAAiBH,GAAA,YAAAA,EAAe,QAAQ,QAAUI,EAAE,QAAUnE,EAAO,OAKrEoE,EAAkBpE,EAAO,KAK3BA,EAJA,CACE,GAAGA,EACH,MAAMkE,GAAA,YAAAA,EAAgB,OAAQb,EAAe,QAAQ,IAAIrD,EAAO,KAAK,CAAA,EAIrEqE,EAAiBR,GAAA,YAAAA,EAAY,KAAMJ,GAAWA,EAAO,YAAc5C,EAAM,WAC/E,GAAIwD,EAAgB,CAClB,MAAMvD,EAAgBuD,EAAe,MACrC,GAAIvD,GAAiBsD,EAAe,OAAStD,EAAc,MAAQsD,EAAe,KAAOtD,EAAc,GACrG,MAAO,CAAE,GAAGsD,EAAgB,SAAU,EAAA,EACxC,GAAWC,EAAe,IAAMA,EAAe,GAAG,SAASD,EAAe,KAAK,EAC7E,MAAO,CAAE,GAAGA,EAAgB,SAAU,EAAA,CAE1C,CACA,MAAO,CAAE,GAAGA,EAAgB,SAAU,EAAA,CACxC,CAAC,EAGD,IAAIE,EAAeL,EACnB,GAAIpD,EAAM,YAAc,aAAc,CACpC,MAAM0D,EAAmBV,GAAA,YAAAA,EAAY,KAAKG,GAAKA,EAAE,YAAc,cAC/D,GAAIO,GAAA,MAAAA,EAAkB,IAAMA,EAAiB,GAAG,OAAS,EAAG,CAC1D,MAAMC,EAAe,IAAI,IAAIP,EAAgB,IAAIE,GAAKA,EAAE,KAAK,CAAC,EACxDM,EAA4BF,EAAiB,GAAG,UAAc,CAACC,EAAa,IAAIE,CAAG,CAAC,EAEtFD,EAA0B,OAAS,IAkBrCH,EAAe,CAAC,GAhBUG,EAA0B,IAAIC,GAAO,CAC7D,MAAMR,EAAiBH,GAAA,YAAAA,EAAe,QAAQ,KAAKI,GAAKA,EAAE,QAAUO,GACpE,OAAIR,EAEK,CAAE,GAAGA,EAAgB,SAAU,GAAM,MAAO,CAAA,EAG9C,CACL,MAAOQ,EACP,WAAY,eACZ,KAAMrB,EAAe,QAAQ,IAAIqB,CAAG,EACpC,MAAO,EACP,KAAMA,EACN,SAAU,EAAA,CAEd,CAAC,EACqC,GAAGT,CAAe,EAE5D,CACF,CAEA,MAAO,CAAE,GAAGpD,EAAO,QAASyD,CAAA,CAC9B,CAAC,EAED1B,EAAakB,CAAoB,CACnC,KAAO,CAGL,MAAMS,EAAmBV,GAAA,YAAAA,EAAY,KAAKG,GAAKA,EAAE,YAAc,cAC/D,GAAIO,GAAA,MAAAA,EAAkB,IAAMA,EAAiB,GAAG,OAAS,GAAK5B,EAAU,OAAS,EAAG,CAElF,MAAMgC,EAAmBhC,EAAU,IAAI9B,GAAS,CAC9C,GAAIA,EAAM,YAAc,aAAc,CACpC,MAAM+D,EAAiB/D,EAAM,QAAQ,IAAIb,GAAA,OAAW,OAClD,GAAGA,EACH,WAAUoB,EAAAmD,EAAiB,KAAjB,YAAAnD,EAAqB,SAASpB,EAAO,SAAU,EAAA,EACzD,EACF,MAAO,CAAE,GAAGa,EAAO,QAAS+D,CAAA,CAC9B,CACA,OAAO/D,CACT,CAAC,EACD+B,EAAa+B,CAAgB,CAC/B,CACF,CACF,EAEME,EAAyBrE,GAAgC,CAE7DoC,EAAakC,GAAoB,CAC/B,MAAMH,EAAmBG,EAAiB,IAAKd,GAAM,CACnD,MAAMe,EAAWvE,EAAO,KAAMK,GAAUA,EAAM,YAAcmD,EAAE,SAAS,EACvE,OAAIe,GAGGf,CACT,CAAC,EAGKgB,EAAqBL,EAAiB,OAAO,CAAC1D,EAAsBJ,IAAuB,CAC/F,MAAMwD,EAAiBlD,EAAmBN,CAAK,EAC/C,OAAIwD,GACFpD,EAAK,KAAKoD,CAA8B,EAEnCpD,CACT,EAAG,CAAA,CAAoB,EAGvB,OAAAgC,EAAkB+B,CAAkB,EAE7BL,CACT,CAAC,CACH,EAEMM,EAAwB,CAACpE,EAAoBqE,IAAwB,CACzE,MAAMC,EAAatE,EAAM,QAAQ,IAAKb,GAChCA,EAAO,QAAUkF,EACZ,CAAE,GAAGlF,EAAQ,SAAU,EAAA,EAEzBA,CACR,EACK+E,EAAW,CAAE,GAAGlE,EAAO,QAASsE,CAAA,EACtCN,EAAsB,CAACE,CAAQ,CAAC,CAClC,EAEMK,EAAqB,IAAY,CACrC,MAAMT,EAAmBhC,EAAU,IAAK9B,GAAU,CAChD,MAAM+D,EAAiB/D,EAAM,QAAQ,IAAKb,IACjC,CAAE,GAAGA,EAAQ,SAAU,EAAA,EAC/B,EACD,MAAO,CAAE,GAAGa,EAAO,QAAS+D,CAAA,CAC9B,CAAC,EACDhC,EAAa+B,CAAgB,EAE7B1B,EAAkB,CAAA,CAAE,CACtB,EAEMoC,EAAe,CAACC,EAAYC,IAAiC,CACjE,MAAMC,EAAeF,EAAM,OAAO,MAC5BG,EAAYH,EAAM,OAAO,QAG/B1C,EAAakC,GAAoB,CAC/B,MAAMY,EAAeZ,EAAiB,KAAKd,GAAKA,EAAE,YAAcuB,CAAc,EAC9E,GAAI,CAACG,EACH,OAAOZ,EAGT,MAAMK,EAAaO,EAAa,QAAQ,IAAK1F,GAAW,OACtD,QAAIoB,EAAAsE,EAAa,QAAQ,CAAC,IAAtB,YAAAtE,EAAyB,cAAe,cAEtCpB,EAAO,QAAUwF,EACZ,CAAE,GAAGxF,EAAQ,SAAUyF,CAAA,EAEzB,CAAE,GAAGzF,EAAQ,SAAU,EAAA,EAG5BA,EAAO,QAAUwF,EACZ,CAAE,GAAGxF,EAAQ,SAAUyF,CAAA,EAGzB,CAAE,GAAGzF,CAAA,CACd,CAAC,EAEK+E,EAAW,CAAE,GAAGW,EAAc,QAASP,CAAA,EAGvCR,EAAmBG,EAAiB,IAAKd,GACzCA,EAAE,YAAcuB,EACXR,EAEFf,CACR,EAGKgB,EAAqBL,EAAiB,OAAO,CAAC1D,EAAsBJ,IAAuB,CAC/F,MAAMwD,EAAiBlD,EAAmBN,CAAK,EAC/C,OAAIwD,GACFpD,EAAK,KAAKoD,CAA8B,EAEnCpD,CACT,EAAG,CAAA,CAAoB,EAGvB,OAAAgC,EAAkB+B,CAAkB,EAE7BL,CACT,CAAC,CACH,EAEMgB,EAAe,CAAC9E,EAAoBZ,IAAyB,CACjE,MAAMf,EAASY,EAAC,OAAA,CAAM,SAAAe,EAAM,MAAM,EAC5B1B,EAAU0B,EAAM,QACnB,IAAKb,GAAwB,OAC5B,MAAM4F,EAActD,EAAetC,EAAQa,EAAOsB,CAAQ,EAEpD0D,EAAuBC,GAC3BlG,EAACmG,EAAA,CAAK,KAAK,mBACT,KAAMtD,GAAA,YAAAA,EAAO,iBACb,QAAS,CAAE,KAAMzC,CAAA,EAChB,SAAA,CAAA4F,EAAY,IAAEE,EAAQ,IAAIA,CAAK,IAAM,EAAA,CAAA,CAAA,EAG1C,QAAQ1E,EAAAP,EAAM,QAAQ,CAAC,IAAf,YAAAO,EAAkB,WAAA,CACxB,IAAK,cAEH,OACEtB,EAACiG,EAAA,CAAK,KAAK,cAAc,KAAMtD,GAAA,YAAAA,EAAO,YAAa,QAAS,CAAE,KAAMzC,CAAA,EAClE,SAAAF,EAACkG,GAAA,CACC,cAAa,GAAGhG,EAAO,KAAK,SAC5B,MAAO6F,EAAA,EACP,KAAMhF,EAAM,UACZ,MAAOb,EAAO,MACd,QAASA,EAAO,SAChB,SAAWsF,GAAgB,CACzBD,EAAaC,EAAOzE,EAAM,SAAS,CACrC,CAAA,CAAA,EAEJ,EAEJ,IAAK,eACL,IAAK,eACH,OACEf,EAACiG,EAAA,CAAK,KAAK,cAAc,KAAMtD,GAAA,YAAAA,EAAO,YAAa,QAAS,CAAE,KAAMzC,CAAA,EAClE,SAAAF,EAACmG,GAAA,CACC,GAAI,GAAGpF,EAAM,SAAS,IAAIb,EAAO,MAAM,QAAQ,kBAAmB,EAAE,CAAC,GACrE,cAAa,GAAGA,EAAO,KAAK,YAC5B,MAAO6F,EAAoB7F,EAAO,SAAW,OAAYA,EAAO,KAAK,EACrE,KAAM,GAAGa,EAAM,SAAS,IAAIb,EAAO,MAAM,QAAQ,kBAAmB,EAAE,CAAC,GACvE,MAAOA,EAAO,MACd,QAASA,EAAO,SAChB,SAAWsF,GAAgB,CACzBD,EAAaC,EAAOzE,EAAM,SAAS,CACrC,CAAA,CAAA,EAEJ,EAEJ,QACE,OAAO,IAAA,CAEb,CAAC,EACA,OAAQb,GAAWA,IAAW,IAAI,EAErC,OAAOF,EAACd,IAAM,OAAAE,EAAgB,QAAAC,EAAkB,KAAMc,IAAU0C,EAAU,OAAS,EAAG,CACxF,EAEMuD,EAAgB,MAEjBH,EAAA,CAAK,KAAK,SAAS,KAAMtD,GAAA,YAAAA,EAAO,OAAQ,QAAS,CAAE,KAAME,GACvD,SAAAA,EAAU,IAAI,CAAC9B,EAAOZ,IACdY,EAAM,QAAQ,OAAS,OAGxB,SAAAf,EAACiG,EAAA,CAAK,KAAK,QAAQ,KAAMtD,GAAA,YAAAA,EAAO,MAAO,QAAS,CAAE,KAAM5B,CAAA,EACrD,WAAaA,EAAOZ,CAAK,EAC5B,CAAA,CACF,EAEA,IACL,CAAA,CACH,EAIEkG,EAAwB,IAAa,CACzC,MAAM5F,EAAiBoC,EAAU,OAAO,CAAC1B,EAAMC,KAC5BA,EAAK,QAAQ,OAAQlB,GAAwBA,EAAO,QAAQ,EAChE,OAAS,GACpBiB,EAAK,KAAKC,CAAI,EAETD,GACN,CAAA,CAAmB,EAChBmF,EAAqB7F,EAAe,IAAKM,GACtCA,EAAM,QAAQ,IAAKb,GAAW,CACnC,GAAIA,EAAO,SAAU,CACnB,MAAMqG,EAAc/D,EAAetC,EAAQa,EAAOsB,CAAQ,EAC1D,OACErC,EAACI,EAAA,CACC,cAAa,GAAGF,EAAO,KAAK,gBAC5B,aAAY,UAAUa,EAAM,KAAK,YAAYwF,CAAW,GACxD,QAAQ,YACR,SACEzG,EAAAa,EAAA,CACE,SAAA,CAAAX,EAAC,QAAM,SAAAuG,CAAA,CAAY,EACnBvG,EAACK,EAAA,CAAK,OAAQmG,GAAO,KAAK,IAAA,CAAK,CAAA,EACjC,EAEF,QAAS,IAAY,CACnBrB,EAAsBpE,EAAOb,EAAO,KAAK,CAC3C,CAAA,CAAA,CAGN,CACA,OAAO,IACT,CAAC,CACF,EAEKuG,EACJH,EAAmB,OAAS,EAC1BtG,EAACI,EAAA,CACC,QAAQ,YACR,QAAS,IAAY,CACnBkF,EAAA,CACF,EAEA,SAAAtF,EAAC,OAAA,CAAM,SAAA4C,EAAO,QAAA,CAAS,CAAA,CAAA,EAEvB,KACN,OACE9C,EAACmG,EAAA,CAAK,KAAK,iBAAiB,KAAMtD,GAAA,YAAAA,EAAO,eAAgB,QAAS,CAAE,KAAMlC,CAAA,EACvE,SAAA,CAAA6F,EACAG,CAAA,EACH,CAEJ,EAEA,OAAAC,EAAU,IAAM,CACd,MAAMC,EAAaC,GAAO,GAAG,gBAAiB/C,EAAoB,CAAE,MAAO,GAAM,MAAAnB,EAAO,EAExF,MAAO,IAAM,CACXiE,GAAA,MAAAA,EAAY,KACd,CAEF,EAAG,CAACjE,CAAK,CAAC,EAGVgE,EAAU,IAAM,CACd,GAAIxD,IAAmB,KAKvB,OAAIE,EAAiB,SACnB,aAAaA,EAAiB,OAAO,EAIvCA,EAAiB,QAAU,WAAW,IAAM,CACtCJ,GACFQ,EAAoB,CAAE,GAAGR,EAAwB,OAAQE,EAAgB,CAE7E,EAAG,GAAG,EAEC,IAAM,CACPE,EAAiB,SACnB,aAAaA,EAAiB,OAAO,CAEzC,CAEF,EAAG,CAACF,CAAc,CAAC,IAEX1C,GAAA,CAAU,eAAgB6F,IAAyB,OAAQD,IAAiB,CACtF","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"Facets.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Add.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Close.svg","../../node_modules/@adobe-commerce/elsie/src/icons/Minus.svg","/@dropins/storefront-product-discovery/src/components/Facet/Facet.tsx","/@dropins/storefront-product-discovery/src/components/FacetList/FacetList.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/utils/facetUtils.tsx","/@dropins/storefront-product-discovery/src/containers/Facets/Facets.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Add_Base\", \"data-name\": \"Icon \\\\u2013 Add \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Add_icon\", \"data-name\": \"Add icon\", transform: \"translate(9.734 9.737)\" }, /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_579\", \"data-name\": \"Line 579\", y2: 12.7, transform: \"translate(2.216 -4.087)\", fill: \"none\", stroke: \"currentColor\" }), /* @__PURE__ */ React.createElement(\"line\", { vectorEffect: \"non-scaling-stroke\", id: \"Line_580\", \"data-name\": \"Line 580\", x2: 12.7, transform: \"translate(-4.079 2.263)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgAdd;\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 * as React from \"react\";\nconst SvgMinus = (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: \"M17.3332 11.75H6.6665\", strokeWidth: 1, strokeLinecap: \"square\", strokeLinejoin: \"round\", vectorEffect: \"non-scaling-stroke\", fill: \"none\", stroke: \"currentColor\" }));\nexport default SvgMinus;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { Button, Icon } from '@adobe-commerce/elsie/components';\nimport { Minus, Add } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport '@/plp/components/Facet/Facet.css';\n\nexport interface FacetProps extends HTMLAttributes<HTMLDivElement> {\n numberOfOptionsConfig?: number;\n header: VNode;\n buckets: VNode[];\n last?: boolean;\n} \n\nexport const Facet: FunctionComponent<FacetProps> = ({ numberOfOptionsConfig = 5, header, buckets, last }) => {\n const translations = useText({\n showMore: 'Search.Facet.showMore',\n showLess: 'Search.Facet.showLess',\n });\n const numberOfOptionsShown = numberOfOptionsConfig;\n const [showMore, setShowMore] = useState(buckets.length < numberOfOptionsShown);\n\n const numberOfOptions = showMore ? buckets.length : numberOfOptionsShown;\n\n return (\n <div className={classes(['product-discovery-facet', ['product-discovery-facet--last', last]])}>\n <VComponent className=\"product-discovery-facet__header\" node={header} />\n {buckets.slice(0, numberOfOptions).map((bucket, index) => {\n return <VComponent key={index} className=\"product-discovery-facet__bucket\" node={bucket} />;\n })}\n {!showMore && buckets.length > numberOfOptionsShown && (\n <Button variant=\"tertiary\" icon={<Icon source={Add} size=\"24\" />} onClick={(): void => setShowMore(!showMore)}>\n {translations.showMore}\n </Button>\n )}\n {showMore && buckets.length > numberOfOptionsShown && (\n <Button\n variant=\"tertiary\"\n icon={<Icon source={Minus} size=\"24\" />}\n onClick={(): void => setShowMore(!showMore)}\n >\n {translations.showLess}\n </Button>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/FacetList/FacetList.css';\n\nexport interface FacetListProps extends HTMLAttributes<HTMLDivElement> {\n selectedFacets: VNode;\n facets: VNode;\n}\n\nexport const FacetList: FunctionComponent<FacetListProps> = ({ selectedFacets, facets }) => {\n return (\n <>\n <VComponent className=\"product-discovery-facet-list__selected-filters\" node={selectedFacets} />\n <VComponent className=\"product-discovery-facet-list__facet-options\" node={facets} />\n </>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { SearchFacet } from '@/plp/data/models/api';\nimport { Product } from '@/plp/data/models/product';\nimport { PriceRange } from '@adobe-commerce/elsie/components';\n\nconst BOOLEAN_NO = 'no';\nconst BOOLEAN_YES = 'yes';\n\nconst getRangeFacetFilter = (facet: SearchFacet) => {\n const selectedRange = facet.buckets.find((bucket) => bucket.selected);\n if (!selectedRange) {\n return null;\n }\n return {\n attribute: facet.attribute,\n range: {\n from: selectedRange.from,\n to: selectedRange.to,\n },\n };\n};\n\nconst getScalarFacetFilter = (facet: SearchFacet) => {\n const scalarSelections = facet.buckets.reduce((accu, curr) => {\n if (curr.selected) {\n accu.push(curr.title);\n }\n return accu;\n }, [] as string[]);\n if (scalarSelections.length === 0) {\n return null;\n }\n return {\n attribute: facet.attribute,\n in: scalarSelections,\n };\n};\n\nconst getFilterSelection = (facet: SearchFacet) => {\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n return getRangeFacetFilter(facet);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarFacetFilter(facet);\n default:\n break;\n }\n};\n\nconst getCurrencyType = (items: Product[]) => {\n const firstItem = items[0];\n if (firstItem?.price?.regular?.amount?.currency) {\n return firstItem.price.regular.amount.currency;\n } else if (firstItem?.priceRange?.minimum?.regular?.amount?.currency) {\n return firstItem?.priceRange?.minimum?.regular?.amount?.currency;\n }\n return 'USD'; // Default currency if not found\n};\n\nconst getRangeBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n if (facet?.attribute === 'price') {\n //Temp fix for Price range not handling value when minumum is zero\n if (bucket.from === 0) {\n return (\n <div style={'display:flex'}>\n <PriceRange amount={bucket.from} currency={currency || 'USD'} />\n <span style={'padding: 0 2px'}>{'-'}</span>\n <PriceRange amount={bucket.to} currency={currency || 'USD'} />\n </div>\n );\n }\n return (\n <PriceRange minimumAmount={bucket.from} maximumAmount={bucket.to} currency={currency || 'USD'} display=\"dash\" />\n );\n }\n return bucket.title;\n};\n\nconst getScalarBucketLabel = (bucket: any, facet: SearchFacet) => {\n if (bucket.title === BOOLEAN_NO) {\n return `Not ${facet.title}`;\n } else if (bucket.title === BOOLEAN_YES) {\n return facet.title;\n }\n return bucket.title;\n};\n\nconst getBucketLabel = (bucket: any, facet: SearchFacet, currency: string | null) => {\n switch (bucket.__typename) {\n case 'RangeBucket':\n return getRangeBucketLabel(bucket, facet, currency);\n case 'ScalarBucket':\n case 'CategoryView':\n return getScalarBucketLabel(bucket, facet);\n default:\n break;\n }\n};\n\nexport { getBucketLabel, getCurrencyType, getFilterSelection };\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState, useRef } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductSearchResult, SearchFilter, SearchFacet, SearchVariables, FacetBucket, Scope } from '@/plp/data/models/api';\nimport { getBucketLabel, getCurrencyType, getFilterSelection } from './utils/facetUtils';\nimport FacetList from '@/plp/components/FacetList';\nimport { Button, Checkbox, Icon, RadioButton } from '@adobe-commerce/elsie/components';\nimport { Facet } from '@/plp/components';\nimport { VNode } from 'preact';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { search } from '@/plp/api';\n\nexport interface FacetsProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n slots?: {\n Facet?: SlotProps<{ data: SearchFacet }>;\n SelectedFacets?: SlotProps<{ data: SearchFacet[] }>;\n Facets?: SlotProps<{ data: SearchFacet[] }>;\n FacetBucket?: SlotProps<{ data: FacetBucket }>;\n FacetBucketLabel?: SlotProps<{ data: FacetBucket }>;\n };\n}\n\nexport const Facets: Container<FacetsProps> = ({ scope, slots }) => {\n const labels = useText({\n clearAll: 'Search.Facet.clearAll',\n });\n\n const [facetList, setFacetList] = useState<SearchFacet[]>([]);\n const [currency, setCurrency] = useState<string | null>(null);\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>();\n const [pendingFilters, setPendingFilters] = useState<SearchFilter[] | null>(null);\n const searchTimeoutRef = useRef<number | null>(null);\n\n const handleSearchRequest = (searchVariables: SearchVariables): void => {\n // Preserve any existing categories filters from currentSearchVariables\n const existingCategoriesFilters = currentSearchVariables?.filter?.filter(\n (filter) => filter.attribute === 'categories'\n ) || [];\n\n search({\n ...searchVariables,\n filter: [...existingCategoriesFilters, ...(searchVariables.filter || [])]\n }, { scope });\n };\n\n const updateUrlFromFilters = (filters: SearchFilter[]) => {\n const params = new URLSearchParams(window.location.search);\n \n if (!filters.length) {\n params.delete('filter');\n } else {\n const filterParam = filters\n .map((filter) => {\n if (filter.range) {\n return `${filter.attribute}:${filter.range.from}-${filter.range.to}`;\n }\n \n if (filter.in?.length) {\n return `${filter.attribute}:${filter.in.join(',')}`;\n }\n \n return null;\n })\n .filter(Boolean)\n .join(';');\n \n params.set('filter', filterParam);\n }\n params.set('page', '1');\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n );\n };\n \n\n const handleSearchResult = (payload: { result: ProductSearchResult; request: SearchVariables }): void => {\n if (!payload || (!payload.result.facets && !payload.result.items && !payload.request.filter)) {\n setFacetList([]);\n return;\n }\n\n setCurrentSearchVariables(payload.request);\n\n const { facets, items } = payload.result;\n\n setCurrency(getCurrencyType(items));\n\n const filterList = payload.request.filter;\n\n if (facets) {\n const facetsWithSelections = facets.map((facet: SearchFacet) => {\n const selectedBuckets = facet.buckets.map((bucket) => {\n const selectedFilter = filterList?.find((filter) => filter.attribute === facet.attribute);\n if (selectedFilter) {\n const selectedRange = selectedFilter.range;\n if (selectedRange && bucket.from === selectedRange.from && bucket.to === selectedRange.to) {\n return { ...bucket, selected: true };\n } else if (selectedFilter.in && selectedFilter.in.includes(bucket.title)) {\n return { ...bucket, selected: true };\n }\n }\n return { ...bucket, selected: false };\n });\n return { ...facet, buckets: selectedBuckets };\n });\n\n setFacetList(facetsWithSelections);\n }\n };\n\n const updateFacetSelections = (facets: SearchFacet[]): void => {\n // Use functional update to ensure we're working with latest state\n setFacetList(currentFacetList => {\n const updatedFacetList = currentFacetList.map((f) => {\n const newFacet = facets.find((facet) => facet.attribute === f.attribute);\n if (newFacet) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selectedFilterList from the updated facet list\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const handleCancelSelection = (facet: SearchFacet, title: string): void => {\n const newBuckets = facet.buckets.map((bucket) => {\n if (bucket.title === title) {\n return { ...bucket, selected: false };\n }\n return bucket;\n });\n const newFacet = { ...facet, buckets: newBuckets };\n updateFacetSelections([newFacet]);\n };\n\n const clearAllSelections = (): void => {\n const updatedFacetList = facetList.map((facet) => {\n const updatedBuckets = facet.buckets.map((bucket) => {\n return { ...bucket, selected: false };\n });\n return { ...facet, buckets: updatedBuckets };\n });\n setFacetList(updatedFacetList);\n // Queue the search request with empty filters\n setPendingFilters([]);\n };\n\n const changeFilter = (event: any, facetAttribute: string): void => {\n const clickedValue = event.target.value;\n const isChecked = event.target.checked;\n \n // Use functional update to work with latest state\n setFacetList(currentFacetList => {\n const currentFacet = currentFacetList.find(f => f.attribute === facetAttribute);\n if (!currentFacet) {\n return currentFacetList;\n }\n \n const newBuckets = currentFacet.buckets.map((bucket) => {\n if (currentFacet.buckets[0]?.__typename === 'RangeBucket') {\n // For range buckets (radio buttons), only one can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n return { ...bucket, selected: false };\n }\n // For scalar buckets (checkboxes), multiple can be selected\n if (bucket.title === clickedValue) {\n return { ...bucket, selected: isChecked };\n }\n // Keep other buckets as-is, but create new objects to maintain immutability\n return { ...bucket };\n });\n \n const newFacet = { ...currentFacet, buckets: newBuckets };\n \n // Update the facet list with the new facet\n const updatedFacetList = currentFacetList.map((f) => {\n if (f.attribute === facetAttribute) {\n return newFacet;\n }\n return f;\n });\n \n // Calculate selected filters - will trigger search via useEffect\n const selectedFilterList = updatedFacetList.reduce((accu: SearchFilter[], facet: SearchFacet) => {\n const selectedFilter = getFilterSelection(facet);\n if (selectedFilter) {\n accu.push(selectedFilter as SearchFilter);\n }\n return accu;\n }, [] as SearchFilter[]);\n \n // Queue the search request (will be debounced by useEffect)\n setPendingFilters(selectedFilterList);\n \n return updatedFacetList;\n });\n };\n\n const getFacetNode = (facet: SearchFacet, index: number): VNode => {\n const header = <span>{facet.title}</span>;\n const buckets = facet.buckets\n .map((bucket: FacetBucket) => {\n const bucketLabel = getBucketLabel(bucket, facet, currency);\n\n const renderedBucketLabel = (count?: number) => (\n <Slot name=\"FacetBucketLabel\"\n slot={slots?.FacetBucketLabel}\n context={{ data: bucket }}>\n {bucketLabel} {count ? `(${count})` : ''}\n </Slot>\n );\n switch (facet.buckets[0]?.__typename) {\n case 'RangeBucket':\n \n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <RadioButton\n data-testid={`${bucket.title}-radio`}\n label={renderedBucketLabel()}\n name={facet.attribute}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n case 'ScalarBucket':\n case 'CategoryView':\n return (\n <Slot name=\"FacetBucket\" slot={slots?.FacetBucket} context={{ data: bucket }}>\n <Checkbox\n id={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n data-testid={`${bucket.title}-checkbox`}\n label={renderedBucketLabel(bucket.count)}\n name={`${facet.attribute}-${bucket.title.replace(/[^a-zA-Z0-9_-]/g, '')}`}\n value={bucket.title}\n checked={bucket.selected}\n onChange={(event): void => {\n changeFilter(event, facet.attribute);\n }}\n />\n </Slot>\n ) as VNode;\n default:\n return null;\n }\n })\n .filter((bucket) => bucket !== null);\n\n return <Facet header={header} buckets={buckets} last={index === facetList.length - 1} />\n };\n\n const getFacetsNode = (): VNode => {\n return (\n <Slot name=\"Facets\" slot={slots?.Facets} context={{ data: facetList }}>\n {facetList.map((facet, index) => {\n return facet.buckets.length > 0\n ? ((\n <>\n <Slot name=\"Facet\" slot={slots?.Facet} context={{ data: facet }}>\n {getFacetNode(facet, index)}\n </Slot>\n </>\n ) as VNode)\n : null;\n })}\n </Slot>\n );\n };\n\n const getSelectedFacetsNode = (): VNode => {\n const selectedFacets = facetList.reduce((accu, curr) => {\n const selected = curr.buckets.filter((bucket: FacetBucket) => bucket.selected);\n if (selected.length > 0) {\n accu.push(curr);\n }\n return accu;\n }, [] as SearchFacet[]);\n const selectedFilterBtns = selectedFacets.map((facet) => {\n return facet.buckets.map((bucket) => {\n if (bucket.selected) {\n const bucketTitle = getBucketLabel(bucket, facet, currency);\n return (\n <Button\n data-testid={`${bucket.title}-selected-btn`}\n aria-label={`Remove ${facet.title} filter: ${bucket.title}`}\n variant=\"secondary\"\n children={\n <>\n <span>{bucketTitle}</span>\n <Icon source={Close} size=\"16\" />\n </>\n }\n onClick={(): void => {\n handleCancelSelection(facet, bucket.title);\n }}\n />\n ) as VNode;\n }\n return null;\n });\n });\n\n const clearAllBtn =\n selectedFilterBtns.length > 0 ? (\n <Button\n variant=\"secondary\"\n onClick={(): void => {\n clearAllSelections();\n }}\n >\n <span>{labels.clearAll}</span>\n </Button>\n ) : null;\n return (\n <Slot name=\"SelectedFacets\" slot={slots?.SelectedFacets} context={{ data: selectedFacets }}>\n {selectedFilterBtns}\n {clearAllBtn}\n </Slot>\n );\n };\n\n useEffect(() => {\n const dataEvents = events.on('search/result', handleSearchResult, { eager: true, scope });\n\n return () => {\n dataEvents?.off();\n };\n }, []);\n\n // Handle search triggering with debouncing for better UX\n useEffect(() => {\n if (pendingFilters === null) {\n return;\n }\n\n // Clear any existing timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce search requests to avoid too many API calls\n searchTimeoutRef.current = setTimeout(() => {\n if (currentSearchVariables) {\n updateUrlFromFilters(pendingFilters);\n handleSearchRequest({ ...currentSearchVariables, filter: pendingFilters });\n }\n setPendingFilters(null);\n }, 150);\n\n return () => {\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n };\n }, [pendingFilters, currentSearchVariables]);\n\n return <FacetList selectedFacets={getSelectedFacetsNode()} facets={getFacetsNode()} />;\n};\n"],"names":["SvgAdd","props","React","SvgClose","SvgMinus","Facet","numberOfOptionsConfig","header","buckets","last","translations","useText","numberOfOptionsShown","showMore","setShowMore","useState","numberOfOptions","jsxs","classes","jsx","VComponent","bucket","index","Button","Icon","Add","Minus","FacetList","selectedFacets","facets","Fragment","BOOLEAN_NO","BOOLEAN_YES","getRangeFacetFilter","facet","selectedRange","getScalarFacetFilter","scalarSelections","accu","curr","getFilterSelection","_a","getCurrencyType","items","firstItem","_c","_b","_g","_f","_e","_d","_k","_j","_i","_h","getRangeBucketLabel","currency","PriceRange","getScalarBucketLabel","getBucketLabel","Facets","scope","slots","labels","facetList","setFacetList","setCurrency","currentSearchVariables","setCurrentSearchVariables","pendingFilters","setPendingFilters","searchTimeoutRef","useRef","handleSearchRequest","searchVariables","existingCategoriesFilters","filter","search","updateUrlFromFilters","filters","params","filterParam","handleSearchResult","payload","filterList","facetsWithSelections","selectedBuckets","selectedFilter","updateFacetSelections","currentFacetList","updatedFacetList","f","newFacet","selectedFilterList","handleCancelSelection","title","newBuckets","clearAllSelections","updatedBuckets","changeFilter","event","facetAttribute","clickedValue","isChecked","currentFacet","getFacetNode","bucketLabel","renderedBucketLabel","count","Slot","RadioButton","Checkbox","getFacetsNode","getSelectedFacetsNode","selectedFilterBtns","bucketTitle","Close","clearAllBtn","useEffect","dataEvents","events"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as S}from"@dropins/tools/preact-jsx-runtime.js";import{useState as o,useEffect as b}from"@dropins/tools/preact-compat.js";import{Pagination as h}from"@dropins/tools/components.js";import{events as x}from"@dropins/tools/event-bus.js";import{d as I}from"../chunks/search.js";import"@dropins/tools/lib.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const A=({scope:s,onPageChange:r})=>{const[a,f]=o(),[n,l]=o(),[p,g]=o({});b(()=>{const t=x.on("search/result",e=>{var i,u,m,c;g(e.request),f((u=(i=e.result)==null?void 0:i.pageInfo)==null?void 0:u.currentPage),l((c=(m=e.result)==null?void 0:m.pageInfo)==null?void 0:c.totalPages)},{eager:!0,scope:s});return()=>{t==null||t.off()}},[]);const P=async t=>{r==null||r(t),I({...p,currentPage:t},{scope:s})};return!a||!n?null:S(h,{currentPage:a,totalPages:n,onChange:P})};export{A as Pagination,A as default};
3
+ import{jsx as h}from"@dropins/tools/preact-jsx-runtime.js";import{useState as o,useEffect as w}from"@dropins/tools/preact-compat.js";import{Pagination as S}from"@dropins/tools/components.js";import{events as d}from"@dropins/tools/event-bus.js";import{d as $}from"../chunks/search.js";import"@dropins/tools/lib.js";import"../chunks/initialize.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const k=({scope:a,onPageChange:e})=>{const[s,f]=o(),[n,l]=o(),[p,g]=o({});w(()=>{const t=d.on("search/result",r=>{var i,c,u,m;g(r.request),f((c=(i=r.result)==null?void 0:i.pageInfo)==null?void 0:c.currentPage),l((m=(u=r.result)==null?void 0:u.pageInfo)==null?void 0:m.totalPages)},{eager:!0,scope:a});return()=>{t==null||t.off()}},[]);const P=async t=>{const r=new URLSearchParams(window.location.search);r.set("page",String(t)),window.history.pushState({},"",`${window.location.pathname}?${r.toString()}`),e==null||e(t),$({...p,currentPage:t},{scope:a})};return!s||!n?null:h(S,{currentPage:s,totalPages:n,onChange:P})};export{k as Pagination,k as default};
4
4
  //# sourceMappingURL=Pagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["/@dropins/storefront-product-discovery/src/containers/Pagination/Pagination.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n \nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Pagination as PaginationComponent } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Scope, SearchVariables } from '@/plp/data/models';\nimport { search } from '@/plp/api';\n\nexport interface PaginationProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n onPageChange?: (page: number) => void;\n }\n \nexport const Pagination: Container<PaginationProps> = ({ scope, onPageChange }) => {\n const [currentPage, setCurrentPage] = useState<number>();\n const [totalPages, setTotalPages] = useState<number>();\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>({});\n\n useEffect(() => {\n const searchEvent = events.on('search/result', (payload) => {\n setCurrentSearchVariables(payload.request);\n setCurrentPage(payload.result?.pageInfo?.currentPage);\n setTotalPages(payload.result?.pageInfo?.totalPages);\n }, { eager: true, scope });\n\n return () => {\n searchEvent?.off();\n };\n }, []);\n\n const handlePageChange = async (page: number): Promise<void> => {\n onPageChange?.(page);\n \n search(\n { ...currentSearchVariables, currentPage: page },\n { scope }\n );\n };\n \n\n // Don't render if we don't have the variables\n if (!currentPage || !totalPages) {\n return null;\n }\n\n return (\n <PaginationComponent \n currentPage={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n />\n );\n};"],"names":["Pagination","scope","onPageChange","currentPage","setCurrentPage","useState","totalPages","setTotalPages","currentSearchVariables","setCurrentSearchVariables","useEffect","searchEvent","events","payload","_b","_a","_d","_c","handlePageChange","page","search","jsx","PaginationComponent"],"mappings":"0bAqBO,MAAMA,EAAyC,CAAC,CAAE,MAAAC,EAAO,aAAAC,KAAmB,CACjF,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAA,EAChC,CAACC,EAAYC,CAAa,EAAIF,EAAA,EAC9B,CAACG,EAAwBC,CAAyB,EAAIJ,EAA0B,CAAA,CAAE,EAExFK,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GAAG,gBAAkBC,GAAY,aAC1DJ,EAA0BI,EAAQ,OAAO,EACzCT,GAAeU,GAAAC,EAAAF,EAAQ,SAAR,YAAAE,EAAgB,WAAhB,YAAAD,EAA0B,WAAW,EACpDP,GAAcS,GAAAC,EAAAJ,EAAQ,SAAR,YAAAI,EAAgB,WAAhB,YAAAD,EAA0B,UAAU,CACpD,EAAG,CAAE,MAAO,GAAM,MAAAf,EAAO,EAEzB,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMO,EAAmB,MAAOC,GAAgC,CAC9DjB,GAAA,MAAAA,EAAeiB,GAEfC,EACE,CAAE,GAAGZ,EAAwB,YAAaW,CAAA,EAC1C,CAAE,MAAAlB,CAAA,CAAM,CAEZ,EAIA,MAAI,CAACE,GAAe,CAACG,EACZ,KAIPe,EAACC,EAAA,CACC,YAAAnB,EACA,WAAAG,EACA,SAAUY,CAAA,CAAA,CAGhB"}
1
+ {"version":3,"file":"Pagination.js","sources":["/@dropins/storefront-product-discovery/src/containers/Pagination/Pagination.tsx"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n \nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Pagination as PaginationComponent } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Scope, SearchVariables } from '@/plp/data/models';\nimport { search } from '@/plp/api';\n\nexport interface PaginationProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n onPageChange?: (page: number) => void;\n }\n \nexport const Pagination: Container<PaginationProps> = ({ scope, onPageChange }) => {\n const [currentPage, setCurrentPage] = useState<number>();\n const [totalPages, setTotalPages] = useState<number>();\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>({});\n\n useEffect(() => {\n const searchEvent = events.on('search/result', (payload) => {\n setCurrentSearchVariables(payload.request);\n setCurrentPage(payload.result?.pageInfo?.currentPage);\n setTotalPages(payload.result?.pageInfo?.totalPages);\n }, { eager: true, scope });\n\n return () => {\n searchEvent?.off();\n };\n }, []);\n\n const handlePageChange = async (page: number): Promise<void> => {\n // Update URL\n const params = new URLSearchParams(window.location.search);\n params.set('page', String(page));\n \n window.history.pushState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n );\n \n onPageChange?.(page);\n \n search(\n { ...currentSearchVariables, currentPage: page },\n { scope }\n );\n };\n \n\n // Don't render if we don't have the variables\n if (!currentPage || !totalPages) {\n return null;\n }\n\n return (\n <PaginationComponent \n currentPage={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n />\n );\n};"],"names":["Pagination","scope","onPageChange","currentPage","setCurrentPage","useState","totalPages","setTotalPages","currentSearchVariables","setCurrentSearchVariables","useEffect","searchEvent","events","payload","_b","_a","_d","_c","handlePageChange","page","params","search","jsx","PaginationComponent"],"mappings":"0bAqBO,MAAMA,EAAyC,CAAC,CAAE,MAAAC,EAAO,aAAAC,KAAmB,CACjF,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAA,EAChC,CAACC,EAAYC,CAAa,EAAIF,EAAA,EAC9B,CAACG,EAAwBC,CAAyB,EAAIJ,EAA0B,CAAA,CAAE,EAExFK,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GAAG,gBAAkBC,GAAY,aAC1DJ,EAA0BI,EAAQ,OAAO,EACzCT,GAAeU,GAAAC,EAAAF,EAAQ,SAAR,YAAAE,EAAgB,WAAhB,YAAAD,EAA0B,WAAW,EACpDP,GAAcS,GAAAC,EAAAJ,EAAQ,SAAR,YAAAI,EAAgB,WAAhB,YAAAD,EAA0B,UAAU,CACpD,EAAG,CAAE,MAAO,GAAM,MAAAf,EAAO,EAEzB,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMO,EAAmB,MAAOC,GAAgC,CAE9D,MAAMC,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACzDA,EAAO,IAAI,OAAQ,OAAOD,CAAI,CAAC,EAE/B,OAAO,QAAQ,UACb,CAAA,EACA,GACA,GAAG,OAAO,SAAS,QAAQ,IAAIC,EAAO,UAAU,EAAA,EAGlDlB,GAAA,MAAAA,EAAeiB,GAEfE,EACE,CAAE,GAAGb,EAAwB,YAAaW,CAAA,EAC1C,CAAE,MAAAlB,CAAA,CAAM,CAEZ,EAIA,MAAI,CAACE,GAAe,CAACG,EACZ,KAIPgB,EAACC,EAAA,CACC,YAAApB,EACA,WAAAG,EACA,SAAUY,CAAA,CAAA,CAGhB"}
@@ -70,8 +70,6 @@ export interface FacetBucket {
70
70
  from?: number;
71
71
  to?: number;
72
72
  selected?: boolean;
73
- name?: string;
74
- path?: string;
75
73
  }
76
74
  export interface AttributeMetadataResponse {
77
75
  attributeMetadata: AttributeMetadata;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-product-discovery", "version": "3.0.0-alpha18", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-product-discovery", "version": "3.0.0-alpha19", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
@@ -1,60 +0,0 @@
1
- import { SearchVariables } from '../../data/models';
2
-
3
- /**
4
- * SearchState manages the centralized search state and URL synchronization.
5
- * This is the single source of truth for search parameters.
6
- */
7
- declare class SearchState {
8
- private state;
9
- private initialized;
10
- /**
11
- * Initialize state from URL on first load
12
- */
13
- initialize(): SearchVariables;
14
- /**
15
- * Get current state
16
- */
17
- getState(): SearchVariables;
18
- /**
19
- * Update state and sync to URL
20
- * Returns true if state changed (API call needed)
21
- */
22
- updateState(updates: Partial<SearchVariables>, syncUrl?: boolean, replaceFilters?: boolean): boolean;
23
- /**
24
- * Reset state
25
- */
26
- reset(): void;
27
- /**
28
- * Sync URL from current state
29
- */
30
- private syncUrlFromState;
31
- /**
32
- * Deduplicate filters by attribute
33
- * Later filters with the same attribute replace earlier ones, UNLESS the new filter is empty
34
- * Empty filters are discarded and don't override existing values
35
- */
36
- private deduplicateFilters;
37
- /**
38
- * Parse sort parameter from URL
39
- */
40
- private parseSortFromUrl;
41
- /**
42
- * Parse filter parameter from URL
43
- */
44
- private parseFiltersFromUrl;
45
- /**
46
- * Extract category from pathname
47
- */
48
- private getCategoryFromPath;
49
- /**
50
- * Merge category filter from path with existing filters
51
- */
52
- private mergeCategoryFilter;
53
- /**
54
- * Check if state has changed in meaningful ways
55
- */
56
- private hasStateChanged;
57
- }
58
- export declare const searchState: SearchState;
59
- export {};
60
- //# sourceMappingURL=searchState.d.ts.map