@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
@@ -1,111 +1,240 @@
1
+ # Wix Portfolio — ready-made client
1
2
 
2
- # Wix Portfolio Skill
3
+ The portfolio client is **shipped as real files**, not snippets to regenerate. It's a complete
4
+ collections gallery + collection page + project detail (media gallery + `details[]` rows), styled
5
+ with your app's design tokens (base44's `src/index.css` — the shadcn palette the design phase already
6
+ set). The install step copied it into `src/`; you wire the routes — you generate almost none of the
7
+ read/render code (return-object destructuring, `item.type` media branching, the `details[]` link
8
+ shape all ship and are correct).
3
9
 
4
- > **Source files (in this skill):** the shared transport `references/shared/wix-client.js` and this vertical's `references/portfolio/wix-portfolio.js`. Copy **both** into your app's `src/rest/` side by side — the helper does `import { wixApiRequest } from "./wix-client.js"`, so they must land in the same folder.
10
+ Talks to Wix directly over the public `WIX_CLIENT_ID` (anonymous visitor tokens). Portfolio is
11
+ **read-only**: never mock projects, never invent media — render live Wix data or the shipped empty
12
+ state. The content tree is **Collection → Project → Project Item (image/video)**.
5
13
 
6
- Builds a real, client-only Wix portfolio showcase. The browser talks to Wix directly over a
7
- public `WIX_CLIENT_ID`. Portfolio is **read-only**: never mock projects, never invent media,
8
- and always render live Wix data (or an honest empty state). The content tree is
9
- **Collection → Project → Project Item (image/video)**.
14
+ ## Prerequisites
15
+ - The site's **Wix Portfolio** is the read target. It's installed and seeded separately (see
16
+ **Seeding** below), in parallel with this build — so it may be empty at build time; the client
17
+ renders the shipped empty state until collections and projects land.
18
+ - The public headless **`WIX_CLIENT_ID`** from your prompt (visitor-facing, safe to hardcode/commit).
19
+ - If the read calls return `403`/`428` before content is published, the Portfolio app or its content
20
+ may not be live yet — a **Wix dashboard step the owner completes**, out of scope here. Flag it and
21
+ continue; don't fall back to mock data.
10
22
 
11
- ## When to use
12
- - User wants a Wix portfolio / showcase site or asks to "connect Wix Portfolio".
13
- - Replacing placeholder/mock galleries with live Wix Portfolio data.
14
- - Adding a collections gallery, project grids, or a project detail page (media gallery +
15
- details/links) over an existing Wix Portfolio.
23
+ ## STEP 1 — The client is already in `src/`
24
+ The install step (base44.md STEP 1) deployed the whole portfolio UI client + REST scaffolds into
25
+ `src/` (imports use the `@/` alias → `src/`). Here's every file and what it is — **this is your map,
26
+ so you don't need to open them:**
16
27
 
17
- ## Prerequisites
18
- 1. A Wix site with **Wix Portfolio installed and content already added** — at least one
19
- collection with projects, and projects with items (this skill does NOT provision; it is
20
- read-only over the content).
21
- 2. The site's public headless **`WIX_CLIENT_ID`**, provided in the handoff prompt (the Wix
22
- Business Manager surfaces a copyable prompt with the id filled in — see the router `SKILL.md`).
23
- Paste it into `src/rest/wix-client.js` in place of the placeholder. It is a visitor-facing
24
- credential (it only mints anonymous visitor tokens), **not** a secret, so
25
- hardcoding/committing it is fine.
26
- 3. If the read calls return `403`/`428` before content is published, the Portfolio app or its
27
- content may not be live yet. That is a **Wix dashboard setup step the owner completes** —
28
- out of this skill's scope. Flag it and continue; don't fall back to mock data.
29
-
30
- ## The API (copy as-is; do not re-derive it)
31
- This skill ships only the REST layer — no UI components. Build the portfolio's UI however the
32
- project wants; wire it to these two snippets. Copy them into the app (e.g. `src/api/`) and only
33
- adjust import paths:
34
- - `src/rest/wix-client.js` — visitor-token mint/refresh + transport. Set `WIX_CLIENT_ID` to the
35
- id from the prompt (replace the `<YOUR-CLIENT-ID>` placeholder). The visitor refresh token is
36
- persisted to localStorage; do not re-mint anonymously per load.
37
- - `src/rest/wix-portfolio.js` — exports:
38
- - **Collections:** `queryCollections`, `getCollectionBySlug`, `countCollections`
39
- - **Projects:** `queryProjects`, `queryProjectsByCollection`, `getProjectBySlug`, `getProject`
40
- - **Project items (media):** `listProjectItems`
41
-
42
- The Collection, Project, and Project Item shapes are documented as JSDoc comments at the top of
43
- `wix-portfolio.js`. Read them before building the UI — they describe the key fields (cover
44
- image/video, media resolutions, details rows) and link to the full API reference.
45
-
46
- ## How to wire it (UI is the project's choice)
47
- - **Collections gallery (home)** — `queryCollections()` for the listing (visible collections
48
- only, in dashboard order); pass `nextCursor` back as `cursor` to load the next page. Render
49
- `collection.title`, `collection.description`, and `collection.coverImage.imageInfo.url`. Link
50
- each card to a collection page keyed on `collection.slug`.
51
- - **Collection page** — `getCollectionBySlug(slug)` for the header (returns null on miss — show
52
- a not-found state, never invent one). Then `queryProjectsByCollection(collection.id, { limit?, cursor? })`
53
- for its project grid; paginate exactly like `queryCollections`.
54
- - **All-work gallery (optional)** — `queryProjects()` to list every visible project across
55
- collections (newest-first); paginate the same way.
56
- - **Project grid card** — render `project.title` and the cover: use `project.coverImage.imageInfo.url`
57
- when present, else the `project.coverVideo.videoInfo.posters[0]` / first
58
- `coverVideo.videoInfo.resolutions[]` entry. Link each card to a project page keyed on `project.slug`.
59
- - **Project detail page** — `getProjectBySlug(slug)` for the header (title, description, and the
60
- `details[]` rows: each has a `label` plus either `text` or `link: { text, url, target }`).
61
- Then `listProjectItems(project.id)` for the media gallery — render IMAGE items from
62
- `image.imageInfo.url` and VIDEO items from the first `video.videoInfo.resolutions[]` entry
63
- (with `video.videoInfo.posters[0]` as the poster). Honor each item's optional `link`.
64
- - If you already hold a project id (not a slug), use `getProject(projectId)` instead.
65
- - **Empty state** — if `countCollections()` is 0, show an empty state telling the user to add
66
- collections and projects in their Wix dashboard. Never invent projects or media.
67
-
68
- ## Hard rules (do not violate)
69
- - ✅ Render only live Wix Portfolio data — collections, projects, and items as returned.
70
- - ❌ Never mock projects, collections, or media — render live data or the empty state.
71
- - ❌ Never hand-build Wix Media URLs or page permalinks — use the `url`/`imageInfo.url`/
72
- `videoInfo.resolutions[].url` fields Wix returns.
73
- - ❌ Never invent project details, captions, dates, or testimonials. Show only what the API returns.
74
- - ❌ Never show `hidden: true` collections or projects to visitors (the helpers already filter
75
- `hidden` out — don't add them back).
76
- - ✅ Set `WIX_CLIENT_ID` from the prompt's value (public client id — safe to hardcode).
77
- - ✅ Route on `slug` (`getCollectionBySlug` / `getProjectBySlug`); fall back to `getProject(id)`
78
- only when you hold a GUID.
79
- - The helpers fail soft on read: single fetches return `null` on a miss so you render a
80
- not-found/empty state rather than a crash — surface that state, don't paper over it with fake data.
81
-
82
- ## Beyond the snippets
83
- The snippets cover the common portfolio paths. If you hit a use case they don't cover (e.g.
84
- collection SEO tags, project watermark settings, portfolio-wide settings, or filtering by a
85
- field not shown), make the call yourself with `wixApiRequest` — but look up the exact endpoint,
86
- HTTP method, and request body in the **official Wix API reference** first; never guess:
87
- - Wix Portfolio API reference: https://dev.wix.com/docs/api-reference/business-solutions/portfolio.md
88
- - Portfolio Settings (logo, layout, options): https://dev.wix.com/docs/api-reference/business-solutions/portfolio/portfolio-settings/get-portfolio-settings.md
89
- - API query language (filters, sort, paging): https://dev.wix.com/docs/rest/articles/getting-started/api-query-language.md
90
-
91
- Keep the snippets as the default for everything they already do; reach for the API reference
92
- only for the gap.
28
+ | file | what it is |
29
+ |---|---|
30
+ | `hooks/usePortfolioGallery.js` | collections gallery data — first page + count + cursor paging |
31
+ | `hooks/useCollectionProjects.js` | one collection's header + its projects (paged), by slug |
32
+ | `hooks/useProjectDetail.js` | project + its media gallery, by slug (null → not-found) |
33
+ | `components/CollectionCard.jsx`, `CollectionGrid.jsx` | collections listing UI (grid + card, with empty state) |
34
+ | `components/ProjectCard.jsx`, `ProjectGrid.jsx` | projects listing UI (grid + card, with empty state) |
35
+ | `components/ProjectMedia.jsx` | one gallery item — branches on `item.type` (IMAGE / VIDEO) |
36
+ | `components/WixManageBanner.jsx` | preview-only manage banner — drop it into your Layout (STEP 4) |
37
+ | `pages/Portfolio.jsx` | collections gallery route (`/portfolio`) |
38
+ | `pages/CollectionPage.jsx` | collection page route (`/collection/:slug`) |
39
+ | `pages/ProjectDetail.jsx` | project detail route (`/project/:slug`) |
40
+ | `rest/wix-config.js` | **you set the ids here** (STEP 2) |
41
+ | `rest/wix-client.js` + `rest/wix-portfolio.js` | REST transport + portfolio read helpers |
42
+
43
+ They're already in place — go **straight to theming + wiring**, nothing to verify first. **Don't
44
+ `read_file` the shipped page/component/hook source to inspect it** — the table above says what each
45
+ is and every field shape you need is in the snippets below. Read a shipped file's source **only** on
46
+ a real fallback — a runtime error, or a field the snippets don't cover (see "Fallback only" at the
47
+ end). (Files missing? the install's `deploy` result lists what it wrote; re-run install, or copy
48
+ `references/portfolio/app/` → `src/`.)
49
+
50
+ ## STEP 2 — Credentials
51
+ Write `src/rest/wix-config.js` with your `WIX_CLIENT_ID` and `WIX_METASITE_ID` from the prompt — the
52
+ one place both ids live.
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 (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. Portfolio is read-only with no cross-page state, so there's **no provider to wrap** (no
69
+ cart equivalent) — just the Layout and the routes.
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 `Portfolio` / `CollectionPage` / `ProjectDetail` — so you **never edit the
73
+ shipped pages to add a 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 measured height so it clears the chrome and self-corrects when the
78
+ banner is dismissed.
79
+ - Routes under the Layout: `/portfolio` → `Portfolio`, `/collection/:slug` → `CollectionPage`,
80
+ `/project/:slug` → `ProjectDetail` (all shipped, as-is). **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 Portfolio from "@/pages/Portfolio"; // shipped · default export, no props
87
+ import CollectionPage from "@/pages/CollectionPage"; // shipped · default export, no props
88
+ import ProjectDetail from "@/pages/ProjectDetail"; // shipped · default export, no props
89
+ import Home from "@/pages/Home"; // YOU build
90
+ import Header from "@/components/Header"; // YOU build — plain in-flow markup, NOT position:fixed
91
+ import Footer from "@/components/Footer"; // YOU build
92
+
93
+ function Layout() {
94
+ const topRef = useRef(null);
95
+ const [offset, setOffset] = useState(0);
96
+ useEffect(() => { // measure the fixed region → pad content below it
97
+ const ro = new ResizeObserver(() => setOffset(topRef.current?.offsetHeight ?? 0));
98
+ if (topRef.current) ro.observe(topRef.current);
99
+ return () => ro.disconnect();
100
+ }, []);
101
+ return (<>
102
+ <div ref={topRef} style={{ position: "fixed", top: 0, left: 0, right: 0, zIndex: 50 }}>
103
+ <WixManageBanner /> {/* null on the published site / when dismissed */}
104
+ <Header /> {/* your brand header, in-flow inside this fixed block */}
105
+ </div>
106
+ <div style={{ paddingTop: offset }}> {/* clears the chrome; shrinks when the banner is dismissed */}
107
+ <Outlet /> {/* shipped pages render here, untouched */}
108
+ <Footer />
109
+ </div>
110
+ </>);
111
+ }
112
+
113
+ <Routes>
114
+ <Route element={<Layout />}> {/* chrome wraps all */}
115
+ <Route path="/" element={<Home />} /> {/* yours */}
116
+ <Route path="/portfolio" element={<Portfolio />} /> {/* shipped, as-is */}
117
+ <Route path="/collection/:slug" element={<CollectionPage />} />{/* shipped, as-is */}
118
+ <Route path="/project/:slug" element={<ProjectDetail />} /> {/* shipped, as-is */}
119
+ </Route>
120
+ </Routes>
121
+ ```
122
+
123
+ ## What you build (not shipped)
124
+ The **home / landing page**, the **`Header`** and a **`Footer`** — the two you drop into the `Layout`
125
+ (STEP 4) so they wrap every route — plus the overall brand story, styled with the same base44
126
+ tokens/classes. **Compose the shipped pieces** — a featured strip is just `queryCollections` (or
127
+ `queryProjects`) + the shipped `CollectionGrid` / `ProjectGrid`; the nav is a link to `/portfolio`:
128
+
129
+ ```jsx
130
+ import { useState, useEffect } from "react";
131
+ import { Link } from "react-router-dom";
132
+ import { queryCollections } from "@/rest/wix-portfolio";
133
+ import CollectionGrid from "@/components/CollectionGrid";
134
+
135
+ // Responsive header: choose ONE branch with a state flag — do NOT render a desktop nav AND a mobile
136
+ // nav toggled by `hidden md:flex` / `md:hidden`. These navs are inline-styled, and an inline
137
+ // `display` beats a Tailwind class, so `hidden` never applies — BOTH branches render. One branch.
138
+ export function Header() {
139
+ const [mobile, setMobile] = useState(() => window.innerWidth < 768);
140
+ useEffect(() => {
141
+ const onResize = () => setMobile(window.innerWidth < 768);
142
+ window.addEventListener("resize", onResize); // keep it reactive to viewport changes
143
+ return () => window.removeEventListener("resize", onResize);
144
+ }, []);
145
+ return (
146
+ <nav style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
147
+ {/* brand/logo */}
148
+ {mobile
149
+ ? <YourMenu /> // your hamburger + a link to /portfolio
150
+ : <div style={{ display: "flex", gap: 24 }}><Link to="/portfolio">Work</Link></div>}
151
+ </nav>
152
+ );
153
+ }
154
+ export function Featured() { // on your home page
155
+ const [collections, setCollections] = useState([]);
156
+ // NB: queryCollections returns { collections, nextCursor } — destructure the array.
157
+ useEffect(() => { queryCollections({ limit: 6 }).then(({ collections }) => setCollections(collections)); }, []);
158
+ return <CollectionGrid collections={collections} empty="Collections coming soon." />;
159
+ }
160
+ ```
161
+ Everything reads base44's design tokens (`index.css`), so your home/nav match the shipped pages automatically.
162
+
163
+ **Editing a component and the change doesn't show? It's the preview, not your code.** The dev preview
164
+ can serve a stale module after a write. Before diagnosing a visual bug you just "fixed", do a fresh
165
+ full navigate/reload of the preview and re-check — don't keep rewriting correct code against a stale
166
+ render.
167
+
168
+ ## Using the client from your own UI (hand-built lists, images)
169
+
170
+ **Every list helper returns an OBJECT, not a bare array** — destructure the named key first, or
171
+ `.map`/`.filter` on the result throws `… is not a function` (the #1 portfolio-listing bug):
172
+
173
+ ```jsx
174
+ // listings — destructure the named array + the cursor:
175
+ const { collections, nextCursor } = await queryCollections({ limit: 24 }); // visible, dashboard order
176
+ const { projects } = await queryProjects({ limit: 24 }); // all work, newest-first
177
+ const { projects: inCollection } = await queryProjectsByCollection(collectionId, { limit: 24 });
178
+ const { items, total } = await listProjectItems(projectId); // gallery — iterate `items`
179
+
180
+ // single fetches return the object or null (render a not-found/empty state, never invent one):
181
+ const collection = await getCollectionBySlug(slug);
182
+ const project = await getProjectBySlug(slug); // or getProject(id) when you hold a GUID
183
+ const n = await countCollections(); // number → 0 means the empty state
184
+
185
+ // media item branches on item.type ("IMAGE" | "VIDEO" | "UNDEFINED") — the shipped ProjectMedia
186
+ // already does this: IMAGE → item.image.imageInfo.url; VIDEO → item.video.videoInfo.resolutions[0].url
187
+ // (poster item.video.videoInfo.posters[0]). details[] rows: { label, text? } OR { label, link: { text, url, target } }.
188
+
189
+ // An image you render yourself (hero / custom card): make the url https + keep a token bg so a
190
+ // just-generated url that 404s for a second reads as a surface, not a blank block.
191
+ function BrandImage({ url, alt }) {
192
+ const src = url?.startsWith("//") ? `https:${url}` : url; // the shipped cards already do this
193
+ return <div className="bg-card"><img src={src} alt={alt} /></div>;
194
+ }
195
+ ```
196
+
197
+ Cover images live at `collection.coverImage.imageInfo.url` and `project.coverImage.imageInfo.url`
198
+ (projects are a one-of: fall back to `coverVideo.videoInfo.posters[0].url` / `resolutions[0].url`).
199
+
200
+ Fallback only — when you hit an error or need something not shown here (collection SEO, portfolio
201
+ settings, a field these snippets don't have): read the relevant shipped file under `src/`, or look
202
+ it up via the **`wix-docs`** skill / the Portfolio API reference. Each helper in `wix-portfolio.js`
203
+ links its own reference page inline; the whole area is here:
204
+ - Portfolio (collections, projects, project items): https://dev.wix.com/docs/api-reference/business-solutions/portfolio.md
205
+
206
+ ## Hard rules
207
+ - Set `WIX_CLIENT_ID` (STEP 2) — not the placeholder.
208
+ - Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
209
+ - Header/footer live in a `Layout` around `<Outlet/>` (STEP 4) — never edit the shipped
210
+ `Portfolio`/`CollectionPage`/`ProjectDetail` to add chrome.
211
+ - The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your
212
+ `Header` is plain in-flow markup (not `position:fixed`).
213
+ - Route on `slug` (`getCollectionBySlug`/`getProjectBySlug`); use `getProject(id)` only when you hold a GUID.
214
+ - Render live Wix data or the shipped empty state — never mock projects, collections, or media, and
215
+ never hand-build Wix Media URLs or page permalinks (use the `url`/`imageInfo.url`/`resolutions[].url`
216
+ fields Wix returns). Hidden collections/projects are already filtered out — don't add them back.
93
217
 
94
218
  ## Point the user to their dashboard
95
- In some cases, users need to access the Wix dashboard in order to edit the portfolio content for their site. To facilitate this, provide the user with deep links directly to the relevant dashboard pages. For portfolio data those pages are:
96
- - **Portfolio** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-portfolio/projects` (`Dashboard → Portfolio`). Projects and Collections are tabs on this one page: the **Projects** tab adds projects and their media galleries; the **Collections** tab groups projects into collections.
97
-
98
- Substitute the site's `metaSiteId` to complete the links (you have it from the handoff / `ListWixSites`). Include the in-dashboard navigation as a fallback.
99
-
100
- ## Verification checklist (before declaring done)
101
- - [ ] `WIX_CLIENT_ID` set to the prompt's value (not the `<YOUR-CLIENT-ID>` placeholder)
102
- - [ ] Visitor token persists across reload (no re-mint storm; reads stay fast)
103
- - [ ] Collections gallery renders live collections with cover images, in dashboard order
104
- - [ ] Clicking a collection lists its projects via `queryProjectsByCollection`
105
- - [ ] Project page renders the project's media gallery from `listProjectItems` (images AND videos)
106
- - [ ] Project `details[]` rows render (text rows and link rows both)
107
- - [ ] Slug routing works; an unknown slug shows a not-found state (no invented project)
108
- - [ ] Hidden collections/projects never appear
109
- - [ ] Empty state shown when `countCollections()` is 0
110
- - [ ] No mock projects, collections, or media anywhere
111
- - [ ] Told the user at least once that they can continue setting up their portfolio in the dashboard and provided deep links.
219
+ Provide the deep link so the owner can edit content (substitute the site's `metaSiteId`):
220
+ - **Portfolio** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-portfolio/projects`
221
+ (`Dashboard → Portfolio`). Projects and Collections are tabs on this one page: the **Projects** tab
222
+ adds projects and their media galleries; the **Collections** tab groups projects into collections.
223
+
224
+ ## Seeding
225
+ Seed collections and projects per `seed/SEED.md` — separate from this client build; run in parallel.
226
+
227
+ ## Verify (before declaring done)
228
+ - [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
229
+ - [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
230
+ - [ ] Opened the vertical's data route(s) (`/portfolio`, a collection, a project) — not just the home page — and confirmed the shipped components render themed (surface, text, brand) with images.
231
+ - [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all
232
+ routes; shipped `Portfolio`/`CollectionPage`/`ProjectDetail` untouched; content clears the fixed chrome.
233
+ - [ ] Visitor token persists across reload (no re-mint storm; reads stay fast).
234
+ - [ ] Collections gallery renders live collections with cover images, in dashboard order.
235
+ - [ ] Clicking a collection lists its projects via `queryProjectsByCollection`.
236
+ - [ ] Project page renders the media gallery from `listProjectItems` (images AND videos) and the
237
+ `details[]` rows (text rows and link rows both).
238
+ - [ ] Slug routing works; an unknown slug shows the shipped not-found state (no invented content).
239
+ - [ ] Empty catalog shows the shipped empty state (`countCollections()` is 0); no mock content anywhere.
240
+ - [ ] Told the user they can continue setting up their portfolio in the dashboard, with the deep link.
@@ -0,0 +1,31 @@
1
+ // Collection tile → links to /collection/:slug. Styled with base44 design tokens (shadcn Tailwind
2
+ // classes) — re-skin via the app's design tokens (src/index.css :root/.dark), not this JSX. The
3
+ // `//`-protocol image fix and the coverImage.imageInfo.url field path are load-bearing.
4
+ import { Link } from "react-router-dom";
5
+
6
+ function coverUrl(collection) {
7
+ const url = collection?.coverImage?.imageInfo?.url;
8
+ return url ? (url.startsWith("//") ? `https:${url}` : url) : null;
9
+ }
10
+
11
+ export default function CollectionCard({ collection }) {
12
+ const image = coverUrl(collection);
13
+
14
+ return (
15
+ <Link to={`/collection/${collection.slug}`}
16
+ className="flex flex-col no-underline text-foreground bg-card border border-border rounded-lg overflow-hidden shadow-sm">
17
+ <div className="aspect-[4/3] bg-background">
18
+ {image
19
+ ? <img src={image} alt={collection.title} loading="lazy"
20
+ className="w-full h-full object-cover" />
21
+ : <div className="w-full h-full bg-muted flex items-center justify-center" aria-hidden="true"><svg viewBox="0 0 24 24" className="w-8 h-8 text-muted-foreground/40" fill="none" stroke="currentColor" strokeWidth="1.5"><rect x="3" y="3" width="18" height="18" rx="2" /><circle cx="8.5" cy="8.5" r="1.5" /><path d="m21 15-5-5L5 21" /></svg></div>}
22
+ </div>
23
+ <div className="p-3 flex flex-col gap-1">
24
+ <h3 className="m-0 font-display text-base font-semibold">{collection.title}</h3>
25
+ {collection.description && (
26
+ <p className="m-0 text-muted-foreground text-sm leading-normal">{collection.description}</p>
27
+ )}
28
+ </div>
29
+ </Link>
30
+ );
31
+ }
@@ -0,0 +1,15 @@
1
+ // Responsive collections grid + empty state. Styled with base44 design tokens (shadcn Tailwind classes).
2
+ import CollectionCard from "./CollectionCard";
3
+
4
+ export default function CollectionGrid({ collections, empty = "No collections yet." }) {
5
+ if (!collections?.length) {
6
+ return (
7
+ <p className="text-muted-foreground p-4 text-center">{empty}</p>
8
+ );
9
+ }
10
+ return (
11
+ <div className="grid gap-4 [grid-template-columns:repeat(auto-fill,minmax(280px,1fr))]">
12
+ {collections.map((c) => <CollectionCard key={c.id} collection={c} />)}
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,39 @@
1
+ // Project tile → links to /project/:slug. Styled with base44 design tokens (shadcn Tailwind classes)
2
+ // — re-skin via the app's design tokens (src/index.css :root/.dark), not this JSX. The cover is a
3
+ // one-of: image when present, else the video's poster / first resolution. The `//`-protocol fix and
4
+ // these field paths are load-bearing.
5
+ import { Link } from "react-router-dom";
6
+
7
+ function https(url) {
8
+ return url ? (url.startsWith("//") ? `https:${url}` : url) : null;
9
+ }
10
+
11
+ // coverImage.imageInfo is ONE-OF with coverVideo.videoInfo — fall back through the video.
12
+ function coverUrl(project) {
13
+ const image = project?.coverImage?.imageInfo?.url;
14
+ if (image) return https(image);
15
+ const vi = project?.coverVideo?.videoInfo;
16
+ return https(vi?.posters?.[0]?.url || vi?.resolutions?.[0]?.url || null);
17
+ }
18
+
19
+ export default function ProjectCard({ project }) {
20
+ const image = coverUrl(project);
21
+
22
+ return (
23
+ <Link to={`/project/${project.slug}`}
24
+ className="flex flex-col no-underline text-foreground bg-card border border-border rounded-lg overflow-hidden shadow-sm">
25
+ <div className="aspect-[4/3] bg-background">
26
+ {image
27
+ ? <img src={image} alt={project.title} loading="lazy"
28
+ className="w-full h-full object-cover" />
29
+ : <div className="w-full h-full bg-muted flex items-center justify-center" aria-hidden="true"><svg viewBox="0 0 24 24" className="w-8 h-8 text-muted-foreground/40" fill="none" stroke="currentColor" strokeWidth="1.5"><rect x="3" y="3" width="18" height="18" rx="2" /><circle cx="8.5" cy="8.5" r="1.5" /><path d="m21 15-5-5L5 21" /></svg></div>}
30
+ </div>
31
+ <div className="p-3 flex flex-col gap-1">
32
+ <h3 className="m-0 font-display text-[15px] font-semibold">{project.title}</h3>
33
+ {project.description && (
34
+ <p className="m-0 text-muted-foreground text-sm leading-normal">{project.description}</p>
35
+ )}
36
+ </div>
37
+ </Link>
38
+ );
39
+ }
@@ -0,0 +1,15 @@
1
+ // Responsive projects grid + empty state. Styled with base44 design tokens (shadcn Tailwind classes).
2
+ import ProjectCard from "./ProjectCard";
3
+
4
+ export default function ProjectGrid({ projects, empty = "No projects yet." }) {
5
+ if (!projects?.length) {
6
+ return (
7
+ <p className="text-muted-foreground p-4 text-center">{empty}</p>
8
+ );
9
+ }
10
+ return (
11
+ <div className="grid gap-4 [grid-template-columns:repeat(auto-fill,minmax(240px,1fr))]">
12
+ {projects.map((p) => <ProjectCard key={p.id} project={p} />)}
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,29 @@
1
+ // One gallery media item. Branch on item.type ("IMAGE" | "VIDEO" | "UNDEFINED") — this branching
2
+ // and the field paths (image.imageInfo.url, video.videoInfo.resolutions[0].url) are load-bearing;
3
+ // re-skin via base44 design tokens (shadcn Tailwind classes), don't rewire the paths.
4
+
5
+ function https(url) {
6
+ return url ? (url.startsWith("//") ? `https:${url}` : url) : null;
7
+ }
8
+
9
+ export default function ProjectMedia({ item }) {
10
+ if (item.type === "IMAGE") {
11
+ const src = https(item.image?.imageInfo?.url);
12
+ return src ? (
13
+ <img src={src} alt={item.title || ""} loading="lazy"
14
+ className="block w-full h-auto rounded-sm" />
15
+ ) : null;
16
+ }
17
+ if (item.type === "VIDEO") {
18
+ // resolutions[].url is the confirmed field; posters[0] is the poster (sub-shape not in the
19
+ // helper JSDoc — posters[0].url used here; confirm in wix-docs if a brand needs more).
20
+ const vi = item.video?.videoInfo;
21
+ const src = https(vi?.resolutions?.[0]?.url);
22
+ const poster = https(vi?.posters?.[0]?.url);
23
+ return src ? (
24
+ <video src={src} poster={poster || undefined} controls playsInline
25
+ className="block w-full h-auto rounded-sm bg-card" />
26
+ ) : null;
27
+ }
28
+ return null; // UNDEFINED — nothing renderable
29
+ }
@@ -0,0 +1,35 @@
1
+ // useCollectionProjects — one collection's header + its project grid, no markup. Resolve the
2
+ // collection by slug (null → not-found), then page its projects. getCollectionBySlug returns the
3
+ // object or null; queryProjectsByCollection returns { projects, nextCursor } (an OBJECT) — keep
4
+ // the destructuring, or `.map` on the result throws.
5
+ import { useState, useEffect } from "react";
6
+ import { getCollectionBySlug, queryProjectsByCollection } from "@/rest/wix-portfolio";
7
+
8
+ export function useCollectionProjects(slug, { limit = 24 } = {}) {
9
+ const [collection, setCollection] = useState(null);
10
+ const [notFound, setNotFound] = useState(false);
11
+ const [projects, setProjects] = useState(null); // null = loading
12
+ const [cursor, setCursor] = useState(null);
13
+
14
+ useEffect(() => {
15
+ setNotFound(false);
16
+ setProjects(null);
17
+ getCollectionBySlug(slug).then((c) => {
18
+ if (!c) return setNotFound(true);
19
+ setCollection(c);
20
+ queryProjectsByCollection(c.id, { limit }).then(({ projects, nextCursor }) => {
21
+ setProjects(projects);
22
+ setCursor(nextCursor);
23
+ });
24
+ });
25
+ }, [slug, limit]);
26
+
27
+ const loadMore = () =>
28
+ collection &&
29
+ queryProjectsByCollection(collection.id, { limit, cursor }).then(({ projects: more, nextCursor }) => {
30
+ setProjects((p) => [...(p ?? []), ...more]);
31
+ setCursor(nextCursor);
32
+ });
33
+
34
+ return { collection, notFound, projects, cursor, loadMore };
35
+ }
@@ -0,0 +1,27 @@
1
+ // usePortfolioGallery — collections-gallery data, no markup: first page + count for the empty
2
+ // state + cursor paging. queryCollections returns { collections, nextCursor } (an OBJECT, not an
3
+ // array) and countCollections returns a number — those shapes are the bug-prone part; keep them.
4
+ import { useState, useEffect } from "react";
5
+ import { queryCollections, countCollections } from "@/rest/wix-portfolio";
6
+
7
+ export function usePortfolioGallery({ limit = 24 } = {}) {
8
+ const [collections, setCollections] = useState(null); // null = loading
9
+ const [cursor, setCursor] = useState(null);
10
+ const [total, setTotal] = useState(null); // 0 → empty state
11
+
12
+ useEffect(() => {
13
+ countCollections().then(setTotal);
14
+ queryCollections({ limit }).then(({ collections, nextCursor }) => {
15
+ setCollections(collections);
16
+ setCursor(nextCursor);
17
+ });
18
+ }, [limit]);
19
+
20
+ const loadMore = () =>
21
+ queryCollections({ limit, cursor }).then(({ collections: more, nextCursor }) => {
22
+ setCollections((c) => [...(c ?? []), ...more]);
23
+ setCursor(nextCursor);
24
+ });
25
+
26
+ return { collections, total, cursor, loadMore };
27
+ }
@@ -0,0 +1,25 @@
1
+ // useProjectDetail — project-detail data, no markup: load a project by slug (null → not-found),
2
+ // then load its media gallery. listProjectItems returns { items, total } (an OBJECT, not a bare
3
+ // array) — iterate `items`; that shape is the bug-prone part. The PDP page only renders what this
4
+ // returns. details[] rows come through untouched: [{ label, text? OR link: { text, url, target } }].
5
+ import { useState, useEffect } from "react";
6
+ import { getProjectBySlug, listProjectItems } from "@/rest/wix-portfolio";
7
+
8
+ export function useProjectDetail(slug) {
9
+ const [project, setProject] = useState(null);
10
+ const [notFound, setNotFound] = useState(false);
11
+ const [items, setItems] = useState([]);
12
+
13
+ useEffect(() => {
14
+ setNotFound(false);
15
+ setProject(null);
16
+ setItems([]);
17
+ getProjectBySlug(slug).then((p) => {
18
+ if (!p) return setNotFound(true);
19
+ setProject(p);
20
+ listProjectItems(p.id).then(({ items }) => setItems(items));
21
+ });
22
+ }, [slug]);
23
+
24
+ return { project, notFound, items };
25
+ }