@faststore/core 2.1.94 → 2.1.96

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 (92) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +44 -44
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/config.json +3 -3
  5. package/.next/cache/eslint/.cache_1gneedd +1 -1
  6. package/.next/cache/next-server.js.nft.json +1 -1
  7. package/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/.next/cache/webpack/client-production/index.pack +0 -0
  9. package/.next/cache/webpack/server-production/0.pack +0 -0
  10. package/.next/cache/webpack/server-production/index.pack +0 -0
  11. package/.next/next-server.js.nft.json +1 -1
  12. package/.next/prerender-manifest.json +1 -1
  13. package/.next/react-loadable-manifest.json +3 -3
  14. package/.next/routes-manifest.json +1 -1
  15. package/.next/server/chunks/183.js +1 -0
  16. package/.next/server/chunks/350.js +1 -1
  17. package/.next/server/chunks/530.js +58 -36
  18. package/.next/server/chunks/574.js +42 -23
  19. package/.next/server/chunks/576.js +1 -0
  20. package/.next/server/chunks/74.js +31 -9
  21. package/.next/server/chunks/907.js +25 -3
  22. package/.next/server/chunks/98.js +42 -23
  23. package/.next/server/middleware-build-manifest.js +1 -1
  24. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  25. package/.next/server/pages/404.js.nft.json +1 -1
  26. package/.next/server/pages/500.js.nft.json +1 -1
  27. package/.next/server/pages/[...slug].js.nft.json +1 -1
  28. package/.next/server/pages/[slug]/p.js.nft.json +1 -1
  29. package/.next/server/pages/_app.js.nft.json +1 -1
  30. package/.next/server/pages/account.js.nft.json +1 -1
  31. package/.next/server/pages/api/graphql.js +1 -1
  32. package/.next/server/pages/checkout.js.nft.json +1 -1
  33. package/.next/server/pages/en-US/404.html +2 -2
  34. package/.next/server/pages/en-US/500.html +2 -2
  35. package/.next/server/pages/en-US/account.html +2 -2
  36. package/.next/server/pages/en-US/checkout.html +2 -2
  37. package/.next/server/pages/en-US/login.html +2 -2
  38. package/.next/server/pages/en-US/s.html +2 -2
  39. package/.next/server/pages/en-US.html +2 -2
  40. package/.next/server/pages/index.js.nft.json +1 -1
  41. package/.next/server/pages/login.js.nft.json +1 -1
  42. package/.next/server/pages/s.js.nft.json +1 -1
  43. package/.next/server/pages-manifest.json +4 -4
  44. package/.next/static/8EkJazrZDz4rsTIa4IP5R/_buildManifest.js +1 -0
  45. package/.next/static/chunks/148.3bb7e05cc5d1c1c4.js +1 -0
  46. package/.next/static/chunks/238-2ad31f382e7c6f14.js +1 -0
  47. package/.next/static/chunks/243-8c394e91ccf75fdb.js +1 -0
  48. package/.next/static/chunks/{530.ec68de379130c11e.js → 530.da3ec94477af00a4.js} +1 -1
  49. package/.next/static/chunks/548-ab84e9e8b49413ab.js +1 -0
  50. package/.next/static/chunks/{574.d13dd0afe15cd635.js → 574.70612be06fd1365f.js} +1 -1
  51. package/.next/static/chunks/603-be78b9dfb8fa6c49.js +1 -0
  52. package/.next/static/chunks/{738-a5ff304828f20cbf.js → 738-67a288ca3569cdbb.js} +1 -1
  53. package/.next/static/chunks/98.40c7e17d9de4eb8f.js +1 -0
  54. package/.next/static/chunks/988.d10040040cdfebbb.js +1 -0
  55. package/.next/static/chunks/pages/{[...slug]-3f4e5f74ff9436ec.js → [...slug]-ca533c74c22cb787.js} +1 -1
  56. package/.next/static/chunks/pages/[slug]/p-3383e9b97bffafdd.js +1 -0
  57. package/.next/static/chunks/pages/{_app-6d0e6ab9a4dd8106.js → _app-40cff0982559d0b8.js} +1 -1
  58. package/.next/static/chunks/pages/{index-73110361a184aa10.js → index-d521ce4f4e2b89a6.js} +1 -1
  59. package/.next/static/chunks/pages/s-1f885639c2605ace.js +1 -0
  60. package/.next/static/chunks/{webpack-92f756189996e763.js → webpack-fac5a4eeea429971.js} +1 -1
  61. package/.next/trace +80 -80
  62. package/.turbo/turbo-build.log +5 -5
  63. package/@generated/graphql/index.ts +8 -0
  64. package/@generated/graphql/persisted.json +3 -3
  65. package/README.md +3 -3
  66. package/cypress/global.js +8 -0
  67. package/cypress/integration/a11y.test.js +7 -24
  68. package/cypress/integration/analytics.test.js +78 -87
  69. package/cypress/integration/cart.test.js +4 -4
  70. package/cypress/integration/plp.test.js +6 -6
  71. package/cypress/integration/search.test.js +1 -1
  72. package/cypress/integration/seo.test.js +14 -14
  73. package/cypress.config.ts +19 -0
  74. package/faststore.config.js +1 -0
  75. package/package.json +8 -8
  76. package/src/components/cart/CartSidebar/CartSidebar.tsx +41 -27
  77. package/src/components/sections/ProductGallery/useGalleryQuery.ts +31 -2
  78. package/src/sdk/analytics/platform/vtex/search.ts +53 -21
  79. package/src/sdk/analytics/types.ts +14 -0
  80. package/src/sdk/search/useSuggestions.ts +41 -7
  81. package/.next/static/chunks/148.582eaa81293ee470.js +0 -1
  82. package/.next/static/chunks/238-15fad228a6c8b1b5.js +0 -1
  83. package/.next/static/chunks/243-b4f8e506d156ee41.js +0 -1
  84. package/.next/static/chunks/548-4ee971bf7bdb3e81.js +0 -1
  85. package/.next/static/chunks/603-072c8fb73ac35775.js +0 -1
  86. package/.next/static/chunks/98.1632997dfd4d3a52.js +0 -1
  87. package/.next/static/chunks/988.afda042dd9ba11d1.js +0 -1
  88. package/.next/static/chunks/pages/[slug]/p-c36fb1ebf1df3462.js +0 -1
  89. package/.next/static/chunks/pages/s-51ec424952b59bd0.js +0 -1
  90. package/.next/static/i157UtW0mfErYKy2acCzJ/_buildManifest.js +0 -1
  91. package/cypress.json +0 -9
  92. /package/.next/static/{i157UtW0mfErYKy2acCzJ → 8EkJazrZDz4rsTIa4IP5R}/_ssgManifest.js +0 -0
@@ -16,7 +16,7 @@ describe('Home Page Seo', () => {
16
16
  cy.clearIDB()
17
17
  })
18
18
 
19
- it.skip('has meta/canonical/link tags', () => {
19
+ it('has meta/canonical/link tags', () => {
20
20
  cy.visit(pages.home, options)
21
21
  cy.waitForHydration()
22
22
 
@@ -34,7 +34,7 @@ describe('Home Page Seo', () => {
34
34
  })
35
35
  })
36
36
 
37
- it.skip('has structured data', () => {
37
+ it('has structured data', () => {
38
38
  cy.visit(pages.home, options)
39
39
  cy.waitForHydration()
40
40
 
@@ -48,7 +48,7 @@ describe('Home Page Seo', () => {
48
48
  })
49
49
  })
50
50
 
51
- it.skip('has OpenGraph tags', () => {
51
+ it('has OpenGraph tags', () => {
52
52
  cy.visit(pages.home, options)
53
53
  cy.waitForHydration()
54
54
 
@@ -77,7 +77,7 @@ describe('Product Page Seo', () => {
77
77
  cy.clearIDB()
78
78
  })
79
79
 
80
- it.skip('has meta/canonical/link tags', () => {
80
+ it('has meta/canonical/link tags', () => {
81
81
  cy.visit(pages.pdp, options)
82
82
  cy.waitForHydration()
83
83
 
@@ -95,7 +95,7 @@ describe('Product Page Seo', () => {
95
95
  })
96
96
  })
97
97
 
98
- it.skip('has structured data', () => {
98
+ it('has structured data', () => {
99
99
  cy.visit(pages.pdp, options)
100
100
  cy.waitForHydration()
101
101
 
@@ -115,7 +115,7 @@ describe('Product Page Seo', () => {
115
115
  })
116
116
  })
117
117
 
118
- it.skip('has OpenGraph tags', () => {
118
+ it('has OpenGraph tags', () => {
119
119
  cy.visit(pages.pdp, options)
120
120
  cy.waitForHydration()
121
121
 
@@ -162,7 +162,7 @@ describe('Collection Page Seo', () => {
162
162
  cy.clearIDB()
163
163
  })
164
164
 
165
- it.skip('has meta/canonical/link tags', () => {
165
+ it('has meta/canonical/link tags', () => {
166
166
  cy.visit(pages.collection, options)
167
167
  cy.waitForHydration()
168
168
 
@@ -182,7 +182,7 @@ describe('Collection Page Seo', () => {
182
182
  })
183
183
  })
184
184
 
185
- it.skip('has structured data', () => {
185
+ it('has structured data', () => {
186
186
  cy.visit(pages.collection, options)
187
187
  cy.waitForHydration()
188
188
 
@@ -201,7 +201,7 @@ describe('Collection Page Seo', () => {
201
201
  })
202
202
  })
203
203
 
204
- it.skip('has OpenGraph tags', () => {
204
+ it('has OpenGraph tags', () => {
205
205
  cy.visit(pages.collection, options)
206
206
  cy.waitForHydration()
207
207
 
@@ -226,7 +226,7 @@ describe('Collection Page Seo', () => {
226
226
  })
227
227
 
228
228
  describe('Filtered Collection Page Seo', () => {
229
- it.skip('has canonical pointing to parent url', () => {
229
+ it('has canonical pointing to parent url', () => {
230
230
  cy.visit(pages.collection_filtered, options)
231
231
  cy.waitForHydration()
232
232
 
@@ -239,7 +239,7 @@ describe('Filtered Collection Page Seo', () => {
239
239
  })
240
240
  })
241
241
 
242
- it.skip('has structured data', () => {
242
+ it('has structured data', () => {
243
243
  cy.visit(pages.collection_filtered, options)
244
244
  cy.waitForHydration()
245
245
 
@@ -258,7 +258,7 @@ describe('Filtered Collection Page Seo', () => {
258
258
  })
259
259
  })
260
260
 
261
- it.skip('has OpenGraph tags', () => {
261
+ it('has OpenGraph tags', () => {
262
262
  cy.visit(pages.collection_filtered, options)
263
263
  cy.waitForHydration()
264
264
 
@@ -283,7 +283,7 @@ describe('Filtered Collection Page Seo', () => {
283
283
  })
284
284
 
285
285
  describe('Search Page Seo', () => {
286
- it.skip('has meta/canonical/link tags', () => {
286
+ it('has meta/canonical/link tags', () => {
287
287
  cy.visit(pages.search, options)
288
288
  cy.waitForHydration()
289
289
 
@@ -297,7 +297,7 @@ describe('Search Page Seo', () => {
297
297
  cy.get('link[rel="canonical"]').should('not.exist')
298
298
  })
299
299
 
300
- it.skip('has OpenGraph tags', () => {
300
+ it('has OpenGraph tags', () => {
301
301
  cy.visit(pages.search, options)
302
302
  cy.waitForHydration()
303
303
 
@@ -0,0 +1,19 @@
1
+ import { defineConfig } from 'cypress'
2
+
3
+ export default defineConfig({
4
+ retries: 0,
5
+ video: true,
6
+ trashAssetsBeforeRuns: true,
7
+ screenshotOnRunFailure: true,
8
+ viewportWidth: 1000,
9
+ viewportHeight: 600,
10
+ e2e: {
11
+ supportFile: 'cypress/support/index.js',
12
+ specPattern: 'cypress/integration/**/*.test.{js,jsx,ts,tsx}',
13
+ setupNodeEvents(on, config) {
14
+ return require('cypress/plugins/index.js')(on, config)
15
+ },
16
+ baseUrl: 'http://localhost:3000/',
17
+ experimentalRunAllSpecs: true,
18
+ },
19
+ })
@@ -89,6 +89,7 @@ module.exports = {
89
89
  },
90
90
 
91
91
  experimental: {
92
+ cypressVersion: 12,
92
93
  enableCypressExtension: false,
93
94
  },
94
95
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "2.1.94",
3
+ "version": "2.1.96",
4
4
  "license": "MIT",
5
5
  "browserslist": "supports es6-module and not dead",
6
6
  "scripts": {
@@ -60,7 +60,7 @@
60
60
  "typescript": "4.7.3"
61
61
  },
62
62
  "devDependencies": {
63
- "@cypress/code-coverage": "^3.9.10",
63
+ "@cypress/code-coverage": "^3.12.1",
64
64
  "@faststore/eslint-config": "^2.1.82",
65
65
  "@faststore/lighthouse": "^1.12.32",
66
66
  "@graphql-codegen/cli": "^2.6.2",
@@ -74,13 +74,13 @@
74
74
  "@storybook/builder-webpack5": "^6.5.9",
75
75
  "@storybook/manager-webpack5": "^6.5.9",
76
76
  "@storybook/react": "^6.5.9",
77
- "@testing-library/cypress": "^8.0.0",
77
+ "@testing-library/cypress": "^10.0.1",
78
78
  "@types/cypress": "^1.1.3",
79
79
  "@vtex/prettier-config": "1.0.0",
80
- "axe-core": "^4.3.3",
81
- "cypress": "9.6.0",
82
- "cypress-axe": "^0.13.0",
83
- "cypress-wait-until": "^1.7.2",
80
+ "axe-core": "^4.8.1",
81
+ "cypress": "12.17.4",
82
+ "cypress-axe": "^1.5.0",
83
+ "cypress-wait-until": "^2.0.1",
84
84
  "dotenv": "^8.2.0",
85
85
  "eslint": "^7.32.0",
86
86
  "husky": "^5.2.0",
@@ -110,5 +110,5 @@
110
110
  "msw": {
111
111
  "workerDirectory": "public"
112
112
  },
113
- "gitHead": "73b1bd57b7d9e0984b3f0bb4649b027430075d34"
113
+ "gitHead": "7a9d3f22a02b6c882cda586da99a7b073a458ee9"
114
114
  }
@@ -10,7 +10,7 @@ import type { CartSidebarProps as UICartSidebarProps } from '@faststore/ui'
10
10
 
11
11
  import type { CurrencyCode, ViewCartEvent } from '@faststore/sdk'
12
12
  import { Icon, useFadeEffect, useUI } from '@faststore/ui'
13
- import { Suspense, useEffect } from 'react'
13
+ import { Suspense, useCallback, useEffect, useMemo } from 'react'
14
14
  import { useCart } from 'src/sdk/cart'
15
15
  import { useCheckoutButton } from 'src/sdk/cart/useCheckoutButton'
16
16
  import { useSession } from 'src/sdk/session'
@@ -21,6 +21,37 @@ import EmptyCart from '../EmptyCart'
21
21
  import OrderSummary from '../OrderSummary'
22
22
  import styles from './section.module.scss'
23
23
 
24
+ function useViewCartEvent() {
25
+ const {
26
+ currency: { code },
27
+ } = useSession()
28
+ const { items, gifts, total } = useCart()
29
+
30
+ const sendViewCartEvent = useCallback(() => {
31
+ return sendAnalyticsEvent<ViewCartEvent>({
32
+ name: 'view_cart',
33
+ params: {
34
+ currency: code as CurrencyCode,
35
+ value: total,
36
+ items: items.concat(gifts).map((item) => ({
37
+ item_id: item.itemOffered.isVariantOf.productGroupID,
38
+ item_name: item.itemOffered.isVariantOf.name,
39
+ item_brand: item.itemOffered.brand.name,
40
+ item_variant: item.itemOffered.sku,
41
+ quantity: item.quantity,
42
+ price: item.price,
43
+ discount: item.listPrice - item.price,
44
+ currency: code as CurrencyCode,
45
+ item_variant_name: item.itemOffered.name,
46
+ product_reference_id: item.itemOffered.gtin,
47
+ })),
48
+ },
49
+ })
50
+ }, [code, gifts, items, total])
51
+
52
+ return useMemo(() => ({ sendViewCartEvent }), [sendViewCartEvent])
53
+ }
54
+
24
55
  export interface CartSidebarProps {
25
56
  title: UICartSidebarProps['title']
26
57
  alert?: {
@@ -52,38 +83,21 @@ function CartSidebar({
52
83
  icon: { icon: checkoutButtonIcon, alt: checkoutButtonIconAlt },
53
84
  },
54
85
  }: CartSidebarProps) {
55
- const { currency } = useSession()
56
86
  const btnProps = useCheckoutButton()
57
- const cart = useCart()
87
+ const { items, gifts, totalItems, isValidating, subTotal, total } = useCart()
58
88
  const { cart: displayCart, closeCart } = useUI()
59
89
  const { fadeOut } = useFadeEffect()
90
+ const { sendViewCartEvent } = useViewCartEvent()
60
91
 
61
- const { items, gifts, totalItems, isValidating, subTotal, total } = cart
62
-
63
- const isEmpty = items.length === 0
92
+ const isEmpty = useMemo(() => items.length === 0, [items])
64
93
 
65
94
  useEffect(() => {
66
- sendAnalyticsEvent<ViewCartEvent>({
67
- name: 'view_cart',
68
- params: {
69
- currency: currency.code as CurrencyCode,
70
- value: total,
71
- items: items.concat(gifts).map((item) => ({
72
- item_id: item.itemOffered.isVariantOf.productGroupID,
73
- item_name: item.itemOffered.isVariantOf.name,
74
- item_brand: item.itemOffered.brand.name,
75
- item_variant: item.itemOffered.sku,
76
- quantity: item.quantity,
77
- price: item.price,
78
- discount: item.listPrice - item.price,
79
- currency: currency.code as CurrencyCode,
80
- item_variant_name: item.itemOffered.name,
81
- product_reference_id: item.itemOffered.gtin,
82
- })),
83
- },
84
- })
85
- // eslint-disable-next-line react-hooks/exhaustive-deps
86
- }, [])
95
+ if (!displayCart) {
96
+ return
97
+ }
98
+
99
+ sendViewCartEvent()
100
+ }, [displayCart, sendViewCartEvent])
87
101
 
88
102
  return (
89
103
  <>
@@ -1,19 +1,27 @@
1
- import { useSearch } from '@faststore/sdk'
1
+ import { sendAnalyticsEvent, useSearch } from '@faststore/sdk'
2
2
  import { gql } from '@faststore/graphql-utils'
3
3
 
4
4
  import { useQuery } from 'src/sdk/graphql/useQuery'
5
+
5
6
  import type {
6
7
  ProductGalleryQueryQuery as Query,
7
8
  ProductGalleryQueryQueryVariables as Variables,
8
9
  } from '@generated/graphql'
10
+ import type { IntelligentSearchQueryEvent } from 'src/sdk/analytics/types'
9
11
 
10
12
  import { useLocalizedVariables } from '../../../sdk/product/useProductsQuery'
13
+ import { useSession } from 'src/sdk/session'
11
14
 
12
15
  /**
13
16
  * This query is run on the browser and contains
14
17
  * the current search state of the user
15
18
  */
16
19
  export const query = gql`
20
+ fragment SearchEvent_metadata on SearchMetadata {
21
+ isTermMisspelled
22
+ logicalOperator
23
+ }
24
+
17
25
  query ProductGalleryQuery(
18
26
  $first: Int!
19
27
  $after: String!
@@ -36,6 +44,9 @@ export const query = gql`
36
44
  facets {
37
45
  ...Filter_facets
38
46
  }
47
+ metadata {
48
+ ...SearchEvent_metadata
49
+ }
39
50
  }
40
51
  }
41
52
  `
@@ -46,6 +57,8 @@ export const useGalleryQuery = () => {
46
57
  itemsPerPage,
47
58
  } = useSearch()
48
59
 
60
+ const { locale } = useSession()
61
+
49
62
  const localizedVariables = useLocalizedVariables({
50
63
  first: itemsPerPage,
51
64
  after: '0',
@@ -54,5 +67,21 @@ export const useGalleryQuery = () => {
54
67
  selectedFacets,
55
68
  })
56
69
 
57
- return useQuery<Query, Variables>(query, localizedVariables)
70
+ return useQuery<Query, Variables>(query, localizedVariables, {
71
+ onSuccess: (data) => {
72
+ if (data && term) {
73
+ sendAnalyticsEvent<IntelligentSearchQueryEvent>({
74
+ name: 'intelligent_search_query',
75
+ params: {
76
+ locale,
77
+ term,
78
+ url: window.location.href,
79
+ logicalOperator: data.search.metadata?.logicalOperator ?? 'and',
80
+ isTermMisspelled: data.search.metadata?.isTermMisspelled ?? false,
81
+ totalCount: data.search.products.pageInfo.totalCount,
82
+ },
83
+ })
84
+ }
85
+ },
86
+ })
58
87
  }
@@ -2,7 +2,10 @@
2
2
  * More info at: https://www.notion.so/vtexhandbook/Event-API-Documentation-48eee26730cf4d7f80f8fd7262231f84
3
3
  */
4
4
  import type { AnalyticsEvent } from '@faststore/sdk'
5
- import type { SearchSelectItemEvent } from '../../types'
5
+ import type {
6
+ IntelligentSearchQueryEvent,
7
+ SearchSelectItemEvent,
8
+ } from '../../types'
6
9
 
7
10
  import config from '../../../../../faststore.config'
8
11
  import { getCookie } from '../../../../utils/getCookie'
@@ -52,6 +55,15 @@ type SearchEvent =
52
55
  url: string
53
56
  type: 'search.click'
54
57
  }
58
+ | {
59
+ text: string
60
+ misspelled: boolean
61
+ match: number
62
+ operator: string
63
+ locale: string
64
+ url: string
65
+ type: 'search.query'
66
+ }
55
67
 
56
68
  const sendEvent = (options: SearchEvent & { url?: string }) =>
57
69
  fetch(`https://sp.vtex.com/event-api/v1/${config.api.storeId}/event`, {
@@ -71,30 +83,50 @@ const isFullTextSearch = (url: URL) =>
71
83
  typeof url.searchParams.get('q') === 'string' &&
72
84
  /^\/s(\/)?$/g.test(url.pathname)
73
85
 
74
- const handleEvent = (event: AnalyticsEvent | SearchSelectItemEvent) => {
75
- if (event.name !== 'search_select_item') {
76
- return
77
- }
78
-
79
- const url = new URL(event.params.url)
80
-
81
- if (!isFullTextSearch(url)) {
82
- return
83
- }
84
-
85
- for (const item of event.params.items ?? []) {
86
- const productId = item.item_id ?? item.item_variant
87
- const position = item.index
86
+ const handleEvent = (
87
+ event: AnalyticsEvent | SearchSelectItemEvent | IntelligentSearchQueryEvent
88
+ ) => {
89
+ switch (event.name) {
90
+ case 'search_select_item': {
91
+ const url = new URL(event.params.url)
92
+
93
+ if (!isFullTextSearch(url)) {
94
+ return
95
+ }
96
+
97
+ for (const item of event.params.items ?? []) {
98
+ const productId = item.item_id ?? item.item_variant
99
+ const position = item.index
100
+
101
+ if (productId && position) {
102
+ sendEvent({
103
+ type: 'search.click',
104
+ productId,
105
+ position,
106
+ url: url.href,
107
+ text: url.searchParams.get('q') ?? '<empty>',
108
+ })
109
+ }
110
+ }
111
+
112
+ break
113
+ }
88
114
 
89
- if (productId && position) {
115
+ case 'intelligent_search_query': {
90
116
  sendEvent({
91
- type: 'search.click',
92
- productId,
93
- position,
94
- url: url.href,
95
- text: url.searchParams.get('q') ?? '<empty>',
117
+ type: 'search.query',
118
+ url: event.params.url,
119
+ text: event.params.term,
120
+ misspelled: event.params.isTermMisspelled,
121
+ match: event.params.totalCount,
122
+ operator: event.params.logicalOperator,
123
+ locale: event.params.locale,
96
124
  })
125
+
126
+ break
97
127
  }
128
+
129
+ default:
98
130
  }
99
131
  }
100
132
 
@@ -20,3 +20,17 @@ export interface SearchSelectItemEvent {
20
20
  name: 'search_select_item'
21
21
  params: SearchSelectItemParams
22
22
  }
23
+
24
+ export interface IntelligentSearchQueryParams {
25
+ url: string
26
+ locale: string
27
+ term: string
28
+ logicalOperator: string
29
+ isTermMisspelled: boolean
30
+ totalCount: number
31
+ }
32
+
33
+ export interface IntelligentSearchQueryEvent {
34
+ name: 'intelligent_search_query'
35
+ params: IntelligentSearchQueryParams
36
+ }
@@ -1,10 +1,14 @@
1
- import { gql } from '@faststore/graphql-utils'
1
+ import { useMemo } from 'react'
2
2
 
3
+ import { sendAnalyticsEvent } from '@faststore/sdk'
4
+ import { gql } from '@faststore/graphql-utils'
3
5
  import { useQuery } from 'src/sdk/graphql/useQuery'
6
+
4
7
  import type {
5
8
  SearchSuggestionsQueryQuery as Query,
6
9
  SearchSuggestionsQueryQueryVariables as Variables,
7
10
  } from '@generated/graphql'
11
+ import type { IntelligentSearchQueryEvent } from '../analytics/types'
8
12
 
9
13
  import { useSession } from '../session'
10
14
 
@@ -24,6 +28,14 @@ const query = gql`
24
28
  ...ProductSummary_product
25
29
  }
26
30
  }
31
+ products {
32
+ pageInfo {
33
+ totalCount
34
+ }
35
+ }
36
+ metadata {
37
+ ...SearchEvent_metadata
38
+ }
27
39
  }
28
40
  }
29
41
  `
@@ -31,12 +43,34 @@ const query = gql`
31
43
  function useSuggestions(term: string, limit: number = MAX_SUGGESTIONS) {
32
44
  const { channel, locale } = useSession()
33
45
 
34
- const { data, error } = useQuery<Query, Variables>(query, {
35
- term,
36
- selectedFacets: [
37
- { key: 'channel', value: channel ?? '' },
38
- { key: 'locale', value: locale },
39
- ],
46
+ const variables = useMemo(
47
+ () => ({
48
+ term,
49
+ selectedFacets: [
50
+ { key: 'channel', value: channel ?? '' },
51
+ { key: 'locale', value: locale },
52
+ ],
53
+ }),
54
+ [term, locale, channel]
55
+ )
56
+ const { data, error } = useQuery<Query, Variables>(query, variables, {
57
+ onSuccess: (callbackData) => {
58
+ if (callbackData && term) {
59
+ sendAnalyticsEvent<IntelligentSearchQueryEvent>({
60
+ name: 'intelligent_search_query',
61
+ params: {
62
+ locale,
63
+ term,
64
+ url: window.location.href,
65
+ logicalOperator:
66
+ callbackData.search.metadata?.logicalOperator ?? 'and',
67
+ isTermMisspelled:
68
+ callbackData.search.metadata?.isTermMisspelled ?? false,
69
+ totalCount: callbackData.search.products.pageInfo.totalCount,
70
+ },
71
+ })
72
+ }
73
+ },
40
74
  })
41
75
 
42
76
  return {
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[148],{9767:function(e,t,r){var a=r(2784),n=r(5450);const c=(0,a.forwardRef)((function({value:e,as:t="span",variant:r="selling",testId:c="fs-price",formatter:i=(e=>e),SRText:s,...o},l){const u=i(e,r);return a.createElement(t,{ref:l,"data-fs-price":!0,"data-fs-price-variant":r,"data-testid":c,...o},s&&a.createElement(n.Z,{text:s}),u)}));t.Z=c},6148:function(e,t,r){r.r(t),r.d(t,{default:function(){return X}});var a=r(9499),n=r(4730),c=r(2784),i=r(101);const s=()=>{const e=(0,c.useContext)(i.c);return e?{inContext:!0,values:e}:{inContext:!1}},o=()=>{const{inContext:e,values:t}=s();return c.createElement(c.Fragment,null,e&&t.isLoading&&c.createElement("p",{"data-fs-search-dropdown-loading-text":!0},"Loading..."))};var l=(0,c.forwardRef)((function({testId:e="fs-search-dropdown",children:t,...r},a){return c.createElement("div",{ref:a,"data-fs-search-dropdown":!0,"data-testid":e,...r},c.createElement("section",null,c.createElement(o,null),t))})),u=r(4564);var d=({testId:e="fs-search-auto-complete",children:t,...r})=>{const{inContext:a,values:n}=s();return a&&(n.terms.length<=0||n.term.length<=0)?null:c.createElement("section",{"data-testid":e,"data-fs-search-auto-complete":!0,...r},c.createElement(u.Z,{as:"ol"},t))},f=r(2614),p=r(727);var m=({testId:e="fs-search-auto-complete-term",suggestion:t,term:r,linkProps:a,icon:n=c.createElement(f.Z,{name:"MagnifyingGlass",width:18,height:18})})=>{const i=t.toLowerCase().split(r.toLowerCase());return c.createElement("li",{"data-fs-search-auto-complete-item":!0,"data-testid":e},c.createElement(p.Z,{...a,"data-fs-search-auto-complete-item-link":!0,variant:"display"},c.createElement("span",{"data-fs-search-auto-complete-item-icon":!0},n),c.createElement("p",null,i.map(((e,a)=>c.createElement(c.Fragment,{key:[e,a].join()},e.length>0&&c.createElement("strong",{"data-fs-search-auto-complete-item-suggestion":!0},0===a?e.charAt(0).toUpperCase()+e.slice(1):e),a!==i.length-1&&function(e,t,r){return 0===e?t.split("").map(((e,t)=>0===t&&0===r.indexOf(e.toUpperCase())?e.toUpperCase():e.toLowerCase())).join(""):t.toLowerCase()}(a,r,t)))))))};var h=({testId:e="fs-search-products",title:t="Suggested Products",children:r,...a})=>{const{inContext:n,values:i}=s();return n&&i.products.length<=0?null:c.createElement("section",{"data-testid":e,"data-fs-search-products":!0,...a},c.createElement("header",{"data-fs-search-products-header":!0},c.createElement("p",{"data-fs-search-products-title":!0},t)),c.createElement(u.Z,{as:"ol"},r))},v=r(3339);var g=({testId:e="fs-search-history",title:t="History",clearLabel:r="Clear History",onClear:a,children:n,...i})=>{const{inContext:o,values:l}=s();return o&&(0!==l.term.length||l.isLoading)?null:c.createElement("section",{"data-testid":e,"data-fs-search-history":!0,...i},c.createElement("header",{"data-fs-search-history-header":!0},c.createElement("p",{"data-fs-search-history-title":!0},t),c.createElement(v.Z,{variant:"tertiary",onClick:a,size:"small"},r)),c.createElement(u.Z,{as:"ol"},n))};var O=({testId:e="fs-search-history-term",value:t,linkProps:r,icon:a=c.createElement(f.Z,{name:"ClockClockwise",width:18,height:18})})=>c.createElement("li",{"data-fs-search-history-item":!0,"data-testid":e},c.createElement(p.Z,{...r,"data-fs-search-history-item-link":!0,variant:"display"},c.createElement("span",{"data-fs-search-history-item-icon":!0},a),c.createElement("span",null,t))),y=r(5098),b=r(2322);function j(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function E(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?j(Object(r),!0).forEach((function(t){(0,a.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):j(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var P=e=>{var t=Object.assign({},e),{values:{onSearchSelection:r}}=s(),{searchHistory:a,clearSearchHistory:n}=(0,y.Z)();return a.length?(0,b.jsx)(g,E(E({title:"History",onClear:n},t),{},{children:a.map((e=>(0,b.jsx)(O,{value:e.term,linkProps:{href:e.path,onClick:()=>null===r||void 0===r?void 0:r(e.term,e.path)}},e.term)))})):null};var w=(0,c.forwardRef)((function({testId:e="fs-top-search",title:t="Top Search",children:r,...a},n){const{inContext:i,values:o}=s();return i&&(0!==o.term.length||o.isLoading)?null:c.createElement("section",{ref:n,"data-testid":e,"data-fs-search-top":!0,...a},c.createElement("header",{"data-fs-search-top-header":!0},c.createElement("p",{"data-fs-search-top-title":!0},t)),c.createElement(u.Z,{as:"ol"},r))})),k=r(276);var x=(0,c.forwardRef)((function({testId:e="fs-top-search-term",value:t,linkProps:r,index:a},n){return c.createElement("li",{ref:n,"data-fs-search-top-item":!0,"data-testid":e},c.createElement(p.Z,{...r,"data-fs-search-top-item-link":!0,variant:"display"},c.createElement(k.Z,{"data-fs-search-top-item-badge":!0,variant:"info"},a+1),t))})),C=r(5882),S=r(7732),Z=r(7295),D="TopSearchSuggestionsQuery";var _=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5,{channel:a,locale:n}=(0,Z.kP)(),{data:c,error:i}=(0,S.aM)(D,{term:"",selectedFacets:[{key:"channel",value:null!==a&&void 0!==a?a:""},{key:"locale",value:n}]});return{terms:(null!==(e=null===c||void 0===c?void 0:c.search.suggestions.terms)&&void 0!==e?e:t).slice(0,r),isLoading:!i&&!c}},I=["topTerms","sort"];function L(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function R(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?L(Object(r),!0).forEach((function(t){(0,a.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):L(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var T=function(e){var{topTerms:t,sort:r}=e,a=(0,n.Z)(e,I),{values:{onSearchSelection:c}}=s(),{terms:i}=_(t);return 0===i.length?null:(0,b.jsx)(w,R(R({title:"Top Search"},a),{},{children:i.map(((e,t)=>(0,b.jsx)(x,{value:e.value,index:t,linkProps:{href:(0,C.u)({term:e.value,sort:r}),onClick:()=>null===c||void 0===c?void 0:c(e.value,(0,C.u)({term:e.value,sort:r}))}},t)))}))};var F=(0,c.forwardRef)((function({testId:e="fs-search-product-item",linkProps:t,children:r},a){return c.createElement("li",{ref:a,"data-fs-search-product-item":!0,"data-testid":e},c.createElement(p.Z,{...t,"data-fs-search-product-item-link":!0,variant:"display"},r))}));var H=(0,c.forwardRef)((function({testId:e="fs-search-product-item-image",children:t,...r},a){return c.createElement("div",{ref:a,"data-fs-search-product-item-image":!0,"data-testid":e,...r},t)})),N=r(9767);var V=(0,c.forwardRef)((function({price:e,title:t,...r},a){return c.createElement("section",{ref:a,"data-fs-search-product-item-content":!0,...r},c.createElement("p",{"data-fs-search-product-item-title":!0},t),c.createElement("span",{"data-fs-search-product-item-prices":!0},c.createElement(N.Z,{value:e?.listPrice?e.listPrice:0,formatter:e?.formatter,testId:"list-price","data-value":e?.listPrice,variant:"listing",SRText:"Original price:"}),c.createElement(N.Z,{value:e?.value?e.value:0,formatter:e?.formatter,testId:"price","data-value":e?.value,variant:"spot",SRText:"Price:"})))})),G=r(9266),M=r(5346),U=r(9854),z=["product","index"],A=["href","onClick"];function Q(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function q(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Q(Object(r),!0).forEach((function(t){(0,a.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Q(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var B=function(e){var{product:t,index:r}=e,a=(0,n.Z)(e,z),{values:{onSearchSelection:c}}=s(),i=(0,U.w)({product:t,selectedOffer:0,index:r}),{href:o,onClick:l}=i,u=(0,n.Z)(i,A),{isVariantOf:{name:d},image:[f],offers:{lowPrice:p,offers:[{listPrice:m}]}}=t,h=q({href:o,onClick:()=>{l(),null===c||void 0===c||c(d,o)}},u);return(0,b.jsxs)(F,q(q({linkProps:h},a),{},{children:[(0,b.jsx)(H,{children:(0,b.jsx)(G.E,{src:f.url,alt:f.alternateName,width:56,height:56})}),(0,b.jsx)(V,{title:d,price:{value:p,listPrice:m,formatter:M.P}})]}))},J=["sort"];function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function W(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){(0,a.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var X=function(e){var{sort:t}=e,r=(0,n.Z)(e,J),{values:{onSearchSelection:a,products:c,term:i,terms:o}}=s();return(0,b.jsxs)(l,W(W({},r),{},{children:[(0,b.jsx)(P,{sort:t}),(0,b.jsx)(T,{sort:t}),(0,b.jsx)(d,{children:null===o||void 0===o?void 0:o.map((e=>{var{value:r}=e;return(0,b.jsx)(m,{term:i,suggestion:r,linkProps:{href:(0,C.u)({term:r,sort:t}),onClick:()=>null===a||void 0===a?void 0:a(r,(0,C.u)({term:r,sort:t}))}},r)}))}),(0,b.jsx)(h,{children:c.map(((e,t)=>{var r=e;return(0,b.jsx)(B,{product:r,index:t},r.id)}))})]}))}},5346:function(e,t,r){r.d(t,{P:function(){return c}});var a=r(2784),n=r(7295),c=e=>{var t=function(){var{decimals:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{currency:t,locale:r}=(0,n.kP)();return(0,a.useCallback)((a=>Intl.NumberFormat(r,{style:"currency",currency:t.code,minimumFractionDigits:e?2:0}).format(a)),[t.code,r,e])}();return(0,a.useMemo)((()=>t(e)),[t,e])}},9854:function(e,t,r){r.d(t,{w:function(){return i}});var a=r(1072),n=r(2784),c=r(7295),i=e=>{var{index:t,product:r,selectedOffer:i}=e,{slug:s}=r,{currency:{code:o}}=(0,c.kP)(),l=(0,n.useCallback)((()=>{(0,a._)({name:"select_item",params:{items:[{item_id:r.isVariantOf.productGroupID,item_name:r.isVariantOf.name,item_brand:r.brand.name,item_variant:r.sku,index:t,price:r.offers.offers[i].price,discount:r.offers.offers[i].listPrice-r.offers.offers[i].price,currency:o,item_variant_name:r.name,product_reference_id:r.gtin}]}}),(0,a._)({name:"search_select_item",params:{url:window.location.href,items:[{item_id:r.isVariantOf.productGroupID,item_variant:r.sku,index:t}]}})}),[o,r,t,i]);return{href:"/".concat(s,"/p"),onClick:l,"data-testid":"product-link"}}}}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[238],{1953:function(e,t,r){"use strict";var n=r(2784);const a=(0,n.forwardRef)((function({testId:e="fs-label",children:t,...r},a){return n.createElement("label",{ref:a,"data-fs-label":!0,"data-testid":e,...r},t)}));t.Z=a},9767:function(e,t,r){"use strict";var n=r(2784),a=r(5450);const i=(0,n.forwardRef)((function({value:e,as:t="span",variant:r="selling",testId:i="fs-price",formatter:o=(e=>e),SRText:s,...c},l){const d=o(e,r);return n.createElement(t,{ref:l,"data-fs-price":!0,"data-fs-price-variant":r,"data-testid":i,...c},s&&n.createElement(a.Z,{text:s}),d)}));t.Z=i},792:function(e,t,r){"use strict";var n=r(2784);const a=(0,n.forwardRef)((function({testId:e="fs-skeleton",loading:t=!0,shimmer:r=!0,children:a,size:i,border:o,borderRadius:s,...c},l){const d={width:i.width,height:i.height};return t?n.createElement("div",{ref:l,"data-fs-skeleton":!0,"data-testid":e,"data-fs-skeleton-border":o||null,style:s?{...d,borderRadius:s}:d,...c},r&&n.createElement("div",{"data-fs-skeleton-shimmer":!0})):n.createElement(n.Fragment,null,a)}));t.Z=a},2946:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});var n=r(2784),a=r(276);var i=({listPrice:e,spotPrice:t,thresholdLow:r=15,thresholdHigh:i=40,size:o,testId:s="fs-discount-badge"})=>{const c=((e,t)=>(0,n.useMemo)((()=>{const r=100*(e-t)/e;return Math.round(r)}),[t,e]))(e,t);if(0===c)return n.createElement(n.Fragment,null);const l=c<=r?"low":c<=i?"medium":"high";return n.createElement(a.Z,{"data-fs-discount-badge":!0,"data-fs-discount-badge-variant":l,size:o,"data-testid":s},c,"% off")}},3779:function(e,t,r){"use strict";var n=r(2784),a=r(2256),i=r(1953),o=r(7041),s=r(2614),c=r(3339);t.Z=({id:e,label:t,type:r="text",error:l,displayClearButton:d,actionable:u,buttonActionText:f="Apply",onSubmit:p,onClear:m,placeholder:v=" ",inputRef:b,disabled:g,value:h,testId:y="fs-input-field",...P})=>{const w=!g&&l&&""!==l,O=u&&!g&&""!==h;return n.createElement("div",{"data-fs-input-field":!0,"data-fs-input-field-actionable":u,"data-fs-input-field-error":l&&""!==l,"data-testid":y},n.createElement(a.Z,{id:e,type:r,value:h,ref:b,disabled:g,placeholder:v,...P}),n.createElement(i.Z,{htmlFor:e},t),O&&(d||l?n.createElement(o.Z,{size:"small","aria-label":"Clear Field",icon:n.createElement(s.Z,{name:"XCircle"}),onClick:()=>{m?.(),b?.current?.focus()}}):n.createElement(c.Z,{variant:"tertiary",size:"small",onClick:p},f)),w&&n.createElement("span",{"data-fs-input-field-error-message":!0},l))}},3024:function(e,t,r){"use strict";var n=r(2784),a=r(2614),i=r(7041),o=r(4564);const s=(0,n.forwardRef)((function({children:e,testId:t="fs-rating",length:r=5,value:s=0,icon:c,onChange:l,...d},u){const[f,p]=(0,n.useState)(0),m={"data-fs-rating-icon-outline":!0},v=n.isValidElement(c)?c:n.createElement(a.Z,{name:"Star"});return n.createElement(o.Z,{ref:u,"data-fs-rating":!0,"data-fs-rating-actionable":"function"===typeof l,"data-testid":t,...d},Array.from({length:r}).map(((e,r)=>{const o=r+1;return n.createElement("li",{key:`rating-${r}`,"data-fs-rating-item":o<=(f||s)?"full":o-s>0&&o-s<1?"partial":"empty","data-testid":`${t}-item`},l?n.createElement(i.Z,{"data-fs-rating-button":!0,icon:v,size:"small","aria-label":"rate",onClick:()=>{l(o)},onMouseEnter:()=>p(o),onMouseLeave:()=>p(s)}):n.createElement(n.Fragment,null,n.createElement("div",{"data-fs-rating-icon-wrapper":!0},v),n.isValidElement(c)?n.cloneElement(c,m):n.createElement(a.Z,{name:"Star","data-fs-rating-icon-outline":!0})))})))}));t.Z=s},8091:function(e,t,r){"use strict";r.d(t,{Z:function(){return k}});var n=r(9499),a=r(4730),i=r(2784);var o=(0,i.forwardRef)((function({testId:e="fs-product-card",variant:t="default",bordered:r=!1,outOfStock:n,children:a,...o},s){return i.createElement("article",{ref:s,"data-fs-product-card":n?"out-of-stock":"","data-fs-product-card-variant":t,"data-fs-product-card-bordered":r,"data-testid":e,...o},a)}));var s=(0,i.forwardRef)((function({testId:e="fs-product-card-image",aspectRatio:t=1,children:r,...n},a){return i.createElement("div",{ref:a,"data-fs-product-card-image":!0,"data-testid":e,style:{"--fs-product-card-image-aspect-ratio":t},...n},r)})),c=r(727),l=r(9767),d=r(3024),u=r(2614),f=r(2946),p=r(276),m=r(3339);var v=(0,i.forwardRef)((function({testId:e="fs-product-card-content",title:t,linkProps:r,price:n,outOfStock:a,outOfStockLabel:o="Out of stock",ratingValue:s,showDiscountBadge:v,buttonLabel:b="Add",onButtonClick:g,children:h,...y},P){const w=n?.listPrice??0,O=n?.value??0;return i.createElement("section",{ref:P,"data-fs-product-card-content":!0,"data-fs-product-card-badge":v,"data-testid":e,...y},i.createElement("div",{"data-fs-product-card-heading":!0},i.createElement("h3",{"data-fs-product-card-title":!0},i.createElement(c.Z,{...r,title:t},i.createElement("span",null,t))),!a&&i.createElement("div",{"data-fs-product-card-prices":!0},O!==w?i.createElement(i.Fragment,null,i.createElement(l.Z,{value:w,formatter:n?.formatter,testId:"list-price","data-value":w,variant:"listing",SRText:"Original price:"}),i.createElement(l.Z,{value:O,formatter:n?.formatter,testId:"price","data-value":O,variant:"spot",SRText:"Sale Price:"})):i.createElement(l.Z,{value:O,formatter:n?.formatter,testId:"price","data-value":O,variant:"spot",SRText:"Sale Price:"})),s&&i.createElement(d.Z,{value:s,icon:i.createElement(u.Z,{name:"Star"})})),v&&!a&&i.createElement(f.Z,{listPrice:n?.listPrice?n.listPrice:0,spotPrice:n?.value?n.value:0}),a&&i.createElement(p.Z,null,o),g&&!a&&i.createElement("div",{"data-fs-product-card-actions":!0},i.createElement(m.Z,{variant:"primary",icon:i.createElement(u.Z,{name:"ShoppingCart"}),iconPosition:"left",size:"small",onClick:g},b)))})),b=r(1664),g=r.n(b),h=r(9266),y=r(5346),P=r(9854),w=r(2322),O=["product","index","bordered","variant","aspectRatio","imgProps","ratingValue","buttonLabel","onButtonClick","showDiscountBadge"];function x(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function E(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?x(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):x(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function j(e){var t,r,{product:n,index:c,bordered:l=!0,variant:d="default",aspectRatio:u=1,imgProps:f,ratingValue:p,buttonLabel:m="Add",onButtonClick:b,showDiscountBadge:x=!0}=e,j=(0,a.Z)(e,O),{sku:k,isVariantOf:{name:I},image:[S],offers:{lowPrice:_,offers:[{listPrice:Z,availability:C}]}}=n,R=E(E({},(0,P.w)({product:n,selectedOffer:0,index:c})),{},{as:g(),passHref:!0,legacyBehavior:!1,prefetch:!1}),D=(0,i.useMemo)((()=>"https://schema.org/InStock"!==C),[C]);return(0,w.jsxs)(o,E(E({outOfStock:D,bordered:l,variant:d,"data-fs-product-card-sku":k},j),{},{children:[(0,w.jsx)(s,{aspectRatio:u,children:(0,w.jsx)(h.E,{src:S.url,alt:S.alternateName,sizes:"".concat(null!==(t=null===f||void 0===f?void 0:f.sizes)&&void 0!==t?t:"(max-width: 768px) 40vw, 30vw"),width:null!==(r=null===f||void 0===f?void 0:f.width)&&void 0!==r?r:360,height:Math.round((Number(null===f||void 0===f?void 0:f.height)||360)/u),loading:null===f||void 0===f?void 0:f.loading})}),(0,w.jsx)(v,{title:I,price:{value:_,listPrice:Z,formatter:y.P},ratingValue:p,outOfStock:D,onButtonClick:b,linkProps:R,showDiscountBadge:x})]}))}var k=(0,i.memo)(j)},8463:function(e,t,r){"use strict";r.d(t,{Z:function(){return y}});var n=r(9499),a=r(2784);const i=(0,a.createContext)(void 0);var o=(0,a.forwardRef)((function({children:e,testId:t="fs-banner-text",variant:r="primary",colorVariant:n="main",...o},s){const c={variant:r,colorVariant:n};return a.createElement(i.Provider,{value:c},a.createElement("article",{ref:s,"data-fs-banner-text":!0,"data-fs-banner-text-variant":r,"data-fs-banner-text-color-variant":n,"data-testid":t,...o},e))})),s=r(3922);var c=(0,a.forwardRef)((function({testId:e="fs-banner-text-content",title:t,caption:r,link:n,linkText:o,...c},l){const{variant:d,colorVariant:u}=function(){const e=(0,a.useContext)(i);if(void 0===e)throw new Error("Do not use BannerText components outside the BannerText context.");return e}();return a.createElement("header",{ref:l,"data-fs-banner-text-content":!0,"data-fs-content":"banner-text","data-testid":e,...c},a.createElement("div",{"data-fs-banner-text-heading":!0,"data-fs-banner-text-color-variant":u},a.createElement("h2",null,t),"secondary"===d&&r&&a.createElement("p",null,r)),a.createElement(s.Z,{"data-fs-banner-text-link":!0,href:n,variant:d,inverse:"main"===u,"aria-label":o},o))})),l=r(9104),d={section:"BannerText"},{BannerText:u,BannerTextContent:f}=(0,l.f)({BannerText:o,BannerTextContent:c},d),p=r(7067),m=r(23),v=r.n(m),b=r(2322);function g(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?g(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):g(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var y=function(e){var t,r,{title:n,caption:a,link:{url:i=f.props.link,text:o=f.props.linkText},variant:s=(null!==(t=u.props.variant)&&void 0!==t?t:"primary"),colorVariant:c=(null!==(r=u.props.colorVariant)&&void 0!==r?r:"main")}=e;return(0,b.jsx)(p.Z,{className:"".concat(v().section," section-banner layout__section"),children:(0,b.jsx)("div",{className:"layout__content",children:(0,b.jsx)(u.Component,h(h({},u.props),{},{variant:s,colorVariant:c,children:(0,b.jsx)(f.Component,h(h({},f.props),{},{title:n,caption:a,link:i,linkText:o}))}))})})}},5168:function(e,t,r){"use strict";r.d(t,{Z:function(){return L}});var n=r(9499),a=r(4730),i=r(2784),o=r(1503),s=r(4262),c=r(6652),l=r(29),d=r(9857),u=r(180),f=r(7732),p=(e,t,r)=>{var n=(0,d.ZP)((0,f.km)(e,t),(()=>null),f.WN),a=function(){var t=(0,l.Z)((function*(t){var a=yield(0,u.W)(e,t,r);n.mutate(a,!1)}));return function(e){return t.apply(this,arguments)}}();return[a,n]},m=r(2614),v=r(3779),b=r(3339),g=r(9104),h={section:"Newsletter"},{ToastIconSuccess:y,ToastIconError:P,HeaderIcon:w,InputFieldName:O,InputFieldEmail:x,Button:E}=(0,g.f)({ToastIconSuccess:m.Z,ToastIconError:m.Z,HeaderIcon:m.Z,InputFieldName:v.Z,InputFieldEmail:v.Z,Button:b.Z},h),j=r(2322);function k(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function I(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?k(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):k(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var S=e=>{if(!e)return"";var t=JSON.parse(e);return(0,s.E)((0,o.convertFromRaw)(t),{entityStyleFn:e=>{if("link"===e.get("type").toLowerCase())return{element:"a",attributes:{"data-fs-link":"true","data-fs-link-variant":"inline","data-fs-link-inverse":"true","data-fs-link-size":"regular","data-testid":"fs-link",href:e.getData().url}}}})},_=(0,i.forwardRef)((function(e,t){var r,{icon:n,title:a,description:o,privacyPolicy:s,emailInputLabel:l,displayNameInput:d,nameInputLabel:u,subscribeButtonLabel:f,subscribeButtonLoadingLabel:m,card:v,toastSubscribe:b,toastSubscribeError:g}=e,{subscribeUser:h,loading:k,data:_}=(()=>{var[e,{data:t,error:r,isValidating:n}]=p("SubscribeToNewsletter",{data:{name:"",email:""}});return{subscribeUser:e,data:t,error:r,loading:n}})(),Z=(0,i.useRef)(null),C=(0,i.useRef)(null),{pushToast:R}=((0,i.useMemo)((()=>k?m:f),[k,f,m]),(0,c.l)());return(0,j.jsx)("div",{"data-fs-newsletter":v?"card":"",children:(0,j.jsxs)("form",{ref:t,"data-fs-newsletter-form":!0,"data-fs-content":"newsletter",onSubmit:e=>{var t,r,n,a,i,o,s;(e.preventDefault(),h({data:{name:null!==(t=null===(r=Z.current)||void 0===r?void 0:r.value)&&void 0!==t?t:"",email:null!==(n=null===(a=C.current)||void 0===a?void 0:a.value)&&void 0!==n?n:""}}),null!==_&&void 0!==_&&null!==(i=_.subscribeToNewsletter)&&void 0!==i&&i.id)?R(I(I({},b),{},{status:"INFO",icon:(0,j.jsx)(y.Component,I(I({width:30,height:30},y.props),{},{name:null!==(o=b.icon)&&void 0!==o?o:y.props.name}))})):R(I(I({},g),{},{status:"ERROR",icon:(0,j.jsx)(P.Component,I(I({width:30,height:30},P.props),{},{name:null!==(s=b.icon)&&void 0!==s?s:P.props.name}))}));e.currentTarget.reset()},children:[(0,j.jsxs)("header",{"data-fs-newsletter-header":!0,children:[(0,j.jsxs)("h3",{children:[(0,j.jsx)(w.Component,I(I({width:32,height:32},w.props),{},{name:null!==(r=null===n||void 0===n?void 0:n.icon)&&void 0!==r?r:w.props.name})),a]}),o&&(0,j.jsxs)("span",{children:[" ",o]})]}),(0,j.jsx)("div",{"data-fs-newsletter-controls":!0,children:(0,j.jsxs)(j.Fragment,{children:[d?(0,j.jsx)(O.Component,I(I({id:"newsletter-name",required:!0},O.props),{},{label:null!==u&&void 0!==u?u:O.props.label,inputRef:Z})):null,(0,j.jsx)(x.Component,I(I({id:"newsletter-email",type:"email",required:!0},x.props),{},{label:null!==l&&void 0!==l?l:x.props.label,inputRef:C})),(0,j.jsx)("span",{"data-fs-newsletter-addendum":!0,dangerouslySetInnerHTML:{__html:S(s)}}),(0,j.jsx)(E.Component,I(I({variant:"secondary",inverse:!0,type:"submit"},E.props),{},{children:k?m:f}))]})})]})})})),Z=r(7067),C=r(1778),R=r.n(C),D=["icon","title","description","privacyPolicy","emailInputLabel","displayNameInput","nameInputLabel","subscribeButtonLabel","card","toastSubscribe","toastSubscribeError"];function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function B(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var L=function(e){var{icon:t,title:r,description:n,privacyPolicy:i,emailInputLabel:o,displayNameInput:s,nameInputLabel:c,subscribeButtonLabel:l,card:d,toastSubscribe:u,toastSubscribeError:f}=e,p=(0,a.Z)(e,D);return(0,j.jsx)(Z.Z,{className:"".concat(R().section," section-newsletter"),children:(0,j.jsx)(_,B({icon:t,title:r,description:n,privacyPolicy:i,emailInputLabel:o,displayNameInput:s,nameInputLabel:c,subscribeButtonLabel:l,toastSubscribe:u,toastSubscribeError:f,card:d},p))})}},3288:function(e,t,r){"use strict";r.d(t,{Z:function(){return i}});var n=r(792),a=r(2322);var i=function(e){var{bordered:t,sectioned:r,displayButton:i,aspectRatio:o=1,variant:s="default"}=e;return(0,a.jsxs)("div",{"data-fs-product-card-skeleton":!0,"data-fs-product-card-skeleton-variant":s,"data-fs-product-card-skeleton-bordered":t,"data-fs-product-card-skeleton-sectioned":r,children:[(0,a.jsx)("div",{"data-fs-product-card-skeleton-image":!0,style:{"--fs-product-card-skeleton-image-aspect-ratio":o},children:(0,a.jsx)(n.Z,{size:{width:"100%",height:"100%"}})}),(0,a.jsxs)("div",{"data-fs-product-card-skeleton-content":!0,children:[(0,a.jsx)(n.Z,{"data-fs-product-card-skeleton-text":!0,size:{width:"90%",height:"1.5rem"}}),(0,a.jsx)(n.Z,{"data-fs-product-card-skeleton-text":!0,size:{width:"70%",height:"1.5rem"}}),(0,a.jsx)(n.Z,{"data-fs-product-card-skeleton-badge":!0,size:{width:"6rem",height:"2rem"},border:"pill"}),i&&(0,a.jsx)(n.Z,{"data-fs-product-card-skeleton-button":!0,size:{width:"6rem",height:"2rem"},style:{columnGap:".75rem"}})]})]})}},1309:function(e,t,r){"use strict";r.d(t,{Z:function(){return L}});var n=r(9499),a=r(4730),i=r(2784);var o=(0,i.forwardRef)((function({testId:e="fs-product-shelf",children:t,...r},n){return i.createElement("div",{ref:n,"data-fs-product-shelf":!0,"data-fs-content":"product-shelf","data-testid":e,...r},t)}));var s=(0,i.forwardRef)((function({testId:e="fs-product-shelf-items",children:t,...r},n){return i.createElement("ul",{role:"list",ref:n,"data-fs-product-shelf-items":!0,"data-fs-content":"product-shelf","data-testid":e,...r},t)}));var c=(0,i.forwardRef)((function({testId:e="fs-product-shelf-item",children:t,...r},n){return i.createElement("li",{role:"listitem",ref:n,"data-fs-product-shelf-item":!0,"data-testid":e,...r},t)})),l=r(8459),d=r(3288),u=r(2322);var f=function(e){var{children:t,aspectRatio:r,loading:n=!0}=e;return n?(0,u.jsx)(o,{"data-fs-product-shelf-skeleton":!0,children:(0,u.jsx)(s,{children:Array.from({length:l.K},((e,t)=>(0,u.jsx)(c,{children:(0,u.jsx)(d.Z,{aspectRatio:r,sectioned:!0,bordered:!0})},String(t))))})}):(0,u.jsx)(u.Fragment,{children:t})},p=r(5184),m=r(737);var v=r(8091),b=r(7041),g=r(2614),h=r(5724);function y(e,t){switch(t.type){case"NEXT_PAGE":{const t=e.infinite?e.totalPages+1:e.totalPages,r=(e.currentPage+1)%t,n=r%t*e.itemsPerPage;return{...e,sliding:!0,slideDirection:"next",currentItem:n,currentPage:r}}case"PREVIOUS_PAGE":{const t=e.infinite?e.totalPages+1:e.totalPages,r=e.infinite&&0===e.currentPage?-1:((e,t)=>(t-(t-e+1)%t)%t)(e.currentPage,e.totalPages);return{...e,sliding:!0,slideDirection:"previous",currentItem:r%t*e.itemsPerPage,currentPage:r}}case"GO_TO_PAGE":return t.payload.pageIndex===e.currentPage?e:{...e,sliding:t.payload.shouldSlide,slideDirection:t.payload.pageIndex>e.currentPage?"next":"previous",currentItem:t.payload.pageIndex%e.totalPages*e.itemsPerPage,currentPage:t.payload.pageIndex};case"STOP_SLIDE":return{...e,sliding:!1};default:return e}}const P=(e,t)=>{"next"===e&&t({type:"NEXT_PAGE"}),"previous"===e&&t({type:"PREVIOUS_PAGE"}),"number"===typeof e&&t({type:"GO_TO_PAGE",payload:{pageIndex:e,shouldSlide:!0}})},w=({totalItems:e,itemsPerPage:t=1,infiniteMode:r=!1,shouldSlideOnSwipe:n=!0,...a})=>{const[o,s]=(0,i.useReducer)(y,void 0,(()=>((e,t,r)=>({currentItem:0,currentPage:0,sliding:!1,slideDirection:"next",totalItems:e,itemsPerPage:t,totalPages:Math.ceil(e/t),infinite:r}))(e,t,r)));return{handlers:(0,h.QS)({onSwipedRight:()=>n&&P("previous",s),onSwipedLeft:()=>n&&P("next",s),trackMouse:!0,...a}),slide:P,sliderState:o,sliderDispatch:s}};var O=r(3339);const x=(e,t,r)=>r?`Current page from ${e}`:`Go to page ${t+1} from ${e}`;var E=(0,i.forwardRef)((function({id:e,totalQuantity:t,activeBullet:r,onClick:n,testId:a="fs-carousel-bullets",ariaLabelGenerator:o=x,ariaControlsGenerator:s,...c},l){const d=(0,i.useMemo)((()=>Array(t).fill(0)),[t]);return i.createElement("div",{ref:l,"data-fs-carousel-bullets":!0,"data-testid":a,role:"tablist",...c},d.map(((t,c)=>{const l=r===c;return i.createElement(O.Z,{key:`${e}-${c}`,role:"tab",tabIndex:-1,"data-fs-carousel-bullet":!0,testId:`${a}-bullet`,onClick:e=>n(e,c),"aria-label":o(e,c,l),"aria-controls":s?.(c),"aria-selected":l,variant:"tertiary"})})))}));var j=function({id:e,index:t,state:r,children:n,totalItems:a,infiniteMode:o,isScrollCarousel:s}){const{isItemVisible:c,shouldRenderItem:l}=(({currentSlide:e,itemsPerPage:t,totalItems:r})=>{const n=(0,i.useRef)(new Set);(0,i.useEffect)((()=>{for(let r=0;r<t;r++)n.current.add(e+r)}),[e,t]);const a=n=>function({itemsPerPage:e,currentSlide:t,slideIdx:r,totalItems:n}){return t<0||t>=n||r>=t&&r<t+e}({slideIdx:n,currentSlide:e,itemsPerPage:t,totalItems:r});return{shouldRenderItem:e=>n.current.has(e)||a(e),isItemVisible:a}})({totalItems:a,currentSlide:r.currentItem,itemsPerPage:r.itemsPerPage}),d=!s&&{width:"100%"}||s&&{maxWidth:"60%",display:"inline-block"},u=s||l(t-Number(o));return i.createElement("li",{style:d,id:`${e}-carousel-item-${t}`,"data-fs-carousel-item":!0,"data-fs-carousel-item-visible":c(t-Number(o))||void 0},u?n:null)};var k=function({children:e,className:t,"aria-label":r,infiniteMode:n=!0,controls:a="complete",testId:o="fs-carousel",transition:s={duration:400,property:"transform"},id:c="fs-carousel",variant:l="slide",itemsPerPage:d=1,navigationIcons:u,...f}){const p=(0,i.useRef)(null),m="slide"===l,v="scroll"===l,h=i.Children.toArray(e),y=h.length,P=n?y+2:y,O=`${s.property} ${s.duration}ms ${s.timing??""} ${s.delay??""}`,{handlers:x,slide:k,sliderState:I,sliderDispatch:S}=w({itemsPerPage:d,infiniteMode:n,totalItems:y,shouldSlideOnSwipe:m,...f}),_=Math.ceil(y/I.itemsPerPage),Z=1!==_&&("complete"===a||"navigationArrows"===a),C=1!==_&&("complete"===a||"paginationBullets"===a),R=(0,i.useMemo)((()=>((e,t)=>{const r={},n=100/t;for(let a=0;a<t;++a){const t=-n*a;r[e?a-1:a]=t}return r})(n,P)),[P,n]),D=n&&e?h.slice(0,1):[],T=(n&&e?h.slice(y-1):[]).concat(e??[],D),B=(0,i.useMemo)((()=>({width:100*P+"%",transition:I.sliding?O:void 0,transform:`translate3d(${R[I.currentPage]}%, 0, 0)`})),[P,R,O,I.sliding,I.currentPage]),L=(0,i.useMemo)((()=>({width:"100%",overflowX:"scroll",whiteSpace:"nowrap"})),[]),N=m&&B||v&&L,V=()=>{I.sliding||!n&&0===I.currentPage||k("previous",S)},M=()=>{I.sliding||!n&&I.currentPage===y-1||k("next",S)},A=async(e,t)=>{if("previous"===t&&0===I.currentPage)return;if("next"===t&&I.currentPage===I.totalPages-1)return;let r;const n=Number(p.current?.firstElementChild?.clientWidth);r=d>1?e*n*d:e*n-.125*n,p.current?.scrollTo({left:r,behavior:"smooth"}),k(e,S)};return i.createElement("section",{id:c,"data-fs-carousel":!0,className:t,"data-testid":o,"aria-label":r},i.createElement("div",{"data-fs-carousel-track-container":!0,style:{width:"100%",overflow:"hidden",display:v?"block":void 0},...x},i.createElement("ul",{"aria-live":"polite",ref:p,style:N,"data-fs-carousel-track":!0,onScroll:e=>{if(m||d>1)return;const t=Number(e.currentTarget.firstElementChild?.scrollWidth),r=e.currentTarget?.scrollLeft,n=(r>t/2?Math.round:Math.floor)(r/t);k(n,S)},onTransitionEnd:()=>{S({type:"STOP_SLIDE"}),n&&I.currentItem>=y&&S({type:"GO_TO_PAGE",payload:{pageIndex:0,shouldSlide:!1}}),n&&I.currentItem<0&&S({type:"GO_TO_PAGE",payload:{pageIndex:I.totalPages-1,shouldSlide:!1}})}},T.map(((e,t)=>i.createElement(j,{id:c,index:t,key:String(t),state:I,totalItems:y,infiniteMode:n,isScrollCarousel:v},e))))),Z&&i.createElement("div",{"data-fs-carousel-controls":!0},i.createElement(b.Z,{"data-fs-carousel-control":"left","aria-controls":c,"aria-label":"previous",icon:u?.left??i.createElement(g.Z,{name:"ArrowLeft",width:20,height:20,weight:"bold"}),onClick:()=>{m&&V(),v&&A(I.currentPage-1,"previous")}}),i.createElement(b.Z,{"data-fs-carousel-control":"right","aria-controls":c,"aria-label":"next",icon:u?.right??i.createElement(g.Z,{name:"ArrowRight",width:20,height:20,weight:"bold"}),onClick:()=>{m&&M(),v&&A(I.currentPage+1,"next")}})),C&&i.createElement(E,{id:c,tabIndex:0,activeBullet:I.currentPage,totalQuantity:_,onKeyDown:e=>{switch(e.key){case"ArrowLeft":m&&V(),v&&A(I.currentPage-1,"previous");break;case"ArrowRight":m&&M(),v&&A(I.currentPage+1,"next");break;case"Home":k(0,S);break;case"End":k(y-1,S)}},onClick:async(e,t)=>{m&&!I.sliding&&k(t,S),v&&A(t)},onFocus:e=>e.currentTarget.focus(),ariaControlsGenerator:e=>`${c}-carousel-item-${e}`}))};var I=function(e){var{id:t,testId:r,children:n,itemsPerPage:a=5}=e,i=window.innerWidth<=768;return(0,u.jsx)(k,{id:t,testId:r,variant:"scroll",infiniteMode:!1,itemsPerPage:i?1:a,children:n})},S=r(9104),_={section:"ProductShelf"},{ProductShelf:Z,__experimentalCarousel:C,__experimentalProductCard:R}=(0,S.f)({ProductShelf:o,__experimentalCarousel:I,__experimentalProductCard:v.Z},_),D=["title","inView","productCardConfiguration"];function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function B(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var L=function(e){var t,{title:r,inView:n,productCardConfiguration:{bordered:o=R.props.bordered,showDiscountBadge:s=R.props.showDiscountBadge}={}}=e,c=(0,a.Z)(e,D),l=function(e){var t,r=e.replace(/[^\w\s]/gi,"-");return null!==(t=r=(r=r.replace(/\s+/g,"-")).toLowerCase())&&void 0!==t?t:""}(r),d=(0,i.useId)(),v=(0,i.useRef)(!1),b=(0,m.kN)(c),g=null!==(t=null===b||void 0===b?void 0:b.edges)&&void 0!==t?t:[],{sendViewItemListEvent:h}=(0,p.m)({products:g,title:r,page:0,pageSize:0});return(0,i.useEffect)((()=>{n&&!v.current&&g.length&&(h(),v.current=!0)}),[n,g.length,h]),0===(null===b||void 0===b?void 0:b.edges.length)?null:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("h2",{className:"text__title-section layout__content",children:r}),(0,u.jsx)(f,{aspectRatio:1,loading:void 0===b,children:(0,u.jsx)(Z.Component,B(B({},Z.props),{},{children:(0,u.jsx)(C.Component,B(B({id:l||d},C.props),{},{children:g.map(((e,t)=>(0,i.createElement)(R.Component,B(B({aspectRatio:1,imgProps:{width:216,height:216,sizes:"(max-width: 768px) 42vw, 30vw"}},R.props),{},{bordered:o,showDiscountBadge:s,key:"".concat(e.node.id),product:e.node,index:t+1}))))}))}))})]})}},8459:function(e,t,r){"use strict";r.d(t,{K:function(){return a},g:function(){return n}});var n=12,a=5},5184:function(e,t,r){"use strict";r.d(t,{m:function(){return o}});var n=r(1072),a=r(2784),i=r(7295),o=e=>{var{products:t,title:r,page:o,pageSize:s}=e,{currency:{code:c}}=(0,i.kP)();return{sendViewItemListEvent:(0,a.useCallback)((()=>{(0,n._)({name:"view_item_list",params:{item_list_name:r,item_list_id:r,items:t.map(((e,t)=>{var{node:r}=e;return{item_id:r.isVariantOf.productGroupID,item_name:r.isVariantOf.name,item_brand:r.brand.name,item_variant:r.sku,price:r.offers.offers[0].price,index:o*s+t+1,discount:r.offers.offers[0].listPrice-r.offers.offers[0].price,currency:c,item_variant_name:r.name,product_reference_id:r.gtin}}))}})}),[c,t,r,o,s])}}},5346:function(e,t,r){"use strict";r.d(t,{P:function(){return i}});var n=r(2784),a=r(7295),i=e=>{var t=function(){var{decimals:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{currency:t,locale:r}=(0,a.kP)();return(0,n.useCallback)((n=>Intl.NumberFormat(r,{style:"currency",currency:t.code,minimumFractionDigits:e?2:0}).format(n)),[t.code,r,e])}();return(0,n.useMemo)((()=>t(e)),[t,e])}},9854:function(e,t,r){"use strict";r.d(t,{w:function(){return o}});var n=r(1072),a=r(2784),i=r(7295),o=e=>{var{index:t,product:r,selectedOffer:o}=e,{slug:s}=r,{currency:{code:c}}=(0,i.kP)(),l=(0,a.useCallback)((()=>{(0,n._)({name:"select_item",params:{items:[{item_id:r.isVariantOf.productGroupID,item_name:r.isVariantOf.name,item_brand:r.brand.name,item_variant:r.sku,index:t,price:r.offers.offers[o].price,discount:r.offers.offers[o].listPrice-r.offers.offers[o].price,currency:c,item_variant_name:r.name,product_reference_id:r.gtin}]}}),(0,n._)({name:"search_select_item",params:{url:window.location.href,items:[{item_id:r.isVariantOf.productGroupID,item_variant:r.sku,index:t}]}})}),[c,r,t,o]);return{href:"/".concat(s,"/p"),onClick:l,"data-testid":"product-link"}}},737:function(e,t,r){"use strict";r.d(t,{yb:function(){return v},kN:function(){return b},BG:function(){return g}});var n=r(9499),a=r(2784),i=r(9857),o=r(8459),s=r(4730),c=r(180),l=r(7732),d=["cache"],u=r(7295);function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?f(Object(r),!0).forEach((function(t){(0,n.Z)(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):f(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}var m="ProductsQuery",v=e=>{var{first:t,after:r,sort:n,term:i,selectedFacets:s}=e,{channel:c,locale:l}=(0,u.kP)();return(0,a.useMemo)((()=>{var e,a=(e=s,Array.isArray(e)?e:e?[e]:[]);return{first:null!==t&&void 0!==t?t:o.K,after:null!==r&&void 0!==r?r:"0",sort:null!==n&&void 0!==n?n:"score_desc",term:null!==i&&void 0!==i?i:"",selectedFacets:[...a,{key:"channel",value:null!==c&&void 0!==c?c:""},{key:"locale",value:l}]}}),[s,t,r,n,i,c,l])},b=(e,t)=>{var r,n=v(e),{data:a}=(0,l.aM)(m,n,p({fallbackData:null,suspense:!0},t));return null===a||void 0===a||null===(r=a.search)||void 0===r?void 0:r.products},g=(e,t)=>{var r=v(e),{cache:n}=(0,i.kY)();return(0,a.useCallback)((()=>((e,t,r)=>{var{cache:n}=r,a=(0,s.Z)(r,d),o=(0,l.km)(e,t);n.get(o)||(0,i.JG)(o,(0,c.W)(e,t,a))})(m,r,p({cache:n},t))),[r,n,t])}},23:function(e){e.exports={section:"section_section__ivuGF"}},1778:function(e){e.exports={section:"section_section__kRRBW"}},3262:function(e){e.exports={section:"section_section__C1DoH",loading:"section_loading__k5bCF"}}}]);