@wix/agent-skills 1.15.0 → 1.16.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 (355) hide show
  1. package/README.md +5 -1
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +4 -1
  4. package/skills/wix-app/references/APP_TOOLS.md +134 -0
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +1 -1
  6. package/skills/wix-app/references/DASHBOARD_PAGE.md +0 -10
  7. package/skills/wix-app/references/DATA_COLLECTION.md +6 -4
  8. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +28 -7
  9. package/skills/wix-app/references/SERVICE_PLUGIN.md +12 -10
  10. package/skills/wix-app/references/STORES_VERSIONING.md +9 -211
  11. package/skills/wix-app/references/app-tools/TOOLS.md +75 -0
  12. package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +5 -0
  13. package/skills/wix-app/references/dashboard-page/DASHBOARD_API.md +2 -2
  14. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW-REFERENCE.md +172 -0
  15. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +138 -0
  16. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +172 -0
  17. package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +29 -0
  18. package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +1 -1
  19. package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +57 -0
  20. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +33 -2
  21. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +5 -3
  22. package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +18 -1
  23. package/skills/wix-app/references/editor-react-component/PARTS.md +15 -2
  24. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +4 -3
  25. package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +13 -9
  26. package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +4 -0
  27. package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +4 -0
  28. package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +3 -1
  29. package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +4 -0
  30. package/skills/wix-app/references/service-plugin/TOOLS_PROVIDER.md +54 -0
  31. package/skills/wix-app/references/stores/CATEGORIES.md +22 -0
  32. package/skills/wix-app/references/stores/GET_PRODUCT.md +99 -0
  33. package/skills/wix-app/references/stores/INVENTORY.md +37 -0
  34. package/skills/wix-app/references/stores/QUERY.md +119 -0
  35. package/skills/wix-app/references/stores/WRITE.md +55 -0
  36. package/skills/wix-docs/SKILL.md +35 -3
  37. package/skills/wix-headless/SKILL.md +9 -2
  38. package/skills/wix-headless/entry/bootstrap.mjs +2 -2
  39. package/skills/wix-headless/entry/skill.md +0 -2
  40. package/skills/wix-headless/references/CAPABILITIES.md +6 -4
  41. package/skills/wix-headless/references/CONTENT.md +36 -0
  42. package/skills/wix-headless/references/DESIGN.md +54 -0
  43. package/skills/wix-headless/references/DISCOVERY.md +25 -1
  44. package/skills/wix-headless/references/FEEDBACK.md +16 -5
  45. package/skills/wix-headless/references/IMAGE_GENERATION.md +10 -0
  46. package/skills/wix-headless/references/SDK_HANDOFF.md +2 -0
  47. package/skills/wix-headless/references/SEED.md +3 -1
  48. package/skills/wix-headless/references/SETUP.md +1 -1
  49. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +3 -2
  50. package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-reservations.md +42 -2
  51. package/skills/wix-headless/references/inline-recipes/setup-bookings.md +5 -1
  52. package/skills/wix-headless/references/inline-recipes/setup-forms.md +1 -1
  53. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +33 -8
  54. package/skills/wix-headless/references/inline-recipes/setup-portfolio.md +3 -1
  55. package/skills/wix-headless/references/inline-recipes/setup-restaurant-experiences.md +73 -0
  56. package/skills/wix-headless/references/inline-recipes/setup-restaurant-orders.md +38 -2
  57. package/skills/wix-headless/references/inline-recipes/setup-restaurant-reservations.md +20 -1
  58. package/skills/wix-headless/references/inline-recipes/setup-restaurants.md +1 -1
  59. package/skills/wix-headless/references/managed/CONNECT.md +2 -2
  60. package/skills/wix-headless/references/managed/CREATE.md +15 -1
  61. package/skills/wix-headless/references/managed/DEPLOYMENT.md +47 -0
  62. package/skills/wix-headless/references/self-managed/DEPLOYMENT.md +8 -0
  63. package/skills/wix-headless/references/stripe/DEPLOYMENT.md +8 -0
  64. package/skills/wix-manage/SKILL.md +131 -12
  65. package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +41 -0
  66. package/skills/wix-manage/references/analytics/query-site-analytics.md +66 -9
  67. package/skills/wix-manage/references/app-installation/app-installation-dashboard-navigation.md +28 -0
  68. package/skills/wix-manage/references/app-installation/install-wix-apps.md +3 -0
  69. package/skills/wix-manage/references/blog/blog-dashboard-navigation.md +56 -0
  70. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +31 -6
  71. package/skills/wix-manage/references/bookings/booking-service-policy-setup.md +3 -1
  72. package/skills/wix-manage/references/bookings/bookings-dashboard-navigation.md +63 -0
  73. package/skills/wix-manage/references/bookings/create-booking-service-from-prompt.md +6 -5
  74. package/skills/wix-manage/references/bookings/create-course-service.md +30 -5
  75. package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +85 -42
  76. package/skills/wix-manage/references/cms/cms-dashboard-navigation.md +44 -0
  77. package/skills/wix-manage/references/cms/cms-data-items-crud.md +31 -3
  78. package/skills/wix-manage/references/cms/cms-publishing-flow.md +287 -0
  79. package/skills/wix-manage/references/cms/cms-schema-management.md +33 -1
  80. package/skills/wix-manage/references/contacts/contacts-dashboard-navigation.md +46 -0
  81. package/skills/wix-manage/references/contacts/create-a-contact.md +82 -0
  82. package/skills/wix-manage/references/contacts/update-a-contact.md +119 -0
  83. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +82 -0
  84. package/skills/wix-manage/references/dashboard-navigation/routes.json +1733 -0
  85. package/skills/wix-manage/references/domains/domains-dashboard-navigation.md +32 -0
  86. package/skills/wix-manage/references/ecommerce/ecom-pricing.md +4 -4
  87. package/skills/wix-manage/references/ecommerce/ecom-shipping.md +1 -1
  88. package/skills/wix-manage/references/ecommerce/gift-cards/ecom-gift-cards-goal-sell-gift-cards.md +338 -0
  89. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-create-discount-rule.md +42 -78
  90. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-bundle-and-save.md +1 -1
  91. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-stock-mover.md +1 -1
  92. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-upsell-boost.md +1 -1
  93. package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +90 -92
  94. package/skills/wix-manage/references/events/create-wix-event.md +176 -0
  95. package/skills/wix-manage/references/events/manage-wix-events.md +174 -0
  96. package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +44 -0
  97. package/skills/wix-manage/references/get-paid/get-paid-dashboard-navigation.md +52 -0
  98. package/skills/wix-manage/references/get-paid/how-to-setup-wix-payments.md +30 -7
  99. package/skills/wix-manage/references/google-ads/billing-and-payment.md +80 -0
  100. package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +212 -0
  101. package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +110 -0
  102. package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +25 -0
  103. package/skills/wix-manage/references/google-ads/install-and-create-account.md +155 -0
  104. package/skills/wix-manage/references/google-ads/manage-campaign-lifecycle.md +63 -0
  105. package/skills/wix-manage/references/google-ads/query-campaign-analytics.md +155 -0
  106. package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +225 -144
  107. package/skills/wix-manage/references/marketing/generate-and-publish-marketing-plan.md +19 -10
  108. package/skills/wix-manage/references/marketing/marketing-dashboard-navigation.md +52 -0
  109. package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +99 -1
  110. package/skills/wix-manage/references/pricing-plans/pricing-plans-dashboard-navigation.md +45 -0
  111. package/skills/wix-manage/references/restaurants/restaurants-dashboard-navigation.md +68 -0
  112. package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +94 -125
  113. package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +48 -9
  114. package/skills/wix-manage/references/site-properties/site-properties-dashboard-navigation.md +31 -0
  115. package/skills/wix-manage/references/sites/create-headless-site.md +52 -0
  116. package/skills/wix-manage/references/sites/create-site-from-template.md +2 -25
  117. package/skills/wix-manage/references/sites/site-import.md +243 -0
  118. package/skills/wix-manage/references/sites/sites-dashboard-navigation.md +29 -0
  119. package/skills/wix-manage/references/stores/add-store-pages-to-site.md +17 -1
  120. package/skills/wix-manage/references/stores/create-product-from-image.md +8 -6
  121. package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +16 -10
  122. package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +26 -8
  123. package/skills/wix-manage/references/stores/stores-dashboard-navigation.md +65 -0
  124. package/skills/wix-manage/references/stores/update-product-with-options.md +39 -7
  125. package/skills/wix-replatform/.publish-manifest.json +8 -0
  126. package/skills/wix-replatform/SKILL.md +693 -0
  127. package/skills/wix-replatform/lib/artifact-freshness.js +215 -0
  128. package/skills/wix-replatform/lib/completion-report.js +200 -0
  129. package/skills/wix-replatform/lib/config-env.js +59 -0
  130. package/skills/wix-replatform/lib/execution-manifest.js +185 -0
  131. package/skills/wix-replatform/lib/execution-state.js +173 -0
  132. package/skills/wix-replatform/lib/import-recovery.js +313 -0
  133. package/skills/wix-replatform/lib/local-state.js +642 -0
  134. package/skills/wix-replatform/lib/orchestration-preflight.js +143 -0
  135. package/skills/wix-replatform/lib/orchestration-router.js +122 -0
  136. package/skills/wix-replatform/lib/orchestration-state.js +455 -0
  137. package/skills/wix-replatform/lib/progress-log.js +224 -0
  138. package/skills/wix-replatform/lib/progress-log.sh +140 -0
  139. package/skills/wix-replatform/lib/url-preservation-state.js +391 -0
  140. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +184 -0
  141. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +529 -0
  142. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +316 -0
  143. package/skills/wix-replatform/resources/rp-execute-setup/scripts/mint-token.sh +64 -0
  144. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +1114 -0
  145. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +430 -0
  146. package/skills/wix-replatform/resources/rp-mapper/lib/mapping-resolve.js +217 -0
  147. package/skills/wix-replatform/resources/rp-mapper/scripts/resolve-mapping.js +148 -0
  148. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +378 -0
  149. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +183 -0
  150. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +478 -0
  151. package/skills/wix-replatform/resources/rp-source-csv/lib/canonical-record.js +136 -0
  152. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  153. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fingerprint.js +310 -0
  154. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-layout.js +1081 -0
  155. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-parse.js +618 -0
  156. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +949 -0
  157. package/skills/wix-replatform/resources/rp-source-csv/source-schema.example.json +196 -0
  158. package/skills/wix-replatform/resources/rp-source-csv/vendors/bigcommerce.json +66 -0
  159. package/skills/wix-replatform/resources/rp-source-csv/vendors/magento.json +60 -0
  160. package/skills/wix-replatform/resources/rp-source-csv/vendors/shopify.json +95 -0
  161. package/skills/wix-replatform/resources/rp-source-csv/vendors/woocommerce.json +82 -0
  162. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +256 -0
  163. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +249 -0
  164. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +444 -0
  165. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +774 -0
  166. package/skills/wix-replatform/resources/rp-source-wordpress/source-schema.example.json +71 -0
  167. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +632 -0
  168. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +330 -0
  169. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +21 -0
  170. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -0
  171. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +37 -0
  172. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +37 -0
  173. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +39 -0
  174. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +35 -0
  175. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +14 -0
  176. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +35 -0
  177. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +36 -0
  178. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +35 -0
  179. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +14 -0
  180. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +131 -0
  181. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +37 -0
  182. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +37 -0
  183. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +21 -0
  184. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +37 -0
  185. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +37 -0
  186. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +97 -0
  187. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +528 -0
  188. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -0
  189. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +38 -0
  190. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +37 -0
  191. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -0
  192. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +37 -0
  193. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +53 -0
  194. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +84 -0
  195. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +25 -0
  196. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +37 -0
  197. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +37 -0
  198. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +38 -0
  199. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +37 -0
  200. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +90 -0
  201. package/skills/wix-replatform/resources/rp-target-wix/lib/audit-summary.js +64 -0
  202. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +141 -0
  203. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +384 -0
  204. package/skills/wix-replatform/resources/rp-target-wix/lib/ndjson.js +260 -0
  205. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +238 -0
  206. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +237 -0
  207. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +238 -0
  208. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +2219 -0
  209. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +31 -0
  210. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge.js +100 -0
  211. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +107 -0
  212. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +344 -0
  213. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +250 -0
  214. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1927 -0
  215. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +83 -0
  216. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +141 -0
  217. package/skills/wix-replatform/scripts/artifact-freshness.js +76 -0
  218. package/skills/wix-replatform/scripts/execution-manifest-validate.js +43 -0
  219. package/skills/wix-replatform/scripts/execution-state-prepare.js +128 -0
  220. package/skills/wix-replatform/scripts/orchestration-preflight.js +48 -0
  221. package/skills/wix-replatform/scripts/orchestration-route.js +46 -0
  222. package/skills/wix-replatform/scripts/orchestration-state.js +245 -0
  223. package/skills/wix-vibe-headless/SKILL.md +54 -25
  224. package/skills/wix-vibe-headless/install/deploy.cjs +95 -0
  225. package/skills/wix-vibe-headless/install/pin-agents-md.cjs +34 -0
  226. package/skills/wix-vibe-headless/platforms/README.md +26 -0
  227. package/skills/wix-vibe-headless/platforms/base44.md +177 -0
  228. package/skills/wix-vibe-headless/platforms/generic.md +122 -0
  229. package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +230 -119
  230. package/skills/wix-vibe-headless/references/blog/app/components/PostCard.jsx +43 -0
  231. package/skills/wix-vibe-headless/references/blog/app/components/PostChips.jsx +25 -0
  232. package/skills/wix-vibe-headless/references/blog/app/components/PostGrid.jsx +15 -0
  233. package/skills/wix-vibe-headless/references/blog/app/context/TaxonomyContext.jsx +35 -0
  234. package/skills/wix-vibe-headless/references/blog/app/hooks/usePostDetail.js +38 -0
  235. package/skills/wix-vibe-headless/references/blog/app/pages/Blog.jsx +40 -0
  236. package/skills/wix-vibe-headless/references/blog/app/pages/CategoryPage.jsx +54 -0
  237. package/skills/wix-vibe-headless/references/blog/app/pages/PostDetail.jsx +65 -0
  238. package/skills/wix-vibe-headless/references/blog/app/pages/TagPage.jsx +50 -0
  239. package/skills/wix-vibe-headless/references/blog/seed/SEED.md +103 -0
  240. package/skills/wix-vibe-headless/references/blog/seed/seed-blog.js +270 -0
  241. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +260 -145
  242. package/skills/wix-vibe-headless/references/bookings/app/components/BookingForm.jsx +65 -0
  243. package/skills/wix-vibe-headless/references/bookings/app/components/ServiceCard.jsx +47 -0
  244. package/skills/wix-vibe-headless/references/bookings/app/components/ServiceGrid.jsx +13 -0
  245. package/skills/wix-vibe-headless/references/bookings/app/components/SlotPicker.jsx +126 -0
  246. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +108 -0
  247. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServices.js +58 -0
  248. package/skills/wix-vibe-headless/references/bookings/app/lib/serviceFacts.js +95 -0
  249. package/skills/wix-vibe-headless/references/bookings/app/pages/ServiceDetail.jsx +94 -0
  250. package/skills/wix-vibe-headless/references/bookings/app/pages/Services.jsx +89 -0
  251. package/skills/wix-vibe-headless/references/bookings/{wix-bookings-checkout.js → app/rest/wix-bookings-checkout.js} +1 -1
  252. package/skills/wix-vibe-headless/references/bookings/{wix-bookings-services.js → app/rest/wix-bookings-services.js} +90 -12
  253. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +117 -0
  254. package/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.js +333 -0
  255. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +169 -147
  256. package/skills/wix-vibe-headless/references/cms/app/collection.config.js +31 -0
  257. package/skills/wix-vibe-headless/references/cms/app/lib/wixImage.js +18 -0
  258. package/skills/wix-vibe-headless/references/cms/{wix-cms.js → app/rest/wix-cms.js} +47 -2
  259. package/skills/wix-vibe-headless/references/cms/seed/SEED.md +145 -0
  260. package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +228 -131
  261. package/skills/wix-vibe-headless/references/events/app/components/CategoryFilter.jsx +23 -0
  262. package/skills/wix-vibe-headless/references/events/app/components/EventCard.jsx +43 -0
  263. package/skills/wix-vibe-headless/references/events/app/components/EventGrid.jsx +13 -0
  264. package/skills/wix-vibe-headless/references/events/app/components/EventRegistration.jsx +29 -0
  265. package/skills/wix-vibe-headless/references/events/app/components/RsvpForm.jsx +57 -0
  266. package/skills/wix-vibe-headless/references/events/app/components/TicketPicker.jsx +78 -0
  267. package/skills/wix-vibe-headless/references/events/app/hooks/useEventDetail.js +27 -0
  268. package/skills/wix-vibe-headless/references/events/app/hooks/useEventsList.js +54 -0
  269. package/skills/wix-vibe-headless/references/events/app/hooks/useRsvpForm.js +40 -0
  270. package/skills/wix-vibe-headless/references/events/app/hooks/useTicketing.js +81 -0
  271. package/skills/wix-vibe-headless/references/events/app/pages/EventDetail.jsx +48 -0
  272. package/skills/wix-vibe-headless/references/events/app/pages/Events.jsx +36 -0
  273. package/skills/wix-vibe-headless/references/events/{wix-events-browse.js → app/rest/wix-events-browse.js} +3 -2
  274. package/skills/wix-vibe-headless/references/events/seed/SEED.md +107 -0
  275. package/skills/wix-vibe-headless/references/events/seed/seed-events.js +251 -0
  276. package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +276 -188
  277. package/skills/wix-vibe-headless/references/members/app/components/LoginForm.jsx +101 -0
  278. package/skills/wix-vibe-headless/references/members/app/components/MemberMenu.jsx +33 -0
  279. package/skills/wix-vibe-headless/references/members/app/components/RequireAuth.jsx +21 -0
  280. package/skills/wix-vibe-headless/references/members/app/components/SocialButtons.jsx +29 -0
  281. package/skills/wix-vibe-headless/references/members/app/context/MemberContext.jsx +54 -0
  282. package/skills/wix-vibe-headless/references/members/app/hooks/useLoginForm.js +77 -0
  283. package/skills/wix-vibe-headless/references/members/app/pages/Account.jsx +36 -0
  284. package/skills/wix-vibe-headless/references/members/app/pages/Callback.jsx +32 -0
  285. package/skills/wix-vibe-headless/references/members/app/pages/Login.jsx +35 -0
  286. package/skills/wix-vibe-headless/references/members/{wix-members-auth.js → app/rest/wix-members-auth.js} +6 -3
  287. package/skills/wix-vibe-headless/references/members/install/Register.jsx +22 -0
  288. package/skills/wix-vibe-headless/references/members/seed/SEED.md +22 -0
  289. package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +233 -104
  290. package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionCard.jsx +31 -0
  291. package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionGrid.jsx +15 -0
  292. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectCard.jsx +39 -0
  293. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectGrid.jsx +15 -0
  294. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +29 -0
  295. package/skills/wix-vibe-headless/references/portfolio/app/hooks/useCollectionProjects.js +35 -0
  296. package/skills/wix-vibe-headless/references/portfolio/app/hooks/usePortfolioGallery.js +27 -0
  297. package/skills/wix-vibe-headless/references/portfolio/app/hooks/useProjectDetail.js +25 -0
  298. package/skills/wix-vibe-headless/references/portfolio/app/pages/CollectionPage.jsx +39 -0
  299. package/skills/wix-vibe-headless/references/portfolio/app/pages/Portfolio.jsx +27 -0
  300. package/skills/wix-vibe-headless/references/portfolio/app/pages/ProjectDetail.jsx +60 -0
  301. package/skills/wix-vibe-headless/references/portfolio/{wix-portfolio.js → app/rest/wix-portfolio.js} +84 -55
  302. package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +94 -0
  303. package/skills/wix-vibe-headless/references/portfolio/seed/seed-portfolio.js +236 -0
  304. package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +240 -117
  305. package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +35 -0
  306. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanCard.jsx +48 -0
  307. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanGrid.jsx +16 -0
  308. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanPrice.jsx +35 -0
  309. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/useMyPlans.js +25 -0
  310. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlanDetail.js +28 -0
  311. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlans.js +30 -0
  312. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/MyPlans.jsx +30 -0
  313. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/PlanDetail.jsx +53 -0
  314. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/Plans.jsx +28 -0
  315. package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +86 -0
  316. package/skills/wix-vibe-headless/references/pricing-plans/seed/seed-pricing-plans.js +251 -0
  317. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +248 -124
  318. package/skills/wix-vibe-headless/references/restaurants/app/components/ItemDialog.jsx +81 -0
  319. package/skills/wix-vibe-headless/references/restaurants/app/components/MenuItemCard.jsx +71 -0
  320. package/skills/wix-vibe-headless/references/restaurants/app/components/MenuList.jsx +43 -0
  321. package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartButton.jsx +21 -0
  322. package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +60 -0
  323. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +63 -0
  324. package/skills/wix-vibe-headless/references/restaurants/app/hooks/useItemOrder.js +32 -0
  325. package/skills/wix-vibe-headless/references/restaurants/app/hooks/useReservation.js +73 -0
  326. package/skills/wix-vibe-headless/references/restaurants/app/pages/Menu.jsx +28 -0
  327. package/skills/wix-vibe-headless/references/restaurants/app/pages/Reservations.jsx +102 -0
  328. package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +180 -0
  329. package/skills/wix-vibe-headless/references/restaurants/seed/seed-restaurants.js +452 -0
  330. package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +56 -0
  331. package/skills/wix-vibe-headless/references/shared/{wix-client.js → app/rest/wix-client.js} +6 -8
  332. package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +6 -0
  333. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +263 -148
  334. package/skills/wix-vibe-headless/references/storefront/app/components/CartButton.jsx +20 -0
  335. package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +150 -0
  336. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +167 -0
  337. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +51 -0
  338. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +54 -0
  339. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +119 -0
  340. package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +71 -0
  341. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +109 -0
  342. package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +98 -0
  343. package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +27 -0
  344. package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +139 -0
  345. package/skills/wix-vibe-headless/references/storefront/app/pages/Shop.jsx +75 -0
  346. package/skills/wix-vibe-headless/references/storefront/{wix-store-cart.js → app/rest/wix-store-cart.js} +1 -1
  347. package/skills/wix-vibe-headless/references/storefront/{wix-store-catalog.js → app/rest/wix-store-catalog.js} +25 -2
  348. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +111 -0
  349. package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +299 -0
  350. /package/skills/wix-vibe-headless/references/blog/{wix-blog.js → app/rest/wix-blog.js} +0 -0
  351. /package/skills/wix-vibe-headless/references/events/{wix-events-registration.js → app/rest/wix-events-registration.js} +0 -0
  352. /package/skills/wix-vibe-headless/references/pricing-plans/{wix-pricing-plans.js → app/rest/wix-pricing-plans.js} +0 -0
  353. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-menu.js → app/rest/wix-restaurants-menu.js} +0 -0
  354. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-ordering.js → app/rest/wix-restaurants-ordering.js} +0 -0
  355. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-reservations.js → app/rest/wix-restaurants-reservations.js} +0 -0
@@ -0,0 +1,145 @@
1
+ # CMS — seeding (Wix Data v2 REST)
2
+
3
+ Seeding a collection is an **admin/build-time** job: create the collection(s), insert items, wire
4
+ references, attach images — all via the **Wix Data v2 REST API**. There is **no helper module** — make
5
+ the calls yourself with the shapes below. Needs an **elevated credential** (a connector token or a Wix
6
+ API key; the public `WIX_CLIENT_ID` cannot write — see the platform doc's seed-auth step).
7
+
8
+ **⛔ Additive only — never delete, reset, or overwrite existing content.**
9
+
10
+ ## Auth (on every call)
11
+ The curls below are **request shapes** — endpoint, method, body. **Never inline the raw token/API key**
12
+ into a command: it would end up in the transcript, exec logs, and shell history. Keep the credential in
13
+ a variable and reference it.
14
+ - **On Base44 (and any exec-tool platform): don't shell out to curl — make these calls with `fetch()`**,
15
+ taking the token from the connector so it's never printed:
16
+ ```js
17
+ const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix"); // token stays in memory
18
+ await fetch(`https://www.wixapis.com/wix-data/v2/collections`, {
19
+ method: "POST",
20
+ headers: { Authorization: `Bearer ${accessToken}`, "wix-site-id": METASITE_ID, "Content-Type": "application/json" },
21
+ body: JSON.stringify({ collection: { /* … */ } }),
22
+ });
23
+ ```
24
+ - **On a shell/curl platform:** load the credential into an env var from your secret manager (don't
25
+ echo it), then reference `$TOKEN` — the literal never appears in the command you write:
26
+ ```bash
27
+ API=https://www.wixapis.com
28
+ # TOKEN comes from your connector / secret manager (e.g. TOKEN="$WIX_TOKEN") — do NOT paste it here.
29
+ AUTH=(-H "Authorization: Bearer $TOKEN" -H "wix-site-id: $METASITE_ID" -H "Content-Type: application/json")
30
+ # Wix API key instead of a token → -H "Authorization: $TOKEN" (raw, NO "Bearer")
31
+ ```
32
+
33
+ ## 0 · Install the Wix Data app — only if a data call returns `WDE0110` (app not installed)
34
+ ```bash
35
+ curl -sS -X POST "$API/apps-installer-service/v1/app-instance/install" "${AUTH[@]}" \
36
+ -d '{"tenant":{"tenantType":"SITE","id":"<METASITE_ID>"},
37
+ "appInstance":{"appDefId":"e593b0bd-b783-45b8-97c2-873d42aacaf4","enabled":true}}'
38
+ ```
39
+
40
+ ## 1 · Create a collection — the `permissions` block is MANDATORY
41
+ ```bash
42
+ curl -sS -X POST "$API/wix-data/v2/collections" "${AUTH[@]}" -d '{
43
+ "collection": {
44
+ "id": "Recipes", "displayName": "Recipes",
45
+ "fields": [
46
+ { "key": "title", "displayName": "Title", "type": "TEXT" },
47
+ { "key": "photo", "displayName": "Photo", "type": "IMAGE" },
48
+ { "key": "categories", "displayName": "Categories", "type": "MULTI_REFERENCE",
49
+ "typeMetadata": { "multiReference": { "referencedCollectionId": "Categories" } } }
50
+ ],
51
+ "permissions": { "insert": "ADMIN", "update": "ADMIN", "remove": "ADMIN", "read": "ANYONE" }
52
+ }
53
+ }'
54
+ ```
55
+ - The `id` you send **is** the collection id (Wix doesn't rename it) — keep it + the field keys.
56
+ - **Permissions is required and load-bearing.** A public collection's `read` **must** be `"ANYONE"` or a visitor query silently returns 0 items. Presets:
57
+
58
+ | preset | `read` / `insert` / `update` / `remove` | use |
59
+ |---|---|---|
60
+ | **public-read** (default) | `ANYONE` / `ADMIN` / `ADMIN` / `ADMIN` | admin content, anyone reads |
61
+ | **collaborative** | `ANYONE` / `ANYONE` / `ANYONE` / `ANYONE` | visitor-written shared board (anonymous, unscoped) |
62
+ | **member-private** | `SITE_MEMBER_AUTHOR` / `SITE_MEMBER` / `SITE_MEMBER_AUTHOR` / `SITE_MEMBER_AUTHOR` | per-user "my…" rows (`_owner`-matched); **create it EMPTY** — members populate it from the client with their **member token** so Wix stamps `_owner` |
63
+ | **member-shared-read-only** | `SITE_MEMBER` / `ADMIN` / `ADMIN` / `ADMIN` | gated: any member reads, seed/admin writes |
64
+ | **public-wall** | `ANYONE` / `SITE_MEMBER` / `SITE_MEMBER_AUTHOR` / `SITE_MEMBER_AUTHOR` | members post, **everyone** reads (public gallery/feed); authors edit only their own |
65
+
66
+ - **The values are Wix user *roles*, and they're a hierarchy** — a role can do anything the roles below it can. Pick per action (`read` / `insert` / `update` / `remove`):
67
+
68
+ | role | who, for that action |
69
+ |---|---|
70
+ | `ANYONE` | any visitor, logged in or not |
71
+ | `SITE_MEMBER` | any logged-in member — **all** rows |
72
+ | `SITE_MEMBER_AUTHOR` | logged-in members, but **only rows they created** (Wix matches `_owner`) — this is how "only mine" is enforced, server-side |
73
+ | `CMS_EDITOR` | Wix users holding a CMS role |
74
+ | `PRIVILEGED` / `ADMIN` | site admins + special permissions only |
75
+
76
+ So **`read` is the privacy decision**: `SITE_MEMBER_AUTHOR` scopes each read to its caller on the
77
+ server, so a member receives only their own rows and the client needs no filter; `ANYONE` publishes
78
+ every row, and a `_owner` filter then selects a view of public data. Set it here, at create time —
79
+ the client inherits whichever you choose.
80
+ Reference: [Data Permissions](https://dev.wix.com/docs/api-reference/business-solutions/cms/collection-management/data-permissions/introduction.md)
81
+
82
+ - **MULTI_REFERENCE fields:** `typeMetadata.multiReference.referencedCollectionId` is mandatory (NOT `referencedCollection` — the docs' stale key stores an empty target and every later link is dead), and the **target collection must be created first**.
83
+ - `409 WDE0104` = "collection already exists" — fine (additive); skip and move on.
84
+
85
+ ## 2 · Insert items — bulk
86
+ ```bash
87
+ curl -sS -X POST "$API/wix-data/v2/bulk/items/insert" "${AUTH[@]}" -d '{
88
+ "dataCollectionId": "Recipes",
89
+ "dataItems": [ { "data": { "title": "Chocolate Cake" } }, { "data": { "title": "Pavlova" } } ],
90
+ "returnEntity": true
91
+ }'
92
+ # ← read each id from results[].dataItem.id (NOT results[].item)
93
+ ```
94
+ Single item: `POST $API/wix-data/v2/items` with `{"dataCollectionId":"Recipes","dataItem":{"data":{…}}}`.
95
+ - Set plain fields + single `REFERENCE` (pass the target item's `_id` string) only. A **`MULTI_REFERENCE` value here is silently dropped** (no error) — wire it in step 4.
96
+
97
+ ## 3 · Verify — a `200` does NOT prove the rows persisted
98
+ ```bash
99
+ curl -sS -X POST "$API/wix-data/v2/items/query" "${AUTH[@]}" -d '{"dataCollectionId":"Recipes"}'
100
+ # ← { "dataItems": [ { "id": "...", "data": { … } }, … ] }
101
+ ```
102
+
103
+ ## 4 · Wire multi-references — only if collections relate
104
+ ```bash
105
+ curl -sS -X POST "$API/wix-data/v2/bulk/items/insert-references" "${AUTH[@]}" -d '{
106
+ "dataCollectionId": "Recipes",
107
+ "dataItemReferences": [
108
+ { "referringItemFieldName": "categories", "referringItemId": "<recipeId>", "referencedItemId": "<categoryId>" }
109
+ ]
110
+ }'
111
+ ```
112
+ Resolves only if the field was created with a non-empty `referencedCollectionId` (step 1). Ids come from step 2's `results[].dataItem.id`.
113
+
114
+ ## 5 · Images (optional)
115
+ An `IMAGE` field stores a **URL string**. Use a permanent Wix Media URL — if your image is external
116
+ (e.g. a generated one), **upload it to Wix Media first** (`POST /site-media/v1/files/import` with
117
+ `{url, mimeType, displayName}` → use the returned `file.url`; the blog/storefront seeds show this), then
118
+ set it. Attaching is a **read-merge-PUT** — a PUT replaces the whole item, so a partial body wipes the
119
+ other fields:
120
+ ```bash
121
+ # query the item (step 3), merge the url into its IMAGE field, then PUT the WHOLE record back:
122
+ curl -sS -X PUT "$API/wix-data/v2/items/<itemId>" "${AUTH[@]}" -d '{
123
+ "dataCollectionId": "Recipes",
124
+ "dataItem": { "data": { <…all existing fields…>, "_id": "<itemId>", "photo": "https://…/file.jpg" } }
125
+ }'
126
+ ```
127
+
128
+ ## Gotchas
129
+ - Elevated credential required (the public client id can't write).
130
+ - **Provisioning race:** a fresh site's FIRST create/insert can transiently fail — `403`, or `400 WDE0117` ("MetaSite not found"), or `5xx`. Retry the same call **once** after ~3s, then fail loud (don't loop).
131
+ - Any PUT/update **replaces** the whole item — always fetch + merge (or use Patch Data Item).
132
+ - Verify with a query; a non-error POST is not proof of persistence.
133
+
134
+ ## Reference
135
+ Read a method's page before writing its call: it carries the exact body shape, the required
136
+ permission scope, and the response envelope.
137
+ - Install a Wix app onto the site: https://dev.wix.com/docs/api-reference/business-management/app-installation/app-installation/install-app.md
138
+ - Import an image into Wix Media: https://dev.wix.com/docs/api-reference/assets/media/media-manager/files/import-file.md
139
+ - Create Data Collection: https://dev.wix.com/docs/api-reference/business-solutions/cms/collection-management/data-collections/create-data-collection.md
140
+ - Bulk Insert Data Items: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/bulk-insert-data-items.md
141
+ - Bulk Insert Data Item References: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/bulk-insert-data-item-references.md
142
+ - Data Items API: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items.md
143
+ - Collections: https://dev.wix.com/docs/api-reference/business-solutions/cms/collection-management/data-collections.md
144
+ - Anything not covered → use the `wix-docs` skill (search + read the live reference); never guess.
145
+ - Anything not covered → use the `wix-docs` skill (search + read the live reference); never guess.
@@ -1,142 +1,239 @@
1
+ # Wix Events — ready-made client
1
2
 
2
- # Wix Events Skill
3
+ The events client is **shipped as real files**, not snippets to regenerate. It's a complete events
4
+ listing + detail page + RSVP + ticketing (reserve → hosted checkout, plus in-app free-ticket
5
+ checkout), styled with your app's design tokens (base44's `src/index.css` — the shadcn palette the
6
+ design phase already set). Copy it into the app and wire the routes — you generate almost none of the
7
+ events code (offset paging, category filtering, the RSVP `WAITLIST` case, the ticket
8
+ reservation/checkout shapes all ship and are correct).
3
9
 
4
- > **Source files (in this skill):** the shared transport `references/shared/wix-client.js` and the helper file(s) you need from `references/events/`. All helpers import from `"./wix-client.js"`, so copy them into the same folder (e.g. `src/rest/`).
5
- >
6
- > | Need | Copy |
7
- > |---|---|
8
- > | Event listing + detail (always) | `wix-events-browse.js` |
9
- > | RSVP, ticketing, registration | `wix-events-registration.js` |
10
+ Talks to Wix directly over the public `WIX_CLIENT_ID` (anonymous visitor tokens). Never mock events;
11
+ never hand-build a registration/ticket/checkout URL — RSVP completes client-side and paid tickets go
12
+ through the Wix-hosted ticket form via the shipped reserve → redirect path.
10
13
 
11
- Builds a real, client-only Wix Events site. The browser talks to Wix directly over a
12
- public `WIX_CLIENT_ID`. Never mock events; never hand-build registration or payment URLs —
13
- register via the RSVP/ticketing APIs, and complete paid tickets on the official Wix-hosted
14
- ticket form.
14
+ ## Prerequisites
15
+ - The site's **Wix Events & Tickets** app is the read/registration target. It's installed and seeded separately (see **Seeding** below), in parallel with this build — so it may have no events at build time; the client renders the shipped empty state until events are published. This client is read-only over events (it does not create them).
16
+ - The public headless **`WIX_CLIENT_ID`** from your prompt (visitor-facing, safe to hardcode/commit).
17
+ - Selling **paid** tickets also needs a Wix premium plan + a configured payment method on the site; **free** events and RSVP events work without. For paid tickets the buyer completes payment on the Wix-hosted ticket form; the deployed app domain may need to be allow-listed on the OAuth client for the return to land cleanly — a separate Wix setup the user completes later, out of scope here.
15
18
 
16
- ## When to use
17
- - User wants an events site over Wix Events & Tickets, or asks to "connect Wix Events".
18
- - Replacing placeholder/mock events with live Wix data.
19
- - Adding event listings, an event detail page, RSVP, or ticket purchase over existing,
20
- published Wix events.
19
+ ## STEP 1 — The client is already in `src/`
20
+ The install step (base44.md STEP 1) deployed the whole events UI client + REST scaffolds into `src/`
21
+ (imports use the `@/` alias → `src/`). Here's every file and what it is — **this is your map, so you
22
+ don't need to open them:**
21
23
 
22
- ## Prerequisites
23
- 1. A Wix site with **Wix Events & Tickets installed and events already published** (this skill
24
- does NOT create events — it's read-only over them). Selling **paid** tickets also needs a
25
- Wix premium plan + a configured payment method; **free** events and RSVP events work without.
26
- 2. The site's public headless **`WIX_CLIENT_ID`**, provided in the handoff prompt (the Wix
27
- Business Manager surfaces a copyable prompt with the id filled in — see the router `SKILL.md`). Paste
28
- it into `src/rest/wix-client.js` in place of the placeholder. It is a visitor-facing
29
- credential (it only mints anonymous visitor tokens), **not** a secret, so hardcoding/
30
- committing it is fine.
31
- 3. For paid tickets the buyer completes payment on the **Wix-hosted ticket form** (the redirect
32
- target of `getTicketCheckoutUrl`). The deployed app domain may need to be allow-listed on the
33
- OAuth client for that page to return cleanly — a **separate Wix setup the user completes
34
- later**, out of this skill's scope. If the return fails before that's done, that's expected;
35
- flag it and continue.
36
-
37
- ## The API (copy as-is; do not re-derive it)
38
- This skill ships only the REST layer — no UI components. Build the events UI however the
39
- project wants; wire it to these two snippets. Copy them into the app (e.g. `src/api/`) and only
40
- adjust import paths:
41
- - `src/rest/wix-client.js` — visitor-token mint/refresh + transport. Set `WIX_CLIENT_ID` to the
42
- id from the prompt (replace the `<YOUR-CLIENT-ID>` placeholder). The visitor refresh token is
43
- persisted to localStorage and IS the identity of the visitor's ticket reservation/cart — do
44
- not re-mint anonymously per load.
45
- - `src/rest/wix-events-browse.js` — **Browse & discovery:**
46
- `queryEvents`, `getEventBySlug`, `countUpcomingEvents`, `queryEventCategories`, `listEventsByCategory`
47
- - `src/rest/wix-events-registration.js` — **RSVP & ticketing:**
48
- `createRsvp`, `queryTicketDefinitions`, `reserveTickets`, `getTicketCheckoutUrl`, `checkoutTickets`
49
-
50
- The `Event`, `TicketDefinition`, and `RSVP`/`Order` shapes are documented as JSDoc comments at
51
- the top of each helper file. Read the relevant file(s) before building the UI — they describe
52
- the key fields and link to the full API reference for anything not shown.
53
-
54
- ## How to wire it (UI is the project's choice)
55
- - **Event grid** — `queryEvents()` lists live (UPCOMING/STARTED) events, soonest first. Render
56
- `title`, `mainImage.url`, `dateAndTimeSettings.formatted.dateAndTime`, `location.name`, and
57
- `shortDescription`. Use `offset`/`nextOffset` from the result to page. Link each card by `slug`.
58
- - **Event detail** — `getEventBySlug(slug)`; returns null on miss — show a not-found state, never
59
- invent an event.
60
- - **Description fields:** `event.shortDescription` is a **plain string** (safe teaser). The full
61
- `event.description` is **Ricos rich content** — an object shaped `{ nodes: [...] }`, **not a string**.
62
- Render it with a Ricos viewer (`@wix/ricos`) or walk `nodes` to extract text; **never** call string
63
- methods (`.split`/`.slice`/`.substring`) on it — that crashes the page. When you only need text, use
64
- `shortDescription`.
65
- - Branch the registration UI on `event.registration.type`:
66
- - `"RSVP"` → render the RSVP form (fields from `event.form.controls`).
67
- - `"TICKETING"` → render the ticket picker.
68
- - `"EXTERNAL"` → link out to `event.registration.external.url`.
69
- - `"NONE"` → details only, no registration.
70
- Only `registration.status` values starting `OPEN_` accept new registrations; otherwise show the
71
- closed state.
72
- - **Categories (optional)** — `queryEventCategories()` for a filter menu (`counts.assignedEventsCount`
73
- per category); `listEventsByCategory(categoryId)` to list a category's events (same card fields
74
- and paging as `queryEvents`).
75
- - **RSVP** — `createRsvp(eventId, { firstName, lastName, email, status, additionalGuestNames?, extraFields? })`.
76
- `status` defaults to `"YES"`; only offer `"NO"` when `registration.rsvp.responseType` is
77
- `"YES_AND_NO"`. If the event is full with a waitlist enabled, the returned RSVP comes back with
78
- status `"WAITLIST"` — tell the guest. Completes fully client-side; no redirect.
79
- - **Ticketing** — show tickets, reserve, then complete on the hosted form:
80
- 1. `queryTicketDefinitions(eventId)` → render each ticket's `name`, price (`pricing.fixedPrice.amount`
81
- + `currency` for standard tickets; `free` boolean for free tickets; `pricing.minPrice` for
82
- donation/"pay what you want"; `pricing.pricingOptions.options` for tiered), and filter on
83
- `saleStatus === "SALE_STARTED"`. The endpoint already returns only non-hidden, available tickets.
84
- 2. `reserveTickets([{ ticketDefinitionId, quantity, guestPrice?, pricingOptionId? }])` → holds the
85
- tickets; returns `{ id, expirationDate }`. Show a countdown to `expirationDate` if you like.
86
- 3. `window.location.href = getTicketCheckoutUrl(event, reservation.id)` → the Wix-hosted ticket
87
- form collects guest details + payment and returns the buyer to the event. This is the path for
88
- **all paid tickets**.
89
- - **Free tickets only:** you may instead call `checkoutTickets(eventId, { reservationId, buyer, guests })`
90
- to finish in-app — it returns an order with status `"FREE"`, a `ticketsPdf`, and `tickets[]`. It
91
- throws for paid orders (status `INITIATED`), telling you to use the hosted form.
92
- - **Empty state** — if `countUpcomingEvents()` is 0, show an empty state telling the user to publish
93
- events in their Wix dashboard. Never invent events.
94
-
95
- ## Hard rules (do not violate)
96
- - ✅ Complete paid ticket purchases ONLY via `reserveTickets()` → `getTicketCheckoutUrl()` redirect
97
- (the official Wix-hosted ticket form).
98
- - ❌ Never hand-build registration, ticket, payment, or checkout URLs — derive the hosted form URL
99
- from `event.eventPageUrl` via `getTicketCheckoutUrl`.
100
- - ❌ Never mock events, tickets, or guest counts — render live Wix data or the empty/closed state.
101
- - ❌ Never invent reviews, ratings, attendee names, or "X spots left" numbers not returned by the API.
102
- - ✅ Set `WIX_CLIENT_ID` from the prompt's value (public visitor-facing client id — safe to hardcode).
103
- - ✅ Branch registration UI on `event.registration.type`; respect `registration.status` (only `OPEN_*`
104
- accepts registrations) and ticket `saleStatus`/`salesDetails.soldOut`.
105
- - ✅ Pass `guestPrice` for donation/"pay what you want" tickets and `pricingOptionId` for tiered tickets
106
- to `reserveTickets`.
107
- - The helpers fail loudly on purpose: `reserveTickets` throws when tickets aren't actually held,
108
- `createRsvp` throws on closed/full registration, `checkoutTickets` throws when payment is still owed.
109
- A green path means it really worked — don't swallow these.
110
-
111
- ## Beyond the snippets
112
- The snippets cover the common RSVP + ticketing paths. If you hit a use case they don't cover
113
- (coupons/`discount` at checkout, members/auth, schedule/agenda, seating maps, canceling a
114
- reservation, a field not in the typedefs), make the call yourself with `wixApiRequest` — but look
115
- up the exact endpoint, HTTP method, and request body in the **official Wix Events API reference**
116
- first; never guess:
24
+ | file | what it is |
25
+ |---|---|
26
+ | `hooks/useEventsList.js` | listing logic — categories, active filter, offset "load more", empty count |
27
+ | `hooks/useEventDetail.js` | detail data for a slug — event + derived `type`/`open` registration state |
28
+ | `hooks/useRsvpForm.js` | RSVP submit logic (`YES`/`NO`, additional guests, `WAITLIST` result) |
29
+ | `hooks/useTicketing.js` | ticket selection + reserve → paid redirect / free in-app checkout |
30
+ | `components/EventCard.jsx`, `EventGrid.jsx` | event listing UI (grid + card, with empty state) |
31
+ | `components/CategoryFilter.jsx` | category menu (renders `label` + `assignedEventsCount`) |
32
+ | `components/EventRegistration.jsx` | branches on `registration.type` (RSVP / TICKETING / EXTERNAL / NONE) |
33
+ | `components/RsvpForm.jsx` | RSVP form UI over `useRsvpForm` |
34
+ | `components/TicketPicker.jsx` | ticket list + quantity + checkout UI over `useTicketing` |
35
+ | `components/WixManageBanner.jsx` | preview-only manage banner — drop it into your Layout (STEP 4) |
36
+ | `pages/Events.jsx`, `pages/EventDetail.jsx` | the two shipped routes (`/events`, `/events/:slug`) |
37
+ | `rest/wix-config.js` | **you set the ids here** (STEP 2) |
38
+ | `rest/wix-client.js` | visitor-token mint/refresh + REST transport (reads `wix-config.js`) |
39
+ | `rest/wix-events-browse.js` | browse/discovery helpers (`queryEvents`, `getEventBySlug`, categories, count) |
40
+ | `rest/wix-events-registration.js` | RSVP + ticketing helpers (`createRsvp`, `reserveTickets`, `getTicketCheckoutUrl`, `checkoutTickets`) |
41
+
42
+ They're already in place — go **straight to theming + wiring**, nothing to verify first. **Don't
43
+ `read_file` the shipped page/component/hook source to inspect it** — the table above says what each is
44
+ and every field shape you need is in the snippets below. Read a shipped file's source **only** on a
45
+ real fallback — a runtime error, or a field the snippets don't cover (see "Fallback only" at the
46
+ end). (Files missing? the install's `deploy` result lists what it wrote; re-run install, or copy
47
+ `references/events/app/` → `src/`.)
48
+
49
+ ## STEP 2 — Credentials
50
+ Write `src/rest/wix-config.js` with your `WIX_CLIENT_ID` and `WIX_METASITE_ID` from the prompt — the
51
+ one place both ids live. The visitor refresh token minted from this id is persisted to localStorage
52
+ and **is** the identity of the visitor's ticket reservation — don't re-mint anonymously per load.
53
+
54
+ ## STEP 3 — Theme (nothing to style on the shipped components)
55
+ The shipped components carry **no palette of their own** — they render from base44's design tokens in
56
+ `src/index.css` (`:root`/`.dark`: `--background`, `--foreground`, `--card`, `--primary`, `--muted`,
57
+ `--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`, `text-foreground`,
58
+ `bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`, `font-display`). Those tokens
59
+ are **already set to the brand by the design phase**, so the shipped pages are themed with zero work
60
+ here. To adjust the palette, edit `index.css` (`:root` **and** `.dark`) — the base44 way; **never add
61
+ a parallel theme file (e.g. a `theme.css`) or restyle the shipped JSX.** Build the Home/Header you add
62
+ (STEP 4) from the **same** base44 tokens/classes so it matches automatically. A dark brand is just
63
+ base44's dark palette in `index.css` — no per-component work.
64
+
65
+ ## STEP 4 — Wire routes + provider (surgical `find_replace` on `src/App.jsx`, never a rewrite)
66
+ **No file reads needed to wire this.** Every shipped page and `WixManageBanner` is a default export that takes **no props** — wire them exactly as the snippet shows; nothing in those files needs looking up.
67
+ `App.jsx` carries required platform auth scaffolding (`AuthProvider`/`useAuth`) — edit it in, don't
68
+ replace it. (Events needs no cross-page provider — there's no cart; the RSVP/ticketing state is local
69
+ to the detail page.)
70
+ - Put your **header + footer in a `Layout`** that renders `<Outlet/>` between them, and nest every
71
+ route under one pathless `<Route element={<Layout/>}>`. Your brand chrome then wraps **every** page
72
+ — including the shipped `Events` / `EventDetail` — so you **never edit the shipped pages to add a
73
+ header/footer** (they render inside `<Outlet/>` as-is).
74
+ - **Pin the top chrome as one fixed block.** Put `<WixManageBanner/>` (shipped, preview-only) **above**
75
+ your `<Header/>` inside a single `position:fixed` top region — the header itself is plain in-flow
76
+ markup, the region owns the fixing — so banner + header ride together (no scroll drift/gap). Pad
77
+ the content by the region's **ResizeObserver-measured** height so it clears the chrome and
78
+ self-corrects when the banner is dismissed.
79
+ - Routes under the Layout: `/events` → `Events`, `/events/:slug` → `EventDetail` (both shipped, as-is).
80
+ **You add `/` → your own Home** page.
81
+
82
+ ```jsx
83
+ import { useRef, useState, useEffect } from "react";
84
+ import { Routes, Route, Outlet } from "react-router-dom";
85
+ import WixManageBanner from "@/components/WixManageBanner"; // shipped, preview-only · default export, no props
86
+ import Events from "@/pages/Events"; // shipped · default export, no props
87
+ import EventDetail from "@/pages/EventDetail"; // shipped · default export, no props
88
+ import Home from "@/pages/Home"; // YOU build
89
+ import Header from "@/components/Header"; // YOU build — plain in-flow markup, NOT position:fixed
90
+ import Footer from "@/components/Footer"; // YOU build
91
+
92
+ function Layout() {
93
+ const topRef = useRef(null);
94
+ const [offset, setOffset] = useState(0);
95
+ useEffect(() => { // measure the fixed region → pad content below it
96
+ const ro = new ResizeObserver(() => setOffset(topRef.current?.offsetHeight ?? 0));
97
+ if (topRef.current) ro.observe(topRef.current);
98
+ return () => ro.disconnect();
99
+ }, []);
100
+ return (<>
101
+ <div ref={topRef} style={{ position: "fixed", top: 0, left: 0, right: 0, zIndex: 50 }}>
102
+ <WixManageBanner /> {/* null on the published site / when dismissed */}
103
+ <Header /> {/* your brand header, in-flow inside this fixed block */}
104
+ </div>
105
+ <div style={{ paddingTop: offset }}> {/* clears the chrome; shrinks when the banner is dismissed */}
106
+ <Outlet /> {/* shipped Events/EventDetail render here, untouched */}
107
+ <Footer />
108
+ </div>
109
+ </>);
110
+ }
111
+
112
+ <Routes>
113
+ <Route element={<Layout />}> {/* chrome wraps all */}
114
+ <Route path="/" element={<Home />} /> {/* yours */}
115
+ <Route path="/events" element={<Events />} /> {/* shipped, as-is */}
116
+ <Route path="/events/:slug" element={<EventDetail />} /> {/* shipped, as-is */}
117
+ </Route>
118
+ </Routes>
119
+ ```
120
+
121
+ ## What you build (not shipped)
122
+ The **home / landing page**, the **`Header`** and a **`Footer`** — the two you drop into the `Layout`
123
+ (STEP 4) so they wrap every route — plus the overall brand story, styled with the same base44
124
+ tokens/classes. **Compose the shipped pieces** — a "featured events" strip is just `queryEvents` + the
125
+ shipped `EventGrid`; the nav is a link to `/events`:
126
+
127
+ ```jsx
128
+ import { useState, useEffect } from "react";
129
+ import { Link } from "react-router-dom";
130
+ import { queryEvents } from "@/rest/wix-events-browse";
131
+ import EventGrid from "@/components/EventGrid";
132
+
133
+ // Responsive header: choose ONE branch with a state flag (copy this pattern). Do NOT render a
134
+ // desktop nav AND a mobile nav toggled by Tailwind `hidden md:*` — these navs are inline-styled and
135
+ // an inline `display` beats a Tailwind class, so `hidden` never applies and BOTH branches render.
136
+ export function Header() {
137
+ const [mobile, setMobile] = useState(() => window.innerWidth < 768);
138
+ useEffect(() => {
139
+ const onResize = () => setMobile(window.innerWidth < 768);
140
+ window.addEventListener("resize", onResize); // keep it reactive to viewport changes
141
+ return () => window.removeEventListener("resize", onResize);
142
+ }, []);
143
+ return (
144
+ <nav style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
145
+ {/* brand/logo */}
146
+ {mobile ? <YourMenu /> : <Link to="/events">Events</Link>}
147
+ </nav>
148
+ );
149
+ }
150
+
151
+ export function Featured() { // on your home page
152
+ const [events, setEvents] = useState([]);
153
+ // NB: queryEvents returns { events, total, offset, nextOffset } — destructure the array.
154
+ useEffect(() => { queryEvents({ limit: 6 }).then(({ events }) => setEvents(events)); }, []);
155
+ return <EventGrid events={events} empty="Events coming soon." />;
156
+ }
157
+ ```
158
+ Everything reads base44's design tokens (`index.css`), so your home/nav match the shipped pages automatically.
159
+
160
+ **Editing a component and the change doesn't show? It's the preview, not your code.** The dev preview
161
+ can serve a stale module after a write. Before diagnosing a visual bug you just "fixed", do a fresh
162
+ full navigate/reload of the preview and re-check — don't keep rewriting correct code against a stale
163
+ render.
164
+
165
+ ## Using the client from your own UI
166
+
167
+ ```jsx
168
+ // Every browse list helper returns an OBJECT { events, total, offset, nextOffset } — not a bare
169
+ // array. Destructure `events`; nextOffset is null when there are no more pages.
170
+ import { queryEvents, getEventBySlug, queryEventCategories, listEventsByCategory, countUpcomingEvents } from "@/rest/wix-events-browse";
171
+
172
+ const { events, nextOffset } = await queryEvents({ limit: 24 }); // live UPCOMING/STARTED, soonest first
173
+ const { categories } = await queryEventCategories(); // render category.label (NOT name)
174
+ const { events: inCat } = await listEventsByCategory(categories[0].id); // same shape + paging as queryEvents
175
+ const total = await countUpcomingEvents(); // 0 → shipped empty state
176
+
177
+ // Detail by slug — returns null on miss (the shipped EventDetail shows a not-found state):
178
+ const event = await getEventBySlug(slug);
179
+
180
+ // Image urls live at event.mainImage.url. shortDescription is a PLAIN string (safe to render).
181
+ // event.description is Ricos rich content { nodes: [...] } — NOT a string; render with @wix/ricos or
182
+ // walk nodes; NEVER call string methods (.slice/.split) on it — that crashes the page.
183
+ ```
184
+
185
+ The registration flows are already wired in the shipped `EventRegistration` (branches on
186
+ `registration.type`, respects `registration.status` — only `OPEN_*` accepts registrations), so your
187
+ pages just render `<EventRegistration .../>` as the shipped `EventDetail` does. Doing a flow yourself:
188
+
189
+ ```jsx
190
+ import { createRsvp, reserveTickets, getTicketCheckoutUrl, checkoutTickets } from "@/rest/wix-events-registration";
191
+
192
+ // RSVP (client-side): status "NO" only when registration.rsvp.responseType === "YES_AND_NO".
193
+ const rsvp = await createRsvp(event.id, { firstName, lastName, email }); // rsvp.status may be "WAITLIST"
194
+
195
+ // PAID tickets: reserve, then redirect to the Wix-hosted ticket form — NEVER a hand-built URL.
196
+ const reservation = await reserveTickets([{ ticketDefinitionId, quantity: 1 }]);
197
+ window.location.href = getTicketCheckoutUrl(event, reservation.id);
198
+
199
+ // FREE tickets only: finish in-app instead of redirecting (throws if payment is owed).
200
+ const order = await checkoutTickets(event.id, { reservationId: reservation.id, buyer, guests: [buyer] });
201
+ ```
202
+
203
+ ## Extending the client
204
+ Building something beyond the shipped pages (a "my registrations" account view, coupons, seating
205
+ maps, a schedule/agenda, canceling a reservation)? The helpers cover the common RSVP + ticketing
206
+ paths; for a gap, make the call with `wixApiRequest` — but look up the exact endpoint/body in the
207
+ official Wix Events API reference first, never guess:
117
208
  - Events API reference: https://dev.wix.com/docs/api-reference/business-solutions/events.md
118
- - Registration (RSVP + ticketing) overview: https://dev.wix.com/docs/api-reference/business-solutions/events/registration/introduction.md
119
- - Member login + a "my registrations" account view → the **members** vertical (`references/members/INSTRUCTIONS.md`).
120
- - Ticketing flow (reservations → orders → tickets): https://dev.wix.com/docs/api-reference/business-solutions/events/registration/ticketing/introduction.md
209
+ - Registration (RSVP + ticketing): https://dev.wix.com/docs/api-reference/business-solutions/events/registration/introduction.md
210
+ - Member login + "my registrations" → the **members** vertical (`references/members/INSTRUCTIONS.md`).
211
+
212
+ Fallback only — when you hit an error or need something not shown here: read the relevant shipped file
213
+ under `src/`, or look it up via the **`wix-docs`** skill.
121
214
 
122
- Keep the snippets as the default for everything they already do; reach for the API reference only
123
- for the gap.
215
+ ## Hard rules
216
+ - Set `WIX_CLIENT_ID` (STEP 2) — not the placeholder.
217
+ - Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
218
+ - Header/footer live in a `Layout` around `<Outlet/>` (STEP 4) — never edit the shipped `Events`/`EventDetail` to add chrome.
219
+ - The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your `Header` is plain in-flow markup (not `position:fixed`).
220
+ - Paid ticket checkout goes through the shipped reserve → `getTicketCheckoutUrl` redirect (the Wix-hosted ticket form) — never a hand-built registration/ticket/payment URL.
221
+ - Render live Wix data or the shipped empty/closed/not-found state — never mock events, tickets, guest counts, or "X spots left".
124
222
 
125
223
  ## Point the user to their dashboard
126
- In some cases, users need to access the Wix dashboard in order to edit the events content for their site. To facilitate this, provide the user with deep links directly to the relevant dashboard pages. For events data those pages are:
224
+ Provide deep links so the owner can edit content (substitute the site's `metaSiteId`):
127
225
  - **Events** — `https://manage.wix.com/dashboard/{metaSiteId}/events` (`Dashboard → Events` → **+ Add Event**; create the event, then set it up as **Ticketed** or **RSVP**; only published events appear in the app)
128
226
 
129
- Substitute the site's `metaSiteId` to complete the links (you have it from the handoff / `ListWixSites`). Include the in-dashboard navigation as a fallback.
130
-
131
- ## Verification checklist (before declaring done)
132
- - [ ] `WIX_CLIENT_ID` set to the prompt's value (not the `<YOUR-CLIENT-ID>` placeholder)
133
- - [ ] Visitor token persists across reload (same visitor identity for reservations)
134
- - [ ] Event grid renders live events; clicking a card opens the detail page by `slug`
135
- - [ ] Detail page branches correctly on `registration.type` (RSVP form vs. ticket picker vs. external link)
136
- - [ ] RSVP submit creates a real RSVP (and surfaces a `WAITLIST` result when the event is full)
137
- - [ ] Ticket purchase reserves tickets, then redirects via `getTicketCheckoutUrl` (no hand-built URL)
138
- - [ ] Paid checkout lands on the Wix-hosted ticket form; buyer returns to the event afterward
139
- - [ ] Closed registration / sold-out tickets show a clear state rather than a dead end
140
- - [ ] Empty state shown when `countUpcomingEvents()` is 0
141
- - [ ] No mock events, tickets, or attendee data anywhere
142
- - [ ] Told the user at least once that they can continue setting up their events in the dashboard and provided deep links.
227
+ ## Seeding
228
+ Seed events per `seed/SEED.md` (the build-time setup module) — separate from this client build; run in
229
+ parallel.
230
+
231
+ ## Verify (before declaring done)
232
+ - [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
233
+ - [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
234
+ - [ ] Opened the vertical's data route(s) (not just the home page) and confirmed the shipped components render themed (surface, text, brand) with images.
235
+ - [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all routes; shipped `Events`/`EventDetail` untouched; content clears the fixed chrome.
236
+ - [ ] Event grid renders live events; clicking a card opens the detail page by `slug`; visitor token persists across reload.
237
+ - [ ] Detail page branches correctly on `registration.type` (RSVP form vs. ticket picker vs. external link vs. none); closed registration / sold-out tickets show a clear state.
238
+ - [ ] RSVP submit creates a real RSVP (and surfaces a `WAITLIST` result when full); paid ticket purchase reserves then redirects via `getTicketCheckoutUrl`.
239
+ - [ ] Empty catalog shows the shipped empty state (`countUpcomingEvents()` is 0); no mock events anywhere.
@@ -0,0 +1,23 @@
1
+ // Category filter menu for the events listing. Pure UI — the active id + setter come from
2
+ // useEventsList. Display field is `name`; key/filter by `category.id`; the per-category
3
+ // count is `counts.assignedEventsCount`. Styled with base44 design tokens (shadcn Tailwind classes).
4
+
5
+ const chipBase = "py-1.5 px-3.5 cursor-pointer text-sm font-body border rounded-full";
6
+ const chipIdle = "border-border bg-card text-foreground";
7
+ const chipActive = "bg-primary text-primary-foreground border-primary";
8
+
9
+ export default function CategoryFilter({ categories, active, onSelect }) {
10
+ if (!categories?.length) return null;
11
+ return (
12
+ <nav className="flex flex-wrap gap-2 mb-4">
13
+ <button onClick={() => onSelect(null)} aria-pressed={active === null}
14
+ className={`${chipBase} ${active === null ? chipActive : chipIdle}`}>All</button>
15
+ {categories.map((c) => (
16
+ <button key={c.id} onClick={() => onSelect(c.id)} aria-pressed={active === c.id}
17
+ className={`${chipBase} ${active === c.id ? chipActive : chipIdle}`}>
18
+ {c.name} ({c.counts?.assignedEventsCount ?? 0})
19
+ </button>
20
+ ))}
21
+ </nav>
22
+ );
23
+ }