@dropins/storefront-product-discovery 1.1.0-beta1 → 2.0.0-alpha001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/api/index.d.ts +1 -2
  2. package/api/{productSearch/graphql/productSearch.graphql.d.ts → search/graphql/search.graphql.d.ts} +1 -1
  3. package/api/{productSearch → search}/index.d.ts +1 -1
  4. package/api/search/search.d.ts +8 -0
  5. package/api.js +1 -1
  6. package/chunks/acdlEvents.js +1 -1
  7. package/chunks/search.js +57 -0
  8. package/chunks/search.js.map +1 -0
  9. package/components/ProductList/ProductList.d.ts +2 -2
  10. package/components/index.d.ts +0 -4
  11. package/containers/Facets/Facets.d.ts +3 -1
  12. package/containers/Facets.js +1 -1
  13. package/containers/Facets.js.map +1 -1
  14. package/containers/Pagination/Pagination.d.ts +10 -0
  15. package/containers/{ProductList/utils/getAttributeMetadata.d.ts → Pagination/index.d.ts} +3 -2
  16. package/containers/Pagination.d.ts +3 -0
  17. package/containers/Pagination.js +4 -0
  18. package/containers/Pagination.js.map +1 -0
  19. package/containers/SearchResults/SearchResults.d.ts +31 -0
  20. package/{components/ProductItem → containers/SearchResults}/index.d.ts +2 -2
  21. package/containers/SearchResults.d.ts +3 -0
  22. package/containers/SearchResults.js +4 -0
  23. package/containers/SearchResults.js.map +1 -0
  24. package/containers/SortBy/SortBy.d.ts +10 -0
  25. package/{api/attributeMetadata → containers/SortBy}/index.d.ts +2 -1
  26. package/containers/SortBy.d.ts +3 -0
  27. package/containers/SortBy.js +4 -0
  28. package/containers/SortBy.js.map +1 -0
  29. package/containers/index.d.ts +3 -4
  30. package/data/models/api.d.ts +2 -0
  31. package/data/transforms/api.d.ts +0 -1
  32. package/package.json +1 -1
  33. package/render.js +1 -5
  34. package/types/api/index.d.ts +0 -1
  35. package/api/attributeMetadata/attributeMetadata.d.ts +0 -4
  36. package/api/attributeMetadata/graphql/attributeMetadata.graphql.d.ts +0 -17
  37. package/api/productSearch/productSearch.d.ts +0 -4
  38. package/chunks/api.js +0 -4
  39. package/chunks/api.js.map +0 -1
  40. package/chunks/attributeMetadata.js +0 -19
  41. package/chunks/attributeMetadata.js.map +0 -1
  42. package/chunks/productSearch.js +0 -44
  43. package/chunks/productSearch.js.map +0 -1
  44. package/components/ProductItem/ProductItem.d.ts +0 -13
  45. package/components/ResultsInfo/ResultsInfo.d.ts +0 -9
  46. package/components/ResultsInfo/index.d.ts +0 -19
  47. package/components/SearchBarInput/SearchBarInput.d.ts +0 -15
  48. package/components/SearchBarInput/index.d.ts +0 -11
  49. package/components/SearchBarResults/SearchBarResults.d.ts +0 -10
  50. package/components/SearchBarResults/index.d.ts +0 -11
  51. package/containers/ProductList/ProductList.d.ts +0 -20
  52. package/containers/ProductList/index.d.ts +0 -11
  53. package/containers/ProductList/utils/getProductSearch.d.ts +0 -4
  54. package/containers/ProductList/utils/sortUtils.d.ts +0 -9
  55. package/containers/ProductList/utils/urlUtils.d.ts +0 -16
  56. package/containers/ProductList.d.ts +0 -3
  57. package/containers/ProductList.js +0 -4
  58. package/containers/ProductList.js.map +0 -1
  59. package/containers/ResultsInfo/ResultsInfo.d.ts +0 -11
  60. package/containers/ResultsInfo/index.d.ts +0 -19
  61. package/containers/ResultsInfo.d.ts +0 -3
  62. package/containers/ResultsInfo.js +0 -4
  63. package/containers/ResultsInfo.js.map +0 -1
  64. package/containers/SearchBarInput/SearchBarInput.d.ts +0 -16
  65. package/containers/SearchBarInput/index.d.ts +0 -11
  66. package/containers/SearchBarInput/utils/getSearchBarInputSearch.d.ts +0 -4
  67. package/containers/SearchBarInput.d.ts +0 -3
  68. package/containers/SearchBarInput.js +0 -4
  69. package/containers/SearchBarInput.js.map +0 -1
  70. package/containers/SearchBarResults/SearchBarResults.d.ts +0 -16
  71. package/containers/SearchBarResults/index.d.ts +0 -11
  72. package/containers/SearchBarResults.d.ts +0 -3
  73. package/containers/SearchBarResults.js +0 -5
  74. package/containers/SearchBarResults.js.map +0 -1
  75. package/types/api/attributeMetadata.d.ts +0 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchResults.js","sources":["/@dropins/storefront-product-discovery/src/utils/htmlStringDecode.ts","/@dropins/storefront-product-discovery/src/components/ProductList/ProductList.tsx","../../node_modules/@adobe-commerce/elsie/src/icons/Warning.svg","/@dropins/storefront-product-discovery/src/components/SearchAlertMessage/SearchAlertMessage.tsx","/@dropins/storefront-product-discovery/src/containers/SearchResults/SearchResults.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\nconst htmlStringDecode = (input: string): string | null => {\n const doc = new DOMParser().parseFromString(input, 'text/html');\n return doc.documentElement.textContent;\n};\n\nexport { htmlStringDecode };\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 { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/ProductList/ProductList.css';\n\nexport interface ProductListProps extends HTMLAttributes<HTMLDivElement> {\n productList?: VNode[];\n imageWidth?: number;\n imageHeight?: number;\n}\n\nexport const ProductList: FunctionComponent<ProductListProps> = ({ productList, imageWidth, imageHeight }) => {\n return (\n <div className={'product-discovery-product-list'} style={{ '--imageWidth': imageWidth, '--imageHeight': imageHeight }}>\n <div className=\"product-discovery-product-list__grid\">{productList && <VComponent node={productList} />}</div>\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgWarning = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Warning_Base\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_841_1324)\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_841_1324\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 24, height: 21, fill: \"white\", transform: \"translate(0 1.5)\" }))));\nexport default SvgWarning;\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 { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport '@/plp/components/SearchAlertMessage/SearchAlertMessage.css';\nimport { Icon, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { Warning } from '@adobe-commerce/elsie/icons';\n\nexport interface SearchAlertMessageProps extends HTMLAttributes<HTMLDivElement> {\n alertMessage?: string;\n}\n\nexport const SearchAlertMessage: FunctionComponent<SearchAlertMessageProps> = ({ alertMessage = '' }) => {\n return (\n <div className={classes(['product-discovery-search-alert-message__wrapper'])}>\n <div className=\"product-discovery-search-alert-message__content\">\n <InLineAlert\n heading={alertMessage}\n type={'warning'}\n icon={<Icon source={Warning} size=\"24\" />}\n onDismiss={undefined}\n />\n </div>\n </div>\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 *******************************************************************/\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ImageProps, Image, ProductItemCard, PriceRange } from '@adobe-commerce/elsie/components';\nimport { htmlStringDecode } from '@/plp/utils/htmlStringDecode';\nimport { Scope } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { ProductList, SearchAlertMessage } from '@/plp/components'\nimport {\n searchProductClick,\n searchResultsView,\n categoryResultsView,\n PLP_UNIT_ID,\n SEARCH_UNIT_ID\n} from '@/plp/utils/acdlEvents';\n\nexport interface SearchResultsProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (product: Product) => string;\n scope?: Scope;\n imageWidth?: number;\n imageHeight?: number;\n skeletonCount?: number;\n slots?: {\n ProductActions?: SlotProps<{ product: Product }>;\n ProductPrice?: SlotProps<{ product: Product }>;\n ProductName?: SlotProps<{ product: Product }>;\n ProductImage?: SlotProps<{ product: Product, defaultImageProps: ImageProps }>;\n NoResults?: SlotProps;\n },\n}\n\nexport const SearchResults: Container<SearchResultsProps> = ({\n routeProduct,\n scope,\n slots,\n imageWidth = 400,\n imageHeight = 450,\n skeletonCount = 8,\n}) => {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n\n const labels = useText({\n noResults: 'Search.PLP.Warning.noResults',\n searchError: 'Search.PLP.Warning.searchError',\n });\n\n const [items, setItems] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const loadingEvent = events.on('search/loading', setLoading, { eager: true, scope });\n\n const errorEvent = events.on('search/error', () => {\n setError(labels.searchError!);\n }, { eager: true, scope });\n\n const searchEvent = events.on('search/result', (payload) => {\n setError(payload.result?.items.length < 1 ? labels.noResults! : null);\n\n setItems(payload.result?.items);\n\n // Publish search results view event to ACDL\n if (payload.request.phrase) {\n searchResultsView(acdlUnitId);\n } else {\n categoryResultsView(acdlUnitId);\n }\n }, { eager: true, scope });\n\n return () => {\n loadingEvent?.off();\n errorEvent?.off();\n searchEvent?.off();\n };\n }, []);\n\n const handleProductClick = (product: Product): void => {\n searchProductClick(product.sku, acdlUnitId);\n };\n\n const renderProductImageSlot = (product: Product, index: number) => {\n const defaultImageProps: ImageProps = {\n loading: index < 8 ? 'eager' : 'lazy',\n src: product.images?.[0]?.url || '',\n alt: product.images?.[0]?.label || '',\n width: imageWidth,\n height: imageHeight,\n params: { width: imageWidth },\n };\n const productName = product.name !== null ? htmlStringDecode(product.name) : product.sku;\n const imageComponent = (\n <Image class=\"product-discovery-product-item__image\" {...defaultImageProps} aria-label={productName} />\n );\n\n return (\n <Slot name=\"ProductImage\" slot={slots?.ProductImage} context={{ product, defaultImageProps }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {imageComponent}\n </a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const renderProductNameSlot = (product: Product) => {\n const productName = product.name !== null ? htmlStringDecode(product.name) : '';\n return (\n <Slot name=\"ProductName\" slot={slots?.ProductName} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productName}\n </a>\n ) : (\n productName\n )}\n </Slot>\n );\n };\n\n const renderProductPriceSlot = (product: Product) => {\n let productCurrency =\n product.typename === 'ComplexProductView'\n ? product.priceRange?.minimum.regular.amount.currency\n : product.price?.regular.amount.currency;\n if (Intl.supportedValuesOf('currency').indexOf(productCurrency || '') === -1) {\n productCurrency = 'USD'; // Fallback to USD if the currency is not supported\n }\n const productPrice =\n product.typename === 'ComplexProductView' ? (\n <PriceRange\n display=\"from to\"\n minimumAmount={product.priceRange?.minimum.regular.amount.value}\n maximumAmount={product.priceRange?.maximum.regular.amount.value}\n currency={productCurrency}\n />\n ) : (\n <PriceRange amount={product.price?.regular.amount.value} currency={productCurrency} />\n );\n return (\n <Slot name=\"ProductPrice\" slot={slots?.ProductPrice} context={{ product }}>\n {routeProduct ? (\n <a href={routeProduct(product)} onClick={() => handleProductClick(product)}>\n {productPrice}\n </a>\n ) : (\n productPrice\n )}\n </Slot>\n );\n };\n\n const renderActionsSlot = (product: Product) => {\n return <Slot name=\"ProductActions\" slot={slots?.ProductActions} context={{ product }} />;\n };\n\n const renderAlertSlot = () => {\n return <Slot name=\"NoResults\" slot={slots?.NoResults} context={{ error }}>\n {error && <SearchAlertMessage alertMessage={error} />}\n </Slot>;\n }\n\n const renderSkeleton = () => {\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={Array.from({ length: skeletonCount }).map((_, index) => (\n <ProductItemCard key={index} initialized={false} />\n ))}\n />\n }\n\n const renderResults = () => {\n if (error) return renderAlertSlot();\n\n return <ProductList\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n productList={items.map((product, index) => (\n <ProductItemCard key={product.id || product.sku || index}\n image={renderProductImageSlot(product, index)}\n titleNode={renderProductNameSlot(product)}\n price={renderProductPriceSlot(product)}\n actionButton={slots?.ProductActions ? renderActionsSlot(product) : undefined}\n initialized\n />\n ))}\n />\n }\n\n return (\n <div>\n {loading ? renderSkeleton() : renderResults()}\n </div>\n );\n};\n"],"names":["htmlStringDecode","input","ProductList","productList","imageWidth","imageHeight","jsx","VComponent","SvgWarning","props","React","SearchAlertMessage","alertMessage","classes","InLineAlert","Icon","Warning","SearchResults","routeProduct","scope","slots","skeletonCount","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","labels","useText","items","setItems","useState","loading","setLoading","error","setError","useEffect","loadingEvent","events","errorEvent","searchEvent","payload","_a","_b","searchResultsView","categoryResultsView","handleProductClick","product","searchProductClick","renderProductImageSlot","index","defaultImageProps","_d","_c","productName","imageComponent","Image","Slot","renderProductNameSlot","renderProductPriceSlot","productCurrency","productPrice","PriceRange","_e","renderActionsSlot","renderAlertSlot","_","ProductItemCard"],"mappings":"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","x_google_ignoreList":[2]}
@@ -0,0 +1,10 @@
1
+ import { HTMLAttributes } from 'preact/compat';
2
+ import { Container } from '@dropins/tools/types/elsie/src/lib';
3
+ import { Scope, SortOrder } from '../../data/models';
4
+
5
+ export interface SortByProps extends HTMLAttributes<HTMLDivElement> {
6
+ scope?: Scope;
7
+ onSortChange?: (value: SortOrder | null) => void;
8
+ }
9
+ export declare const SortBy: Container<SortByProps>;
10
+ //# sourceMappingURL=SortBy.d.ts.map
@@ -6,5 +6,6 @@
6
6
  * file in accordance with the terms of the Adobe license agreement
7
7
  * accompanying it.
8
8
  *******************************************************************/
9
- export * from './attributeMetadata';
9
+ export * from './SortBy';
10
+ export { SortBy as default } from './SortBy';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,3 @@
1
+ export * from './SortBy/index'
2
+ import _default from './SortBy/index'
3
+ export default _default
@@ -0,0 +1,4 @@
1
+ /*! Copyright 2025 Adobe
2
+ All Rights Reserved. */
3
+ import{jsx as p}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useEffect as d}from"@dropins/tools/preact-compat.js";import{Picker as h}from"@dropins/tools/components.js";import{events as C}from"@dropins/tools/event-bus.js";import{d as D}from"../chunks/search.js";import{useText as L}from"@dropins/tools/i18n.js";import"@dropins/tools/lib.js";import"../fragments.js";import"../chunks/acdlEvents.js";import"@dropins/tools/fetch-graphql.js";const k=({scope:t,onSortChange:e})=>{const a=L({sortLabel:"Search.PLP.SortDropdown.title",relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",positionLabel:"Search.PLP.SortDropdown.positionLabel"}),[i,n]=c([]),[r,l]=c("relevance_DESC"),[b,f]=c({});d(()=>{const o=C.on("search/result",s=>{var u;if(f(s.request),(u=s.metadata)!=null&&u.sortableAttributes&&(n([...s.metadata.sortableAttributes]),s.request.sort)){const S=x(s.request.sort);S&&l(S)}},{eager:!0,scope:t});return()=>{o==null||o.off()}},[]);const m=async o=>{e==null||e(o[0]),D({...b,sort:o,currentPage:1},{scope:t})};return p(h,{floatingLabel:a.sortLabel,...P(i,a),value:r,handleSelect:o=>{const{value:s}=o.target,u=v(s);m(u)}})};function P(t,e){const a={text:e.relevanceLabel,value:"relevance_DESC"},i=t.reduce((n,r)=>(r.attribute!=="position"&&r.attribute!=="relevance"&&(r.attribute==="price"?(n.push({text:e.sortASC,value:`${r.attribute}_ASC`}),n.push({text:e.sortDESC,value:`${r.attribute}_DESC`})):n.push({text:r.label,value:`${r.attribute}_DESC`})),n),[]);return i.push(a),{options:i,defaultOption:a}}function v(t){const e=t.indexOf("_");return[{attribute:t.substring(0,e),direction:t.substring(e+1)==="ASC"?"ASC":"DESC"}]}function x(t){return t.length>0&&t[0]?`${t[0].attribute}_${t[0].direction}`:""}export{k as SortBy,k as default};
4
+ //# sourceMappingURL=SortBy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SortBy.js","sources":["/@dropins/storefront-product-discovery/src/containers/SortBy/SortBy.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 { Picker } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Scope, SearchVariables, SortOrder } from '@/plp/data/models';\nimport { search } from '@/plp/api';\n\nexport interface SortByProps extends HTMLAttributes<HTMLDivElement> {\n scope?: Scope;\n onSortChange?: (value: SortOrder | null) => void;\n}\n\nexport const SortBy: Container<SortByProps> = ({ scope, onSortChange }) => {\n const labels = useText({\n sortLabel: 'Search.PLP.SortDropdown.title',\n relevanceLabel: 'Search.PLP.SortDropdown.relevanceLabel',\n sortASC: 'Search.PLP.SortDropdown.sortASC',\n sortDESC: 'Search.PLP.SortDropdown.sortDESC',\n positionLabel: 'Search.PLP.SortDropdown.positionLabel',\n });\n\n\n const [sortOptions, setSortOptions] = useState<any[]>([]);\n const [current, setCurrent] = useState('relevance_DESC');\n const [currentSearchVariables, setCurrentSearchVariables] = useState<SearchVariables>({});\n\n useEffect(() => {\n // Listen for search results\n const searchEvent = events.on('search/result', (payload) => {\n setCurrentSearchVariables(payload.request);\n\n // Configure sort options from metadata\n if (payload.metadata?.sortableAttributes) {\n setSortOptions([...payload.metadata.sortableAttributes]);\n\n // Set current sort value from request\n if (payload.request.sort) {\n const sortValue = getSortValue(payload.request.sort);\n\n if (sortValue) {\n setCurrent(sortValue);\n }\n }\n }\n }, { eager: true, scope });\n\n return () => {\n searchEvent?.off();\n };\n }, []);\n\n const handleSortChange = async (value: SortOrder[]): Promise<void> => {\n onSortChange?.(value[0]!);\n\n search({ ...currentSearchVariables, sort: value, currentPage: 1 }, { scope });\n };\n\n return (\n <Picker\n floatingLabel={labels.sortLabel}\n {...getSortOptions(sortOptions, labels)}\n value={current}\n handleSelect={(event) => {\n const { value } = event.target as HTMLSelectElement;\n const next = getSortSearchVariables(value);\n handleSortChange(next);\n }}\n />\n );\n};\n\n/** Utility functions */\n\nfunction getSortOptions(sortOptions: any, translations: any): any {\n const defaultSort = { text: translations.relevanceLabel, value: 'relevance_DESC' };\n\n const finalSortOptions = sortOptions.reduce((resultOptions: any, option: any) => {\n if (option.attribute !== 'position' && option.attribute !== 'relevance') {\n if (option.attribute === 'price') {\n resultOptions.push({\n text: translations.sortASC,\n value: `${option.attribute}_ASC`,\n });\n resultOptions.push({\n text: translations.sortDESC,\n value: `${option.attribute}_DESC`,\n });\n } else {\n resultOptions.push({\n text: option.label,\n value: `${option.attribute}_DESC`,\n });\n }\n }\n return resultOptions;\n }, []);\n finalSortOptions.push(defaultSort);\n return { options: finalSortOptions, defaultOption: defaultSort };\n}\n\n\nfunction getSortSearchVariables(sortValue: string): SortOrder[] {\n const index = sortValue.indexOf('_');\n const newSort: SortOrder[] = [\n {\n attribute: sortValue.substring(0, index) as string,\n direction: sortValue.substring(index + 1) === 'ASC' ? 'ASC' : 'DESC',\n },\n ];\n return newSort;\n}\n\nfunction getSortValue(sort: SortOrder[]) {\n if (sort.length > 0 && sort[0]) {\n return `${sort[0].attribute}_${sort[0].direction}`;\n }\n return '';\n}\n"],"names":["SortBy","scope","onSortChange","labels","useText","sortOptions","setSortOptions","useState","current","setCurrent","currentSearchVariables","setCurrentSearchVariables","useEffect","searchEvent","events","payload","_a","sortValue","getSortValue","handleSortChange","value","search","jsx","Picker","getSortOptions","event","next","getSortSearchVariables","translations","defaultSort","finalSortOptions","resultOptions","option","index","sort"],"mappings":"ucAsBO,MAAMA,EAAiC,CAAC,CAAE,MAAAC,EAAO,aAAAC,KAAmB,CACzE,MAAMC,EAASC,EAAQ,CACrB,UAAW,gCACX,eAAgB,yCAChB,QAAS,kCACT,SAAU,mCACV,cAAe,uCAAA,CAChB,EAGK,CAACC,EAAaC,CAAc,EAAIC,EAAgB,CAAA,CAAE,EAClD,CAACC,EAASC,CAAU,EAAIF,EAAS,gBAAgB,EACjD,CAACG,EAAwBC,CAAyB,EAAIJ,EAA0B,CAAA,CAAE,EAExFK,EAAU,IAAM,CAEd,MAAMC,EAAcC,EAAO,GAAG,gBAAkBC,GAAY,OAI1D,GAHAJ,EAA0BI,EAAQ,OAAO,GAGrCC,EAAAD,EAAQ,WAAR,MAAAC,EAAkB,qBACpBV,EAAe,CAAC,GAAGS,EAAQ,SAAS,kBAAkB,CAAC,EAGnDA,EAAQ,QAAQ,MAAM,CACxB,MAAME,EAAYC,EAAaH,EAAQ,QAAQ,IAAI,EAE/CE,GACFR,EAAWQ,CAAS,CAExB,CAEJ,EAAG,CAAE,MAAO,GAAM,MAAAhB,EAAO,EAEzB,MAAO,IAAM,CACXY,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMM,EAAmB,MAAOC,GAAsC,CACpElB,GAAA,MAAAA,EAAekB,EAAM,CAAC,GAEtBC,EAAO,CAAE,GAAGX,EAAwB,KAAMU,EAAO,YAAa,CAAA,EAAK,CAAE,MAAAnB,EAAO,CAC9E,EAEA,OACEqB,EAACC,EAAA,CACC,cAAepB,EAAO,UACrB,GAAGqB,EAAenB,EAAaF,CAAM,EACtC,MAAOK,EACP,aAAeiB,GAAU,CACvB,KAAM,CAAE,MAAAL,GAAUK,EAAM,OAClBC,EAAOC,EAAuBP,CAAK,EACzCD,EAAiBO,CAAI,CACvB,CAAA,CAAA,CAGN,EAIA,SAASF,EAAenB,EAAkBuB,EAAwB,CAChE,MAAMC,EAAc,CAAE,KAAMD,EAAa,eAAgB,MAAO,gBAAA,EAE1DE,EAAmBzB,EAAY,OAAO,CAAC0B,EAAoBC,KAC3DA,EAAO,YAAc,YAAcA,EAAO,YAAc,cACtDA,EAAO,YAAc,SACvBD,EAAc,KAAK,CACjB,KAAMH,EAAa,QACnB,MAAO,GAAGI,EAAO,SAAS,MAAA,CAC3B,EACDD,EAAc,KAAK,CACjB,KAAMH,EAAa,SACnB,MAAO,GAAGI,EAAO,SAAS,OAAA,CAC3B,GAEDD,EAAc,KAAK,CACjB,KAAMC,EAAO,MACb,MAAO,GAAGA,EAAO,SAAS,OAAA,CAC3B,GAGED,GACN,CAAA,CAAE,EACL,OAAAD,EAAiB,KAAKD,CAAW,EAC1B,CAAE,QAASC,EAAkB,cAAeD,CAAA,CACrD,CAGA,SAASF,EAAuBV,EAAgC,CAC9D,MAAMgB,EAAQhB,EAAU,QAAQ,GAAG,EAOnC,MAN6B,CAC3B,CACE,UAAWA,EAAU,UAAU,EAAGgB,CAAK,EACvC,UAAWhB,EAAU,UAAUgB,EAAQ,CAAC,IAAM,MAAQ,MAAQ,MAAA,CAChE,CAGJ,CAEA,SAASf,EAAagB,EAAmB,CACvC,OAAIA,EAAK,OAAS,GAAKA,EAAK,CAAC,EACpB,GAAGA,EAAK,CAAC,EAAE,SAAS,IAAIA,EAAK,CAAC,EAAE,SAAS,GAE3C,EACT"}
@@ -6,9 +6,8 @@
6
6
  * file in accordance with the terms of the Adobe license agreement
7
7
  * accompanying it.
8
8
  *******************************************************************/
9
- export * from './ProductList';
10
9
  export * from './Facets';
11
- export * from './ResultsInfo';
12
- export * from './SearchBarInput';
13
- export * from './SearchBarResults';
10
+ export * from './Pagination';
11
+ export * from './SearchResults';
12
+ export * from './SortBy';
14
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,8 @@
1
1
  import { Product } from './product';
2
2
 
3
+ export type Scope = 'search' | 'popover' | string;
3
4
  export interface SearchVariables {
5
+ scope?: Scope;
4
6
  phrase?: string;
5
7
  filter?: SearchFilter[];
6
8
  sort?: SortOrder[];
@@ -2,7 +2,6 @@ import { ProductSearchResult } from '../models';
2
2
  import { Product } from '../models/product';
3
3
 
4
4
  export declare function transformProductSearchResponse(data: any): ProductSearchResult;
5
- export declare function transformAttributeMetadata(data: any): any;
6
5
  export declare const transformSearchResultProducts: (searchResponse: {
7
6
  productSearch: {
8
7
  items: any[];
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-product-discovery", "version": "1.1.0-beta1", "@dropins/tools": "^1.4.0-beta3", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-product-discovery", "version": "2.0.0-alpha001", "@dropins/tools": "1.4.1-alpha007", "license": "SEE LICENSE IN LICENSE.md"}
package/render.js CHANGED
@@ -1,9 +1,5 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- (function(o,t){try{if(typeof document<"u"){const r=document.createElement("style"),d=t.styleId;for(const e in t.attributes)r.setAttribute(e,t.attributes[e]);r.setAttribute("data-dropin",d),r.appendChild(document.createTextNode(o));const i=document.querySelector('style[data-dropin="sdk"]');if(i)i.after(r);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(r):document.head.append(r)}}}catch(r){console.error("dropin-styles (injectCodeFunction)",r)}})(`.product-discovery--search-bar-input__container{display:flex;align-items:center;width:100%}.product-discovery--search-bar-input__form{display:flex;align-items:center}
4
- .product-discovery-results-info{display:none}.product-discovery-results-info__search-phrase--upercase{text-transform:capitalize}@media only screen and (min-width: 768px){.product-discovery-results-info{display:flex;flex-direction:row;gap:var(--spacing-xsmall);width:100%;padding:var(--spacing-xsmall);text-align:center}}
5
- .product-discovery--search-bar-results{position:absolute;top:100%;left:0;right:0;z-index:1000;display:flex;align-items:flex-start;justify-content:flex-end;pointer-events:none}.product-discovery--search-bar-results__popover{position:relative;background:var(--color-neutral-50, #fff);box-shadow:0 10px 25px -3px #0000001a,0 4px 6px -2px #0000000d,0 0 0 1px #0000000d;width:100%;overflow:hidden;z-index:1001;animation:popoverSlideIn .2s ease-out;pointer-events:auto;display:flex;flex-direction:column;height:100%;min-height:0}.product-discovery--search-bar-results__outer-container{display:flex;flex-direction:column;padding:var(--spacing-small, 1rem)}@keyframes popoverSlideIn{0%{opacity:0;transform:translateY(-10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.product-discovery--search-bar-results__grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-small, 1rem);overflow-y:auto;flex:1;min-height:0}.product-discovery--search-bar-results__grid>*{min-width:0;overflow:hidden}.product-discovery--search-bar-results__view-all-wrapper{flex-shrink:0;border-top:1px solid var(--color-neutral-200, #e5e5e5);background:var(--color-neutral-300)}.product-discovery--search-bar-results__view-all-button{display:flex;justify-content:center;width:100%}.product-discovery--search-bar-results__grid::-webkit-scrollbar{width:.5rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-track{background:var(--color-neutral-100, #f5f5f5);border-radius:.25rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-thumb{background:var(--color-neutral-400, #d4d4d4);border-radius:.25rem}.product-discovery--search-bar-results__grid::-webkit-scrollbar-thumb:hover{background:var(--color-neutral-500, #a3a3a3)}@media only screen and (min-width: 48rem){.product-discovery--search-bar-results{padding-top:.25rem}.product-discovery--search-bar-results__grid{gap:var(--spacing-medium, 1.5rem);padding:var(--spacing-medium, 1.5rem)}}.product-discovery--product-item{display:flex;flex-flow:column nowrap;gap:var(--spacing-small);width:auto;align-items:center;cursor:pointer;text-decoration:none;color:inherit;font-weight:var(--font-weight-regular, 600)}.product-discovery--product-item:hover,.product-discovery--product-item:focus{box-shadow:0 2px 8px #0000001a;text-decoration:none}.product-discovery--product-item__image .dropin-image{width:10rem;height:10rem;max-width:10rem;max-height:10rem;object-fit:cover;border-radius:var(--shape-border-radius-2, 4px)}.product-discovery--product-item__details{display:flex;flex-flow:column nowrap;justify-content:space-between;width:100%}.product-discovery--product-item__details [data-slot=ProductPrice]{text-align:start}
6
- .product-discovery-product-list,.product-discovery-product-list__container{display:flex;flex-direction:column;width:100%}.product-discovery-product-list__grid{display:grid;grid-template-columns:1fr 1fr;margin-top:var(--spacing-small)}.product-discovery-product-list__grid .dropin-product-item-card{text-align:left;border:1px solid transparent;width:200px}.product-discovery-product-list__grid .dropin-product-item-card:hover{border:1px solid var(--color-neutral-400);box-shadow:0 0 var(--spacing-xsmall) 0 #a9a9a9;padding:none}.product-discovery-product-list__grid .dropin-product-item-card a:hover{text-decoration:none;color:var(--color-neutral-800)}.product-discovery-product-list__header{display:flex;flex-direction:row-reverse;width:100%}.product-discovery-product-list__picker{width:15.625rem;display:inline-block}.product-discovery-product-item__image{min-height:250px}@media only screen and (min-width: 768px){.product-discovery-product-list__grid{grid-template-columns:repeat(3,1fr)}}@media only screen and (min-width: 1366px){.product-discovery-product-list__grid{grid-template-columns:repeat(4,1fr)}}.product-discovery-search-alert-message__wrapper{display:flex;flex-direction:column;justify-content:center;width:100%;min-height:300px}.product-discovery-search-alert-message__content{display:flex;justify-content:center}.product-discovery-facet__bucket .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-body-2-default-font)}.product-discovery-facet__bucket .dropin-radio-button__label:before{margin-right:var(--spacing-xsmall)}.product-discovery-facet-list{display:flex;flex-direction:column;width:100%}.product-discovery-facet-list__selected-filters{display:flex;flex-direction:row;flex-wrap:wrap;row-gap:var(--spacing-xxsmall);padding:0 0 var(--spacing-xxsmall) 0}.product-discovery-facet-list__selected-filters button{padding:0 var(--spacing-xxsmall);margin:0 var(--spacing-xxsmall);border-radius:var(--shape-border-radius-2)}.product-discovery-facet-list__selected-filters .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-button-2-font)}.product-discovery-facet-list__facet-options{text-align:left}.product-discovery-facet-list__facet-options button{padding:0}.product-discovery-facet-list__facet-options .dropin-radio-button{padding:var(--spacing-xxsmall) 0}.product-discovery-facet-list__facet-options--hidden{display:none}.product-discovery-facet-list__show-filters-button{display:flex;margin:0 0 var(--spacing-xsmall) 0}.product-discovery-facet-list .dropin-divider{margin:var(--spacing-xsmall) 0 var(--spacing-xsmall) 0}@media only screen and (min-width: 768px){.product-discovery-facet-list{min-width:13.12rem}.product-discovery-facet-list__facet-options{display:flex;flex-direction:column}.product-discovery-facet-list__show-filters-button{display:none}}
7
- .dropin-product-item-card__skeleton{gap:var(--spacing-small)}.dropin-product-item-card__skeleton__image{height:375px}.dropin-product-item-card__skeleton__content{grid-column:1/-1}.dropin-product-item-card{display:grid;position:relative;grid-auto-flow:row;background:var(--color-neutral-50);border:1px solid var(--color-neutral-400);color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:var(--spacing-small);width:300px}.dropin-product-item-card__image-container{overflow:hidden;width:100%;height:auto}.dropin-product-item-card__image img{width:100%;max-height:375px}.dropin-product-item-card__content{display:grid;grid-template-columns:1fr 1fr;padding:var(--spacing-small);gap:var(--spacing-xxsmall);align-items:center;color:var(--color-neutral-800)}.dropin-product-item-card__title,.dropin-product-item-card__sku,.dropin-product-item-card__price,.dropin-product-item-card__swatches,.dropin-product-item-card__action{grid-column:1/3}.dropin-product-item-card__title{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing)}.dropin-product-item-card__sku,.dropin-product-item-card__price{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.dropin-product-item-card__swatches{margin-top:var(--spacing-xsmall)}.dropin-product-item-card__action{margin-top:var(--spacing-xsmall);width:100%}`,{styleId:"storefront-product-discovery"});
3
+ (function(d,i){try{if(typeof document<"u"){const t=document.createElement("style"),o=i.styleId;for(const e in i.attributes)t.setAttribute(e,i.attributes[e]);t.setAttribute("data-dropin",o),t.appendChild(document.createTextNode(d));const r=document.querySelector('style[data-dropin="sdk"]');if(r)r.after(t);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(t):document.head.append(t)}}}catch(t){console.error("dropin-styles (injectCodeFunction)",t)}})(".product-discovery-product-list{container-type:inline-size;display:flex;flex-direction:column;width:100%}.product-discovery-product-list__container{display:flex;flex-direction:column;width:100%}.product-discovery-product-list__grid{display:grid;grid-template-columns:1fr;gap:var(--spacing-small)}.product-discovery-product-list__grid .dropin-product-item-card{border:unset;margin:unset;width:100%}.product-discovery-product-list__grid .dropin-product-item-card img,.product-discovery-product-list__grid .dropin-product-item-card__skeleton__image{aspect-ratio:var(--imageWidth) / var(--imageHeight);max-height:unset;height:unset}@container (min-width: 600px){.product-discovery-product-list__grid{grid-template-columns:repeat(2,1fr)}}@container (min-width: 900px){.product-discovery-product-list__grid{grid-template-columns:repeat(3,1fr)}}@container (min-width: 1200px){.product-discovery-product-list__grid{grid-template-columns:repeat(4,1fr)}}.product-discovery-search-alert-message__wrapper{display:flex;flex-direction:column;justify-content:center;width:100%;min-height:300px}.product-discovery-search-alert-message__content{display:flex;justify-content:center}.product-discovery-facet__bucket .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-body-2-default-font)}.product-discovery-facet__bucket .dropin-radio-button__label:before{margin-right:var(--spacing-xsmall)}.product-discovery-facet-list{display:flex;flex-direction:column;width:100%}.product-discovery-facet-list__selected-filters{display:flex;flex-direction:row;flex-wrap:wrap;row-gap:var(--spacing-xxsmall);padding:0 0 var(--spacing-xxsmall) 0}.product-discovery-facet-list__selected-filters button{padding:0 var(--spacing-xxsmall);margin:0 var(--spacing-xxsmall);border-radius:var(--shape-border-radius-2)}.product-discovery-facet-list__selected-filters .dropin-price-range .dropin-price--small.dropin-price--bold{font:var(--type-button-2-font)}.product-discovery-facet-list__facet-options{text-align:left}.product-discovery-facet-list__facet-options button{padding:0}.product-discovery-facet-list__facet-options .dropin-radio-button{padding:var(--spacing-xxsmall) 0}.product-discovery-facet-list__facet-options--hidden{display:none}.product-discovery-facet-list__show-filters-button{display:flex;margin:0 0 var(--spacing-xsmall) 0}.product-discovery-facet-list .dropin-divider{margin:var(--spacing-xsmall) 0 var(--spacing-xsmall) 0}@media only screen and (min-width: 768px){.product-discovery-facet-list{min-width:13.12rem}.product-discovery-facet-list__facet-options{display:flex;flex-direction:column}.product-discovery-facet-list__show-filters-button{display:none}}",{styleId:"storefront-product-discovery"});
8
4
  import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{Render as c}from"@dropins/tools/lib.js";import{useState as i,useEffect as a}from"@dropins/tools/preact-hooks.js";import{UIProvider as l}from"@dropins/tools/components.js";import{events as u}from"@dropins/tools/event-bus.js";const h={PLP:{Warning:{minQueryLength:"Your search term {SEARCH_PHRASE} has not reached the minimum of {{minQueryLength}} characters.",noResults:"Your search returned no results.",searchError:"An error occurred while searching."},SortDropdown:{title:"Sort by",option:"Sort by: {{selectedOption}}",relevanceLabel:"Most Relevant",positionLabel:"Position",sortAttributeASC:"{{label}}: Low to High",sortAttributeDESC:"{{label}}: High to Low",sortASC:"Price: Low to High",sortDESC:"Price: High to Low",productName:"Product Name",productInStock:"In Stock",productLowStock:"Low Stock"}},Facet:{showMore:"Show more",showLess:"Show less",clearAll:"Clear all"},ResultsInfo:{resultsFor:"Results for",products:"products"},SearchInput:{placeholder:"Search",viewAllButton:"View All"}},S={Search:h},m={default:S},d=({children:r})=>{const[t,n]=i("en_US");return a(()=>{const e=u.on("locale",s=>{n(s)},{eager:!0});return()=>{e==null||e.off()}},[]),o(l,{lang:t,langDefinitions:m,children:r})},A=new c(o(d,{}));export{A as render};
9
5
  //# sourceMappingURL=render.js.map
@@ -1,3 +1,2 @@
1
- export * from './attributeMetadata';
2
1
  export * from './productSearch';
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +0,0 @@
1
- import { AttributeMetadataResponse } from '../../types/api/attributeMetadata';
2
-
3
- export declare const attributeMetadata: () => Promise<AttributeMetadataResponse | null>;
4
- //# sourceMappingURL=attributeMetadata.d.ts.map
@@ -1,17 +0,0 @@
1
- /********************************************************************
2
- * ADOBE CONFIDENTIAL
3
- *
4
- * Copyright 2024 Adobe
5
- * All Rights Reserved.
6
- *
7
- * NOTICE: All information contained herein is, and remains
8
- * the property of Adobe and its suppliers, if any. The intellectual
9
- * and technical concepts contained herein are proprietary to Adobe
10
- * and its suppliers and are protected by all applicable intellectual
11
- * property laws, including trade secret and copyright laws.
12
- * Dissemination of this information or reproduction of this material
13
- * is strictly forbidden unless prior written permission is obtained
14
- * from Adobe.
15
- *******************************************************************/
16
- export declare const ATTRIBUTE_METADATA_QUERY = "\n query attributeMetadata {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n }\n";
17
- //# sourceMappingURL=attributeMetadata.graphql.d.ts.map
@@ -1,4 +0,0 @@
1
- import { ProductSearchResponse } from '../../types/api/productSearch';
2
-
3
- export declare const productSearch: (variables: any) => Promise<ProductSearchResponse | null>;
4
- //# sourceMappingURL=productSearch.d.ts.map
package/chunks/api.js DELETED
@@ -1,4 +0,0 @@
1
- /*! Copyright 2025 Adobe
2
- All Rights Reserved. */
3
- import{merge as d}from"@dropins/tools/lib.js";import{c as a}from"./productSearch.js";const ee=e=>{var o,i,r,l,s,c,m,f,u,y,v,R,k,w,_,x,b,C,D,K,P,T,A,O,V,z,I,S,j,q,B,E,F,G,H,J,N,Q,U,W,X,Y,Z,$,M,L,h,g,t;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 n={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:((o=e==null?void 0:e.images)==null?void 0:o.map(p=>({label:p.label||"",roles:p.roles||[],url:p.url||""})))||[],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:((l=(r=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:r.amount)==null?void 0:l.value)||0,currency:((m=(c=(s=e==null?void 0:e.price)==null?void 0:s.final)==null?void 0:c.amount)==null?void 0:m.currency)||""}},regular:{amount:{value:((y=(u=(f=e==null?void 0:e.price)==null?void 0:f.regular)==null?void 0:u.amount)==null?void 0:y.value)||0,currency:((k=(R=(v=e==null?void 0:e.price)==null?void 0:v.regular)==null?void 0:R.amount)==null?void 0:k.currency)||""}},roles:((w=e==null?void 0:e.price)==null?void 0:w.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((C=(b=(x=(_=e==null?void 0:e.priceRange)==null?void 0:_.minimum)==null?void 0:x.final)==null?void 0:b.amount)==null?void 0:C.value)||0,currency:((T=(P=(K=(D=e==null?void 0:e.priceRange)==null?void 0:D.minimum)==null?void 0:K.final)==null?void 0:P.amount)==null?void 0:T.currency)||""}},regular:{amount:{value:((z=(V=(O=(A=e==null?void 0:e.priceRange)==null?void 0:A.minimum)==null?void 0:O.regular)==null?void 0:V.amount)==null?void 0:z.value)||0,currency:((q=(j=(S=(I=e==null?void 0:e.priceRange)==null?void 0:I.minimum)==null?void 0:S.regular)==null?void 0:j.amount)==null?void 0:q.currency)||""}}},maximum:{final:{amount:{value:((G=(F=(E=(B=e==null?void 0:e.priceRange)==null?void 0:B.maximum)==null?void 0:E.final)==null?void 0:F.amount)==null?void 0:G.value)||0,currency:((Q=(N=(J=(H=e==null?void 0:e.priceRange)==null?void 0:H.maximum)==null?void 0:J.final)==null?void 0:N.amount)==null?void 0:Q.currency)||""}},regular:{amount:{value:((Y=(X=(W=(U=e==null?void 0:e.priceRange)==null?void 0:U.maximum)==null?void 0:W.regular)==null?void 0:X.amount)==null?void 0:Y.value)||0,currency:((L=(M=($=(Z=e==null?void 0:e.priceRange)==null?void 0:Z.maximum)==null?void 0:$.regular)==null?void 0:M.amount)==null?void 0:L.currency)||""}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return d(n,(t=(g=(h=a.getConfig().models)==null?void 0:h.Product)==null?void 0:g.transformer)==null?void 0:t.call(g,e))};function ie(e){var i,r,l,s,c,m,f;const n=e==null?void 0:e.productSearch,o={facets:(n==null?void 0:n.facets)||[],items:(n==null?void 0:n.items.map(u=>ee(u==null?void 0:u.productView)))||[],pageInfo:{currentPage:((i=n==null?void 0:n.page_info)==null?void 0:i.current_page)||1,totalPages:((r=n==null?void 0:n.page_info)==null?void 0:r.total_pages)||1,totalItems:((l=n==null?void 0:n.page_info)==null?void 0:l.total_items)||0,pageSize:((s=n==null?void 0:n.page_info)==null?void 0:s.page_size)||10},totalCount:(n==null?void 0:n.total_count)||0};return d(o,(f=(m=(c=a.getConfig().models)==null?void 0:c.ProductSearchResult)==null?void 0:m.transformer)==null?void 0:f.call(m,e))}function oe(e){const n=e==null?void 0:e.attributeMetadata;return{sortable:(n==null?void 0:n.sortable)||[],filterableInSearch:(n==null?void 0:n.filterableInSearch)||[]}}const le=e=>{var n,o;return((o=(n=e==null?void 0:e.productSearch)==null?void 0:n.items)==null?void 0:o.reduce((i,r)=>{if(!(r!=null&&r.productView))return i;const l=ee(r.productView);return l&&i.push(l),i},[]))||[]};export{ie as a,oe as b,ee as c,le as t};
4
- //# sourceMappingURL=api.js.map
package/chunks/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sources":["/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.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 *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\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 || '',\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: data?.price?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: 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: data?.priceRange?.minimum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: 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: data?.priceRange?.maximum?.final?.amount?.currency || '',\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: 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 } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\nexport function transformProductSearchResponse(data: any): ProductSearchResult {\n const productSearch = data?.productSearch;\n const transformedResponse: ProductSearchResult = {\n facets: productSearch?.facets || [],\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 };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport function transformAttributeMetadata(data: any): any {\n const attributeMetadata = data?.attributeMetadata;\n const transformedResponse = {\n sortable: attributeMetadata?.sortable || [],\n filterableInSearch: attributeMetadata?.filterableInSearch || [],\n };\n return transformedResponse;\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"],"names":["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","productSearch","transformedResponse","product","transformAttributeMetadata","attributeMetadata","transformSearchResultProducts","searchResponse","returnedProductList","productItem","transformed"],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /*! Copyright 2025 Adobe
2
- All Rights Reserved. */
3
- import{f as a}from"./productSearch.js";const r=`
4
- query attributeMetadata {
5
- attributeMetadata {
6
- sortable {
7
- label
8
- attribute
9
- numeric
10
- }
11
- filterableInSearch {
12
- label
13
- attribute
14
- numeric
15
- }
16
- }
17
- }
18
- `,n=async()=>a(r,{method:"GET"}).then(({errors:t,data:e})=>t?(console.log("error",t),null):e);export{n as a};
19
- //# sourceMappingURL=attributeMetadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attributeMetadata.js","sources":["/@dropins/storefront-product-discovery/src/api/attributeMetadata/graphql/attributeMetadata.graphql.ts","/@dropins/storefront-product-discovery/src/api/attributeMetadata/attributeMetadata.ts"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nexport const ATTRIBUTE_METADATA_QUERY = /* GraphQL */ `\n query attributeMetadata {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/plp/api';\n\nimport { ATTRIBUTE_METADATA_QUERY } from './graphql/attributeMetadata.graphql';\nimport { AttributeMetadataResponse } from '@/plp/types/api/attributeMetadata';\n\nexport const attributeMetadata = async (): Promise<AttributeMetadataResponse | null> => {\n return fetchGraphQl(ATTRIBUTE_METADATA_QUERY, { method: 'GET' }).then(({ errors, data }) => {\n if (errors) {\n console.log('error', errors);\n return null;\n }\n return data;\n });\n};\n"],"names":["ATTRIBUTE_METADATA_QUERY","attributeMetadata","fetchGraphQl","errors","data"],"mappings":"uCAgBO,MAAMA,EAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECMzCC,EAAoB,SACxBC,EAAaF,EAA0B,CAAE,OAAQ,KAAA,CAAO,EAAE,KAAK,CAAC,CAAE,OAAAG,EAAQ,KAAAC,KAC3ED,GACF,QAAQ,IAAI,QAASA,CAAM,EACpB,MAEFC,CACR"}
@@ -1,44 +0,0 @@
1
- /*! Copyright 2025 Adobe
2
- All Rights Reserved. */
3
- import{Initializer as o}from"@dropins/tools/lib.js";import{ProductView as n,Facet as c}from"../fragments.js";import{FetchGraphQL as s}from"@dropins/tools/fetch-graphql.js";const a=new o({init:async t=>{const e={};a.config.setConfig({...e,...t})},listeners:()=>[]}),l=a.config,{setEndpoint:f,setFetchGraphQlHeader:d,removeFetchGraphQlHeader:$,setFetchGraphQlHeaders:m,fetchGraphQl:i,getConfig:S}=new s().getMethods(),p=`
4
- query productSearch(
5
- $phrase: String!
6
- $pageSize: Int
7
- $currentPage: Int = 1
8
- $filter: [SearchClauseInput!]
9
- $sort: [ProductSearchSortInput!]
10
- $context: QueryContextInput
11
- ) {
12
- productSearch(
13
- phrase: $phrase
14
- page_size: $pageSize
15
- current_page: $currentPage
16
- filter: $filter
17
- sort: $sort
18
- context: $context
19
- ) {
20
- total_count
21
- items {
22
- ...ProductView
23
- }
24
- facets {
25
- ...Facet
26
- }
27
- page_info {
28
- current_page
29
- page_size
30
- total_pages
31
- }
32
- }
33
- attributeMetadata {
34
- sortable {
35
- label
36
- attribute
37
- numeric
38
- }
39
- }
40
- }
41
- ${n}
42
- ${c}
43
- `,_=async t=>i(p,{method:"GET",variables:t}).then(({errors:e,data:r})=>{if(e&&!r)throw console.log("error",e),new Error("Error fetching product search");return r});export{d as a,m as b,l as c,i as f,S as g,a as i,_ as p,$ as r,f as s};
44
- //# sourceMappingURL=productSearch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"productSearch.js","sources":["/@dropins/storefront-product-discovery/src/api/initialize/initialize.ts","/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/graphql/productSearch.graphql.ts","/@dropins/storefront-product-discovery/src/api/productSearch/productSearch.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 { Initializer, Model } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { Product } from '@/plp/data/models/product';\nimport { ProductSearchResult } from '@/plp/data/models';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n\n models?: {\n Product?: Model<Product>\n ProductSearchResult?: Model<ProductSearchResult>\n }\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [],\n});\n\nexport const config = initialize.config;\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 { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\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 *******************************************************************/\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 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 attributeMetadata {\n sortable {\n label\n attribute\n numeric\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 { fetchGraphQl } from '@/plp/api';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/productSearch.graphql';\nimport { ProductSearchResponse } from '@/plp/types/api/productSearch';\n\nexport const productSearch = async (variables: any): Promise<ProductSearchResponse | null> => {\n return fetchGraphQl(PRODUCT_SEARCH_QUERY, { method: 'GET', variables }).then(({ errors, data }) => {\n if (errors && !data) {\n console.log('error', errors);\n throw new Error('Error fetching product search');\n } else {\n return data;\n }\n });\n};\n"],"names":["initialize","Initializer","config","defaultConfig","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","PRODUCT_SEARCH_QUERY","ProductView","Facet","productSearch","variables","errors","data"],"mappings":"4KAuBO,MAAMA,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAgB,CAAA,EAEtBH,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CAAA,CACnB,CAAC,EAEYA,EAASF,EAAW,OCtBpB,CACX,YAAAI,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA,ECPjBC,EAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsCvCC,CAAW;AAAA,IACXC,CAAK;AAAA,ECrCIC,EAAgB,MAAOC,GAC3BP,EAAaG,EAAsB,CAAE,OAAQ,MAAO,UAAAI,EAAW,EAAE,KAAK,CAAC,CAAE,OAAAC,EAAQ,KAAAC,KAAW,CACjG,GAAID,GAAU,CAACC,EACb,cAAQ,IAAI,QAASD,CAAM,EACrB,IAAI,MAAM,+BAA+B,EAE/C,OAAOC,CAEX,CAAC"}
@@ -1,13 +0,0 @@
1
- import { FunctionComponent, VNode } from 'preact';
2
- import { AnchorHTMLAttributes } from 'preact/compat';
3
- import { Product } from '../../data/models/product';
4
-
5
- export interface ProductItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
6
- productRouteSearch?: (product: Product) => string;
7
- productItem: Product;
8
- productImage?: VNode;
9
- productName?: VNode;
10
- productPrice?: VNode;
11
- }
12
- export declare const ProductItem: FunctionComponent<ProductItemProps>;
13
- //# sourceMappingURL=ProductItem.d.ts.map
@@ -1,9 +0,0 @@
1
- import { FunctionComponent, VNode } from 'preact';
2
- import { HTMLAttributes } from 'preact/compat';
3
-
4
- export interface ResultsInfoProps extends HTMLAttributes<HTMLDivElement> {
5
- searchPhrase?: VNode;
6
- totalCount?: VNode;
7
- }
8
- export declare const ResultsInfo: FunctionComponent<ResultsInfoProps>;
9
- //# sourceMappingURL=ResultsInfo.d.ts.map
@@ -1,19 +0,0 @@
1
- /********************************************************************
2
- * ADOBE CONFIDENTIAL
3
- * __________________
4
- *
5
- * Copyright 2025 Adobe
6
- * All Rights Reserved.
7
- *
8
- * NOTICE: All information contained herein is, and remains
9
- * the property of Adobe and its suppliers, if any. The intellectual
10
- * and technical concepts contained herein are proprietary to Adobe
11
- * and its suppliers and are protected by all applicable intellectual
12
- * property laws, including trade secret and copyright laws.
13
- * Dissemination of this information or reproduction of this material
14
- * is strictly forbidden unless prior written permission is obtained
15
- * from Adobe.
16
- *******************************************************************/
17
- export * from './ResultsInfo';
18
- export { ResultsInfo as default } from './ResultsInfo';
19
- //# sourceMappingURL=index.d.ts.map
@@ -1,15 +0,0 @@
1
- import { FunctionComponent, VNode } from 'preact';
2
- import { HTMLAttributes } from 'preact/compat';
3
-
4
- export interface SearchBarInputProps extends HTMLAttributes<HTMLDivElement> {
5
- searchIcon?: VNode;
6
- searchQuery?: string;
7
- defaultQueryPlaceholder?: string;
8
- isLoading?: boolean;
9
- error?: string | null;
10
- onQueryInput?: (query: string) => void;
11
- onExecuteSearch?: (query: string) => void;
12
- onClose?: () => void;
13
- }
14
- export declare const SearchBarInput: FunctionComponent<SearchBarInputProps>;
15
- //# sourceMappingURL=SearchBarInput.d.ts.map
@@ -1,11 +0,0 @@
1
- /********************************************************************
2
- * Copyright 2025 Adobe
3
- * All Rights Reserved.
4
- *
5
- * NOTICE: Adobe permits you to use, modify, and distribute this
6
- * file in accordance with the terms of the Adobe license agreement
7
- * accompanying it.
8
- *******************************************************************/
9
- export * from './SearchBarInput';
10
- export { SearchBarInput as default } from './SearchBarInput';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1,10 +0,0 @@
1
- import { FunctionComponent, VNode } from 'preact';
2
- import { HTMLAttributes } from 'preact/compat';
3
-
4
- export interface SearchBarResultsProps extends HTMLAttributes<HTMLDivElement> {
5
- productList?: VNode[];
6
- viewAllButton?: VNode;
7
- onClose?: () => void;
8
- }
9
- export declare const SearchBarResults: FunctionComponent<SearchBarResultsProps>;
10
- //# sourceMappingURL=SearchBarResults.d.ts.map
@@ -1,11 +0,0 @@
1
- /********************************************************************
2
- * Copyright 2025 Adobe
3
- * All Rights Reserved.
4
- *
5
- * NOTICE: Adobe permits you to use, modify, and distribute this
6
- * file in accordance with the terms of the Adobe license agreement
7
- * accompanying it.
8
- *******************************************************************/
9
- export * from './SearchBarResults';
10
- export { SearchBarResults as default } from './SearchBarResults';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1,20 +0,0 @@
1
- import { HTMLAttributes } from 'preact/compat';
2
- import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
- import { Product } from '../../data/models/product';
4
-
5
- export interface ProductListProps extends HTMLAttributes<HTMLDivElement> {
6
- minQueryLength?: number;
7
- slots?: {
8
- Header?: SlotProps;
9
- ProductActions?: SlotProps;
10
- ProductPrice?: SlotProps;
11
- ProductName?: SlotProps;
12
- ProductImage?: SlotProps;
13
- Footer?: SlotProps;
14
- };
15
- pageSize?: number;
16
- routeProduct?: (product: Product) => string;
17
- categoryPath?: string;
18
- }
19
- export declare const ProductList: Container<ProductListProps>;
20
- //# sourceMappingURL=ProductList.d.ts.map
@@ -1,11 +0,0 @@
1
- /********************************************************************
2
- * Copyright 2025 Adobe
3
- * All Rights Reserved.
4
- *
5
- * NOTICE: Adobe permits you to use, modify, and distribute this
6
- * file in accordance with the terms of the Adobe license agreement
7
- * accompanying it.
8
- *******************************************************************/
9
- export * from './ProductList';
10
- export { ProductList as default } from './ProductList';
11
- //# sourceMappingURL=index.d.ts.map
@@ -1,4 +0,0 @@
1
- import { SearchVariables } from '../../../data/models';
2
-
3
- export declare function getProductSearch(variables: SearchVariables): any;
4
- //# sourceMappingURL=getProductSearch.d.ts.map
@@ -1,9 +0,0 @@
1
- import { SortOrder } from '../../../data/models/api';
2
-
3
- declare const getDefaultSort: (translations: any, categoryPath?: string) => any;
4
- declare const setSortOptions: (sortOptions: any, translations: any, categoryPath?: string) => any;
5
- declare const getSortSearchVariables: (sortValue: string) => SortOrder[];
6
- declare const getSortValue: (sort: SortOrder[]) => string;
7
- declare const getPickerOption: (options: any, value: string) => any;
8
- export { getDefaultSort, getSortSearchVariables, setSortOptions, getPickerOption, getSortValue };
9
- //# sourceMappingURL=sortUtils.d.ts.map
@@ -1,16 +0,0 @@
1
- /********************************************************************
2
- * Copyright 2025 Adobe
3
- * All Rights Reserved.
4
- *
5
- * NOTICE: Adobe permits you to use, modify, and distribute this
6
- * file in accordance with the terms of the Adobe license agreement
7
- * accompanying it.
8
- *******************************************************************/
9
- declare const getValueFromUrl: (param: string) => string;
10
- declare const updateUrlPagination: (pageNumber: number) => void;
11
- declare const updateUrlSort: (sortOption: string) => void;
12
- declare const updateUrlSearchPhrase: (searchPhrase: string) => void;
13
- declare const getFiltersFromUrl: (filterableAttributes: string[]) => any[];
14
- declare const addUrlFilters: (filters: any[]) => void;
15
- export { addUrlFilters, getFiltersFromUrl, getValueFromUrl, updateUrlPagination, updateUrlSort, updateUrlSearchPhrase };
16
- //# sourceMappingURL=urlUtils.d.ts.map
@@ -1,3 +0,0 @@
1
- export * from './ProductList/index'
2
- import _default from './ProductList/index'
3
- export default _default
@@ -1,4 +0,0 @@
1
- /*! Copyright 2025 Adobe
2
- All Rights Reserved. */
3
- import{jsx as o,jsxs as N}from"@dropins/tools/preact-jsx-runtime.js";import*as P from"@dropins/tools/preact-compat.js";import{useState as S,useCallback as pe,useEffect as ge}from"@dropins/tools/preact-compat.js";import{classes as _,VComponent as p,Slot as C}from"@dropins/tools/lib.js";import{Skeleton as Se,SkeletonRow as D,InLineAlert as _e,Icon as Pe,Pagination as we,Picker as Le,PriceRange as v,Image as Ce}from"@dropins/tools/components.js";import{p as ke}from"../chunks/productSearch.js";import{a as ye,b as Ee,c as xe}from"../chunks/api.js";import{u as Re,P as w,a as Ne,b as Ae,c as Ie,d as De,e as Ue,s as qe}from"../chunks/acdlEvents.js";import{a as ze}from"../chunks/attributeMetadata.js";/* empty css *//* empty css *//* empty css *//* empty css */import{events as $}from"@dropins/tools/event-bus.js";import{useText as Fe,Text as He}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const $e=t=>P.createElement("svg",{id:"Icon_Warning_Base",width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},P.createElement("g",{clipPath:"url(#clip0_841_1324)"},P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M11.9949 2.30237L0.802734 21.6977H23.1977L11.9949 2.30237Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),P.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M12.4336 10.5504L12.3373 14.4766H11.6632L11.5669 10.5504V9.51273H12.4336V10.5504ZM11.5883 18.2636V17.2687H12.4229V18.2636H11.5883Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})),P.createElement("defs",null,P.createElement("clipPath",{id:"clip0_841_1324"},P.createElement("rect",{width:24,height:21,fill:"white",transform:"translate(0 1.5)"})))),Me=()=>o("div",{className:"dropin-product-item-card dropin-product-item-card-skeleton",children:N(Se,{className:"dropin-product-item-card__skeleton dropin-product-item-card__image-container",children:[o(D,{fullWidth:!0,className:"dropin-product-item-card__skeleton__image"}),N("div",{className:"dropin-product-item-card__content dropin-product-item-card__skeleton__content",children:[o(D,{fullWidth:!0,size:"large",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"xsmall",className:"dropin-product-item-card__skeleton__item"}),o(D,{fullWidth:!0,size:"small",className:"dropin-product-item-card__skeleton__item"})]})," "]})}),ve=({className:t,image:r,titleNode:n,price:d,sku:i,actionButton:a,swatches:l,initialized:u=!1,...A})=>u?N("div",{...A,className:_(["dropin-product-item-card",t]),children:[o("div",{className:"dropin-product-item-card__image-container",children:r&&o(p,{node:r,className:_(["dropin-product-item-card__image"])})}),N("div",{className:"dropin-product-item-card__content",children:[n&&o(p,{node:n,className:_(["dropin-product-item-card__title"])}),i&&o(p,{node:i,className:_(["dropin-product-item-card__sku"])}),d&&o("div",{className:"dropin-product-item-card__price",children:o(p,{node:d,className:_(["dropin-product-item-card__price"])})}),l&&o("div",{className:"dropin-product-item-card__swatches",children:o(p,{node:l,className:_(["dropin-product-item-card__swatches"])})}),a&&o("div",{className:"dropin-product-item-card__action",children:o(p,{node:a,className:_(["dropin-product-item-card__action"])})})]})]}):o(Me,{});function Oe(t){var i;let r="";try{r=self.crypto.randomUUID(),Re(w,r,t.phrase||"",t.filter||[],t.pageSize||0,t.currentPage||0,t.sort||[]),Ne(w)}catch(a){console.error("Error collecting data:",a)}const n={attribute:"visibility",in:["Search","Catalog, Search"]},d=structuredClone(t);return(i=d.filter)==null||i.push(n),ke(d).then(a=>{const l=ye(a);try{Ae(w,r,l),Ie(w),t.phrase?De(w):Ue(w)}catch(u){console.error("Error collecting data:",u)}return l}).catch(a=>{throw console.error("Error fetching product search:",a),new Error("Error fetching product search.")}).finally(()=>{})}function We(){return ze().then(t=>Ee(t)).catch(t=>{throw console.error("Error fetching attribute metadata:",t),new Error("Error fetching attribute metadata.")}).finally(()=>{})}const j=(t,r)=>r?{text:t.positionLabel,value:"position_ASC"}:{text:t.relevanceLabel,value:"relevance_DESC"},je=(t,r,n)=>{const d=j(r,n),i=t.reduce((a,l)=>(l.attribute!=="position"&&l.attribute!=="relevance"&&(l.attribute==="price"?(a.push({text:r.sortASC,value:`${l.attribute}_ASC`}),a.push({text:r.sortDESC,value:`${l.attribute}_DESC`})):a.push({text:l.label,value:`${l.attribute}_DESC`})),a),[]);return i.push(d),{options:i,default:d}},U=t=>{const r=t.indexOf("_");return[{attribute:t.substring(0,r),direction:t.substring(r+1)==="ASC"?"ASC":"DESC"}]},Te=t=>t.length>0?`${t[0].attribute}_${t[0].direction}`:"",Qe=(t,r)=>{const n=t.findIndex(d=>d.value===r);return n>-1?t[n]:null},Ze=({header:t,productList:r,footer:n})=>N("div",{className:"product-discovery-product-list",children:[t&&o(p,{className:"product-discovery-product-list__header",node:t}),o("div",{className:"product-discovery-product-list__grid",children:r&&o(p,{node:r})}),n&&o(p,{className:"product-discovery-product-list__pagination",node:n})]}),Be=({alertMessage:t=""})=>o("div",{className:_(["product-discovery-search-alert-message__wrapper"]),children:o("div",{className:"product-discovery-search-alert-message__content",children:o(_e,{heading:t,type:"warning",icon:o(Pe,{source:$e,size:"24"}),onDismiss:void 0})})}),T={search:"q",search_query:"search_query",pagination:"p",sort:"product_list_order",page_size:"page_size"},k=t=>{const n=Q().get(t);return n||""},Q=()=>{const t=window.location.search;return new URLSearchParams(t)},Ke=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);t===1?n.delete("p"):n.set("p",t.toString()),q(r.pathname,n)},Ge=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("product_list_order",t),q(r.pathname,n)},Je=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);n.set("q",t),q(r.pathname,n)},q=(t,r)=>{r.toString()===""?window.history.pushState({},"",`${t}`):window.history.pushState({},"",`${t}?${r.toString()}`)},O=t=>{var d;const r=Q(),n=[];for(const[i,a]of r.entries())if(t.includes(i)&&!Object.values(T).includes(i))if(a.includes("--")){const l=a.split("--"),u={attribute:i,range:{from:Number(l[0]),to:Number(l[1])}};n.push(u)}else{const l=n.findIndex(u=>u.attribute==i);if(l!==-1)(d=n[l].in)==null||d.push(a);else{const u={attribute:i,in:[a]};n.push(u)}}return n},Xe=t=>{const r=new URL(window.location.href),n=new URLSearchParams(r.searchParams);for(const d of r.searchParams.keys())Object.values(T).includes(d)||n.delete(d);t.forEach(d=>{const i=d.attribute;if(d.range){const a=d.range;k(i)?(n.delete(i),n.append(i,`${a.from}--${a.to}`)):n.append(i,`${a.from}--${a.to}`)}else{const a=d.in||[],l=n.getAll(i);a.map(u=>{l.includes(u)||n.append(i,u)})}}),q(r.pathname,n)},W=t=>new DOMParser().parseFromString(t,"text/html").documentElement.textContent,ht=({minQueryLength:t=3,slots:r,pageSize:n=12,routeProduct:d,categoryPath:i})=>{const a=Fe({sortLabel:"Search.PLP.SortDropdown.title",relevanceLabel:"Search.PLP.SortDropdown.relevanceLabel",sortASC:"Search.PLP.SortDropdown.sortASC",sortDESC:"Search.PLP.SortDropdown.sortDESC",minQueryLength:o(He,{id:"Search.PLP.Warning.minQueryLength",fields:{minQueryLength:t}}),noResults:"Search.PLP.Warning.noResults",searchError:"Search.PLP.Warning.searchError",positionLabel:"Search.PLP.SortDropdown.positionLabel"}),[l,u]=S([]),[A,Z]=S(),[B,K]=S(1),[G,L]=S(!1),[J,y]=S(a.noResults),I=j(a,i),[X,z]=S(),[Y,b]=S([]),V=[...Array(n).keys()].map(()=>{const e=xe({});return e.initialized=!1,e}),[E,ee]=S(V),F=e=>{qe(e.sku,w)},te=e=>{x({currentPage:e})},re=e=>{Z(e),Ke(e)},ne=e=>{const c=U(e);z(e),x({sort:c})},oe=e=>{var h;const c=k("product_list_order"),m=U(c||I.value),s={phrase:i?"":(e==null?void 0:e.phrase)||k("q"),pageSize:(e==null?void 0:e.pageSize)||n,currentPage:(e==null?void 0:e.currentPage)||A,filter:(e==null?void 0:e.filter)||O(Y),sort:(e==null?void 0:e.sort)||m};return(e!=null&&e.phrase||e!=null&&e.filter||e!=null&&e.sort||e!=null&&e.pageSize)&&(s.currentPage=1,e!=null&&e.phrase&&(s.filter=[],s.sort=U(I.value),z(I.value))),i?(s.phrase="",s.filter=(h=s.filter)==null?void 0:h.concat({attribute:"categoryPath",eq:i})):s.phrase=(e==null?void 0:e.phrase)||k("q")||"",s},ce=e=>{if(!i){const s=e.phrase||"";Je(s)}const c=e.filter||[];Xe(c);const m=Te(e.sort||[]);Ge(m)},se=e=>We().then(c=>{b(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute));const m=je(c==null?void 0:c.sortable,a,i);u(m.options);const s=Qe(m.options,e||m.default.value);return z(s.value),O(((c==null?void 0:c.filterableInSearch)||[]).map(f=>f.attribute))}).catch(()=>{L(!0),y(a.searchError)}),x=e=>{var m;const c=oe(e);if(ce(c),!i&&(((m=c==null?void 0:c.phrase)==null?void 0:m.length)||0)<t)L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",(c==null?void 0:c.phrase)||"")),H();else return L(!1),Oe(c).then(s=>{var h,f;$.emit("search/result",{result:s,request:c}),(s==null?void 0:s.totalCount)===0&&(s==null?void 0:s.items.length)===0?(L(!0),y(a.noResults)):(ee(s==null?void 0:s.items.map(g=>(g.initialized=!0,g))),re(((h=s==null?void 0:s.pageInfo)==null?void 0:h.currentPage)||1),K(((f=s==null?void 0:s.pageInfo)==null?void 0:f.totalPages)||1))}).catch(()=>{L(!0),y(a.searchError),H()}).finally(()=>{})},ae=pe(e=>{x(e)},[]),H=()=>{$.emit("search/result",{result:{},request:{}})};ge(()=>{const e=k("q"),c=k("product_list_order")||I.value;se(c).then(s=>{i?x({filter:[{attribute:"categoryPath",eq:i}]}):e!=null&&e.length&&e.length<t?(L(!0),y(a.minQueryLength.replace("{SEARCH_PHRASE}",e)),H()):x({filter:s})});const m=$.on("search/request",ae);return()=>{m==null||m.off()}},[]);const ie=e=>o(C,{name:"ProductActions",slot:r==null?void 0:r.ProductActions,context:{product:e}}),de=e=>{var s,h,f,g,R;let c=e.typename==="ComplexProductView"?(s=e.priceRange)==null?void 0:s.minimum.regular.amount.currency:(h=e.price)==null?void 0:h.regular.amount.currency;Intl.supportedValuesOf("currency").indexOf(c||"")===-1&&(c="USD");const m=e.typename==="ComplexProductView"?o(v,{display:"from to",minimumAmount:(f=e.priceRange)==null?void 0:f.minimum.regular.amount.value,maximumAmount:(g=e.priceRange)==null?void 0:g.maximum.regular.amount.value,currency:c}):o(v,{amount:(R=e.price)==null?void 0:R.regular.amount.value,currency:c});return o(C,{name:"ProductPrice",slot:r==null?void 0:r.ProductPrice,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:m}):m})},le=e=>{const c=e.name!==null?W(e.name):"";return o(C,{name:"ProductName",slot:r==null?void 0:r.ProductName,context:{product:e},children:d?o("a",{href:d(e),onClick:()=>F(e),children:c}):c})},me=(e,c)=>{var f,g,R,M;const m={loading:c<8?"eager":"lazy",src:((g=(f=e.images)==null?void 0:f[0])==null?void 0:g.url)||"",alt:((M=(R=e.images)==null?void 0:R[0])==null?void 0:M.label)||"",width:200,height:250,params:{width:200}},s=e.name!==null?W(e.name):e.sku,h=o(Ce,{class:"product-discovery-product-item__image",...m,"aria-label":s});return o(C,{name:"ProductImage",slot:r==null?void 0:r.ProductImage,context:{product:e,defaultImageProps:m},children:d?o("a",{href:d(e),onClick:()=>F(e),children:h}):h})},ue=()=>o(C,{name:"Header",slot:r==null?void 0:r.Header,context:{productList:E},children:o(Le,{floatingLabel:a.sortLabel,options:l,value:X,required:!0,handleSelect:e=>{const{value:c}=e.target;ne(c)},"data-testid":"product-list-sort-by-picker"})}),he=()=>o(C,{name:"Footer",slot:r==null?void 0:r.Footer,context:{productList:E},children:o(we,{currentPage:A,totalPages:B,onChange:e=>{te(e)}})}),fe=o(Ze,{header:ue(),footer:he(),productList:E==null?void 0:E.map((e,c)=>o(ve,{image:me(e,c),titleNode:le(e),price:de(e),actionButton:ie(e),initialized:e.initialized},e.id||e.sku))});return o("div",{class:"product-discovery-product-list__container",children:G?o(Be,{alertMessage:J}):fe})};export{ht as ProductList,ht as default};
4
- //# sourceMappingURL=ProductList.js.map