@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.
Files changed (263) hide show
  1. package/README.md +321 -152
  2. package/VENDOR.md +69 -0
  3. package/assets/openspec/config.yaml +38 -0
  4. package/assets/templates/AGENTS.md +76 -0
  5. package/assets/templates/app/app/[[...slug]]/page.tsx +54 -2
  6. package/assets/templates/app/app/[[...slug]]/renderer.tsx +13 -2
  7. package/assets/templates/app/app/globals.css +5 -8
  8. package/assets/templates/app/app/layout.tsx +17 -7
  9. package/assets/templates/app/app/robots.ts +19 -0
  10. package/assets/templates/app/app/sitemap.ts +71 -0
  11. package/assets/templates/app/lib/__STOREFRONT__/actions.ts +612 -0
  12. package/assets/templates/app/lib/__STOREFRONT__/cart-state.ts +66 -0
  13. package/assets/templates/app/lib/__STOREFRONT__/catalog.ts +50 -57
  14. package/assets/templates/app/lib/__STOREFRONT__/commerce.ts +679 -0
  15. package/assets/templates/app/lib/__STOREFRONT__/composition.ts +26 -0
  16. package/assets/templates/app/lib/__STOREFRONT__/handlers.core.ts +197 -0
  17. package/assets/templates/app/lib/__STOREFRONT__/handlers.ts +5 -36
  18. package/assets/templates/app/lib/__STOREFRONT__/icon-map.ts +27 -0
  19. package/assets/templates/app/lib/__STOREFRONT__/mappers.ts +13 -11
  20. package/assets/templates/app/lib/__STOREFRONT__/registry.tsx +264 -51
  21. package/assets/templates/app/lib/__STOREFRONT__/runtime.ts +6 -3
  22. package/assets/templates/app/lib/__STOREFRONT__/schema.ts +136 -0
  23. package/assets/templates/app/lib/__STOREFRONT__/section-observation.ts +182 -0
  24. package/assets/templates/app/lib/__STOREFRONT__/section-sources.ts +130 -0
  25. package/assets/templates/app/lib/__STOREFRONT__/session.core.ts +470 -0
  26. package/assets/templates/app/lib/__STOREFRONT__/session.ts +169 -0
  27. package/assets/templates/app/lib/__STOREFRONT__/shell/content.ts +120 -0
  28. package/assets/templates/app/lib/__STOREFRONT__/shell/props.ts +38 -0
  29. package/assets/templates/app/lib/__STOREFRONT__/spec/index.ts +129 -10
  30. package/assets/templates/app/lib/__STOREFRONT__/spec/page-root.ts +5 -1
  31. package/assets/templates/app/lib/__STOREFRONT__/spec/seo.ts +191 -0
  32. package/assets/templates/app/lib/__STOREFRONT__/state.core.ts +257 -0
  33. package/assets/templates/app/lib/__STOREFRONT__/state.ts +7 -31
  34. package/assets/templates/app/lib/__STOREFRONT__/store-context.ts +161 -0
  35. package/assets/templates/app/lib/__STOREFRONT__/views/sections/cta.client.tsx +25 -0
  36. package/assets/templates/app/lib/__STOREFRONT__/views/sections/cta.tsx +16 -0
  37. package/assets/templates/app/lib/__STOREFRONT__/views/sections/faq.client.tsx +24 -0
  38. package/assets/templates/app/lib/__STOREFRONT__/views/sections/faq.tsx +5 -18
  39. package/assets/templates/app/lib/__STOREFRONT__/views/sections/index.ts +18 -0
  40. package/assets/templates/app/lib/__STOREFRONT__/views/sections/logoCloud.tsx +26 -14
  41. package/assets/templates/app/lib/__STOREFRONT__/views/sections/pricing.tsx +36 -18
  42. package/assets/templates/app/lib/__STOREFRONT__/views/sections/products.client.tsx +100 -0
  43. package/assets/templates/app/lib/__STOREFRONT__/views/sections/products.tsx +19 -0
  44. package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.cta.ts +19 -0
  45. package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.faq.ts +18 -0
  46. package/assets/templates/app/lib/__STOREFRONT__/views/sections/schema.products.ts +39 -0
  47. package/assets/templates/app/lib/__STOREFRONT__/views/sections/statistics.tsx +35 -14
  48. package/assets/templates/app/lib/__STOREFRONT__/views/sections/testimonials.tsx +31 -13
  49. package/assets/templates/app/lib/__STOREFRONT__/views/types.ts +5 -3
  50. package/assets/templates/features/checkout/handlers.ts +159 -0
  51. package/assets/templates/features/checkout/state.ts +61 -0
  52. package/assets/templates/features/customer-auth/handlers.ts +59 -0
  53. package/assets/templates/features/customer-auth/state.ts +45 -0
  54. package/assets/templates/features/recommendations/state.ts +11 -0
  55. package/assets/templates/views/account/content.ts +35 -0
  56. package/assets/templates/views/account/index.tsx +114 -0
  57. package/assets/templates/views/account/registry.tsx +439 -0
  58. package/assets/templates/views/account/schema.ts +53 -0
  59. package/assets/templates/views/cart/content.ts +11 -0
  60. package/assets/templates/views/cart/data.ts +23 -0
  61. package/assets/templates/views/cart/index.tsx +53 -0
  62. package/assets/templates/views/cart/props.ts +12 -0
  63. package/assets/templates/views/cart/registry.tsx +81 -0
  64. package/assets/templates/views/cart/schema.ts +52 -0
  65. package/assets/templates/views/category/assembly/assembly.json +29 -0
  66. package/assets/templates/views/category/assembly/index.skeleton.tsx +251 -0
  67. package/assets/templates/views/category/assembly/registry.skeleton.tsx +34 -0
  68. package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/binding.json +5 -0
  69. package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/catalog.part +4 -0
  70. package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/element.part +7 -0
  71. package/assets/templates/views/category/assembly/slots/breadcrumb/Breadcrumb/registry.part +18 -0
  72. package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/catalog.part +5 -0
  73. package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/element.part +34 -0
  74. package/assets/templates/views/category/assembly/slots/filter/CategoryFilter2/registry.part +71 -0
  75. package/assets/templates/views/category/content.ts +30 -0
  76. package/assets/templates/views/category/data.ts +12 -0
  77. package/assets/templates/views/category/index.tsx +299 -0
  78. package/assets/templates/views/category/props.ts +23 -0
  79. package/assets/templates/views/category/registry.tsx +122 -0
  80. package/assets/templates/views/category/schema.ts +91 -0
  81. package/assets/templates/views/checkout/content.ts +105 -0
  82. package/assets/templates/views/checkout/data.ts +23 -0
  83. package/assets/templates/views/checkout/index.tsx +111 -0
  84. package/assets/templates/views/checkout/props.ts +49 -0
  85. package/assets/templates/views/checkout/registry.tsx +217 -0
  86. package/assets/templates/views/checkout/schema.ts +229 -0
  87. package/assets/templates/views/home/assembly/assembly.json +33 -0
  88. package/assets/templates/views/home/assembly/index.skeleton.tsx +90 -0
  89. package/assets/templates/views/home/assembly/registry.skeleton.tsx +25 -0
  90. package/assets/templates/views/home/assembly/slots/benefits/Feature1/binding.json +5 -0
  91. package/assets/templates/views/home/assembly/slots/benefits/Feature1/catalog.part +4 -0
  92. package/assets/templates/views/home/assembly/slots/benefits/Feature1/element.part +4 -0
  93. package/assets/templates/views/home/assembly/slots/benefits/Feature1/registry.part +11 -0
  94. package/assets/templates/views/home/assembly/slots/benefits/Feature2/binding.json +5 -0
  95. package/assets/templates/views/home/assembly/slots/benefits/Feature2/catalog.part +4 -0
  96. package/assets/templates/views/home/assembly/slots/benefits/Feature2/element.part +4 -0
  97. package/assets/templates/views/home/assembly/slots/benefits/Feature2/registry.part +10 -0
  98. package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/binding.json +5 -0
  99. package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/catalog.part +4 -0
  100. package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/element.part +5 -0
  101. package/assets/templates/views/home/assembly/slots/categories/ProductCategory2/registry.part +16 -0
  102. package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/binding.json +5 -0
  103. package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/catalog.part +4 -0
  104. package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/element.part +5 -0
  105. package/assets/templates/views/home/assembly/slots/hero/StorefrontHero1/registry.part +26 -0
  106. package/assets/templates/views/home/content.ts +70 -0
  107. package/assets/templates/views/home/data.ts +24 -0
  108. package/assets/templates/views/home/index.tsx +57 -85
  109. package/assets/templates/views/home/props.ts +22 -0
  110. package/assets/templates/views/home/registry.tsx +38 -22
  111. package/assets/templates/views/home/schema.ts +93 -0
  112. package/assets/templates/views/product/content.ts +25 -0
  113. package/assets/templates/views/product/data.ts +50 -0
  114. package/assets/templates/views/product/index.tsx +148 -0
  115. package/assets/templates/views/product/props.ts +27 -0
  116. package/assets/templates/views/product/registry.tsx +103 -0
  117. package/assets/templates/views/product/schema.ts +121 -0
  118. package/assets/templates/views/static/content.ts +99 -0
  119. package/assets/templates/views/static/index.tsx +60 -0
  120. package/assets/templates/views/static/registry.tsx +66 -0
  121. package/assets/templates/views/static/schema.ts +45 -0
  122. package/bin/storefront.js +2424 -148
  123. package/examples/merchandising/category-led.json +37 -0
  124. package/examples/merchandising/collection-led.json +37 -0
  125. package/package.json +15 -9
  126. package/recipes/archetypes.json +28 -14
  127. package/recipes/catalog.json +400 -0
  128. package/recipes/catalog.mjs +128 -0
  129. package/recipes/catalog.schema.json +64 -0
  130. package/recipes/feature.schema.json +89 -0
  131. package/recipes/features.json +162 -0
  132. package/recipes/manifest.schema.json +69 -0
  133. package/recipes/operations.schema.json +43 -0
  134. package/recipes/recipe.schema.json +11 -2
  135. package/recipes/recipes.json +76 -19
  136. package/recipes/sections.json +34 -5
  137. package/recipes/validate.mjs +838 -32
  138. package/scripts/candidate.mjs +236 -0
  139. package/scripts/composers.mjs +160 -0
  140. package/scripts/env-file.mjs +86 -0
  141. package/scripts/file-classes.mjs +121 -0
  142. package/scripts/logical-controls.mjs +61 -0
  143. package/scripts/manifest.mjs +298 -0
  144. package/scripts/migrate-english-routes.mjs +276 -0
  145. package/scripts/operation-registry.mjs +256 -0
  146. package/scripts/operations.mjs +720 -0
  147. package/scripts/ownership-conflict.mjs +356 -0
  148. package/scripts/pinning.mjs +573 -0
  149. package/scripts/plan-apply.mjs +987 -0
  150. package/scripts/preflight.mjs +51 -0
  151. package/scripts/reconcile.mjs +549 -0
  152. package/scripts/render-templates.mjs +338 -68
  153. package/scripts/schema-validate.mjs +132 -0
  154. package/scripts/section-compat.mjs +300 -0
  155. package/scripts/section-config.mjs +253 -0
  156. package/scripts/section-operations.mjs +508 -0
  157. package/scripts/starter.mjs +17 -0
  158. package/scripts/sync-assets.mjs +22 -15
  159. package/scripts/theme/color.mjs +185 -0
  160. package/scripts/theme/css-theme.mjs +233 -0
  161. package/scripts/theme/fonts.mjs +123 -0
  162. package/scripts/theme/import-export.mjs +125 -0
  163. package/scripts/theme/preset.mjs +93 -0
  164. package/scripts/theme/theme-plan.mjs +292 -0
  165. package/scripts/theme/tokens.mjs +137 -0
  166. package/scripts/view-assembly.mjs +337 -0
  167. package/scripts/view-selection.mjs +211 -0
  168. package/skills/sf-feature/SKILL.md +80 -0
  169. package/skills/sf-setup/SKILL.md +79 -0
  170. package/skills/sf-theme-gen/SKILL.md +100 -30
  171. package/skills/sf-theme-gen/references/shadcn-theming.md +87 -0
  172. package/skills/{shadcn-theming/references/templates → sf-theme-gen/references}/theme-setup.md +15 -19
  173. package/skills/{shadcn-theming → sf-theme-gen}/references/theming-guide.md +6 -11
  174. package/skills/sf-view-gen/SKILL.md +146 -93
  175. package/skills/sf-view-gen/assets/recipes/archetypes.json +28 -14
  176. package/skills/sf-view-gen/assets/recipes/catalog.json +400 -0
  177. package/skills/sf-view-gen/assets/recipes/catalog.schema.json +64 -0
  178. package/skills/sf-view-gen/assets/recipes/features.json +162 -0
  179. package/skills/sf-view-gen/assets/recipes/recipes.json +76 -19
  180. package/skills/sf-view-gen/assets/recipes/sections.json +34 -5
  181. package/skills/sf-view-gen/assets/templates/views/sections/cta.client.tsx +25 -0
  182. package/skills/sf-view-gen/assets/templates/views/sections/cta.tsx +16 -0
  183. package/skills/sf-view-gen/assets/templates/views/sections/faq.client.tsx +13 -9
  184. package/skills/sf-view-gen/assets/templates/views/sections/faq.tsx +2 -7
  185. package/skills/sf-view-gen/assets/templates/views/sections/logoCloud.client.tsx +12 -8
  186. package/skills/sf-view-gen/assets/templates/views/sections/logoCloud.tsx +2 -7
  187. package/skills/sf-view-gen/assets/templates/views/sections/pricing.client.tsx +14 -10
  188. package/skills/sf-view-gen/assets/templates/views/sections/pricing.tsx +2 -9
  189. package/skills/sf-view-gen/assets/templates/views/sections/products.client.tsx +100 -0
  190. package/skills/sf-view-gen/assets/templates/views/sections/products.tsx +19 -0
  191. package/skills/sf-view-gen/assets/templates/views/sections/schema.cta.ts +19 -0
  192. package/skills/sf-view-gen/assets/templates/views/sections/schema.faq.ts +18 -0
  193. package/skills/sf-view-gen/assets/templates/views/sections/schema.logoCloud.ts +19 -0
  194. package/skills/sf-view-gen/assets/templates/views/sections/schema.pricing.ts +26 -0
  195. package/skills/sf-view-gen/assets/templates/views/sections/schema.products.ts +39 -0
  196. package/skills/sf-view-gen/assets/templates/views/sections/schema.statistics.ts +25 -0
  197. package/skills/sf-view-gen/assets/templates/views/sections/schema.testimonials.ts +23 -0
  198. package/skills/sf-view-gen/assets/templates/views/sections/statistics.client.tsx +16 -8
  199. package/skills/sf-view-gen/assets/templates/views/sections/statistics.tsx +2 -7
  200. package/skills/sf-view-gen/assets/templates/views/sections/testimonials.client.tsx +13 -9
  201. package/skills/sf-view-gen/assets/templates/views/sections/testimonials.tsx +2 -5
  202. package/skills/{json-render-core/SKILL.md → sf-view-gen/references/json-render-core.md} +4 -27
  203. package/skills/{json-render-next/SKILL.md → sf-view-gen/references/json-render-next.md} +5 -8
  204. package/skills/{json-render-react/SKILL.md → sf-view-gen/references/json-render-react.md} +3 -5
  205. package/skills/{json-render-shadcn/SKILL.md → sf-view-gen/references/json-render-shadcn.md} +3 -5
  206. package/skills/sf-view-gen/references/views.md +58 -33
  207. package/skills/sf-view-gen/scripts/catalog.mjs +128 -0
  208. package/skills/sf-view-gen/scripts/schema-validate.mjs +132 -0
  209. package/skills/sf-view-gen/scripts/validate.mjs +838 -32
  210. package/skills/storefront-workflow/SKILL.md +179 -0
  211. package/skills/{storefront-best-practices/reference/design.md → storefront-workflow/references/design-consistency.md} +13 -29
  212. package/CHANGELOG.md +0 -61
  213. package/commands/sf-add-view.md +0 -26
  214. package/commands/sf-theme.md +0 -20
  215. package/commands/sf-view.md +0 -25
  216. package/skills/building-storefronts/SKILL.md +0 -178
  217. package/skills/building-storefronts/references/frontend-integration.md +0 -229
  218. package/skills/json-render-remotion/SKILL.md +0 -111
  219. package/skills/json-render-solid/SKILL.md +0 -204
  220. package/skills/nextjs-shadcn/SKILL.md +0 -367
  221. package/skills/nextjs-shadcn/references/architecture.md +0 -499
  222. package/skills/nextjs-shadcn/references/project-setup.md +0 -162
  223. package/skills/nextjs-shadcn/references/shadcn-platform.md +0 -261
  224. package/skills/nextjs-shadcn/references/sidebar.md +0 -274
  225. package/skills/nextjs-shadcn/references/styling.md +0 -555
  226. package/skills/sf-view-gen/assets/templates/views/category/index.tsx +0 -86
  227. package/skills/sf-view-gen/assets/templates/views/category/registry.tsx +0 -48
  228. package/skills/sf-view-gen/assets/templates/views/checkout/index.tsx +0 -192
  229. package/skills/sf-view-gen/assets/templates/views/checkout/registry.tsx +0 -45
  230. package/skills/sf-view-gen/assets/templates/views/product/index.tsx +0 -122
  231. package/skills/sf-view-gen/assets/templates/views/product/registry.tsx +0 -49
  232. package/skills/sf-view-gen/assets/templates/views/user-panel/index.tsx +0 -168
  233. package/skills/sf-view-gen/assets/templates/views/user-panel/registry.tsx +0 -49
  234. package/skills/shadcn-component-discovery/SKILL.md +0 -273
  235. package/skills/shadcn-component-discovery/references/registries.md +0 -226
  236. package/skills/shadcn-theming/SKILL.md +0 -104
  237. package/skills/storefront-best-practices/SKILL.md +0 -421
  238. package/skills/storefront-best-practices/reference/components/breadcrumbs.md +0 -123
  239. package/skills/storefront-best-practices/reference/components/cart-popup.md +0 -189
  240. package/skills/storefront-best-practices/reference/components/country-selector.md +0 -298
  241. package/skills/storefront-best-practices/reference/components/footer.md +0 -112
  242. package/skills/storefront-best-practices/reference/components/hero.md +0 -241
  243. package/skills/storefront-best-practices/reference/components/megamenu.md +0 -239
  244. package/skills/storefront-best-practices/reference/components/navbar.md +0 -397
  245. package/skills/storefront-best-practices/reference/components/popups.md +0 -221
  246. package/skills/storefront-best-practices/reference/components/product-card.md +0 -125
  247. package/skills/storefront-best-practices/reference/components/product-reviews.md +0 -217
  248. package/skills/storefront-best-practices/reference/components/product-slider.md +0 -174
  249. package/skills/storefront-best-practices/reference/components/search.md +0 -101
  250. package/skills/storefront-best-practices/reference/connecting-to-backend.md +0 -391
  251. package/skills/storefront-best-practices/reference/features/promotions.md +0 -307
  252. package/skills/storefront-best-practices/reference/features/wishlist.md +0 -230
  253. package/skills/storefront-best-practices/reference/layouts/account.md +0 -380
  254. package/skills/storefront-best-practices/reference/layouts/cart.md +0 -316
  255. package/skills/storefront-best-practices/reference/layouts/checkout.md +0 -486
  256. package/skills/storefront-best-practices/reference/layouts/home-page.md +0 -264
  257. package/skills/storefront-best-practices/reference/layouts/order-confirmation.md +0 -231
  258. package/skills/storefront-best-practices/reference/layouts/product-details.md +0 -527
  259. package/skills/storefront-best-practices/reference/layouts/product-listing.md +0 -520
  260. package/skills/storefront-best-practices/reference/layouts/static-pages.md +0 -356
  261. package/skills/storefront-best-practices/reference/medusa.md +0 -307
  262. /package/skills/{storefront-best-practices/reference → storefront-workflow/references}/mobile-responsiveness.md +0 -0
  263. /package/skills/{storefront-best-practices/reference → storefront-workflow/references}/seo.md +0 -0
@@ -0,0 +1,59 @@
1
+ 'use client'
2
+
3
+ // Generated by Thor Commerce storefront (feature: customer-auth — handlers)
4
+ // The customer-auth capability's action handlers. Installed only when the
5
+ // feature is in the manifest; the handlers composer calls this hook. Login and
6
+ // registration are invoked directly by the view registry (their credential
7
+ // payload must never enter the state store); these handlers own the non-secret
8
+ // state transitions: the sign-in / sign-up toggle and logout.
9
+
10
+ import { useEffect } from 'react'
11
+ import { useActions, useStateStore } from '@json-render/react'
12
+ import { logoutAction } from '../../actions'
13
+
14
+ export function useCustomerAuthHandlers() {
15
+ const { set } = useStateStore()
16
+ const { registerHandler } = useActions()
17
+
18
+ useEffect(() => {
19
+ const handlers: Record<string, () => void> = {
20
+ showRegister: () => {
21
+ set('/accountError', null)
22
+ set('/accountMode', 'register')
23
+ },
24
+ showLogin: () => {
25
+ set('/accountError', null)
26
+ set('/accountMode', 'login')
27
+ },
28
+ logout: () => {
29
+ set('/accountPending', true)
30
+ set('/accountError', null)
31
+ void logoutAction()
32
+ .then((result) => {
33
+ set('/accountPending', false)
34
+ if (result.ok) {
35
+ set('/accountCustomer', null)
36
+ set('/accountAuthenticated', false)
37
+ set('/accountMode', 'login')
38
+ return
39
+ }
40
+ set('/accountError', result.error)
41
+ })
42
+ .catch((error) => {
43
+ // Never swallow: log a non-secret context line and surface a message.
44
+ console.error(
45
+ '[storefront/account] logout failed',
46
+ error instanceof Error ? error.message : error,
47
+ )
48
+ set('/accountPending', false)
49
+ set('/accountError', 'No se pudo cerrar la sesión. Inténtalo de nuevo.')
50
+ })
51
+ },
52
+ }
53
+
54
+ for (const [name, handler] of Object.entries(handlers)) {
55
+ registerHandler(name, handler)
56
+ }
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, [])
59
+ }
@@ -0,0 +1,45 @@
1
+ // Generated by Thor Commerce storefront (feature: customer-auth — state slice)
2
+ // The customer-auth capability's state. Installed only when the feature is in
3
+ // the manifest; the state composer spreads it over the core state.
4
+
5
+ import type { Customer } from '@thorprovider/types'
6
+ import type { AccountOrderView } from '../../state.core'
7
+
8
+ export interface CustomerAuthState {
9
+ /** The resolved customer, or null when unauthenticated. Never a token. */
10
+ accountCustomer: Customer | null
11
+ accountAuthenticated: boolean
12
+ /** Which auth surface is mounted: the sign-in page or the registration page. */
13
+ accountMode: 'login' | 'register'
14
+ accountPending: boolean
15
+ accountError: string | null
16
+ /** The customer's fetched order-history rows; empty until (or without) a load. */
17
+ accountOrders: AccountOrderView[]
18
+ /** True while the order history is being loaded. */
19
+ accountOrdersPending: boolean
20
+ /** The order-history load failure, or null when it loaded. */
21
+ accountOrdersError: string | null
22
+ /** The backend's real total for the authenticated customer on the store channel. */
23
+ accountOrdersCount: number
24
+ /** The 1-based order-history page currently loaded. */
25
+ accountOrdersPage: number
26
+ /** The bounded page size used for the order-history window. */
27
+ accountOrdersPageSize: number
28
+ /** The real backend order id selected for the inline detail; null when none is open. */
29
+ accountSelectedOrderId: string | null
30
+ }
31
+
32
+ export const customerAuthState: CustomerAuthState = {
33
+ accountCustomer: null,
34
+ accountAuthenticated: false,
35
+ accountMode: 'login',
36
+ accountPending: false,
37
+ accountError: null,
38
+ accountOrders: [],
39
+ accountOrdersPending: false,
40
+ accountOrdersError: null,
41
+ accountOrdersCount: 0,
42
+ accountOrdersPage: 1,
43
+ accountOrdersPageSize: 10,
44
+ accountSelectedOrderId: null,
45
+ }
@@ -0,0 +1,11 @@
1
+ // Generated by Thor Commerce storefront (feature: recommendations — state slice)
2
+ // The recommendations capability's state. Installed only when the feature is in
3
+ // the manifest; the state composer spreads it over the core state.
4
+
5
+ export interface RecommendationsState {
6
+ recommendedProducts: unknown[]
7
+ }
8
+
9
+ export const recommendationsState: RecommendationsState = {
10
+ recommendedProducts: [],
11
+ }
@@ -0,0 +1,35 @@
1
+ // Thor Commerce view content: account
2
+ // User-owned view content — account copy for the sign-in and registration
3
+ // surfaces. Reconcile seeds this file once and never rewrites it; the derived
4
+ // view module (./index.tsx) imports it and wires it into the element tree, so
5
+ // your edits here survive `storefront sync` and unit removal. Plain data only:
6
+ // no React and no server imports.
7
+
8
+ export const accountContent = {
9
+ login: {
10
+ logoText: '__SITE_NAME__',
11
+ welcomeTitleLabel: 'Bienvenido de nuevo',
12
+ welcomeDescriptionLabel: 'Inicia sesión para gestionar tu cuenta.',
13
+ emailLabel: 'Correo electrónico',
14
+ passwordLabel: 'Contraseña',
15
+ signInLabel: 'Iniciar sesión',
16
+ createAccountLabel: 'Crea una cuenta',
17
+ },
18
+ register: {
19
+ logoText: '__SITE_NAME__',
20
+ createAccountTitleLabel: 'Crea tu cuenta',
21
+ createAccountDescriptionLabel: 'Regístrate para gestionar tus pedidos.',
22
+ fullNameLabel: 'Nombre completo',
23
+ emailLabel: 'Correo electrónico',
24
+ passwordLabel: 'Contraseña',
25
+ createAccountLabel: 'Crear cuenta',
26
+ signInLabel: 'Inicia sesión',
27
+ },
28
+ orders: {
29
+ titleLabel: 'Mis pedidos',
30
+ descriptionLabel: 'Consulta tus pedidos anteriores',
31
+ emptyLabel: 'Aún no tienes pedidos.',
32
+ errorLabel: 'No se pudieron cargar tus pedidos.',
33
+ loadingLabel: 'Cargando pedidos…',
34
+ },
35
+ }
@@ -0,0 +1,114 @@
1
+ // Thor Commerce view module: account
2
+ // Server Component module: elements + catalog entries + route + loader only.
3
+ // The client-side component mappings live in ./registry.tsx ('use client'); this
4
+ // module imports them as data so the RSC graph never evaluates @json-render/react
5
+ // on the server. Registered by importing it in ../index.ts. Recipe: recipes.json -> "account".
6
+ //
7
+ // The initial render does NOT read the auth cookie here (this module is part of
8
+ // the client catalog graph). The catch-all page mounts the route and the
9
+ // headless `AccountBoot` resolves the current customer through the
10
+ // cookie-authorized Server Action, so the token never reaches this module.
11
+
12
+ import { getDataSource } from '../../store-context'
13
+ import { pageRoot } from '../../spec/page-root'
14
+ import type { StorefrontElement } from '../../spec/types'
15
+ import type { ViewModule } from '../types'
16
+ import { registry } from './registry'
17
+ import { accountContent } from './content'
18
+ import {
19
+ accountEmptyPropsSchema,
20
+ accountLoginPropsSchema,
21
+ accountOrdersPropsSchema,
22
+ accountRegisterPropsSchema,
23
+ } from './schema'
24
+
25
+ // Four surfaces: bootstrap (headless), sign-in, registration, and the signed-in
26
+ // panel. The sign-in and registration surfaces are toggled by the `/accountMode`
27
+ // state; the panel shows only when `/accountAuthenticated` is true.
28
+ const elements: Record<string, StorefrontElement> = {
29
+ 'account.boot': {
30
+ type: 'AccountBoot',
31
+ props: {},
32
+ },
33
+ 'account.login': {
34
+ type: 'AccountLogin',
35
+ visible: {
36
+ $and: [
37
+ { $state: '/accountAuthenticated', not: true },
38
+ { $state: '/accountMode', eq: 'login' },
39
+ ],
40
+ },
41
+ props: accountContent.login,
42
+ on: { showRegister: { action: 'showRegister' } },
43
+ },
44
+ 'account.register': {
45
+ type: 'AccountRegister',
46
+ visible: {
47
+ $and: [
48
+ { $state: '/accountAuthenticated', not: true },
49
+ { $state: '/accountMode', eq: 'register' },
50
+ ],
51
+ },
52
+ props: accountContent.register,
53
+ on: { showLogin: { action: 'showLogin' } },
54
+ },
55
+ 'account.panel': {
56
+ type: 'AccountPanel',
57
+ visible: { $state: '/accountAuthenticated' },
58
+ props: {},
59
+ on: { logout: { action: 'logout' } },
60
+ },
61
+ 'account.orders': {
62
+ type: 'AccountOrders',
63
+ visible: { $state: '/accountAuthenticated' },
64
+ props: accountContent.orders,
65
+ },
66
+ }
67
+
68
+ const catalog = {
69
+ AccountBoot: {
70
+ props: accountEmptyPropsSchema,
71
+ description: 'Headless account bootstrap: resolves the current customer from the auth cookie.',
72
+ },
73
+ AccountLogin: {
74
+ props: accountLoginPropsSchema,
75
+ description: 'Sign-in page with email and password and a link to create an account.',
76
+ },
77
+ AccountRegister: {
78
+ props: accountRegisterPropsSchema,
79
+ description: 'Registration page with name, email, and password and a link to sign in.',
80
+ },
81
+ AccountPanel: {
82
+ props: accountEmptyPropsSchema,
83
+ description: 'Minimal signed-in state with the customer name and a logout control.',
84
+ },
85
+ AccountOrders: {
86
+ props: accountOrdersPropsSchema,
87
+ description:
88
+ "Signed-in customer's order history rendered by OrderHistory2, with loading, empty, and error states and an inline order detail.",
89
+ },
90
+ }
91
+
92
+ export const account: ViewModule = {
93
+ name: 'account',
94
+ elements,
95
+ catalog,
96
+ registry,
97
+ route: {
98
+ path: '/account',
99
+ loaderName: 'account',
100
+ layout: 'default',
101
+ metadata: {
102
+ title: 'Mi cuenta',
103
+ description: 'Inicia sesión o crea una cuenta para gestionar tu cuenta.',
104
+ },
105
+ entry: pageRoot(
106
+ 'account',
107
+ ['account.boot', 'account.login', 'account.register', 'account.panel', 'account.orders'],
108
+ elements,
109
+ ),
110
+ },
111
+ loader: {
112
+ account: async () => ({ dataSource: getDataSource(), dataError: null }),
113
+ },
114
+ }