@thorprovider/storefront 0.3.1 → 0.4.0-mvp.2
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/README.md +321 -152
- package/VENDOR.md +69 -0
- package/assets/openspec/config.yaml +38 -0
- package/assets/templates/AGENTS.md +76 -0
- package/assets/templates/app/app/[[...slug]]/page.tsx +54 -2
- package/assets/templates/app/app/[[...slug]]/renderer.tsx +13 -2
- package/assets/templates/app/app/globals.css +5 -8
- package/assets/templates/app/app/layout.tsx +17 -7
- package/assets/templates/app/app/robots.ts +19 -0
- package/assets/templates/app/app/sitemap.ts +71 -0
- package/assets/templates/app/lib/__STOREFRONT__/actions.ts +612 -0
- package/assets/templates/app/lib/__STOREFRONT__/cart-state.ts +66 -0
- package/assets/templates/app/lib/__STOREFRONT__/catalog.ts +50 -57
- package/assets/templates/app/lib/__STOREFRONT__/commerce.ts +679 -0
- package/assets/templates/app/lib/__STOREFRONT__/composition.ts +26 -0
- package/assets/templates/app/lib/__STOREFRONT__/handlers.core.ts +197 -0
- package/assets/templates/app/lib/__STOREFRONT__/handlers.ts +5 -36
- package/assets/templates/app/lib/__STOREFRONT__/icon-map.ts +27 -0
- package/assets/templates/app/lib/__STOREFRONT__/mappers.ts +13 -11
- package/assets/templates/app/lib/__STOREFRONT__/registry.tsx +264 -51
- package/assets/templates/app/lib/__STOREFRONT__/runtime.ts +6 -3
- package/assets/templates/app/lib/__STOREFRONT__/schema.ts +136 -0
- package/assets/templates/app/lib/__STOREFRONT__/section-observation.ts +182 -0
- package/assets/templates/app/lib/__STOREFRONT__/section-sources.ts +130 -0
- package/assets/templates/app/lib/__STOREFRONT__/session.core.ts +470 -0
- package/assets/templates/app/lib/__STOREFRONT__/session.ts +169 -0
- package/assets/templates/app/lib/__STOREFRONT__/shell/content.ts +120 -0
- package/assets/templates/app/lib/__STOREFRONT__/shell/props.ts +38 -0
- package/assets/templates/app/lib/__STOREFRONT__/spec/index.ts +129 -10
- package/assets/templates/app/lib/__STOREFRONT__/spec/page-root.ts +5 -1
- package/assets/templates/app/lib/__STOREFRONT__/spec/seo.ts +191 -0
- package/assets/templates/app/lib/__STOREFRONT__/state.core.ts +257 -0
- package/assets/templates/app/lib/__STOREFRONT__/state.ts +7 -31
- package/assets/templates/app/lib/__STOREFRONT__/store-context.ts +161 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/cta.client.tsx +25 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/cta.tsx +16 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/faq.client.tsx +24 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/faq.tsx +5 -18
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/index.ts +18 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/logoCloud.tsx +26 -14
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/pricing.tsx +36 -18
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/products.client.tsx +100 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/products.tsx +19 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.cta.ts +19 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.faq.ts +18 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.products.ts +39 -0
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/statistics.tsx +35 -14
- package/assets/templates/app/lib/__STOREFRONT__/views/sections/testimonials.tsx +31 -13
- package/assets/templates/app/lib/__STOREFRONT__/views/types.ts +5 -3
- package/assets/templates/features/checkout/handlers.ts +159 -0
- package/assets/templates/features/checkout/state.ts +61 -0
- package/assets/templates/features/customer-auth/handlers.ts +59 -0
- package/assets/templates/features/customer-auth/state.ts +45 -0
- package/assets/templates/features/recommendations/state.ts +11 -0
- package/assets/templates/views/account/content.ts +35 -0
- package/assets/templates/views/account/index.tsx +114 -0
- package/assets/templates/views/account/registry.tsx +439 -0
- package/assets/templates/views/account/schema.ts +53 -0
- package/assets/templates/views/cart/content.ts +11 -0
- package/assets/templates/views/cart/data.ts +23 -0
- package/assets/templates/views/cart/index.tsx +53 -0
- package/assets/templates/views/cart/props.ts +12 -0
- package/assets/templates/views/cart/registry.tsx +81 -0
- package/assets/templates/views/cart/schema.ts +52 -0
- package/assets/templates/views/category/assembly/assembly.json +29 -0
- package/assets/templates/views/category/assembly/index.skeleton.tsx +251 -0
- package/assets/templates/views/category/assembly/registry.skeleton.tsx +34 -0
- package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/binding.json +5 -0
- package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/catalog.part +4 -0
- package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/element.part +7 -0
- package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/registry.part +18 -0
- package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/catalog.part +5 -0
- package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/element.part +34 -0
- package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/registry.part +71 -0
- package/assets/templates/views/category/content.ts +30 -0
- package/assets/templates/views/category/data.ts +12 -0
- package/assets/templates/views/category/index.tsx +299 -0
- package/assets/templates/views/category/props.ts +23 -0
- package/assets/templates/views/category/registry.tsx +122 -0
- package/assets/templates/views/category/schema.ts +91 -0
- package/assets/templates/views/checkout/content.ts +105 -0
- package/assets/templates/views/checkout/data.ts +23 -0
- package/assets/templates/views/checkout/index.tsx +111 -0
- package/assets/templates/views/checkout/props.ts +49 -0
- package/assets/templates/views/checkout/registry.tsx +217 -0
- package/assets/templates/views/checkout/schema.ts +229 -0
- package/assets/templates/views/home/assembly/assembly.json +33 -0
- package/assets/templates/views/home/assembly/index.skeleton.tsx +90 -0
- package/assets/templates/views/home/assembly/registry.skeleton.tsx +25 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature1/binding.json +5 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature1/catalog.part +4 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature1/element.part +4 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature1/registry.part +11 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature2/binding.json +5 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature2/catalog.part +4 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature2/element.part +4 -0
- package/assets/templates/views/home/assembly/slots/benefits/Feature2/registry.part +10 -0
- package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/binding.json +5 -0
- package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/catalog.part +4 -0
- package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/element.part +5 -0
- package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/registry.part +16 -0
- package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/binding.json +5 -0
- package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/catalog.part +4 -0
- package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/element.part +5 -0
- package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/registry.part +26 -0
- package/assets/templates/views/home/content.ts +70 -0
- package/assets/templates/views/home/data.ts +24 -0
- package/assets/templates/views/home/index.tsx +57 -85
- package/assets/templates/views/home/props.ts +22 -0
- package/assets/templates/views/home/registry.tsx +38 -22
- package/assets/templates/views/home/schema.ts +93 -0
- package/assets/templates/views/product/content.ts +25 -0
- package/assets/templates/views/product/data.ts +50 -0
- package/assets/templates/views/product/index.tsx +148 -0
- package/assets/templates/views/product/props.ts +27 -0
- package/assets/templates/views/product/registry.tsx +103 -0
- package/assets/templates/views/product/schema.ts +121 -0
- package/assets/templates/views/static/content.ts +99 -0
- package/assets/templates/views/static/index.tsx +60 -0
- package/assets/templates/views/static/registry.tsx +66 -0
- package/assets/templates/views/static/schema.ts +45 -0
- package/bin/storefront.js +2424 -148
- package/examples/merchandising/category-led.json +37 -0
- package/examples/merchandising/collection-led.json +37 -0
- package/package.json +15 -9
- package/recipes/archetypes.json +28 -14
- package/recipes/catalog.json +400 -0
- package/recipes/catalog.mjs +128 -0
- package/recipes/catalog.schema.json +64 -0
- package/recipes/feature.schema.json +89 -0
- package/recipes/features.json +162 -0
- package/recipes/manifest.schema.json +69 -0
- package/recipes/operations.schema.json +43 -0
- package/recipes/recipe.schema.json +11 -2
- package/recipes/recipes.json +76 -19
- package/recipes/sections.json +34 -5
- package/recipes/validate.mjs +838 -32
- package/scripts/candidate.mjs +236 -0
- package/scripts/composers.mjs +160 -0
- package/scripts/env-file.mjs +86 -0
- package/scripts/file-classes.mjs +121 -0
- package/scripts/logical-controls.mjs +61 -0
- package/scripts/manifest.mjs +298 -0
- package/scripts/migrate-english-routes.mjs +276 -0
- package/scripts/operation-registry.mjs +256 -0
- package/scripts/operations.mjs +720 -0
- package/scripts/ownership-conflict.mjs +356 -0
- package/scripts/pinning.mjs +573 -0
- package/scripts/plan-apply.mjs +987 -0
- package/scripts/preflight.mjs +51 -0
- package/scripts/reconcile.mjs +549 -0
- package/scripts/render-templates.mjs +338 -68
- package/scripts/schema-validate.mjs +132 -0
- package/scripts/section-compat.mjs +300 -0
- package/scripts/section-config.mjs +253 -0
- package/scripts/section-operations.mjs +508 -0
- package/scripts/starter.mjs +17 -0
- package/scripts/sync-assets.mjs +22 -15
- package/scripts/theme/color.mjs +185 -0
- package/scripts/theme/css-theme.mjs +233 -0
- package/scripts/theme/fonts.mjs +123 -0
- package/scripts/theme/import-export.mjs +125 -0
- package/scripts/theme/preset.mjs +93 -0
- package/scripts/theme/theme-plan.mjs +292 -0
- package/scripts/theme/tokens.mjs +137 -0
- package/scripts/view-assembly.mjs +337 -0
- package/scripts/view-selection.mjs +211 -0
- package/skills/sf-feature/SKILL.md +80 -0
- package/skills/sf-setup/SKILL.md +79 -0
- package/skills/sf-theme-gen/SKILL.md +100 -30
- package/skills/sf-theme-gen/references/shadcn-theming.md +87 -0
- package/skills/{shadcn-theming/references/templates → sf-theme-gen/references}/theme-setup.md +15 -19
- package/skills/{shadcn-theming → sf-theme-gen}/references/theming-guide.md +6 -11
- package/skills/sf-view-gen/SKILL.md +146 -93
- package/skills/sf-view-gen/assets/recipes/archetypes.json +28 -14
- package/skills/sf-view-gen/assets/recipes/catalog.json +400 -0
- package/skills/sf-view-gen/assets/recipes/catalog.schema.json +64 -0
- package/skills/sf-view-gen/assets/recipes/features.json +162 -0
- package/skills/sf-view-gen/assets/recipes/recipes.json +76 -19
- package/skills/sf-view-gen/assets/recipes/sections.json +34 -5
- package/skills/sf-view-gen/assets/templates/views/sections/cta.client.tsx +25 -0
- package/skills/sf-view-gen/assets/templates/views/sections/cta.tsx +16 -0
- package/skills/sf-view-gen/assets/templates/views/sections/faq.client.tsx +13 -9
- package/skills/sf-view-gen/assets/templates/views/sections/faq.tsx +2 -7
- package/skills/sf-view-gen/assets/templates/views/sections/logoCloud.client.tsx +12 -8
- package/skills/sf-view-gen/assets/templates/views/sections/logoCloud.tsx +2 -7
- package/skills/sf-view-gen/assets/templates/views/sections/pricing.client.tsx +14 -10
- package/skills/sf-view-gen/assets/templates/views/sections/pricing.tsx +2 -9
- package/skills/sf-view-gen/assets/templates/views/sections/products.client.tsx +100 -0
- package/skills/sf-view-gen/assets/templates/views/sections/products.tsx +19 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.cta.ts +19 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.faq.ts +18 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.logoCloud.ts +19 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.pricing.ts +26 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.products.ts +39 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.statistics.ts +25 -0
- package/skills/sf-view-gen/assets/templates/views/sections/schema.testimonials.ts +23 -0
- package/skills/sf-view-gen/assets/templates/views/sections/statistics.client.tsx +16 -8
- package/skills/sf-view-gen/assets/templates/views/sections/statistics.tsx +2 -7
- package/skills/sf-view-gen/assets/templates/views/sections/testimonials.client.tsx +13 -9
- package/skills/sf-view-gen/assets/templates/views/sections/testimonials.tsx +2 -5
- package/skills/{json-render-core/SKILL.md → sf-view-gen/references/json-render-core.md} +4 -27
- package/skills/{json-render-next/SKILL.md → sf-view-gen/references/json-render-next.md} +5 -8
- package/skills/{json-render-react/SKILL.md → sf-view-gen/references/json-render-react.md} +3 -5
- package/skills/{json-render-shadcn/SKILL.md → sf-view-gen/references/json-render-shadcn.md} +3 -5
- package/skills/sf-view-gen/references/views.md +58 -33
- package/skills/sf-view-gen/scripts/catalog.mjs +128 -0
- package/skills/sf-view-gen/scripts/schema-validate.mjs +132 -0
- package/skills/sf-view-gen/scripts/validate.mjs +838 -32
- package/skills/storefront-workflow/SKILL.md +179 -0
- package/skills/{storefront-best-practices/reference/design.md → storefront-workflow/references/design-consistency.md} +13 -29
- package/CHANGELOG.md +0 -61
- package/commands/sf-add-view.md +0 -26
- package/commands/sf-theme.md +0 -20
- package/commands/sf-view.md +0 -25
- package/skills/building-storefronts/SKILL.md +0 -178
- package/skills/building-storefronts/references/frontend-integration.md +0 -229
- package/skills/json-render-remotion/SKILL.md +0 -111
- package/skills/json-render-solid/SKILL.md +0 -204
- package/skills/nextjs-shadcn/SKILL.md +0 -367
- package/skills/nextjs-shadcn/references/architecture.md +0 -499
- package/skills/nextjs-shadcn/references/project-setup.md +0 -162
- package/skills/nextjs-shadcn/references/shadcn-platform.md +0 -261
- package/skills/nextjs-shadcn/references/sidebar.md +0 -274
- package/skills/nextjs-shadcn/references/styling.md +0 -555
- package/skills/sf-view-gen/assets/templates/views/category/index.tsx +0 -86
- package/skills/sf-view-gen/assets/templates/views/category/registry.tsx +0 -48
- package/skills/sf-view-gen/assets/templates/views/checkout/index.tsx +0 -192
- package/skills/sf-view-gen/assets/templates/views/checkout/registry.tsx +0 -45
- package/skills/sf-view-gen/assets/templates/views/product/index.tsx +0 -122
- package/skills/sf-view-gen/assets/templates/views/product/registry.tsx +0 -49
- package/skills/sf-view-gen/assets/templates/views/user-panel/index.tsx +0 -168
- package/skills/sf-view-gen/assets/templates/views/user-panel/registry.tsx +0 -49
- package/skills/shadcn-component-discovery/SKILL.md +0 -273
- package/skills/shadcn-component-discovery/references/registries.md +0 -226
- package/skills/shadcn-theming/SKILL.md +0 -104
- package/skills/storefront-best-practices/SKILL.md +0 -421
- package/skills/storefront-best-practices/reference/components/breadcrumbs.md +0 -123
- package/skills/storefront-best-practices/reference/components/cart-popup.md +0 -189
- package/skills/storefront-best-practices/reference/components/country-selector.md +0 -298
- package/skills/storefront-best-practices/reference/components/footer.md +0 -112
- package/skills/storefront-best-practices/reference/components/hero.md +0 -241
- package/skills/storefront-best-practices/reference/components/megamenu.md +0 -239
- package/skills/storefront-best-practices/reference/components/navbar.md +0 -397
- package/skills/storefront-best-practices/reference/components/popups.md +0 -221
- package/skills/storefront-best-practices/reference/components/product-card.md +0 -125
- package/skills/storefront-best-practices/reference/components/product-reviews.md +0 -217
- package/skills/storefront-best-practices/reference/components/product-slider.md +0 -174
- package/skills/storefront-best-practices/reference/components/search.md +0 -101
- package/skills/storefront-best-practices/reference/connecting-to-backend.md +0 -391
- package/skills/storefront-best-practices/reference/features/promotions.md +0 -307
- package/skills/storefront-best-practices/reference/features/wishlist.md +0 -230
- package/skills/storefront-best-practices/reference/layouts/account.md +0 -380
- package/skills/storefront-best-practices/reference/layouts/cart.md +0 -316
- package/skills/storefront-best-practices/reference/layouts/checkout.md +0 -486
- package/skills/storefront-best-practices/reference/layouts/home-page.md +0 -264
- package/skills/storefront-best-practices/reference/layouts/order-confirmation.md +0 -231
- package/skills/storefront-best-practices/reference/layouts/product-details.md +0 -527
- package/skills/storefront-best-practices/reference/layouts/product-listing.md +0 -520
- package/skills/storefront-best-practices/reference/layouts/static-pages.md +0 -356
- package/skills/storefront-best-practices/reference/medusa.md +0 -307
- /package/skills/{storefront-best-practices/reference → storefront-workflow/references}/mobile-responsiveness.md +0 -0
- /package/skills/{storefront-best-practices/reference → storefront-workflow/references}/seo.md +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "category-led",
|
|
3
|
+
"title": "Category-led combined presentation plus freshness selection",
|
|
4
|
+
"intent": "Lead with a category-focused combined grid-and-carousel of the newest arrivals, keep category navigation visible, and cross-sell a related category below. Selection (category handle and ordering) is independent of the presentation variant.",
|
|
5
|
+
"sections": [
|
|
6
|
+
{ "id": "slot:hero", "type": "hero", "variant": "StorefrontHero1" },
|
|
7
|
+
{ "id": "slot:benefits", "type": "benefits", "variant": "Feature1" },
|
|
8
|
+
{ "id": "slot:categories", "type": "categories", "variant": "ProductCategory2" },
|
|
9
|
+
{
|
|
10
|
+
"id": "home-products-1",
|
|
11
|
+
"type": "products",
|
|
12
|
+
"variant": "ProductShowcase1",
|
|
13
|
+
"objective": "Showcase the newest arrivals in a category as a browsable carousel",
|
|
14
|
+
"destination": "/categories/repuestos",
|
|
15
|
+
"source": {
|
|
16
|
+
"kind": "products",
|
|
17
|
+
"query": { "categories": ["repuestos"], "sort": "newest", "pageSize": 12 }
|
|
18
|
+
},
|
|
19
|
+
"content": {
|
|
20
|
+
"heading": "Novedades en repuestos",
|
|
21
|
+
"description": "Lo último que llega a la categoría."
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "home-products-2",
|
|
26
|
+
"type": "products",
|
|
27
|
+
"variant": "ProductCard1",
|
|
28
|
+
"objective": "Cross-sell a related category below the carousel",
|
|
29
|
+
"destination": "/categories/accesorios",
|
|
30
|
+
"source": {
|
|
31
|
+
"kind": "products",
|
|
32
|
+
"query": { "categories": ["accesorios"], "sort": "featured", "pageSize": 4 }
|
|
33
|
+
},
|
|
34
|
+
"content": { "heading": "Accesorios recomendados" }
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "collection-led",
|
|
3
|
+
"title": "Collection-led grid plus campaign CTA",
|
|
4
|
+
"intent": "Lead the home with one curated collection as the primary merchandise grid, and reinforce it with a single campaign call to action. The selection is a collection handle, not a sales ranking.",
|
|
5
|
+
"sections": [
|
|
6
|
+
{ "id": "slot:hero", "type": "hero", "variant": "StorefrontHero1" },
|
|
7
|
+
{ "id": "slot:benefits", "type": "benefits", "variant": "Feature1" },
|
|
8
|
+
{
|
|
9
|
+
"id": "home-products-1",
|
|
10
|
+
"type": "products",
|
|
11
|
+
"variant": "ProductCard1",
|
|
12
|
+
"objective": "Move collection browsers into the featured collection",
|
|
13
|
+
"destination": "/collections/featured",
|
|
14
|
+
"source": {
|
|
15
|
+
"kind": "products",
|
|
16
|
+
"query": { "collections": ["featured"], "sort": "featured", "pageSize": 8 }
|
|
17
|
+
},
|
|
18
|
+
"content": {
|
|
19
|
+
"heading": "Destacados de la temporada",
|
|
20
|
+
"description": "Una selección curada de la colección destacada."
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "home-cta-1",
|
|
25
|
+
"type": "cta",
|
|
26
|
+
"objective": "Reinforce the campaign message with one clear action",
|
|
27
|
+
"destination": "/collections/featured",
|
|
28
|
+
"content": {
|
|
29
|
+
"badgeText": "Campaña",
|
|
30
|
+
"title": "Envío gratis esta semana",
|
|
31
|
+
"description": "En pedidos superiores al mínimo de la campaña.",
|
|
32
|
+
"primaryCta": { "label": "Ver la colección", "href": "/collections/featured" }
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{ "id": "slot:categories", "type": "categories", "variant": "ProductCategory2" }
|
|
36
|
+
]
|
|
37
|
+
}
|
package/package.json
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thorprovider/storefront",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Deterministic storefront scaffolder and installable OpenCode
|
|
3
|
+
"version": "0.4.0-mvp.2",
|
|
4
|
+
"description": "Deterministic storefront scaffolder and installable OpenCode skill suite for Thor Commerce (Next.js, @thorprovider/blocks, @thorprovider/adapters, Medusa)",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"bin":
|
|
6
|
+
"bin": {
|
|
7
|
+
"storefront": "bin/storefront.js"
|
|
8
|
+
},
|
|
7
9
|
"files": [
|
|
8
10
|
"assets",
|
|
9
11
|
"bin",
|
|
10
|
-
"
|
|
12
|
+
"examples",
|
|
11
13
|
"skills",
|
|
12
14
|
"recipes",
|
|
13
15
|
"scripts",
|
|
14
|
-
"README.md"
|
|
16
|
+
"README.md",
|
|
17
|
+
"VENDOR.md"
|
|
15
18
|
],
|
|
16
19
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
20
|
+
"node": ">=20.9.0"
|
|
18
21
|
},
|
|
19
22
|
"scripts": {
|
|
20
23
|
"sync-assets": "node ./scripts/sync-assets.mjs",
|
|
21
24
|
"check-assets": "node ./scripts/sync-assets.mjs --check",
|
|
22
25
|
"pretest": "node ./scripts/sync-assets.mjs --check",
|
|
23
|
-
"test": "vitest run --config vitest.config.ts"
|
|
26
|
+
"test": "vitest run --config vitest.config.ts",
|
|
27
|
+
"test:integration": "vitest run --config vitest.config.ts tests/scaffold-integration.test.ts tests/starter-integration.test.ts"
|
|
24
28
|
},
|
|
25
29
|
"publishConfig": {
|
|
26
30
|
"access": "public",
|
|
@@ -39,10 +43,12 @@
|
|
|
39
43
|
"scaffolding"
|
|
40
44
|
],
|
|
41
45
|
"dependencies": {
|
|
42
|
-
"@clack/prompts": "^1.8.1"
|
|
46
|
+
"@clack/prompts": "^1.8.1",
|
|
47
|
+
"@fission-ai/openspec": "1.11.0",
|
|
48
|
+
"semver": "^7.7.4"
|
|
43
49
|
},
|
|
44
50
|
"devDependencies": {
|
|
45
51
|
"vitest": "^3.2.4"
|
|
46
52
|
},
|
|
47
53
|
"license": "MIT"
|
|
48
|
-
}
|
|
54
|
+
}
|
package/recipes/archetypes.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "Archetype (intent) layer. Maps a slot to named intents so selection is by meaning, not by variant ordinal. Each intent resolves to a variant that MUST be allowed by the recipe for that slot.",
|
|
5
5
|
"slots": {
|
|
6
6
|
"home.hero": {
|
|
7
|
-
"default": "
|
|
7
|
+
"default": "compact",
|
|
8
8
|
"intents": {
|
|
9
9
|
"compact": {
|
|
10
10
|
"variant": "StorefrontHero1",
|
|
@@ -88,6 +88,15 @@
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
},
|
|
91
|
+
"cart.view": {
|
|
92
|
+
"default": "review",
|
|
93
|
+
"intents": {
|
|
94
|
+
"review": {
|
|
95
|
+
"variant": "ShoppingCart4",
|
|
96
|
+
"when": "A standalone cart review page: line editing plus backend-authoritative totals before checkout."
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
91
100
|
"category.filter": {
|
|
92
101
|
"default": "sidebar",
|
|
93
102
|
"intents": {
|
|
@@ -122,25 +131,30 @@
|
|
|
122
131
|
}
|
|
123
132
|
}
|
|
124
133
|
},
|
|
125
|
-
"
|
|
126
|
-
"default": "
|
|
134
|
+
"account.login": {
|
|
135
|
+
"default": "signIn",
|
|
127
136
|
"intents": {
|
|
128
|
-
"
|
|
129
|
-
"variant": "
|
|
130
|
-
"when": "A
|
|
137
|
+
"signIn": {
|
|
138
|
+
"variant": "LoginPage1",
|
|
139
|
+
"when": "A full sign-in page with email and password and a link to create an account."
|
|
131
140
|
}
|
|
132
141
|
}
|
|
133
142
|
},
|
|
134
|
-
"
|
|
135
|
-
"default": "
|
|
143
|
+
"account.register": {
|
|
144
|
+
"default": "signUp",
|
|
136
145
|
"intents": {
|
|
137
|
-
"
|
|
138
|
-
"variant": "
|
|
139
|
-
"when": "A
|
|
140
|
-
}
|
|
141
|
-
|
|
146
|
+
"signUp": {
|
|
147
|
+
"variant": "SignUpPage1",
|
|
148
|
+
"when": "A full registration page with name, email, and password and a link to sign in."
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"account.orders": {
|
|
153
|
+
"default": "viewOrders",
|
|
154
|
+
"intents": {
|
|
155
|
+
"viewOrders": {
|
|
142
156
|
"variant": "OrderHistory2",
|
|
143
|
-
"when": "
|
|
157
|
+
"when": "A signed-in shopper's order history with per-order totals and detail on demand."
|
|
144
158
|
}
|
|
145
159
|
}
|
|
146
160
|
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./catalog.schema.json",
|
|
3
|
+
"catalogVersion": 1,
|
|
4
|
+
"description": "Initial semantic executable catalog (E1 tasks 1.2-1.3), classified by source-shape inspection of the @thorprovider/blocks prop contracts and the view templates. Scope: every slot the curated MVP views (home, product, category, checkout, account) render by default, covering both the selectable archetype slots declared by recipes/archetypes.json and the nested default slots that have no archetype (category.productCard, checkout.confirmation) so no legacy default support is dropped. The account view (change: storefront-customer-auth) declares the login/register slots: LoginPage1/SignUpPage1 are executable while LoginPage2 is held for its divergent callback contract. A variant is `executable` only when the slot's canonical data shape can feed its block props without a prop bridge and without inventing data; every other non-default variant is `held` with the specific reason. The one executable non-default swap is home.benefits Feature1 -> Feature2 (identical item contract, no bridge). E2 task 6.1 declares the base listing slot category.filter CategoryFilter2 as the single controlled listing (dataShape `CatalogQuery & CatalogResults`, state controlled) with the search/filter controls contributed by the logical mounts category.search / category.filters (no second block). Source-shape compatibility is not end-to-end backend behavior proof: the render is executable, but the category.search.apply / category.filter.apply actions remain held under the capability catalog (owner: storefront-catalog-search-filters, E2) until a real runtime proof. The `capabilities` map declares those operational capabilities with their requirements and verification state; E1 declares the held category.filter.apply action, E2 adds the held category.search.apply action and the held category.price.range capability that gates the category-filters showPrice option; no capability is claimed verified.",
|
|
5
|
+
"slots": {
|
|
6
|
+
"home.hero": {
|
|
7
|
+
"default": "StorefrontHero1",
|
|
8
|
+
"variants": {
|
|
9
|
+
"StorefrontHero1": {
|
|
10
|
+
"status": "executable",
|
|
11
|
+
"block": "StorefrontHero",
|
|
12
|
+
"dataShape": "FeaturedProduct[]",
|
|
13
|
+
"events": ["addToCart", "buyNow", "selectColor"],
|
|
14
|
+
"state": "uncontrolled",
|
|
15
|
+
"requirements": ["heroProducts"]
|
|
16
|
+
},
|
|
17
|
+
"StorefrontHero2": {
|
|
18
|
+
"status": "held",
|
|
19
|
+
"reason": "block requires a product with reviews/trending/tag and emits a search event; the canonical FeaturedProduct shape carries rating/reviewCount but not trending/tag, and no verified prop bridge exists",
|
|
20
|
+
"block": "StorefrontHero",
|
|
21
|
+
"dataShape": "StorefrontHero2FeaturedProduct[]",
|
|
22
|
+
"events": ["search", "productClick"],
|
|
23
|
+
"state": "uncontrolled",
|
|
24
|
+
"requirements": ["heroProducts"]
|
|
25
|
+
},
|
|
26
|
+
"StorefrontHero5": {
|
|
27
|
+
"status": "held",
|
|
28
|
+
"reason": "featuredDeals[].description is absent from the canonical product shape and Department.count would require inventing counts; no truthful prop bridge can be derived from source",
|
|
29
|
+
"block": "StorefrontHero",
|
|
30
|
+
"dataShape": "FeaturedDeal[] & Department[]",
|
|
31
|
+
"events": ["departmentClick", "shopNow", "locateStores"],
|
|
32
|
+
"state": "uncontrolled",
|
|
33
|
+
"requirements": ["featuredDeals", "departments"]
|
|
34
|
+
},
|
|
35
|
+
"StorefrontHero6": {
|
|
36
|
+
"status": "held",
|
|
37
|
+
"reason": "block requires deals with discount/endTime and categories with a required count; the canonical shape supplies neither without invention and no verified prop bridge exists",
|
|
38
|
+
"block": "StorefrontHero",
|
|
39
|
+
"dataShape": "HeroDeal[] & HeroCategory[]",
|
|
40
|
+
"events": ["shopNow", "categoryClick"],
|
|
41
|
+
"state": "uncontrolled",
|
|
42
|
+
"requirements": ["deals", "categories"]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"home.benefits": {
|
|
47
|
+
"default": "Feature1",
|
|
48
|
+
"variants": {
|
|
49
|
+
"Feature1": {
|
|
50
|
+
"status": "executable",
|
|
51
|
+
"block": "Feature",
|
|
52
|
+
"dataShape": "BenefitsItem[]",
|
|
53
|
+
"events": ["ctaClick", "learnMore"],
|
|
54
|
+
"state": "uncontrolled",
|
|
55
|
+
"requirements": []
|
|
56
|
+
},
|
|
57
|
+
"Feature2": {
|
|
58
|
+
"status": "executable",
|
|
59
|
+
"block": "Feature",
|
|
60
|
+
"dataShape": "BenefitsItem[]",
|
|
61
|
+
"events": [],
|
|
62
|
+
"state": "uncontrolled",
|
|
63
|
+
"requirements": []
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"home.categories": {
|
|
68
|
+
"default": "ProductCategory2",
|
|
69
|
+
"variants": {
|
|
70
|
+
"ProductCategory2": {
|
|
71
|
+
"status": "executable",
|
|
72
|
+
"block": "CategoryCards",
|
|
73
|
+
"dataShape": "CategoryCard[]",
|
|
74
|
+
"events": ["browse"],
|
|
75
|
+
"state": "uncontrolled",
|
|
76
|
+
"requirements": ["categories"]
|
|
77
|
+
},
|
|
78
|
+
"ProductCategory1": {
|
|
79
|
+
"status": "held",
|
|
80
|
+
"reason": "block requires categories with a subtitle and a named icon, which the canonical CategoryCard shape does not supply; no verified prop bridge exists",
|
|
81
|
+
"block": "CategoryCards",
|
|
82
|
+
"dataShape": "ProductCategory1Category[]",
|
|
83
|
+
"events": [],
|
|
84
|
+
"state": "uncontrolled",
|
|
85
|
+
"requirements": ["categories"]
|
|
86
|
+
},
|
|
87
|
+
"ProductCategory4": {
|
|
88
|
+
"status": "held",
|
|
89
|
+
"reason": "block requires categories with title/icon/customers/products/avatarImages, which the canonical CategoryCard shape does not supply; no verified prop bridge exists",
|
|
90
|
+
"block": "CategoryCards",
|
|
91
|
+
"dataShape": "ProductCategory4Category[]",
|
|
92
|
+
"events": ["categoryClick"],
|
|
93
|
+
"state": "uncontrolled",
|
|
94
|
+
"requirements": ["categories"]
|
|
95
|
+
},
|
|
96
|
+
"ProductCategory5": {
|
|
97
|
+
"status": "held",
|
|
98
|
+
"reason": "block requires categories with subcategories and a required itemCount plus a search control, which the canonical CategoryCard shape does not supply; no verified prop bridge exists",
|
|
99
|
+
"block": "CategoryCards",
|
|
100
|
+
"dataShape": "ProductCategory5Category[]",
|
|
101
|
+
"events": ["browse", "viewAll"],
|
|
102
|
+
"state": "uncontrolled",
|
|
103
|
+
"requirements": ["categories"]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"product.overview": {
|
|
108
|
+
"default": "ProductOverview1",
|
|
109
|
+
"variants": {
|
|
110
|
+
"ProductOverview1": {
|
|
111
|
+
"status": "executable",
|
|
112
|
+
"block": "ProductOverview",
|
|
113
|
+
"dataShape": "ProductDetailProduct",
|
|
114
|
+
"events": ["selectVariant", "quantityChange", "addToCart", "toggleWishlist"],
|
|
115
|
+
"state": "controlled",
|
|
116
|
+
"requirements": ["selectedProduct", "selectedVariantId"]
|
|
117
|
+
},
|
|
118
|
+
"ProductOverview2": {
|
|
119
|
+
"status": "held",
|
|
120
|
+
"reason": "block requires a product with brand/sku/sizes/colors and wishlist events, a shape the canonical ProductDetailProduct does not supply; no verified prop bridge exists",
|
|
121
|
+
"block": "ProductOverview",
|
|
122
|
+
"dataShape": "ProductOverview2Product",
|
|
123
|
+
"events": ["addToCart", "toggleWishlist"],
|
|
124
|
+
"state": "uncontrolled",
|
|
125
|
+
"requirements": ["selectedProduct"]
|
|
126
|
+
},
|
|
127
|
+
"ProductOverview5": {
|
|
128
|
+
"status": "held",
|
|
129
|
+
"reason": "block requires specifications/features/mainImages/galleryImages/userReviews, a shape the canonical ProductDetailProduct does not supply; no verified prop bridge exists",
|
|
130
|
+
"block": "ProductOverview",
|
|
131
|
+
"dataShape": "ProductOverview5Product",
|
|
132
|
+
"events": ["addToCart", "toggleWishlist"],
|
|
133
|
+
"state": "uncontrolled",
|
|
134
|
+
"requirements": ["selectedProduct"]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"product.reviews": {
|
|
139
|
+
"default": "ReviewRating1",
|
|
140
|
+
"variants": {
|
|
141
|
+
"ReviewRating1": {
|
|
142
|
+
"status": "executable",
|
|
143
|
+
"block": "Reviews",
|
|
144
|
+
"dataShape": "Review[]",
|
|
145
|
+
"events": ["toggleReviewLike", "submitReview"],
|
|
146
|
+
"state": "uncontrolled",
|
|
147
|
+
"requirements": ["productReviews"]
|
|
148
|
+
},
|
|
149
|
+
"ReviewRating2": {
|
|
150
|
+
"status": "held",
|
|
151
|
+
"reason": "block requires an aggregate averageRating/ratingDistribution and carousel controls the canonical Review[] shape does not supply; no verified prop bridge exists",
|
|
152
|
+
"block": "Reviews",
|
|
153
|
+
"dataShape": "Review[] & RatingSummary",
|
|
154
|
+
"events": ["like", "comment"],
|
|
155
|
+
"state": "uncontrolled",
|
|
156
|
+
"requirements": ["productReviews"]
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"product.breadcrumb": {
|
|
161
|
+
"default": "Breadcrumb",
|
|
162
|
+
"variants": {
|
|
163
|
+
"Breadcrumb": {
|
|
164
|
+
"status": "executable",
|
|
165
|
+
"block": "Breadcrumb",
|
|
166
|
+
"dataShape": "BreadcrumbItemData[]",
|
|
167
|
+
"events": [],
|
|
168
|
+
"state": "uncontrolled",
|
|
169
|
+
"requirements": ["productBreadcrumb"]
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"cart.view": {
|
|
174
|
+
"default": "ShoppingCart4",
|
|
175
|
+
"variants": {
|
|
176
|
+
"ShoppingCart4": {
|
|
177
|
+
"status": "executable",
|
|
178
|
+
"block": "ShoppingCart4",
|
|
179
|
+
"dataShape": "CartLineState[] & CartTotalsState",
|
|
180
|
+
"events": ["refreshCart", "updateQuantity", "removeFromCart", "checkout", "continueShopping"],
|
|
181
|
+
"state": "controlled",
|
|
182
|
+
"requirements": ["cart", "cartTotals"]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"category.filter": {
|
|
187
|
+
"default": "CategoryFilter2",
|
|
188
|
+
"variants": {
|
|
189
|
+
"CategoryFilter2": {
|
|
190
|
+
"status": "executable",
|
|
191
|
+
"block": "CategoryFilter",
|
|
192
|
+
"dataShape": "CatalogQuery & CatalogResults",
|
|
193
|
+
"events": [
|
|
194
|
+
"productClick",
|
|
195
|
+
"pageChange",
|
|
196
|
+
"pageSizeChange",
|
|
197
|
+
"sortChange",
|
|
198
|
+
"filterChange",
|
|
199
|
+
"searchChange",
|
|
200
|
+
"clearFilters",
|
|
201
|
+
"repair",
|
|
202
|
+
"retry",
|
|
203
|
+
"removeFilter"
|
|
204
|
+
],
|
|
205
|
+
"state": "controlled",
|
|
206
|
+
"requirements": ["categoryProducts", "categoryQuery", "facetSupport"]
|
|
207
|
+
},
|
|
208
|
+
"CategoryFilter1": {
|
|
209
|
+
"status": "held",
|
|
210
|
+
"reason": "block requires categories/priceRanges/sortOptions with counts the canonical CardProduct[] listing does not supply; no verified prop bridge exists",
|
|
211
|
+
"block": "CategoryFilter",
|
|
212
|
+
"dataShape": "CategoryFilter1Filters",
|
|
213
|
+
"events": ["filterChange"],
|
|
214
|
+
"state": "uncontrolled",
|
|
215
|
+
"requirements": ["categoryProducts"]
|
|
216
|
+
},
|
|
217
|
+
"CategoryFilter4": {
|
|
218
|
+
"status": "held",
|
|
219
|
+
"reason": "block requires an advanced facets contract (modelTypes/rangeBands/frameSizes/colourways/features) the canonical listing does not supply; no verified prop bridge exists",
|
|
220
|
+
"block": "CategoryFilter",
|
|
221
|
+
"dataShape": "CategoryFilter4Facets",
|
|
222
|
+
"events": ["filterChange"],
|
|
223
|
+
"state": "uncontrolled",
|
|
224
|
+
"requirements": ["categoryProducts"]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"category.productCard": {
|
|
229
|
+
"default": "ProductCard1",
|
|
230
|
+
"variants": {
|
|
231
|
+
"ProductCard1": {
|
|
232
|
+
"status": "executable",
|
|
233
|
+
"block": "ProductCard",
|
|
234
|
+
"dataShape": "CardProduct[]",
|
|
235
|
+
"events": ["addToCart", "openProduct"],
|
|
236
|
+
"state": "uncontrolled",
|
|
237
|
+
"requirements": ["categoryProducts"]
|
|
238
|
+
},
|
|
239
|
+
"ProductCard2": {
|
|
240
|
+
"status": "held",
|
|
241
|
+
"reason": "block requires a product with a required rating, a shape the canonical CardProduct listing does not supply; no verified prop bridge exists",
|
|
242
|
+
"block": "ProductCard",
|
|
243
|
+
"dataShape": "ProductCard2Product[]",
|
|
244
|
+
"events": [],
|
|
245
|
+
"state": "uncontrolled",
|
|
246
|
+
"requirements": ["categoryProducts"]
|
|
247
|
+
},
|
|
248
|
+
"ProductCard3": {
|
|
249
|
+
"status": "held",
|
|
250
|
+
"reason": "block requires a product with subtitle/originalPrice/reviewCount/discountPercentage and a badge, a shape the canonical CardProduct listing does not supply; no verified prop bridge exists",
|
|
251
|
+
"block": "ProductCard",
|
|
252
|
+
"dataShape": "ProductCard3Product[]",
|
|
253
|
+
"events": ["toggleWishlist", "viewSimilar", "productClick"],
|
|
254
|
+
"state": "controlled",
|
|
255
|
+
"requirements": ["categoryProducts"]
|
|
256
|
+
},
|
|
257
|
+
"ProductCard5": {
|
|
258
|
+
"status": "held",
|
|
259
|
+
"reason": "block requires a product with name/category/stock/specifications/brand, a shape the canonical CardProduct listing does not supply; no verified prop bridge exists",
|
|
260
|
+
"block": "ProductCard",
|
|
261
|
+
"dataShape": "ProductCard5Product[]",
|
|
262
|
+
"events": ["toggleWishlist", "addToCart", "quickView", "compare", "export"],
|
|
263
|
+
"state": "controlled",
|
|
264
|
+
"requirements": ["categoryProducts"]
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
"checkout.checkout": {
|
|
269
|
+
"default": "CheckoutForm1",
|
|
270
|
+
"variants": {
|
|
271
|
+
"CheckoutForm1": {
|
|
272
|
+
"status": "executable",
|
|
273
|
+
"block": "Checkout",
|
|
274
|
+
"dataShape": "CheckoutForm1FormData",
|
|
275
|
+
"events": ["retryTotals", "selectShippingOption", "applyPromo", "submit"],
|
|
276
|
+
"state": "controlled",
|
|
277
|
+
"requirements": ["checkoutCountries", "checkoutPaymentMethods"]
|
|
278
|
+
},
|
|
279
|
+
"CheckoutForm2": {
|
|
280
|
+
"status": "held",
|
|
281
|
+
"reason": "unproven checkout variant: E1 keeps only the default CheckoutForm1, whose behavior is unchanged; no verified prop bridge exists",
|
|
282
|
+
"block": "Checkout",
|
|
283
|
+
"dataShape": "CheckoutForm2Data",
|
|
284
|
+
"events": ["submit"],
|
|
285
|
+
"state": "controlled",
|
|
286
|
+
"requirements": ["checkoutCountries", "checkoutPaymentMethods"]
|
|
287
|
+
},
|
|
288
|
+
"CheckoutForm3": {
|
|
289
|
+
"status": "held",
|
|
290
|
+
"reason": "unproven checkout variant: E1 keeps only the default CheckoutForm1, whose behavior is unchanged; no verified prop bridge exists",
|
|
291
|
+
"block": "Checkout",
|
|
292
|
+
"dataShape": "CheckoutForm3FormData",
|
|
293
|
+
"events": ["submit"],
|
|
294
|
+
"state": "controlled",
|
|
295
|
+
"requirements": ["checkoutCountries", "checkoutPaymentMethods"]
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
"checkout.confirmation": {
|
|
300
|
+
"default": "CheckoutConfirmation",
|
|
301
|
+
"variants": {
|
|
302
|
+
"CheckoutConfirmation": {
|
|
303
|
+
"status": "executable",
|
|
304
|
+
"block": "CheckoutConfirmation",
|
|
305
|
+
"dataShape": "Receipt",
|
|
306
|
+
"events": ["continueShopping"],
|
|
307
|
+
"state": "uncontrolled",
|
|
308
|
+
"requirements": ["lastReceipt"]
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"account.login": {
|
|
313
|
+
"default": "LoginPage1",
|
|
314
|
+
"variants": {
|
|
315
|
+
"LoginPage1": {
|
|
316
|
+
"status": "executable",
|
|
317
|
+
"block": "LoginPage1",
|
|
318
|
+
"dataShape": "LoginPage1FormData & AccountAuthResult",
|
|
319
|
+
"events": ["submit", "createAccount"],
|
|
320
|
+
"state": "controlled",
|
|
321
|
+
"requirements": ["accountCustomer", "accountAuthenticated"]
|
|
322
|
+
},
|
|
323
|
+
"LoginPage2": {
|
|
324
|
+
"status": "held",
|
|
325
|
+
"reason": "block's onSubmit takes positional (email, password) with no remember-me field and renders a 2-column social grid; no verified prop bridge from the account element contract exists",
|
|
326
|
+
"block": "LoginPage2",
|
|
327
|
+
"dataShape": "LoginPage2Credentials & AccountAuthResult",
|
|
328
|
+
"events": ["submit", "forgotPassword", "signUp"],
|
|
329
|
+
"state": "controlled",
|
|
330
|
+
"requirements": ["accountCustomer", "accountAuthenticated"]
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
"account.register": {
|
|
335
|
+
"default": "SignUpPage1",
|
|
336
|
+
"variants": {
|
|
337
|
+
"SignUpPage1": {
|
|
338
|
+
"status": "executable",
|
|
339
|
+
"block": "SignUpPage1",
|
|
340
|
+
"dataShape": "SignUpPage1Data & AccountAuthResult",
|
|
341
|
+
"events": ["submit", "signIn"],
|
|
342
|
+
"state": "controlled",
|
|
343
|
+
"requirements": ["accountCustomer", "accountAuthenticated"]
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
"account.orders": {
|
|
348
|
+
"default": "OrderHistory2",
|
|
349
|
+
"variants": {
|
|
350
|
+
"OrderHistory2": {
|
|
351
|
+
"status": "executable",
|
|
352
|
+
"block": "OrderHistory2",
|
|
353
|
+
"dataShape": "AccountOrderView[] & OrderHistory2Labels",
|
|
354
|
+
"events": ["viewDetails"],
|
|
355
|
+
"state": "controlled",
|
|
356
|
+
"requirements": ["accountCustomer", "accountAuthenticated"]
|
|
357
|
+
},
|
|
358
|
+
"OrderHistory1": {
|
|
359
|
+
"status": "held",
|
|
360
|
+
"reason": "block models one row per order item (an item-row list), the wrong shape for an order-level history; the canonical order list cannot feed it without inventing an aggregate row",
|
|
361
|
+
"block": "OrderHistory1",
|
|
362
|
+
"dataShape": "OrderHistory1Order[]",
|
|
363
|
+
"events": [],
|
|
364
|
+
"state": "controlled",
|
|
365
|
+
"requirements": ["accountCustomer", "accountAuthenticated"]
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"category.breadcrumb": {
|
|
370
|
+
"default": "Breadcrumb",
|
|
371
|
+
"variants": {
|
|
372
|
+
"Breadcrumb": {
|
|
373
|
+
"status": "executable",
|
|
374
|
+
"block": "Breadcrumb",
|
|
375
|
+
"dataShape": "BreadcrumbItemData[]",
|
|
376
|
+
"events": [],
|
|
377
|
+
"state": "uncontrolled",
|
|
378
|
+
"requirements": ["categoryBreadcrumb"]
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
"capabilities": {
|
|
384
|
+
"category.search.apply": {
|
|
385
|
+
"requirements": ["adapter.getCatalogProducts(query).text"],
|
|
386
|
+
"verification": "unverified",
|
|
387
|
+
"owner": "storefront-catalog-search-filters"
|
|
388
|
+
},
|
|
389
|
+
"category.filter.apply": {
|
|
390
|
+
"requirements": ["adapter.getProducts(query)"],
|
|
391
|
+
"verification": "unverified",
|
|
392
|
+
"owner": "storefront-catalog-search-filters"
|
|
393
|
+
},
|
|
394
|
+
"category.price.range": {
|
|
395
|
+
"requirements": ["adapter.getAvailableFilters(query).priceRange"],
|
|
396
|
+
"verification": "unverified",
|
|
397
|
+
"owner": "storefront-catalog-search-filters"
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|