@faststore/core 3.23.0 → 3.24.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 (86) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +16 -16
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/config.json +3 -3
  5. package/.next/cache/webpack/client-production/0.pack +0 -0
  6. package/.next/cache/webpack/client-production/index.pack +0 -0
  7. package/.next/cache/webpack/server-production/0.pack +0 -0
  8. package/.next/cache/webpack/server-production/index.pack +0 -0
  9. package/.next/prerender-manifest.js +1 -1
  10. package/.next/prerender-manifest.json +1 -1
  11. package/.next/react-loadable-manifest.json +1 -1
  12. package/.next/routes-manifest.json +1 -1
  13. package/.next/server/chunks/{9622.js → 7355.js} +3 -3
  14. package/.next/server/chunks/7816.js +1 -1
  15. package/.next/server/middleware-build-manifest.js +1 -1
  16. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  17. package/.next/server/pages/404.js +1 -1
  18. package/.next/server/pages/404.js.nft.json +1 -1
  19. package/.next/server/pages/500.js +1 -1
  20. package/.next/server/pages/500.js.nft.json +1 -1
  21. package/.next/server/pages/[...slug].js +1 -1
  22. package/.next/server/pages/[...slug].js.nft.json +1 -1
  23. package/.next/server/pages/[slug]/p.js +1 -1
  24. package/.next/server/pages/[slug]/p.js.nft.json +1 -1
  25. package/.next/server/pages/_app.js.nft.json +1 -1
  26. package/.next/server/pages/_document.js.nft.json +1 -1
  27. package/.next/server/pages/_error.js.nft.json +1 -1
  28. package/.next/server/pages/account.js +1 -1
  29. package/.next/server/pages/account.js.nft.json +1 -1
  30. package/.next/server/pages/api/graphql.js +1 -1
  31. package/.next/server/pages/api/graphql.js.nft.json +1 -1
  32. package/.next/server/pages/api/health/live.js.nft.json +1 -1
  33. package/.next/server/pages/api/health/ready.js.nft.json +1 -1
  34. package/.next/server/pages/api/preview.js.nft.json +1 -1
  35. package/.next/server/pages/checkout.js +1 -1
  36. package/.next/server/pages/checkout.js.nft.json +1 -1
  37. package/.next/server/pages/en-US/404.html +2 -2
  38. package/.next/server/pages/en-US/404.json +1 -1
  39. package/.next/server/pages/en-US/500.html +2 -2
  40. package/.next/server/pages/en-US/500.json +1 -1
  41. package/.next/server/pages/en-US/account.html +2 -2
  42. package/.next/server/pages/en-US/account.json +1 -1
  43. package/.next/server/pages/en-US/checkout.html +2 -2
  44. package/.next/server/pages/en-US/checkout.json +1 -1
  45. package/.next/server/pages/en-US/login.html +2 -2
  46. package/.next/server/pages/en-US/login.json +1 -1
  47. package/.next/server/pages/en-US/s.html +2 -2
  48. package/.next/server/pages/en-US/s.json +1 -1
  49. package/.next/server/pages/en-US.html +2 -2
  50. package/.next/server/pages/en-US.json +1 -1
  51. package/.next/server/pages/index.js +1 -1
  52. package/.next/server/pages/index.js.nft.json +1 -1
  53. package/.next/server/pages/login.js +1 -1
  54. package/.next/server/pages/login.js.nft.json +1 -1
  55. package/.next/server/pages/s.js +1 -1
  56. package/.next/server/pages/s.js.nft.json +1 -1
  57. package/.next/static/{frJ1Rp8XRqHORhBpoOnih → cCDxvGnNemGOAZByQDbQR}/_buildManifest.js +1 -1
  58. package/.next/static/chunks/9180.a9391411a02a643d.js +1 -0
  59. package/.next/static/chunks/pages/{404-3d151353c4e53a04.js → 404-32bb6fa89ab66aca.js} +1 -1
  60. package/.next/static/chunks/pages/{500-b7900a231cd5a12d.js → 500-eb359aa3bffe64a6.js} +1 -1
  61. package/.next/static/chunks/pages/{login-03e155dd4f803d5d.js → login-6678b657c8c13867.js} +1 -1
  62. package/.next/static/chunks/{webpack-73f875a3fea96a4a.js → webpack-0d600424e508dae8.js} +1 -1
  63. package/.next/trace +121 -121
  64. package/.turbo/turbo-build.log +14 -8
  65. package/.turbo/turbo-test.log +8 -7
  66. package/CHANGELOG.md +6 -0
  67. package/cms/faststore/content-types.json +14 -0
  68. package/package.json +2 -2
  69. package/src/components/cms/GlobalSections.tsx +28 -7
  70. package/src/experimental/searchServerSideFunctions/getServerSideProps.ts +49 -12
  71. package/src/experimental/searchServerSideFunctions/getStaticProps.ts +48 -15
  72. package/src/pages/404.tsx +25 -9
  73. package/src/pages/500.tsx +25 -9
  74. package/src/pages/[...slug].tsx +39 -8
  75. package/src/pages/[slug]/p.tsx +24 -3
  76. package/src/pages/account.tsx +20 -2
  77. package/src/pages/checkout.tsx +20 -2
  78. package/src/pages/index.tsx +24 -3
  79. package/src/pages/login.tsx +25 -9
  80. package/src/sdk/error/ChildrenSectionNotFoundError/ChildrenSectionNotFoundError.ts +6 -0
  81. package/src/sdk/error/ChildrenSectionNotFoundError/index.ts +1 -0
  82. package/src/server/cms/global.ts +38 -0
  83. package/src/server/cms/index.ts +1 -1
  84. package/test/server/cms/global.test.ts +86 -0
  85. package/.next/static/chunks/9180.ca246b121565be34.js +0 -1
  86. /package/.next/static/{frJ1Rp8XRqHORhBpoOnih → cCDxvGnNemGOAZByQDbQR}/_ssgManifest.js +0 -0
@@ -10,6 +10,7 @@ import {
10
10
  import RenderSections from 'src/components/cms/RenderSections'
11
11
  import { default as GLOBAL_COMPONENTS } from 'src/components/cms/global/Components'
12
12
  import CUSTOM_COMPONENTS from 'src/customizations/src/components'
13
+ import { injectGlobalSections } from 'src/server/cms/global'
13
14
  import storeConfig from '../../discovery.config'
14
15
 
15
16
  type Props = {
@@ -44,10 +45,27 @@ export const getStaticProps: GetStaticProps<
44
45
  Record<string, string>,
45
46
  Locator
46
47
  > = async ({ previewData }) => {
47
- const globalSections = await getGlobalSectionsData(previewData)
48
+ const [
49
+ globalSectionsPromise,
50
+ globalSectionsHeaderPromise,
51
+ globalSectionsFooterPromise,
52
+ ] = getGlobalSectionsData(previewData)
53
+
54
+ const [globalSections, globalSectionsHeader, globalSectionsFooter] =
55
+ await Promise.all([
56
+ globalSectionsPromise,
57
+ globalSectionsHeaderPromise,
58
+ globalSectionsFooterPromise,
59
+ ])
60
+
61
+ const globalSectionsResult = injectGlobalSections({
62
+ globalSections,
63
+ globalSectionsHeader,
64
+ globalSectionsFooter,
65
+ })
48
66
 
49
67
  return {
50
- props: { globalSections },
68
+ props: { globalSections: globalSectionsResult },
51
69
  }
52
70
  }
53
71
 
@@ -12,6 +12,7 @@ import {
12
12
  import CUSTOM_COMPONENTS from 'src/customizations/src/components'
13
13
 
14
14
  import RenderSections from 'src/components/cms/RenderSections'
15
+ import { injectGlobalSections } from 'src/server/cms/global'
15
16
  import storeConfig from '../../discovery.config'
16
17
 
17
18
  type Props = {
@@ -46,10 +47,27 @@ export const getStaticProps: GetStaticProps<
46
47
  Record<string, string>,
47
48
  Locator
48
49
  > = async ({ previewData }) => {
49
- const globalSections = await getGlobalSectionsData(previewData)
50
+ const [
51
+ globalSectionsPromise,
52
+ globalSectionsHeaderPromise,
53
+ globalSectionsFooterPromise,
54
+ ] = getGlobalSectionsData(previewData)
55
+
56
+ const [globalSections, globalSectionsHeader, globalSectionsFooter] =
57
+ await Promise.all([
58
+ globalSectionsPromise,
59
+ globalSectionsHeaderPromise,
60
+ globalSectionsFooterPromise,
61
+ ])
62
+
63
+ const globalSectionsResult = injectGlobalSections({
64
+ globalSections,
65
+ globalSectionsHeader,
66
+ globalSectionsFooter,
67
+ })
50
68
 
51
69
  return {
52
- props: { globalSections },
70
+ props: { globalSections: globalSectionsResult },
53
71
  }
54
72
  }
55
73
 
@@ -12,6 +12,7 @@ import {
12
12
  } from 'src/components/cms/GlobalSections'
13
13
  import COMPONENTS from 'src/components/cms/home/Components'
14
14
  import PageProvider from 'src/sdk/overrides/PageProvider'
15
+ import { injectGlobalSections } from 'src/server/cms/global'
15
16
  import { getDynamicContent } from 'src/utils/dynamicContent'
16
17
  import storeConfig from '../../discovery.config'
17
18
 
@@ -147,7 +148,12 @@ export const getStaticProps: GetStaticProps<
147
148
  Record<string, string>,
148
149
  Locator
149
150
  > = async ({ previewData }) => {
150
- const globalSectionsPromise = getGlobalSectionsData(previewData)
151
+ const [
152
+ globalSectionsPromise,
153
+ globalSectionsHeaderPromise,
154
+ globalSectionsFooterPromise,
155
+ ] = getGlobalSectionsData(previewData)
156
+
151
157
  const serverDataPromise = getDynamicContent({ pageType: 'home' })
152
158
 
153
159
  let cmsPage = null
@@ -165,14 +171,29 @@ export const getStaticProps: GetStaticProps<
165
171
  ...(previewData?.contentType === 'home' && previewData),
166
172
  contentType: 'home',
167
173
  })
168
- const [page, globalSections, serverData] = await Promise.all([
174
+
175
+ const [
176
+ page,
177
+ globalSections,
178
+ globalSectionsHeader,
179
+ globalSectionsFooter,
180
+ serverData,
181
+ ] = await Promise.all([
169
182
  pagePromise,
170
183
  globalSectionsPromise,
184
+ globalSectionsHeaderPromise,
185
+ globalSectionsFooterPromise,
171
186
  serverDataPromise,
172
187
  ])
173
188
 
189
+ const globalSectionsResult = injectGlobalSections({
190
+ globalSections,
191
+ globalSectionsHeader,
192
+ globalSectionsFooter,
193
+ })
194
+
174
195
  return {
175
- props: { page, globalSections, serverData },
196
+ props: { page, globalSections: globalSectionsResult, serverData },
176
197
  }
177
198
  }
178
199
 
@@ -11,9 +11,10 @@ import {
11
11
  } from 'src/components/cms/GlobalSections'
12
12
  import RenderSections from 'src/components/cms/RenderSections'
13
13
  import { OverriddenDefaultEmptyState as EmptyState } from 'src/components/sections/EmptyState/OverriddenDefaultEmptyState'
14
- import PLUGINS_COMPONENTS from 'src/plugins'
15
14
  import CUSTOM_COMPONENTS from 'src/customizations/src/components'
15
+ import PLUGINS_COMPONENTS from 'src/plugins'
16
16
  import { type PageContentType, getPage } from 'src/server/cms'
17
+ import { injectGlobalSections } from 'src/server/cms/global'
17
18
  import storeConfig from '../../discovery.config'
18
19
 
19
20
  /* A list of components that can be used in the CMS. */
@@ -69,16 +70,31 @@ export const getStaticProps: GetStaticProps<
69
70
  Record<string, string>,
70
71
  Locator
71
72
  > = async ({ previewData }) => {
72
- const [page, globalSections] = await Promise.all([
73
- getPage<PageContentType>({
74
- ...(previewData?.contentType === 'login' && previewData),
75
- contentType: 'login',
76
- }),
77
- getGlobalSectionsData(previewData),
78
- ])
73
+ const [
74
+ globalSectionsPromise,
75
+ globalSectionsHeaderPromise,
76
+ globalSectionsFooterPromise,
77
+ ] = getGlobalSectionsData(previewData)
78
+
79
+ const [page, globalSections, globalSectionsHeader, globalSectionsFooter] =
80
+ await Promise.all([
81
+ getPage<PageContentType>({
82
+ ...(previewData?.contentType === 'login' && previewData),
83
+ contentType: 'login',
84
+ }),
85
+ globalSectionsPromise,
86
+ globalSectionsHeaderPromise,
87
+ globalSectionsFooterPromise,
88
+ ])
89
+
90
+ const globalSectionsResult = injectGlobalSections({
91
+ globalSections,
92
+ globalSectionsHeader,
93
+ globalSectionsFooter,
94
+ })
79
95
 
80
96
  return {
81
- props: { page, globalSections },
97
+ props: { page, globalSections: globalSectionsResult },
82
98
  }
83
99
  }
84
100
 
@@ -0,0 +1,6 @@
1
+ export default class ChildrenSectionNotFoundError extends Error {
2
+ constructor(message: string) {
3
+ super(message)
4
+ this.name = 'ChildrenSectionNotFoundError'
5
+ }
6
+ }
@@ -0,0 +1 @@
1
+ export { default } from './ChildrenSectionNotFoundError'
@@ -0,0 +1,38 @@
1
+ import type { GlobalSectionsData } from 'src/components/cms/GlobalSections'
2
+ import ChildrenSectionNotFoundError from 'src/sdk/error/ChildrenSectionNotFoundError'
3
+
4
+ type InjectGlobalSectionsProps = {
5
+ globalSections: GlobalSectionsData
6
+ globalSectionsHeader: GlobalSectionsData
7
+ globalSectionsFooter: GlobalSectionsData
8
+ }
9
+
10
+ export function injectGlobalSections({
11
+ globalSections,
12
+ globalSectionsHeader,
13
+ globalSectionsFooter,
14
+ }: InjectGlobalSectionsProps) {
15
+ const childrenIndex = globalSections.sections.findIndex(
16
+ (section) => section.name === 'Children'
17
+ )
18
+
19
+ if (childrenIndex === -1) {
20
+ throw new ChildrenSectionNotFoundError(
21
+ 'Children section in Global Sections content type was not found. Please add a Children Section.'
22
+ )
23
+ }
24
+
25
+ const headerSections = globalSectionsHeader?.sections || []
26
+ const footerSections = globalSectionsFooter?.sections || []
27
+
28
+ return {
29
+ ...globalSections,
30
+ sections: [
31
+ ...globalSections.sections.slice(0, childrenIndex),
32
+ ...headerSections,
33
+ globalSections.sections[childrenIndex],
34
+ ...footerSections,
35
+ ...globalSections.sections.slice(childrenIndex + 1),
36
+ ],
37
+ }
38
+ }
@@ -122,7 +122,7 @@ export const getPage = async <T extends ContentData>(options: Options) => {
122
122
  throw new MissingContentError(options)
123
123
  }
124
124
 
125
- if (pages.length !== 1) {
125
+ if (pages.length > 1) {
126
126
  throw new MultipleContentError(options)
127
127
  }
128
128
 
@@ -0,0 +1,86 @@
1
+ import type { GlobalSectionsData } from '../../../src/components/cms/GlobalSections'
2
+ import { injectGlobalSections } from '../../../src/server/cms/global'
3
+
4
+ describe('hCMS - Multiple Global Section content type', () => {
5
+ describe('injectGlobalSections', () => {
6
+ it('should inject globalSectionsHeader before Children and globalSectionsFooter after', () => {
7
+ const globalSections: GlobalSectionsData = {
8
+ sections: [
9
+ { name: 'Navbar', data: {} },
10
+ { name: 'Children', data: {} },
11
+ { name: 'Footer', data: {} },
12
+ ],
13
+ }
14
+
15
+ const globalSectionsHeader: GlobalSectionsData = {
16
+ sections: [{ name: 'ExtraHeader', data: {} }],
17
+ }
18
+
19
+ const globalSectionsFooter: GlobalSectionsData = {
20
+ sections: [{ name: 'ExtraFooter', data: {} }],
21
+ }
22
+
23
+ const result = injectGlobalSections({
24
+ globalSections,
25
+ globalSectionsHeader,
26
+ globalSectionsFooter,
27
+ })
28
+
29
+ expect(result.sections).toEqual([
30
+ { name: 'Navbar', data: {} }, // Before Children
31
+ { name: 'ExtraHeader', data: {} }, // Injected header before Children
32
+ { name: 'Children', data: {} }, // Children
33
+ { name: 'ExtraFooter', data: {} }, // Injected footer after Children
34
+ { name: 'Footer', data: {} }, // Remaining sections
35
+ ])
36
+ })
37
+
38
+ it('should maintain order if globalSectionsHeader or globalSectionsFooter are empty', () => {
39
+ const globalSections: GlobalSectionsData = {
40
+ sections: [
41
+ { name: 'Navbar', data: {} },
42
+ { name: 'Children', data: {} },
43
+ { name: 'Footer', data: {} },
44
+ ],
45
+ }
46
+
47
+ const globalSectionsHeader: GlobalSectionsData = {
48
+ ...globalSections,
49
+ sections: [],
50
+ }
51
+ const globalSectionsFooter: GlobalSectionsData = {
52
+ ...globalSections,
53
+ sections: [],
54
+ }
55
+
56
+ const result = injectGlobalSections({
57
+ globalSections,
58
+ globalSectionsHeader,
59
+ globalSectionsFooter,
60
+ })
61
+
62
+ expect(result.sections).toEqual(globalSections.sections)
63
+ })
64
+
65
+ it('should throw an error when the "Children" section is missing', () => {
66
+ const globalSections: GlobalSectionsData = {
67
+ sections: [
68
+ { name: 'Navbar', data: {} },
69
+ { name: 'Footer', data: {} },
70
+ ],
71
+ }
72
+
73
+ expect(() =>
74
+ injectGlobalSections({
75
+ globalSections,
76
+ globalSectionsHeader: {
77
+ sections: [],
78
+ },
79
+ globalSectionsFooter: {
80
+ sections: [],
81
+ },
82
+ })
83
+ ).toThrow(Error)
84
+ })
85
+ })
86
+ })
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9180],{1845:function(e,t,r){"use strict";var n=r(759),a=r(5355),i=r(5972),l=r.n(i),o=r(1549);t.Z=function(e){var{incentives:t,label:r}=e;return(0,o.jsx)(a.Z,{className:"".concat(l().section," section-incentives layout__section"),children:(0,o.jsx)(n.Z,{incentives:t,colored:!0,label:null!=r?r:""})})}},8638:function(e,t,r){"use strict";r.r(t),r.d(t,{default:function(){return LandingPage},getLandingPageBySlug:function(){return T}});var n,a,i,l=r(3890),o=r(2565),s=r(3420),c=r(266),d=r(417),u=r(574),f=r(8163),p=r(1900),g=r(1845),m=r(8822),v=r(8793),P=r(3246),h=r(3093),y=r(4672),E=r(2678);let MissingContentError=class MissingContentError extends Error{constructor(e){super("Missing content on the CMS for content type ".concat(e.contentType,". Add content before proceeding. Context: ").concat(JSON.stringify(e,null,2)))}};var b=r(1295),w=r(7765);let MultipleContentError=class MultipleContentError extends Error{constructor(e){super("Multiple content defined on the CMS for content type ".concat(e.contentType,". Remove duplicated content before proceeding. Context: ").concat(JSON.stringify(e,null,2)))}};var S=r(7249),Z=r.n(S);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,o.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 isLocator=e=>"string"==typeof e.contentType&&("string"==typeof e.releaseId||"string"==typeof e.documentId||"string"==typeof e.versionId),x=new w.Z({workspace:Z().api.workspace,tenant:Z().api.storeId}),O=(n=(0,l.Z)(function*(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x;if(isLocator(e))return yield t.getCMSPage(e).then(e=>({data:[e]}));var r=[],n=yield t.getCMSPagesByContentType(e.contentType,_objectSpread(_objectSpread({},e.filters),{},{page:1,perPage:10}));r.push(...n.data);var a=Array.from({length:Math.ceil(n.totalItems/10)-1},(e,t)=>t+2);return n.totalItems>r.length&&(yield Promise.all(a.map(r=>t.getCMSPagesByContentType(e.contentType,_objectSpread(_objectSpread({},e.filters),{},{page:r,perPage:10}))))).forEach(e=>{r.push(...e.data)}),{data:r}}),function(e){return n.apply(this,arguments)}),j=(a=(0,l.Z)(function*(e){var t=(yield O(e)).data;if(!t[0])throw new MissingContentError(e);if(1!==t.length)throw new MultipleContentError(e);return t[0]}),function(e){return a.apply(this,arguments)}),I=r(1549);function LandingPage_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 LandingPage_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?LandingPage_ownKeys(Object(r),!0).forEach(function(t){(0,o.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):LandingPage_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var _=LandingPage_objectSpread(LandingPage_objectSpread(LandingPage_objectSpread({},E.Z),{},{Hero:p.V,BannerText:u.OverriddenDefaultBannerText,BannerNewsletter:d.default,CrossSellingShelf:f.Z,Incentives:g.Z,Newsletter:m.OverriddenDefaultNewsletter,ProductShelf:v.OverriddenDefaultProductShelf,ProductTiles:P.Z},h.Z),y.Z);function LandingPage(e){var t,r,n,a,i,l,o,d,u,f,p,g,m,v,{page:{sections:P,settings:h},slug:y,serverData:E,globalSections:w}=e;return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(s.PB,{title:null!==(t=null==h?void 0:null===(r=h.seo)||void 0===r?void 0:r.title)&&void 0!==t?t:Z().seo.title,description:null!==(n=null==h?void 0:null===(a=h.seo)||void 0===a?void 0:a.description)&&void 0!==n?n:null===(i=Z().seo)||void 0===i?void 0:i.description,titleTemplate:null!==(l=null===(o=Z().seo)||void 0===o?void 0:o.titleTemplate)&&void 0!==l?l:null===(d=Z().seo)||void 0===d?void 0:d.title,canonical:null!==(u=null==h?void 0:null===(f=h.seo)||void 0===f?void 0:f.canonical)&&void 0!==u?u:"".concat(Z().storeUrl,"/").concat(y),openGraph:{type:"website",url:Z().storeUrl,title:null!==(p=null==h?void 0:null===(g=h.seo)||void 0===g?void 0:g.title)&&void 0!==p?p:Z().seo.title,description:null!==(m=null==h?void 0:null===(v=h.seo)||void 0===v?void 0:v.description)&&void 0!==m?m:Z().seo.description}}),(0,I.jsx)(s.iu,{url:Z().storeUrl,potentialActions:[{target:"".concat(Z().storeUrl,"/s/?q"),queryInput:"search_term_string"}]}),(0,I.jsx)(b.ZP,{context:{data:E},children:(0,I.jsx)(c.Z,{sections:P,globalSections:w,components:_})})]})}var T=(i=(0,l.Z)(function*(e,t){try{if(Z().cms.data){var r=JSON.parse(Z().cms.data).landingPage.find(e=>{var t,r;null===(t=e.settings)||void 0===t||null===(r=t.seo)||void 0===r||r.slug});if(r)return yield j({contentType:"landingPage",documentId:r.documentId,versionId:r.versionId})}return yield j(LandingPage_objectSpread(LandingPage_objectSpread({},(null==t?void 0:t.contentType)==="landingPage"?t:{filters:{filters:{"settings.seo.slug":"/".concat(e)}}}),{},{contentType:"landingPage"}))}catch(e){if(e instanceof MissingContentError)return null;throw e}}),function(e,t){return i.apply(this,arguments)})},759:function(e,t,r){"use strict";var n=r(4564),a=r(2659),i=r(2614),l=r(1549);t.Z=function(e){var{incentives:t,variant:r="horizontal",colored:o=!1,label:s}=e;return(0,l.jsx)("section",{"data-fs-incentives":!0,"data-fs-incentives-colored":o,"data-fs-incentives-variant":r,"aria-label":"Incentives List ".concat(s),children:(0,l.jsx)(n.Z,{"data-fs-content":"incentives",children:t.map((e,t)=>(0,l.jsx)("li",{role:"listitem",children:(0,l.jsxs)(a.Z,{tabIndex:0,children:[(0,l.jsx)(i.Z,{"data-fs-incentive-icon":!0,"aria-label":e.alt,name:e.icon,width:32,height:32}),(0,l.jsxs)("section",{"data-fs-incentive-content":!0,children:[(0,l.jsx)("p",{"data-fs-incentive-title":!0,children:e.title}),(0,l.jsx)("span",{"data-fs-incentive-description":!0,children:e.firstLineText}),e.secondLineText&&(0,l.jsx)("span",{"data-fs-incentive-description":!0,children:e.secondLineText})]})]})},String(t)))})})}},5972:function(e){e.exports={section:"section_section__jnQ3q"}},2256:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="fs-input",...t},r){return n.createElement("input",{ref:r,"data-fs-input":!0,"data-testid":e,...t})});t.Z=a},9767:function(e,t,r){"use strict";var n=r(4194),a=r(5450);let i=(0,n.forwardRef)(function({value:e,as:t="span",variant:r="selling",testId:i="fs-price",formatter:l=e=>e,SRText:o,...s},c){let d=l(e,r);return n.createElement(t,{ref:c,"data-fs-price":!0,"data-fs-price-variant":r,"data-testid":i,...s},o&&n.createElement(a.Z,{text:o}),d)});t.Z=i},5450:function(e,t,r){"use strict";var n=r(4194);t.Z=function({text:e,as:t}){let r=t??"span";return n.createElement(r,{"data-fs-sr-only":!0},e)}},339:function(e,t,r){"use strict";r.d(t,{K:function(){return useSlideVisibility}});var n=r(4194);let useSlideVisibility=({currentSlide:e,itemsPerPage:t,totalItems:r})=>{let a=(0,n.useRef)(new Set);(0,n.useEffect)(()=>{for(let r=0;r<t;r++)a.current.add(e+r)},[e,t]);let isItemVisible=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=>a.current.has(e)||isItemVisible(e),isItemVisible}}},3525:function(e,t,r){"use strict";r.d(t,{oN:function(){return useSlider}});var n=r(4194),a=r(5412);let nextPage=(e,t)=>(e+1)%t,previousPage=(e,t)=>(t-(t-e+1)%t)%t;function reducer(e,t){switch(t.type){case"NEXT_PAGE":{let t=e.infinite?e.totalPages+1:e.totalPages,r=nextPage(e.currentPage,t),n=r%t*e.itemsPerPage;return{...e,sliding:!0,slideDirection:"next",currentItem:n,currentPage:r}}case"PREVIOUS_PAGE":{let t=e.infinite?e.totalPages+1:e.totalPages,r=e.infinite&&0===e.currentPage,n=r?-1:previousPage(e.currentPage,e.totalPages);return{...e,sliding:!0,slideDirection:"previous",currentItem:n%t*e.itemsPerPage,currentPage:n}}case"GO_TO_PAGE":if(t.payload.pageIndex===e.currentPage)return e;return{...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}}let defaultSliderState=(e,t,r)=>({currentItem:0,currentPage:0,sliding:!1,slideDirection:"next",totalItems:e,itemsPerPage:t,totalPages:Math.ceil(e/t),infinite:r}),slide=(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}})},useSlider=({totalItems:e,itemsPerPage:t=1,infiniteMode:r=!1,shouldSlideOnSwipe:i=!0,...l})=>{let[o,s]=(0,n.useReducer)(reducer,void 0,()=>defaultSliderState(e,t,r)),c=(0,a.QS)({onSwipedRight:()=>i&&slide("previous",s),onSwipedLeft:()=>i&&slide("next",s),trackMouse:!0,...l});return{handlers:c,slide,sliderState:o,sliderDispatch:s}}},9237:function(e,t,r){"use strict";var n=r(4194),a=r(7041),i=r(2614),l=r(3525),o=r(9654),s=r(6487);let createTransformValues=(e,t)=>{let r={},n=100/t;for(let a=0;a<t;++a){let t=e?a-1:a,i=-(n*a);r[t]=i}return r};t.Z=function({children:e,className:t,"aria-label":r,infiniteMode:c=!1,controls:d="complete",testId:u="fs-carousel",transition:f={duration:400,property:"transform"},id:p="fs-carousel",variant:g="scroll",itemsPerPage:m=1,navigationIcons:v,...P}){if(m<1)throw Error("itemsPerPage must be greater than or equal to 1");let h=(0,n.useRef)(null),y="slide"===g,E="scroll"===g,b=n.Children.toArray(e),w=b.length,S=c?w+2:w,Z=`${f.property} ${f.duration}ms ${f.timing??""} ${f.delay??""}`,{handlers:x,slide:O,sliderState:j,sliderDispatch:I}=(0,l.oN)({itemsPerPage:m,infiniteMode:c,totalItems:w,shouldSlideOnSwipe:y,...P}),_=Math.ceil(w/j.itemsPerPage),[T,C]=(0,n.useState)("16px"),[R,k]=(0,n.useState)(0);(0,n.useEffect)(()=>{let e=h.current?.firstElementChild;e&&(C(getComputedStyle(e).getPropertyValue("margin-right")),k(Number(e.clientWidth)+Number.parseInt(T,10)+1))},[R]);let L=(0,n.useMemo)(()=>createTransformValues(c,S),[S,c]),M=c&&e?b.slice(0,1):[],D=c&&e?b.slice(w-1):[],A=D.concat(e??[],M),N=(0,n.useMemo)(()=>({width:`${100*S}%`,transition:j.sliding?Z:void 0,transform:`translate3d(${L[j.currentPage]}%, 0, 0)`}),[S,L,Z,j.sliding,j.currentPage]),$=(0,n.useMemo)(()=>({width:"100%",overflowX:"scroll",whiteSpace:"nowrap"}),[]),slidePrevious=()=>{!j.sliding&&(c||0!==j.currentPage)&&O("previous",I)},slideNext=()=>{!j.sliding&&(c||j.currentPage!==w-1)&&O("next",I)},onScrollPagination=async(e,t)=>{if("previous"===t&&0===j.currentPage||"next"===t&&j.currentPage===j.totalPages-1)return;let r=e*R*m;h.current?.scrollTo({left:r,behavior:"smooth"}),O(e,I)};return n.createElement("section",{id:p,"data-fs-carousel":!0,"data-fs-carousel-variant":g,className:t,"data-testid":u,"aria-label":r},n.createElement("div",{"data-fs-carousel-track-container":!0,style:{width:"100%",overflow:"hidden",display:E?"block":void 0},...x},n.createElement("ul",{"aria-live":"polite",ref:h,style:y&&N||E&&$,"data-fs-carousel-track":!0,onScroll:e=>{if(y||m>1)return;let t=Number(e.currentTarget.firstElementChild?.scrollWidth),r=e.currentTarget?.scrollLeft,n=r>t/2?Math.round:Math.floor,a=n(r/t);O(a,I)},onTransitionEnd:()=>{I({type:"STOP_SLIDE"}),c&&j.currentItem>=w&&I({type:"GO_TO_PAGE",payload:{pageIndex:0,shouldSlide:!1}}),c&&j.currentItem<0&&I({type:"GO_TO_PAGE",payload:{pageIndex:j.totalPages-1,shouldSlide:!1}})}},A.map((e,t)=>n.createElement(s.Z,{id:p,index:t,key:String(t),state:j,totalItems:w,infiniteMode:c,isScrollCarousel:E,marginRightValue:T},e)))),1!==_&&("complete"===d||"navigationArrows"===d)&&n.createElement("div",{"data-fs-carousel-controls":!0},n.createElement(a.Z,{"data-fs-carousel-control":"left","aria-controls":p,disabled:!c&&0===j.currentPage,"aria-label":"previous",icon:v?.left??n.createElement(i.Z,{name:"ArrowLeft",width:20,height:20,weight:"bold"}),onClick:()=>{y&&slidePrevious(),E&&onScrollPagination(j.currentPage-1,"previous")}}),n.createElement(a.Z,{"data-fs-carousel-control":"right","aria-controls":p,disabled:!c&&j.currentPage===j.totalPages-1,"aria-label":"next",icon:v?.right??n.createElement(i.Z,{name:"ArrowRight",width:20,height:20,weight:"bold"}),onClick:()=>{y&&slideNext(),E&&onScrollPagination(j.currentPage+1,"next")}})),1!==_&&("complete"===d||"paginationBullets"===d)&&n.createElement(o.Z,{id:p,tabIndex:0,activeBullet:j.currentPage,totalQuantity:_,onKeyDown:e=>{switch(e.key){case"ArrowLeft":y&&slidePrevious(),E&&onScrollPagination(j.currentPage-1,"previous");break;case"ArrowRight":y&&slideNext(),E&&onScrollPagination(j.currentPage+1,"next");break;case"Home":O(0,I);break;case"End":O(w-1,I)}},onClick:async(e,t)=>{y&&!j.sliding&&O(t,I),E&&onScrollPagination(t)},onFocus:e=>e.currentTarget.focus(),ariaControlsGenerator:e=>`${p}-carousel-item-${e}`}))}},9654:function(e,t,r){"use strict";var n=r(4194),a=r(3339);let defaultAriaLabel=(e,t,r)=>r?`Current page from ${e}`:`Go to page ${t+1} from ${e}`,i=(0,n.forwardRef)(function({id:e,totalQuantity:t,activeBullet:r,onClick:i,testId:l="fs-carousel-bullets",ariaLabelGenerator:o=defaultAriaLabel,ariaControlsGenerator:s,...c},d){let u=(0,n.useMemo)(()=>Array(t).fill(0),[t]);return n.createElement("div",{ref:d,"data-fs-carousel-bullets":!0,"data-testid":l,role:"tablist",...c},u.map((t,c)=>{let d=r===c;return n.createElement(a.Z,{key:`${e}-${c}`,role:"tab",tabIndex:-1,"data-fs-carousel-bullet":!0,testId:`${l}-bullet`,onClick:e=>i(e,c),"aria-label":o(e,c,d),"aria-controls":s?.(c),"aria-selected":d,variant:"tertiary"})}))});t.Z=i},6487:function(e,t,r){"use strict";var n=r(4194),a=r(339);t.Z=function({id:e,index:t,state:r,children:i,totalItems:l,infiniteMode:o,isScrollCarousel:s,marginRightValue:c}){let{isItemVisible:d,shouldRenderItem:u}=(0,a.K)({totalItems:l,currentSlide:r.currentItem,itemsPerPage:r.itemsPerPage}),f={width:`calc((100% - ${c} * ${r.itemsPerPage-1}) / ${r.itemsPerPage})`},p=s&&r.itemsPerPage>1?{...f}:{width:"100%"},g=s||u(t-Number(o));return n.createElement("li",{style:p,id:`${e}-carousel-item-${t}`,"data-fs-carousel-item":!0,"data-fs-carousel-item-visible":d(t-Number(o))||void 0},g?i:null)}},2946:function(e,t,r){"use strict";r.d(t,{Z:function(){return DiscountBadge_DiscountBadge}});var n=r(4194),a=r(276);let useDiscountPercent=(e,t)=>(0,n.useMemo)(()=>{let r=e-t,n=100*r/e;return Math.round(n)},[t,e]);var DiscountBadge_DiscountBadge=({listPrice:e,spotPrice:t,thresholdLow:r=15,thresholdHigh:i=40,size:l,testId:o="fs-discount-badge"})=>{let s=useDiscountPercent(e,t);if(0===s)return n.createElement(n.Fragment,null);let c=s<=r?"low":s<=i?"medium":"high";return n.createElement(a.Z,{"data-fs-discount-badge":!0,"data-fs-discount-badge-variant":c,size:l,"data-testid":o},s,"% off")}},3779:function(e,t,r){"use strict";var n=r(4194),a=r(2256),i=r(1953),l=r(7041),o=r(2614),s=r(3339);t.Z=({id:e,label:t,type:r="text",error:c,displayClearButton:d,actionable:u,buttonActionText:f="Apply",onSubmit:p,onClear:g,placeholder:m=" ",inputRef:v,disabled:P,value:h,testId:y="fs-input-field",...E})=>{let b=!P&&c&&""!==c,w=u&&!P&&""!==h;return n.createElement("div",{"data-fs-input-field":!0,"data-fs-input-field-actionable":u,"data-fs-input-field-error":c&&""!==c,"data-testid":y},n.createElement(a.Z,{id:e,type:r,value:h,ref:v,disabled:P,placeholder:m,...E}),n.createElement(i.Z,{htmlFor:e},t),w&&(d||c?n.createElement(l.Z,{size:"small","aria-label":"Clear Field",icon:n.createElement(o.Z,{name:"XCircle"}),onClick:()=>{g?.(),v?.current?.focus()}}):n.createElement(s.Z,{variant:"tertiary",size:"small",onClick:p},f)),b&&n.createElement("span",{"data-fs-input-field-error-message":!0},c))}},8394:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="fs-product-card",variant:t="default",bordered:r=!1,outOfStock:a,children:i,...l},o){return n.createElement("article",{ref:o,"data-fs-product-card":a?"out-of-stock":"","data-fs-product-card-variant":t,"data-fs-product-card-bordered":r,"data-testid":e,...l},i)});t.Z=a},547:function(e,t,r){"use strict";var n=r(4194),a=r(727),i=r(9088),l=r(1953),o=r(3024),s=r(2614),c=r(2946),d=r(276),u=r(3339);let f=(0,n.forwardRef)(function({testId:e="fs-product-card-content",title:t,linkProps:r,price:f,outOfStock:p,outOfStockLabel:g="Out of stock",ratingValue:m,showDiscountBadge:v,buttonLabel:P="Add",onButtonClick:h,children:y,includeTaxes:E=!1,includeTaxesLabel:b="Tax included",sponsored:w=!1,sponsoredLabel:S="Sponsored",...Z},x){let O=f?.listPrice?f.listPrice:0,j=f?.value?f.value:0;return n.createElement("section",{ref:x,"data-fs-product-card-content":!0,"data-fs-product-card-badge":v,"data-testid":e,...Z},w&&n.createElement("span",{"data-fs-product-card-sponsored-label":!0},S),n.createElement("div",{"data-fs-product-card-heading":!0},n.createElement("h3",{"data-fs-product-card-title":!0},n.createElement(a.Z,{...r,title:t},n.createElement("span",null,t))),!p&&n.createElement(i.Z,{"data-fs-product-card-prices":!0,value:j,listPrice:O,formatter:f?.formatter}),E&&n.createElement(l.Z,{"data-fs-product-card-taxes-label":!0},b),m&&n.createElement(o.Z,{value:m,icon:n.createElement(s.Z,{name:"Star"})})),v&&!p&&n.createElement(c.Z,{listPrice:O,spotPrice:j}),p&&n.createElement(d.Z,null,g),h&&!p&&n.createElement("div",{"data-fs-product-card-actions":!0},n.createElement(u.Z,{variant:"primary",icon:n.createElement(s.Z,{name:"ShoppingCart"}),iconPosition:"left",size:"small",onClick:h},P)))});t.Z=f},5167:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="fs-product-card-image",aspectRatio:t=1,children:r,...a},i){return n.createElement("div",{ref:i,"data-fs-product-card-image":!0,"data-testid":e,style:{"--fs-product-card-image-aspect-ratio":t},...a},r)});t.Z=a},9088:function(e,t,r){"use strict";var n=r(4194),a=r(9767);let i=(0,n.forwardRef)(function({testId:e="fs-product-price",value:t,listPrice:r,formatter:i,...l},o){let s=r??0,c=t??0;return n.createElement("div",{ref:o,"data-fs-product-price":!0,"data-testid":e,...l},c!==s&&0!==s?n.createElement(n.Fragment,null,n.createElement(a.Z,{value:s,formatter:i,testId:"list-price","data-value":s,variant:"listing",SRText:"Original price:"}),n.createElement(a.Z,{value:c,formatter:i,testId:"price","data-value":c,variant:"spot",SRText:"Price:"})):n.createElement(a.Z,{value:c,formatter:i,testId:"price","data-value":c,variant:"spot",SRText:"Price:"}))});t.Z=i},3024:function(e,t,r){"use strict";var n=r(4194),a=r(2614),i=r(7041),l=r(4564);let o=(0,n.forwardRef)(function({children:e,testId:t="fs-rating",length:r=5,value:o=0,icon:s,onChange:c,disabled:d,...u},f){let[p,g]=(0,n.useState)(0),m={"data-fs-rating-icon-outline":!0},v=n.isValidElement(s)?s:n.createElement(a.Z,{name:"Star"});return n.createElement(l.Z,{ref:f,"data-fs-rating":!0,"data-fs-rating-actionable":"function"==typeof c,"data-testid":t,...u},Array.from({length:r}).map((e,r)=>{let l=r+1;return n.createElement("li",{key:`rating-${r}`,"data-fs-rating-item":l<=(p||o)?"full":l-o>0&&l-o<1?"partial":"empty","data-testid":`${t}-item`},c?n.createElement(i.Z,{"data-fs-rating-button":!0,icon:v,size:"small","aria-label":"rate",onClick:()=>{c(l)},onMouseEnter:()=>g(l),onMouseLeave:()=>g(o),disabled:d}):n.createElement(n.Fragment,null,n.createElement("div",{"data-fs-rating-icon-wrapper":!0},v),n.isValidElement(s)?n.cloneElement(s,m):n.createElement(a.Z,{name:"Star","data-fs-rating-icon-outline":!0})))}))});t.Z=o},7115:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({card:e,children:t,colorVariant:r="main",testId:a="fs-newsletter",...i},l){return n.createElement("div",{ref:l,"data-testid":a,"data-fs-content":"newsletter","data-fs-newsletter":e?"card":"","data-fs-newsletter-color-variant":r,...i},t)});t.Z=a},2294:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({addendum:e,testId:t="fs-newsletter-addendum",...r},a){return n.createElement("span",{ref:a,"data-testid":t,"data-fs-newsletter-addendum":!0,...r},e)});t.Z=a},4207:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({children:e,testId:t="fs-newsletter-content",...r},a){return n.createElement("div",{ref:a,"data-testid":t,"data-fs-newsletter-content":!0,...r},e)});t.Z=a},2571:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({children:e,onSubmit:t,testId:r="fs-newsletter-form",...a},i){return n.createElement("form",{ref:i,"data-testid":r,"data-fs-newsletter-form":!0,onSubmit:t,...a},e)});t.Z=a},4796:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({icon:e,title:t,description:r,testId:a="fs-newsletter-header",...i},l){return n.createElement("header",{ref:l,"data-testid":a,"data-fs-newsletter-header":!0,...i},n.createElement("h3",{"data-fs-newsletter-header-title":!0},e,t),r&&n.createElement("span",{"data-fs-newsletter-header-description":!0},r))});t.Z=a},6737:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="fs-product-shelf",children:t,...r},a){return n.createElement("div",{ref:a,"data-fs-product-shelf":!0,"data-fs-content":"product-shelf","data-testid":e,...r},t)});t.Z=a},2659:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="store-incentive",children:t,...r},a){return n.createElement("section",{ref:a,"data-fs-incentive":!0,"data-testid":e,...r},t)});t.Z=a},7901:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="store-tile",children:t,...r},a){return n.createElement("li",{ref:a,role:"listitem","data-fs-tile":!0,"data-testid":e,...r},t)});t.Z=a},3877:function(e,t,r){"use strict";var n=r(4194);let a=(0,n.forwardRef)(function({testId:e="store-tiles",children:t,...r},a){let i=n.Children.count(t);return n.createElement("ul",{ref:a,role:"list","data-fs-tiles":!0,"data-fs-tiles-variant":3===i?"expanded-first":2===i?"expanded-first-two":"","data-fs-content":"tiles","data-testid":e,...r},t)});t.Z=a}}]);