@faststore/core 3.9.3 → 3.11.0

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 (46) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +5 -5
  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/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/server-production/0.pack +0 -0
  9. package/.next/cache/webpack/server-production/index.pack +0 -0
  10. package/.next/next-minimal-server.js.nft.json +1 -1
  11. package/.next/next-server.js.nft.json +1 -1
  12. package/.next/prerender-manifest.js +1 -1
  13. package/.next/prerender-manifest.json +1 -1
  14. package/.next/routes-manifest.json +1 -1
  15. package/.next/server/chunks/371.js +1 -1
  16. package/.next/server/chunks/5430.js +1 -1
  17. package/.next/server/functions-config-manifest.json +1 -1
  18. package/.next/server/middleware-build-manifest.js +1 -1
  19. package/.next/server/pages/[...slug].js +1 -1
  20. package/.next/server/pages/en-US/404.html +1 -1
  21. package/.next/server/pages/en-US/500.html +1 -1
  22. package/.next/server/pages/en-US/account.html +1 -1
  23. package/.next/server/pages/en-US/checkout.html +1 -1
  24. package/.next/server/pages/en-US/login.html +1 -1
  25. package/.next/server/pages/en-US/s.html +1 -1
  26. package/.next/server/pages/en-US.html +1 -1
  27. package/.next/server/pages/s.js +1 -1
  28. package/.next/server/pages-manifest.json +1 -1
  29. package/.next/static/{qStjoQW6ZM1UbmV1436TX → KFQxTEob6--CeDLEHBRNA}/_buildManifest.js +1 -1
  30. package/.next/static/chunks/pages/[...slug]-ea558b39fbfcc27f.js +1 -0
  31. package/.next/static/chunks/pages/{_app-9d35d5919aef5334.js → _app-91d65e1abd88251d.js} +1 -1
  32. package/.next/static/chunks/pages/s-e609aea0cbb6c9fd.js +1 -0
  33. package/.next/trace +102 -101
  34. package/.turbo/turbo-build.log +12 -12
  35. package/.turbo/turbo-test.log +5 -5
  36. package/CHANGELOG.md +12 -0
  37. package/discovery.config.default.js +9 -0
  38. package/package.json +2 -2
  39. package/src/components/templates/ProductListingPage/ProductListingPage.tsx +12 -4
  40. package/src/experimental/searchServerSideFunctions/getServerSideProps.ts +51 -0
  41. package/src/experimental/searchServerSideFunctions/getStaticProps.ts +57 -0
  42. package/src/experimental/searchServerSideFunctions/index.ts +2 -0
  43. package/src/pages/s.tsx +61 -65
  44. package/.next/static/chunks/pages/[...slug]-535243edd040fc0c.js +0 -1
  45. package/.next/static/chunks/pages/s-a932301211f32425.js +0 -1
  46. /package/.next/static/{qStjoQW6ZM1UbmV1436TX → KFQxTEob6--CeDLEHBRNA}/_ssgManifest.js +0 -0
@@ -38,8 +38,8 @@ https://nextjs.org/telemetry
38
38
  Collecting page data ...
39
39
  Generating static pages (0/7) ...
40
40
 
41
41
  Generating static pages (1/7)
42
-
43
42
  Generating static pages (3/7)
44
43
  Warning: Dynamic Content not found for the page: home. Refer to the Dynamic Content documentation at https://developers.vtex.com/docs/guides/faststore/dynamic-content-overview for mapping the page and the corresponding data-fetching function.
44
+
45
45
  Generating static pages (3/7)
46
46
 
47
47
  Generating static pages (5/7)
48
48
 
49
49
  ✓ Generating static pages (7/7)
50
50
  Finalizing page optimization ...
@@ -48,26 +48,26 @@ Warning: Dynamic Content not found for the page: home. Refer to the Dynamic Cont
48
48
  Route (pages) Size First Load JS
49
49
  ┌ ● / 3.23 kB 122 kB
50
50
  ├ └ css/b1806cbafd0c1f81.css 3.06 kB
51
- ├ /_app 0 B 91.9 kB
52
- ├ ● /[...slug] 2.01 kB 131 kB
51
+ ├ /_app 0 B 92 kB
52
+ ├ ● /[...slug] 2.09 kB 131 kB
53
53
  ├ ● /[slug]/p 34.1 kB 153 kB
54
54
  ├ ├ css/bf1560439df2c1a1.css 5.66 kB
55
55
  ├ ├ css/e3ff5d95518a5c79.css 6.01 kB
56
56
  ├ └ css/d92839440872e246.css 15.6 kB
57
- ├ ○ /404 1.48 kB 120 kB
58
- ├ ● /500 1.48 kB 120 kB
57
+ ├ ○ /404 1.48 kB 121 kB
58
+ ├ ● /500 1.48 kB 121 kB
59
59
  ├ ● /account 714 B 120 kB
60
- ├ λ /api/graphql 0 B 91.9 kB
61
- ├ λ /api/health/live 0 B 91.9 kB
62
- ├ λ /api/health/ready 0 B 91.9 kB
63
- ├ λ /api/preview 0 B 91.9 kB
60
+ ├ λ /api/graphql 0 B 92 kB
61
+ ├ λ /api/health/live 0 B 92 kB
62
+ ├ λ /api/health/ready 0 B 92 kB
63
+ ├ λ /api/preview 0 B 92 kB
64
64
  ├ ● /checkout 695 B 120 kB
65
65
  ├ ● /login 1.59 kB 121 kB
66
- └ ● /s 2.75 kB 131 kB
66
+ └ ● /s 2.92 kB 132 kB
67
67
  + First Load JS shared by all 95 kB
68
68
  ├ chunks/framework-12a146e94cfcf7c4.js 45.4 kB
69
69
  ├ chunks/main-209ac4974b020af1.js 33.1 kB
70
- ├ chunks/pages/_app-9d35d5919aef5334.js 9.91 kB
70
+ ├ chunks/pages/_app-91d65e1abd88251d.js 9.97 kB
71
71
  ├ chunks/webpack-bf502499da135235.js 3.57 kB
72
72
  └ css/ee0556daedda6306.css 3.07 kB
73
73
 
@@ -75,4 +75,4 @@ Route (pages) Size First Load JS
75
75
  ○ (Static) automatically rendered as static HTML (uses no initial props)
76
76
  ● (SSG) automatically generated as static HTML + JSON (uses getStaticProps)
77
77
 
78
- Done in 69.36s.
78
+ Done in 71.98s.
@@ -1,12 +1,12 @@
1
1
  yarn run v1.22.22
2
2
  $ jest
3
- PASS test/utils/multipleTemplates.test.ts (35.899 s)
4
- PASS test/server/cms/index.test.ts (36.832 s)
5
- PASS test/server/index.test.ts (39.432 s)
3
+ PASS test/utils/multipleTemplates.test.ts (36.481 s)
4
+ PASS test/server/cms/index.test.ts (37.308 s)
5
+ PASS test/server/index.test.ts (40.683 s)
6
6
 
7
7
  Test Suites: 3 passed, 3 total
8
8
  Tests: 19 passed, 19 total
9
9
  Snapshots: 0 total
10
- Time: 40.733 s
10
+ Time: 41.777 s
11
11
  Ran all test suites.
12
- Done in 42.67s.
12
+ Done in 43.65s.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.11.0](https://github.com/vtex/faststore/compare/v3.10.0...v3.11.0) (2025-01-29)
7
+
8
+ ### Features
9
+
10
+ - search page with SSR ([#2619](https://github.com/vtex/faststore/issues/2619)) ([6fd2d0d](https://github.com/vtex/faststore/commit/6fd2d0d5e92f0922f8d97237d9d04a7eadc5e894))
11
+
12
+ # [3.10.0](https://github.com/vtex/faststore/compare/v3.9.3...v3.10.0) (2025-01-29)
13
+
14
+ ### Features
15
+
16
+ - add `title` and `description` templates for product listing pages ([#2643](https://github.com/vtex/faststore/issues/2643)) ([00221d9](https://github.com/vtex/faststore/commit/00221d98439b693af3c2c0082ec7ef600637e19e))
17
+
6
18
  ## [3.9.3](https://github.com/vtex/faststore/compare/v3.9.2...v3.9.3) (2025-01-28)
7
19
 
8
20
  ### Bug Fixes
@@ -4,6 +4,14 @@ module.exports = {
4
4
  description: 'Fast Demo Store',
5
5
  titleTemplate: '%s | FastStore',
6
6
  author: 'Store Framework',
7
+ plp: {
8
+ titleTemplate: '%s | FastStore PLP',
9
+ descriptionTemplate: '%s products on FastStore Product Listing Page'
10
+ },
11
+ search: {
12
+ titleTemplate: '%s: Search results title',
13
+ descriptionTemplate: '%s: Search results description',
14
+ },
7
15
  },
8
16
 
9
17
  // Theming
@@ -102,5 +110,6 @@ module.exports = {
102
110
  noRobots: false,
103
111
  preact: false,
104
112
  enableRedirects: false,
113
+ enableSearchSSR: false,
105
114
  },
106
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "3.9.3",
3
+ "version": "3.11.0",
4
4
  "license": "MIT",
5
5
  "repository": "vtex/faststore",
6
6
  "browserslist": "supports es6-module and not dead",
@@ -128,5 +128,5 @@
128
128
  "node": "18.19.0",
129
129
  "yarn": "1.19.1"
130
130
  },
131
- "gitHead": "3d3582410650126aa6705592f47f1ca2d8a52aeb"
131
+ "gitHead": "28973b45d9822065e6ed2890f29447b29c820306"
132
132
  }
@@ -12,7 +12,7 @@ import type { ServerCollectionPageQueryQuery } from '@generated/graphql'
12
12
  import { ITEMS_PER_PAGE } from 'src/constants'
13
13
  import { useApplySearchState } from 'src/sdk/search/state'
14
14
 
15
- import { PLPContentType } from 'src/server/cms/plp'
15
+ import type { PLPContentType } from 'src/server/cms/plp'
16
16
 
17
17
  import storeConfig from '../../../../discovery.config'
18
18
  import ProductListing from './ProductListing'
@@ -68,8 +68,16 @@ export default function ProductListingPage({
68
68
  sort: settings?.productGallery?.sortBySelection as SearchState['sort'],
69
69
  })
70
70
 
71
- const title = collection?.seo.title ?? storeConfig.seo.title
72
- const description = collection?.seo.description ?? storeConfig.seo.title
71
+ const {
72
+ seo: { plp: plpSeo, ...storeSeo },
73
+ } = storeConfig
74
+ const title = collection?.seo.title ?? storeSeo.title
75
+ const titleTemplate = plpSeo?.titleTemplate ?? storeSeo.titleTemplate
76
+ const description =
77
+ collection?.seo.description || // Use description that comes from the Checkout API
78
+ plpSeo?.descriptionTemplate?.replace(/%s/g, () => title) || // Use description template from the SEO config for PLP
79
+ storeSeo.description // Use default description from the store SEO config
80
+
73
81
  const [pathname] = router.asPath.split('?')
74
82
  const canonical = `${storeConfig.storeUrl}${pathname}`
75
83
  const itemsPerPage = settings?.productGallery?.itemsPerPage ?? ITEMS_PER_PAGE
@@ -84,7 +92,7 @@ export default function ProductListingPage({
84
92
  <NextSeo
85
93
  title={title}
86
94
  description={description}
87
- titleTemplate={storeConfig.seo.titleTemplate}
95
+ titleTemplate={titleTemplate}
88
96
  canonical={canonical}
89
97
  openGraph={{
90
98
  type: 'website',
@@ -0,0 +1,51 @@
1
+ import { GetServerSideProps } from 'next'
2
+ import { SearchPageProps } from './getStaticProps'
3
+
4
+ import { getGlobalSectionsData } from 'src/components/cms/GlobalSections'
5
+ import { SearchContentType, getPage } from 'src/server/cms'
6
+ import { Locator } from '@vtex/client-cms'
7
+ import storeConfig from 'discovery.config'
8
+
9
+ export const getServerSideProps: GetServerSideProps<
10
+ SearchPageProps,
11
+ Record<string, string>,
12
+ Locator
13
+ > = async (context) => {
14
+ const { previewData, query, res } = context
15
+ const searchTerm = (query.q as string)?.split('+').join(' ')
16
+
17
+ const globalSections = await getGlobalSectionsData(previewData)
18
+
19
+ if (storeConfig.cms.data) {
20
+ const cmsData = JSON.parse(storeConfig.cms.data)
21
+ const page = cmsData['search'][0]
22
+ if (page) {
23
+ const pageData = await getPage<SearchContentType>({
24
+ contentType: 'search',
25
+ documentId: page.documentId,
26
+ versionId: page.versionId,
27
+ })
28
+ return {
29
+ props: { page: pageData, globalSections, searchTerm },
30
+ }
31
+ }
32
+ }
33
+
34
+ const page = await getPage<SearchContentType>({
35
+ ...(previewData?.contentType === 'search' ? previewData : null),
36
+ contentType: 'search',
37
+ })
38
+
39
+ res.setHeader(
40
+ 'Cache-Control',
41
+ 'public, s-maxage=300, stale-while-revalidate=31536000, stale-if-error=31536000'
42
+ ) // 5 minutes of fresh content and 1 year of stale content
43
+
44
+ return {
45
+ props: {
46
+ page,
47
+ globalSections,
48
+ searchTerm,
49
+ },
50
+ }
51
+ }
@@ -0,0 +1,57 @@
1
+ import { GetStaticProps } from 'next'
2
+ import {
3
+ getGlobalSectionsData,
4
+ GlobalSectionsData,
5
+ } from 'src/components/cms/GlobalSections'
6
+ import { SearchContentType, getPage } from 'src/server/cms'
7
+ import { Locator } from '@vtex/client-cms'
8
+ import storeConfig from 'discovery.config'
9
+
10
+ export type SearchPageProps = {
11
+ page: SearchContentType
12
+ globalSections: GlobalSectionsData
13
+ searchTerm?: string
14
+ }
15
+
16
+ /*
17
+ Depending on the value of the storeConfig.experimental.enableSearchSSR flag, the function used will be getServerSideProps (./getServerSideProps).
18
+ Our CLI that does this process of converting from getStaticProps to getServerSideProps.
19
+ */
20
+ export const getStaticProps: GetStaticProps<
21
+ SearchPageProps,
22
+ Record<string, string>,
23
+ Locator
24
+ > = async (context) => {
25
+ const { previewData } = context
26
+
27
+ const globalSections = await getGlobalSectionsData(previewData)
28
+
29
+ if (storeConfig.cms.data) {
30
+ const cmsData = JSON.parse(storeConfig.cms.data)
31
+ const page = cmsData['search'][0]
32
+
33
+ if (page) {
34
+ const pageData = await getPage<SearchContentType>({
35
+ contentType: 'search',
36
+ documentId: page.documentId,
37
+ versionId: page.versionId,
38
+ })
39
+
40
+ return {
41
+ props: { page: pageData, globalSections },
42
+ }
43
+ }
44
+ }
45
+
46
+ const page = await getPage<SearchContentType>({
47
+ ...(previewData?.contentType === 'search' ? previewData : null),
48
+ contentType: 'search',
49
+ })
50
+
51
+ return {
52
+ props: {
53
+ page,
54
+ globalSections,
55
+ },
56
+ }
57
+ }
@@ -0,0 +1,2 @@
1
+ export * from './getServerSideProps'
2
+ export * from './getStaticProps'
package/src/pages/s.tsx CHANGED
@@ -1,4 +1,3 @@
1
- import type { GetStaticProps } from 'next'
2
1
  import { NextSeo } from 'next-seo'
3
2
  import { useRouter } from 'next/router'
4
3
  import { useMemo } from 'react'
@@ -14,19 +13,13 @@ import { SROnly as UISROnly } from '@faststore/ui'
14
13
  import { ITEMS_PER_PAGE } from 'src/constants'
15
14
  import { useApplySearchState } from 'src/sdk/search/state'
16
15
 
17
- import { Locator } from '@vtex/client-cms'
18
16
  import storeConfig from 'discovery.config'
19
- import {
20
- getGlobalSectionsData,
21
- GlobalSectionsData,
22
- } from 'src/components/cms/GlobalSections'
23
- import { SearchWrapper } from 'src/components/templates/SearchPage'
24
- import { getPage, SearchContentType } from 'src/server/cms'
25
17
 
26
- type Props = {
27
- page: SearchContentType
28
- globalSections: GlobalSectionsData
29
- }
18
+ import { SearchWrapper } from 'src/components/templates/SearchPage'
19
+ import {
20
+ getStaticProps,
21
+ SearchPageProps,
22
+ } from 'src/experimental/searchServerSideFunctions'
30
23
 
31
24
  export interface SearchPageContextType {
32
25
  title: string
@@ -54,21 +47,69 @@ const useSearchParams = ({
54
47
  }, [asPath, defaultSort])
55
48
  }
56
49
 
57
- function Page({ page: searchContentType, globalSections }: Props) {
50
+ type StoreConfig = typeof storeConfig
51
+
52
+ function generateSEOData(storeConfig: StoreConfig, searchTerm?: string) {
53
+ const { search: searchSeo, ...seo } = storeConfig.seo
54
+
55
+ const isSSREnabled = storeConfig.experimental.enableSearchSSR
56
+
57
+ // default behavior without SSR
58
+ if (!isSSREnabled) {
59
+ return {
60
+ title: seo.title,
61
+ description: seo.description,
62
+ titleTemplate: seo.titleTemplate,
63
+ openGraph: {
64
+ type: 'website',
65
+ title: seo.title,
66
+ description: seo.description,
67
+ },
68
+ }
69
+ }
70
+
71
+ const title = searchTerm ?? 'Search Results'
72
+ const titleTemplate = searchSeo?.titleTemplate ?? seo.titleTemplate
73
+ const description = searchSeo?.descriptionTemplate
74
+ ? searchSeo.descriptionTemplate.replace(/%s/g, () => searchTerm)
75
+ : seo.description
76
+
77
+ const canonical = searchTerm
78
+ ? `${storeConfig.storeUrl}/s?q=${searchTerm}`
79
+ : undefined
80
+
81
+ return {
82
+ title,
83
+ description,
84
+ titleTemplate,
85
+ canonical,
86
+ openGraph: {
87
+ type: 'website',
88
+ title: title,
89
+ description: description,
90
+ },
91
+ }
92
+ }
93
+
94
+ function Page({
95
+ page: searchContentType,
96
+ globalSections,
97
+ searchTerm,
98
+ }: SearchPageProps) {
58
99
  const { settings } = searchContentType
59
100
  const applySearchState = useApplySearchState()
60
101
  const searchParams = useSearchParams({
61
102
  sort: settings?.productGallery?.sortBySelection as SearchState['sort'],
62
103
  })
63
104
 
64
- const title = 'Search Results'
65
- const { description, titleTemplate } = storeConfig.seo
66
105
  const itemsPerPage = settings?.productGallery?.itemsPerPage ?? ITEMS_PER_PAGE
67
106
 
68
107
  if (!searchParams) {
69
108
  return null
70
109
  }
71
110
 
111
+ const seoData = generateSEOData(storeConfig, searchTerm)
112
+
72
113
  return (
73
114
  <SearchProvider
74
115
  onChange={applySearchState}
@@ -76,19 +117,9 @@ function Page({ page: searchContentType, globalSections }: Props) {
76
117
  {...searchParams}
77
118
  >
78
119
  {/* SEO */}
79
- <NextSeo
80
- noindex
81
- title={title}
82
- description={description}
83
- titleTemplate={titleTemplate}
84
- openGraph={{
85
- type: 'website',
86
- title,
87
- description,
88
- }}
89
- />
120
+ <NextSeo noindex {...seoData} />
90
121
 
91
- <UISROnly text={title} />
122
+ <UISROnly text={seoData.title} />
92
123
 
93
124
  {/*
94
125
  WARNING: Do not import or render components from any
@@ -105,8 +136,8 @@ function Page({ page: searchContentType, globalSections }: Props) {
105
136
  itemsPerPage={itemsPerPage}
106
137
  searchContentType={searchContentType}
107
138
  serverData={{
108
- title,
109
- searchTerm: searchParams.term ?? undefined,
139
+ title: seoData.title,
140
+ searchTerm: searchTerm ?? searchParams.term ?? undefined,
110
141
  }}
111
142
  globalSections={globalSections.sections}
112
143
  />
@@ -114,41 +145,6 @@ function Page({ page: searchContentType, globalSections }: Props) {
114
145
  )
115
146
  }
116
147
 
117
- export const getStaticProps: GetStaticProps<
118
- Props,
119
- Record<string, string>,
120
- Locator
121
- > = async ({ previewData }) => {
122
- const globalSections = await getGlobalSectionsData(previewData)
123
-
124
- if (storeConfig.cms.data) {
125
- const cmsData = JSON.parse(storeConfig.cms.data)
126
- const page = cmsData['search'][0]
127
-
128
- if (page) {
129
- const pageData = await getPage<SearchContentType>({
130
- contentType: 'search',
131
- documentId: page.documentId,
132
- versionId: page.versionId,
133
- })
134
-
135
- return {
136
- props: { page: pageData, globalSections },
137
- }
138
- }
139
- }
140
-
141
- const page = await getPage<SearchContentType>({
142
- ...(previewData?.contentType === 'search' ? previewData : null),
143
- contentType: 'search',
144
- })
145
-
146
- return {
147
- props: {
148
- page,
149
- globalSections,
150
- },
151
- }
152
- }
148
+ export { getStaticProps }
153
149
 
154
150
  export default Page
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[330],{3054:function(e,t,r){"use strict";r.r(t),r.d(t,{__N_SSG:function(){return M},default:function(){return _slug_}});var n=r(9499),o=r(4730),c=r(5152),i=r.n(c),s=r(6142),a=r(2339),l=r(1197),u=r(5351),d=r(1163),p=r(2784),b=r(1023),g=r(5403),P=r(5430),j=r.n(P),O=r(9029),f=r(9996),y=r.n(f),w=r(3472),v=r(3638),_=r(4485),h=r(4439),m=r(7641),S=r(1271);function ownKeys(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 _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var L=i()(()=>Promise.all([r.e(9161),r.e(84)]).then(r.bind(r,3620)).then(e=>e.OverriddenDefaultBannerText),{ssr:!1,loadableGenerated:{webpack:()=>[3620]}}),D=i()(()=>Promise.all([r.e(1770),r.e(218),r.e(9704)]).then(r.bind(r,1482)).then(e=>e.OverriddenDefaultNewsletter),{ssr:!1,loadableGenerated:{webpack:()=>[1482]}}),x=i()(()=>Promise.all([r.e(3472),r.e(3506)]).then(r.bind(r,1171)).then(e=>e.OverriddenDefaultProductShelf),{ssr:!1,loadableGenerated:{webpack:()=>[1171]}}),E=i()(()=>r.e(7181).then(r.bind(r,9755)),{ssr:!1,loadableGenerated:{webpack:()=>[9755]}}),k=_objectSpread(_objectSpread(_objectSpread({},S.Z),{},{Breadcrumb:w.j,Hero:v.V,ProductGallery:_.f,BannerText:L,Newsletter:D,ProductShelf:x,ProductTiles:E},m.Z),h.Z),G=r(7563),K=r(4960),Z=r(7171),N=r(7921),T=r(2322);function ProductListing_ownKeys(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 ProductListing_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ProductListing_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ProductListing_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var B=i()(()=>r.e(6636).then(r.bind(r,7917)),{loadableGenerated:{webpack:()=>[7917]}}),overwriteMerge=(e,t)=>t;function ProductListing(e){var t,r,{page:{sections:n,settings:o},data:c,globalSections:i}=e,{state:{sort:s,term:a,selectedFacets:l}}=(0,O.R)(),u=null!==(t=null==o?void 0:null===(r=o.productGallery)||void 0===r?void 0:r.itemsPerPage)&&void 0!==t?t:b.g,{data:d}=(0,N.UO)({term:a,sort:s,selectedFacets:l,itemsPerPage:u}),{pages:p,useGalleryPage:g}=(0,Z.Y_)(),P={data:ProductListing_objectSpread(ProductListing_objectSpread({},y()(ProductListing_objectSpread({},c),ProductListing_objectSpread({},d),{arrayMerge:overwriteMerge})),{},{pages:p})};return(0,T.jsx)(T.Fragment,{children:(0,T.jsx)(K.ZP,{context:P,children:(0,T.jsx)(Z.Bj.Provider,{value:g,children:(0,T.jsx)(G.Z,{sections:n,globalSections:i,components:k,children:(0,T.jsx)(G.w,{sectionName:"ScrollToTopButton",children:(0,T.jsx)(B,{})})})})})})}function ProductListingPage_ownKeys(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 ProductListingPage_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ProductListingPage_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ProductListingPage_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var useSearchParams=e=>{var{collection:t,sort:r}=e,n=null==t?void 0:t.meta.selectedFacets,{asPath:o}=(0,d.useRouter)(),c=(0,p.useMemo)(()=>{var e=new URL(o,"http://localhost");r&&!e.searchParams.has("sort")&&e.searchParams.set("sort",r);var t=(0,s.Q)(e);return 0===t.selectedFacets.length&&(t.selectedFacets=n),(0,a.Z)(t).href},[o,n,r]);return(0,p.useMemo)(()=>(0,s.Q)(new URL(c)),[c])};function ProductListingPage(e){var t,r,n,o,c,i,{page:s,data:a,globalSections:p}=e,{settings:P}=s,O=a.collection,f=(0,d.useRouter)(),y=(0,g.j)(),w=useSearchParams({collection:O,sort:null==P?void 0:null===(t=P.productGallery)||void 0===t?void 0:t.sortBySelection}),v=null!==(r=null==O?void 0:O.seo.title)&&void 0!==r?r:j().seo.title,_=null!==(n=null==O?void 0:O.seo.description)&&void 0!==n?n:j().seo.title,[h]=f.asPath.split("?"),m="".concat(j().storeUrl).concat(h),S=null!==(o=null==P?void 0:null===(c=P.productGallery)||void 0===c?void 0:c.itemsPerPage)&&void 0!==o?o:b.g;return(0,T.jsxs)(l.z,ProductListingPage_objectSpread(ProductListingPage_objectSpread({onChange:y,itemsPerPage:S},w),{},{children:[(0,T.jsx)(u.PB,{title:v,description:_,titleTemplate:j().seo.titleTemplate,canonical:m,openGraph:{type:"website",title:v,description:_}}),(0,T.jsx)(u.gR,{itemListElements:null!==(i=null==O?void 0:O.breadcrumbList.itemListElement)&&void 0!==i?i:[]}),(0,T.jsx)(ProductListing,{globalSections:p,page:s,data:a})]}))}var R=["globalSections","type"];function _slug_ownKeys(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 _slug_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?_slug_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):_slug_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var F=i()(()=>Promise.all([r.e(1770),r.e(5997),r.e(3472),r.e(218),r.e(9161),r.e(6379),r.e(1978)]).then(r.bind(r,8205)),{loadableGenerated:{webpack:()=>[8205]}}),M=!0,_slug_=function(e){var{globalSections:t,type:r}=e,n=(0,o.Z)(e,R);return(0,T.jsxs)(T.Fragment,{children:["plp"===r&&(0,T.jsx)(ProductListingPage,_slug_objectSpread({globalSections:t.sections},n)),"page"===r&&(0,T.jsx)(F,_slug_objectSpread({globalSections:t.sections},n))]})}},881:function(e,t,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/[...slug]",function(){return r(3054)}])}},function(e){e.O(0,[6941,7563,4501,9774,2888,179],function(){return e(e.s=881)}),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6552],{5450:function(e,t,r){"use strict";var n=r(2784);t.Z=function({text:e,as:t}){let r=t??"span";return n.createElement(r,{"data-fs-sr-only":!0},e)}},6133:function(e,t,r){"use strict";var n=r(2784);t.Z=function({testId:e="fs-empty-state",title:t,titleIcon:r,variant:o="default",bkgColor:a="default",children:c,...i}){return n.createElement("section",{"data-fs-empty-state":!0,"data-fs-empty-state-variant":o,"data-fs-empty-state-bkg-color":a,"data-fs-content":"empty-state","data-testid":e,...i},t&&n.createElement("header",{"data-fs-empty-state-title":!0},r&&n.createElement(n.Fragment,null,r),n.createElement("p",null,t)),c)}},945:function(e,t,r){"use strict";r.d(t,{Z:function(){return j}});var n=r(9499),o=r(1163),a=r(2614),c=r(1667),i=r(4329),l=r(9089),u=r(8919),p=r.n(u),d={EmptyState:r(6133).Z},b=r(7296),f=r(2322);function ownKeys(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 _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var useErrorState=()=>{var e,{query:{errorId:t,fromUrl:r},pathname:n,asPath:a}=(0,o.useRouter)();return{errorId:t,fromUrl:null!==(e=null!=r?r:a)&&void 0!==e?e:n}},j=(0,b.B)("EmptyState",function(e){var t,r,n,o,{title:u,titleIcon:d,children:b,subtitle:j,errorState:h,showLoader:y=!1}=e,{EmptyState:O}=(0,i.r3)(),{errorId:v,fromUrl:P}=useErrorState(),g=null!=d&&d.icon?(0,f.jsx)(a.Z,{name:null==d?void 0:d.icon,"aria-label":null==d?void 0:d.alt,width:56,height:56,weight:"thin"}):O.props.titleIcon;return(0,f.jsx)(l.Z,{className:"".concat(p().section," section-empty-state"),children:(0,f.jsxs)(O.Component,_objectSpread(_objectSpread({bkgColor:"light"},O.props),{},{title:null!=u?u:O.props.title,titleIcon:g,children:[!!j&&(0,f.jsx)("h2",{children:j}),!!(null!=h&&null!==(t=h.errorId)&&void 0!==t&&t.show)&&(0,f.jsx)("p",{children:"".concat(null==h?void 0:null===(r=h.errorId)||void 0===r?void 0:r.description," ").concat(v)}),!!(null!=h&&null!==(n=h.fromUrl)&&void 0!==n&&n.show)&&(0,f.jsx)("p",{children:"".concat(null==h?void 0:null===(o=h.fromUrl)||void 0===o?void 0:o.description," ").concat(P)}),y&&(0,f.jsx)(c.Z,{}),b]}))})},d)},4654:function(e,t,r){"use strict";r.r(t),r.d(t,{__N_SSG:function(){return I},default:function(){return s}});var n=r(9499),o=r(5351),a=r(1163),c=r(2784),i=r(6142),l=r(2339),u=r(1197),p=r(5450),d=r(1023),b=r(5403),f=r(5430),j=r.n(f),h=r(9029),y=r(945),O=r(1080),v=r.n(O),P=r(9089),g=r(7921),w=r(7563),S=r(5152),m=r.n(S),_=r(3472),E=r(3638),x=r(4485),D=r(4439),Z=r(7641),K=r(1271);function ownKeys(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 _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var k=m()(()=>Promise.all([r.e(9161),r.e(84)]).then(r.bind(r,3620)).then(e=>e.OverriddenDefaultBannerText),{ssr:!1,loadableGenerated:{webpack:()=>[3620]}}),G=m()(()=>Promise.all([r.e(1770),r.e(218),r.e(9161),r.e(2858)]).then(r.bind(r,8545)),{ssr:!1,loadableGenerated:{webpack:()=>[8545]}}),N=m()(()=>Promise.all([r.e(1770),r.e(218),r.e(9704)]).then(r.bind(r,1482)).then(e=>e.OverriddenDefaultNewsletter),{ssr:!1,loadableGenerated:{webpack:()=>[1482]}}),W=m()(()=>Promise.all([r.e(3472),r.e(3506)]).then(r.bind(r,1171)).then(e=>e.OverriddenDefaultProductShelf),{ssr:!1,loadableGenerated:{webpack:()=>[1171]}}),C=m()(()=>r.e(7181).then(r.bind(r,9755)),{ssr:!1,loadableGenerated:{webpack:()=>[9755]}}),R=_objectSpread(_objectSpread(_objectSpread({},K.Z),{},{Breadcrumb:_.j,Hero:E.V,ProductGallery:x.f,BannerText:k,BannerNewsletter:G,Newsletter:N,ProductShelf:W,ProductTiles:C},Z.Z),D.Z),B=r(4960),T=r(7171),U=r(2322);function SearchPage_ownKeys(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 SearchPage_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?SearchPage_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SearchPage_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var SearchPage_SearchPage=function(e){var{page:{sections:t},data:r,globalSections:n}=e,{pages:o,useGalleryPage:a}=(0,T.Y_)(),c={data:SearchPage_objectSpread(SearchPage_objectSpread({},r),{},{pages:o})};return(0,U.jsx)(U.Fragment,{children:(0,U.jsx)(B.ZP,{context:c,children:(0,U.jsx)(T.Bj.Provider,{value:a,children:(0,U.jsx)(w.Z,{sections:t,globalSections:n,components:R})})})})};function SearchWrapper_ownKeys(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 SearchWrapper_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?SearchWrapper_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SearchWrapper_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function EmptySearch(){return(0,U.jsx)(P.Z,{className:"".concat(v().section," section-product-gallery"),children:(0,U.jsx)("section",{"data-testid":"product-gallery","data-fs-product-listing":!0,children:(0,U.jsx)(y.Z,{title:"",showLoader:!0})})})}function SearchWrapper(e){var t,r,n,o,{itemsPerPage:c,searchContentType:i,serverData:l,globalSections:u}=e,p=(0,a.useRouter)(),{state:{term:d,sort:b,selectedFacets:f},pages:j,resetInfiniteScroll:y}=(0,h.R)(),{data:O,isValidating:v}=(0,g.UO)({term:d,sort:b,itemsPerPage:c,selectedFacets:f});if(v||!O)return(0,U.jsx)(EmptySearch,{});if(null!=O&&null!==(t=O.redirect)&&void 0!==t&&t.url)return p.replace(null==O?void 0:null===(o=O.redirect)||void 0===o?void 0:o.url,null,{shallow:!0}),(0,U.jsx)(EmptySearch,{});var P=null==O?void 0:null===(r=O.search)||void 0===r?void 0:r.products,w=j.length,S=Math.ceil((null==P?void 0:null===(n=P.pageInfo)||void 0===n?void 0:n.totalCount)/c);return S>0&&S<w&&y(0),(0,U.jsx)(SearchPage_SearchPage,{page:i,data:SearchWrapper_objectSpread(SearchWrapper_objectSpread({},l),O),globalSections:u})}function s_ownKeys(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 s_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s_ownKeys(Object(r),!0).forEach(function(t){(0,n.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var I=!0,useSearchParams=e=>{var{sort:t}=e,{asPath:r}=(0,a.useRouter)();return(0,c.useMemo)(()=>{var e=new URL(r,"http://localhost");t&&!e.searchParams.has("sort")&&e.searchParams.set("sort",t);var n=(0,i.Q)(e),o=(0,l.Z)(n).href;return(0,i.Q)(new URL(o))},[r,t])},s=function(e){var t,r,n,a,{page:c,globalSections:i}=e,{settings:l}=c,f=(0,b.j)(),h=useSearchParams({sort:null==l?void 0:null===(t=l.productGallery)||void 0===t?void 0:t.sortBySelection}),y="Search Results",{description:O,titleTemplate:v}=j().seo,P=null!==(r=null==l?void 0:null===(n=l.productGallery)||void 0===n?void 0:n.itemsPerPage)&&void 0!==r?r:d.g;return h?(0,U.jsxs)(u.z,s_objectSpread(s_objectSpread({onChange:f,itemsPerPage:P},h),{},{children:[(0,U.jsx)(o.PB,{noindex:!0,title:y,description:O,titleTemplate:v,openGraph:{type:"website",title:y,description:O}}),(0,U.jsx)(p.Z,{text:y}),(0,U.jsx)(SearchWrapper,{itemsPerPage:P,searchContentType:c,serverData:{title:y,searchTerm:null!==(a=h.term)&&void 0!==a?a:void 0},globalSections:i.sections})]})):null}},1343:function(e,t,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/s",function(){return r(4654)}])},8919:function(e){e.exports={section:"section_section__KG_b8",load:"section_load__DKeod"}}},function(e){e.O(0,[6941,7563,4501,9774,2888,179],function(){return e(e.s=1343)}),_N_E=e.O()}]);