@wix/agent-skills 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/README.md +1 -0
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +18 -17
  4. package/skills/wix-app/references/BUSINESS_MANAGER_THEME.md +1 -2
  5. package/skills/wix-app/references/BUSINESS_MANAGER_TOKENS.md +1 -1
  6. package/skills/wix-app/references/DASHBOARD_PAGE.md +12 -12
  7. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +3 -2
  8. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +75 -66
  9. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +4 -5
  10. package/skills/wix-app/references/data-collection/LIFECYCLE.md +6 -4
  11. package/skills/wix-headless-kit/SKILL.md +31 -14
  12. package/skills/wix-headless-kit/guides/existing-site.md +12 -5
  13. package/skills/wix-headless-kit/install/attach.mjs +55 -10
  14. package/skills/wix-headless-kit/install/check.mjs +5 -5
  15. package/skills/wix-headless-kit/install/deploy.mjs +7 -3
  16. package/skills/wix-headless-kit/install/templates.mjs +21 -17
  17. package/skills/wix-headless-templates/SKILL.md +43 -0
  18. package/skills/wix-headless-templates/blank/project/README.md +15 -0
  19. package/skills/wix-headless-templates/blank/project/astro.config.mjs +20 -0
  20. package/skills/wix-headless-templates/blank/project/package.json +34 -0
  21. package/skills/wix-headless-templates/blank/project/public/favicon.svg +9 -0
  22. package/skills/wix-headless-templates/blank/project/src/assets/astro.svg +1 -0
  23. package/skills/wix-headless-templates/blank/project/src/assets/background.svg +1 -0
  24. package/skills/wix-headless-templates/blank/project/src/assets/wix.svg +18 -0
  25. package/skills/wix-headless-templates/blank/project/src/components/Hero.astro +77 -0
  26. package/skills/wix-headless-templates/blank/project/src/components/Welcome.astro +95 -0
  27. package/skills/wix-headless-templates/blank/project/src/layouts/Layout.astro +22 -0
  28. package/skills/wix-headless-templates/blank/project/src/pages/index.astro +8 -0
  29. package/skills/wix-headless-templates/blank/project/tsconfig.json +5 -0
  30. package/skills/wix-headless-templates/blog/INSTRUCTIONS.md +418 -0
  31. package/skills/wix-headless-templates/blog/app/components/blog/BlogFeedView.tsx +191 -0
  32. package/skills/wix-headless-templates/blog/app/components/blog/CommentsView.tsx +206 -0
  33. package/skills/wix-headless-templates/blog/app/components/blog/PostLikeButton.tsx +62 -0
  34. package/skills/wix-headless-templates/blog/app/components/blog/PostView.tsx +139 -0
  35. package/skills/wix-headless-templates/blog/app/components/blog/RichContent.tsx +42 -0
  36. package/skills/wix-headless-templates/blog/app/hooks/blog/useBlogFeed.ts +31 -0
  37. package/skills/wix-headless-templates/blog/app/hooks/blog/useComments.ts +26 -0
  38. package/skills/wix-headless-templates/blog/app/hooks/blog/usePost.ts +25 -0
  39. package/skills/wix-headless-templates/blog/app/wix/blog/authors-core.ts +51 -0
  40. package/skills/wix-headless-templates/blog/app/wix/blog/authors.ts +50 -0
  41. package/skills/wix-headless-templates/blog/app/wix/blog/blog-feed-store.ts +156 -0
  42. package/skills/wix-headless-templates/blog/app/wix/blog/comments-core.ts +189 -0
  43. package/skills/wix-headless-templates/blog/app/wix/blog/comments-store.ts +214 -0
  44. package/skills/wix-headless-templates/blog/app/wix/blog/comments.ts +84 -0
  45. package/skills/wix-headless-templates/blog/app/wix/blog/post-likes.ts +42 -0
  46. package/skills/wix-headless-templates/blog/app/wix/blog/post-store.ts +158 -0
  47. package/skills/wix-headless-templates/blog/app/wix/blog/posts-core.ts +347 -0
  48. package/skills/wix-headless-templates/blog/app/wix/blog/posts.ts +132 -0
  49. package/skills/wix-headless-templates/blog/app/wix/blog/taxonomy-core.ts +80 -0
  50. package/skills/wix-headless-templates/blog/app/wix/blog/taxonomy.ts +78 -0
  51. package/skills/wix-headless-templates/blog/app/wix/blog/types.ts +161 -0
  52. package/skills/wix-headless-templates/blog/app-astro/layouts/SiteLayout.astro +44 -0
  53. package/skills/wix-headless-templates/blog/app-astro/pages/blog/[...slug].astro +148 -0
  54. package/skills/wix-headless-templates/blog/app-astro/pages/blog/category/[slug].astro +97 -0
  55. package/skills/wix-headless-templates/blog/app-astro/pages/blog/tag/[slug].astro +51 -0
  56. package/skills/wix-headless-templates/blog/app-astro/pages/blog.astro +34 -0
  57. package/skills/wix-headless-templates/blog/project/README.md +15 -0
  58. package/skills/wix-headless-templates/blog/project/astro.config.mjs +22 -0
  59. package/skills/wix-headless-templates/blog/project/package-lock.json +14699 -0
  60. package/skills/wix-headless-templates/blog/project/package.json +39 -0
  61. package/skills/wix-headless-templates/blog/project/public/favicon.svg +9 -0
  62. package/skills/wix-headless-templates/blog/project/src/assets/astro.svg +1 -0
  63. package/skills/wix-headless-templates/blog/project/src/assets/background.svg +1 -0
  64. package/skills/wix-headless-templates/blog/project/src/assets/wix.svg +18 -0
  65. package/skills/wix-headless-templates/blog/project/src/components/Hero.astro +77 -0
  66. package/skills/wix-headless-templates/blog/project/src/components/Welcome.astro +95 -0
  67. package/skills/wix-headless-templates/blog/project/src/components/blog/BlogFeedView.tsx +191 -0
  68. package/skills/wix-headless-templates/blog/project/src/components/blog/CommentsView.tsx +206 -0
  69. package/skills/wix-headless-templates/blog/project/src/components/blog/PostLikeButton.tsx +62 -0
  70. package/skills/wix-headless-templates/blog/project/src/components/blog/PostView.tsx +139 -0
  71. package/skills/wix-headless-templates/blog/project/src/components/blog/RichContent.tsx +42 -0
  72. package/skills/wix-headless-templates/blog/project/src/hooks/blog/useBlogFeed.ts +31 -0
  73. package/skills/wix-headless-templates/blog/project/src/hooks/blog/useComments.ts +26 -0
  74. package/skills/wix-headless-templates/blog/project/src/hooks/blog/usePost.ts +25 -0
  75. package/skills/wix-headless-templates/blog/project/src/layouts/Layout.astro +22 -0
  76. package/skills/wix-headless-templates/blog/project/src/layouts/SiteLayout.astro +44 -0
  77. package/skills/wix-headless-templates/blog/project/src/pages/blog/[...slug].astro +148 -0
  78. package/skills/wix-headless-templates/blog/project/src/pages/blog/category/[slug].astro +97 -0
  79. package/skills/wix-headless-templates/blog/project/src/pages/blog/tag/[slug].astro +51 -0
  80. package/skills/wix-headless-templates/blog/project/src/pages/blog.astro +34 -0
  81. package/skills/wix-headless-templates/blog/project/src/pages/index.astro +8 -0
  82. package/skills/wix-headless-templates/blog/project/src/styles/global.css +57 -0
  83. package/skills/wix-headless-templates/blog/project/src/wix/blog/authors-core.ts +51 -0
  84. package/skills/wix-headless-templates/blog/project/src/wix/blog/authors.ts +50 -0
  85. package/skills/wix-headless-templates/blog/project/src/wix/blog/blog-feed-store.ts +156 -0
  86. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments-core.ts +189 -0
  87. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments-store.ts +214 -0
  88. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments.ts +84 -0
  89. package/skills/wix-headless-templates/blog/project/src/wix/blog/post-likes.ts +42 -0
  90. package/skills/wix-headless-templates/blog/project/src/wix/blog/post-store.ts +158 -0
  91. package/skills/wix-headless-templates/blog/project/src/wix/blog/posts-core.ts +347 -0
  92. package/skills/wix-headless-templates/blog/project/src/wix/blog/posts.ts +132 -0
  93. package/skills/wix-headless-templates/blog/project/src/wix/blog/taxonomy-core.ts +80 -0
  94. package/skills/wix-headless-templates/blog/project/src/wix/blog/taxonomy.ts +78 -0
  95. package/skills/wix-headless-templates/blog/project/src/wix/blog/types.ts +161 -0
  96. package/skills/wix-headless-templates/blog/project/src/wix/config.ts +16 -0
  97. package/skills/wix-headless-templates/blog/project/src/wix/media.ts +106 -0
  98. package/skills/wix-headless-templates/blog/project/src/wix/money.ts +24 -0
  99. package/skills/wix-headless-templates/blog/project/src/wix/sdk.ts +89 -0
  100. package/skills/wix-headless-templates/blog/project/tsconfig.json +5 -0
  101. package/skills/wix-headless-templates/blog/rest/authors.ts +39 -0
  102. package/skills/wix-headless-templates/blog/rest/comments.ts +64 -0
  103. package/skills/wix-headless-templates/blog/rest/post-likes.ts +37 -0
  104. package/skills/wix-headless-templates/blog/rest/posts.ts +123 -0
  105. package/skills/wix-headless-templates/blog/rest/taxonomy.ts +79 -0
  106. package/skills/wix-headless-templates/blog/seed/SEED.md +81 -0
  107. package/skills/wix-headless-templates/blog/seed/read-site.mjs +33 -0
  108. package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +337 -0
  109. package/skills/wix-headless-templates/bookings/INSTRUCTIONS.md +356 -0
  110. package/skills/wix-headless-templates/bookings/app/components/bookings/ServiceBookingView.tsx +369 -0
  111. package/skills/wix-headless-templates/bookings/app/components/bookings/ServicesView.tsx +193 -0
  112. package/skills/wix-headless-templates/bookings/app/hooks/bookings/useBookingFlow.ts +56 -0
  113. package/skills/wix-headless-templates/bookings/app/hooks/bookings/useServices.ts +23 -0
  114. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking-core.ts +614 -0
  115. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking-flow-store.ts +410 -0
  116. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking.ts +227 -0
  117. package/skills/wix-headless-templates/bookings/app/wix/bookings/services-core.ts +366 -0
  118. package/skills/wix-headless-templates/bookings/app/wix/bookings/services-store.ts +213 -0
  119. package/skills/wix-headless-templates/bookings/app/wix/bookings/services.ts +100 -0
  120. package/skills/wix-headless-templates/bookings/app/wix/bookings/types.ts +236 -0
  121. package/skills/wix-headless-templates/bookings/app-astro/layouts/SiteLayout.astro +40 -0
  122. package/skills/wix-headless-templates/bookings/app-astro/pages/services/[slug].astro +81 -0
  123. package/skills/wix-headless-templates/bookings/app-astro/pages/services.astro +40 -0
  124. package/skills/wix-headless-templates/bookings/project/README.md +15 -0
  125. package/skills/wix-headless-templates/bookings/project/astro.config.mjs +22 -0
  126. package/skills/wix-headless-templates/bookings/project/package-lock.json +10546 -0
  127. package/skills/wix-headless-templates/bookings/project/package.json +41 -0
  128. package/skills/wix-headless-templates/bookings/project/public/favicon.svg +9 -0
  129. package/skills/wix-headless-templates/bookings/project/src/assets/astro.svg +1 -0
  130. package/skills/wix-headless-templates/bookings/project/src/assets/background.svg +1 -0
  131. package/skills/wix-headless-templates/bookings/project/src/assets/wix.svg +18 -0
  132. package/skills/wix-headless-templates/bookings/project/src/components/Hero.astro +77 -0
  133. package/skills/wix-headless-templates/bookings/project/src/components/Welcome.astro +95 -0
  134. package/skills/wix-headless-templates/bookings/project/src/components/bookings/ServiceBookingView.tsx +369 -0
  135. package/skills/wix-headless-templates/bookings/project/src/components/bookings/ServicesView.tsx +193 -0
  136. package/skills/wix-headless-templates/bookings/project/src/hooks/bookings/useBookingFlow.ts +56 -0
  137. package/skills/wix-headless-templates/bookings/project/src/hooks/bookings/useServices.ts +23 -0
  138. package/skills/wix-headless-templates/bookings/project/src/layouts/Layout.astro +22 -0
  139. package/skills/wix-headless-templates/bookings/project/src/layouts/SiteLayout.astro +40 -0
  140. package/skills/wix-headless-templates/bookings/project/src/pages/index.astro +8 -0
  141. package/skills/wix-headless-templates/bookings/project/src/pages/services/[slug].astro +81 -0
  142. package/skills/wix-headless-templates/bookings/project/src/pages/services.astro +40 -0
  143. package/skills/wix-headless-templates/bookings/project/src/styles/global.css +57 -0
  144. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking-core.ts +614 -0
  145. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking-flow-store.ts +410 -0
  146. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking.ts +227 -0
  147. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services-core.ts +366 -0
  148. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services-store.ts +213 -0
  149. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services.ts +100 -0
  150. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/types.ts +236 -0
  151. package/skills/wix-headless-templates/bookings/project/src/wix/config.ts +16 -0
  152. package/skills/wix-headless-templates/bookings/project/src/wix/media.ts +106 -0
  153. package/skills/wix-headless-templates/bookings/project/src/wix/money.ts +24 -0
  154. package/skills/wix-headless-templates/bookings/project/src/wix/sdk.ts +89 -0
  155. package/skills/wix-headless-templates/bookings/project/tsconfig.json +5 -0
  156. package/skills/wix-headless-templates/bookings/rest/booking.ts +227 -0
  157. package/skills/wix-headless-templates/bookings/rest/services.ts +94 -0
  158. package/skills/wix-headless-templates/bookings/seed/SEED.md +109 -0
  159. package/skills/wix-headless-templates/bookings/seed/read-site.mjs +28 -0
  160. package/skills/wix-headless-templates/bookings/seed/seed-bookings.mjs +407 -0
  161. package/skills/wix-headless-templates/cms/INSTRUCTIONS.md +399 -0
  162. package/skills/wix-headless-templates/cms/app/hooks/cms/useCollection.ts +82 -0
  163. package/skills/wix-headless-templates/cms/app/hooks/cms/useItem.ts +37 -0
  164. package/skills/wix-headless-templates/cms/app/wix/cms/collection-store.ts +220 -0
  165. package/skills/wix-headless-templates/cms/app/wix/cms/collections-core.ts +41 -0
  166. package/skills/wix-headless-templates/cms/app/wix/cms/collections.ts +28 -0
  167. package/skills/wix-headless-templates/cms/app/wix/cms/item-store.ts +93 -0
  168. package/skills/wix-headless-templates/cms/app/wix/cms/items-core.ts +259 -0
  169. package/skills/wix-headless-templates/cms/app/wix/cms/items.ts +182 -0
  170. package/skills/wix-headless-templates/cms/app/wix/cms/types.ts +138 -0
  171. package/skills/wix-headless-templates/cms/app-astro/layouts/SiteLayout.astro +41 -0
  172. package/skills/wix-headless-templates/cms/project/README.md +15 -0
  173. package/skills/wix-headless-templates/cms/project/astro.config.mjs +22 -0
  174. package/skills/wix-headless-templates/cms/project/package-lock.json +9798 -0
  175. package/skills/wix-headless-templates/cms/project/package.json +37 -0
  176. package/skills/wix-headless-templates/cms/project/public/favicon.svg +9 -0
  177. package/skills/wix-headless-templates/cms/project/src/assets/astro.svg +1 -0
  178. package/skills/wix-headless-templates/cms/project/src/assets/background.svg +1 -0
  179. package/skills/wix-headless-templates/cms/project/src/assets/wix.svg +18 -0
  180. package/skills/wix-headless-templates/cms/project/src/components/Hero.astro +77 -0
  181. package/skills/wix-headless-templates/cms/project/src/components/Welcome.astro +95 -0
  182. package/skills/wix-headless-templates/cms/project/src/hooks/cms/useCollection.ts +82 -0
  183. package/skills/wix-headless-templates/cms/project/src/hooks/cms/useItem.ts +37 -0
  184. package/skills/wix-headless-templates/cms/project/src/layouts/Layout.astro +22 -0
  185. package/skills/wix-headless-templates/cms/project/src/layouts/SiteLayout.astro +41 -0
  186. package/skills/wix-headless-templates/cms/project/src/pages/index.astro +8 -0
  187. package/skills/wix-headless-templates/cms/project/src/styles/global.css +57 -0
  188. package/skills/wix-headless-templates/cms/project/src/wix/cms/collection-store.ts +220 -0
  189. package/skills/wix-headless-templates/cms/project/src/wix/cms/collections-core.ts +41 -0
  190. package/skills/wix-headless-templates/cms/project/src/wix/cms/collections.ts +28 -0
  191. package/skills/wix-headless-templates/cms/project/src/wix/cms/item-store.ts +93 -0
  192. package/skills/wix-headless-templates/cms/project/src/wix/cms/items-core.ts +259 -0
  193. package/skills/wix-headless-templates/cms/project/src/wix/cms/items.ts +182 -0
  194. package/skills/wix-headless-templates/cms/project/src/wix/cms/types.ts +138 -0
  195. package/skills/wix-headless-templates/cms/project/src/wix/config.ts +16 -0
  196. package/skills/wix-headless-templates/cms/project/src/wix/media.ts +106 -0
  197. package/skills/wix-headless-templates/cms/project/src/wix/money.ts +24 -0
  198. package/skills/wix-headless-templates/cms/project/src/wix/sdk.ts +89 -0
  199. package/skills/wix-headless-templates/cms/project/tsconfig.json +5 -0
  200. package/skills/wix-headless-templates/cms/rest/collections.ts +25 -0
  201. package/skills/wix-headless-templates/cms/rest/items.ts +189 -0
  202. package/skills/wix-headless-templates/cms/seed/SEED.md +116 -0
  203. package/skills/wix-headless-templates/cms/seed/read-site.mjs +20 -0
  204. package/skills/wix-headless-templates/cms/seed/seed-cms.mjs +321 -0
  205. package/skills/wix-headless-templates/compose.mjs +83 -0
  206. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +349 -0
  207. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +155 -0
  208. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +46 -0
  209. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +49 -0
  210. package/skills/wix-headless-templates/donations/app/hooks/donations/useCampaigns.ts +21 -0
  211. package/skills/wix-headless-templates/donations/app/hooks/donations/useDonation.ts +27 -0
  212. package/skills/wix-headless-templates/donations/app/hooks/donations/useDonationReceipt.ts +19 -0
  213. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns-store.ts +59 -0
  214. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +83 -0
  215. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +95 -0
  216. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +163 -0
  217. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +466 -0
  218. package/skills/wix-headless-templates/donations/app/wix/donations/receipt-store.ts +55 -0
  219. package/skills/wix-headless-templates/donations/app/wix/donations/types.ts +121 -0
  220. package/skills/wix-headless-templates/donations/app-astro/components/donations/CampaignPage.astro +43 -0
  221. package/skills/wix-headless-templates/donations/app-astro/layouts/SiteLayout.astro +45 -0
  222. package/skills/wix-headless-templates/donations/app-astro/pages/donate/[id].astro +28 -0
  223. package/skills/wix-headless-templates/donations/app-astro/pages/donate/index.astro +51 -0
  224. package/skills/wix-headless-templates/donations/app-astro/pages/donate/thank-you.astro +13 -0
  225. package/skills/wix-headless-templates/donations/project/README.md +15 -0
  226. package/skills/wix-headless-templates/donations/project/astro.config.mjs +22 -0
  227. package/skills/wix-headless-templates/donations/project/package-lock.json +10266 -0
  228. package/skills/wix-headless-templates/donations/project/package.json +39 -0
  229. package/skills/wix-headless-templates/donations/project/public/favicon.svg +9 -0
  230. package/skills/wix-headless-templates/donations/project/src/assets/astro.svg +1 -0
  231. package/skills/wix-headless-templates/donations/project/src/assets/background.svg +1 -0
  232. package/skills/wix-headless-templates/donations/project/src/assets/wix.svg +18 -0
  233. package/skills/wix-headless-templates/donations/project/src/components/Hero.astro +77 -0
  234. package/skills/wix-headless-templates/donations/project/src/components/Welcome.astro +95 -0
  235. package/skills/wix-headless-templates/donations/project/src/components/donations/CampaignPage.astro +43 -0
  236. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +155 -0
  237. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +46 -0
  238. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +49 -0
  239. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useCampaigns.ts +21 -0
  240. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useDonation.ts +27 -0
  241. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useDonationReceipt.ts +19 -0
  242. package/skills/wix-headless-templates/donations/project/src/layouts/Layout.astro +22 -0
  243. package/skills/wix-headless-templates/donations/project/src/layouts/SiteLayout.astro +45 -0
  244. package/skills/wix-headless-templates/donations/project/src/pages/donate/[id].astro +28 -0
  245. package/skills/wix-headless-templates/donations/project/src/pages/donate/index.astro +51 -0
  246. package/skills/wix-headless-templates/donations/project/src/pages/donate/thank-you.astro +13 -0
  247. package/skills/wix-headless-templates/donations/project/src/pages/index.astro +8 -0
  248. package/skills/wix-headless-templates/donations/project/src/styles/global.css +57 -0
  249. package/skills/wix-headless-templates/donations/project/src/wix/config.ts +16 -0
  250. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns-store.ts +59 -0
  251. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +83 -0
  252. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +95 -0
  253. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +163 -0
  254. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +466 -0
  255. package/skills/wix-headless-templates/donations/project/src/wix/donations/receipt-store.ts +55 -0
  256. package/skills/wix-headless-templates/donations/project/src/wix/donations/types.ts +121 -0
  257. package/skills/wix-headless-templates/donations/project/src/wix/media.ts +106 -0
  258. package/skills/wix-headless-templates/donations/project/src/wix/money.ts +24 -0
  259. package/skills/wix-headless-templates/donations/project/src/wix/sdk.ts +89 -0
  260. package/skills/wix-headless-templates/donations/project/tsconfig.json +5 -0
  261. package/skills/wix-headless-templates/donations/rest/campaigns.ts +76 -0
  262. package/skills/wix-headless-templates/donations/rest/donate.ts +90 -0
  263. package/skills/wix-headless-templates/donations/seed/SEED.md +90 -0
  264. package/skills/wix-headless-templates/donations/seed/read-site.mjs +33 -0
  265. package/skills/wix-headless-templates/donations/seed/seed-donations.mjs +250 -0
  266. package/skills/wix-headless-templates/events/INSTRUCTIONS.md +387 -0
  267. package/skills/wix-headless-templates/events/app/components/events/EventConfirmationView.tsx +139 -0
  268. package/skills/wix-headless-templates/events/app/components/events/EventRegistrationView.tsx +375 -0
  269. package/skills/wix-headless-templates/events/app/components/events/EventsView.tsx +134 -0
  270. package/skills/wix-headless-templates/events/app/hooks/events/useEventConfirmation.ts +21 -0
  271. package/skills/wix-headless-templates/events/app/hooks/events/useEventRegistration.ts +40 -0
  272. package/skills/wix-headless-templates/events/app/hooks/events/useEvents.ts +24 -0
  273. package/skills/wix-headless-templates/events/app/wix/events/events-core.ts +379 -0
  274. package/skills/wix-headless-templates/events/app/wix/events/events-store.ts +175 -0
  275. package/skills/wix-headless-templates/events/app/wix/events/events.ts +124 -0
  276. package/skills/wix-headless-templates/events/app/wix/events/order-store.ts +143 -0
  277. package/skills/wix-headless-templates/events/app/wix/events/orders-core.ts +86 -0
  278. package/skills/wix-headless-templates/events/app/wix/events/orders.ts +30 -0
  279. package/skills/wix-headless-templates/events/app/wix/events/registration-core.ts +415 -0
  280. package/skills/wix-headless-templates/events/app/wix/events/registration-store.ts +237 -0
  281. package/skills/wix-headless-templates/events/app/wix/events/registration.ts +109 -0
  282. package/skills/wix-headless-templates/events/app/wix/events/types.ts +249 -0
  283. package/skills/wix-headless-templates/events/app-astro/layouts/SiteLayout.astro +40 -0
  284. package/skills/wix-headless-templates/events/app-astro/pages/event-confirmation.astro +12 -0
  285. package/skills/wix-headless-templates/events/app-astro/pages/events/[slug].astro +104 -0
  286. package/skills/wix-headless-templates/events/app-astro/pages/events.astro +23 -0
  287. package/skills/wix-headless-templates/events/project/README.md +15 -0
  288. package/skills/wix-headless-templates/events/project/astro.config.mjs +22 -0
  289. package/skills/wix-headless-templates/events/project/package-lock.json +10497 -0
  290. package/skills/wix-headless-templates/events/project/package.json +39 -0
  291. package/skills/wix-headless-templates/events/project/public/favicon.svg +9 -0
  292. package/skills/wix-headless-templates/events/project/src/assets/astro.svg +1 -0
  293. package/skills/wix-headless-templates/events/project/src/assets/background.svg +1 -0
  294. package/skills/wix-headless-templates/events/project/src/assets/wix.svg +18 -0
  295. package/skills/wix-headless-templates/events/project/src/components/Hero.astro +77 -0
  296. package/skills/wix-headless-templates/events/project/src/components/Welcome.astro +95 -0
  297. package/skills/wix-headless-templates/events/project/src/components/events/EventConfirmationView.tsx +139 -0
  298. package/skills/wix-headless-templates/events/project/src/components/events/EventRegistrationView.tsx +375 -0
  299. package/skills/wix-headless-templates/events/project/src/components/events/EventsView.tsx +134 -0
  300. package/skills/wix-headless-templates/events/project/src/hooks/events/useEventConfirmation.ts +21 -0
  301. package/skills/wix-headless-templates/events/project/src/hooks/events/useEventRegistration.ts +40 -0
  302. package/skills/wix-headless-templates/events/project/src/hooks/events/useEvents.ts +24 -0
  303. package/skills/wix-headless-templates/events/project/src/layouts/Layout.astro +22 -0
  304. package/skills/wix-headless-templates/events/project/src/layouts/SiteLayout.astro +40 -0
  305. package/skills/wix-headless-templates/events/project/src/pages/event-confirmation.astro +12 -0
  306. package/skills/wix-headless-templates/events/project/src/pages/events/[slug].astro +104 -0
  307. package/skills/wix-headless-templates/events/project/src/pages/events.astro +23 -0
  308. package/skills/wix-headless-templates/events/project/src/pages/index.astro +8 -0
  309. package/skills/wix-headless-templates/events/project/src/styles/global.css +57 -0
  310. package/skills/wix-headless-templates/events/project/src/wix/config.ts +16 -0
  311. package/skills/wix-headless-templates/events/project/src/wix/events/events-core.ts +379 -0
  312. package/skills/wix-headless-templates/events/project/src/wix/events/events-store.ts +175 -0
  313. package/skills/wix-headless-templates/events/project/src/wix/events/events.ts +124 -0
  314. package/skills/wix-headless-templates/events/project/src/wix/events/order-store.ts +143 -0
  315. package/skills/wix-headless-templates/events/project/src/wix/events/orders-core.ts +86 -0
  316. package/skills/wix-headless-templates/events/project/src/wix/events/orders.ts +30 -0
  317. package/skills/wix-headless-templates/events/project/src/wix/events/registration-core.ts +415 -0
  318. package/skills/wix-headless-templates/events/project/src/wix/events/registration-store.ts +237 -0
  319. package/skills/wix-headless-templates/events/project/src/wix/events/registration.ts +109 -0
  320. package/skills/wix-headless-templates/events/project/src/wix/events/types.ts +249 -0
  321. package/skills/wix-headless-templates/events/project/src/wix/media.ts +106 -0
  322. package/skills/wix-headless-templates/events/project/src/wix/money.ts +24 -0
  323. package/skills/wix-headless-templates/events/project/src/wix/sdk.ts +89 -0
  324. package/skills/wix-headless-templates/events/project/tsconfig.json +5 -0
  325. package/skills/wix-headless-templates/events/rest/events.ts +112 -0
  326. package/skills/wix-headless-templates/events/rest/orders.ts +28 -0
  327. package/skills/wix-headless-templates/events/rest/registration.ts +96 -0
  328. package/skills/wix-headless-templates/events/seed/SEED.md +115 -0
  329. package/skills/wix-headless-templates/events/seed/read-site.mjs +26 -0
  330. package/skills/wix-headless-templates/events/seed/seed-events.mjs +322 -0
  331. package/skills/wix-headless-templates/faq/INSTRUCTIONS.md +317 -0
  332. package/skills/wix-headless-templates/faq/app/components/faq/FaqAccordion.tsx +159 -0
  333. package/skills/wix-headless-templates/faq/app/components/faq/FaqCategoryNav.tsx +46 -0
  334. package/skills/wix-headless-templates/faq/app/components/faq/FaqSearch.tsx +56 -0
  335. package/skills/wix-headless-templates/faq/app/hooks/faq/useFaq.ts +53 -0
  336. package/skills/wix-headless-templates/faq/app/wix/faq/faq-core.ts +428 -0
  337. package/skills/wix-headless-templates/faq/app/wix/faq/faq-store.ts +212 -0
  338. package/skills/wix-headless-templates/faq/app/wix/faq/faq.ts +72 -0
  339. package/skills/wix-headless-templates/faq/app/wix/faq/types.ts +63 -0
  340. package/skills/wix-headless-templates/faq/app-astro/layouts/SiteLayout.astro +40 -0
  341. package/skills/wix-headless-templates/faq/app-astro/pages/faq.astro +39 -0
  342. package/skills/wix-headless-templates/faq/project/README.md +15 -0
  343. package/skills/wix-headless-templates/faq/project/astro.config.mjs +22 -0
  344. package/skills/wix-headless-templates/faq/project/package-lock.json +8837 -0
  345. package/skills/wix-headless-templates/faq/project/package.json +37 -0
  346. package/skills/wix-headless-templates/faq/project/public/favicon.svg +9 -0
  347. package/skills/wix-headless-templates/faq/project/src/assets/astro.svg +1 -0
  348. package/skills/wix-headless-templates/faq/project/src/assets/background.svg +1 -0
  349. package/skills/wix-headless-templates/faq/project/src/assets/wix.svg +18 -0
  350. package/skills/wix-headless-templates/faq/project/src/components/Hero.astro +77 -0
  351. package/skills/wix-headless-templates/faq/project/src/components/Welcome.astro +95 -0
  352. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqAccordion.tsx +159 -0
  353. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqCategoryNav.tsx +46 -0
  354. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqSearch.tsx +56 -0
  355. package/skills/wix-headless-templates/faq/project/src/hooks/faq/useFaq.ts +53 -0
  356. package/skills/wix-headless-templates/faq/project/src/layouts/Layout.astro +22 -0
  357. package/skills/wix-headless-templates/faq/project/src/layouts/SiteLayout.astro +40 -0
  358. package/skills/wix-headless-templates/faq/project/src/pages/faq.astro +39 -0
  359. package/skills/wix-headless-templates/faq/project/src/pages/index.astro +8 -0
  360. package/skills/wix-headless-templates/faq/project/src/styles/global.css +57 -0
  361. package/skills/wix-headless-templates/faq/project/src/wix/config.ts +16 -0
  362. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq-core.ts +428 -0
  363. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq-store.ts +212 -0
  364. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq.ts +72 -0
  365. package/skills/wix-headless-templates/faq/project/src/wix/faq/types.ts +63 -0
  366. package/skills/wix-headless-templates/faq/project/src/wix/media.ts +106 -0
  367. package/skills/wix-headless-templates/faq/project/src/wix/money.ts +24 -0
  368. package/skills/wix-headless-templates/faq/project/src/wix/sdk.ts +89 -0
  369. package/skills/wix-headless-templates/faq/project/tsconfig.json +5 -0
  370. package/skills/wix-headless-templates/faq/rest/faq.ts +71 -0
  371. package/skills/wix-headless-templates/faq/seed/SEED.md +104 -0
  372. package/skills/wix-headless-templates/faq/seed/read-site.mjs +23 -0
  373. package/skills/wix-headless-templates/faq/seed/seed-faq.mjs +302 -0
  374. package/skills/wix-headless-templates/forms/INSTRUCTIONS.md +417 -0
  375. package/skills/wix-headless-templates/forms/app/hooks/forms/useWixForm.ts +108 -0
  376. package/skills/wix-headless-templates/forms/app/wix/forms/address-templates.generated.ts +13 -0
  377. package/skills/wix-headless-templates/forms/app/wix/forms/form-store.ts +533 -0
  378. package/skills/wix-headless-templates/forms/app/wix/forms/forms-core.ts +671 -0
  379. package/skills/wix-headless-templates/forms/app/wix/forms/forms.ts +57 -0
  380. package/skills/wix-headless-templates/forms/app/wix/forms/submissions-core.ts +423 -0
  381. package/skills/wix-headless-templates/forms/app/wix/forms/submissions.ts +95 -0
  382. package/skills/wix-headless-templates/forms/app/wix/forms/types.ts +284 -0
  383. package/skills/wix-headless-templates/forms/project/README.md +15 -0
  384. package/skills/wix-headless-templates/forms/project/astro.config.mjs +22 -0
  385. package/skills/wix-headless-templates/forms/project/package-lock.json +9102 -0
  386. package/skills/wix-headless-templates/forms/project/package.json +37 -0
  387. package/skills/wix-headless-templates/forms/project/public/favicon.svg +9 -0
  388. package/skills/wix-headless-templates/forms/project/src/assets/astro.svg +1 -0
  389. package/skills/wix-headless-templates/forms/project/src/assets/background.svg +1 -0
  390. package/skills/wix-headless-templates/forms/project/src/assets/wix.svg +18 -0
  391. package/skills/wix-headless-templates/forms/project/src/components/Hero.astro +77 -0
  392. package/skills/wix-headless-templates/forms/project/src/components/Welcome.astro +95 -0
  393. package/skills/wix-headless-templates/forms/project/src/hooks/forms/useWixForm.ts +108 -0
  394. package/skills/wix-headless-templates/forms/project/src/layouts/Layout.astro +22 -0
  395. package/skills/wix-headless-templates/forms/project/src/pages/index.astro +8 -0
  396. package/skills/wix-headless-templates/forms/project/src/styles/global.css +57 -0
  397. package/skills/wix-headless-templates/forms/project/src/wix/config.ts +16 -0
  398. package/skills/wix-headless-templates/forms/project/src/wix/forms/address-templates.generated.ts +13 -0
  399. package/skills/wix-headless-templates/forms/project/src/wix/forms/form-store.ts +533 -0
  400. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms-core.ts +671 -0
  401. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms.ts +57 -0
  402. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions-core.ts +423 -0
  403. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions.ts +95 -0
  404. package/skills/wix-headless-templates/forms/project/src/wix/forms/types.ts +284 -0
  405. package/skills/wix-headless-templates/forms/project/src/wix/media.ts +106 -0
  406. package/skills/wix-headless-templates/forms/project/src/wix/money.ts +24 -0
  407. package/skills/wix-headless-templates/forms/project/src/wix/sdk.ts +89 -0
  408. package/skills/wix-headless-templates/forms/project/tsconfig.json +5 -0
  409. package/skills/wix-headless-templates/forms/rest/forms.ts +37 -0
  410. package/skills/wix-headless-templates/forms/rest/submissions.ts +83 -0
  411. package/skills/wix-headless-templates/forms/seed/SEED.md +225 -0
  412. package/skills/wix-headless-templates/forms/seed/read-site.mjs +53 -0
  413. package/skills/wix-headless-templates/forms/seed/seed-forms.mjs +574 -0
  414. package/skills/wix-headless-templates/forms/tooling/address-templates.mjs +96 -0
  415. package/skills/wix-headless-templates/members/INSTRUCTIONS.md +345 -0
  416. package/skills/wix-headless-templates/members/app/components/members/AccountPage.tsx +16 -0
  417. package/skills/wix-headless-templates/members/app/components/members/AccountView.tsx +60 -0
  418. package/skills/wix-headless-templates/members/app/components/members/LoginForm.tsx +165 -0
  419. package/skills/wix-headless-templates/members/app/components/members/MemberMenu.tsx +78 -0
  420. package/skills/wix-headless-templates/members/app/components/members/RequireAuth.tsx +47 -0
  421. package/skills/wix-headless-templates/members/app/hooks/members/useMember.ts +67 -0
  422. package/skills/wix-headless-templates/members/app/wix/members/auth-core.ts +160 -0
  423. package/skills/wix-headless-templates/members/app/wix/members/auth.ts +117 -0
  424. package/skills/wix-headless-templates/members/app/wix/members/client.ts +27 -0
  425. package/skills/wix-headless-templates/members/app/wix/members/member-store.ts +133 -0
  426. package/skills/wix-headless-templates/members/app/wix/members/members-core.ts +43 -0
  427. package/skills/wix-headless-templates/members/app/wix/members/members.ts +29 -0
  428. package/skills/wix-headless-templates/members/app/wix/members/types.ts +21 -0
  429. package/skills/wix-headless-templates/members/app-astro/layouts/SiteLayout.astro +42 -0
  430. package/skills/wix-headless-templates/members/app-astro/pages/account.astro +9 -0
  431. package/skills/wix-headless-templates/members/app-astro/pages/login.astro +11 -0
  432. package/skills/wix-headless-templates/members/project/README.md +15 -0
  433. package/skills/wix-headless-templates/members/project/astro.config.mjs +22 -0
  434. package/skills/wix-headless-templates/members/project/package-lock.json +8892 -0
  435. package/skills/wix-headless-templates/members/project/package.json +37 -0
  436. package/skills/wix-headless-templates/members/project/public/favicon.svg +9 -0
  437. package/skills/wix-headless-templates/members/project/src/assets/astro.svg +1 -0
  438. package/skills/wix-headless-templates/members/project/src/assets/background.svg +1 -0
  439. package/skills/wix-headless-templates/members/project/src/assets/wix.svg +18 -0
  440. package/skills/wix-headless-templates/members/project/src/components/Hero.astro +77 -0
  441. package/skills/wix-headless-templates/members/project/src/components/Welcome.astro +95 -0
  442. package/skills/wix-headless-templates/members/project/src/components/members/AccountPage.tsx +16 -0
  443. package/skills/wix-headless-templates/members/project/src/components/members/AccountView.tsx +60 -0
  444. package/skills/wix-headless-templates/members/project/src/components/members/LoginForm.tsx +165 -0
  445. package/skills/wix-headless-templates/members/project/src/components/members/MemberMenu.tsx +78 -0
  446. package/skills/wix-headless-templates/members/project/src/components/members/RequireAuth.tsx +47 -0
  447. package/skills/wix-headless-templates/members/project/src/hooks/members/useMember.ts +67 -0
  448. package/skills/wix-headless-templates/members/project/src/layouts/Layout.astro +22 -0
  449. package/skills/wix-headless-templates/members/project/src/layouts/SiteLayout.astro +42 -0
  450. package/skills/wix-headless-templates/members/project/src/pages/account.astro +9 -0
  451. package/skills/wix-headless-templates/members/project/src/pages/index.astro +8 -0
  452. package/skills/wix-headless-templates/members/project/src/pages/login.astro +11 -0
  453. package/skills/wix-headless-templates/members/project/src/styles/global.css +57 -0
  454. package/skills/wix-headless-templates/members/project/src/wix/config.ts +16 -0
  455. package/skills/wix-headless-templates/members/project/src/wix/media.ts +106 -0
  456. package/skills/wix-headless-templates/members/project/src/wix/members/auth-core.ts +160 -0
  457. package/skills/wix-headless-templates/members/project/src/wix/members/auth.ts +117 -0
  458. package/skills/wix-headless-templates/members/project/src/wix/members/client.ts +27 -0
  459. package/skills/wix-headless-templates/members/project/src/wix/members/member-store.ts +133 -0
  460. package/skills/wix-headless-templates/members/project/src/wix/members/members-core.ts +43 -0
  461. package/skills/wix-headless-templates/members/project/src/wix/members/members.ts +29 -0
  462. package/skills/wix-headless-templates/members/project/src/wix/members/types.ts +21 -0
  463. package/skills/wix-headless-templates/members/project/src/wix/money.ts +24 -0
  464. package/skills/wix-headless-templates/members/project/src/wix/sdk.ts +89 -0
  465. package/skills/wix-headless-templates/members/project/tsconfig.json +5 -0
  466. package/skills/wix-headless-templates/members/rest/auth.ts +224 -0
  467. package/skills/wix-headless-templates/members/rest/members.ts +26 -0
  468. package/skills/wix-headless-templates/members/seed/SEED.md +39 -0
  469. package/skills/wix-headless-templates/members/seed/read-site.mjs +15 -0
  470. package/skills/wix-headless-templates/members/seed/seed-members.mjs +91 -0
  471. package/skills/wix-headless-templates/portfolio/INSTRUCTIONS.md +315 -0
  472. package/skills/wix-headless-templates/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
  473. package/skills/wix-headless-templates/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
  474. package/skills/wix-headless-templates/portfolio/app/components/portfolio/GalleryMedia.tsx +35 -0
  475. package/skills/wix-headless-templates/portfolio/app/components/portfolio/ProjectDetailView.tsx +85 -0
  476. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useCollectionProjects.ts +32 -0
  477. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useCollections.ts +21 -0
  478. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useProjectDetail.ts +31 -0
  479. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/collection-projects-store.ts +82 -0
  480. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/collections-store.ts +58 -0
  481. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/portfolio-core.ts +177 -0
  482. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/portfolio.ts +78 -0
  483. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/project-detail-store.ts +81 -0
  484. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/types.ts +55 -0
  485. package/skills/wix-headless-templates/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
  486. package/skills/wix-headless-templates/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
  487. package/skills/wix-headless-templates/portfolio/app-astro/pages/portfolio.astro +21 -0
  488. package/skills/wix-headless-templates/portfolio/app-astro/pages/projects/[slug].astro +29 -0
  489. package/skills/wix-headless-templates/portfolio/project/README.md +15 -0
  490. package/skills/wix-headless-templates/portfolio/project/astro.config.mjs +22 -0
  491. package/skills/wix-headless-templates/portfolio/project/package-lock.json +8760 -0
  492. package/skills/wix-headless-templates/portfolio/project/package.json +37 -0
  493. package/skills/wix-headless-templates/portfolio/project/public/favicon.svg +9 -0
  494. package/skills/wix-headless-templates/portfolio/project/src/assets/astro.svg +1 -0
  495. package/skills/wix-headless-templates/portfolio/project/src/assets/background.svg +1 -0
  496. package/skills/wix-headless-templates/portfolio/project/src/assets/wix.svg +18 -0
  497. package/skills/wix-headless-templates/portfolio/project/src/components/Hero.astro +77 -0
  498. package/skills/wix-headless-templates/portfolio/project/src/components/Welcome.astro +95 -0
  499. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/CollectionProjectsView.tsx +110 -0
  500. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/CollectionsView.tsx +90 -0
  501. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/GalleryMedia.tsx +35 -0
  502. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/ProjectDetailView.tsx +85 -0
  503. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useCollectionProjects.ts +32 -0
  504. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useCollections.ts +21 -0
  505. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useProjectDetail.ts +31 -0
  506. package/skills/wix-headless-templates/portfolio/project/src/layouts/Layout.astro +22 -0
  507. package/skills/wix-headless-templates/portfolio/project/src/layouts/SiteLayout.astro +40 -0
  508. package/skills/wix-headless-templates/portfolio/project/src/pages/index.astro +8 -0
  509. package/skills/wix-headless-templates/portfolio/project/src/pages/portfolio/[slug].astro +30 -0
  510. package/skills/wix-headless-templates/portfolio/project/src/pages/portfolio.astro +21 -0
  511. package/skills/wix-headless-templates/portfolio/project/src/pages/projects/[slug].astro +29 -0
  512. package/skills/wix-headless-templates/portfolio/project/src/styles/global.css +57 -0
  513. package/skills/wix-headless-templates/portfolio/project/src/wix/config.ts +16 -0
  514. package/skills/wix-headless-templates/portfolio/project/src/wix/media.ts +106 -0
  515. package/skills/wix-headless-templates/portfolio/project/src/wix/money.ts +24 -0
  516. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/collection-projects-store.ts +82 -0
  517. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/collections-store.ts +58 -0
  518. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/portfolio-core.ts +177 -0
  519. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/portfolio.ts +78 -0
  520. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/project-detail-store.ts +81 -0
  521. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/types.ts +55 -0
  522. package/skills/wix-headless-templates/portfolio/project/src/wix/sdk.ts +89 -0
  523. package/skills/wix-headless-templates/portfolio/project/tsconfig.json +5 -0
  524. package/skills/wix-headless-templates/portfolio/rest/portfolio.ts +75 -0
  525. package/skills/wix-headless-templates/portfolio/seed/SEED.md +86 -0
  526. package/skills/wix-headless-templates/portfolio/seed/read-site.mjs +20 -0
  527. package/skills/wix-headless-templates/portfolio/seed/seed-portfolio.mjs +253 -0
  528. package/skills/wix-headless-templates/pricing-plans/INSTRUCTIONS.md +376 -0
  529. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +54 -0
  530. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/PlansView.tsx +108 -0
  531. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/RequirePlan.tsx +87 -0
  532. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/SubscribeButton.tsx +41 -0
  533. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlanAccess.ts +31 -0
  534. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +16 -0
  535. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlans.ts +22 -0
  536. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access-core.ts +29 -0
  537. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access-store.ts +92 -0
  538. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access.ts +37 -0
  539. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-purchase-store.ts +54 -0
  540. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans-core.ts +212 -0
  541. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans-store.ts +64 -0
  542. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans.ts +54 -0
  543. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/purchase-core.ts +43 -0
  544. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/purchase.ts +22 -0
  545. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/types.ts +52 -0
  546. package/skills/wix-headless-templates/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
  547. package/skills/wix-headless-templates/pricing-plans/app-astro/pages/plans/[slug].astro +43 -0
  548. package/skills/wix-headless-templates/pricing-plans/app-astro/pages/plans.astro +21 -0
  549. package/skills/wix-headless-templates/pricing-plans/project/README.md +15 -0
  550. package/skills/wix-headless-templates/pricing-plans/project/astro.config.mjs +22 -0
  551. package/skills/wix-headless-templates/pricing-plans/project/package-lock.json +9799 -0
  552. package/skills/wix-headless-templates/pricing-plans/project/package.json +38 -0
  553. package/skills/wix-headless-templates/pricing-plans/project/public/favicon.svg +9 -0
  554. package/skills/wix-headless-templates/pricing-plans/project/src/assets/astro.svg +1 -0
  555. package/skills/wix-headless-templates/pricing-plans/project/src/assets/background.svg +1 -0
  556. package/skills/wix-headless-templates/pricing-plans/project/src/assets/wix.svg +18 -0
  557. package/skills/wix-headless-templates/pricing-plans/project/src/components/Hero.astro +77 -0
  558. package/skills/wix-headless-templates/pricing-plans/project/src/components/Welcome.astro +95 -0
  559. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/PlanDetailView.tsx +54 -0
  560. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/PlansView.tsx +108 -0
  561. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/RequirePlan.tsx +87 -0
  562. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/SubscribeButton.tsx +41 -0
  563. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlanAccess.ts +31 -0
  564. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlanPurchase.ts +16 -0
  565. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlans.ts +22 -0
  566. package/skills/wix-headless-templates/pricing-plans/project/src/layouts/Layout.astro +22 -0
  567. package/skills/wix-headless-templates/pricing-plans/project/src/layouts/SiteLayout.astro +41 -0
  568. package/skills/wix-headless-templates/pricing-plans/project/src/pages/index.astro +8 -0
  569. package/skills/wix-headless-templates/pricing-plans/project/src/pages/plans/[slug].astro +43 -0
  570. package/skills/wix-headless-templates/pricing-plans/project/src/pages/plans.astro +21 -0
  571. package/skills/wix-headless-templates/pricing-plans/project/src/styles/global.css +57 -0
  572. package/skills/wix-headless-templates/pricing-plans/project/src/wix/config.ts +16 -0
  573. package/skills/wix-headless-templates/pricing-plans/project/src/wix/media.ts +106 -0
  574. package/skills/wix-headless-templates/pricing-plans/project/src/wix/money.ts +24 -0
  575. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access-core.ts +29 -0
  576. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access-store.ts +92 -0
  577. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access.ts +37 -0
  578. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-purchase-store.ts +54 -0
  579. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans-core.ts +212 -0
  580. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans-store.ts +64 -0
  581. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans.ts +54 -0
  582. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/purchase-core.ts +43 -0
  583. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/purchase.ts +22 -0
  584. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/types.ts +52 -0
  585. package/skills/wix-headless-templates/pricing-plans/project/src/wix/sdk.ts +89 -0
  586. package/skills/wix-headless-templates/pricing-plans/project/tsconfig.json +5 -0
  587. package/skills/wix-headless-templates/pricing-plans/rest/plan-access.ts +31 -0
  588. package/skills/wix-headless-templates/pricing-plans/rest/plans.ts +58 -0
  589. package/skills/wix-headless-templates/pricing-plans/rest/purchase.ts +20 -0
  590. package/skills/wix-headless-templates/pricing-plans/seed/SEED.md +93 -0
  591. package/skills/wix-headless-templates/pricing-plans/seed/read-site.mjs +22 -0
  592. package/skills/wix-headless-templates/pricing-plans/seed/seed-pricing-plans.mjs +301 -0
  593. package/skills/wix-headless-templates/rentals/INSTRUCTIONS.md +309 -0
  594. package/skills/wix-headless-templates/rentals/app/components/rentals/RentalBookingView.tsx +195 -0
  595. package/skills/wix-headless-templates/rentals/app/components/rentals/RentalsView.tsx +89 -0
  596. package/skills/wix-headless-templates/rentals/app/hooks/rentals/useRentalFlow.ts +31 -0
  597. package/skills/wix-headless-templates/rentals/app/hooks/rentals/useRentals.ts +23 -0
  598. package/skills/wix-headless-templates/rentals/app/wix/rentals/rental-flow-store.ts +283 -0
  599. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals-core.ts +435 -0
  600. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals-store.ts +112 -0
  601. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals.ts +173 -0
  602. package/skills/wix-headless-templates/rentals/app/wix/rentals/types.ts +113 -0
  603. package/skills/wix-headless-templates/rentals/app-astro/layouts/SiteLayout.astro +40 -0
  604. package/skills/wix-headless-templates/rentals/app-astro/pages/rentals/[slug].astro +81 -0
  605. package/skills/wix-headless-templates/rentals/app-astro/pages/rentals.astro +24 -0
  606. package/skills/wix-headless-templates/rentals/project/README.md +15 -0
  607. package/skills/wix-headless-templates/rentals/project/astro.config.mjs +22 -0
  608. package/skills/wix-headless-templates/rentals/project/package-lock.json +10545 -0
  609. package/skills/wix-headless-templates/rentals/project/package.json +40 -0
  610. package/skills/wix-headless-templates/rentals/project/public/favicon.svg +9 -0
  611. package/skills/wix-headless-templates/rentals/project/src/assets/astro.svg +1 -0
  612. package/skills/wix-headless-templates/rentals/project/src/assets/background.svg +1 -0
  613. package/skills/wix-headless-templates/rentals/project/src/assets/wix.svg +18 -0
  614. package/skills/wix-headless-templates/rentals/project/src/components/Hero.astro +77 -0
  615. package/skills/wix-headless-templates/rentals/project/src/components/Welcome.astro +95 -0
  616. package/skills/wix-headless-templates/rentals/project/src/components/rentals/RentalBookingView.tsx +195 -0
  617. package/skills/wix-headless-templates/rentals/project/src/components/rentals/RentalsView.tsx +89 -0
  618. package/skills/wix-headless-templates/rentals/project/src/hooks/rentals/useRentalFlow.ts +31 -0
  619. package/skills/wix-headless-templates/rentals/project/src/hooks/rentals/useRentals.ts +23 -0
  620. package/skills/wix-headless-templates/rentals/project/src/layouts/Layout.astro +22 -0
  621. package/skills/wix-headless-templates/rentals/project/src/layouts/SiteLayout.astro +40 -0
  622. package/skills/wix-headless-templates/rentals/project/src/pages/index.astro +8 -0
  623. package/skills/wix-headless-templates/rentals/project/src/pages/rentals/[slug].astro +81 -0
  624. package/skills/wix-headless-templates/rentals/project/src/pages/rentals.astro +24 -0
  625. package/skills/wix-headless-templates/rentals/project/src/styles/global.css +57 -0
  626. package/skills/wix-headless-templates/rentals/project/src/wix/config.ts +16 -0
  627. package/skills/wix-headless-templates/rentals/project/src/wix/media.ts +106 -0
  628. package/skills/wix-headless-templates/rentals/project/src/wix/money.ts +24 -0
  629. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rental-flow-store.ts +283 -0
  630. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals-core.ts +435 -0
  631. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals-store.ts +112 -0
  632. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals.ts +173 -0
  633. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/types.ts +113 -0
  634. package/skills/wix-headless-templates/rentals/project/src/wix/sdk.ts +89 -0
  635. package/skills/wix-headless-templates/rentals/project/tsconfig.json +5 -0
  636. package/skills/wix-headless-templates/rentals/rest/rentals.ts +153 -0
  637. package/skills/wix-headless-templates/rentals/seed/SEED.md +95 -0
  638. package/skills/wix-headless-templates/rentals/seed/read-site.mjs +34 -0
  639. package/skills/wix-headless-templates/rentals/seed/seed-rentals.mjs +321 -0
  640. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +468 -0
  641. package/skills/wix-headless-templates/restaurants/app/components/restaurants/MenuView.tsx +257 -0
  642. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
  643. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
  644. package/skills/wix-headless-templates/restaurants/app/components/restaurants/ReservationView.tsx +212 -0
  645. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useMenus.ts +34 -0
  646. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +52 -0
  647. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useReservation.ts +49 -0
  648. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu-core.ts +333 -0
  649. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu-store.ts +89 -0
  650. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu.ts +109 -0
  651. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +141 -0
  652. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +287 -0
  653. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +237 -0
  654. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservation-store.ts +279 -0
  655. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservations-core.ts +218 -0
  656. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservations.ts +109 -0
  657. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/time-core.ts +118 -0
  658. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +337 -0
  659. package/skills/wix-headless-templates/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
  660. package/skills/wix-headless-templates/restaurants/app-astro/pages/menu.astro +22 -0
  661. package/skills/wix-headless-templates/restaurants/app-astro/pages/reservations.astro +12 -0
  662. package/skills/wix-headless-templates/restaurants/project/README.md +15 -0
  663. package/skills/wix-headless-templates/restaurants/project/astro.config.mjs +22 -0
  664. package/skills/wix-headless-templates/restaurants/project/package-lock.json +11038 -0
  665. package/skills/wix-headless-templates/restaurants/project/package.json +40 -0
  666. package/skills/wix-headless-templates/restaurants/project/public/favicon.svg +9 -0
  667. package/skills/wix-headless-templates/restaurants/project/src/assets/astro.svg +1 -0
  668. package/skills/wix-headless-templates/restaurants/project/src/assets/background.svg +1 -0
  669. package/skills/wix-headless-templates/restaurants/project/src/assets/wix.svg +18 -0
  670. package/skills/wix-headless-templates/restaurants/project/src/components/Hero.astro +77 -0
  671. package/skills/wix-headless-templates/restaurants/project/src/components/Welcome.astro +95 -0
  672. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/MenuView.tsx +257 -0
  673. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartButton.tsx +26 -0
  674. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +121 -0
  675. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/ReservationView.tsx +212 -0
  676. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useMenus.ts +34 -0
  677. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +52 -0
  678. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useReservation.ts +49 -0
  679. package/skills/wix-headless-templates/restaurants/project/src/layouts/Layout.astro +22 -0
  680. package/skills/wix-headless-templates/restaurants/project/src/layouts/SiteLayout.astro +47 -0
  681. package/skills/wix-headless-templates/restaurants/project/src/pages/index.astro +8 -0
  682. package/skills/wix-headless-templates/restaurants/project/src/pages/menu.astro +22 -0
  683. package/skills/wix-headless-templates/restaurants/project/src/pages/reservations.astro +12 -0
  684. package/skills/wix-headless-templates/restaurants/project/src/styles/global.css +57 -0
  685. package/skills/wix-headless-templates/restaurants/project/src/wix/config.ts +16 -0
  686. package/skills/wix-headless-templates/restaurants/project/src/wix/media.ts +106 -0
  687. package/skills/wix-headless-templates/restaurants/project/src/wix/money.ts +24 -0
  688. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu-core.ts +333 -0
  689. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu-store.ts +89 -0
  690. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu.ts +109 -0
  691. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +141 -0
  692. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +287 -0
  693. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +237 -0
  694. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservation-store.ts +279 -0
  695. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservations-core.ts +218 -0
  696. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservations.ts +109 -0
  697. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/time-core.ts +118 -0
  698. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +337 -0
  699. package/skills/wix-headless-templates/restaurants/project/src/wix/sdk.ts +89 -0
  700. package/skills/wix-headless-templates/restaurants/project/tsconfig.json +5 -0
  701. package/skills/wix-headless-templates/restaurants/rest/menu.ts +96 -0
  702. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +222 -0
  703. package/skills/wix-headless-templates/restaurants/rest/reservations.ts +102 -0
  704. package/skills/wix-headless-templates/restaurants/seed/SEED.md +118 -0
  705. package/skills/wix-headless-templates/restaurants/seed/read-site.mjs +25 -0
  706. package/skills/wix-headless-templates/restaurants/seed/seed-restaurants.mjs +577 -0
  707. package/skills/wix-headless-templates/shared/CONTENT.md +22 -0
  708. package/skills/wix-headless-templates/shared/CUSTOM_OPERATIONS.md +100 -0
  709. package/skills/wix-headless-templates/shared/DESIGN.md +37 -0
  710. package/skills/wix-headless-templates/shared/SUPPLIED-CONTENT.md +27 -0
  711. package/skills/wix-headless-templates/shared/app/styles/global.css +57 -0
  712. package/skills/wix-headless-templates/shared/app/wix/config.ts +16 -0
  713. package/skills/wix-headless-templates/shared/app/wix/media.ts +106 -0
  714. package/skills/wix-headless-templates/shared/app/wix/money.ts +24 -0
  715. package/skills/wix-headless-templates/shared/app/wix/sdk.ts +89 -0
  716. package/skills/wix-headless-templates/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
  717. package/skills/wix-headless-templates/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +69 -0
  718. package/skills/wix-headless-templates/shared/capabilities/site-search/INSTRUCTIONS.md +194 -0
  719. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchBox.tsx +136 -0
  720. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchHit.tsx +50 -0
  721. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchResults.tsx +300 -0
  722. package/skills/wix-headless-templates/shared/capabilities/site-search/app/hooks/site-search/useSearch.ts +31 -0
  723. package/skills/wix-headless-templates/shared/capabilities/site-search/app/hooks/site-search/useSuggest.ts +26 -0
  724. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search-core.ts +520 -0
  725. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search-store.ts +235 -0
  726. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search.ts +80 -0
  727. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/suggest-store.ts +178 -0
  728. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/types.ts +158 -0
  729. package/skills/wix-headless-templates/shared/capabilities/site-search/app-astro/pages/search.astro +33 -0
  730. package/skills/wix-headless-templates/shared/capabilities/site-search/rest/search.ts +82 -0
  731. package/skills/wix-headless-templates/shared/capabilities/site-search/seed/install.mjs +43 -0
  732. package/skills/wix-headless-templates/shared/rest/client.ts +155 -0
  733. package/skills/wix-headless-templates/shared/rest/config.ts +4 -0
  734. package/skills/wix-headless-templates/shared/rest/media.ts +92 -0
  735. package/skills/wix-headless-templates/shared/seed/images.mjs +183 -0
  736. package/skills/wix-headless-templates/shared/seed/read-site.mjs +97 -0
  737. package/skills/wix-headless-templates/shared/seed/site-context.mjs +70 -0
  738. package/skills/wix-headless-templates/shared/seed/site.mjs +48 -0
  739. package/skills/wix-headless-templates/shared/seed/wix-cli.mjs +44 -0
  740. package/skills/wix-headless-templates/storefront/INSTRUCTIONS.md +685 -0
  741. package/skills/wix-headless-templates/storefront/app/components/storefront/CartButton.tsx +26 -0
  742. package/skills/wix-headless-templates/storefront/app/components/storefront/CartDrawer.tsx +239 -0
  743. package/skills/wix-headless-templates/storefront/app/components/storefront/FilterPanel.tsx +267 -0
  744. package/skills/wix-headless-templates/storefront/app/components/storefront/OptionPicker.tsx +171 -0
  745. package/skills/wix-headless-templates/storefront/app/components/storefront/QuickAdd.tsx +148 -0
  746. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useCart.ts +59 -0
  747. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useProductDetail.ts +42 -0
  748. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useShop.ts +34 -0
  749. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart-core.ts +220 -0
  750. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart-store.ts +134 -0
  751. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart.ts +187 -0
  752. package/skills/wix-headless-templates/storefront/app/wix/storefront/catalog-core.ts +698 -0
  753. package/skills/wix-headless-templates/storefront/app/wix/storefront/catalog.ts +260 -0
  754. package/skills/wix-headless-templates/storefront/app/wix/storefront/product-detail-store.ts +280 -0
  755. package/skills/wix-headless-templates/storefront/app/wix/storefront/shop-store.ts +341 -0
  756. package/skills/wix-headless-templates/storefront/app/wix/storefront/types.ts +305 -0
  757. package/skills/wix-headless-templates/storefront/app-astro/layouts/SiteLayout.astro +65 -0
  758. package/skills/wix-headless-templates/storefront/project/README.md +15 -0
  759. package/skills/wix-headless-templates/storefront/project/astro.config.mjs +22 -0
  760. package/skills/wix-headless-templates/storefront/project/package-lock.json +10786 -0
  761. package/skills/wix-headless-templates/storefront/project/package.json +41 -0
  762. package/skills/wix-headless-templates/storefront/project/public/favicon.svg +9 -0
  763. package/skills/wix-headless-templates/storefront/project/src/assets/astro.svg +1 -0
  764. package/skills/wix-headless-templates/storefront/project/src/assets/background.svg +1 -0
  765. package/skills/wix-headless-templates/storefront/project/src/assets/wix.svg +18 -0
  766. package/skills/wix-headless-templates/storefront/project/src/components/Hero.astro +77 -0
  767. package/skills/wix-headless-templates/storefront/project/src/components/Welcome.astro +95 -0
  768. package/skills/wix-headless-templates/storefront/project/src/components/storefront/CartButton.tsx +26 -0
  769. package/skills/wix-headless-templates/storefront/project/src/components/storefront/CartDrawer.tsx +239 -0
  770. package/skills/wix-headless-templates/storefront/project/src/components/storefront/FilterPanel.tsx +267 -0
  771. package/skills/wix-headless-templates/storefront/project/src/components/storefront/OptionPicker.tsx +171 -0
  772. package/skills/wix-headless-templates/storefront/project/src/components/storefront/QuickAdd.tsx +148 -0
  773. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useCart.ts +59 -0
  774. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useProductDetail.ts +42 -0
  775. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useShop.ts +34 -0
  776. package/skills/wix-headless-templates/storefront/project/src/layouts/Layout.astro +22 -0
  777. package/skills/wix-headless-templates/storefront/project/src/layouts/SiteLayout.astro +65 -0
  778. package/skills/wix-headless-templates/storefront/project/src/pages/index.astro +8 -0
  779. package/skills/wix-headless-templates/storefront/project/src/styles/global.css +57 -0
  780. package/skills/wix-headless-templates/storefront/project/src/wix/config.ts +16 -0
  781. package/skills/wix-headless-templates/storefront/project/src/wix/media.ts +106 -0
  782. package/skills/wix-headless-templates/storefront/project/src/wix/money.ts +24 -0
  783. package/skills/wix-headless-templates/storefront/project/src/wix/sdk.ts +89 -0
  784. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart-core.ts +220 -0
  785. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart-store.ts +134 -0
  786. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart.ts +187 -0
  787. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/catalog-core.ts +698 -0
  788. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/catalog.ts +260 -0
  789. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/product-detail-store.ts +280 -0
  790. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/shop-store.ts +341 -0
  791. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/types.ts +305 -0
  792. package/skills/wix-headless-templates/storefront/project/tsconfig.json +5 -0
  793. package/skills/wix-headless-templates/storefront/rest/cart.ts +183 -0
  794. package/skills/wix-headless-templates/storefront/rest/catalog.ts +267 -0
  795. package/skills/wix-headless-templates/storefront/seed/SEED.md +169 -0
  796. package/skills/wix-headless-templates/storefront/seed/read-site.mjs +38 -0
  797. package/skills/wix-headless-templates/storefront/seed/seed-store.mjs +839 -0
  798. package/skills/wix-manage/SKILL.md +11 -7
  799. package/skills/wix-manage/references/bookings/end-to-end-booking-flow.md +1 -1
  800. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +206 -0
  801. package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +17 -24
  802. package/skills/wix-manage/references/sites/create-headless-site.md +2 -0
  803. package/skills/wix-manage/references/sites/upload-static-site.md +262 -171
  804. package/skills/wix-manage/references/stores/update-product-with-options.md +1 -1
  805. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_COLLECTION.md +0 -184
  806. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_ROUTER.md +0 -204
  807. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE_SETTINGS.md +0 -44
  808. package/skills/wix-headless/entry/bootstrap.mjs +0 -156
  809. package/skills/wix-headless/entry/skill.md +0 -78
  810. package/skills/wix-headless-kit/cold-start/bootstrap.mjs +0 -156
  811. package/skills/wix-headless-kit/cold-start/cold-start.md +0 -111
  812. package/skills/wix-manage/references/bookings/booking-system-integration-gaps.md +0 -423
@@ -0,0 +1,685 @@
1
+ # Storefront — playbook
2
+
3
+ The commerce machinery ships as files — data layer, hooks, cart, checkout, SEO plumbing,
4
+ typed end-to-end. **The presentation doesn't ship — you build it** on the shipped hooks/DTOs:
5
+ the shop, category, and product (PDP) pages with their islands, the home page, and the brand.
6
+ The skeletons below carry each page's contract — including the SSR and SEO machinery, which must
7
+ be exact. You never write commerce code; you never skip designing the store.
8
+
9
+ ## The file map (deployed into `src/`)
10
+
11
+ **On Astro and React the shipped files are tested and work as they are** — this table and the
12
+ contracts below are everything you need to use them, so don't spend the run reading their source;
13
+ wire them and build your surfaces. Reading them is the right move when something is off (a runtime
14
+ error, a field this playbook doesn't cover) or when the brief wants a behaviour they don't offer —
15
+ then read the file that owns it and change or extend it. On `lib`, `static`, and a port the
16
+ components don't deploy at all, and each wiring section below opens with the files to read before
17
+ writing their equivalents. Files you edit: `SiteLayout.astro` and `styles/global.css`.
18
+ Files you **create** (skeletons below): the shop, category, and PDP pages with their island
19
+ components, plus your home page.
20
+
21
+ | file | what it is |
22
+ |---|---|
23
+ | `wix/config.ts` · `wix/sdk.ts` | shared auth seam (deploy configures it — nothing to set by hand) |
24
+ | `wix/media.ts` · `wix/money.ts` | `imgAttrs(url, sizes)` — every `<img>` attribute for a DTO image (`src`, `srcSet`, `sizes`, lazy): `<img {...imgAttrs(p.imageUrl, "25vw")} alt={p.name} />`; `imgSrc()` / `imgSrcSet()` / `formatMoney()` underneath, already used by everything shipped |
25
+ | `wix/storefront/types.ts` | the DTOs (`ProductSummary`, `ProductDetail`, `Cart`, `Category`, `Facet`, `SubscriptionPlan`) — contracts inlined below |
26
+ | `wix/storefront/catalog.ts` | `searchCatalog` (sort/filter/facets/search + cursor paging + result count, all server-side), `fetchFacets` / `fetchFacetData` (from search aggregations — the whole catalog, not a sample), `fetchProducts`, `fetchProductsByCategory`, `fetchProductBySlug`, `fetchCategories`, `fetchCategoryBySlug`, `fetchAllProductsCategoryId`, `fetchInventory` (stock left / pre-order per variant), `fetchBackInStockEnabled` + `requestBackInStock` (notify me), `resolveVariant`, `choiceAvailability` — the transport; the rules and DTO mappers are in `catalog-core.ts` / `cart-core.ts` beside it (shared with the REST layer) |
27
+ | `wix/storefront/cart.ts` · `cart-store.ts` | Cart V2 (add / quantity / remove / coupon / note / checkout; totals from the cart estimate) + shared cart state (module store — spans Astro islands) |
28
+ | `wix/storefront/shop-store.ts` · `product-detail-store.ts` | the listing and product-detail state machines, framework-free (`createShopStore()`, `createProductDetailStore()` — `getState`/`subscribe` + actions, one instance per surface); the hooks below bind them to React, every other stack uses them directly |
29
+ | `hooks/storefront/useCart.ts` | cart state + actions — contract below |
30
+ | `hooks/storefront/useShop.ts` | React binding of `shop-store.ts`: category scope, sort, filters, option facets, result count, paging — contract below |
31
+ | `hooks/storefront/useProductDetail.ts` | React binding of `product-detail-store.ts`: option selection → variant resolution → add-to-cart — contract below |
32
+ | `components/storefront/CartButton.tsx` · `CartDrawer.tsx` | header badge + slide-over cart (lines with struck discounted prices and stock caps, promo code, note to seller, the totals breakdown, checkout) — **wire as-is** (drawer once per page) |
33
+ | `components/storefront/FilterPanel.tsx` | the gallery's filter LAYOUT — toolbar (result count, sort), active chips, then a 16rem sidebar of collapsible groups (price as a two-handle slider bounded by the catalog's real prices, availability, one group per facet — an option or a choice modifier — with swatches/pills) beside YOUR results; a bottom sheet under `md` — **wire as-is** in your `ShopView`, your grid as its children: `<FilterPanel shop={shop}>…grid…</FilterPanel>` |
34
+ | `components/storefront/QuickAdd.tsx` | the tile's purchase control — one click for a product with no options, a picker anchored to the tile (bottom sheet on small screens) for one with options, the product page for free-text customization or a subscription plan — **wire as-is** as the last row of every tile's text block (`<QuickAdd product={p} />`) |
35
+ | `components/storefront/OptionPicker.tsx` | the purchase controls for one product — option groups (swatches/pills, choices unavailable with the current picks disabled), choice and text modifiers (with the merchant's character limit), the plan picker of a subscription product, an optional quantity stepper capped at the stock left ("Only N left"), the buy button gated by `useProductDetail` with its plain reason, "Pre-order" with the merchant's note when pre-orderable, "notify me" when sold out and the merchant collects requests — **wire as-is** in your PDP (`<OptionPicker detail={d} showQuantity />`); QuickAdd's picker is this same component |
36
+ | `components/storefront/ShopView.tsx` · `ProductDetailView.tsx` | **don't ship — YOU create them** (skeletons below): the client islands your shop, category, and PDP pages mount |
37
+ | `styles/global.css` | **the design system**: Tailwind v4 + the `@theme` token block (colors, radii, fonts — same token family as the official Wix templates). Everything, shipped and yours, styles from these tokens |
38
+
39
+ Astro stack additionally gets:
40
+
41
+ | file | what it is |
42
+ |---|---|
43
+ | `layouts/SiteLayout.astro` | the site chrome — **yours to brand**: header, footer, nav. Keep the `<slot name="seo-tags" />`, the global.css import, and the CartButton/CartDrawer mounts |
44
+ | `pages/shop.astro` · `pages/category/[slug].astro` · `pages/products/[slug].astro` | **don't ship — YOU create them** (skeletons below): thin SSR pages that fetch server-side and mount your islands; the category and PDP pages carry the owner-editable SEO machinery, exactly as their skeletons show |
45
+
46
+ ## What you build — this is the design job, not optional polish
47
+
48
+ You implement **three surfaces yourself** — each an SSR page plus its island, per the
49
+ skeletons below — styled with Tailwind utilities on the `@theme` tokens, designed to fit the
50
+ brief (the business, the tone, the audience — a toy brand and a jewelry house should not get
51
+ the same store):
52
+
53
+ 1. **The shop page + `ShopView`** (skeletons below) — category links, the shipped
54
+ `FilterPanel`, and your grid of your tiles: image treatment, badges, price/sale
55
+ presentation, hover behavior, grid rhythm (columns, density, maybe an editorial featured
56
+ tile), each tile carrying the shipped `QuickAdd`. `products === null` → skeleton tiles,
57
+ `[]` → an honest empty state. Decompose into `ProductCard`/`ProductGrid` files if you like —
58
+ your call, nothing prescribes it. **The category page** (`/category/[slug]`) mounts the same
59
+ `ShopView` scoped to one category — one island, two pages.
60
+ 2. **The PDP page + `ProductDetailView`** (skeletons below) — gallery, price/sale,
61
+ description, your option-selection UI (color options = real swatches), quantity,
62
+ add-to-cart — on `useProductDetail`, which owns ALL selection/variant logic; you own how it
63
+ looks. This is the surface that most often looks generic — make the layout the brand's: an
64
+ editorial split, a sticky buy column, a full-bleed gallery.
65
+ 3. **The home page** — hero, featured products (fetch in frontmatter → your grid), brand story.
66
+
67
+ Plus the **theme** (edit the `@theme` block in `styles/global.css` — one edit; a dark brand is
68
+ flipped token values; add brand fonts as extra tokens) and the **chrome** (header/footer in
69
+ `SiteLayout.astro`, one edit pass; mount the shipped `CartButton` in your header).
70
+
71
+ ### What a complete storefront shows (recommended defaults)
72
+
73
+ These are the recommended defaults for a store whose brief says nothing about them. They are
74
+ not requirements: when the user's prompt asks for something different — a cart page instead of a
75
+ drawer, no shop page, a particular layout or look — the prompt wins, and the item here that
76
+ conflicts with it is dropped without discussion. Look at the catalog before designing (categories,
77
+ assortment size, media, options, sales, ribbons) and design for this store, not for a stereotype
78
+ of its category. Then, by default:
79
+
80
+ - **Home:** what the store sells and one shopping action in the first screen; real products under
81
+ truthful headings ("Best Sellers" needs data behind it); not a repeat of the shop page. A
82
+ category tile or link on the home page goes to that category's page (`/category/<slug>`) —
83
+ never to an anchor on the shop page that every tile shares — and its image is a product from
84
+ THAT category (fetched with the category filter) or the category's own image, never a
85
+ positional guess into the all-products list.
86
+ - **Shop:** a real product card — image, name, price, link — in the first screen; the shipped
87
+ `FilterPanel` around the grid (toolbar, then a filter sidebar beside the results on desktop and
88
+ a sheet on phones) — a store with any filterable catalog ships it, not "when it fits"; the
89
+ shipped `QuickAdd` as the last row of every tile; each
90
+ category reachable by a real link (`/category/<slug>`) — from the nav, the home page, or the
91
+ shop's category row; loading, empty, no-results, and error states that look different.
92
+ - **Product page:** image, name, price, the first choice, and the buy button with `blockedReason`
93
+ in the first screen **at 390px wide too** — on a phone the image is a bounded band
94
+ (`max-h-[45vh]`), not a full-screen hero that pushes the price below the fold; every ribbon;
95
+ every image reachable in the gallery; the main image follows the selection (`imageUrl` from the
96
+ store when set, else the gallery's first); breadcrumbs (Home › the category path › the product)
97
+ when the product has a main category.
98
+ - **Cart:** the shipped drawer — it opens after every add, and checkout is a button in it.
99
+ - **Overlays you build** (quick-add, mobile nav, filters): mount at the document root (a fixed
100
+ panel inside the `backdrop-blur` header gets clipped), lock background scroll, close on Escape,
101
+ return focus on close — as the shipped `CartDrawer` does. An anchored picker is positioned
102
+ inside its tile, not `fixed` with computed offsets. If you add dismiss-on-outside-click, decide
103
+ inside/outside before anything re-renders (a capture-phase listener), or a click on a swatch
104
+ that re-renders the panel reads as "outside" and closes it.
105
+ - **A page whose slug resolves to nothing** (category, product) shows only the not-found state —
106
+ no heading, toolbar, or empty grid rendered around it.
107
+ - **Copy:** nothing the merchant didn't supply — no invented reviews, scarcity, or delivery
108
+ promises; no Wix IDs or technical words in visible text.
109
+
110
+ Pre-order (`isPreorder`, the merchant's note), subscription plans (the picker), stock left, and
111
+ notify-me ship in the components and show only when the catalog has them. Product groups and
112
+ promotions are built only when the catalog has them — never fabricated; `wix-docs` has their
113
+ contracts.
114
+
115
+ ### The contracts your components consume (everything you need — don't read the source)
116
+
117
+ ```ts
118
+ // ProductSummary (grid tiles) — all display-ready: prices formatted, images https URLs:
119
+ // { id, slug, name, price, maxPrice, fromPrice: boolean, compareAtPrice|null,
120
+ // discountNames: string[] /* automatic discount rule names — under the price */,
121
+ // pricePerUnit: string|null /* "€2.50 / 100 g" as Wix formats it */,
122
+ // ribbon|null, ribbons: string[], minPriceVariantId|null,
123
+ // availability: "IN_STOCK"|"OUT_OF_STOCK"|"PARTIALLY_OUT_OF_STOCK", preorder: boolean,
124
+ // hasSubscriptions: boolean, imageUrl, hoverImageUrl, optionsSummary /* "2 colors · 3 sizes" */,
125
+ // swatches: string[] /* hex colors of a color option's choices — dots on the tile, not a picker */,
126
+ // quickAddable: boolean }
127
+ // fromPrice → render "From {price}" (the cheapest variant is discounted and variants differ in
128
+ // price: the discounted top is only known on the PDP; maxPrice equals price then). Else
129
+ // price !== maxPrice → the product is a RANGE: render "price – maxPrice" (compareAtPrice is null
130
+ // then — never a struck price beside a range). Otherwise price is what the buyer pays (a discount
131
+ // already applied) and compareAtPrice, when present, is the labelled "was".
132
+ // ribbons = EVERY merchant ribbon, primary first — render all, one shared style; a ribbon is a
133
+ // label, never proof of a discount. The tile's buy control is the shipped <QuickAdd product={p} />:
134
+ // it reads quickAddable / minPriceVariantId / preorder / hasSubscriptions itself and routes to a
135
+ // direct add, an anchored option picker, or the product page — don't rebuild that decision in the tile.
136
+
137
+ // useShop({ initialProducts?, initialCategories?, initialCategoryId?, pageSize? /* 24 */ }) →
138
+ // { products: ProductSummary[]|null /* null = first load → skeletons; during a later change the
139
+ // previous page stays here with loading: true — dim it, don't blank it */, total: number|null,
140
+ // categories: Category[], activeCategoryId: string|null, setActiveCategoryId(id|null),
141
+ // sort: keyof SORTS, setSort(sort), filters, setFilters({ minPrice?, maxPrice?, inStockOnly?, search? }),
142
+ // facets: Facet[], priceRange: { min, max }|null, selectedChoiceIds, toggleChoice(choiceId),
143
+ // clearFilters(), hasActiveFilters, loading, error, retry(), hasMore, loadMore(), loadingMore }
144
+ // Category = { id, slug, name, description, imageUrl /* "" when none */, parentId: string|null,
145
+ // index /* order among siblings */, productCount: number|null, breadcrumbs: [{ id, name, slug }]
146
+ // /* ancestors — filled by fetchCategoryBySlug only */ }.
147
+ // Facet = { id, name, kind: "option"|"modifier", isColor,
148
+ // choices: [{ id, name, colorCode|null, count /* products carrying it */, childIds: string[] }] }.
149
+ // The shipped <FilterPanel shop={shop}>{…your grid…}</FilterPanel> renders total/sort/chips, the
150
+ // filter sidebar (md+) or sheet, and lays your results out beside it — hand it the whole hook result
151
+ // and put your grid + states inside it; don't build a second filter UI or a second sort control. Categories are LINKS (`/category/${c.slug}`) — a category page is a URL
152
+ // a shopper can share and a search engine can index; setActiveCategoryId is for a live scope
153
+ // switch on /shop, not a substitute for the links.
154
+ // Sort/filter/facets/search/paging run on Wix across the WHOLE catalog (a change restarts the list).
155
+ // Facet picks OR inside one facet and AND across facets ("Red or Blue, and Large") — the store
156
+ // groups them; you only call toggleChoice(choiceId). The price bounds bracket the product's whole
157
+ // range (its cheapest variant at least min, its dearest at most max).
158
+ // The selection is mirrored into the query string (?sort=&min=&max=&stock=1&q=&choice=…) and read
159
+ // back on load — a filtered gallery is a shareable link; nothing for you to wire.
160
+ // SORTS (exported next to useShop) is Record<sortKey, { label: string }> — the value is an
161
+ // OBJECT, so render entry.label, never the entry itself:
162
+ // Object.entries(SORTS).map(([key, { label }]) => <option value={key}>{label}</option>)
163
+ // hasMore → render a "load more" control calling loadMore() (disabled while loadingMore).
164
+
165
+ // useProductDetail({ initial? /* SSR */, slug? /* SPA */ }) →
166
+ // { product: ProductDetail|null, notFound,
167
+ // optionGroups: [{ id, key, name, isColor, choices: [{ choiceId, key, name, colorCode|null, imageUrl|null,
168
+ // inStock /* buyable WITH the other picks */, exists /* some variant has this combination */, selected }] }],
169
+ // selectOption(optionId, choiceId), // by ids (option.id, choice.choiceId), never by name
170
+ // imageUrl, // the picked choice's own photo (last pick wins), else the variant's; null → keep the
171
+ // // gallery's main image. Render it AS the main image so a colour pick swaps the photo
172
+ // modifierValues, setModifier(key, value), // product.modifiers: pills or a text input; "*" = mandatory;
173
+ // // a text modifier carries title, maxChars|null, minChars|null
174
+ // plans: [{ id, name, description, terms /* "every 2 months · 6 payments" */, price /* this variant's, "" until resolved */, selected }],
175
+ // subscriptionPlanId, selectPlan(planId | ONE_TIME_PLAN), // only for a product with plans; product.allowOneTimePurchase → offer ONE_TIME_PLAN too
176
+ // price, compareAtPrice, pricePerUnit, // the RANGE ("From …" when fromPrice) until every option is picked, then the
177
+ // // variant's price (+ labelled "was" when real), or its price on the picked plan
178
+ // isPreorder, preorderMessage, // resolved variant is out of stock but pre-orderable → label the action "Pre-order", show the note
179
+ // remaining, maxQuantity, // units left when counted (null otherwise); the stepper's ceiling (99999 when uncounted)
180
+ // canAdd, // gate the button; false until every option picked & in stock (or pre-orderable) & plan picked
181
+ // blockedReason, // "Choose Size" / "Out of stock" / "Add Engraving" / "Choose a plan" — render beside the
182
+ // // button as neutral guidance (not error styling) while it's disabled; null when addable
183
+ // quantity, setQuantity /* clamped to [1, maxQuantity] */, add(), adding, error, // quantity resets to 1 when an option changes
184
+ // canNotify, notify(email), notifying, notifyResult /* "created"|"already-subscribed"|null */, notifyError }
185
+ // ProductDetail adds: descriptionHtml (render as HTML), infoSections: [{ title, html }] (sections
186
+ // or accordions), gallery: string[] (urls, main first), breadcrumbs: [{ id, name, slug }] (the path
187
+ // to the main category, top-level first), categoryIds, options, modifiers, variants (each with
188
+ // choiceIds, sku, pricePerUnit, subscriptionPrices, quantity, preorderMessage), subscriptions:
189
+ // SubscriptionPlan[], allowOneTimePurchase — but selection ALWAYS goes through the hook above.
190
+
191
+ // useCart() →
192
+ // { cart: { lines, itemCount, subtotal, discount /* "" when none */, discounts: [{ name, amount }],
193
+ // fees: [{ name, amount }], taxes: [{ name, amount }], pricesIncludeTax, total /* before shipping */,
194
+ // coupon: { id, code }|null, note, currency }|null,
195
+ // busy /* the DRAWER's flag: any cart operation in flight */, pendingProductId /* the product whose add
196
+ // is in flight, else null — a card's add control disables on THIS, never on busy */, error, open,
197
+ // // a line: { lineItemId, productName, quantity, unitPrice, linePrice, compareAtLinePrice|null,
198
+ // // availableQuantity|null /* the stepper's cap */, imageUrl, productUrl, descriptionLines,
199
+ // // status /* IN_STOCK | PARTIALLY_IN_STOCK | OUT_OF_STOCK | REMOVED_FROM_CATALOG */,
200
+ // // subscription /* "Monthly plan · every month · 12 payments" or "" */ }
201
+ // addToCart(productId, variantId?, qty?, extras?), updateQuantity(lineItemId, qty),
202
+ // removeLine(lineItemId), applyCoupon(code), removeCoupon(), setNote(text) /* on blur */,
203
+ // checkout(), openCart(), closeCart(), refresh() }
204
+ // addToCart rejects on refusal (out of stock, digital product with no file) AND records
205
+ // .error, opening the drawer either way — so render .error in whatever surface you build for
206
+ // the cart, and never chain checkout() onto an add without awaiting it successfully. applyCoupon
207
+ // rejects with buyer copy for an unknown / expired / inapplicable code (also in .error).
208
+ ```
209
+
210
+ ### The pages and islands you create — skeletons
211
+
212
+ The class names in these skeletons are the Astro/React spelling of layout rules that hold on
213
+ every stack, and each rule is also named in words beside its classes. On a stack where the shipped
214
+ components don't deploy (`lib`, `static`, a port), keep the rule and write it in your own CSS.
215
+
216
+ Nothing renders until you write these — the store IS your work. Each page is a thin SSR shell
217
+ (fetch → DTO props → island); each island is a thin view over a hook. The pages' frontmatter
218
+ is **machinery, not design** — reproduce it as the skeletons show, exactly. Hooks first,
219
+ branches after (an early return above a hook changes hook order between renders and React
220
+ throws). The islands render on the server too (`client:load` SSRs), and by then the 200 and
221
+ headers are already sent — a render throw truncates the body mid-stream and surfaces to the
222
+ visitor as `ERR_HTTP2_PROTOCOL_ERROR`, not an error page. Render every state totally; nothing
223
+ in a render path may throw.
224
+
225
+ ```astro
226
+ ---
227
+ // src/pages/shop.astro — YOU create it. Products and categories are fetched SERVER-SIDE
228
+ // (SEO: view-source shows product names) and handed to the island as serialized DTO props;
229
+ // category switches then filter live on the client.
230
+ import SiteLayout from "../layouts/SiteLayout.astro";
231
+ import ShopView from "../components/storefront/ShopView";
232
+ import { fetchProducts, fetchCategories } from "../wix/storefront/catalog";
233
+ import type { Category, ProductSummary } from "../wix/storefront/types";
234
+
235
+ let products: ProductSummary[] = [];
236
+ let categories: Category[] = [];
237
+ try {
238
+ [products, categories] = await Promise.all([fetchProducts({ limit: 24 }), fetchCategories()]);
239
+ } catch {
240
+ // Guarded: an unhandled SSR throw truncates the response mid-stream; the island
241
+ // renders your empty state instead.
242
+ }
243
+ ---
244
+ <SiteLayout title="Shop">
245
+ <!-- your page heading / intro, then: -->
246
+ <ShopView client:load initialProducts={products} initialCategories={categories} />
247
+ </SiteLayout>
248
+ ```
249
+
250
+ ```astro
251
+ ---
252
+ // src/pages/category/[slug].astro — YOU create it. A category is a Wix ITEM PAGE like a product:
253
+ // its own URL, its SEO owner-editable in the dashboard, registered in the sitemap. Same SEO
254
+ // machinery as the PDP with the CATEGORY identifiers. It mounts the SAME ShopView, scoped.
255
+ import SiteLayout from "../../layouts/SiteLayout.astro";
256
+ import ShopView from "../../components/storefront/ShopView";
257
+ import { fetchCategoryBySlug, fetchProductsByCategory, fetchCategories } from "../../wix/storefront/catalog";
258
+ import type { Category, ProductSummary } from "../../wix/storefront/types";
259
+ import { WIX_APPS } from "@wix/essentials";
260
+ import { SEO } from "@wix/seo/components";
261
+ import { loadSEOTagsServiceConfig } from "@wix/seo/services";
262
+ import { seoTags } from "@wix/seo";
263
+
264
+ export const wixMetadata = {
265
+ appDefId: WIX_APPS.checkoutAndOrders.id,
266
+ pageIdentifier: WIX_APPS.checkoutAndOrders.categoryPageMetadata.pageIdentifier,
267
+ identifiers: { slug: WIX_APPS.checkoutAndOrders.categoryPageMetadata.identifiers.handle },
268
+ };
269
+
270
+ const slug = Astro.params.slug!;
271
+ const forwardedUrl = Astro.request.headers.get("x-wix-forwarded-url");
272
+ const pageUrl =
273
+ forwardedUrl && URL.canParse(forwardedUrl) && /^https?:$/.test(new URL(forwardedUrl).protocol)
274
+ ? forwardedUrl
275
+ : Astro.url.href;
276
+
277
+ let category: Category | null = null;
278
+ let products: ProductSummary[] = [];
279
+ let categories: Category[] = [];
280
+ let seoTagsServiceConfig = null;
281
+ try {
282
+ category = await fetchCategoryBySlug(slug);
283
+ if (category) {
284
+ // A sub-category is its own SEO item type (the owner's settings differ per type).
285
+ const itemType = category.parentId ? seoTags.ItemType.STORES_SUB_CATEGORY : seoTags.ItemType.STORES_CATEGORY;
286
+ [products, categories, seoTagsServiceConfig] = await Promise.all([
287
+ fetchProductsByCategory(category.id, { limit: 24 }),
288
+ fetchCategories(),
289
+ loadSEOTagsServiceConfig({ pageUrl, itemType, itemData: { slug } }),
290
+ ]);
291
+ }
292
+ } catch {
293
+ // Guarded: an unhandled SSR throw truncates the response mid-stream.
294
+ }
295
+
296
+ // A missing or hidden category is a real 404 — never a fallback to all products.
297
+ if (!category) {
298
+ return new Response(null, { status: 404 });
299
+ }
300
+ ---
301
+ <SiteLayout title={category.name}>
302
+ <SEO.Tags seoTagsServiceConfig={seoTagsServiceConfig} slot="seo-tags" />
303
+ <!-- your heading: category.breadcrumbs as links (Home › each ancestor → `/category/${b.slug}`) when
304
+ it has any, category.name, category.description when present, category.imageUrl as a banner
305
+ when it fits the design, then: -->
306
+ <ShopView client:load initialProducts={products} initialCategories={categories} initialCategoryId={category.id} />
307
+ </SiteLayout>
308
+ ```
309
+
310
+ ```astro
311
+ ---
312
+ // src/pages/products/[slug].astro — YOU create it. This is a Wix ITEM PAGE: the wixMetadata
313
+ // export + <SEO.Tags> are what let the site owner edit this page's title/description/OG in
314
+ // the dashboard and register the route in the sitemap. All three SEO pieces are REQUIRED,
315
+ // exactly as here.
316
+ import SiteLayout from "../../layouts/SiteLayout.astro";
317
+ import ProductDetailView from "../../components/storefront/ProductDetailView";
318
+ import { fetchProductBySlug } from "../../wix/storefront/catalog";
319
+ import { WIX_APPS } from "@wix/essentials";
320
+ import { SEO } from "@wix/seo/components";
321
+ import { loadSEOTagsServiceConfig } from "@wix/seo/services";
322
+ import { seoTags } from "@wix/seo";
323
+
324
+ export const wixMetadata = {
325
+ appDefId: WIX_APPS.checkoutAndOrders.id,
326
+ pageIdentifier: WIX_APPS.checkoutAndOrders.productPageMetadata.pageIdentifier,
327
+ identifiers: { slug: WIX_APPS.checkoutAndOrders.productPageMetadata.identifiers.handle },
328
+ };
329
+
330
+ const slug = Astro.params.slug!;
331
+
332
+ // Behind Wix's proxy the request URL is the internal one — the real public page URL arrives
333
+ // on x-wix-forwarded-url, and the SEO service needs the public one.
334
+ const forwardedUrl = Astro.request.headers.get("x-wix-forwarded-url");
335
+ const pageUrl =
336
+ forwardedUrl && URL.canParse(forwardedUrl) && /^https?:$/.test(new URL(forwardedUrl).protocol)
337
+ ? forwardedUrl
338
+ : Astro.url.href;
339
+
340
+ let product = null;
341
+ let seoTagsServiceConfig = null;
342
+ try {
343
+ [product, seoTagsServiceConfig] = await Promise.all([
344
+ fetchProductBySlug(slug),
345
+ loadSEOTagsServiceConfig({
346
+ pageUrl,
347
+ itemType: seoTags.ItemType.STORES_PRODUCT,
348
+ itemData: { slug },
349
+ }),
350
+ ]);
351
+ } catch {
352
+ // Guarded: an unhandled SSR throw truncates the response mid-stream.
353
+ }
354
+
355
+ if (!product) {
356
+ return new Response(null, { status: 404 });
357
+ }
358
+ ---
359
+ <SiteLayout title={product.name}>
360
+ <SEO.Tags seoTagsServiceConfig={seoTagsServiceConfig} slot="seo-tags" />
361
+ <ProductDetailView client:load initial={product} />
362
+ </SiteLayout>
363
+ ```
364
+
365
+ ```tsx
366
+ // src/components/storefront/ShopView.tsx — YOU build it; shop.astro AND category/[slug].astro mount it.
367
+ import { useShop } from "../../hooks/storefront/useShop";
368
+ import FilterPanel from "./FilterPanel";
369
+ import QuickAdd from "./QuickAdd";
370
+ import { imgAttrs } from "../../wix/media";
371
+ import type { Category, ProductSummary } from "../../wix/storefront/types";
372
+
373
+ export default function ShopView(props: {
374
+ initialProducts?: ProductSummary[]; // SSR props from your page — pass straight to useShop;
375
+ initialCategories?: Category[]; // omitted in a SPA (client fetch)
376
+ initialCategoryId?: string | null; // the category page passes its category's id
377
+ }) {
378
+ const shop = useShop(props);
379
+ const { products, categories, activeCategoryId, loading, error } = shop;
380
+ // …you implement the render:
381
+ // • a category row when categories.length > 1: LINKS to `/category/${c.slug}` (plus "All" →
382
+ // /shop), the active one marked by activeCategoryId — real URLs, not only pills that
383
+ // swap state (setActiveCategoryId is fine for an additional live switch on /shop).
384
+ // Categories carry parentId / index: on /shop show the top-level ones (parentId === null);
385
+ // on a category page show its children when it has any (plus "Shop all" = itself), else
386
+ // its siblings — sorted by index, then name
387
+ // • <FilterPanel shop={shop}> … </FilterPanel> WRAPS your results — shipped: the toolbar
388
+ // (result count, sort), active chips, a filter sidebar on md+ (price slider, availability,
389
+ // the option facets, collapsible) beside your grid, a sheet under md. Your loading / empty /
390
+ // error states and your grid go inside it as children. Always mounted; it shows only the
391
+ // facets this catalog actually has. No sort control or filter UI of your own.
392
+ // • error → a short inline message (retry() re-runs the query)
393
+ // • products === null → skeleton tiles; loading with products present (a sort or filter
394
+ // change) → keep the grid and dim it (opacity, aria-busy), never blank it; [] → your honest
395
+ // empty state, and a distinct "no products match these filters" with clearFilters() when
396
+ // hasActiveFilters
397
+ // • else YOUR grid of YOUR tiles (ProductSummary contract above): image via
398
+ // <img {...imgAttrs(p.imageUrl, "(min-width: 768px) 25vw, 50vw")} alt={p.name} /> — src,
399
+ // srcSet, sizes and lazy loading in one spread, so a tile never ships srcSet without src;
400
+ // an empty imageUrl gives {} — render your placeholder then; hoverImageUrl
401
+ // on hover — name, price — "From {price}" when fromPrice, else a range when
402
+ // price !== maxPrice, else price + labelled compareAtPrice; discountNames under the price
403
+ // when present ("Summer sale"), pricePerUnit beside it when present — EVERY ribbon from ribbons,
404
+ // swatches as small color dots when present (else optionsSummary as text); tile links to
405
+ // `/products/${p.slug}`; and <QuickAdd product={p} /> as the LAST ROW of the tile's text
406
+ // block, under name and price, full width — the shipped buy control (direct add / option
407
+ // picker / product page, decided from the product). It is a direct child of the tile root,
408
+ // which carries `relative`: the picker anchors to that root and takes the tile's width.
409
+ // THE TILE ROOT IS A <div className="relative flex flex-col">, NOT THE LINK: the <a> wraps
410
+ // the image and the name/price, and <QuickAdd> sits beside it as the flex column's last child
411
+ // (it pins itself to the bottom with mt-auto). A button inside an <a> is invalid HTML and its
412
+ // click navigates to the product page instead of adding.
413
+ // • ROW RHYTHM: the grid stretches every tile in a row to the tallest; with the tile a flex
414
+ // column and the control pinned to the bottom, the buy buttons share one baseline across the
415
+ // row even when one tile has swatches, a struck price, or a two-line name and its neighbours
416
+ // don't. Put the swatches between price and control; never let them push only that tile's
417
+ // button down. Never overlay the control on the image or float it
418
+ // between image and text, and never wrap it in a smaller positioned box (the picker would
419
+ // inherit that box's width).
420
+ // • the name WRAPS (`min-w-0`, `break-words`) — no `truncate` / `line-clamp-1`: a shopper reads
421
+ // "Red Velvet Cupcake 4-Pack", not "Red Velvet Cupc…"; price on its own line under it.
422
+ // • badges come ONLY from p.ribbons. Do NOT render a "Sale" badge because compareAtPrice
423
+ // is set — the struck price already says it, and a product the merchant ribboned "Sale"
424
+ // would show the badge twice.
425
+ // • name and price on SEPARATE lines — never one flex row where a long name and a price
426
+ // range fight for width and the price gets clipped at 390px. Keep the page intro short
427
+ // enough that a full tile (image, name, price) is in the first screen, also on a short
428
+ // desktop window.
429
+ // • hasMore → your "load more" control calling loadMore() (disabled while loadingMore)
430
+ }
431
+ ```
432
+
433
+ ```tsx
434
+ // src/components/storefront/ProductDetailView.tsx — YOU build the whole PDP surface;
435
+ // your [slug].astro mounts it with the server-fetched product.
436
+ import { useProductDetail } from "../../hooks/storefront/useProductDetail";
437
+ import OptionPicker from "./OptionPicker";
438
+ import type { ProductDetail } from "../../wix/storefront/types";
439
+
440
+ export default function ProductDetailView(props: {
441
+ initial?: ProductDetail | null; // SSR (Astro); a SPA passes { slug } instead
442
+ slug?: string;
443
+ }) {
444
+ const d = useProductDetail(props); // full contract above — selection lives HERE
445
+ // …you implement the render. Handle in order:
446
+ // d.notFound → a "doesn't exist (anymore)" message
447
+ // !d.product → a loading placeholder
448
+ // else the product view, laid out for the brand:
449
+ // • gallery from d.product.gallery (urls, main first): show ONE primary
450
+ // image at full size, and the rest as a small thumbnail strip (or a
451
+ // scrollable row) that swaps the primary — never map the whole gallery
452
+ // to full-width images stacked down the column (products with per-color
453
+ // linked media carry several gallery urls, so that stacks big duplicates).
454
+ // A single-image gallery is just the one primary — no empty strip.
455
+ // When d.variant resolves and carries imageUrl, that image becomes the primary (it is
456
+ // one of the gallery urls) — a shopper who picks a color sees that color.
457
+ // • breadcrumbs when d.product.breadcrumbs.length: a <nav aria-label="Breadcrumb"> of
458
+ // Home › each crumb as a link to `/category/${crumb.slug}` › the product name (plain text)
459
+ // • name, EVERY ribbon (d.product.ribbons), live d.price (the range until every option
460
+ // is picked; the plan's price once a plan is picked) with d.compareAtPrice as a labelled
461
+ // "was" when present — never invent one; d.pricePerUnit beside the price when present;
462
+ // d.product.discountNames under it ("Summer sale") when present;
463
+ // descriptionHtml rendered as HTML, then d.product.infoSections as sections/accordions
464
+ // • <OptionPicker detail={d} showQuantity /> right under the price — the shipped option
465
+ // groups (swatches for a color option, choices unavailable with the current picks
466
+ // disabled), modifiers, the plan picker when d.plans.length, quantity capped at the stock
467
+ // left, "Only N left", the buy button gated by the hook with its plain reason, "Pre-order"
468
+ // and the merchant's pre-order note when it applies, "notify me" when sold out and the
469
+ // merchant collects requests, the add error inline. Never resolve variants or gate the
470
+ // button yourself.
471
+ // • in the first screen at mobile AND desktop: the image, name, price, the first choice,
472
+ // and the button with its reason — a shopper decides without scrolling. On a phone that
473
+ // means the primary image is a bounded band, not a full-height hero: e.g. the gallery
474
+ // column `max-h-[45vh] md:max-h-none` with `object-contain`, thumbnails as a row under
475
+ // it, and the two-column split only from md (`md:grid md:grid-cols-2`); description and
476
+ // infoSections come AFTER the buy button, never between the price and the action.
477
+ }
478
+ ```
479
+
480
+ ### The reference files for stacks where the components don't deploy
481
+
482
+ On `lib`, `static`, and a port, nothing under `components/` or `hooks/` arrives. The state
483
+ machines behind the hooks do arrive — `wix/storefront/shop-store.ts`, `product-detail-store.ts`,
484
+ `cart-store.ts` — so you never rewrite them: create a store per surface, `subscribe`, render from
485
+ `getState()`, call its actions. Their `*State` interfaces are the render contract; read those.
486
+ What you write is the rendering — grid, product page, picker, filter panel, drawer — and for that
487
+ read these first; they are tested code for exactly that behaviour, and rewriting them from the
488
+ prose above is where the bugs come from:
489
+
490
+ 1. `components/storefront/QuickAdd.tsx` — the three purchase paths decided from the summary DTO;
491
+ the panel is positioned inside the tile (the tile is `relative`), a bottom sheet on small
492
+ screens, never `fixed` with computed offsets; it closes on Escape, the close button, a
493
+ successful add, or the scrim — there is NO outside-click handler (one that runs after a
494
+ re-render sees the clicked swatch detached and closes on every pick).
495
+ 2. `components/storefront/OptionPicker.tsx` — the purchase controls as working code: swatches vs
496
+ pills, choices unavailable with the current picks disabled, text modifiers with their limit,
497
+ the plan picker, quantity capped at the stock left, the gated button with its reason, the
498
+ "Pre-order" label and note, the notify-me form; the PDP and the tile picker share it.
499
+ 3. `components/storefront/CartDrawer.tsx` — the overlay contract as working code: root-level,
500
+ scrim, scroll lock, Escape, focus in and back — plus the cart's contents: struck discounted
501
+ lines, per-status copy, the stock cap on "+", promo code, note to seller (saved on blur), the
502
+ totals breakdown (subtotal, discounts, fees, taxes unless prices include them, total).
503
+ 4. `components/storefront/FilterPanel.tsx` — inline commits at once, the sheet stages until Apply;
504
+ the price pair commits only when valid.
505
+
506
+ All under `templates/storefront/app/`.
507
+
508
+ ### Wiring — Astro (default)
509
+
510
+ 1. Set the `@theme` tokens (one edit); brand `SiteLayout.astro` (one pass).
511
+ 2. Create the shop, category, and PDP pages and their islands per the skeletons above —
512
+ frontmatter machinery exact, presentation yours. Primary-content islands mount `client:load` with the
513
+ SSR props; browser-state widgets (cart) are `client:only="react"`.
514
+ 3. Write `pages/index.astro` (home) on `SiteLayout`.
515
+
516
+ ### Wiring — another JS framework (`--stack lib`: Vue, Svelte, Solid, plain Vite)
517
+
518
+ Read the reference files listed above before writing any surface.
519
+
520
+ `deploy.mjs storefront --stack lib` put the data layer in `src/wix/` and nothing else: `sdk.ts`
521
+ (the visitor client, configured with the public client id), `media.ts`, `money.ts`, and
522
+ `wix/storefront/` — `catalog.ts`, `cart.ts`, `types.ts`, the `*-core.ts` rules, and the three
523
+ stores `shop-store.ts`, `product-detail-store.ts`, `cart-store.ts`. None of it is React. The
524
+ hooks and components don't ship on this stack; the stores replace the hooks, and you write the
525
+ components in your framework to the contracts on this page:
526
+
527
+ - bind the stores with your framework's external-store primitive (Vue: `shallowRef` updated in
528
+ `subscribe`; Svelte: `readable(store.getState(), (set) => store.subscribe(() => set(store.getState())))`;
529
+ Solid: a signal set in `subscribe`). `createShopStore(options)` per listing (`start()` when
530
+ mounted, `stop()` when unmounted), `createProductDetailStore({ initial | slug })` per product
531
+ surface, the cart store as-is (module-level). State in, actions out — exactly the hooks'
532
+ contracts above;
533
+ - your filter panel, quick add, and cart drawer to the contracts in "What a complete storefront
534
+ shows" — the shipped `FilterPanel.tsx`, `QuickAdd.tsx`, `CartDrawer.tsx` are readable as
535
+ behaviour specs (the overlay contract, the three purchase paths, the sidebar/sheet split).
536
+
537
+ Routes `/shop`, `/category/:slug` (via `fetchCategoryBySlug`, null → your 404), `/products/:slug`;
538
+ dev server on 4321; a static build goes through `npx @wix/cli@latest release` with
539
+ `site.outputDirectory` pointing at the build folder, an SSR build is hosted by you. Item-page tags
540
+ from the entity's `seoData`.
541
+
542
+ ### Wiring — static site (`--stack static`, no bundler)
543
+
544
+ Read the reference files listed above before writing any surface.
545
+
546
+ `deploy.mjs storefront --stack static --out site` put the REST layer in `site/js/wix/` (browser
547
+ ESM, the `.ts` beside each `.js` for reading). Everything the visitor loads lives under `site/` —
548
+ pages, styles, `js/` — and `wix.config.json`'s `site.outputDirectory` is `"./site"`; the project
549
+ root (config, plan, seed output) is never the upload. Same function names and DTOs as the table
550
+ above, so the contracts on this page hold unchanged: `searchCatalog`, `fetchFacetData`, `fetchProductBySlug`,
551
+ `fetchCategories`, `fetchCategoryBySlug`, `fetchInventory`, `fetchBackInStockEnabled`,
552
+ `requestBackInStock`, `resolveVariant`, `choiceAvailability` from `./js/wix/catalog.js`;
553
+ `fetchCart`, `addToCart`, `updateQuantity`, `removeLine`, `applyCoupon`, `removeCoupon`, `setNote`,
554
+ `checkoutUrl` from `./js/wix/cart.js`.
555
+ The state machines ship too: `createShopStore` from `./js/wix/shop-store.js` (the listing —
556
+ selection, facets, URL sync, cursor paging; `start()` once the page is up), `createProductDetailStore`
557
+ from `./js/wix/product-detail-store.js` (the PDP and every quick-add picker — selections start
558
+ empty, `resolveVariant`, `canAdd`/`blockedReason`, `selectPlan`, `maxQuantity`, `add()`,
559
+ `notify()`), and `./js/wix/cart-store.js` (the cart, `subscribeCart`/`getCartState`, `addLine`,
560
+ `updateLineQuantity`, `removeCartLine`, `applyCartCoupon`, `removeCartCoupon`, `setCartNote`,
561
+ `goToCheckout`, `setCartOpen`). No components ship — you write the rendering in plain JS: one
562
+ render function per surface that reads `getState()`, called from `subscribe`, with the
563
+ surface's controls calling the store's actions. The drawer opens after every add on its own;
564
+ overlays follow the CartDrawer contract (root-level, scroll lock, Escape, focus back). Pages are
565
+ `shop.html`, `category.html?slug=…`,
566
+ `product.html?slug=…`. Set `document.title` and the meta description from the entity's `seoData`
567
+ once it loads, on the product AND category pages. The visitor token persists in `localStorage` on
568
+ its own; never mint per page. `npx @wix/cli@latest release` uploads `site/`.
569
+
570
+ ### Wiring — server-rendered, another language (Flask, Laravel, Rails, …)
571
+
572
+ Read the reference files listed above before writing any surface.
573
+
574
+ Run `deploy.mjs storefront --stack static` in the project folder anyway: `js/wix/` is both the
575
+ browser-side code and the readable spec. Then split by where the call runs. **Reads on the
576
+ server:** port `js/wix/catalog.ts` and `catalog-core.ts` to your language — the same six functions
577
+ returning the same DTO shapes as dicts, one anonymous visitor token per process for these public
578
+ reads (mint and refresh per `client.ts`) — and render shop, category, and PDP in your templates to
579
+ the contracts above, so product names and prices are in the HTML; item-page tags from the entity's
580
+ `seoData`. **Buying in the browser:** the cart drawer on `./js/wix/cart-store.js`, the PDP's
581
+ option picker and the tile's quick add on `./js/wix/product-detail-store.js` (pass the product's
582
+ slug, or the rendered `ProductDetail` as `initial` in a JSON script tag), exactly as the static
583
+ wiring above — the browser owns the shopper's visitor token, so the server never handles
584
+ per-shopper tokens. Routes stay `/shop`, `/category/<slug>`, `/products/<slug>`. Add your public https origin
585
+ to the OAuth app's allowed domains before checkout can return.
586
+
587
+ **Pre-rendered (Frozen-Flask, Pelican, any static-site generator) → Wix-hosted.** Same port for
588
+ the reads, run at build time with one anonymous token; the generator must emit every product and
589
+ category page (a URL generator over `fetchCategories()` plus a full `searchCatalog` walk by
590
+ cursor — never only the first page). Run `deploy.mjs storefront --stack static --out <build dir>`
591
+ so `js/wix/` is inside the output the pages import from, point `site.outputDirectory` at that
592
+ folder, `wix release`. Pages sit at different depths (`/`, `/category/…`, `/products/…`): give
593
+ the templates one base path to `js/wix/` (a template variable, or root-relative `/js/wix/…`),
594
+ never a relative `./js/wix/` — it breaks one level down. The frozen grid is the first paint; the
595
+ shop's sort, filters, facets, search, and load-more still run client-side on it through
596
+ `createShopStore()` from `./js/wix/shop-store.js`, exactly as on a static site, so the gallery
597
+ contract above applies. Close
598
+ with the live URL, the rebuild + release command, and one line for the owner: dashboard edits to
599
+ the catalog reach the site when that command runs; cart and checkout are live regardless.
600
+
601
+ ### Wiring — React SPA (Vite etc.)
602
+
603
+ Import `./styles/global.css` once at the app entry (needs `@tailwindcss/vite` in the vite
604
+ config plugins — deploy already added the dep). Write route wrappers in the project's router:
605
+ `/shop` → your shop component; `/category/:slug` → the same shop component with
606
+ `initialCategoryId` resolved from `fetchCategoryBySlug(slug)` (null → your 404 view);
607
+ `/products/:slug` → your detail component (`useProductDetail({ slug })` — components fetch
608
+ client-side when no `initial` is passed).
609
+ Mount the shipped `CartButton` in the header and `CartDrawer` once. Deploy wrote the public
610
+ client id into `wix/config.ts`; nothing else to configure.
611
+
612
+ Routes on Wix hosting: the host serves files only, so a clean route answers 404 when loaded directly — hash routes, or one HTML file per route, decided before the first route is written; any URL handed to Wix as a return target must be one the host serves (SKILL.md step 1).
613
+
614
+ ## Hard rules
615
+
616
+ - **Data and commerce logic only through the shipped exports** — never rewrite their
617
+ internals or re-derive a request shape. Extend by calling the exports or adding a new
618
+ function in `wix/storefront/` for what they don't cover (API contracts: the `wix-docs` skill).
619
+ - **Selection→cart goes through `useProductDetail`** — never add a product with options by
620
+ picking `variants[0]`, and never gate `canAdd` yourself. On the PDP that is the shipped
621
+ `OptionPicker`; in the gallery the shipped `QuickAdd` — a tile never adds a product with options itself, and never hides the buy path
622
+ behind "go to the product page" for a product that has no options.
623
+ - **Filters are the shipped `FilterPanel`** — mounted in the gallery whenever the store has a
624
+ catalog to filter; not rebuilt with fewer controls, not dropped because the brief didn't ask.
625
+ - **Categories are pages** — `/category/[slug]` with its SEO block, linked from the chrome; a
626
+ category that exists only as a state toggle on `/shop` has no URL to share or index.
627
+ - Don't wrap shipped calls in your own API routes — they run client-side by design.
628
+ - Where the shipped components deploy (Astro, React): theme via the `@theme` tokens, and your
629
+ markup uses Tailwind utilities on the same tokens — one design system across shipped and written
630
+ code. No parallel theme files, no hardcoded palette values in components. Where they don't
631
+ (`lib`, `static`, a port): style with whatever your stack does well, on one token set of your
632
+ own; the rule that survives is the token set, not Tailwind.
633
+ - Checkout only through the shipped cart (`checkout()`) — never a hand-built checkout URL.
634
+ - Live data or an honest empty state — never mock products, prices, reviews, or counts.
635
+ - **Prices and ribbons come from the DTOs as-is** — no computed percent-off, no "Sale" badge
636
+ inferred from `compareAtPrice`, no struck price beside a range (the DTO already withholds it);
637
+ a `fromPrice` summary reads "From {price}", never a made-up top of the range.
638
+ - **Cart totals come from `cart`** (`subtotal`, `discounts`, `fees`, `taxes`, `total` — the
639
+ estimate's) — never summed or hardcoded in the client; shipping says "calculated at checkout",
640
+ tax too unless `cart.taxes` has rows or `cart.pricesIncludeTax` (the drawer already does).
641
+ - Your PDP page carries the SEO pieces (`wixMetadata` + `loadSEOTagsServiceConfig` +
642
+ `<SEO.Tags>`) exactly as the skeleton shows — owners edit those tags in their dashboard.
643
+ - **Browsing, cart and checkout need no login.** They run on the Wix visitor session the
644
+ shipped SDK client already holds. Don't gate the shop, the PDP or the cart behind sign-in,
645
+ and don't add a members/auth flow unless the brief actually asks for accounts.
646
+ - **Call every hook before any conditional return.** A PDP that returns early for
647
+ `notFound`/loading above its `useState`/`useEffect` changes hook order between renders and
648
+ React throws. Hooks first, branches after.
649
+ - **Sort and filter at the source, not on a loaded page.** `useShop`'s sort/filters/search and
650
+ `searchCatalog` run on Wix across the whole catalog before cursor paging; re-ordering the
651
+ array a hook already returned only sorts the slice you happen to have. Never sort/filter
652
+ client-side, and never raise the page limit instead of paging (`hasMore`/`loadMore`).
653
+
654
+ ## Point the user to their dashboard
655
+
656
+ Hand the owner these links — `{siteId}` is `siteId` in `wix.config.json` (the deploy JSON also prints
657
+ `dashboardUrl`, `productsUrl`, `categoriesUrl`); an entity id fills the placeholder from the seed result.
658
+
659
+ | page | `https://manage.wix.com/dashboard/{siteId}/` + |
660
+ |---|---|
661
+ | Products | `wix-stores/products` |
662
+ | Edit a product | `wix-stores/products/product/{productId}` |
663
+ | Categories | `wix-stores/categories/list` |
664
+ | Inventory | `wix-stores/inventory` |
665
+ | Orders | `ecom-platform/orders-list` |
666
+ | Store settings | `wix-stores/settings` |
667
+ | Accept payments — connect a payment method | `wix-cashier/payments` |
668
+ | Upgrade the plan — online payments need premium | full URL: `https://www.wix.com/upgrade/website?metaSiteId={siteId}` |
669
+
670
+ Real payments need a connected payment method **and** a premium plan. Until both are done, a visitor who reaches hosted checkout sees **"We can't accept online payments. Contact us for help with your order."**
671
+ Hand both links above in the close; don't treat it as a code failure.
672
+
673
+ ## Seeding
674
+
675
+ Per `seed/SEED.md` — a plain-data `plan.json` into `seed-store.mjs`, run from the project
676
+ root. Independent of the frontend work; seed a catalog that exercises the UI (≥1 product with
677
+ a color option, ≥1 on sale, an image per product) unless the brief says otherwise — and, when the
678
+ brief wants them, a ribbon, a modifier (choices or free text), an info section, a pre-order item,
679
+ per-variant prices, a category description/image: all plain plan fields (see `seed/SEED.md`).
680
+
681
+ A fresh Stores install carries Wix's sample catalog (a dozen products such as "Baseball Cap" and
682
+ "Ceramic Flower Vase"), and the shop lists them next to the seeded ones. Never delete them, or
683
+ anything else on the site: the result's `preexisting[]` names what the shop lists, and the closing
684
+ message says so with the Manage products link so the owner removes them there — never release a store
685
+ that sells "Baseball Cap" without telling the owner.