@faststore/core 4.1.0 β 4.1.1-dev.1
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.
- package/.turbo/turbo-generate.log +3 -3
- package/.turbo/turbo-test.log +22 -22
- package/AGENTS.md +167 -0
- package/CHANGELOG.md +48 -0
- package/README.md +108 -167
- package/cms/faststore/pages/cms_content_type__globalfootersections.jsonc +1 -59
- package/cms/faststore/pages/cms_content_type__globalheadersections.jsonc +1 -59
- package/cms/faststore/pages/cms_content_type__globalsections.jsonc +1 -59
- package/cms/faststore/pages/cms_content_type__home.jsonc +1 -59
- package/cms/faststore/pages/cms_content_type__landingpage.jsonc +1 -62
- package/cms/faststore/pages/cms_content_type__pdp.jsonc +1 -68
- package/cms/faststore/pages/cms_content_type__plp.jsonc +1 -68
- package/cms/faststore/pages/cms_content_type__search.jsonc +1 -68
- package/cms/faststore/schema.json +124 -644
- package/index.ts +1 -1
- package/package.json +9 -7
- package/src/components/cms/RenderSections.tsx +38 -3
- package/vitest.config.ts +15 -0
package/README.md
CHANGED
|
@@ -1,224 +1,165 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
|
|
3
|
-
<img alt="Store Framework" src="https://emoji.slack-edge.com/T02BCPD0X/store-framework/7547b127e929c376.png" width="75" />
|
|
4
|
-
</a>
|
|
2
|
+
<img alt="Faststore" src="../ui/static/logo.png" width="60" />
|
|
5
3
|
</p>
|
|
6
|
-
<h1 align="center">
|
|
7
|
-
A starter powered by FastStore and NextJS.
|
|
8
|
-
</h1>
|
|
9
|
-
|
|
10
|
-
Kick off your store with this boilerplate.
|
|
11
|
-
This starter ships the main FastStore configuration files to get your store up and running blazing-fast. This source code is the base for FastStore projects starter.
|
|
12
4
|
|
|
13
|
-
|
|
5
|
+
<h1 align="center">FastStore Core</h1>
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://badge.fury.io/js/%40faststore%2Fcore">
|
|
9
|
+
<img alt="npm version" src="https://badge.fury.io/js/%40faststore%2Fcore.svg" />
|
|
10
|
+
</a>
|
|
11
|
+
</p>
|
|
16
12
|
|
|
17
|
-
> PS: you can install dependencies using the package manager of your choosing. In this guide, we'll be using `pnpm` as an example.
|
|
18
13
|
|
|
19
|
-
Install dependencies with pnpm
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
`@faststore/core` is the main Next.js application for FastStore storefronts. It bundles together all the building blocks of a store β sections, pages, SDK hooks, server utilities, and CMS configuration β into a ready-to-use boilerplate.
|
|
16
|
+
|
|
17
|
+
Store builders consume this package through `@faststore/cli` and extend it via the `src/customizations/` directory. You will work directly in this package when contributing new sections, pages, SDK hooks, or CMS configurations to the FastStore platform.
|
|
18
|
+
|
|
19
|
+
## Package structure
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
packages/core/
|
|
23
|
+
βββ src/
|
|
24
|
+
β βββ components/
|
|
25
|
+
β β βββ sections/ # Full-page content slices (Hero, ProductGallery, ProductShelfβ¦)
|
|
26
|
+
β β βββ ui/ # Store-level UI components (compositions of @faststore/ui)
|
|
27
|
+
β β βββ skeletons/ # Loading state skeleton components
|
|
28
|
+
β β βββ β¦ # Domain folders: cart, product, search, navigation, authβ¦
|
|
29
|
+
β βββ pages/ # Next.js file-based routes
|
|
30
|
+
β βββ sdk/ # Business logic hooks (cart, session, search, analyticsβ¦)
|
|
31
|
+
β βββ server/ # Server-side utilities (CMS content fetching)
|
|
32
|
+
β βββ customizations/ # Store-level overrides: styles, fonts, components, fragments
|
|
33
|
+
β βββ styles/ # Global SCSS styles
|
|
34
|
+
β βββ instrumentation.ts # Next.js instrumentation hook (boots @faststore/diagnostics when otelEnabled)
|
|
35
|
+
βββ cms/faststore/ # CMS configuration: sections.json, content-types.json, schemas
|
|
36
|
+
βββ @generated/ # Auto-generated GraphQL types β do not edit
|
|
37
|
+
βββ discovery.config.default.js # Committed base store configuration (platform, sales channel, locale)
|
|
38
|
+
βββ discovery.config.js # Merges default config with store-level customizations β do not edit directly
|
|
39
|
+
βββ next.config.js # Next.js configuration
|
|
40
|
+
βββ codegen.ts # GraphQL code generation config
|
|
41
|
+
βββ lighthouserc.js # Lighthouse CI configuration
|
|
23
42
|
```
|
|
24
43
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Navigate into your new siteβs directory and start it up.
|
|
28
|
-
|
|
29
|
-
```shell
|
|
30
|
-
pnpm dev
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
3. **Open the source code and start editing!**
|
|
34
|
-
|
|
35
|
-
Your site is now running at `http://localhost:3000`!
|
|
36
|
-
|
|
37
|
-
## π§ What's inside?
|
|
44
|
+
## How to run
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
**Prerequisites:** Node β₯ 20, pnpm
|
|
40
47
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
βββ public
|
|
46
|
-
βββ src
|
|
47
|
-
βββ test
|
|
48
|
-
βββ .babelrc.js
|
|
49
|
-
βββ .editorconfig
|
|
50
|
-
βββ .prettierignore
|
|
51
|
-
βββ .prettierrrc
|
|
52
|
-
βββ .stylelintignore
|
|
53
|
-
βββ .gitignore
|
|
54
|
-
βββ codegen.ts
|
|
55
|
-
βββ cypress
|
|
56
|
-
βββ cypress.config.ts
|
|
57
|
-
βββ discovery.config.default.js
|
|
58
|
-
βββ discovery.config.js
|
|
59
|
-
βββ index.ts
|
|
60
|
-
βββ jest.config.js
|
|
61
|
-
βββ LICENSE
|
|
62
|
-
βββ lighthouserc.js
|
|
63
|
-
βββ next-env.d.ts
|
|
64
|
-
βββ next.config.ts
|
|
65
|
-
βββ package.json
|
|
66
|
-
βββ tsconfig.json
|
|
67
|
-
βββ postcss.config.js
|
|
68
|
-
βββ postinstall.js
|
|
69
|
-
βββ README.md
|
|
70
|
-
βββ stylelint.config.js
|
|
71
|
-
βββ tsconfig.json
|
|
72
|
-
βββ vtex.env
|
|
48
|
+
```sh
|
|
49
|
+
pnpm install
|
|
50
|
+
pnpm dev # generates GraphQL types, then starts the Next.js dev server
|
|
51
|
+
```
|
|
73
52
|
|
|
74
|
-
|
|
53
|
+
Your store will be available at `http://localhost:3000`.
|
|
75
54
|
|
|
76
|
-
2. **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for βsource codeβ.
|
|
77
55
|
|
|
78
|
-
3. **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for.
|
|
79
56
|
|
|
80
|
-
|
|
57
|
+
> The `pnpm dev` command runs `pnpm generate` automatically before starting the dev server. You only need to run `pnpm generate` manually when you change a GraphQL query or fragment while the server is already running.
|
|
81
58
|
|
|
82
|
-
|
|
59
|
+
## How to develop
|
|
83
60
|
|
|
84
|
-
|
|
61
|
+
### Adding or modifying a section
|
|
85
62
|
|
|
86
|
-
|
|
63
|
+
Sections are full-page slices that can be managed via the CMS. They live in `src/components/sections/`.
|
|
87
64
|
|
|
88
|
-
|
|
65
|
+
1. Create `src/components/sections/{SectionName}/{SectionName}.tsx` and a companion `.module.scss`
|
|
66
|
+
2. Compose the section using components from `@faststore/ui`
|
|
67
|
+
3. Add the section definition to `cms/faststore/sections.json` (name, props, schema)
|
|
68
|
+
4. Export the section from the sections index
|
|
89
69
|
|
|
90
|
-
|
|
70
|
+
### Adding a store-level UI component
|
|
91
71
|
|
|
92
|
-
|
|
72
|
+
Store-level UI components (not intended for the shared library) live in `src/components/ui/`.
|
|
93
73
|
|
|
94
|
-
|
|
74
|
+
1. Create `src/components/ui/{ComponentName}/{ComponentName}.tsx` with a companion `.module.scss`
|
|
75
|
+
2. Compose using components from `@faststore/ui`
|
|
76
|
+
3. Use TypeScript for props β no `data-fs-*` attributes needed here (those belong in `@faststore/components`)
|
|
95
77
|
|
|
96
|
-
|
|
78
|
+
### Adding or modifying a GraphQL query
|
|
97
79
|
|
|
98
|
-
|
|
80
|
+
1. Edit or create a `.graphql` file with your query or fragment
|
|
81
|
+
2. Run `pnpm generate` to regenerate types under `@generated/`
|
|
82
|
+
3. Import the generated types from `@generated/graphql`
|
|
99
83
|
|
|
100
|
-
|
|
84
|
+
> Never edit files inside `@generated/` manually β they are overwritten on every `pnpm generate` run.
|
|
101
85
|
|
|
102
|
-
|
|
86
|
+
### Managing SVG icons
|
|
103
87
|
|
|
104
|
-
|
|
88
|
+
Icons are loaded from a single sprite at `public/icons.svg` via the `Icon` component from `@faststore/ui`.
|
|
105
89
|
|
|
106
|
-
|
|
107
|
-
|
|
90
|
+
1. Open `public/icons.svg` and add a new `<symbol>` with a unique `id`
|
|
91
|
+
2. Remove `fill`, `stroke-width`, `width`, `height`, and `color` attributes from the symbol so it can be styled via CSS
|
|
92
|
+
3. Use the icon in any component:
|
|
108
93
|
|
|
109
|
-
|
|
94
|
+
```tsx
|
|
95
|
+
import { Icon } from '@faststore/ui'
|
|
110
96
|
|
|
111
|
-
|
|
97
|
+
<Icon name="Bell" weight="thin" />
|
|
98
|
+
```
|
|
112
99
|
|
|
113
|
-
|
|
114
|
-
2. `src/views`: Receives static data from `src/pages`, enriches this data with dynamic attributes, and render section components along with SEO tags.
|
|
115
|
-
3. `src/components/sections`: Receives necessary data and use domain-specific components (cart/product/search/ui) for rendering a slice on the web page.
|
|
100
|
+
This project uses icons from [Phosphor Icons](https://phosphoricons.com/).
|
|
116
101
|
|
|
117
|
-
###
|
|
102
|
+
### Adding CMS configuration
|
|
118
103
|
|
|
119
|
-
|
|
104
|
+
FastStore currently supports two CMS content sources. The flow depends on which one we want to update.
|
|
120
105
|
|
|
121
|
-
|
|
106
|
+
#### Headless CMS (legacy)
|
|
122
107
|
|
|
123
|
-
|
|
108
|
+
1. Define the section schema in `cms/faststore/sections.json`
|
|
109
|
+
2. For new content types, add them to `cms/faststore/content-types.json`
|
|
110
|
+
3. Run `pnpm faststore cms-sync` to push changes to the CMS
|
|
124
111
|
|
|
125
|
-
|
|
126
|
-
2. Add an `id` to the symbol. Remember to use an unique `id` and do not replicate it.
|
|
127
|
-
3. Remove unnecessary HTML/SVG properties to allow you to style and decrease the final file size, such as `fill`, `stroke-width`, `width`, `height`, and `color`.
|
|
112
|
+
#### CMS (new)
|
|
128
113
|
|
|
129
|
-
|
|
114
|
+
Schemas are defined as individual `.jsonc` files instead of a single `sections.json`.
|
|
115
|
+
To support both CMS versions, changes made to the legacy files are migrated to the new format using the split commands.
|
|
130
116
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
</svg>
|
|
117
|
+
1. After updating `sections.json` or `content-types.json`, run the split commands to generate the new format:
|
|
118
|
+
```sh
|
|
119
|
+
vtex content split-components -i cms/faststore/sections.json -o cms/faststore/components
|
|
135
120
|
```
|
|
136
121
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
1. Get the icon's `id` that you created in the SVG icon file.
|
|
140
|
-
2. Add the `id` in the React component that you desire to use the SVG icon. For example
|
|
141
|
-
|
|
142
|
-
```tsx
|
|
143
|
-
// src/components/ui/MyIconButton/MyIconButton.tsx
|
|
144
|
-
import Icon from '@faststore/ui'
|
|
145
|
-
|
|
146
|
-
function ButtonIcon() {
|
|
147
|
-
return (
|
|
148
|
-
<button>
|
|
149
|
-
<Icon name="<<symbol_id>>" weight="thin" />
|
|
150
|
-
</button>
|
|
151
|
-
)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export default ButtonIcon
|
|
122
|
+
```sh
|
|
123
|
+
vtex content split-content-types -i cms/faststore/content-types.json -s cms/faststore/sections.json -o cms/faststore/pages
|
|
155
124
|
```
|
|
156
125
|
|
|
157
|
-
|
|
158
|
-
More details, please refer to this [doc](https://www.faststore.dev/docs/icons).
|
|
159
|
-
|
|
160
|
-
## ποΈ Styling Components
|
|
161
|
-
|
|
162
|
-
Our customized themes are based on [Design Tokens](https://css-tricks.com/what-are-design-tokens/) using [CSS Variables](https://developer.mozilla.org/en-US/docs/Web/CSS/--*) or a CSS class for each token. We utilize the styles from the `@faststore/ui` package, which are imported into the `src/styles` directory. Additionally, each component's styles are imported directly into the section where they are being used. Refer to [Theming overview](https://www.faststore.dev/docs/theming-overview) for more details.
|
|
163
|
-
|
|
164
|
-
## π Adding queries
|
|
165
|
-
|
|
166
|
-
We use [graphql-codegen](https://www.graphql-code-generator.com/) to pre-process GraphQL queries. This compilation generates TypeScript typings and configurations for our graphql server under the folder `@generated/graphql`.
|
|
167
|
-
This means we can statically analyze your code in search of bugs and secure your graphql server before each deploy. If, however you need to change any GraphQL Fragment, Query or Mutation, you will need to regenerate the whole thing. To do this, open your terminal and type
|
|
168
|
-
|
|
126
|
+
2. Generate the schema:
|
|
169
127
|
```sh
|
|
170
|
-
|
|
128
|
+
vtex content generate-schema cms/faststore/components cms/faststore/pages -o cms/faststore/schema.json
|
|
171
129
|
```
|
|
172
130
|
|
|
173
|
-
|
|
174
|
-
|
|
131
|
+
3. Upload the schema to the Schema Registry:
|
|
175
132
|
```sh
|
|
176
|
-
|
|
133
|
+
vtex content upload-schema cms/faststore/schema.json
|
|
177
134
|
```
|
|
178
135
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
> Pro tip: Pass `-w` to the `pnpm generate` command so it watches for changes and you don't need to run this command multiple times.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
## CMS Integration
|
|
185
|
-
|
|
186
|
-
This store is integrated with [VTEX headless CMS](https://v1.faststore.dev/tutorials/cms/0).
|
|
136
|
+
Files can be placed in `cms/components/` and `cms/pages/`, or co-located alongside their component in `src/components/`.
|
|
187
137
|
|
|
188
|
-
|
|
189
|
-
The `cms/faststore` contains the `content-types.json` and `sections.json` files.
|
|
138
|
+
> For schema syntax and the full architectural overview, see the [CMS architecture and schema declarations](https://developers.vtex.com/docs/guides/understanding-cms-architecture-and-schema-declarations) guide.
|
|
190
139
|
|
|
191
|
-
|
|
140
|
+
## How to test
|
|
192
141
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
## β‘ Performance & QA
|
|
200
|
-
|
|
201
|
-
This project has strict performance budgets. Right out of the box, this project performs around 95 on Google's Page Speed Insights website, which usually is way more strict than your laptop's chrome lighthouse. Every time you commit to the repository, our QA bots will run and evaluate your code quality. We recommend you NEVER put in production a code that breaks any of the bots. If a bot breaks and still you need to put the code into production, change the bot config (`lighthouserc.js`, `cypress.config.ts`) to make it pass and merge. This way you ensure your website will keep performing well during the years to come.
|
|
142
|
+
```sh
|
|
143
|
+
pnpm test # unit tests (Vitest)
|
|
144
|
+
pnpm test:e2e # E2E tests (Cypress)
|
|
145
|
+
pnpm lhci # Lighthouse performance audit
|
|
146
|
+
```
|
|
202
147
|
|
|
203
|
-
|
|
148
|
+
This project has strict performance budgets. The Lighthouse CI (`lhci`) runs automatically on every PR and enforces score minimums and metric budgets defined in `lighthouserc.js`.
|
|
204
149
|
|
|
205
|
-
|
|
150
|
+
## How to publish
|
|
206
151
|
|
|
207
|
-
|
|
208
|
-
Some third-party scripts execute expensive computations that may require some time to run, making pages few slow. If that's the case, wrap those in a function and reference it on the Partytown `forward` prop. By doing this, Partytown will run this function on a web worker so it doesn't block the main thread.
|
|
152
|
+
This package is versioned and published as part of the FastStore monorepo release process, managed by Lerna at the monorepo root. Do not publish individually.
|
|
209
153
|
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
<script type="text/partytown">
|
|
215
|
-
window.expensiveFunction = function() {/* expensive computation used by custom-script */}
|
|
216
|
-
</script>
|
|
217
|
-
<script key="custom-script" src="*://domain/path" type="text/partytown" />,
|
|
218
|
-
<Partytown key="partytown" forward={["expensiveFunction"]} />
|
|
219
|
-
])
|
|
220
|
-
// ...
|
|
221
|
-
}
|
|
154
|
+
```sh
|
|
155
|
+
# From the monorepo root:
|
|
156
|
+
pnpm release # publish to latest (main branch)
|
|
157
|
+
pnpm release:dev # publish to dev tag (dev branch)
|
|
222
158
|
```
|
|
223
159
|
|
|
224
|
-
|
|
160
|
+
## Documentation
|
|
161
|
+
|
|
162
|
+
- [FastStore documentation](https://developers.vtex.com/docs/guides/faststore/getting-started-overview)
|
|
163
|
+
- [Theming and design tokens](https://developers.vtex.com/docs/guides/faststore/styling-overview)
|
|
164
|
+
- [CMS integration](https://developers.vtex.com/docs/guides/faststore/headless-cms-overview)
|
|
165
|
+
- [Next.js docs](https://nextjs.org/docs)
|
|
@@ -6,65 +6,7 @@
|
|
|
6
6
|
"title": "Global Footer Sections",
|
|
7
7
|
"properties": {
|
|
8
8
|
"sections": {
|
|
9
|
-
"
|
|
10
|
-
"items": {
|
|
11
|
-
"anyOf": [
|
|
12
|
-
{
|
|
13
|
-
"$ref": "#/components/Search"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"$ref": "#/components/Navbar"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"$ref": "#/components/Alert"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"$ref": "#/components/Footer"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"$ref": "#/components/BannerText"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"$ref": "#/components/Hero"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"$ref": "#/components/Incentives"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"$ref": "#/components/ProductShelf"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"$ref": "#/components/ProductTiles"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"$ref": "#/components/Newsletter"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"$ref": "#/components/Children"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"$ref": "#/components/BannerNewsletter"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"$ref": "#/components/CartSidebar"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"$ref": "#/components/RegionBar"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"$ref": "#/components/RegionModal"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"$ref": "#/components/RegionPopover"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"$ref": "#/components/EmptyState"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"$ref": "#/components/ShoppingAssistant"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
}
|
|
9
|
+
"$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
|
|
68
10
|
}
|
|
69
11
|
},
|
|
70
12
|
"readOnly": false,
|
|
@@ -6,65 +6,7 @@
|
|
|
6
6
|
"title": "Global Header Sections",
|
|
7
7
|
"properties": {
|
|
8
8
|
"sections": {
|
|
9
|
-
"
|
|
10
|
-
"items": {
|
|
11
|
-
"anyOf": [
|
|
12
|
-
{
|
|
13
|
-
"$ref": "#/components/Search"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"$ref": "#/components/Navbar"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"$ref": "#/components/Alert"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"$ref": "#/components/Footer"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"$ref": "#/components/BannerText"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"$ref": "#/components/Hero"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"$ref": "#/components/Incentives"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"$ref": "#/components/ProductShelf"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"$ref": "#/components/ProductTiles"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"$ref": "#/components/Newsletter"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"$ref": "#/components/Children"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"$ref": "#/components/BannerNewsletter"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"$ref": "#/components/CartSidebar"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"$ref": "#/components/RegionBar"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"$ref": "#/components/RegionModal"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"$ref": "#/components/RegionPopover"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"$ref": "#/components/EmptyState"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"$ref": "#/components/ShoppingAssistant"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
}
|
|
9
|
+
"$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
|
|
68
10
|
}
|
|
69
11
|
},
|
|
70
12
|
"readOnly": false,
|
|
@@ -360,65 +360,7 @@
|
|
|
360
360
|
"$componentTitle": "Loading"
|
|
361
361
|
},
|
|
362
362
|
"sections": {
|
|
363
|
-
"
|
|
364
|
-
"items": {
|
|
365
|
-
"anyOf": [
|
|
366
|
-
{
|
|
367
|
-
"$ref": "#/components/Search"
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
"$ref": "#/components/Navbar"
|
|
371
|
-
},
|
|
372
|
-
{
|
|
373
|
-
"$ref": "#/components/Alert"
|
|
374
|
-
},
|
|
375
|
-
{
|
|
376
|
-
"$ref": "#/components/Footer"
|
|
377
|
-
},
|
|
378
|
-
{
|
|
379
|
-
"$ref": "#/components/BannerText"
|
|
380
|
-
},
|
|
381
|
-
{
|
|
382
|
-
"$ref": "#/components/Hero"
|
|
383
|
-
},
|
|
384
|
-
{
|
|
385
|
-
"$ref": "#/components/Incentives"
|
|
386
|
-
},
|
|
387
|
-
{
|
|
388
|
-
"$ref": "#/components/ProductShelf"
|
|
389
|
-
},
|
|
390
|
-
{
|
|
391
|
-
"$ref": "#/components/ProductTiles"
|
|
392
|
-
},
|
|
393
|
-
{
|
|
394
|
-
"$ref": "#/components/Newsletter"
|
|
395
|
-
},
|
|
396
|
-
{
|
|
397
|
-
"$ref": "#/components/Children"
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
"$ref": "#/components/BannerNewsletter"
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
"$ref": "#/components/CartSidebar"
|
|
404
|
-
},
|
|
405
|
-
{
|
|
406
|
-
"$ref": "#/components/RegionBar"
|
|
407
|
-
},
|
|
408
|
-
{
|
|
409
|
-
"$ref": "#/components/RegionModal"
|
|
410
|
-
},
|
|
411
|
-
{
|
|
412
|
-
"$ref": "#/components/RegionPopover"
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
"$ref": "#/components/EmptyState"
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
"$ref": "#/components/ShoppingAssistant"
|
|
419
|
-
}
|
|
420
|
-
]
|
|
421
|
-
}
|
|
363
|
+
"$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
|
|
422
364
|
}
|
|
423
365
|
},
|
|
424
366
|
"readOnly": false,
|
|
@@ -152,65 +152,7 @@
|
|
|
152
152
|
"$componentTitle": "SEO"
|
|
153
153
|
},
|
|
154
154
|
"sections": {
|
|
155
|
-
"
|
|
156
|
-
"items": {
|
|
157
|
-
"anyOf": [
|
|
158
|
-
{
|
|
159
|
-
"$ref": "#/components/Search"
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
"$ref": "#/components/Navbar"
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
"$ref": "#/components/Alert"
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"$ref": "#/components/Footer"
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"$ref": "#/components/BannerText"
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
"$ref": "#/components/Hero"
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
"$ref": "#/components/Incentives"
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"$ref": "#/components/ProductShelf"
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"$ref": "#/components/ProductTiles"
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"$ref": "#/components/Newsletter"
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
"$ref": "#/components/Children"
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
"$ref": "#/components/BannerNewsletter"
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
"$ref": "#/components/CartSidebar"
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
"$ref": "#/components/RegionBar"
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
"$ref": "#/components/RegionModal"
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
"$ref": "#/components/RegionPopover"
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"$ref": "#/components/EmptyState"
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
"$ref": "#/components/ShoppingAssistant"
|
|
211
|
-
}
|
|
212
|
-
]
|
|
213
|
-
}
|
|
155
|
+
"$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
|
|
214
156
|
}
|
|
215
157
|
},
|
|
216
158
|
"readOnly": false,
|