@wix/agent-skills 1.26.0 → 1.28.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 (816) hide show
  1. package/README.md +1 -0
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +8 -6
  4. package/skills/wix-app/references/APP_VALIDATION.md +5 -1
  5. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  6. package/skills/wix-app/references/SDK_MODULE_MAP.md +1 -1
  7. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +14 -2
  8. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +4 -5
  9. package/skills/wix-app/references/stores/GET_PRODUCT.md +9 -1
  10. package/skills/wix-app/references/stores/INVENTORY.md +2 -0
  11. package/skills/wix-app/references/stores/QUERY.md +2 -2
  12. package/skills/wix-app/references/stores/WRITE.md +1 -1
  13. package/skills/wix-headless-kit/SKILL.md +35 -14
  14. package/skills/wix-headless-kit/guides/existing-site.md +12 -5
  15. package/skills/wix-headless-kit/guides/no-machine.md +115 -0
  16. package/skills/wix-headless-kit/install/attach.mjs +60 -13
  17. package/skills/wix-headless-kit/install/bootstrap.mjs +3 -1
  18. package/skills/wix-headless-kit/install/check.mjs +5 -5
  19. package/skills/wix-headless-kit/install/context.mjs +4 -2
  20. package/skills/wix-headless-kit/install/deploy.mjs +11 -5
  21. package/skills/wix-headless-kit/install/pins.json +8 -0
  22. package/skills/wix-headless-kit/install/setup.mjs +10 -8
  23. package/skills/wix-headless-kit/install/templates.mjs +39 -25
  24. package/skills/wix-headless-templates/SKILL.md +43 -0
  25. package/skills/wix-headless-templates/blank/project/README.md +15 -0
  26. package/skills/wix-headless-templates/blank/project/astro.config.mjs +20 -0
  27. package/skills/wix-headless-templates/blank/project/package.json +34 -0
  28. package/skills/wix-headless-templates/blank/project/public/favicon.svg +9 -0
  29. package/skills/wix-headless-templates/blank/project/src/assets/astro.svg +1 -0
  30. package/skills/wix-headless-templates/blank/project/src/assets/background.svg +1 -0
  31. package/skills/wix-headless-templates/blank/project/src/assets/wix.svg +18 -0
  32. package/skills/wix-headless-templates/blank/project/src/components/Hero.astro +77 -0
  33. package/skills/wix-headless-templates/blank/project/src/components/Welcome.astro +95 -0
  34. package/skills/wix-headless-templates/blank/project/src/layouts/Layout.astro +22 -0
  35. package/skills/wix-headless-templates/blank/project/src/pages/index.astro +8 -0
  36. package/skills/wix-headless-templates/blank/project/tsconfig.json +5 -0
  37. package/skills/wix-headless-templates/blog/INSTRUCTIONS.md +418 -0
  38. package/skills/wix-headless-templates/blog/app/components/blog/BlogFeedView.tsx +191 -0
  39. package/skills/wix-headless-templates/blog/app/components/blog/CommentsView.tsx +206 -0
  40. package/skills/wix-headless-templates/blog/app/components/blog/PostLikeButton.tsx +62 -0
  41. package/skills/wix-headless-templates/blog/app/components/blog/PostView.tsx +139 -0
  42. package/skills/wix-headless-templates/blog/app/components/blog/RichContent.tsx +42 -0
  43. package/skills/wix-headless-templates/blog/app/hooks/blog/useBlogFeed.ts +31 -0
  44. package/skills/wix-headless-templates/blog/app/hooks/blog/useComments.ts +26 -0
  45. package/skills/wix-headless-templates/blog/app/hooks/blog/usePost.ts +25 -0
  46. package/skills/wix-headless-templates/blog/app/wix/blog/authors-core.ts +51 -0
  47. package/skills/wix-headless-templates/blog/app/wix/blog/authors.ts +50 -0
  48. package/skills/wix-headless-templates/blog/app/wix/blog/blog-feed-store.ts +156 -0
  49. package/skills/wix-headless-templates/blog/app/wix/blog/comments-core.ts +189 -0
  50. package/skills/wix-headless-templates/blog/app/wix/blog/comments-store.ts +214 -0
  51. package/skills/wix-headless-templates/blog/app/wix/blog/comments.ts +84 -0
  52. package/skills/wix-headless-templates/blog/app/wix/blog/post-likes.ts +42 -0
  53. package/skills/wix-headless-templates/blog/app/wix/blog/post-store.ts +158 -0
  54. package/skills/wix-headless-templates/blog/app/wix/blog/posts-core.ts +347 -0
  55. package/skills/wix-headless-templates/blog/app/wix/blog/posts.ts +132 -0
  56. package/skills/wix-headless-templates/blog/app/wix/blog/taxonomy-core.ts +80 -0
  57. package/skills/wix-headless-templates/blog/app/wix/blog/taxonomy.ts +78 -0
  58. package/skills/wix-headless-templates/blog/app/wix/blog/types.ts +161 -0
  59. package/skills/wix-headless-templates/blog/app-astro/layouts/SiteLayout.astro +44 -0
  60. package/skills/wix-headless-templates/blog/app-astro/pages/blog/[...slug].astro +148 -0
  61. package/skills/wix-headless-templates/blog/app-astro/pages/blog/category/[slug].astro +97 -0
  62. package/skills/wix-headless-templates/blog/app-astro/pages/blog/tag/[slug].astro +51 -0
  63. package/skills/wix-headless-templates/blog/app-astro/pages/blog.astro +34 -0
  64. package/skills/wix-headless-templates/blog/project/README.md +15 -0
  65. package/skills/wix-headless-templates/blog/project/astro.config.mjs +22 -0
  66. package/skills/wix-headless-templates/blog/project/package-lock.json +14699 -0
  67. package/skills/wix-headless-templates/blog/project/package.json +39 -0
  68. package/skills/wix-headless-templates/blog/project/public/favicon.svg +9 -0
  69. package/skills/wix-headless-templates/blog/project/src/assets/astro.svg +1 -0
  70. package/skills/wix-headless-templates/blog/project/src/assets/background.svg +1 -0
  71. package/skills/wix-headless-templates/blog/project/src/assets/wix.svg +18 -0
  72. package/skills/wix-headless-templates/blog/project/src/components/Hero.astro +77 -0
  73. package/skills/wix-headless-templates/blog/project/src/components/Welcome.astro +95 -0
  74. package/skills/wix-headless-templates/blog/project/src/components/blog/BlogFeedView.tsx +191 -0
  75. package/skills/wix-headless-templates/blog/project/src/components/blog/CommentsView.tsx +206 -0
  76. package/skills/wix-headless-templates/blog/project/src/components/blog/PostLikeButton.tsx +62 -0
  77. package/skills/wix-headless-templates/blog/project/src/components/blog/PostView.tsx +139 -0
  78. package/skills/wix-headless-templates/blog/project/src/components/blog/RichContent.tsx +42 -0
  79. package/skills/wix-headless-templates/blog/project/src/hooks/blog/useBlogFeed.ts +31 -0
  80. package/skills/wix-headless-templates/blog/project/src/hooks/blog/useComments.ts +26 -0
  81. package/skills/wix-headless-templates/blog/project/src/hooks/blog/usePost.ts +25 -0
  82. package/skills/wix-headless-templates/blog/project/src/layouts/Layout.astro +22 -0
  83. package/skills/wix-headless-templates/blog/project/src/layouts/SiteLayout.astro +44 -0
  84. package/skills/wix-headless-templates/blog/project/src/pages/blog/[...slug].astro +148 -0
  85. package/skills/wix-headless-templates/blog/project/src/pages/blog/category/[slug].astro +97 -0
  86. package/skills/wix-headless-templates/blog/project/src/pages/blog/tag/[slug].astro +51 -0
  87. package/skills/wix-headless-templates/blog/project/src/pages/blog.astro +34 -0
  88. package/skills/wix-headless-templates/blog/project/src/pages/index.astro +8 -0
  89. package/skills/wix-headless-templates/blog/project/src/styles/global.css +57 -0
  90. package/skills/wix-headless-templates/blog/project/src/wix/blog/authors-core.ts +51 -0
  91. package/skills/wix-headless-templates/blog/project/src/wix/blog/authors.ts +50 -0
  92. package/skills/wix-headless-templates/blog/project/src/wix/blog/blog-feed-store.ts +156 -0
  93. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments-core.ts +189 -0
  94. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments-store.ts +214 -0
  95. package/skills/wix-headless-templates/blog/project/src/wix/blog/comments.ts +84 -0
  96. package/skills/wix-headless-templates/blog/project/src/wix/blog/post-likes.ts +42 -0
  97. package/skills/wix-headless-templates/blog/project/src/wix/blog/post-store.ts +158 -0
  98. package/skills/wix-headless-templates/blog/project/src/wix/blog/posts-core.ts +347 -0
  99. package/skills/wix-headless-templates/blog/project/src/wix/blog/posts.ts +132 -0
  100. package/skills/wix-headless-templates/blog/project/src/wix/blog/taxonomy-core.ts +80 -0
  101. package/skills/wix-headless-templates/blog/project/src/wix/blog/taxonomy.ts +78 -0
  102. package/skills/wix-headless-templates/blog/project/src/wix/blog/types.ts +161 -0
  103. package/skills/wix-headless-templates/blog/project/src/wix/config.ts +16 -0
  104. package/skills/wix-headless-templates/blog/project/src/wix/media.ts +106 -0
  105. package/skills/wix-headless-templates/blog/project/src/wix/money.ts +24 -0
  106. package/skills/wix-headless-templates/blog/project/src/wix/sdk.ts +89 -0
  107. package/skills/wix-headless-templates/blog/project/tsconfig.json +5 -0
  108. package/skills/wix-headless-templates/blog/rest/authors.ts +39 -0
  109. package/skills/wix-headless-templates/blog/rest/comments.ts +64 -0
  110. package/skills/wix-headless-templates/blog/rest/post-likes.ts +37 -0
  111. package/skills/wix-headless-templates/blog/rest/posts.ts +123 -0
  112. package/skills/wix-headless-templates/blog/rest/taxonomy.ts +79 -0
  113. package/skills/wix-headless-templates/blog/seed/SEED.md +81 -0
  114. package/skills/wix-headless-templates/blog/seed/read-site.mjs +33 -0
  115. package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +337 -0
  116. package/skills/wix-headless-templates/bookings/INSTRUCTIONS.md +356 -0
  117. package/skills/wix-headless-templates/bookings/app/components/bookings/ServiceBookingView.tsx +369 -0
  118. package/skills/wix-headless-templates/bookings/app/components/bookings/ServicesView.tsx +193 -0
  119. package/skills/wix-headless-templates/bookings/app/hooks/bookings/useBookingFlow.ts +56 -0
  120. package/skills/wix-headless-templates/bookings/app/hooks/bookings/useServices.ts +23 -0
  121. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking-core.ts +614 -0
  122. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking-flow-store.ts +410 -0
  123. package/skills/wix-headless-templates/bookings/app/wix/bookings/booking.ts +227 -0
  124. package/skills/wix-headless-templates/bookings/app/wix/bookings/services-core.ts +366 -0
  125. package/skills/wix-headless-templates/bookings/app/wix/bookings/services-store.ts +213 -0
  126. package/skills/wix-headless-templates/bookings/app/wix/bookings/services.ts +100 -0
  127. package/skills/wix-headless-templates/bookings/app/wix/bookings/types.ts +236 -0
  128. package/skills/wix-headless-templates/bookings/app-astro/layouts/SiteLayout.astro +40 -0
  129. package/skills/wix-headless-templates/bookings/app-astro/pages/services/[slug].astro +81 -0
  130. package/skills/wix-headless-templates/bookings/app-astro/pages/services.astro +40 -0
  131. package/skills/wix-headless-templates/bookings/project/README.md +15 -0
  132. package/skills/wix-headless-templates/bookings/project/astro.config.mjs +22 -0
  133. package/skills/wix-headless-templates/bookings/project/package-lock.json +10546 -0
  134. package/skills/wix-headless-templates/bookings/project/package.json +41 -0
  135. package/skills/wix-headless-templates/bookings/project/public/favicon.svg +9 -0
  136. package/skills/wix-headless-templates/bookings/project/src/assets/astro.svg +1 -0
  137. package/skills/wix-headless-templates/bookings/project/src/assets/background.svg +1 -0
  138. package/skills/wix-headless-templates/bookings/project/src/assets/wix.svg +18 -0
  139. package/skills/wix-headless-templates/bookings/project/src/components/Hero.astro +77 -0
  140. package/skills/wix-headless-templates/bookings/project/src/components/Welcome.astro +95 -0
  141. package/skills/wix-headless-templates/bookings/project/src/components/bookings/ServiceBookingView.tsx +369 -0
  142. package/skills/wix-headless-templates/bookings/project/src/components/bookings/ServicesView.tsx +193 -0
  143. package/skills/wix-headless-templates/bookings/project/src/hooks/bookings/useBookingFlow.ts +56 -0
  144. package/skills/wix-headless-templates/bookings/project/src/hooks/bookings/useServices.ts +23 -0
  145. package/skills/wix-headless-templates/bookings/project/src/layouts/Layout.astro +22 -0
  146. package/skills/wix-headless-templates/bookings/project/src/layouts/SiteLayout.astro +40 -0
  147. package/skills/wix-headless-templates/bookings/project/src/pages/index.astro +8 -0
  148. package/skills/wix-headless-templates/bookings/project/src/pages/services/[slug].astro +81 -0
  149. package/skills/wix-headless-templates/bookings/project/src/pages/services.astro +40 -0
  150. package/skills/wix-headless-templates/bookings/project/src/styles/global.css +57 -0
  151. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking-core.ts +614 -0
  152. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking-flow-store.ts +410 -0
  153. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/booking.ts +227 -0
  154. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services-core.ts +366 -0
  155. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services-store.ts +213 -0
  156. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/services.ts +100 -0
  157. package/skills/wix-headless-templates/bookings/project/src/wix/bookings/types.ts +236 -0
  158. package/skills/wix-headless-templates/bookings/project/src/wix/config.ts +16 -0
  159. package/skills/wix-headless-templates/bookings/project/src/wix/media.ts +106 -0
  160. package/skills/wix-headless-templates/bookings/project/src/wix/money.ts +24 -0
  161. package/skills/wix-headless-templates/bookings/project/src/wix/sdk.ts +89 -0
  162. package/skills/wix-headless-templates/bookings/project/tsconfig.json +5 -0
  163. package/skills/wix-headless-templates/bookings/rest/booking.ts +227 -0
  164. package/skills/wix-headless-templates/bookings/rest/services.ts +94 -0
  165. package/skills/wix-headless-templates/bookings/seed/SEED.md +109 -0
  166. package/skills/wix-headless-templates/bookings/seed/read-site.mjs +28 -0
  167. package/skills/wix-headless-templates/bookings/seed/seed-bookings.mjs +407 -0
  168. package/skills/wix-headless-templates/cms/INSTRUCTIONS.md +399 -0
  169. package/skills/wix-headless-templates/cms/app/hooks/cms/useCollection.ts +82 -0
  170. package/skills/wix-headless-templates/cms/app/hooks/cms/useItem.ts +37 -0
  171. package/skills/wix-headless-templates/cms/app/wix/cms/collection-store.ts +220 -0
  172. package/skills/wix-headless-templates/cms/app/wix/cms/collections-core.ts +41 -0
  173. package/skills/wix-headless-templates/cms/app/wix/cms/collections.ts +28 -0
  174. package/skills/wix-headless-templates/cms/app/wix/cms/item-store.ts +93 -0
  175. package/skills/wix-headless-templates/cms/app/wix/cms/items-core.ts +259 -0
  176. package/skills/wix-headless-templates/cms/app/wix/cms/items.ts +182 -0
  177. package/skills/wix-headless-templates/cms/app/wix/cms/types.ts +138 -0
  178. package/skills/wix-headless-templates/cms/app-astro/layouts/SiteLayout.astro +41 -0
  179. package/skills/wix-headless-templates/cms/project/README.md +15 -0
  180. package/skills/wix-headless-templates/cms/project/astro.config.mjs +22 -0
  181. package/skills/wix-headless-templates/cms/project/package-lock.json +9798 -0
  182. package/skills/wix-headless-templates/cms/project/package.json +37 -0
  183. package/skills/wix-headless-templates/cms/project/public/favicon.svg +9 -0
  184. package/skills/wix-headless-templates/cms/project/src/assets/astro.svg +1 -0
  185. package/skills/wix-headless-templates/cms/project/src/assets/background.svg +1 -0
  186. package/skills/wix-headless-templates/cms/project/src/assets/wix.svg +18 -0
  187. package/skills/wix-headless-templates/cms/project/src/components/Hero.astro +77 -0
  188. package/skills/wix-headless-templates/cms/project/src/components/Welcome.astro +95 -0
  189. package/skills/wix-headless-templates/cms/project/src/hooks/cms/useCollection.ts +82 -0
  190. package/skills/wix-headless-templates/cms/project/src/hooks/cms/useItem.ts +37 -0
  191. package/skills/wix-headless-templates/cms/project/src/layouts/Layout.astro +22 -0
  192. package/skills/wix-headless-templates/cms/project/src/layouts/SiteLayout.astro +41 -0
  193. package/skills/wix-headless-templates/cms/project/src/pages/index.astro +8 -0
  194. package/skills/wix-headless-templates/cms/project/src/styles/global.css +57 -0
  195. package/skills/wix-headless-templates/cms/project/src/wix/cms/collection-store.ts +220 -0
  196. package/skills/wix-headless-templates/cms/project/src/wix/cms/collections-core.ts +41 -0
  197. package/skills/wix-headless-templates/cms/project/src/wix/cms/collections.ts +28 -0
  198. package/skills/wix-headless-templates/cms/project/src/wix/cms/item-store.ts +93 -0
  199. package/skills/wix-headless-templates/cms/project/src/wix/cms/items-core.ts +259 -0
  200. package/skills/wix-headless-templates/cms/project/src/wix/cms/items.ts +182 -0
  201. package/skills/wix-headless-templates/cms/project/src/wix/cms/types.ts +138 -0
  202. package/skills/wix-headless-templates/cms/project/src/wix/config.ts +16 -0
  203. package/skills/wix-headless-templates/cms/project/src/wix/media.ts +106 -0
  204. package/skills/wix-headless-templates/cms/project/src/wix/money.ts +24 -0
  205. package/skills/wix-headless-templates/cms/project/src/wix/sdk.ts +89 -0
  206. package/skills/wix-headless-templates/cms/project/tsconfig.json +5 -0
  207. package/skills/wix-headless-templates/cms/rest/collections.ts +25 -0
  208. package/skills/wix-headless-templates/cms/rest/items.ts +189 -0
  209. package/skills/wix-headless-templates/cms/seed/SEED.md +116 -0
  210. package/skills/wix-headless-templates/cms/seed/read-site.mjs +20 -0
  211. package/skills/wix-headless-templates/cms/seed/seed-cms.mjs +321 -0
  212. package/skills/wix-headless-templates/compose.mjs +83 -0
  213. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +348 -0
  214. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +155 -0
  215. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +46 -0
  216. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +49 -0
  217. package/skills/wix-headless-templates/donations/app/hooks/donations/useCampaigns.ts +21 -0
  218. package/skills/wix-headless-templates/donations/app/hooks/donations/useDonation.ts +27 -0
  219. package/skills/wix-headless-templates/donations/app/hooks/donations/useDonationReceipt.ts +19 -0
  220. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns-store.ts +59 -0
  221. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +83 -0
  222. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +68 -0
  223. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +163 -0
  224. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +465 -0
  225. package/skills/wix-headless-templates/donations/app/wix/donations/receipt-store.ts +55 -0
  226. package/skills/wix-headless-templates/donations/app/wix/donations/types.ts +121 -0
  227. package/skills/wix-headless-templates/donations/app-astro/components/donations/CampaignPage.astro +43 -0
  228. package/skills/wix-headless-templates/donations/app-astro/layouts/SiteLayout.astro +45 -0
  229. package/skills/wix-headless-templates/donations/app-astro/pages/donate/[id].astro +28 -0
  230. package/skills/wix-headless-templates/donations/app-astro/pages/donate/index.astro +51 -0
  231. package/skills/wix-headless-templates/donations/app-astro/pages/donate/thank-you.astro +13 -0
  232. package/skills/wix-headless-templates/donations/project/README.md +15 -0
  233. package/skills/wix-headless-templates/donations/project/astro.config.mjs +22 -0
  234. package/skills/wix-headless-templates/donations/project/package-lock.json +10266 -0
  235. package/skills/wix-headless-templates/donations/project/package.json +39 -0
  236. package/skills/wix-headless-templates/donations/project/public/favicon.svg +9 -0
  237. package/skills/wix-headless-templates/donations/project/src/assets/astro.svg +1 -0
  238. package/skills/wix-headless-templates/donations/project/src/assets/background.svg +1 -0
  239. package/skills/wix-headless-templates/donations/project/src/assets/wix.svg +18 -0
  240. package/skills/wix-headless-templates/donations/project/src/components/Hero.astro +77 -0
  241. package/skills/wix-headless-templates/donations/project/src/components/Welcome.astro +95 -0
  242. package/skills/wix-headless-templates/donations/project/src/components/donations/CampaignPage.astro +43 -0
  243. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +155 -0
  244. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +46 -0
  245. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +49 -0
  246. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useCampaigns.ts +21 -0
  247. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useDonation.ts +27 -0
  248. package/skills/wix-headless-templates/donations/project/src/hooks/donations/useDonationReceipt.ts +19 -0
  249. package/skills/wix-headless-templates/donations/project/src/layouts/Layout.astro +22 -0
  250. package/skills/wix-headless-templates/donations/project/src/layouts/SiteLayout.astro +45 -0
  251. package/skills/wix-headless-templates/donations/project/src/pages/donate/[id].astro +28 -0
  252. package/skills/wix-headless-templates/donations/project/src/pages/donate/index.astro +51 -0
  253. package/skills/wix-headless-templates/donations/project/src/pages/donate/thank-you.astro +13 -0
  254. package/skills/wix-headless-templates/donations/project/src/pages/index.astro +8 -0
  255. package/skills/wix-headless-templates/donations/project/src/styles/global.css +57 -0
  256. package/skills/wix-headless-templates/donations/project/src/wix/config.ts +16 -0
  257. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns-store.ts +59 -0
  258. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +83 -0
  259. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +68 -0
  260. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +163 -0
  261. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +465 -0
  262. package/skills/wix-headless-templates/donations/project/src/wix/donations/receipt-store.ts +55 -0
  263. package/skills/wix-headless-templates/donations/project/src/wix/donations/types.ts +121 -0
  264. package/skills/wix-headless-templates/donations/project/src/wix/media.ts +106 -0
  265. package/skills/wix-headless-templates/donations/project/src/wix/money.ts +24 -0
  266. package/skills/wix-headless-templates/donations/project/src/wix/sdk.ts +89 -0
  267. package/skills/wix-headless-templates/donations/project/tsconfig.json +5 -0
  268. package/skills/wix-headless-templates/donations/rest/campaigns.ts +76 -0
  269. package/skills/wix-headless-templates/donations/rest/donate.ts +64 -0
  270. package/skills/wix-headless-templates/donations/seed/SEED.md +90 -0
  271. package/skills/wix-headless-templates/donations/seed/read-site.mjs +33 -0
  272. package/skills/wix-headless-templates/donations/seed/seed-donations.mjs +250 -0
  273. package/skills/wix-headless-templates/events/INSTRUCTIONS.md +387 -0
  274. package/skills/wix-headless-templates/events/app/components/events/EventConfirmationView.tsx +139 -0
  275. package/skills/wix-headless-templates/events/app/components/events/EventRegistrationView.tsx +375 -0
  276. package/skills/wix-headless-templates/events/app/components/events/EventsView.tsx +134 -0
  277. package/skills/wix-headless-templates/events/app/hooks/events/useEventConfirmation.ts +21 -0
  278. package/skills/wix-headless-templates/events/app/hooks/events/useEventRegistration.ts +40 -0
  279. package/skills/wix-headless-templates/events/app/hooks/events/useEvents.ts +24 -0
  280. package/skills/wix-headless-templates/events/app/wix/events/events-core.ts +379 -0
  281. package/skills/wix-headless-templates/events/app/wix/events/events-store.ts +175 -0
  282. package/skills/wix-headless-templates/events/app/wix/events/events.ts +124 -0
  283. package/skills/wix-headless-templates/events/app/wix/events/order-store.ts +143 -0
  284. package/skills/wix-headless-templates/events/app/wix/events/orders-core.ts +86 -0
  285. package/skills/wix-headless-templates/events/app/wix/events/orders.ts +30 -0
  286. package/skills/wix-headless-templates/events/app/wix/events/registration-core.ts +415 -0
  287. package/skills/wix-headless-templates/events/app/wix/events/registration-store.ts +237 -0
  288. package/skills/wix-headless-templates/events/app/wix/events/registration.ts +109 -0
  289. package/skills/wix-headless-templates/events/app/wix/events/types.ts +249 -0
  290. package/skills/wix-headless-templates/events/app-astro/layouts/SiteLayout.astro +40 -0
  291. package/skills/wix-headless-templates/events/app-astro/pages/event-confirmation.astro +12 -0
  292. package/skills/wix-headless-templates/events/app-astro/pages/events/[slug].astro +104 -0
  293. package/skills/wix-headless-templates/events/app-astro/pages/events.astro +23 -0
  294. package/skills/wix-headless-templates/events/project/README.md +15 -0
  295. package/skills/wix-headless-templates/events/project/astro.config.mjs +22 -0
  296. package/skills/wix-headless-templates/events/project/package-lock.json +10497 -0
  297. package/skills/wix-headless-templates/events/project/package.json +39 -0
  298. package/skills/wix-headless-templates/events/project/public/favicon.svg +9 -0
  299. package/skills/wix-headless-templates/events/project/src/assets/astro.svg +1 -0
  300. package/skills/wix-headless-templates/events/project/src/assets/background.svg +1 -0
  301. package/skills/wix-headless-templates/events/project/src/assets/wix.svg +18 -0
  302. package/skills/wix-headless-templates/events/project/src/components/Hero.astro +77 -0
  303. package/skills/wix-headless-templates/events/project/src/components/Welcome.astro +95 -0
  304. package/skills/wix-headless-templates/events/project/src/components/events/EventConfirmationView.tsx +139 -0
  305. package/skills/wix-headless-templates/events/project/src/components/events/EventRegistrationView.tsx +375 -0
  306. package/skills/wix-headless-templates/events/project/src/components/events/EventsView.tsx +134 -0
  307. package/skills/wix-headless-templates/events/project/src/hooks/events/useEventConfirmation.ts +21 -0
  308. package/skills/wix-headless-templates/events/project/src/hooks/events/useEventRegistration.ts +40 -0
  309. package/skills/wix-headless-templates/events/project/src/hooks/events/useEvents.ts +24 -0
  310. package/skills/wix-headless-templates/events/project/src/layouts/Layout.astro +22 -0
  311. package/skills/wix-headless-templates/events/project/src/layouts/SiteLayout.astro +40 -0
  312. package/skills/wix-headless-templates/events/project/src/pages/event-confirmation.astro +12 -0
  313. package/skills/wix-headless-templates/events/project/src/pages/events/[slug].astro +104 -0
  314. package/skills/wix-headless-templates/events/project/src/pages/events.astro +23 -0
  315. package/skills/wix-headless-templates/events/project/src/pages/index.astro +8 -0
  316. package/skills/wix-headless-templates/events/project/src/styles/global.css +57 -0
  317. package/skills/wix-headless-templates/events/project/src/wix/config.ts +16 -0
  318. package/skills/wix-headless-templates/events/project/src/wix/events/events-core.ts +379 -0
  319. package/skills/wix-headless-templates/events/project/src/wix/events/events-store.ts +175 -0
  320. package/skills/wix-headless-templates/events/project/src/wix/events/events.ts +124 -0
  321. package/skills/wix-headless-templates/events/project/src/wix/events/order-store.ts +143 -0
  322. package/skills/wix-headless-templates/events/project/src/wix/events/orders-core.ts +86 -0
  323. package/skills/wix-headless-templates/events/project/src/wix/events/orders.ts +30 -0
  324. package/skills/wix-headless-templates/events/project/src/wix/events/registration-core.ts +415 -0
  325. package/skills/wix-headless-templates/events/project/src/wix/events/registration-store.ts +237 -0
  326. package/skills/wix-headless-templates/events/project/src/wix/events/registration.ts +109 -0
  327. package/skills/wix-headless-templates/events/project/src/wix/events/types.ts +249 -0
  328. package/skills/wix-headless-templates/events/project/src/wix/media.ts +106 -0
  329. package/skills/wix-headless-templates/events/project/src/wix/money.ts +24 -0
  330. package/skills/wix-headless-templates/events/project/src/wix/sdk.ts +89 -0
  331. package/skills/wix-headless-templates/events/project/tsconfig.json +5 -0
  332. package/skills/wix-headless-templates/events/rest/events.ts +112 -0
  333. package/skills/wix-headless-templates/events/rest/orders.ts +28 -0
  334. package/skills/wix-headless-templates/events/rest/registration.ts +96 -0
  335. package/skills/wix-headless-templates/events/seed/SEED.md +115 -0
  336. package/skills/wix-headless-templates/events/seed/read-site.mjs +26 -0
  337. package/skills/wix-headless-templates/events/seed/seed-events.mjs +322 -0
  338. package/skills/wix-headless-templates/faq/INSTRUCTIONS.md +317 -0
  339. package/skills/wix-headless-templates/faq/app/components/faq/FaqAccordion.tsx +159 -0
  340. package/skills/wix-headless-templates/faq/app/components/faq/FaqCategoryNav.tsx +46 -0
  341. package/skills/wix-headless-templates/faq/app/components/faq/FaqSearch.tsx +56 -0
  342. package/skills/wix-headless-templates/faq/app/hooks/faq/useFaq.ts +53 -0
  343. package/skills/wix-headless-templates/faq/app/wix/faq/faq-core.ts +428 -0
  344. package/skills/wix-headless-templates/faq/app/wix/faq/faq-store.ts +212 -0
  345. package/skills/wix-headless-templates/faq/app/wix/faq/faq.ts +72 -0
  346. package/skills/wix-headless-templates/faq/app/wix/faq/types.ts +63 -0
  347. package/skills/wix-headless-templates/faq/app-astro/layouts/SiteLayout.astro +40 -0
  348. package/skills/wix-headless-templates/faq/app-astro/pages/faq.astro +39 -0
  349. package/skills/wix-headless-templates/faq/project/README.md +15 -0
  350. package/skills/wix-headless-templates/faq/project/astro.config.mjs +22 -0
  351. package/skills/wix-headless-templates/faq/project/package-lock.json +8837 -0
  352. package/skills/wix-headless-templates/faq/project/package.json +37 -0
  353. package/skills/wix-headless-templates/faq/project/public/favicon.svg +9 -0
  354. package/skills/wix-headless-templates/faq/project/src/assets/astro.svg +1 -0
  355. package/skills/wix-headless-templates/faq/project/src/assets/background.svg +1 -0
  356. package/skills/wix-headless-templates/faq/project/src/assets/wix.svg +18 -0
  357. package/skills/wix-headless-templates/faq/project/src/components/Hero.astro +77 -0
  358. package/skills/wix-headless-templates/faq/project/src/components/Welcome.astro +95 -0
  359. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqAccordion.tsx +159 -0
  360. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqCategoryNav.tsx +46 -0
  361. package/skills/wix-headless-templates/faq/project/src/components/faq/FaqSearch.tsx +56 -0
  362. package/skills/wix-headless-templates/faq/project/src/hooks/faq/useFaq.ts +53 -0
  363. package/skills/wix-headless-templates/faq/project/src/layouts/Layout.astro +22 -0
  364. package/skills/wix-headless-templates/faq/project/src/layouts/SiteLayout.astro +40 -0
  365. package/skills/wix-headless-templates/faq/project/src/pages/faq.astro +39 -0
  366. package/skills/wix-headless-templates/faq/project/src/pages/index.astro +8 -0
  367. package/skills/wix-headless-templates/faq/project/src/styles/global.css +57 -0
  368. package/skills/wix-headless-templates/faq/project/src/wix/config.ts +16 -0
  369. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq-core.ts +428 -0
  370. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq-store.ts +212 -0
  371. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq.ts +72 -0
  372. package/skills/wix-headless-templates/faq/project/src/wix/faq/types.ts +63 -0
  373. package/skills/wix-headless-templates/faq/project/src/wix/media.ts +106 -0
  374. package/skills/wix-headless-templates/faq/project/src/wix/money.ts +24 -0
  375. package/skills/wix-headless-templates/faq/project/src/wix/sdk.ts +89 -0
  376. package/skills/wix-headless-templates/faq/project/tsconfig.json +5 -0
  377. package/skills/wix-headless-templates/faq/rest/faq.ts +71 -0
  378. package/skills/wix-headless-templates/faq/seed/SEED.md +104 -0
  379. package/skills/wix-headless-templates/faq/seed/read-site.mjs +23 -0
  380. package/skills/wix-headless-templates/faq/seed/seed-faq.mjs +302 -0
  381. package/skills/wix-headless-templates/forms/INSTRUCTIONS.md +417 -0
  382. package/skills/wix-headless-templates/forms/app/hooks/forms/useWixForm.ts +108 -0
  383. package/skills/wix-headless-templates/forms/app/wix/forms/address-templates.generated.ts +13 -0
  384. package/skills/wix-headless-templates/forms/app/wix/forms/form-store.ts +533 -0
  385. package/skills/wix-headless-templates/forms/app/wix/forms/forms-core.ts +671 -0
  386. package/skills/wix-headless-templates/forms/app/wix/forms/forms.ts +57 -0
  387. package/skills/wix-headless-templates/forms/app/wix/forms/submissions-core.ts +423 -0
  388. package/skills/wix-headless-templates/forms/app/wix/forms/submissions.ts +95 -0
  389. package/skills/wix-headless-templates/forms/app/wix/forms/types.ts +284 -0
  390. package/skills/wix-headless-templates/forms/project/README.md +15 -0
  391. package/skills/wix-headless-templates/forms/project/astro.config.mjs +22 -0
  392. package/skills/wix-headless-templates/forms/project/package-lock.json +9102 -0
  393. package/skills/wix-headless-templates/forms/project/package.json +37 -0
  394. package/skills/wix-headless-templates/forms/project/public/favicon.svg +9 -0
  395. package/skills/wix-headless-templates/forms/project/src/assets/astro.svg +1 -0
  396. package/skills/wix-headless-templates/forms/project/src/assets/background.svg +1 -0
  397. package/skills/wix-headless-templates/forms/project/src/assets/wix.svg +18 -0
  398. package/skills/wix-headless-templates/forms/project/src/components/Hero.astro +77 -0
  399. package/skills/wix-headless-templates/forms/project/src/components/Welcome.astro +95 -0
  400. package/skills/wix-headless-templates/forms/project/src/hooks/forms/useWixForm.ts +108 -0
  401. package/skills/wix-headless-templates/forms/project/src/layouts/Layout.astro +22 -0
  402. package/skills/wix-headless-templates/forms/project/src/pages/index.astro +8 -0
  403. package/skills/wix-headless-templates/forms/project/src/styles/global.css +57 -0
  404. package/skills/wix-headless-templates/forms/project/src/wix/config.ts +16 -0
  405. package/skills/wix-headless-templates/forms/project/src/wix/forms/address-templates.generated.ts +13 -0
  406. package/skills/wix-headless-templates/forms/project/src/wix/forms/form-store.ts +533 -0
  407. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms-core.ts +671 -0
  408. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms.ts +57 -0
  409. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions-core.ts +423 -0
  410. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions.ts +95 -0
  411. package/skills/wix-headless-templates/forms/project/src/wix/forms/types.ts +284 -0
  412. package/skills/wix-headless-templates/forms/project/src/wix/media.ts +106 -0
  413. package/skills/wix-headless-templates/forms/project/src/wix/money.ts +24 -0
  414. package/skills/wix-headless-templates/forms/project/src/wix/sdk.ts +89 -0
  415. package/skills/wix-headless-templates/forms/project/tsconfig.json +5 -0
  416. package/skills/wix-headless-templates/forms/rest/forms.ts +37 -0
  417. package/skills/wix-headless-templates/forms/rest/submissions.ts +83 -0
  418. package/skills/wix-headless-templates/forms/seed/SEED.md +225 -0
  419. package/skills/wix-headless-templates/forms/seed/read-site.mjs +53 -0
  420. package/skills/wix-headless-templates/forms/seed/seed-forms.mjs +574 -0
  421. package/skills/wix-headless-templates/forms/tooling/address-templates.mjs +96 -0
  422. package/skills/wix-headless-templates/members/INSTRUCTIONS.md +345 -0
  423. package/skills/wix-headless-templates/members/app/components/members/AccountPage.tsx +16 -0
  424. package/skills/wix-headless-templates/members/app/components/members/AccountView.tsx +60 -0
  425. package/skills/wix-headless-templates/members/app/components/members/LoginForm.tsx +165 -0
  426. package/skills/wix-headless-templates/members/app/components/members/MemberMenu.tsx +78 -0
  427. package/skills/wix-headless-templates/members/app/components/members/RequireAuth.tsx +47 -0
  428. package/skills/wix-headless-templates/members/app/hooks/members/useMember.ts +67 -0
  429. package/skills/wix-headless-templates/members/app/wix/members/auth-core.ts +160 -0
  430. package/skills/wix-headless-templates/members/app/wix/members/auth.ts +117 -0
  431. package/skills/wix-headless-templates/members/app/wix/members/client.ts +27 -0
  432. package/skills/wix-headless-templates/members/app/wix/members/member-store.ts +133 -0
  433. package/skills/wix-headless-templates/members/app/wix/members/members-core.ts +43 -0
  434. package/skills/wix-headless-templates/members/app/wix/members/members.ts +29 -0
  435. package/skills/wix-headless-templates/members/app/wix/members/types.ts +21 -0
  436. package/skills/wix-headless-templates/members/app-astro/layouts/SiteLayout.astro +42 -0
  437. package/skills/wix-headless-templates/members/app-astro/pages/account.astro +9 -0
  438. package/skills/wix-headless-templates/members/app-astro/pages/login.astro +11 -0
  439. package/skills/wix-headless-templates/members/project/README.md +15 -0
  440. package/skills/wix-headless-templates/members/project/astro.config.mjs +22 -0
  441. package/skills/wix-headless-templates/members/project/package-lock.json +8892 -0
  442. package/skills/wix-headless-templates/members/project/package.json +37 -0
  443. package/skills/wix-headless-templates/members/project/public/favicon.svg +9 -0
  444. package/skills/wix-headless-templates/members/project/src/assets/astro.svg +1 -0
  445. package/skills/wix-headless-templates/members/project/src/assets/background.svg +1 -0
  446. package/skills/wix-headless-templates/members/project/src/assets/wix.svg +18 -0
  447. package/skills/wix-headless-templates/members/project/src/components/Hero.astro +77 -0
  448. package/skills/wix-headless-templates/members/project/src/components/Welcome.astro +95 -0
  449. package/skills/wix-headless-templates/members/project/src/components/members/AccountPage.tsx +16 -0
  450. package/skills/wix-headless-templates/members/project/src/components/members/AccountView.tsx +60 -0
  451. package/skills/wix-headless-templates/members/project/src/components/members/LoginForm.tsx +165 -0
  452. package/skills/wix-headless-templates/members/project/src/components/members/MemberMenu.tsx +78 -0
  453. package/skills/wix-headless-templates/members/project/src/components/members/RequireAuth.tsx +47 -0
  454. package/skills/wix-headless-templates/members/project/src/hooks/members/useMember.ts +67 -0
  455. package/skills/wix-headless-templates/members/project/src/layouts/Layout.astro +22 -0
  456. package/skills/wix-headless-templates/members/project/src/layouts/SiteLayout.astro +42 -0
  457. package/skills/wix-headless-templates/members/project/src/pages/account.astro +9 -0
  458. package/skills/wix-headless-templates/members/project/src/pages/index.astro +8 -0
  459. package/skills/wix-headless-templates/members/project/src/pages/login.astro +11 -0
  460. package/skills/wix-headless-templates/members/project/src/styles/global.css +57 -0
  461. package/skills/wix-headless-templates/members/project/src/wix/config.ts +16 -0
  462. package/skills/wix-headless-templates/members/project/src/wix/media.ts +106 -0
  463. package/skills/wix-headless-templates/members/project/src/wix/members/auth-core.ts +160 -0
  464. package/skills/wix-headless-templates/members/project/src/wix/members/auth.ts +117 -0
  465. package/skills/wix-headless-templates/members/project/src/wix/members/client.ts +27 -0
  466. package/skills/wix-headless-templates/members/project/src/wix/members/member-store.ts +133 -0
  467. package/skills/wix-headless-templates/members/project/src/wix/members/members-core.ts +43 -0
  468. package/skills/wix-headless-templates/members/project/src/wix/members/members.ts +29 -0
  469. package/skills/wix-headless-templates/members/project/src/wix/members/types.ts +21 -0
  470. package/skills/wix-headless-templates/members/project/src/wix/money.ts +24 -0
  471. package/skills/wix-headless-templates/members/project/src/wix/sdk.ts +89 -0
  472. package/skills/wix-headless-templates/members/project/tsconfig.json +5 -0
  473. package/skills/wix-headless-templates/members/rest/auth.ts +224 -0
  474. package/skills/wix-headless-templates/members/rest/members.ts +26 -0
  475. package/skills/wix-headless-templates/members/seed/SEED.md +39 -0
  476. package/skills/wix-headless-templates/members/seed/read-site.mjs +15 -0
  477. package/skills/wix-headless-templates/members/seed/seed-members.mjs +91 -0
  478. package/skills/wix-headless-templates/portfolio/INSTRUCTIONS.md +315 -0
  479. package/skills/wix-headless-templates/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
  480. package/skills/wix-headless-templates/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
  481. package/skills/wix-headless-templates/portfolio/app/components/portfolio/GalleryMedia.tsx +35 -0
  482. package/skills/wix-headless-templates/portfolio/app/components/portfolio/ProjectDetailView.tsx +85 -0
  483. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useCollectionProjects.ts +32 -0
  484. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useCollections.ts +21 -0
  485. package/skills/wix-headless-templates/portfolio/app/hooks/portfolio/useProjectDetail.ts +31 -0
  486. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/collection-projects-store.ts +82 -0
  487. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/collections-store.ts +58 -0
  488. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/portfolio-core.ts +177 -0
  489. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/portfolio.ts +78 -0
  490. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/project-detail-store.ts +81 -0
  491. package/skills/wix-headless-templates/portfolio/app/wix/portfolio/types.ts +55 -0
  492. package/skills/wix-headless-templates/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
  493. package/skills/wix-headless-templates/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
  494. package/skills/wix-headless-templates/portfolio/app-astro/pages/portfolio.astro +21 -0
  495. package/skills/wix-headless-templates/portfolio/app-astro/pages/projects/[slug].astro +29 -0
  496. package/skills/wix-headless-templates/portfolio/project/README.md +15 -0
  497. package/skills/wix-headless-templates/portfolio/project/astro.config.mjs +22 -0
  498. package/skills/wix-headless-templates/portfolio/project/package-lock.json +8760 -0
  499. package/skills/wix-headless-templates/portfolio/project/package.json +37 -0
  500. package/skills/wix-headless-templates/portfolio/project/public/favicon.svg +9 -0
  501. package/skills/wix-headless-templates/portfolio/project/src/assets/astro.svg +1 -0
  502. package/skills/wix-headless-templates/portfolio/project/src/assets/background.svg +1 -0
  503. package/skills/wix-headless-templates/portfolio/project/src/assets/wix.svg +18 -0
  504. package/skills/wix-headless-templates/portfolio/project/src/components/Hero.astro +77 -0
  505. package/skills/wix-headless-templates/portfolio/project/src/components/Welcome.astro +95 -0
  506. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/CollectionProjectsView.tsx +110 -0
  507. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/CollectionsView.tsx +90 -0
  508. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/GalleryMedia.tsx +35 -0
  509. package/skills/wix-headless-templates/portfolio/project/src/components/portfolio/ProjectDetailView.tsx +85 -0
  510. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useCollectionProjects.ts +32 -0
  511. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useCollections.ts +21 -0
  512. package/skills/wix-headless-templates/portfolio/project/src/hooks/portfolio/useProjectDetail.ts +31 -0
  513. package/skills/wix-headless-templates/portfolio/project/src/layouts/Layout.astro +22 -0
  514. package/skills/wix-headless-templates/portfolio/project/src/layouts/SiteLayout.astro +40 -0
  515. package/skills/wix-headless-templates/portfolio/project/src/pages/index.astro +8 -0
  516. package/skills/wix-headless-templates/portfolio/project/src/pages/portfolio/[slug].astro +30 -0
  517. package/skills/wix-headless-templates/portfolio/project/src/pages/portfolio.astro +21 -0
  518. package/skills/wix-headless-templates/portfolio/project/src/pages/projects/[slug].astro +29 -0
  519. package/skills/wix-headless-templates/portfolio/project/src/styles/global.css +57 -0
  520. package/skills/wix-headless-templates/portfolio/project/src/wix/config.ts +16 -0
  521. package/skills/wix-headless-templates/portfolio/project/src/wix/media.ts +106 -0
  522. package/skills/wix-headless-templates/portfolio/project/src/wix/money.ts +24 -0
  523. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/collection-projects-store.ts +82 -0
  524. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/collections-store.ts +58 -0
  525. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/portfolio-core.ts +177 -0
  526. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/portfolio.ts +78 -0
  527. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/project-detail-store.ts +81 -0
  528. package/skills/wix-headless-templates/portfolio/project/src/wix/portfolio/types.ts +55 -0
  529. package/skills/wix-headless-templates/portfolio/project/src/wix/sdk.ts +89 -0
  530. package/skills/wix-headless-templates/portfolio/project/tsconfig.json +5 -0
  531. package/skills/wix-headless-templates/portfolio/rest/portfolio.ts +75 -0
  532. package/skills/wix-headless-templates/portfolio/seed/SEED.md +86 -0
  533. package/skills/wix-headless-templates/portfolio/seed/read-site.mjs +20 -0
  534. package/skills/wix-headless-templates/portfolio/seed/seed-portfolio.mjs +253 -0
  535. package/skills/wix-headless-templates/pricing-plans/INSTRUCTIONS.md +378 -0
  536. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +54 -0
  537. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/PlansView.tsx +108 -0
  538. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/RequirePlan.tsx +87 -0
  539. package/skills/wix-headless-templates/pricing-plans/app/components/pricing-plans/SubscribeButton.tsx +41 -0
  540. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlanAccess.ts +31 -0
  541. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +16 -0
  542. package/skills/wix-headless-templates/pricing-plans/app/hooks/pricing-plans/usePlans.ts +22 -0
  543. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access-core.ts +29 -0
  544. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access-store.ts +92 -0
  545. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access.ts +37 -0
  546. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-purchase-store.ts +54 -0
  547. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans-core.ts +212 -0
  548. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans-store.ts +64 -0
  549. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plans.ts +54 -0
  550. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/purchase-core.ts +43 -0
  551. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/purchase.ts +22 -0
  552. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/types.ts +52 -0
  553. package/skills/wix-headless-templates/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
  554. package/skills/wix-headless-templates/pricing-plans/app-astro/pages/plans/[slug].astro +43 -0
  555. package/skills/wix-headless-templates/pricing-plans/app-astro/pages/plans.astro +21 -0
  556. package/skills/wix-headless-templates/pricing-plans/project/README.md +15 -0
  557. package/skills/wix-headless-templates/pricing-plans/project/astro.config.mjs +22 -0
  558. package/skills/wix-headless-templates/pricing-plans/project/package-lock.json +9799 -0
  559. package/skills/wix-headless-templates/pricing-plans/project/package.json +38 -0
  560. package/skills/wix-headless-templates/pricing-plans/project/public/favicon.svg +9 -0
  561. package/skills/wix-headless-templates/pricing-plans/project/src/assets/astro.svg +1 -0
  562. package/skills/wix-headless-templates/pricing-plans/project/src/assets/background.svg +1 -0
  563. package/skills/wix-headless-templates/pricing-plans/project/src/assets/wix.svg +18 -0
  564. package/skills/wix-headless-templates/pricing-plans/project/src/components/Hero.astro +77 -0
  565. package/skills/wix-headless-templates/pricing-plans/project/src/components/Welcome.astro +95 -0
  566. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/PlanDetailView.tsx +54 -0
  567. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/PlansView.tsx +108 -0
  568. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/RequirePlan.tsx +87 -0
  569. package/skills/wix-headless-templates/pricing-plans/project/src/components/pricing-plans/SubscribeButton.tsx +41 -0
  570. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlanAccess.ts +31 -0
  571. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlanPurchase.ts +16 -0
  572. package/skills/wix-headless-templates/pricing-plans/project/src/hooks/pricing-plans/usePlans.ts +22 -0
  573. package/skills/wix-headless-templates/pricing-plans/project/src/layouts/Layout.astro +22 -0
  574. package/skills/wix-headless-templates/pricing-plans/project/src/layouts/SiteLayout.astro +41 -0
  575. package/skills/wix-headless-templates/pricing-plans/project/src/pages/index.astro +8 -0
  576. package/skills/wix-headless-templates/pricing-plans/project/src/pages/plans/[slug].astro +43 -0
  577. package/skills/wix-headless-templates/pricing-plans/project/src/pages/plans.astro +21 -0
  578. package/skills/wix-headless-templates/pricing-plans/project/src/styles/global.css +57 -0
  579. package/skills/wix-headless-templates/pricing-plans/project/src/wix/config.ts +16 -0
  580. package/skills/wix-headless-templates/pricing-plans/project/src/wix/media.ts +106 -0
  581. package/skills/wix-headless-templates/pricing-plans/project/src/wix/money.ts +24 -0
  582. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access-core.ts +29 -0
  583. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access-store.ts +92 -0
  584. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access.ts +37 -0
  585. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-purchase-store.ts +54 -0
  586. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans-core.ts +212 -0
  587. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans-store.ts +64 -0
  588. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plans.ts +54 -0
  589. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/purchase-core.ts +43 -0
  590. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/purchase.ts +22 -0
  591. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/types.ts +52 -0
  592. package/skills/wix-headless-templates/pricing-plans/project/src/wix/sdk.ts +89 -0
  593. package/skills/wix-headless-templates/pricing-plans/project/tsconfig.json +5 -0
  594. package/skills/wix-headless-templates/pricing-plans/rest/plan-access.ts +31 -0
  595. package/skills/wix-headless-templates/pricing-plans/rest/plans.ts +58 -0
  596. package/skills/wix-headless-templates/pricing-plans/rest/purchase.ts +20 -0
  597. package/skills/wix-headless-templates/pricing-plans/seed/SEED.md +93 -0
  598. package/skills/wix-headless-templates/pricing-plans/seed/read-site.mjs +22 -0
  599. package/skills/wix-headless-templates/pricing-plans/seed/seed-pricing-plans.mjs +301 -0
  600. package/skills/wix-headless-templates/rentals/INSTRUCTIONS.md +309 -0
  601. package/skills/wix-headless-templates/rentals/app/components/rentals/RentalBookingView.tsx +195 -0
  602. package/skills/wix-headless-templates/rentals/app/components/rentals/RentalsView.tsx +89 -0
  603. package/skills/wix-headless-templates/rentals/app/hooks/rentals/useRentalFlow.ts +31 -0
  604. package/skills/wix-headless-templates/rentals/app/hooks/rentals/useRentals.ts +23 -0
  605. package/skills/wix-headless-templates/rentals/app/wix/rentals/rental-flow-store.ts +283 -0
  606. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals-core.ts +435 -0
  607. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals-store.ts +112 -0
  608. package/skills/wix-headless-templates/rentals/app/wix/rentals/rentals.ts +173 -0
  609. package/skills/wix-headless-templates/rentals/app/wix/rentals/types.ts +113 -0
  610. package/skills/wix-headless-templates/rentals/app-astro/layouts/SiteLayout.astro +40 -0
  611. package/skills/wix-headless-templates/rentals/app-astro/pages/rentals/[slug].astro +81 -0
  612. package/skills/wix-headless-templates/rentals/app-astro/pages/rentals.astro +24 -0
  613. package/skills/wix-headless-templates/rentals/project/README.md +15 -0
  614. package/skills/wix-headless-templates/rentals/project/astro.config.mjs +22 -0
  615. package/skills/wix-headless-templates/rentals/project/package-lock.json +10545 -0
  616. package/skills/wix-headless-templates/rentals/project/package.json +40 -0
  617. package/skills/wix-headless-templates/rentals/project/public/favicon.svg +9 -0
  618. package/skills/wix-headless-templates/rentals/project/src/assets/astro.svg +1 -0
  619. package/skills/wix-headless-templates/rentals/project/src/assets/background.svg +1 -0
  620. package/skills/wix-headless-templates/rentals/project/src/assets/wix.svg +18 -0
  621. package/skills/wix-headless-templates/rentals/project/src/components/Hero.astro +77 -0
  622. package/skills/wix-headless-templates/rentals/project/src/components/Welcome.astro +95 -0
  623. package/skills/wix-headless-templates/rentals/project/src/components/rentals/RentalBookingView.tsx +195 -0
  624. package/skills/wix-headless-templates/rentals/project/src/components/rentals/RentalsView.tsx +89 -0
  625. package/skills/wix-headless-templates/rentals/project/src/hooks/rentals/useRentalFlow.ts +31 -0
  626. package/skills/wix-headless-templates/rentals/project/src/hooks/rentals/useRentals.ts +23 -0
  627. package/skills/wix-headless-templates/rentals/project/src/layouts/Layout.astro +22 -0
  628. package/skills/wix-headless-templates/rentals/project/src/layouts/SiteLayout.astro +40 -0
  629. package/skills/wix-headless-templates/rentals/project/src/pages/index.astro +8 -0
  630. package/skills/wix-headless-templates/rentals/project/src/pages/rentals/[slug].astro +81 -0
  631. package/skills/wix-headless-templates/rentals/project/src/pages/rentals.astro +24 -0
  632. package/skills/wix-headless-templates/rentals/project/src/styles/global.css +57 -0
  633. package/skills/wix-headless-templates/rentals/project/src/wix/config.ts +16 -0
  634. package/skills/wix-headless-templates/rentals/project/src/wix/media.ts +106 -0
  635. package/skills/wix-headless-templates/rentals/project/src/wix/money.ts +24 -0
  636. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rental-flow-store.ts +283 -0
  637. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals-core.ts +435 -0
  638. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals-store.ts +112 -0
  639. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/rentals.ts +173 -0
  640. package/skills/wix-headless-templates/rentals/project/src/wix/rentals/types.ts +113 -0
  641. package/skills/wix-headless-templates/rentals/project/src/wix/sdk.ts +89 -0
  642. package/skills/wix-headless-templates/rentals/project/tsconfig.json +5 -0
  643. package/skills/wix-headless-templates/rentals/rest/rentals.ts +153 -0
  644. package/skills/wix-headless-templates/rentals/seed/SEED.md +95 -0
  645. package/skills/wix-headless-templates/rentals/seed/read-site.mjs +34 -0
  646. package/skills/wix-headless-templates/rentals/seed/seed-rentals.mjs +321 -0
  647. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +468 -0
  648. package/skills/wix-headless-templates/restaurants/app/components/restaurants/MenuView.tsx +257 -0
  649. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
  650. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
  651. package/skills/wix-headless-templates/restaurants/app/components/restaurants/ReservationView.tsx +212 -0
  652. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useMenus.ts +34 -0
  653. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +52 -0
  654. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useReservation.ts +49 -0
  655. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu-core.ts +333 -0
  656. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu-store.ts +89 -0
  657. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu.ts +109 -0
  658. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +141 -0
  659. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +287 -0
  660. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +237 -0
  661. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservation-store.ts +279 -0
  662. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservations-core.ts +218 -0
  663. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/reservations.ts +109 -0
  664. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/time-core.ts +118 -0
  665. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +337 -0
  666. package/skills/wix-headless-templates/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
  667. package/skills/wix-headless-templates/restaurants/app-astro/pages/menu.astro +22 -0
  668. package/skills/wix-headless-templates/restaurants/app-astro/pages/reservations.astro +12 -0
  669. package/skills/wix-headless-templates/restaurants/project/README.md +15 -0
  670. package/skills/wix-headless-templates/restaurants/project/astro.config.mjs +22 -0
  671. package/skills/wix-headless-templates/restaurants/project/package-lock.json +11038 -0
  672. package/skills/wix-headless-templates/restaurants/project/package.json +40 -0
  673. package/skills/wix-headless-templates/restaurants/project/public/favicon.svg +9 -0
  674. package/skills/wix-headless-templates/restaurants/project/src/assets/astro.svg +1 -0
  675. package/skills/wix-headless-templates/restaurants/project/src/assets/background.svg +1 -0
  676. package/skills/wix-headless-templates/restaurants/project/src/assets/wix.svg +18 -0
  677. package/skills/wix-headless-templates/restaurants/project/src/components/Hero.astro +77 -0
  678. package/skills/wix-headless-templates/restaurants/project/src/components/Welcome.astro +95 -0
  679. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/MenuView.tsx +257 -0
  680. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartButton.tsx +26 -0
  681. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +121 -0
  682. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/ReservationView.tsx +212 -0
  683. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useMenus.ts +34 -0
  684. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +52 -0
  685. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useReservation.ts +49 -0
  686. package/skills/wix-headless-templates/restaurants/project/src/layouts/Layout.astro +22 -0
  687. package/skills/wix-headless-templates/restaurants/project/src/layouts/SiteLayout.astro +47 -0
  688. package/skills/wix-headless-templates/restaurants/project/src/pages/index.astro +8 -0
  689. package/skills/wix-headless-templates/restaurants/project/src/pages/menu.astro +22 -0
  690. package/skills/wix-headless-templates/restaurants/project/src/pages/reservations.astro +12 -0
  691. package/skills/wix-headless-templates/restaurants/project/src/styles/global.css +57 -0
  692. package/skills/wix-headless-templates/restaurants/project/src/wix/config.ts +16 -0
  693. package/skills/wix-headless-templates/restaurants/project/src/wix/media.ts +106 -0
  694. package/skills/wix-headless-templates/restaurants/project/src/wix/money.ts +24 -0
  695. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu-core.ts +333 -0
  696. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu-store.ts +89 -0
  697. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu.ts +109 -0
  698. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +141 -0
  699. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +287 -0
  700. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +237 -0
  701. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservation-store.ts +279 -0
  702. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservations-core.ts +218 -0
  703. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/reservations.ts +109 -0
  704. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/time-core.ts +118 -0
  705. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +337 -0
  706. package/skills/wix-headless-templates/restaurants/project/src/wix/sdk.ts +89 -0
  707. package/skills/wix-headless-templates/restaurants/project/tsconfig.json +5 -0
  708. package/skills/wix-headless-templates/restaurants/rest/menu.ts +96 -0
  709. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +222 -0
  710. package/skills/wix-headless-templates/restaurants/rest/reservations.ts +102 -0
  711. package/skills/wix-headless-templates/restaurants/seed/SEED.md +118 -0
  712. package/skills/wix-headless-templates/restaurants/seed/read-site.mjs +25 -0
  713. package/skills/wix-headless-templates/restaurants/seed/seed-restaurants.mjs +577 -0
  714. package/skills/wix-headless-templates/shared/CONTENT.md +22 -0
  715. package/skills/wix-headless-templates/shared/CUSTOM_OPERATIONS.md +100 -0
  716. package/skills/wix-headless-templates/shared/DESIGN.md +37 -0
  717. package/skills/wix-headless-templates/shared/SUPPLIED-CONTENT.md +27 -0
  718. package/skills/wix-headless-templates/shared/app/styles/global.css +57 -0
  719. package/skills/wix-headless-templates/shared/app/wix/config.ts +16 -0
  720. package/skills/wix-headless-templates/shared/app/wix/media.ts +106 -0
  721. package/skills/wix-headless-templates/shared/app/wix/money.ts +24 -0
  722. package/skills/wix-headless-templates/shared/app/wix/sdk.ts +89 -0
  723. package/skills/wix-headless-templates/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
  724. package/skills/wix-headless-templates/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +69 -0
  725. package/skills/wix-headless-templates/shared/capabilities/site-search/INSTRUCTIONS.md +194 -0
  726. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchBox.tsx +136 -0
  727. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchHit.tsx +50 -0
  728. package/skills/wix-headless-templates/shared/capabilities/site-search/app/components/site-search/SearchResults.tsx +300 -0
  729. package/skills/wix-headless-templates/shared/capabilities/site-search/app/hooks/site-search/useSearch.ts +31 -0
  730. package/skills/wix-headless-templates/shared/capabilities/site-search/app/hooks/site-search/useSuggest.ts +26 -0
  731. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search-core.ts +520 -0
  732. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search-store.ts +235 -0
  733. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/search.ts +80 -0
  734. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/suggest-store.ts +178 -0
  735. package/skills/wix-headless-templates/shared/capabilities/site-search/app/wix/site-search/types.ts +158 -0
  736. package/skills/wix-headless-templates/shared/capabilities/site-search/app-astro/pages/search.astro +33 -0
  737. package/skills/wix-headless-templates/shared/capabilities/site-search/rest/search.ts +82 -0
  738. package/skills/wix-headless-templates/shared/capabilities/site-search/seed/install.mjs +43 -0
  739. package/skills/wix-headless-templates/shared/rest/client.ts +155 -0
  740. package/skills/wix-headless-templates/shared/rest/config.ts +4 -0
  741. package/skills/wix-headless-templates/shared/rest/media.ts +92 -0
  742. package/skills/wix-headless-templates/shared/seed/images.mjs +183 -0
  743. package/skills/wix-headless-templates/shared/seed/read-site.mjs +97 -0
  744. package/skills/wix-headless-templates/shared/seed/site-context.mjs +70 -0
  745. package/skills/wix-headless-templates/shared/seed/site.mjs +48 -0
  746. package/skills/wix-headless-templates/shared/seed/wix-cli.mjs +47 -0
  747. package/skills/wix-headless-templates/storefront/INSTRUCTIONS.md +685 -0
  748. package/skills/wix-headless-templates/storefront/app/components/storefront/CartButton.tsx +26 -0
  749. package/skills/wix-headless-templates/storefront/app/components/storefront/CartDrawer.tsx +239 -0
  750. package/skills/wix-headless-templates/storefront/app/components/storefront/FilterPanel.tsx +267 -0
  751. package/skills/wix-headless-templates/storefront/app/components/storefront/OptionPicker.tsx +171 -0
  752. package/skills/wix-headless-templates/storefront/app/components/storefront/QuickAdd.tsx +148 -0
  753. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useCart.ts +59 -0
  754. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useProductDetail.ts +42 -0
  755. package/skills/wix-headless-templates/storefront/app/hooks/storefront/useShop.ts +34 -0
  756. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart-core.ts +220 -0
  757. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart-store.ts +134 -0
  758. package/skills/wix-headless-templates/storefront/app/wix/storefront/cart.ts +186 -0
  759. package/skills/wix-headless-templates/storefront/app/wix/storefront/catalog-core.ts +698 -0
  760. package/skills/wix-headless-templates/storefront/app/wix/storefront/catalog.ts +260 -0
  761. package/skills/wix-headless-templates/storefront/app/wix/storefront/product-detail-store.ts +280 -0
  762. package/skills/wix-headless-templates/storefront/app/wix/storefront/shop-store.ts +341 -0
  763. package/skills/wix-headless-templates/storefront/app/wix/storefront/types.ts +305 -0
  764. package/skills/wix-headless-templates/storefront/app-astro/layouts/SiteLayout.astro +65 -0
  765. package/skills/wix-headless-templates/storefront/project/README.md +15 -0
  766. package/skills/wix-headless-templates/storefront/project/astro.config.mjs +22 -0
  767. package/skills/wix-headless-templates/storefront/project/package-lock.json +10786 -0
  768. package/skills/wix-headless-templates/storefront/project/package.json +41 -0
  769. package/skills/wix-headless-templates/storefront/project/public/favicon.svg +9 -0
  770. package/skills/wix-headless-templates/storefront/project/src/assets/astro.svg +1 -0
  771. package/skills/wix-headless-templates/storefront/project/src/assets/background.svg +1 -0
  772. package/skills/wix-headless-templates/storefront/project/src/assets/wix.svg +18 -0
  773. package/skills/wix-headless-templates/storefront/project/src/components/Hero.astro +77 -0
  774. package/skills/wix-headless-templates/storefront/project/src/components/Welcome.astro +95 -0
  775. package/skills/wix-headless-templates/storefront/project/src/components/storefront/CartButton.tsx +26 -0
  776. package/skills/wix-headless-templates/storefront/project/src/components/storefront/CartDrawer.tsx +239 -0
  777. package/skills/wix-headless-templates/storefront/project/src/components/storefront/FilterPanel.tsx +267 -0
  778. package/skills/wix-headless-templates/storefront/project/src/components/storefront/OptionPicker.tsx +171 -0
  779. package/skills/wix-headless-templates/storefront/project/src/components/storefront/QuickAdd.tsx +148 -0
  780. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useCart.ts +59 -0
  781. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useProductDetail.ts +42 -0
  782. package/skills/wix-headless-templates/storefront/project/src/hooks/storefront/useShop.ts +34 -0
  783. package/skills/wix-headless-templates/storefront/project/src/layouts/Layout.astro +22 -0
  784. package/skills/wix-headless-templates/storefront/project/src/layouts/SiteLayout.astro +65 -0
  785. package/skills/wix-headless-templates/storefront/project/src/pages/index.astro +8 -0
  786. package/skills/wix-headless-templates/storefront/project/src/styles/global.css +57 -0
  787. package/skills/wix-headless-templates/storefront/project/src/wix/config.ts +16 -0
  788. package/skills/wix-headless-templates/storefront/project/src/wix/media.ts +106 -0
  789. package/skills/wix-headless-templates/storefront/project/src/wix/money.ts +24 -0
  790. package/skills/wix-headless-templates/storefront/project/src/wix/sdk.ts +89 -0
  791. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart-core.ts +220 -0
  792. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart-store.ts +134 -0
  793. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/cart.ts +186 -0
  794. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/catalog-core.ts +698 -0
  795. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/catalog.ts +260 -0
  796. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/product-detail-store.ts +280 -0
  797. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/shop-store.ts +341 -0
  798. package/skills/wix-headless-templates/storefront/project/src/wix/storefront/types.ts +305 -0
  799. package/skills/wix-headless-templates/storefront/project/tsconfig.json +5 -0
  800. package/skills/wix-headless-templates/storefront/rest/cart.ts +183 -0
  801. package/skills/wix-headless-templates/storefront/rest/catalog.ts +267 -0
  802. package/skills/wix-headless-templates/storefront/seed/SEED.md +169 -0
  803. package/skills/wix-headless-templates/storefront/seed/read-site.mjs +38 -0
  804. package/skills/wix-headless-templates/storefront/seed/seed-store.mjs +839 -0
  805. package/skills/wix-manage/SKILL.md +11 -7
  806. package/skills/wix-manage/references/bookings/end-to-end-booking-flow.md +1 -1
  807. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +206 -0
  808. package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +17 -24
  809. package/skills/wix-manage/references/sites/create-headless-site.md +2 -0
  810. package/skills/wix-manage/references/sites/upload-static-site.md +281 -171
  811. package/skills/wix-manage/references/stores/update-product-with-options.md +1 -1
  812. package/skills/wix-headless/entry/bootstrap.mjs +0 -156
  813. package/skills/wix-headless/entry/skill.md +0 -78
  814. package/skills/wix-headless-kit/cold-start/bootstrap.mjs +0 -156
  815. package/skills/wix-headless-kit/cold-start/cold-start.md +0 -111
  816. package/skills/wix-manage/references/bookings/booking-system-integration-gaps.md +0 -423
@@ -0,0 +1,183 @@
1
+ // Cart + checkout over REST (Wix eCom Cart V2) — the twin of app/wix/storefront/cart.ts. Same
2
+ // exports, same Cart/CartLine DTOs; rules and mappers from cart-core (the SAME file the SDK
3
+ // transport uses, deployed flat next to this one). The request shapes are exact and rewriting
4
+ // them is how carts break. Failures are loud: out-of-stock lines, an empty cart at checkout, a
5
+ // missing required selection, a bad coupon all throw buyer copy — surface the message to the buyer.
6
+ // All calls run with the visitor token: the cart is the token's (see ../shared/client).
7
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/add-line-items-to-current-cart.md
8
+ // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
+ import { WixApiError, wixRequest } from "./client.js";
10
+ import { imgSrc } from "./media.js";
11
+ import { EMPTY_TOTALS, WIX_STORES_APP_ID, addOptions, assertAdded, assertCheckoutable, cartErrorMessage, rawId, summaryTotals, toCart } from "./cart-core.js";
12
+ import type { Raw } from "./catalog-core.js";
13
+ import type { Cart } from "./types.js";
14
+
15
+ const CART = "/ecom/v2/carts/current";
16
+
17
+ export interface AddToCartExtras {
18
+ /** The resolved variant's option selections: option key → choice key (sent beside variantId, as Wix's own storefront does). */
19
+ optionChoices?: Record<string, string>;
20
+ /** Choice modifiers: modifier key → chosen choice key. */
21
+ modifierChoices?: Record<string, string>;
22
+ /** Free-text modifiers: the modifier's free-text key → the buyer's text. */
23
+ customTextFields?: Record<string, string>;
24
+ /** A chosen recurring plan (SubscriptionPlan.id); omit for a one-time purchase. */
25
+ subscriptionOptionId?: string;
26
+ /** The resolved variant is out of stock but pre-orderable → preOrderRequested. */
27
+ preorder?: boolean;
28
+ }
29
+
30
+ // Every cart call fails with buyer copy (cart-core maps Wix's codes; the rest keep their message).
31
+ async function loud<T>(op: () => Promise<T>): Promise<T> {
32
+ try {
33
+ return await op();
34
+ } catch (e) {
35
+ throw new Error(cartErrorMessage(e));
36
+ }
37
+ }
38
+
39
+ // A line's attributes.image comes back absent right after an add (verified live) — join the
40
+ // products' main images by catalogItemId, once per product, cached for the session.
41
+ // POST /stores/v3/products/query { query: { filter: { id: { $in: [...] } } } }
42
+ const lineImageCache = new Map<string, string>();
43
+ async function fillLineImages(cart: Cart, raws: Raw[]): Promise<void> {
44
+ const wanted = new Map<string, number[]>();
45
+ raws.forEach((raw, i) => {
46
+ if (cart.lines[i].imageUrl) return;
47
+ const pid = raw.source?.catalogReference?.catalogItemId;
48
+ if (!pid) return;
49
+ const cached = lineImageCache.get(pid);
50
+ if (cached !== undefined) { cart.lines[i].imageUrl = cached; return; }
51
+ wanted.set(pid, [...(wanted.get(pid) ?? []), i]);
52
+ });
53
+ if (!wanted.size) return;
54
+ try {
55
+ const res = await wixRequest<Raw>("/stores/v3/products/query", { body: { query: { filter: { id: { $in: [...wanted.keys()] } }, cursorPaging: { limit: 100 } } } });
56
+ for (const p of (res?.products ?? []) as Raw[]) {
57
+ const url = imgSrc(p.media?.main, 300, 300);
58
+ lineImageCache.set(rawId(p), url);
59
+ for (const i of wanted.get(rawId(p)) ?? []) cart.lines[i].imageUrl = url;
60
+ }
61
+ } catch {
62
+ /* images are a nicety — the cart stays correct without them */
63
+ }
64
+ }
65
+
66
+ async function readCart(raw: Raw | null): Promise<Cart> {
67
+ // Only estimate a cart WITH lines — on an absent/empty cart the endpoint returns 404.
68
+ if (!raw?.lineItems?.length) return toCart(raw, EMPTY_TOTALS, imgSrc);
69
+ // The totals come from the estimate, never from hand-summing lines: the after-discount subtotal,
70
+ // named discounts, fees and taxes (calculated when asked), the total before delivery. Delivery
71
+ // resolves at checkout — never render it as "Free" here.
72
+ // POST /ecom/v2/carts/current/estimate { calculateTax, calculateAdditionalFees }
73
+ let totals = EMPTY_TOTALS;
74
+ try {
75
+ totals = summaryTotals(await wixRequest<Raw>(`${CART}/estimate`, { body: { calculateTax: true, calculateAdditionalFees: true } }), raw);
76
+ } catch {
77
+ /* the estimate is a display nicety — the cart itself is still valid */
78
+ }
79
+ const cart = toCart(raw, totals, imgSrc);
80
+ await fillLineImages(cart, raw.lineItems as Raw[]);
81
+ return cart;
82
+ }
83
+
84
+ // GET /ecom/v2/carts/current — a 404 (CURRENT_CART_NOT_FOUND / OWNED_CART_NOT_FOUND) means no cart yet.
85
+ async function getCurrentCartRaw(): Promise<Raw | null> {
86
+ try {
87
+ return (await wixRequest<Raw>(CART, { method: "GET" }))?.cart ?? null;
88
+ } catch (e) {
89
+ if (e instanceof WixApiError && e.status === 404) return null;
90
+ throw e;
91
+ }
92
+ }
93
+
94
+ /** The visitor's current cart. An empty Cart (not an error) when none exists yet. */
95
+ export async function fetchCart(): Promise<Cart> {
96
+ return readCart(await getCurrentCartRaw());
97
+ }
98
+
99
+ /**
100
+ * Add a product. `variantId` is REQUIRED for any product with options — resolve it first
101
+ * (resolveVariant); a refused add still returns 200, so the returned line is checked.
102
+ * POST /ecom/v2/carts/current/add-line-items { catalogItems: [{ quantity, catalogReference: { appId, catalogItemId, options } }] }
103
+ */
104
+ export async function addToCart(productId: string, variantId?: string | null, quantity = 1, extras: AddToCartExtras = {}): Promise<Cart> {
105
+ return loud(async () => {
106
+ const options = addOptions({ variantId, ...extras });
107
+ const res = await wixRequest<Raw>(`${CART}/add-line-items`, {
108
+ body: { catalogItems: [{ quantity, catalogReference: { catalogItemId: productId, appId: WIX_STORES_APP_ID, ...(Object.keys(options).length ? { options } : {}) } }] },
109
+ });
110
+ assertAdded(res?.cart, productId, variantId);
111
+ return readCart(res?.cart ?? null);
112
+ });
113
+ }
114
+
115
+ /**
116
+ * Change a line's quantity. `lineItemId` is CartLine.lineItemId, never the product id; a flat
117
+ * { id, quantity } is a 400. POST /ecom/v2/carts/current/update-line-items { lineItems: [{ lineItemId, quantity: { newQuantity } }] }
118
+ */
119
+ export async function updateQuantity(lineItemId: string, quantity: number): Promise<Cart> {
120
+ return loud(async () => {
121
+ const res = await wixRequest<Raw>(`${CART}/update-line-items`, { body: { lineItems: [{ lineItemId, quantity: { newQuantity: quantity } }] } });
122
+ return readCart(res?.cart ?? null);
123
+ });
124
+ }
125
+
126
+ /** Remove a line by CartLine.lineItemId. POST /ecom/v2/carts/current/remove-line-items { lineItemIds } */
127
+ export async function removeLine(lineItemId: string): Promise<Cart> {
128
+ return loud(async () => {
129
+ const res = await wixRequest<Raw>(`${CART}/remove-line-items`, { body: { lineItemIds: [lineItemId] } });
130
+ return readCart(res?.cart ?? null);
131
+ });
132
+ }
133
+
134
+ /**
135
+ * Apply a coupon code (one per cart); buyer copy for an unknown, expired, or inapplicable code.
136
+ * POST /ecom/v2/carts/current/add-coupon { coupon: { code } }
137
+ */
138
+ export async function applyCoupon(code: string): Promise<Cart> {
139
+ return loud(async () => {
140
+ const res = await wixRequest<Raw>(`${CART}/add-coupon`, { body: { coupon: { code: code.trim() } } });
141
+ return readCart(res?.cart ?? null);
142
+ });
143
+ }
144
+
145
+ /** Remove the applied coupon (a no-op when none). POST /ecom/v2/carts/current/remove-coupon { couponId } */
146
+ export async function removeCoupon(): Promise<Cart> {
147
+ return loud(async () => {
148
+ const current = await getCurrentCartRaw();
149
+ const couponId = rawId((current?.coupons ?? [])[0]);
150
+ if (!couponId) return readCart(current);
151
+ const res = await wixRequest<Raw>(`${CART}/remove-coupon`, { body: { couponId } });
152
+ return readCart(res?.cart ?? null);
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Save the buyer's note to the merchant on the cart (it travels to checkout and the order).
158
+ * PATCH /ecom/v2/carts/current { cart: { note } }
159
+ */
160
+ export async function setNote(note: string): Promise<Cart> {
161
+ return loud(async () => {
162
+ const res = await wixRequest<Raw>(CART, { method: "PATCH", body: { cart: { note: note.trim() || null } } });
163
+ return readCart(res?.cart ?? null);
164
+ });
165
+ }
166
+
167
+ /**
168
+ * Start the Wix-hosted checkout and return the URL to navigate the FULL document to. The cart's id
169
+ * IS the checkout id (as on Wix's own storefront). `origin` must be the site's real https origin as
170
+ * registered on the OAuth app's allowed domains (browser: window.location.origin; server: the
171
+ * public https host, never the request's internal origin) — an unlisted or http origin 403s on return.
172
+ * POST /headless/v1/redirect-session { ecomCheckout: { checkoutId }, callbacks: { postFlowUrl, thankYouPageUrl } }
173
+ */
174
+ export async function checkoutUrl(origin: string = typeof window !== "undefined" ? window.location.origin : ""): Promise<string> {
175
+ const raw = await getCurrentCartRaw();
176
+ assertCheckoutable(raw);
177
+ const res = await wixRequest<Raw>("/headless/v1/redirect-session", {
178
+ body: { ecomCheckout: { checkoutId: rawId(raw) }, callbacks: origin ? { postFlowUrl: `${origin}/`, thankYouPageUrl: `${origin}/` } : {} },
179
+ });
180
+ const url = res?.redirectSession?.fullUrl;
181
+ if (!url) throw new Error("Checkout couldn't start: no redirect URL returned.");
182
+ return url;
183
+ }
@@ -0,0 +1,267 @@
1
+ // Catalog reads over REST — the twin of app/wix/storefront/catalog.ts. Same exports, same DTOs; the
2
+ // rules and mappers come from catalog-core (the SAME file the SDK transport uses, deployed flat next
3
+ // to this one by deploy.mjs --stack static), so this file is only the transport: one fetch with a
4
+ // literal body per function. Every call here is safe from a browser with a visitor token.
5
+ // Porting: keep the paths, keep the bodies, port the core once.
6
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/search-products.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/get-category-by-slug.md
8
+ import { WixApiError, wixRequest } from "./client.js";
9
+ import { imgSrc, mediaKey } from "./media.js";
10
+ import {
11
+ CATALOG_SORTS,
12
+ DETAIL_FIELDS,
13
+ LIST_FIELDS,
14
+ STORES_TREE,
15
+ choiceAvailability,
16
+ facetCustomizationIds,
17
+ facetSearchBody,
18
+ pageInfo,
19
+ readFacetAggregates,
20
+ resolveVariant,
21
+ searchQuery,
22
+ sellingPrice,
23
+ toCategory,
24
+ toDetail,
25
+ toFacetData,
26
+ toInventory,
27
+ toSummary,
28
+ type CatalogSearchOptions,
29
+ type CatalogSort,
30
+ type FacetSelection,
31
+ type Raw,
32
+ } from "./catalog-core.js";
33
+ import { WIX_STORES_APP_ID } from "./cart-core.js";
34
+ import type { Category, Facet, FacetData, ProductDetail, ProductSummary, VariantInventory } from "./types.js";
35
+
36
+ export { CATALOG_SORTS, choiceAvailability, resolveVariant, sellingPrice, type CatalogSearchOptions, type CatalogSort, type FacetSelection };
37
+
38
+ const notFound = (e: unknown): boolean => e instanceof WixApiError && e.status === 404;
39
+
40
+ /**
41
+ * The gallery query: sort, filter, facets, search, and cursor paging, all applied by Wix across the
42
+ * whole catalog — never on a page already in hand. `total` is issued alongside the first page only;
43
+ * `hasMore` is the API's own `hasNext`.
44
+ * POST /stores/v3/products/search { fields, search: { filter, sort, search, cursorPaging } }
45
+ * POST /stores/v3/products/count { filter }
46
+ */
47
+ export async function searchCatalog(o: CatalogSearchOptions = {}): Promise<{ products: ProductSummary[]; nextCursor: string | null; hasMore: boolean; total: number | null }> {
48
+ const search = searchQuery(o);
49
+ const [res, count] = await Promise.all([
50
+ wixRequest<Raw>("/stores/v3/products/search", { body: { fields: LIST_FIELDS, search } }),
51
+ // the count is a nicety — the page is still valid without it
52
+ !o.cursor ? wixRequest<Raw>("/stores/v3/products/count", { body: { filter: search.filter } }).catch(() => null) : Promise.resolve(null),
53
+ ]);
54
+ return {
55
+ products: ((res?.products ?? []) as Raw[]).map((p) => toSummary(p, imgSrc, mediaKey)),
56
+ ...pageInfo(res),
57
+ total: typeof count?.count === "number" ? count.count : null,
58
+ };
59
+ }
60
+
61
+ export async function fetchFacets(scope: { categoryId?: string | null } = {}): Promise<Facet[]> {
62
+ return (await fetchFacetData(scope)).facets;
63
+ }
64
+
65
+ /**
66
+ * Facets and price bounds of a scope: ONE aggregations-only search (cursorPaging.limit 0 — no
67
+ * products, whatever the catalog size), then the named customizations for names, colors, order.
68
+ * Non-fatal: empty on failure.
69
+ * POST /stores/v3/products/search { search: { filter, cursorPaging: { limit: 0 }, aggregations } }
70
+ * POST /stores/v3/customizations/query { query: { filter: { id: { $in }, customizationRenderType: { $ne: "FREE_TEXT" } }, cursorPaging: { limit: 100 } } }
71
+ */
72
+ export async function fetchFacetData({ categoryId }: { categoryId?: string | null } = {}): Promise<FacetData> {
73
+ try {
74
+ const res = await wixRequest<Raw>("/stores/v3/products/search", { body: { search: facetSearchBody(categoryId) } });
75
+ const agg = readFacetAggregates(res);
76
+ return toFacetData(agg, await fetchCustomizations(facetCustomizationIds(agg)));
77
+ } catch {
78
+ return { facets: [], priceRange: null };
79
+ }
80
+ }
81
+
82
+ async function fetchCustomizations(ids: string[]): Promise<Raw[]> {
83
+ if (!ids.length) return [];
84
+ const batches: string[][] = [];
85
+ for (let i = 0; i < ids.length; i += 100) batches.push(ids.slice(i, i + 100));
86
+ const pages = await Promise.all(
87
+ batches.map((batch) =>
88
+ wixRequest<Raw>("/stores/v3/customizations/query", {
89
+ body: { query: { filter: { id: { $in: batch }, customizationRenderType: { $ne: "FREE_TEXT" } }, cursorPaging: { limit: 100 } } },
90
+ }),
91
+ ),
92
+ );
93
+ return pages.flatMap((p) => (p?.customizations ?? []) as Raw[]);
94
+ }
95
+
96
+ export async function fetchProducts({ limit = 24 } = {}): Promise<ProductSummary[]> {
97
+ return (await searchCatalog({ limit })).products;
98
+ }
99
+
100
+ export async function fetchProductsByCategory(categoryId: string, { limit = 24 } = {}): Promise<ProductSummary[]> {
101
+ return (await searchCatalog({ limit, categoryId })).products;
102
+ }
103
+
104
+ /**
105
+ * One complete product for the PDP; null when the slug doesn't resolve — a real 404, never a
106
+ * fallback to another product. GET /stores/v3/products/slug/{slug}?fields=…&fields=…
107
+ */
108
+ export async function fetchProductBySlug(slug: string): Promise<ProductDetail | null> {
109
+ try {
110
+ const res = await wixRequest<Raw>(`/stores/v3/products/slug/${encodeURIComponent(decodeSlug(slug))}`, { method: "GET", query: { fields: DETAIL_FIELDS } });
111
+ return res?.product ? toDetail(res.product, imgSrc, mediaKey) : null;
112
+ } catch (e) {
113
+ if (notFound(e)) return null;
114
+ throw e;
115
+ }
116
+ }
117
+
118
+ function decodeSlug(slug: string): string {
119
+ try {
120
+ return decodeURIComponent(slug);
121
+ } catch {
122
+ return slug;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * The id of Wix's auto-created "All Products" system category — excluded from navigation by id.
128
+ * null when the read fails (the slug heuristic then stands in). GET /stores/v3/all-products-category
129
+ */
130
+ export async function fetchAllProductsCategoryId(): Promise<string | null> {
131
+ try {
132
+ const res = await wixRequest<Raw>("/stores/v3/all-products-category", { method: "GET" });
133
+ return res?.categoryId ?? null;
134
+ } catch {
135
+ return null;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * The live VISIBLE category tree for navigation — never a seeded list; every page of it; the
141
+ * "All Products" system category dropped by id. The API returns only visible categories unless
142
+ * asked otherwise; the `visible` filter also keeps the query non-empty (an empty filter is
143
+ * rejected on the visitor path). Non-fatal: [] on failure.
144
+ * POST /categories/v1/categories/query { treeReference, fields, query: { filter: { visible: true }, cursorPaging: { limit, cursor } } }
145
+ */
146
+ export async function fetchCategories(): Promise<Category[]> {
147
+ try {
148
+ const [allProductsId, items] = await Promise.all([fetchAllProductsCategoryId(), readCategoryPages()]);
149
+ return items
150
+ .filter((c) => c.visible !== false)
151
+ .map((c) => toCategory(c, imgSrc))
152
+ .filter((c) => (allProductsId ? c.id !== allProductsId : c.slug !== "all-products"));
153
+ } catch {
154
+ return [];
155
+ }
156
+ }
157
+
158
+ async function readCategoryPages(): Promise<Raw[]> {
159
+ const out: Raw[] = [];
160
+ let cursor: string | null = null;
161
+ for (let i = 0; i < 20; i++) {
162
+ const res: Raw = await wixRequest<Raw>("/categories/v1/categories/query", {
163
+ body: {
164
+ treeReference: STORES_TREE,
165
+ fields: ["DESCRIPTION"],
166
+ query: cursor ? { cursorPaging: { limit: 100, cursor } } : { filter: { visible: true }, cursorPaging: { limit: 100 } },
167
+ },
168
+ });
169
+ out.push(...((res?.categories ?? []) as Raw[]));
170
+ cursor = res?.pagingMetadata?.hasNext ? res?.pagingMetadata?.cursors?.next ?? null : null;
171
+ if (!cursor) break;
172
+ }
173
+ return out;
174
+ }
175
+
176
+ /**
177
+ * One category by URL slug (its id feeds searchCatalog; name, description, image, breadcrumbs head
178
+ * the page). The response is WRAPPED: { category }. null when missing or hidden → a real 404.
179
+ * GET /categories/v1/categories/slug/{slug}?treeReference.appNamespace=@wix/stores&fields=BREADCRUMBS_INFO&fields=DESCRIPTION
180
+ */
181
+ export async function fetchCategoryBySlug(slug: string): Promise<Category | null> {
182
+ try {
183
+ const res = await wixRequest<Raw>(`/categories/v1/categories/slug/${encodeURIComponent(decodeSlug(slug))}`, {
184
+ method: "GET",
185
+ query: { "treeReference.appNamespace": "@wix/stores", fields: ["BREADCRUMBS_INFO", "DESCRIPTION"] },
186
+ });
187
+ const raw: Raw | undefined = res?.category;
188
+ return raw && raw.visible !== false ? toCategory(raw, imgSrc) : null;
189
+ } catch (e) {
190
+ if (notFound(e)) return null;
191
+ throw e;
192
+ }
193
+ }
194
+
195
+ // The default Stores location — inventory is per location. Read once per session.
196
+ // POST /stores/v3/locations/query { query: { filter: { defaultLocation: true } } }
197
+ let defaultLocation: Promise<string | null> | null = null;
198
+ export function fetchDefaultLocationId(): Promise<string | null> {
199
+ defaultLocation ??= wixRequest<Raw>("/stores/v3/locations/query", { body: { query: { filter: { defaultLocation: true } } } })
200
+ .then((r) => ((r?.storesLocations ?? []) as Raw[])[0]?.id ?? null)
201
+ .catch(() => null);
202
+ return defaultLocation;
203
+ }
204
+
205
+ /**
206
+ * Live inventory of a product's variants at the default location, keyed by variantId; {} on
207
+ * failure. Merge with mergeInventory() from ./catalog-core.
208
+ * POST /stores/v3/inventory-items/query { query: { filter: { productId, locationId }, cursorPaging: { limit: 100 } } }
209
+ */
210
+ export async function fetchInventory(productId: string): Promise<Record<string, VariantInventory>> {
211
+ try {
212
+ const locationId = await fetchDefaultLocationId();
213
+ const items: Raw[] = [];
214
+ let cursor: string | null = null;
215
+ for (let i = 0; i < 10; i++) {
216
+ const res: Raw = await wixRequest<Raw>("/stores/v3/inventory-items/query", {
217
+ body: { query: cursor ? { cursorPaging: { limit: 100, cursor } } : { filter: { productId, ...(locationId ? { locationId } : {}) }, cursorPaging: { limit: 100 } } },
218
+ });
219
+ items.push(...((res?.inventoryItems ?? []) as Raw[]));
220
+ cursor = res?.pagingMetadata?.hasNext ? res?.pagingMetadata?.cursors?.next ?? null : null;
221
+ if (!cursor) break;
222
+ }
223
+ return toInventory(items);
224
+ } catch {
225
+ return {};
226
+ }
227
+ }
228
+
229
+ // Back in Stock (eCom). The public paths are the ones the generated SDK resolves for
230
+ // www.wixapis.com: its "/back-in-stock-service" prefix in front of the service paths, and
231
+ // GetSettings as a PUT with an empty body — kept exactly, not guessed.
232
+ const BACK_IN_STOCK = "/back-in-stock-service/v1/back-in-stock-notification-requests";
233
+
234
+ // Whether the merchant collects "notify me" requests for Stores items. Read once; false on failure.
235
+ // PUT /back-in-stock-service/v1/back-in-stock-notification-requests/settings {}
236
+ let backInStockEnabled: Promise<boolean> | null = null;
237
+ export function fetchBackInStockEnabled(): Promise<boolean> {
238
+ backInStockEnabled ??= wixRequest<Raw>(`${BACK_IN_STOCK}/settings`, { method: "PUT", body: {} })
239
+ .then((r) => ((r?.settings?.collectionStates ?? []) as Raw[]).some((s) => s.appId === WIX_STORES_APP_ID && s.collectingRequests === true))
240
+ .catch(() => false);
241
+ return backInStockEnabled;
242
+ }
243
+
244
+ /**
245
+ * Ask Wix to email the buyer when the variant is back in stock. `price` is the variant's plain
246
+ * amount (a decimal string). "already-subscribed" when that email already asked for this item.
247
+ * POST /back-in-stock-service/v1/back-in-stock-notification-requests { request: { catalogReference, email }, itemDetails: { name, price, image } }
248
+ */
249
+ export async function requestBackInStock(
250
+ productId: string,
251
+ variantId: string | null,
252
+ email: string,
253
+ item: { name: string; price: string; imageUrl?: string },
254
+ ): Promise<"created" | "already-subscribed"> {
255
+ try {
256
+ await wixRequest<Raw>(BACK_IN_STOCK, {
257
+ body: {
258
+ request: { catalogReference: { catalogItemId: productId, appId: WIX_STORES_APP_ID, ...(variantId ? { options: { variantId } } : {}) }, email },
259
+ itemDetails: { name: item.name, price: item.price, ...(item.imageUrl ? { image: item.imageUrl } : {}) },
260
+ },
261
+ });
262
+ return "created";
263
+ } catch (e) {
264
+ if (e instanceof WixApiError && e.code === "BACK_IN_STOCK_NOTIFICATION_REQUEST_ALREADY_EXISTS") return "already-subscribed";
265
+ throw e;
266
+ }
267
+ }
@@ -0,0 +1,169 @@
1
+ # Storefront — seeding
2
+
3
+ Seed the Wix Stores catalog by **running `seed-store.mjs` with a plan file** — don't hand-write
4
+ the REST calls. The script mints its own site token via the Wix CLI (requires a logged-in CLI
5
+ session and a `wix.config.json` in the working directory), installs the Stores app if needed,
6
+ waits for the V3 catalog, and creates everything in the right order.
7
+
8
+ **Set each product's type by what the buyer receives** — physical (shipped, has `quantity`) or
9
+ digital (a file they keep, `digitalFilePath`/`digitalFileUrl`, no `quantity`); the plan below shows
10
+ both. *Access* — a membership or an online course/program the buyer enrolls in — is Pricing Plans,
11
+ not a store product.
12
+
13
+ ```bash
14
+ # from the project root (where wix.config.json lives):
15
+ node <SKILL_ROOT>/templates/storefront/seed/seed-store.mjs plan.json
16
+ ```
17
+
18
+ Run this way, the result is the process itself: exit code `0` and the JSON on stdout (redirect it
19
+ to a file if you want it later). `.seed-exit` and `seed-result.json` are written by
20
+ `install/setup.mjs` when IT starts the seed — don't wait for them after a manual run.
21
+
22
+ `plan.json` is plain data — write it from the brief:
23
+
24
+ ```json
25
+ {
26
+ "products": [
27
+ { "name": "The Glam Rocker", "description": "Sequin-studded velvet legend…",
28
+ "price": 49.99, "quantity": 12, "imageUrl": "https://…" },
29
+ { "name": "The Understudy", "description": "…", "price": 245, "quantity": 8,
30
+ "options": [{ "name": "Color", "type": "color",
31
+ "choices": [{ "name": "Ink", "colorCode": "#1B1B2F", "imageUrl": "https://…/ink.jpg" },
32
+ { "name": "Bone", "colorCode": "#EDE6D6", "imageUrl": "https://…/bone.jpg" }] }] },
33
+ { "name": "Encore Jacket", "description": "…", "price": 68, "compareAtPrice": 129,
34
+ "quantity": 5, "ribbon": "Sale",
35
+ "options": [{ "name": "Size", "choices": ["S", "M", "L"] }],
36
+ "variantPrices": { "L": 74 },
37
+ "modifiers": [{ "name": "Gift wrap", "mandatory": false, "choices": ["None", "Kraft paper"] },
38
+ { "name": "Engraving", "type": "text", "maxChars": 30 }],
39
+ "infoSections": [{ "title": "Care", "description": "Dry clean only." }] },
40
+ { "name": "Tour Poster", "description": "…", "price": 24, "quantity": 0,
41
+ "preorder": { "message": "Ships in 3 weeks", "limit": 50 } },
42
+ { "name": "Backstage Guide", "description": "…", "price": 12,
43
+ "digitalFilePath": "/Users/me/guide.pdf" }
44
+ ],
45
+ "categories": { "Legends": ["The Glam Rocker"], "Rising Stars": [] },
46
+ "categoryDetails": { "Legends": { "description": "The originals.", "imagePrompt": "…, no text, no watermarks" } },
47
+ "currency": "EUR"
48
+ }
49
+ ```
50
+
51
+ - `description` — plain text or simple HTML (`<p>`, `<br/>`, `<strong>`, `<em>`); converted to
52
+ Wix rich text so the storefront renders paragraphs and bold, not tag text.
53
+ - `options` — ONLY things the buyer selects-and-buys (Size, Color); they become variants.
54
+ `type: "color"` renders as real swatches (give every color choice a `colorCode`); anything
55
+ else renders as text pills. Variants are expanded automatically (full cross-product, each
56
+ carrying the product's price/compareAtPrice/quantity) — keep option counts small.
57
+ A choice may carry its own photo — `imageUrl` | `imagePath` | `imagePrompt` (+ `altText`), the
58
+ same three forms as a product image: it joins the product's gallery and the product page shows
59
+ it when that choice is picked (a colour's photo). Give it when the source has one per colour.
60
+ - `variantPrices` — `{ "<choice name>": price }` when one option's choices are priced differently
61
+ ("L": 74): every variant carrying that choice takes that price (the first priced choice wins);
62
+ the tile then shows the range. Omit it when every variant costs the same.
63
+ - `compareAtPrice` (> `price`) — the "was" price: strikethrough on the PDP, sale badge data on
64
+ the tile. Kept only on variants it stays above.
65
+ - `ribbon` — the label on the tile and PDP ("New", "Best Seller"); one per product, created by name.
66
+ - `modifiers` — buyer input that does NOT create variants: `{ name, choices: ["None", "Kraft paper"] }`
67
+ renders pills, `{ name, type: "text", maxChars?, minChars? }` a free-text field. `mandatory`
68
+ defaults to true (the storefront blocks the add until it's filled) — set `false` for optional
69
+ extras. A choice may carry `addedPrice`.
70
+ - `infoSections` — `[{ title, description }]` (same description rules as above) — the PDP renders
71
+ them as sections/accordions; two products with the same title share one section.
72
+ - `preorder` — `{ message?, limit? }` on a product WITH a `quantity` (pre-order rides on counted
73
+ stock): once stock hits zero the storefront sells it as "Pre-order" with the message, up to
74
+ `limit` units. Seed the pre-order item with `quantity: 0` when the brief wants it pre-orderable
75
+ from day one.
76
+ - **Give every product an image** (a store without product images looks broken: gray boxes on
77
+ tiles, PDP, and cart) — the default is an `imagePrompt` (AI-generated, ~1 Wix AI credit
78
+ per image, account-billed): brand-contextual — subject, aesthetic/mood, palette, lighting —
79
+ always ending "no text, no watermarks". At least one image in the set shows the real subject of the business — the actual product/space/service, not abstract decoration. For an asset the user actually supplied use `imagePath` (a file on
80
+ this machine — uploaded to Wix Media) or `imageUrl` (their own hosted URL; verify it with
81
+ `curl -sI` → 200) — never a stock-photo or guessed URL. Images resolve in parallel and never block the seed; a failed image leaves
82
+ that product text-only. Seed text-only only when the user explicitly asks.
83
+ - `digitalFilePath` (a file on this machine) or `digitalFileUrl` — makes the product a digital
84
+ download, uploaded and created with both the file and stock (`quantity` is ignored). It's also the
85
+ only way in: a file-less digital product is created successfully, reads back healthy, and is then
86
+ rejected at add-to-cart as `ITEM_NOT_FOUND_IN_CATALOG`. **No real file in hand?** Don't invent a
87
+ URL and don't ship the product as digital — seed it physical with stock (drop
88
+ `digitalFilePath`/`digitalFileUrl`, add `inStock` or a `quantity`) and tell the user the
89
+ download needs a real file before it can be sold.
90
+ - `categories` — category name → product NAMES. Omit when the brief names none.
91
+ - `categoryDetails` — per category name: `description` (plain text, the category page's intro)
92
+ and one image source (`imagePrompt` / `imageUrl` / `imagePath`, same rules as product images)
93
+ for the category's own image (`Category.imageUrl` — home-page category tiles). Applied on
94
+ create only; an existing category keeps what it has.
95
+ - `quantity` — tracked stock, a non-negative integer. For stock that isn't counted (made to
96
+ order, print on demand, unlimited) use `"inStock": true` **instead** of `quantity`; sending
97
+ both is rejected.
98
+ - `currency` — 3-letter ISO code. Set it **only when the brief names one**: a sentence about
99
+ currency ("prices in euros") or a price written with its unit ("9 dollars", "$9", "€20"). Do **not** infer it from a language, a country, or an address
100
+ — an unrequested switch silently reprices the whole catalog. The seed applies it before
101
+ creating anything, because a product's price is stored in the site currency at create time.
102
+ For a few seconds afterwards product reads can still report the old currency; that lag is
103
+ expected and self-resolves, so don't re-verify it or retry.
104
+
105
+ **Default to 3 products** when you draft the catalog yourself — the seed shows the shape, not a
106
+ full inventory; the owner adds the rest in the dashboard. **Make those 3 exercise the shipped
107
+ UI**: give at least one product a color option and put one product on sale — truthfully to the
108
+ business (a ceramics studio has glaze colors; a bakery doesn't). When the brief mentions gift
109
+ wrap, engraving, a message card, pre-orders, or "coming soon" stock, seed ONE product with that
110
+ modifier and ONE pre-order item so the surfaces exist to design against; never add them to a
111
+ brief that didn't ask.
112
+
113
+ ## Supplied content
114
+
115
+ The general rules are in `templates/shared/SUPPLIED-CONTENT.md`. For a store, each product the user
116
+ lists is one entry, whatever form the list arrives in. Its name, description and price become
117
+ `name`, `description` and `price`. A "was", "regular" or "compare at" price becomes `compareAtPrice`
118
+ when it is higher than the price. A stock count becomes `quantity`; "unlimited" or "made to order"
119
+ becomes `"inStock": true`. A category, collection or type becomes an entry in `categories`. A set of
120
+ choices the buyer picks from ("Small / Large", "S, M, L") becomes one `options` entry named after
121
+ what it is (Size, Flavor), `type: "text"`; use `type: "color"` only when the source gives color codes.
122
+ Their image becomes `imageUrl`. A separate price per size becomes `variantPrices` keyed by the
123
+ choice name, with `price` the lowest. A label like "New" or "Best Seller" becomes `ribbon`; "gift
124
+ wrap", "engraving", "add a message" become `modifiers`; a "ships in N weeks" item becomes
125
+ `preorder`; a materials/shipping/care paragraph becomes an `infoSections` entry. If a product has
126
+ no price, ask; never invent one. SKU codes are not seeded — say so.
127
+
128
+ **Seeding is additive — the seed never deletes or overwrites anything on the site, and neither do
129
+ you.** There is no cleanup flag and no cleanup step. The Stores install adds its own sample catalog to
130
+ a new site (a dozen products: "Baseball Cap", "Ceramic Flower Vase", "Crew T-Shirt", ...), and the
131
+ live shop lists them next to the owner's, so they are never silent: the result's `preexisting[]` names
132
+ every product the plan did not name (`{ id, name, slug }`), and the closing message says so with the
133
+ Manage products link (`dashboardProductsUrl` in the result) so the owner removes them there if they
134
+ want to. Categories are idempotent by name — a re-run reuses "Donuts" instead of creating a second one.
135
+
136
+ **Images are confirmed, not assumed.** `imagesAttached` counts the attaches the API reported as
137
+ successful; `imageFailures: [{ name, error }]` names the products left without an image and why.
138
+ `choiceImagesLinked` counts the choice photos linked to their choice, `choiceImageFailures:
139
+ [{ name, choice, error }]` the ones that are in the gallery but not linked (a re-run links them)
140
+ (one miss out of three was seen live — a revision moved between read and update). The seed already
141
+ retries a miss once. To retry again, re-run the same plan: existing products are reused and their
142
+ images attached; nothing is duplicated.
143
+
144
+ **A bulk create can partially succeed.** The result carries `failures: [{ name, error }]` next
145
+ to `products` — read it. A non-empty `failures` means those products are genuinely absent, not
146
+ mis-mapped, so the rest of the catalog is fine to build on. To retry, re-run the **same** plan:
147
+ creation is idempotent by name, so products that already exist are skipped rather than
148
+ duplicated. Never hand-patch ids to "fill the gap".
149
+
150
+ Two things this module does not seed (dashboard-only — tell the merchant): **SKUs** and
151
+ **subscription plans** (the storefront renders them when the merchant adds them).
152
+
153
+ ## Escape hatch — individual functions
154
+
155
+ `setupStore` is built from exported steps; import them only for a partial re-seed or custom
156
+ ordering: `installStoresApp`, `readAllProducts`, `bulkCreateProducts`,
157
+ `createCategories(ctx, names, details?)`, `addProductsToCategories`, `attachProductImages` — plus
158
+ `makeCtx()` for the auth context.
159
+
160
+ ## Reference
161
+
162
+ If a call returns an unexpected shape or you need an operation this module doesn't cover, read
163
+ the live Wix API reference — never guess. Every call in the script carries a `docs:` line
164
+ with its reference page. Key pages:
165
+
166
+ - Bulk Create Products With Inventory: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/bulk-create-products-with-inventory.md
167
+ - Create Category: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/create-category.md
168
+ - Bulk Add Items To Category: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/bulk-add-items-to-category.md
169
+ - Bulk Update Products (image attach): https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/bulk-update-products.md
@@ -0,0 +1,38 @@
1
+ // What the store holds: products (names, prices, options, media, stock), categories. Run it before
2
+ // designing a storefront for a site that already has content:
3
+ // node <SKILL_ROOT>/templates/storefront/seed/read-site.mjs [--site <siteId>] [--limit <n>]
4
+ // Every request here is the one the deployed data layer makes (rest/catalog.ts); the doc URL of
5
+ // each method is in the output's `calls`.
6
+ import { runReader } from "../../shared/seed/read-site.mjs";
7
+
8
+ const STORES_APP_ID = "215238eb-22a5-4c36-9e7b-e7c08025e04e";
9
+ const D = "https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3";
10
+ const LIST_FIELDS = ["CURRENCY", "MEDIA_ITEMS_INFO", "MIN_PRICE_VARIANT", "DISCOUNT_INFO"];
11
+ const VISIBLE = { $and: [{ visible: true }] };
12
+ const TREE = { appNamespace: "@wix/stores", treeKey: null };
13
+
14
+ await runReader({
15
+ vertical: "storefront",
16
+ appId: STORES_APP_ID,
17
+ async read(api, { limit }) {
18
+ const count = await api.tryCall({ path: "/stores/v3/products/count", body: { filter: VISIBLE }, docs: `${D}/products-v3/count-products` });
19
+ const search = await api.call({ path: "/stores/v3/products/search", body: { fields: LIST_FIELDS, search: { filter: VISIBLE, cursorPaging: { limit } } }, docs: `${D}/products-v3/search-products` });
20
+ const cats = await api.tryCall({ path: "/categories/v1/categories/query", body: { treeReference: TREE, query: { filter: { name: { $exists: true } }, cursorPaging: { limit: 100 } } }, docs: `${D}/categories/query-categories` });
21
+ const products = (search.products ?? []).map((p) => ({
22
+ name: p.name, slug: p.slug,
23
+ price: p.actualPriceRange?.minValue?.formattedAmount ?? null,
24
+ priceMax: p.actualPriceRange?.maxValue?.formattedAmount ?? null,
25
+ compareAt: p.compareAtPriceRange?.minValue?.formattedAmount ?? null,
26
+ options: (p.options ?? []).map((o) => `${o.name} (${o.choicesSettings?.choices?.length ?? 0})`),
27
+ media: p.media?.itemsInfo?.items?.length ?? 0,
28
+ availability: p.inventory?.availabilityStatus ?? null,
29
+ }));
30
+ return {
31
+ currency: search.products?.[0]?.currency ?? null,
32
+ productCount: typeof count?.count === "number" ? count.count : null,
33
+ products,
34
+ productsShown: products.length,
35
+ categories: (cats?.categories ?? []).filter((c) => c.slug !== "all-products").map((c) => ({ id: c.id, name: c.name, slug: c.slug, visible: c.visible !== false })),
36
+ };
37
+ },
38
+ });