@wix/agent-skills 1.17.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +115 -12
  3. package/skills/wix-app/references/APP_MARKET_REVIEW.md +1 -1
  4. package/skills/wix-app/references/BACKEND_API.md +18 -0
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +6 -0
  6. package/skills/wix-app/references/DASHBOARD_MODAL.md +10 -2
  7. package/skills/wix-app/references/DASHBOARD_PAGE.md +32 -70
  8. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +74 -83
  9. package/skills/wix-app/references/SITE_PLUGIN.md +12 -0
  10. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +74 -68
  11. package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +79 -0
  12. package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +73 -0
  13. package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +52 -0
  14. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +184 -0
  15. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +12 -11
  16. package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +1 -0
  17. package/skills/wix-app/references/editor-react-component/BROWSER-SUPPORT.md +56 -0
  18. package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +16 -8
  19. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +47 -14
  20. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +3 -0
  21. package/skills/wix-base44-connector/SKILL.md +133 -44
  22. package/skills/wix-base44-connector/references/CAPABILITY_MAP.md +78 -0
  23. package/skills/wix-base44-connector/scripts/utils.js +216 -30
  24. package/skills/wix-headless/entry/skill.md +1 -1
  25. package/skills/wix-headless/references/CAPABILITIES.md +9 -1
  26. package/skills/wix-headless/references/DESIGN.md +1 -0
  27. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  28. package/skills/wix-headless/references/IMAGE_GENERATION.md +1 -0
  29. package/skills/wix-headless/references/SDK_HANDOFF.md +4 -1
  30. package/skills/wix-headless/references/SEED.md +2 -1
  31. package/skills/wix-headless/references/SETUP.md +1 -0
  32. package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +2 -2
  33. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +26 -8
  34. package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +26 -10
  35. package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +8 -8
  36. package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +1 -1
  37. package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +1 -1
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-rentals.md +254 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-forms.md +57 -10
  40. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +13 -0
  41. package/skills/wix-headless/references/inline-recipes/setup-rentals.md +254 -0
  42. package/skills/wix-headless/references/non-astro.md +1 -1
  43. package/skills/wix-headless-fast/SKILL.md +166 -0
  44. package/skills/wix-headless-fast/entry/skill.md +99 -0
  45. package/skills/wix-headless-fast/install/deploy.mjs +433 -0
  46. package/skills/wix-headless-fast/install/fast-path.mjs +141 -0
  47. package/skills/wix-headless-fast/references/blog/INSTRUCTIONS.md +137 -0
  48. package/skills/wix-headless-fast/references/blog/app/components/blog/BlogFeedView.tsx +137 -0
  49. package/skills/wix-headless-fast/references/blog/app/components/blog/PostView.tsx +113 -0
  50. package/skills/wix-headless-fast/references/blog/app/components/blog/RichContent.tsx +42 -0
  51. package/skills/wix-headless-fast/references/blog/app/hooks/blog/useBlogFeed.ts +123 -0
  52. package/skills/wix-headless-fast/references/blog/app/hooks/blog/usePost.ts +70 -0
  53. package/skills/wix-headless-fast/references/blog/app/wix/blog/posts.ts +99 -0
  54. package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy.ts +76 -0
  55. package/skills/wix-headless-fast/references/blog/app/wix/blog/types.ts +62 -0
  56. package/skills/wix-headless-fast/references/blog/app-astro/layouts/SiteLayout.astro +40 -0
  57. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog/[...slug].astro +99 -0
  58. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog.astro +24 -0
  59. package/skills/wix-headless-fast/references/blog/lock/astro/package-lock.json +16156 -0
  60. package/skills/wix-headless-fast/references/blog/seed/SEED.md +72 -0
  61. package/skills/wix-headless-fast/references/blog/seed/seed-blog.mjs +287 -0
  62. package/skills/wix-headless-fast/references/bookings/INSTRUCTIONS.md +129 -0
  63. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServiceBookingView.tsx +143 -0
  64. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServicesView.tsx +119 -0
  65. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useBookingFlow.ts +138 -0
  66. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useServices.ts +54 -0
  67. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking.ts +206 -0
  68. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services.ts +96 -0
  69. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/types.ts +70 -0
  70. package/skills/wix-headless-fast/references/bookings/app-astro/layouts/SiteLayout.astro +40 -0
  71. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services/[slug].astro +76 -0
  72. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services.astro +22 -0
  73. package/skills/wix-headless-fast/references/bookings/lock/astro/package-lock.json +11962 -0
  74. package/skills/wix-headless-fast/references/bookings/seed/SEED.md +61 -0
  75. package/skills/wix-headless-fast/references/bookings/seed/seed-bookings.mjs +302 -0
  76. package/skills/wix-headless-fast/references/cms/INSTRUCTIONS.md +179 -0
  77. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useCollection.ts +83 -0
  78. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useItem.ts +57 -0
  79. package/skills/wix-headless-fast/references/cms/app/wix/cms/items.ts +151 -0
  80. package/skills/wix-headless-fast/references/cms/app/wix/cms/types.ts +75 -0
  81. package/skills/wix-headless-fast/references/cms/app-astro/layouts/SiteLayout.astro +41 -0
  82. package/skills/wix-headless-fast/references/cms/lock/astro/package-lock.json +11262 -0
  83. package/skills/wix-headless-fast/references/cms/seed/SEED.md +103 -0
  84. package/skills/wix-headless-fast/references/cms/seed/seed-cms.mjs +324 -0
  85. package/skills/wix-headless-fast/references/events/INSTRUCTIONS.md +149 -0
  86. package/skills/wix-headless-fast/references/events/app/components/events/EventConfirmationView.tsx +66 -0
  87. package/skills/wix-headless-fast/references/events/app/components/events/EventRegistrationView.tsx +176 -0
  88. package/skills/wix-headless-fast/references/events/app/components/events/EventsView.tsx +118 -0
  89. package/skills/wix-headless-fast/references/events/app/hooks/events/useEventRegistration.ts +117 -0
  90. package/skills/wix-headless-fast/references/events/app/hooks/events/useEvents.ts +59 -0
  91. package/skills/wix-headless-fast/references/events/app/wix/events/events.ts +136 -0
  92. package/skills/wix-headless-fast/references/events/app/wix/events/registration.ts +128 -0
  93. package/skills/wix-headless-fast/references/events/app/wix/events/types.ts +61 -0
  94. package/skills/wix-headless-fast/references/events/app-astro/layouts/SiteLayout.astro +40 -0
  95. package/skills/wix-headless-fast/references/events/app-astro/pages/event-confirmation.astro +12 -0
  96. package/skills/wix-headless-fast/references/events/app-astro/pages/events/[slug].astro +80 -0
  97. package/skills/wix-headless-fast/references/events/app-astro/pages/events.astro +21 -0
  98. package/skills/wix-headless-fast/references/events/lock/astro/package-lock.json +11884 -0
  99. package/skills/wix-headless-fast/references/events/seed/SEED.md +86 -0
  100. package/skills/wix-headless-fast/references/events/seed/seed-events.mjs +276 -0
  101. package/skills/wix-headless-fast/references/forms/INSTRUCTIONS.md +150 -0
  102. package/skills/wix-headless-fast/references/forms/app/hooks/forms/useWixForm.ts +317 -0
  103. package/skills/wix-headless-fast/references/forms/app/wix/forms/forms.ts +269 -0
  104. package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions.ts +231 -0
  105. package/skills/wix-headless-fast/references/forms/app/wix/forms/types.ts +135 -0
  106. package/skills/wix-headless-fast/references/forms/lock/astro/package-lock.json +10593 -0
  107. package/skills/wix-headless-fast/references/forms/seed/SEED.md +108 -0
  108. package/skills/wix-headless-fast/references/forms/seed/seed-forms.mjs +320 -0
  109. package/skills/wix-headless-fast/references/members/INSTRUCTIONS.md +63 -0
  110. package/skills/wix-headless-fast/references/members/app/components/members/AccountView.tsx +60 -0
  111. package/skills/wix-headless-fast/references/members/app/components/members/LoginForm.tsx +155 -0
  112. package/skills/wix-headless-fast/references/members/app/components/members/MemberMenu.tsx +78 -0
  113. package/skills/wix-headless-fast/references/members/app/components/members/RequireAuth.tsx +47 -0
  114. package/skills/wix-headless-fast/references/members/app/hooks/members/useMember.ts +66 -0
  115. package/skills/wix-headless-fast/references/members/app/wix/members/auth.ts +88 -0
  116. package/skills/wix-headless-fast/references/members/app/wix/members/client.ts +53 -0
  117. package/skills/wix-headless-fast/references/members/app/wix/members/member-store.ts +122 -0
  118. package/skills/wix-headless-fast/references/members/app/wix/members/members.ts +50 -0
  119. package/skills/wix-headless-fast/references/members/app/wix/members/types.ts +21 -0
  120. package/skills/wix-headless-fast/references/members/app-astro/layouts/SiteLayout.astro +42 -0
  121. package/skills/wix-headless-fast/references/members/app-astro/pages/account.astro +10 -0
  122. package/skills/wix-headless-fast/references/members/app-astro/pages/login.astro +11 -0
  123. package/skills/wix-headless-fast/references/members/lock/astro/package-lock.json +10329 -0
  124. package/skills/wix-headless-fast/references/members/seed/SEED.md +39 -0
  125. package/skills/wix-headless-fast/references/members/seed/seed-members.mjs +94 -0
  126. package/skills/wix-headless-fast/references/portfolio/INSTRUCTIONS.md +134 -0
  127. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
  128. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
  129. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/ProjectDetailView.tsx +115 -0
  130. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollectionProjects.ts +59 -0
  131. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollections.ts +39 -0
  132. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useProjectDetail.ts +58 -0
  133. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio.ts +165 -0
  134. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/types.ts +55 -0
  135. package/skills/wix-headless-fast/references/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
  136. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
  137. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio.astro +21 -0
  138. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/projects/[slug].astro +29 -0
  139. package/skills/wix-headless-fast/references/portfolio/lock/astro/package-lock.json +10197 -0
  140. package/skills/wix-headless-fast/references/portfolio/seed/SEED.md +78 -0
  141. package/skills/wix-headless-fast/references/portfolio/seed/seed-portfolio.mjs +258 -0
  142. package/skills/wix-headless-fast/references/pricing-plans/INSTRUCTIONS.md +133 -0
  143. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +58 -0
  144. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlansView.tsx +126 -0
  145. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +37 -0
  146. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlans.ts +39 -0
  147. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans.ts +75 -0
  148. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase.ts +45 -0
  149. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/types.ts +30 -0
  150. package/skills/wix-headless-fast/references/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
  151. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans/[slug].astro +40 -0
  152. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans.astro +21 -0
  153. package/skills/wix-headless-fast/references/pricing-plans/lock/astro/package-lock.json +11226 -0
  154. package/skills/wix-headless-fast/references/pricing-plans/seed/SEED.md +71 -0
  155. package/skills/wix-headless-fast/references/pricing-plans/seed/seed-pricing-plans.mjs +279 -0
  156. package/skills/wix-headless-fast/references/restaurants/INSTRUCTIONS.md +165 -0
  157. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/MenuView.tsx +142 -0
  158. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
  159. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
  160. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/ReservationView.tsx +155 -0
  161. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useMenus.ts +55 -0
  162. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useOrderCart.ts +43 -0
  163. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useReservation.ts +177 -0
  164. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu.ts +165 -0
  165. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/order-store.ts +103 -0
  166. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering.ts +254 -0
  167. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations.ts +146 -0
  168. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/types.ts +168 -0
  169. package/skills/wix-headless-fast/references/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
  170. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/menu.astro +22 -0
  171. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/reservations.astro +12 -0
  172. package/skills/wix-headless-fast/references/restaurants/lock/astro/package-lock.json +12560 -0
  173. package/skills/wix-headless-fast/references/restaurants/seed/SEED.md +81 -0
  174. package/skills/wix-headless-fast/references/restaurants/seed/seed-restaurants.mjs +479 -0
  175. package/skills/wix-headless-fast/references/shared/CONTENT.md +22 -0
  176. package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +73 -0
  177. package/skills/wix-headless-fast/references/shared/DESIGN.md +26 -0
  178. package/skills/wix-headless-fast/references/shared/app/styles/global.css +52 -0
  179. package/skills/wix-headless-fast/references/shared/app/wix/config.ts +15 -0
  180. package/skills/wix-headless-fast/references/shared/app/wix/media.ts +27 -0
  181. package/skills/wix-headless-fast/references/shared/app/wix/money.ts +24 -0
  182. package/skills/wix-headless-fast/references/shared/app/wix/sdk.ts +76 -0
  183. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
  184. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +46 -0
  185. package/skills/wix-headless-fast/references/shared/seed/images.mjs +145 -0
  186. package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +149 -0
  187. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartButton.tsx +26 -0
  188. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartDrawer.tsx +121 -0
  189. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductCard.tsx +100 -0
  190. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductDetailView.tsx +130 -0
  191. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductGrid.tsx +48 -0
  192. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ShopView.tsx +66 -0
  193. package/skills/wix-headless-fast/references/storefront/app/components/storefront/VariantPicker.tsx +103 -0
  194. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useCart.ts +48 -0
  195. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useProductDetail.ts +140 -0
  196. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +80 -0
  197. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +101 -0
  198. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart.ts +221 -0
  199. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +215 -0
  200. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/types.ts +109 -0
  201. package/skills/wix-headless-fast/references/storefront/app-astro/layouts/SiteLayout.astro +46 -0
  202. package/skills/wix-headless-fast/references/storefront/app-astro/pages/products/[slug].astro +56 -0
  203. package/skills/wix-headless-fast/references/storefront/app-astro/pages/shop.astro +23 -0
  204. package/skills/wix-headless-fast/references/storefront/lock/astro/package-lock.json +12247 -0
  205. package/skills/wix-headless-fast/references/storefront/seed/SEED.md +85 -0
  206. package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +415 -0
  207. package/skills/wix-manage/SKILL.md +113 -89
  208. package/skills/wix-manage/references/dashboard-navigation/routes.json +12 -52
  209. package/skills/wix-manage/references/ecommerce/shipping/ecom-shipping-api.md +0 -2
  210. package/skills/wix-manage/references/forms/create-form.md +272 -184
  211. package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +13 -10
  212. package/skills/wix-manage/references/forms/update-form.md +122 -0
  213. package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +141 -0
  214. package/skills/wix-manage/references/google-business-profile/connect-google-business-profile.md +134 -0
  215. package/skills/wix-manage/references/google-business-profile/manage-google-business-profile-locations.md +182 -0
  216. package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +3 -0
  217. package/skills/wix-manage/references/media/generate-image-with-ai.md +86 -0
  218. package/skills/wix-manage/references/stores/create-product-catalog-v3.md +37 -7
  219. package/skills/wix-manage/references/stores/update-product-with-options.md +83 -0
  220. package/skills/wix-vibe-headless/SKILL.md +18 -4
  221. package/skills/wix-vibe-headless/install/deploy.cjs +12 -4
  222. package/skills/wix-vibe-headless/install/pin-agents-md.cjs +2 -1
  223. package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +3 -1
  224. package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +3 -1
  225. package/skills/wix-vibe-headless/platforms/base44.md +27 -61
  226. package/skills/wix-vibe-headless/platforms/generic.md +6 -3
  227. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +43 -0
  228. package/skills/wix-vibe-headless/references/bookings/app/components/RentalDurationPicker.jsx +67 -0
  229. package/skills/wix-vibe-headless/references/bookings/app/hooks/useRentalDuration.js +128 -0
  230. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +5 -3
  231. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-rentals.js +250 -0
  232. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-services.js +12 -5
  233. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +41 -0
  234. package/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.js +267 -0
  235. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +6 -3
  236. package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +486 -0
  237. package/skills/wix-vibe-headless/references/forms/app/hooks/useWixForm.js +425 -0
  238. package/skills/wix-vibe-headless/references/forms/app/lib/wix-form-schema-utils.js +187 -0
  239. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms-submissions.js +238 -0
  240. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms.js +108 -0
  241. package/skills/wix-vibe-headless/references/forms/seed/SEED.md +1836 -0
  242. package/skills/wix-vibe-headless/references/rentals/INSTRUCTIONS.md +13 -0
  243. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +137 -84
  244. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +15 -8
  245. package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +37 -0
  246. package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +18 -6
  247. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +30 -7
  248. package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +46 -10
  249. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +0 -110
  250. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +0 -51
  251. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +0 -49
  252. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +0 -92
  253. package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +0 -139
@@ -0,0 +1,182 @@
1
+ ---
2
+ name: "Manage Google Business Profile Locations for a Wix Site"
3
+ description: Import Google Business Profile locations into the authenticated Wix site, list and query them with or without live Google data, update Wix-side and Google-side details through the correct method for each, create a new Google listing, check whether a profile is actually live on Google, and remove a location from Wix or delete its Google listing. Checks the site's Google connection first and reports a missing one as a setup step, warns before destructive or Google-visible writes, and respects Google's shared rate budget.
4
+ ---
5
+
6
+ # Manage Google Business Profile Locations for a Wix Site
7
+
8
+ Use the public **Google Business Profile Locations API** to manage the
9
+ authenticated Wix site's Business Profile locations — the entries that decide
10
+ how the business appears on Google Search and Maps. The REST requests do not
11
+ contain a site ID — the site comes from the caller's authorization context.
12
+ Use the site the environment already supplies; if no site is selected, list
13
+ the user's sites once and auto-select the only one, or ask the user to choose
14
+ by site name when several are available. Never invent a site ID or ask the
15
+ user to type one.
16
+
17
+ > **Unconnected-site fast path — read first.** Read the connection once. Treat
18
+ > `NEVER_CONNECTED`, `NEEDS_RECONNECT`, or a single
19
+ > `CONNECTION_NOT_FOUND`/not-found response from that connection check as the
20
+ > same setup state. Query Wix-only GBP locations once to answer what the site
21
+ > already has, report the result, explain the connect → account selection →
22
+ > unimported-location selection → bulk-create flow, and stop — after that one
23
+ > query the **next action is the final response**, with no other tool call. Do
24
+ > not call a Google-backed location method, probe for Business Profile
25
+ > accounts, guess an endpoint, or make further API probes or documentation
26
+ > searches until the connection is `VALID`. A `403` or `PERMISSION_DENIED` is
27
+ > terminal: the **next action is the final response** explaining it. Stop
28
+ > without the Wix-only query, documentation search, or any other tool call.
29
+
30
+ The API is a live view onto Google, not a copy: most calls make a real Google
31
+ request, with Google's latency and rate limits. A location's ID is Google's
32
+ opaque location ID and is what identifies it everywhere.
33
+
34
+ ## Direct calls for the unconnected-site path
35
+
36
+ Use these request shapes directly; do not search the API reference before
37
+ calling them.
38
+
39
+ | Method | Call |
40
+ |---|---|
41
+ | **Get Connection** | `GET https://www.wixapis.com/gbp/v1/connection` — no body or parameters |
42
+ | **Query GBP Locations** | `POST https://www.wixapis.com/gbp/v1/locations/query` with body below |
43
+
44
+ ```json
45
+ { "query": { "paging": { "limit": 100 } } }
46
+ ```
47
+
48
+ Make **Get Connection** first, then branch before making any other call:
49
+
50
+ - `403` or `PERMISSION_DENIED` — stop. The next action is the final response;
51
+ explain that the current Wix identity cannot inspect the site's GBP state.
52
+ Do not query locations, inspect installed apps, search documentation, or try
53
+ another endpoint.
54
+ - `NEVER_CONNECTED`, `NEEDS_RECONNECT`, or `CONNECTION_NOT_FOUND` — make one
55
+ **Query GBP Locations** call, report the Wix-stored result, explain the future
56
+ import steps, and stop. The next action is the final response.
57
+ - `VALID` — proceed with the requested Google-backed flow.
58
+
59
+ Do not call **List GBP Accounts** or another Google-backed method until the
60
+ connection is `VALID` — account discovery requires the connection, and its
61
+ request shape is not the locations query. Never guess an endpoint that is not
62
+ in the table above or in the loaded reference.
63
+
64
+ ## Check the connection first
65
+
66
+ Google-backed methods require a Google connection, established through the
67
+ **Google Business Profile Connection API** (see the connect recipe). Before
68
+ Google-backed work, call **Get Connection**:
69
+
70
+ - `VALID` — proceed.
71
+ - `NEVER_CONNECTED` or `NEEDS_RECONNECT` — report a setup step, not an error,
72
+ and offer to run the connect flow. Do not retry location calls until the
73
+ connection is `VALID`.
74
+
75
+ Wix-only reads and deletes still work without active Google credentials:
76
+ **Get GBP Location**, **Query GBP Locations**, **Update Location**,
77
+ **Delete Location**, and **Bulk Delete Locations**.
78
+
79
+ ## Import locations
80
+
81
+ Importing registers listings that already exist at Google; it never creates
82
+ one. Each step narrows the next:
83
+
84
+ 1. Call **List GBP Accounts**. One Google login can hold several Business
85
+ Profile accounts, so present the list and let the owner pick — never assume
86
+ the first one.
87
+ 2. Call **List Unimported Locations** with the chosen `accountId`. It returns
88
+ only what the site hasn't imported yet, so re-running never offers
89
+ duplicates.
90
+ 3. Let the owner select which locations to import, and confirm before writing.
91
+ 4. Call **Bulk Create Locations** with the selected locations, supplying `id`
92
+ and `accountId` on each.
93
+ 5. Inspect every `results[].itemMetadata.error`. The call reports per-item
94
+ failures instead of aborting, so a `200` does not mean every location
95
+ imported. Report failures explicitly.
96
+
97
+ Repeat steps 2–5 per account if the owner wants locations from more than one.
98
+
99
+ ## List and query locations
100
+
101
+ Choose by whether live Google data is needed:
102
+
103
+ - **Just the site's locations:** call **Query GBP Locations**. Wix-stored rows
104
+ only — fast, no Google round-trip, no Google rate limit. Use it for counts,
105
+ ID lookups, and anything driven by `id`, `googleLocationId`, or `accountId`.
106
+ - **Locations with live business details:** call **Query Google Locations**
107
+ (or **Get Google Location** for one). Each row is hydrated with a live
108
+ Google fetch. Check each row for `googleError` — one location failing at
109
+ Google does not fail the request or break paging, so render it as a
110
+ per-location problem, not an empty result.
111
+
112
+ ## Update the correct side
113
+
114
+ Wix stores almost nothing; the method name tells you which side a write
115
+ reaches. Check before calling anything destructive:
116
+
117
+ | Method | Wix row | Google listing |
118
+ |---|---|---|
119
+ | **Create Location**, **Bulk Create Locations** | created | untouched (imports an existing listing) |
120
+ | **Create Google Location** | created | **created** |
121
+ | **Update Location** | updated | untouched (writes Wix-stored fields only) |
122
+ | **Update Google Location** | untouched | **updated** |
123
+ | **Delete Location**, **Bulk Delete Locations** | deleted | untouched |
124
+ | **Delete Google Location** | deleted | **deleted** |
125
+
126
+ - **Update Location** is not the way to edit a Business Profile — it writes
127
+ only Wix-stored fields. To change Google-owned data (title, address, hours,
128
+ categories), call **Update Google Location**, and confirm with the owner
129
+ first: the change is publicly visible on Google.
130
+ - To create a brand-new Google listing, call **Create Google Location** after
131
+ explicit confirmation. Use the API's reference-data methods (address schema,
132
+ category and region suggestions) rather than inventing values.
133
+ - Google allows roughly 10 profile edits per minute per Business Profile, and
134
+ the budget is shared across every write method. Pace the profile as a whole
135
+ and treat a `429` as worth retrying after a delay, not as a rejection.
136
+
137
+ ## Remove a location
138
+
139
+ Decide first whether the owner is removing it from Wix or deleting the real
140
+ Google listing — these are different operations and one is irreversible.
141
+ Confirm which they mean before calling anything:
142
+
143
+ - **Un-import from Wix, leave Google alone:** call **Delete Location**, or
144
+ **Bulk Delete Locations** for several. Inspect every
145
+ `results[].itemMetadata` entry — the bulk call can partially succeed.
146
+ - **Delete the Google listing as well:** call **Delete Google Location** once
147
+ per location; there is no bulk Google delete. Require explicit confirmation
148
+ naming the location — the listing disappears from Google Search and Maps.
149
+ - If **Delete Google Location** returns `LOCATION_DB_PERSIST_FAILED`, Google
150
+ deleted the listing but Wix didn't record it. The error payload carries the
151
+ location ID; call **Delete Location** with it to reconcile.
152
+
153
+ ## Check whether a profile is actually live
154
+
155
+ A location existing in Wix does not mean it appears on Google — verification
156
+ can be pending, the profile suspended, or ownership contested. Call
157
+ **Get Voice of Merchant** for the location and act on what Google reports:
158
+ wait, verify, comply, or resolve the conflict.
159
+
160
+ ## Recovery rules
161
+
162
+ - **`FAILED_PRECONDITION` with `CONNECTION_NOT_FOUND`:** the site has no
163
+ usable Google connection. Report the setup step and offer the connect flow;
164
+ do not retry the same call.
165
+ - **`GOOGLE_API_CALL_FAILED`:** read the carried Google code and description.
166
+ Some failures are permanent (profile suspended, field not editable) —
167
+ retrying will not help; explain instead.
168
+ - **Per-row `googleError` on hydrating reads:** report it per location and
169
+ continue with the rest of the page.
170
+ - **Rate limited (`429`):** wait, then retry; interleaved writes share one
171
+ budget per profile.
172
+ - **Permission denied:** stop after the first `403` or `PERMISSION_DENIED`.
173
+ Do not retry with other locations, request shapes, or sites, and do not
174
+ search for an alternate API or method. Deleting locations requires the
175
+ site's `GBP_ADMIN` role.
176
+
177
+ The same API also covers reviews and replies, photos and bulk media uploads,
178
+ attributes, verification, performance insights, and location admins — load the
179
+ specific public method reference needed before constructing a request so field
180
+ names, filters, permissions, and errors come from the live contract. Once a
181
+ connection state or typed error selects a branch above, do not search or browse
182
+ for an alternate API, method, or request shape.
@@ -359,6 +359,8 @@ Build the request from `item.channel` (`name` + the `accountId` from STEP 4b), `
359
359
  - Otherwise, build it from the STEP 3 table row for your channel + `type`: the text field (`caption` for Instagram/Facebook/LinkedIn/X, `description` for YouTube/Pinterest/GBP/TikTok), the media (`mediaWrapper`, or `imageUrl`/`videoUrl` for a single item), and any channel-specific IDs from the STEP 4b account object, plus `title` where the channel uses one.
360
360
  - Instagram and story types require media.
361
361
 
362
+ **Attribution (always set this).** Set `item.consumerInfo` to `{ "name": "wix-skills-social" }` on **every** create-draft call, for every channel. `consumerInfo.name` identifies what created the post — the Social Media Marketing dashboard sets `social-marketing`, and this recipe sets `wix-skills-social`. Set it on the draft: `name` is applied on creation only, and Update Item ignores it.
363
+
362
364
  **Idempotency (retry safety).** Set a stable, caller-defined `item.referenceId` on the draft. The Publisher enforces its uniqueness — a second item created/published with the same `referenceId` is rejected with `REFERENCE_ID_ALREADY_EXIST` instead of posting a duplicate. So if a create or publish call times out, retry with the **same** `referenceId` rather than risk double-posting.
363
365
 
364
366
  **Example — Instagram image post:**
@@ -368,6 +370,7 @@ Build the request from `item.channel` (`name` + the `accountId` from STEP 4b), `
368
370
  "item": {
369
371
  "channel": { "name": "INSTAGRAM", "accountId": "17841405822304914" },
370
372
  "type": "POST",
373
+ "consumerInfo": { "name": "wix-skills-social" },
371
374
  "instagramPost": {
372
375
  "imageUrl": "https://static.wixstatic.com/media/cf2434_4b3a2d8eb7f54bc89c0d4524430a2af3~mv2.jpg",
373
376
  "caption": "Summer collection just dropped! Shop the look now. #summerstyle #newarrivals"
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: "Generate an Image with AI"
3
+ description: Generates an image from a text prompt with the Wix AI APIs (Runware). Returns a short-lived URL that must be imported to be kept — importing is Upload Media to Wix's job, and this recipe hands off to it. Covers choosing a model and its cost/latency/content-filter trade-off, the accepted output sizes, per-model batching limits, the AI credit each call spends, and why a content refusal arrives as a success response with no image.
4
+ ---
5
+ # RECIPE: Generate an Image with AI
6
+
7
+ For an image the user does not have. An image they supplied — an attachment or a public URL — is uploaded instead: [Upload Media to Wix](upload-media-to-wix.md).
8
+
9
+ **API reference:** [About the Wix AI APIs](https://dev.wix.com/docs/api-reference/articles/ai-tools/ai-apis/about-the-wix-ai-apis), *Generating images* — endpoint, auth, and the full model table. Developer Preview, so confirm the contract there.
10
+
11
+ ---
12
+
13
+ ## AI credits
14
+
15
+ Each call spends roughly **one AI credit**, billed to the site owner, or to the Wix user who installed the calling app. `numberResults: n` spends n. Importing is free.
16
+
17
+ Generate one image per entity that needs one, and say how many a run will generate before starting it. Regenerate only when the user asks.
18
+
19
+ ---
20
+
21
+ ## Step 1: Generate
22
+
23
+ ```bash
24
+ curl -X POST 'https://www.wixapis.com/runwareschemaless/v1/request' \
25
+ -H 'Content-Type: application/json' \
26
+ -H 'Authorization: <AUTH>' \
27
+ -H 'wix-site-id: <METASITE_ID>' \
28
+ -d '[{
29
+ "taskType": "imageInference",
30
+ "taskUUID": "3f8c1e42-9b7a-4d16-8a5e-2c0f7b9d4e11",
31
+ "outputType": "URL",
32
+ "outputFormat": "PNG",
33
+ "positivePrompt": "a ceramic pour-over coffee dripper on a walnut counter, morning light",
34
+ "width": 1024,
35
+ "height": 1024,
36
+ "model": "runware:400@1",
37
+ "numberResults": 1
38
+ }]'
39
+ ```
40
+
41
+ | Parameter | Value |
42
+ |---|---|
43
+ | `taskUUID` | A real UUIDv4. Anything else returns `400 invalidTaskUUID` |
44
+ | `width` / `height` | `1024×1024` (square — products, services, menu items), `1376×768` (16:9 hero), `1200×896` (4:3 editorial). Free-form sizes return 400 |
45
+ | `model` | See below |
46
+ | `numberResults` | `1` |
47
+
48
+ Omit `steps` and `CFGScale`: Runware accepts them, other models return `400 unsupportedParameter`.
49
+
50
+ ### Models
51
+
52
+ | `model` | Latency | Content filter |
53
+ |---|---|---|
54
+ | `runware:400@1` | ~5s | Loosest — the default |
55
+ | `google:4@2` | ~25s | Medium, best fidelity |
56
+ | `bfl:5@1` | — | Strictest; refuses trademark-ish prompts |
57
+
58
+ Any Runware-supported model works — the reference's *Suggested models* table has the current AIR IDs.
59
+
60
+ ### Read the response
61
+
62
+ ```json
63
+ { "data": [ { "imageURL": "https://im.runware.ai/image/ws/2/ii/<id>.png" } ] }
64
+ ```
65
+
66
+ **A refusal is a success response with no `imageURL`** — test for the field, not the status. On a refusal, reword the prompt or switch model, and report the image as not created.
67
+
68
+ ---
69
+
70
+ ## Step 2: Import
71
+
72
+ `imageURL` expires, so import it as it lands. [Upload Media to Wix](upload-media-to-wix.md) owns that endpoint and its `PENDING` / `READY` rules; pass the `imageURL` as `url` and `image/png` as `mimeType`.
73
+
74
+ The result is the returned `file.id` / `file.url` — permanent, and what an entity field takes.
75
+
76
+ ---
77
+
78
+ ## Batches
79
+
80
+ `runware:400@1` and `bfl:5@1` take several tasks in one body. `google:4@2` returns 504 at three or more, so fire parallel single-task requests for it.
81
+
82
+ Failure is per image: attach the ones that succeeded, create the rest of the entities text-only, and name which entities have no image and why. A failed image stays missing rather than being swapped for another.
83
+
84
+ ---
85
+
86
+ For JavaScript callers there is an SDK path — `generateImage()` from the Vercel AI SDK with `runware.image(...)` from `@wix/ai`: [Set up the Wix AI SDK](https://dev.wix.com/docs/api-reference/articles/ai-tools/ai-apis/set-up-the-wix-ai-sdk).
@@ -20,6 +20,19 @@ Canonical example:
20
20
  - Assistant: “What product would you like to create? You can upload up to 3 images and I’ll generate the product information from them, or describe the product in text.”
21
21
  - Result: **Stop. Do not request structured product fields yet.**
22
22
 
23
+ ## Sections
24
+
25
+ - [Preflight](#preflight-respond-and-return-before-mutation) — whether this turn may mutate at all, and what to answer when it may not
26
+ - [Core flow](#core-flow) — the order the rest of this recipe runs in
27
+ - [Choose the endpoint](#choose-the-endpoint) — single vs bulk, with or without inventory
28
+ - [Build each product](#build-each-product) — the product object: type, media, options, variants, prices, SKUs
29
+ - [Generated descriptions and SEO](#generated-descriptions-and-seo) — what copy written from an image may claim
30
+ - [Add images](#add-images) — uploading a supplied image, or generating one
31
+ - [Wrap the request](#wrap-the-request) — the envelope the chosen endpoint expects
32
+ - [Request projected media](#request-projected-media-when-validating-images) — which fields to project so images are proven on create
33
+ - [Validate before reporting success](#validate-before-reporting-success) — what counts as proof, and what may be claimed
34
+ - [Failure guide](#failure-guide) — reading a rejection
35
+
23
36
  ## Preflight: respond and return before mutation
24
37
 
25
38
  Name and price are mandatory **workflow inputs for every product**, even when the API schema accepts an omitted price or initializes it to zero. Evaluate the cases below in order. When a case says **RETURN**, end the turn immediately: do not call a create endpoint, do not continue to examples, and do not create first and ask afterward.
@@ -65,14 +78,14 @@ If any product is missing a price, **do not call the API**. Ask for the missing
65
78
  - Bulk endpoints accept 1–100 products, so a compatible bulk endpoint is also valid for one product.
66
79
  - For multiple products requested as one batch, send one bulk call. Use the with-inventory endpoint when any product needs inventory; include `inventoryItem` only on tracked variants.
67
80
  - Never send `inventoryItem` to a no-inventory endpoint. Do not invent inventory.
68
- - Digital products normally use a no-inventory endpoint.
81
+ - Digital products use a with-inventory endpoint: an unstocked digital variant is unsellable.
69
82
  - Per bulk request, allow at most 100 products, 100 total options, 100 modifiers, 100 info sections, and 1000 variants. Split larger input into compliant batches.
70
83
 
71
84
  ## Build each product
72
85
 
73
86
  | Concern | Rule |
74
87
  |---|---|
75
- | Type | `PHYSICAL` uses product- and variant-level `physicalProperties`; `DIGITAL` omits physical properties and inventory. |
88
+ | Type | `PHYSICAL` uses product- and variant-level `physicalProperties`; `DIGITAL` omits them and carries `inventoryItem.inStock` plus `digitalProperties.digitalFile` on each variant. |
76
89
  | Variants | Include at least one. Price, SKU, barcode, inventory, and digital file are variant-level fields. |
77
90
  | Price | Use a string in `price.actualPrice.amount`; add `compareAtPrice` only when supplied. |
78
91
  | SKU | Preserve supplied strings exactly, including `#`, punctuation, and leading zeroes. Keep variant SKUs unique unless explicitly requested otherwise. |
@@ -127,9 +140,20 @@ This inventory-aware physical product is the reusable shape. Remove `inventoryIt
127
140
  }
128
141
  ```
129
142
 
130
- For a color option, use `SWATCH_CHOICES`; each choice uses `choiceType: ONE_COLOR` and `colorCode`, and the variant reference uses `renderType: SWATCH_CHOICES`.
143
+ For a color option, use `SWATCH_CHOICES`; each choice uses `choiceType: ONE_COLOR` and `colorCode`, and the variant reference uses `renderType: SWATCH_CHOICES`. For a different **image** per colour (not just the swatch), each choice also carries its own `media`:
144
+
145
+ ```json
146
+ "choicesSettings": {"choices": [
147
+ {"choiceType": "ONE_COLOR", "name": "Black", "colorCode": "#000000",
148
+ "media": {"items": [{"url": "https://static.wixstatic.com/media/<black>.jpg"}]}},
149
+ {"choiceType": "ONE_COLOR", "name": "White", "colorCode": "#FFFFFF",
150
+ "media": {"items": [{"url": "https://static.wixstatic.com/media/<white>.jpg"}]}}
151
+ ]}
152
+ ```
131
153
 
132
- A digital product uses the smaller shape below. Add the supplied variant-level digital file only when one was provided.
154
+ The image must be in the product gallery first, and the id/ordering has a trap — assign per-choice media via **[Update Product with Options](update-product-with-options.md) → Choice & variant fields** (also the full choice-vs-variant field split: choice `media`/`colorCode`; variant `price`/`sku`/`barcode`/stock).
155
+
156
+ A digital variant is **sellable** only when it carries both a digital file and stock; miss either and the product reads back healthy and is rejected at add-to-cart. Upload the file first ([Upload Media to Wix](../media/upload-media-to-wix.md) → Generate Upload URL, then `PUT` the bytes) and send the returned `file.id` to `POST /stores/v3/products-with-inventory`:
133
157
 
134
158
  ```json
135
159
  {
@@ -138,11 +162,15 @@ A digital product uses the smaller shape below. Add the supplied variant-level d
138
162
  "variantsInfo": {"variants": [{
139
163
  "sku": "PDF-FOCUS-01",
140
164
  "price": {"actualPrice": {"amount": "9.99"}},
141
- "visible": true
165
+ "visible": true,
166
+ "inventoryItem": {"inStock": true},
167
+ "digitalProperties": {"digitalFile": {"id": "<FILE_ID>"}}
142
168
  }]}
143
169
  }
144
170
  ```
145
171
 
172
+ With no file supplied, create the product and report it as not sellable until one is attached — [Update Product with Options](update-product-with-options.md) → Attach a digital file.
173
+
146
174
  ### Generated descriptions and SEO
147
175
 
148
176
  - When copy is generated from an image, every factual claim must be user-supplied or directly visible. Preserve user-supplied facts such as a stated material; do not reject them merely because the image alone cannot prove them. Color, shape, and visible decoration may come from the image. Dimensions, capacity, care instructions, durability, compatibility, performance, and any material the user did not identify must be omitted. For example, never write “dishwasher safe” or “microwave safe” unless the user supplied that fact. Omit uncertain claims instead of turning them into marketing language.
@@ -165,7 +193,9 @@ A digital product uses the smaller shape below. Add the supplied variant-level d
165
193
 
166
194
  ## Add images
167
195
 
168
- Skip this step when no image was supplied. Prefer the available dedicated Wix image-upload capability and upload all attachments and public image URLs together. Do not reconstruct that capability inside a general API-execution call. When no dedicated uploader is available, use `POST /site-media/v1/files/import` with the external URL in the body field named exactly `url`—not `importUrl`:
196
+ Skip this step when no image was supplied — unless the user asked for one to be generated, in which case create it first with [Generate an Image with AI](../media/generate-image-with-ai.md) and continue below with the Media Manager file it returns. Do not offer generation unprompted, and never generate a substitute for a supplied image that failed to upload.
197
+
198
+ Prefer the available dedicated Wix image-upload capability and upload all attachments and public image URLs together. Do not reconstruct that capability inside a general API-execution call. When no dedicated uploader is available, use `POST /site-media/v1/files/import` with the external URL in the body field named exactly `url`—not `importUrl`:
169
199
 
170
200
  ```json
171
201
  {"url":"https://example.com/product.jpg","mimeType":"image/jpeg","displayName":"Product.jpg","mediaType":"IMAGE"}
@@ -270,4 +300,4 @@ Retry only failed transient items, not successful products. If a requested field
270
300
  - `variantsInfo must not be empty`: include at least one priced variant per product.
271
301
  - Option/variant mismatch: create every requested combination and reference every option once per variant.
272
302
  - Media not visible: use the uploaded `wixstatic.com` URL in `media.itemsInfo.items`; do not set `media.main`.
273
- - Digital product rejected: omit physical properties and inventory; keep price, SKU, and any supplied digital file on the variant.
303
+ - Digital product rejected at add-to-cart: `ITEM_NOT_FOUND_IN_CATALOG` means the variant has no `digitalProperties.digitalFile`; `exceeds available inventory` means it has no `inventoryItem.inStock`. Both read back as a healthy product.
@@ -275,6 +275,8 @@ curl -X POST "https://www.wixapis.com/stores/v3/bulk/inventory-items/create" \
275
275
 
276
276
  ### Update Media Only
277
277
 
278
+ Sets the product-level gallery (`media.itemsInfo.items`). For an image shown per option choice (a swatch's photo), see **Per-choice media** below.
279
+
278
280
  ```bash
279
281
  curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
280
282
  -H "Content-Type: application/json" \
@@ -297,6 +299,56 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
297
299
  }'
298
300
  ```
299
301
 
302
+ ### Choice & variant fields (what you can set)
303
+
304
+ Send these inside the `options` / `variantsInfo.variants` arrays — **both arrays complete, in the
305
+ same PATCH**, with the current `revision`, and **identity-preserving** (see *Update Options and
306
+ Variants*): keep the option's `id` and every `choiceId`, or the ids are re-minted and the existing
307
+ variants no longer resolve (`400 "Variant choice not found in product options"`). Each variant needs
308
+ its `id`, its `choices` (by `optionChoiceIds` — or `optionChoiceNames`, see *Gotchas*) **and** a
309
+ `price` — omitting price is `400 "price must not be empty"`.
310
+
311
+ **Option choice** (`options[].choicesSettings.choices[]`):
312
+ - `name`, `choiceType`, `colorCode` — the choice's identity and swatch colour.
313
+ - `media` = `{ "items": [ { "mediaId" } | { "url" } ] }` — the product photos shown when this choice is picked. `url` is write-only; on read you get `mediaId` (request the `PRODUCT_CHOICES_MEDIA_REFERENCES` mask). Use `media`, **not** `linkedMedia` (a separate display-filter, returned empty when you read `media`).
314
+ - **Gallery-first; the id you link is the gallery item's, not the upload's.** Add the `url` to the gallery, then read the product back and link the id you see there:
315
+
316
+ ```
317
+ GET /stores/v3/products/{id}?fields=MEDIA_ITEMS_INFO
318
+ # → media.itemsInfo.items[].id = "abc~mv2.jpg" ← link THIS as choice media.items[].mediaId
319
+ # the id from POST /site-media/v1/files/import or /files/get-file-by-id 400s as a choice mediaId
320
+ ```
321
+ `{ "url" }` works in place of `{ "mediaId" }` too, but only once the image is already in the gallery.
322
+ - `displayImage` — the image shown on the swatch itself (distinct from `media`).
323
+ - Read-only, don't send: `inStock`, `visible`, `key`.
324
+
325
+ **Variant** (`variantsInfo.variants[]`, by its `id` from Get Product; always send `choices` + `price` with it):
326
+ - `price` = `{ "actualPrice": { "amount" }, "compareAtPrice": { "amount" } }` — set `compareAtPrice` above `actualPrice` for a strikethrough sale; omit it for full price.
327
+ - `sku`, `barcode` — per combination.
328
+ - `visible` — hide a single variant.
329
+ - `revenueDetails` — cost / profit tracking.
330
+ - Read-only, don't send: `media` (derived from the choices' media), `inventoryStatus` (stock — use the Inventory API, see *Set Stock for New Variants*), `subscriptionPricesInfo`.
331
+
332
+ ```bash
333
+ # A choice image + a variant's sale price, one PATCH. Both arrays are complete and keep their ids —
334
+ # this exact shape is the one that succeeds; the two shortcuts (choices by name only, or a variant
335
+ # without its choices/price) each 400.
336
+ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
337
+ -H "Content-Type: application/json" -H "Authorization: <AUTH>" \
338
+ -d '{ "product": { "id": "{productId}", "revision": "{currentRevision}",
339
+ "options": [ { "id": "{optionId}", "name": "Color", "optionRenderType": "COLOR_CHOICES",
340
+ "choicesSettings": { "choices": [
341
+ { "choiceId": "{choiceId1}", "name": "Red", "choiceType": "ONE_COLOR", "colorCode": "#C0392B",
342
+ "media": { "items": [ { "mediaId": "abc~mv2.jpg" } ] } },
343
+ { "choiceId": "{choiceId2}", "name": "Blue", "choiceType": "ONE_COLOR", "colorCode": "#2C3E50" } ] } } ],
344
+ "variantsInfo": { "variants": [
345
+ { "id": "{variantId1}", "sku": "TEE-RED-L",
346
+ "price": { "actualPrice": { "amount": "20" }, "compareAtPrice": { "amount": "30" } },
347
+ "choices": [ { "optionChoiceIds": { "optionId": "{optionId}", "choiceId": "{choiceId1}" } } ] },
348
+ { "id": "{variantId2}", "price": { "actualPrice": { "amount": "20" } },
349
+ "choices": [ { "optionChoiceIds": { "optionId": "{optionId}", "choiceId": "{choiceId2}" } } ] } ] } } }'
350
+ ```
351
+
300
352
  ### Update Variant Price Only
301
353
 
302
354
  Read `{existingVariantId}` off the Get Product response; a Search or Query Products result does not carry it.
@@ -325,6 +377,35 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
325
377
  }'
326
378
  ```
327
379
 
380
+ ### Attach a Digital File
381
+
382
+ A `DIGITAL` product is **sellable** only when its variant carries both a digital file and stock. Upload the file first ([Upload Media to Wix](../media/upload-media-to-wix.md) → Generate Upload URL, then `PUT` the bytes), then send its `file.id` on the variant — `digitalProperties` is a variant field, never a product field.
383
+
384
+ ```bash
385
+ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
386
+ -H "Content-Type: application/json" \
387
+ -H "Authorization: <AUTH>" \
388
+ -d '{
389
+ "product": {
390
+ "id": "{productId}",
391
+ "revision": "{currentRevision}",
392
+ "variantsInfo": {
393
+ "variants": [
394
+ {
395
+ "id": "{existingVariantId}",
396
+ "price": { "actualPrice": { "amount": "9.99" } },
397
+ "visible": true,
398
+ "inventoryItem": { "inStock": true },
399
+ "digitalProperties": { "digitalFile": { "id": "{fileId}" } }
400
+ }
401
+ ]
402
+ }
403
+ }
404
+ }'
405
+ ```
406
+
407
+ Confirm from `product.variantsInfo.variants[].digitalProperties.digitalFile` in the response.
408
+
328
409
  ## Important Notes
329
410
 
330
411
  - A request to hide a product is a `visible: false` update on the product, never a Delete Product call and never a variant-only change.
@@ -348,3 +429,5 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
348
429
  | `variantsInfo is invalid: variants has size 0, expected 1 or more` | Variants were read from a Search or Query Products response, which does not return them | Re-read the product with Get Product and send its `variantsInfo.variants` |
349
430
  | `Missing option choices` or `INVALID_DEFAULT_VARIANT` | Product has options but at least one variant has no matching choices | Rebuild `variantsInfo.variants` so every variant includes choices for all product options |
350
431
  | `DIGITAL_PRODUCT_CANNOT_BE_VISIBLE_IN_POS` | Sent `visibleInPos: true` on a digital product | Digital products can't be visible in POS; leave `visibleInPos` out of the body |
432
+ | `ITEM_NOT_FOUND_IN_CATALOG` at add-to-cart, product exists | A `DIGITAL` variant has no `digitalProperties.digitalFile` | Attach a file — see [Attach a Digital File](#attach-a-digital-file) |
433
+ | `exceeds available inventory` at add-to-cart, product exists | The variant has no stock (`DIGITAL` products included) | Set `inventoryItem.inStock: true` on the variant |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wix-vibe-headless
3
- description: "Client-only, dependency-free REST scaffolds for connecting an already-built front end (a vibe-coded app, an HTML/JSX/Vite project, a design-tool export) to a live Wix site over the site's public WIX_CLIENT_ID — the browser talks to Wix directly, no SDK, no backend, no build step. One skill covering every Wix business solution: Stores/eCommerce storefront (products, cart, checkout), Bookings (services, slots, appointments), Blog (posts, categories, tags), Events & Tickets (browse, RSVP, ticketing), Portfolio (collections, projects, galleries), Restaurants (menu, online ordering, reservations), CMS / Wix Data (list, detail, filter, forms, CRUD), Pricing Plans (memberships, subscriptions, checkout), and Members (custom login — email+password, Google/Facebook, and custom SSO — plus account areas and member-gated content). Each vertical ships a copy-as-is REST layer plus wiring instructions. Read-only over the owner's content — never provisions, never mocks data. Triggers: connect my Wix store/shop, build a storefront over Wix, add a cart and checkout, connect Wix Bookings, take appointments/reservations, show my Wix blog, list my Wix events, sell tickets, take RSVPs, build a portfolio from Wix Portfolio, show my restaurant menu / order online / book a table, display my Wix CMS collection, wire a contact form to Wix, sell membership/subscription plans, add member login / sign up, let members log in with Google or Facebook, custom login page, account / profile page, gate content behind login, sign in with SSO/Okta, 'here is my WIX_CLIENT_ID', connect this app to my Wix site over REST. Use this for CLIENT-ONLY REST integration over an existing site; use `wix-headless` instead for SDK + Wix CLI builds, hosting, and one-prompt new-site creation."
3
+ description: "Client-only, dependency-free REST scaffolds for connecting an already-built front end (a vibe-coded app, an HTML/JSX/Vite project, a design-tool export) to a live Wix site over the site's public WIX_CLIENT_ID — the browser talks to Wix directly, no SDK, no backend, no build step. One skill covering every Wix business solution: Stores/eCommerce storefront (products, cart, checkout), Bookings (services, slots, appointments), Blog (posts, categories, tags), Events & Tickets (browse, RSVP, ticketing), Portfolio (collections, projects, galleries), Restaurants (menu, online ordering, reservations), Forms (any visitor-fillable form — contact/enquiry, signup, waitlist, application, survey, quote request; schema-driven render + submit), CMS / Wix Data (list, detail, filter, CRUD), Pricing Plans (memberships, subscriptions, checkout), and Members (custom login — email+password, Google/Facebook, and custom SSO — plus account areas and member-gated content). Each vertical ships a copy-as-is REST layer plus wiring instructions. Read-only over the owner's content — never provisions, never mocks data. Triggers: connect my Wix store/shop, build a storefront over Wix, add a cart and checkout, connect Wix Bookings, take appointments/reservations, show my Wix blog, list my Wix events, sell tickets, take RSVPs, build a portfolio from Wix Portfolio, show my restaurant menu / order online / book a table, display my Wix CMS collection, wire a contact form to Wix, add a contact/enquiry form, build a signup or application form, take survey responses, sell membership/subscription plans, add member login / sign up, let members log in with Google or Facebook, custom login page, account / profile page, gate content behind login, sign in with SSO/Okta, 'here is my WIX_CLIENT_ID', connect this app to my Wix site over REST. Use this for CLIENT-ONLY REST integration over an existing site; use `wix-headless` instead for SDK + Wix CLI builds, hosting, and one-prompt new-site creation."
4
4
  ---
5
5
 
6
6
  # Wix Vibe Headless — client-only REST connectors
@@ -119,15 +119,29 @@ Each vertical's UI + helpers ship in `references/<vertical>/app/`; copy that dir
119
119
  | The user wants… | Vertical | Read |
120
120
  |---|---|---|
121
121
  | Online store: products, categories, cart, checkout | **storefront** | `references/storefront/INSTRUCTIONS.md` |
122
- | Appointments: services, time slots, booking, checkout | **bookings** | `references/bookings/INSTRUCTIONS.md` |
122
+ | Appointments: services, time slots, booking, checkout — **and the form attached to a bookable service** | **bookings** | `references/bookings/INSTRUCTIONS.md` |
123
+ | Rentals: an item hired for a length **the customer picks** (by the hour or by the day) — Wix Rentals runs on the Bookings APIs, so it is the same vertical | **bookings** | `references/bookings/INSTRUCTIONS.md` ("Rentals") |
123
124
  | Blog/news: post feed, post pages, categories, tags | **blog** | `references/blog/INSTRUCTIONS.md` |
124
- | Events: browse, event page, RSVP, ticketing | **events** | `references/events/INSTRUCTIONS.md` |
125
+ | Events: browse, event page, RSVP, ticketing — **an RSVP is here, not `forms`**, even for one occasion with no tickets | **events** | `references/events/INSTRUCTIONS.md` |
125
126
  | Portfolio/showcase: collections, projects, media galleries | **portfolio** | `references/portfolio/INSTRUCTIONS.md` |
126
127
  | Restaurant: menu, online ordering, table reservations | **restaurants** | `references/restaurants/INSTRUCTIONS.md` |
127
- | CMS content: list/detail, filter/search, forms, data CRUD | **cms** | `references/cms/INSTRUCTIONS.md` |
128
+ | Any visitor-fillable form: contact/enquiry, lead, signup, waitlist, application, feedback/survey, quote request, intake or registration. **Not** an event RSVP (`events`) or a per-service booking form (`bookings`) | **forms** | `references/forms/INSTRUCTIONS.md` |
129
+ | CMS content: list/detail, filter/search, data CRUD. **A visitor-fillable form is `forms`** — cms only when the app must read the entries back | **cms** | `references/cms/INSTRUCTIONS.md` |
128
130
  | Plans & pricing: memberships/subscriptions, subscribe, my plans | **pricing-plans** | `references/pricing-plans/INSTRUCTIONS.md` |
129
131
  | Member accounts: custom login/sign-up (email+password, Google/Facebook, SSO), account area, gated content | **members** | `references/members/INSTRUCTIONS.md` |
130
132
 
133
+ **⚠️ Anything a visitor fills in and submits is `forms` — with three exceptions:**
134
+
135
+ 1. **The app must read the entries back → `cms`.** A public gallery, a listing, a member's "my
136
+ submissions". A visitor cannot read Forms submissions, so those need a collection. Submit-only is
137
+ always `forms`: a form wired to `insertDataItem` works, but gives up the dashboard form builder,
138
+ spam protection, submission notifications and CRM contact mapping, and needs the owner to set
139
+ collection permissions by hand before anyone can submit at all.
140
+ 2. **Confirming attendance to an event or occasion → `events`.** A wedding, party or gathering —
141
+ events ships a built-in RSVP registration form. Route there even for a single occasion with no
142
+ tickets.
143
+ 3. **A form attached to a bookable service → `bookings`.**
144
+
131
145
  ### When the request doesn't name a Wix Business Solution — ask, or check the site
132
146
 
133
147
  Don't infer which Wix Business Solution to build (stores, bookings, blog, events, portfolio,
@@ -1,6 +1,6 @@
1
1
  // Post-install deploy — run by base44.md STEP 1 with the vertical(s) the app needs:
2
2
  // node deploy.cjs <vertical> [<vertical> …] --client-id <id> --metasite-id <id>
3
- // (storefront | bookings | blog | cms | portfolio | pricing-plans | events | members)
3
+ // (storefront | bookings | blog | cms | forms | portfolio | pricing-plans | events | members | restaurants)
4
4
  // Pass the two ids from the prompt and this writes src/rest/wix-config.js for you — see WRITE below.
5
5
  // Retyping those ids into the file by hand is how a storefront ships with a dead client id.
6
6
  // ONE mechanism: recursively copy `app/` -> /app/src. The shared transport (app/rest/wix-client.js,
@@ -9,7 +9,7 @@
9
9
  // members and cms names both, and its CMS helpers then come from the skill instead of being
10
10
  // hand-written. Order matters only where two verticals ship a file at the SAME path (both have
11
11
  // components/…, pages/…): the first one listed wins, since the copy never overwrites. Verticals whose
12
- // file sets don't overlap (cms ships utils only, no UI) combine freely.
12
+ // file sets don't overlap (cms and forms ship utils only, no UI) combine freely.
13
13
  // paths are the Base44 sandbox's /app. Re-running is non-destructive: it fills in only missing files,
14
14
  // never overwriting the agent's edits (see COPY), so a later call can add a vertical safely.
15
15
  // No vertical arg -> deploys just the shared transport; re-run with the vertical(s) once known.
@@ -19,7 +19,7 @@ const { existsSync, cpSync, readFileSync, writeFileSync } = require('fs');
19
19
 
20
20
  const REF = '/app/.agents/skills/wix-vibe-headless/references';
21
21
  const WIX_CONFIG = '/app/src/rest/wix-config.js';
22
- const VERTICALS = ['storefront', 'bookings', 'blog', 'cms', 'portfolio', 'pricing-plans', 'events', 'members', 'restaurants'];
22
+ const VERTICALS = ['storefront', 'bookings', 'blog', 'cms', 'forms', 'portfolio', 'pricing-plans', 'events', 'members', 'restaurants'];
23
23
 
24
24
  // force:false + errorOnExist:false — fill in only files that AREN'T there yet; never overwrite.
25
25
  // A re-run (e.g. the "files missing? re-run" fallback) then restores what's missing without
@@ -117,8 +117,16 @@ const clientId = flag('client-id');
117
117
  const metaSiteId = flag('metasite-id');
118
118
  // Verticals are the positional args — drop the flags and their values.
119
119
  const flagArgs = new Set(['--client-id', '--metasite-id', clientId, metaSiteId].filter(Boolean));
120
- const requested = [...new Set(argv.filter((a) => !flagArgs.has(a)))];
120
+ // `rentals` is an alias of the Bookings vertical — Wix Rentals runs on the Bookings APIs. A rental
121
+ // business picks `rentals` and gets the bookings scaffolds; it resolves to bookings everywhere.
122
+ const ALIASES = { rentals: 'bookings' };
123
+ const positional = argv.filter((a) => !flagArgs.has(a));
124
+ const requested = [...new Set(positional.map((a) => ALIASES[a] || a))];
121
125
  const deployed = { verticals: [] };
126
+ // Report any alias resolution so the caller sees an intended mapping (rentals -> bookings), not a
127
+ // silent `bookings` result it might read as "rentals unsupported" and wastefully re-deploy.
128
+ const aliased = [...new Set(positional.filter((a) => ALIASES[a]))].map((a) => `${a} -> ${ALIASES[a]}`);
129
+ if (aliased.length) deployed.aliased = aliased;
122
130
 
123
131
  // Shared transport — always (app/rest/wix-client.js, wix-config.js -> src/rest/).
124
132
  if (existsSync(`${REF}/shared/app`)) cpSync(`${REF}/shared/app`, '/app/src', COPY);
@@ -18,7 +18,8 @@ The Wix skills live under \`.agents/skills/\` — on ANY turn, read them from th
18
18
  - **storefront** — sell physical or digital products online.
19
19
  - **bookings** — let customers book appointments or services with your business.
20
20
  - **blog** — publish articles for visitors to read.
21
- - **cms** — model and serve your own custom, structured content — for anything the other verticals don't cover.
21
+ - **forms** — any visitor-fillable form: contact/enquiry, lead, signup, waitlist, application, feedback/survey, quote request, intake or registration. **Not forms** — an event or occasion RSVP is **events** (built-in RSVP registration form), and a per-service booking form is **bookings**.
22
+ - **cms** — model and serve your own custom, structured content — for anything the other verticals don't cover. **Not cms** — a visitor-fillable form is **forms**; reach for cms only when the app must read the entries back.
22
23
  - **portfolio** — showcase creative work in collections and project pages.
23
24
  - **pricing-plans** — sell memberships or subscriptions to your service.
24
25
  - **events** — publish events and handle RSVPs or ticket sales.
@@ -87,7 +87,9 @@ urls are ready by the time you seed.
87
87
 
88
88
  ## STEP 4 — Wrap up
89
89
 
90
- **Do NOT add the `<WixManageBanner/>` component** and do not send the user Wix dashboard links — this flow does not include the manage banner or back-office handoff.
90
+ **Do NOT add the `<WixManageBanner/>` component** and never paste a Wix dashboard link or path.
91
+
92
+ **Hand off with one call, before you write anything** — `search_base44_docs(query="how do I manage my store's products, orders and inventory?", prefer_dashboard=true)`. It comes back telling you what to say; add only that the catalog you seeded is mock data they can edit, replace or delete.
91
93
 
92
94
  **Preview briefly, don't chase images.** Broken images are expected — `generate_image` returns a `/__generating__/…` placeholder that the platform swaps for the final url automatically at turn end (failures get a stock fallback). **Do NOT edit or debug image urls.** Leave them and finish.
93
95
 
@@ -56,7 +56,9 @@ rejects the write. Wire routes/imports in with `find_replace`, leave the rest as
56
56
 
57
57
  **No seeding in this flow** — the client is the only deliverable. Do not seed, populate, or write data to Wix.
58
58
 
59
- **Do NOT add the `<WixManageBanner/>` component** and do not send the user Wix dashboard links — this flow does not include the manage banner or back-office handoff.
59
+ **Do NOT add the `<WixManageBanner/>` component** and never paste a Wix dashboard link or path.
60
+
61
+ **Hand off with one call, before you write anything** — `search_base44_docs(query="how do I manage my store's products, orders and inventory?", prefer_dashboard=true)`. It comes back telling you what to say.
60
62
 
61
63
  **Preview briefly, don't chase images.** Broken images are expected — `generate_image` returns a `/__generating__/…` placeholder that the platform swaps for the final url automatically at turn end (failures get a stock fallback). **Do NOT edit or debug image urls.** Leave them and finish.
62
64