@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,128 +1,239 @@
1
+ # Wix Blog — ready-made client
1
2
 
2
- # Wix Blog Skill
3
+ The blog reader is **shipped as real files**, not snippets to regenerate. It's a complete feed + post
4
+ detail + category/tag landing pages, styled with your app's design tokens (base44's `src/index.css` —
5
+ the shadcn palette the design phase already set). Copy it into the app and wire the routes — you
6
+ generate almost none of the reader code (post paging, slug routing, the category/tag id→label
7
+ resolution, the plain-text body split all ship and are correct).
3
8
 
4
- > **Source files (in this skill):** the shared transport `references/shared/wix-client.js` and this vertical's `references/blog/wix-blog.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.
9
+ Talks to Wix directly over the public `WIX_CLIENT_ID` (anonymous visitor tokens). The reader is
10
+ **read-only and visitor-facing** — it never creates, edits, or moderates content. Never mock posts;
11
+ never hand-build a post/category/tag URL — route by `slug` through the shipped helpers.
5
12
 
6
- Builds a real, client-only Wix blog reader. The browser talks to Wix directly over a
7
- public `WIX_CLIENT_ID`. Never mock posts; never hand-build post/category/tag URLs — always
8
- fetch live data through the official Blog REST endpoints and route by `slug`.
13
+ ## Prerequisites
14
+ - The site's **Wix Blog** is the read target. It's installed and seeded separately (see **Seeding** below), in parallel with this build — so it may be empty at build time; the client renders the shipped empty state until posts land. Draft/unpublished posts are never returned.
15
+ - The public headless **`WIX_CLIENT_ID`** from your prompt (visitor-facing, safe to hardcode/commit).
9
16
 
10
- ## When to use
11
- - User wants a Wix blog/news/articles section or asks to "connect my Wix blog".
12
- - Replacing placeholder/mock articles with live Wix Blog posts.
13
- - Adding a post feed, post detail pages, category pages, or tag pages over an existing
14
- Wix Blog with published posts.
17
+ ## STEP 1 — The client is already in `src/`
18
+ The install step (base44.md STEP 1) deployed the whole blog UI client + REST scaffolds into `src/`
19
+ (imports use the `@/` alias → `src/`). Here's every file and what it is — **this is your map, so you
20
+ don't need to open them:**
15
21
 
16
- This skill is **read-only and visitor-facing**. It does not create, edit, publish, or
17
- moderate posts — the author manages all content in the Wix dashboard.
22
+ | file | what it is |
23
+ |---|---|
24
+ | `context/TaxonomyContext.jsx` | `useTaxonomy()` provider: categories + tags fetched **once**, exposed as `catById` / `tagById` id→object maps |
25
+ | `hooks/usePostDetail.js` | post-detail data — load by slug, not-found state, resolved category/tag chips, body paragraphs |
26
+ | `components/PostCard.jsx`, `PostGrid.jsx` | post listing UI (grid + card, with cover image + empty state) |
27
+ | `components/PostChips.jsx` | category/tag chips for a post (resolves ids via the taxonomy, routes by slug) |
28
+ | `components/WixManageBanner.jsx` | preview-only manage banner — drop it into your Layout (STEP 4) |
29
+ | `pages/Blog.jsx` | the feed route (`/blog`) — lists posts, paginates, empty state |
30
+ | `pages/PostDetail.jsx` | the post route (`/blog/:slug`) |
31
+ | `pages/CategoryPage.jsx`, `TagPage.jsx` | the taxonomy landing routes (`/blog/category/:slug`, `/blog/tag/:slug`) |
32
+ | `rest/wix-config.js` | **you set the ids here** (STEP 2) |
33
+ | `rest/wix-client.js` + `rest/wix-blog.js` | REST transport + blog helpers (posts/categories/tags) |
18
34
 
19
- ## Prerequisites
20
- 1. A Wix site with **Wix Blog installed and posts already published** (this skill does
21
- NOT provision — it's read-only over published content). Draft/unpublished posts are
22
- never returned.
23
- 2. The site's public headless **`WIX_CLIENT_ID`**, provided in the handoff prompt (the
24
- Wix Business Manager surfaces a copyable prompt with the id filled in — see
25
- the router `SKILL.md`). Paste it into `src/rest/wix-client.js` in place of the placeholder. It is
26
- a visitor-facing credential (it only mints anonymous visitor tokens), **not** a secret,
27
- so hardcoding/committing it is fine.
28
-
29
- ## The API (copy as-is; do not re-derive it)
30
- This skill ships only the REST layer — no UI components. Build the blog's UI however the
31
- project wants; wire it to these two snippets. Copy them into the app (e.g. `src/api/`) and
32
- only adjust import paths:
33
- - `src/rest/wix-client.js` — visitor-token mint/refresh + transport. Set `WIX_CLIENT_ID` to
34
- the id from the prompt (replace the `<YOUR-CLIENT-ID>` placeholder). The refresh token is
35
- persisted to localStorage so the same anonymous visitor is reused across reloads; do not
36
- re-mint anonymously per load.
37
- - `src/rest/wix-blog.js` — exports:
38
- - **Posts:** `queryPosts`, `getPostBySlug`, `queryPostsByCategory`, `queryPostsByTag`, `getTotalPosts`
39
- - **Categories:** `queryCategories`, `getCategoryBySlug`
40
- - **Tags:** `queryTags`, `getTagBySlug`
41
-
42
- The Post, Category, and Tag shapes are documented as JSDoc comments at the top of
43
- `wix-blog.js`. Read them before building the UI — they describe the key fields and link to
44
- the full API reference for anything not shown.
45
-
46
- ## How to wire it (UI is the project's choice)
47
- - **Post feed** — `queryPosts()` for the listing (published posts only, newest first with
48
- pinned posts leading); pass `nextCursor` back as `cursor` to load the next page. Render
49
- `title`, `excerpt`, `firstPublishedDate`, `minutesToRead`, and the cover image from
50
- **`post.media.wixMedia.image.url`** (see the cover-image note below). Route to the detail page by `slug`.
51
- - **Post detail** — `getPostBySlug(slug)` keyed off the URL slug; returns `null` on miss —
52
- show a not-found state, never invent a post. It returns full content:
53
- - `contentText` — the body as plain text. Split on `"\n"` to render simple paragraphs.
54
- - `richContent` — the body as a Ricos rich-content document (images, embeds, formatting).
55
- Render it with a Ricos renderer for a faithful post. See "Beyond the snippets" if you
56
- need rich rendering; `contentText` is the zero-dependency default.
57
- - Resolve `categoryIds` / `tagIds` to labels with `queryCategories()` / `queryTags()`
58
- (build an id→label map) to show category/tag chips.
59
- - **Cover image** — use **`post.media.wixMedia.image.url`** (a ready-to-use https URL) for the card
60
- thumbnail and post header. `media` is returned by default (including on the list query), so no extra
61
- fieldset is needed. When `post.media?.wixMedia?.image` is absent, the cover is the first image inside
62
- `richContent` — fall back to the first IMAGE node there, or show a text-only card. Never substitute a
63
- stock/placeholder image.
64
- - **Category page** — `queryCategories()` for a category menu (ordered by `displayPosition`;
65
- hide categories with `postCount === 0` if you want); `getCategoryBySlug(slug)` for a
66
- category landing page. Pass `category.id` to `queryPostsByCategory(categoryId, { limit?, cursor? })`
67
- to list that category's posts; paginate exactly like `queryPosts`.
68
- - **Tag page** — `queryTags()` for a tag cloud/list (most-used first); `getTagBySlug(slug)`
69
- for a tag landing page. Pass `tag.id` to `queryPostsByTag(tagId, { limit?, cursor? })`.
70
- - **Empty state** — if `getTotalPosts()` is 0, show an empty state telling the user to
71
- publish posts in their Wix dashboard. Never invent posts.
72
-
73
- ## Hard rules (do not violate)
74
- - ✅ Fetch posts/categories/tags ONLY through the shipped helpers (the official Blog REST
75
- endpoints). Route between screens by `slug`.
76
- - ❌ Never hand-build post, category, or tag URLs to fetch content. Use `getPostBySlug`,
77
- `getCategoryBySlug`, `getTagBySlug`. (For an outbound link to the live Wix page, use the
78
- `url` field — `url.base + url.path` — returned on the object, not a string you assemble.)
79
- - ❌ Never mock posts, authors, or content — render live Wix data or the empty state.
80
- - ❌ Never generate fake comments, likes, view counts, or ratings. This skill is read-only
81
- and does not expose engagement actions; leave such UI empty or omit it.
82
- - ❌ Never use a placeholder/stock cover image. If `post.media?.wixMedia?.image` is missing, fall back
83
- to the first richContent image or a text-only card.
84
- - ✅ Set `WIX_CLIENT_ID` from the prompt's value (public client id — safe to hardcode).
85
- - ✅ Use `post.media.wixMedia.image.url` for the cover image.
86
- - The helpers fail soft on single-item lookups: `getPostBySlug` / `getCategoryBySlug` /
87
- `getTagBySlug` return `null` on a miss so you can show a proper not-found state — don't
88
- swallow that into a fake item.
89
-
90
- ## Beyond the snippets
91
- The snippets cover the common blog-reader paths. If you hit a use case they don't cover
92
- (e.g. rendering `richContent` faithfully, full-text search/filtering, related posts,
93
- post metrics, members-only/pricing-plan posts, multilingual posts), extend the client
94
- yourself with `wixApiRequest` — but look up the exact endpoint, HTTP method, and request
95
- body in the **official Wix API reference** first; never guess:
35
+ They're already in place — go **straight to theming + wiring**, nothing to verify first. **Don't
36
+ `read_file` the shipped page/component/hook source to inspect it** — the table above says what each is
37
+ and every field shape you need is in the snippets below. Read a shipped file's source **only** on a
38
+ real fallback — a runtime error, or a field the snippets don't cover (see "Fallback only" at the
39
+ end). (Files missing? the install's `deploy` result lists what it wrote; re-run install, or copy
40
+ `references/blog/app/` → `src/`.)
41
+
42
+ ## STEP 2 — Credentials
43
+ Write `src/rest/wix-config.js` with your `WIX_CLIENT_ID` and `WIX_METASITE_ID` from the prompt — the
44
+ one place both ids live.
45
+
46
+ ## STEP 3 — Theme (nothing to style on the shipped components)
47
+ The shipped components carry **no palette of their own** — they render from base44's design tokens in
48
+ `src/index.css` (`:root`/`.dark`: `--background`, `--foreground`, `--card`, `--primary`, `--muted`,
49
+ `--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`, `text-foreground`,
50
+ `bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`, `font-display`). Those tokens
51
+ are **already set to the brand by the design phase**, so the shipped pages are themed with zero work
52
+ here. To adjust the palette, edit `index.css` (`:root` **and** `.dark`) — the base44 way; **never add
53
+ a parallel theme file (e.g. a `theme.css`) or restyle the shipped JSX.** Build the Home/Header you add
54
+ (STEP 4) from the **same** base44 tokens/classes so it matches automatically. A dark brand is just
55
+ base44's dark palette in `index.css` — no per-component work.
56
+
57
+ ## STEP 4 — Wire routes + provider (surgical `find_replace` on `src/App.jsx`, never a rewrite)
58
+ **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.
59
+ `App.jsx` carries required platform auth scaffolding (`AuthProvider`/`useAuth`) — edit it in, don't
60
+ replace it.
61
+ - Wrap the routed tree in `<TaxonomyProvider>` (from `@/context/TaxonomyContext`) so categories/tags
62
+ are fetched **once** and every card/chip reuses the shared map (never re-query per post).
63
+ - Put your **header + footer in a `Layout`** that renders `<Outlet/>` between them, and nest every
64
+ route under one pathless `<Route element={<Layout/>}>`. Your brand chrome then wraps **every** page
65
+ — including the shipped `Blog` / `PostDetail` / category / tag pages — so you **never edit the
66
+ shipped pages to add a header/footer** (they render inside `<Outlet/>` as-is).
67
+ - **Pin the top chrome as one fixed block.** Put `<WixManageBanner/>` (shipped, preview-only) **above**
68
+ your `<Header/>` inside a single `position:fixed` top region — the header itself is plain in-flow
69
+ markup, the region owns the fixing — so banner + header ride together (no scroll drift/gap). Pad
70
+ the content by the region's measured height so it clears the chrome and self-corrects when the
71
+ banner is dismissed.
72
+ - Routes under the Layout: `/blog` → `Blog`, `/blog/:slug` → `PostDetail`, `/blog/category/:slug` →
73
+ `CategoryPage`, `/blog/tag/:slug` → `TagPage` (all shipped, as-is). **You add `/` → your own Home** page.
74
+
75
+ ```jsx
76
+ import { useRef, useState, useEffect } from "react";
77
+ import { Routes, Route, Outlet } from "react-router-dom";
78
+ import { TaxonomyProvider } from "@/context/TaxonomyContext";
79
+ import WixManageBanner from "@/components/WixManageBanner"; // shipped, preview-only · default export, no props
80
+ import Blog from "@/pages/Blog"; // shipped · default export, no props
81
+ import PostDetail from "@/pages/PostDetail"; // shipped · default export, no props
82
+ import CategoryPage from "@/pages/CategoryPage"; // shipped · default export, no props
83
+ import TagPage from "@/pages/TagPage"; // shipped · default export, no props
84
+ import Home from "@/pages/Home"; // YOU build
85
+ import Header from "@/components/Header"; // YOU build — plain in-flow markup, NOT position:fixed
86
+ import Footer from "@/components/Footer"; // YOU build
87
+
88
+ function Layout() {
89
+ const topRef = useRef(null);
90
+ const [offset, setOffset] = useState(0);
91
+ useEffect(() => { // measure the fixed region → pad content below it
92
+ const ro = new ResizeObserver(() => setOffset(topRef.current?.offsetHeight ?? 0));
93
+ if (topRef.current) ro.observe(topRef.current);
94
+ return () => ro.disconnect();
95
+ }, []);
96
+ return (<>
97
+ <div ref={topRef} style={{ position: "fixed", top: 0, left: 0, right: 0, zIndex: 50 }}>
98
+ <WixManageBanner /> {/* null on the published site / when dismissed */}
99
+ <Header /> {/* your brand header, in-flow inside this fixed block */}
100
+ </div>
101
+ <div style={{ paddingTop: offset }}> {/* clears the chrome; shrinks when the banner is dismissed */}
102
+ <Outlet /> {/* shipped Blog / PostDetail / Category / Tag render here, untouched */}
103
+ <Footer />
104
+ </div>
105
+ </>);
106
+ }
107
+
108
+ <TaxonomyProvider>
109
+ <Routes>
110
+ <Route element={<Layout />}> {/* chrome wraps all */}
111
+ <Route path="/" element={<Home />} /> {/* yours */}
112
+ <Route path="/blog" element={<Blog />} /> {/* shipped, as-is */}
113
+ <Route path="/blog/:slug" element={<PostDetail />} /> {/* shipped, as-is */}
114
+ <Route path="/blog/category/:slug" element={<CategoryPage />} /> {/* shipped, as-is */}
115
+ <Route path="/blog/tag/:slug" element={<TagPage />} /> {/* shipped, as-is */}
116
+ </Route>
117
+ </Routes>
118
+ </TaxonomyProvider>
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 "latest posts" strip is just `queryPosts` + the shipped
125
+ `PostGrid`; a category nav is `useTaxonomy()` + links to `/blog/category/:slug`:
126
+
127
+ ```jsx
128
+ import { useState, useEffect } from "react";
129
+ import { Link } from "react-router-dom";
130
+ import { queryPosts } from "@/rest/wix-blog";
131
+ import { useTaxonomy } from "@/context/TaxonomyContext";
132
+ import PostGrid from "@/components/PostGrid";
133
+
134
+ // Responsive header: choose ONE branch with a state flag (never a Tailwind `hidden md:*` toggle —
135
+ // these navs are inline-styled, and an inline `display` beats a Tailwind class, so `hidden` never
136
+ // applies and BOTH branches render). One branch = one nav.
137
+ export function Header() {
138
+ const [mobile, setMobile] = useState(() => window.innerWidth < 768);
139
+ useEffect(() => {
140
+ const onResize = () => setMobile(window.innerWidth < 768);
141
+ window.addEventListener("resize", onResize); // keep it reactive to viewport changes
142
+ return () => window.removeEventListener("resize", onResize);
143
+ }, []);
144
+ return (
145
+ <nav style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
146
+ {/* brand/logo */}
147
+ {mobile
148
+ ? <YourMenu /> // your hamburger + links here
149
+ : <div style={{ display: "flex", gap: 24 }}><Link to="/">Home</Link><Link to="/blog">Blog</Link></div>}
150
+ </nav>
151
+ );
152
+ }
153
+ export function Latest() { // on your home page
154
+ const [posts, setPosts] = useState([]);
155
+ // NB: queryPosts returns { posts, nextCursor } — destructure the array.
156
+ useEffect(() => { queryPosts({ limit: 6 }).then(({ posts }) => setPosts(posts)); }, []);
157
+ return <PostGrid posts={posts} empty="Posts coming soon." />;
158
+ }
159
+ export function CategoryNav() { // a menu of the blog's categories
160
+ const { categories } = useTaxonomy(); // fetched once by the provider
161
+ return categories.filter((c) => c.postCount > 0) // hide empty categories if you want
162
+ .map((c) => <Link key={c.id} to={`/blog/category/${c.slug}`}>{c.label}</Link>);
163
+ }
164
+ ```
165
+ Everything reads base44's design tokens (`index.css`), so your home/nav match the shipped pages automatically.
166
+
167
+ **Editing a component and the change doesn't show? It's the preview, not your code.** The dev preview
168
+ can serve a stale module after a write. Before diagnosing a visual bug you just "fixed", do a fresh
169
+ full navigate/reload of the preview and re-check — don't keep rewriting correct code against a stale
170
+ render.
171
+
172
+ ## Using the client from your own UI
173
+
174
+ ```jsx
175
+ // Every list helper returns an OBJECT, not a bare array — destructure first, or `.map` throws:
176
+ const { posts, nextCursor } = await queryPosts({ limit: 20 }); // pass nextCursor back as `cursor`
177
+ const { categories, total } = await queryCategories(); // display c.label · count c.postCount
178
+ const { tags } = await queryTags(); // display t.label · count t.publishedPostCount
179
+ const { posts: inCategory } = await queryPostsByCategory(categoryId, { limit: 20 });
180
+ const { posts: withTag } = await queryPostsByTag(tagId, { limit: 20 });
181
+
182
+ // Single-item lookups fail soft (null on miss) — show a not-found state, never invent an item:
183
+ const post = await getPostBySlug(slug); // null → 404 state
184
+ const cat = await getCategoryBySlug(slug);
185
+ const tag = await getTagBySlug(slug);
186
+
187
+ // Cover image: post cover and category cover are DIFFERENT paths.
188
+ const postCover = post.media?.wixMedia?.image?.url; // post/card cover (ready-to-use https)
189
+ const catCover = cat.coverImage?.url; // category landing cover
190
+ // No post cover? fall back to the first richContent IMAGE node, or a text-only card — never a stock image.
191
+
192
+ // Body: contentText is plain text (split on "\n" for paragraphs — the shipped hook does this).
193
+ // richContent is a Ricos document for a faithful render (images/embeds) — see "Extending".
194
+ ```
195
+
196
+ **No author byline** — the reader helpers don't expose an author (`post.author` is undefined). Omit
197
+ the byline, or resolve it via the **members** vertical. **No engagement UI** — comments/likes/views
198
+ aren't exposed; leave them out.
199
+
200
+ ## Extending the client
201
+ Building something beyond the shipped pages (faithful `richContent`, full-text search, related posts,
202
+ metrics, members-only posts)? Extend with `wixApiRequest`, but look up the exact endpoint/method/body
203
+ in the **official Wix API reference** first — never guess. Each helper in `wix-blog.js` links its
204
+ reference page inline.
96
205
  - Blog API reference: https://dev.wix.com/docs/api-reference/business-solutions/blog.md
97
- - Query Posts (filters/sort: `categoryIds`, `tagIds`, `hashtags`, `title`, dates, `featured`):
98
- https://dev.wix.com/docs/api-reference/business-solutions/blog/posts-stats/query-posts.md
99
- - Rendering `richContent` (Ricos document format):
100
- https://dev.wix.com/docs/ricos/api-reference/ricos-document
101
- - **Members-only posts** → the **members** vertical (`references/members/INSTRUCTIONS.md`): once a
102
- member is logged in (custom login on your own UI), the existing read helpers return the content
103
- gated to members — no extra code. Note this blog helper is **read-only**: member *writes* (posting
104
- a comment, liking a post) aren't included — add them as a beyond-the-snippets `wixApiRequest` call,
105
- authenticated as the logged-in member.
106
- - Each helper in `wix-blog.js` links its exact reference page inline.
107
-
108
- Keep the snippets as the default for everything they already do; reach for the API
109
- reference only for the gap.
206
+ - Rendering `richContent` (Ricos document): https://dev.wix.com/docs/ricos/api-reference/ricos-document
207
+ - **Members-only posts** → the **members** vertical: once a member is logged in, the shipped read
208
+ helpers return the gated content with no extra code (member *writes* — comments, likes — are not
209
+ included; add them as an authenticated `wixApiRequest` call).
210
+
211
+ Fallback only — when you hit an error or need something not shown here: read the relevant shipped file
212
+ under `src/`, or look it up via the **`wix-docs`** skill.
213
+
214
+ ## Hard rules
215
+ - Set `WIX_CLIENT_ID` (STEP 2) — not the placeholder.
216
+ - Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
217
+ - Header/footer live in a `Layout` around `<Outlet/>` (STEP 4) — never edit the shipped `Blog`/`PostDetail`/category/tag pages to add chrome.
218
+ - The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your `Header` is plain in-flow markup (not `position:fixed`).
219
+ - Route by `slug` through the shipped helpers — never hand-build a post/category/tag URL. Display categories/tags by `.label` (not `.name`).
220
+ - Render live Wix data or the shipped empty state — never mock posts, authors, comments, likes, or view counts; never use a stock/placeholder cover image.
110
221
 
111
222
  ## Point the user to their dashboard
112
- In some cases, users need to access the Wix dashboard in order to edit the blog content for their site. To facilitate this, provide the user with deep links directly to the relevant dashboard pages. For blog data those pages are:
113
- - **Posts** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/posts` (`Dashboard → Blog → Posts`; write, edit, and publish posts; only published posts appear in the app)
114
- - **Categories** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/categories` (`Dashboard → Blog → Categories`)
115
-
116
- Substitute the site's `metaSiteId` to complete the links (you have it from the handoff / `ListWixSites`). Include the in-dashboard navigation as a fallback.
117
-
118
- ## Verification checklist (before declaring done)
119
- - [ ] `WIX_CLIENT_ID` set to the prompt's value (not the `<YOUR-CLIENT-ID>` placeholder)
120
- - [ ] Visitor token persists across reload (no re-mint storm; same anonymous visitor)
121
- - [ ] Post feed lists live published posts, newest first, and paginates via `nextCursor`
122
- - [ ] Post detail loads by `slug` and renders real `contentText` (or rendered `richContent`)
123
- - [ ] `getPostBySlug` on a bad slug shows a not-found state (no invented post)
124
- - [ ] Cover images come from `post.media.wixMedia.image.url` (or richContent fallback) — no stock placeholders
125
- - [ ] Category and tag pages list the right posts via `queryPostsByCategory` / `queryPostsByTag`
126
- - [ ] Empty state shown when `getTotalPosts()` is 0
127
- - [ ] No mock posts, authors, comments, likes, or view counts anywhere
128
- - [ ] Told the user at least once that they can continue setting up their blog in the dashboard and provided deep links.
223
+ Provide deep links so the owner can edit content (substitute the site's `metaSiteId`):
224
+ - **Posts** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/posts` (write, edit, publish; only published posts appear in the app)
225
+ - **Categories** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/categories`
226
+
227
+ ## Seeding
228
+ Seed the blog per `seed/SEED.md` (the build-time module that creates posts/categories over the
229
+ connector) — separate from this client build; run in 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) — `/blog` and a post detail page (plus a category/tag 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 `Blog`/`PostDetail`/`CategoryPage`/`TagPage` untouched; content clears the fixed chrome; `<TaxonomyProvider>` wraps the tree.
236
+ - [ ] Feed lists live published posts (newest first) and paginates via `nextCursor`; post detail loads by `slug`; a bad slug shows the not-found state (no invented post).
237
+ - [ ] Category/tag pages list the right posts; chips display `.label` and route by `.slug`; taxonomy fetched once (no re-query per card).
238
+ - [ ] Cover images come from `post.media.wixMedia.image.url` (category cover from `category.coverImage.url`) — no stock placeholders; no author byline / engagement UI invented.
239
+ - [ ] Empty catalog shows the shipped empty state; no mock posts anywhere.
@@ -0,0 +1,43 @@
1
+ // Feed tile. Styled with base44 design tokens (shadcn Tailwind classes) — re-skin via those tokens, not this
2
+ // JSX. The cover-image path (post.media.wixMedia.image.url) and the text-only fallback are
3
+ // load-bearing: never substitute a stock/placeholder image. Routes to the detail page by slug.
4
+ import { Link } from "react-router-dom";
5
+
6
+ function coverImage(post) {
7
+ const url = post?.media?.wixMedia?.image?.url; // ready-to-use https url; //-fix is defensive
8
+ return url ? (url.startsWith("//") ? `https:${url}` : url) : null;
9
+ }
10
+
11
+ function formatDate(iso) {
12
+ if (!iso) return null;
13
+ try { return new Date(iso).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric" }); }
14
+ catch { return null; }
15
+ }
16
+
17
+ export default function PostCard({ post }) {
18
+ const image = coverImage(post);
19
+ const date = formatDate(post?.firstPublishedDate);
20
+
21
+ return (
22
+ <Link to={`/blog/${post.slug}`}
23
+ className="flex flex-col no-underline text-foreground bg-card border border-border rounded-lg overflow-hidden shadow-sm">
24
+ {image && (
25
+ <div className="aspect-[16/9] bg-background">
26
+ <img src={image} alt={post.media?.wixMedia?.image?.altText || post.title} loading="lazy"
27
+ className="w-full h-full object-cover" />
28
+ </div>
29
+ )}
30
+ <div className="p-4 flex flex-col gap-2">
31
+ <h3 className="m-0 font-display text-lg font-semibold leading-[1.3]">{post.title}</h3>
32
+ {post.excerpt && (
33
+ <p className="m-0 text-muted-foreground text-sm leading-[1.5]">{post.excerpt}</p>
34
+ )}
35
+ <div className="flex gap-2 items-center text-muted-foreground text-[12px]">
36
+ {date && <span>{date}</span>}
37
+ {date && post.minutesToRead ? <span aria-hidden="true">·</span> : null}
38
+ {post.minutesToRead ? <span>{post.minutesToRead} min read</span> : null}
39
+ </div>
40
+ </div>
41
+ </Link>
42
+ );
43
+ }
@@ -0,0 +1,25 @@
1
+ // Category + tag chips for a post. Resolves the post's categoryIds/tagIds against the SHARED
2
+ // taxonomy maps (fetched once by TaxonomyProvider — never re-query here), displays each by .label
3
+ // (NOT .name), and routes by .slug. Styled with base44 design tokens (shadcn Tailwind classes).
4
+ import { Link } from "react-router-dom";
5
+ import { useTaxonomy } from "@/context/TaxonomyContext";
6
+
7
+ const chip = "inline-flex items-center py-1 px-2.5 text-[12px] no-underline text-foreground bg-card border border-border rounded-full";
8
+
9
+ export default function PostChips({ post }) {
10
+ const { catById, tagById } = useTaxonomy();
11
+ const cats = (post.categoryIds || []).map((id) => catById.get(id)).filter(Boolean);
12
+ const tags = (post.tagIds || []).map((id) => tagById.get(id)).filter(Boolean);
13
+ if (!cats.length && !tags.length) return null;
14
+
15
+ return (
16
+ <div className="flex flex-wrap gap-2">
17
+ {cats.map((c) => (
18
+ <Link key={c.id} to={`/blog/category/${c.slug}`} className={`${chip} text-primary border-primary`}>{c.label}</Link>
19
+ ))}
20
+ {tags.map((t) => (
21
+ <Link key={t.id} to={`/blog/tag/${t.slug}`} className={chip}>#{t.label}</Link>
22
+ ))}
23
+ </div>
24
+ );
25
+ }
@@ -0,0 +1,15 @@
1
+ // Responsive post grid + empty state. Styled with base44 design tokens (shadcn Tailwind classes).
2
+ import PostCard from "./PostCard";
3
+
4
+ export default function PostGrid({ posts, empty = "No posts yet." }) {
5
+ if (!posts?.length) {
6
+ return (
7
+ <p className="text-muted-foreground p-4 text-center">{empty}</p>
8
+ );
9
+ }
10
+ return (
11
+ <div className="grid [grid-template-columns:repeat(auto-fill,minmax(300px,1fr))] gap-6">
12
+ {posts.map((p) => <PostCard key={p.id} post={p} />)}
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,35 @@
1
+ // Taxonomy state — categories + tags fetched ONCE and shared across every page/card. Wrap the app
2
+ // in <TaxonomyProvider>; components read useTaxonomy(). Resolving a post's categoryIds/tagIds to
3
+ // chip labels runs on every post render, so this MUST be a single shared fetch — never re-query per
4
+ // card. Data wiring (destructuring, .label display, id→object maps) is correct as-is; don't re-derive.
5
+ import { createContext, useContext, useState, useEffect, useMemo } from "react";
6
+ import { queryCategories, queryTags } from "@/rest/wix-blog";
7
+
8
+ const TaxonomyContext = createContext(null);
9
+
10
+ export function TaxonomyProvider({ children }) {
11
+ const [categories, setCategories] = useState([]);
12
+ const [tags, setTags] = useState([]);
13
+
14
+ useEffect(() => {
15
+ // NB: destructure — queryCategories → { categories, total }, queryTags → { tags, total }.
16
+ queryCategories().then(({ categories }) => setCategories(categories));
17
+ queryTags().then(({ tags }) => setTags(tags));
18
+ }, []);
19
+
20
+ // display c.label · count c.postCount / display t.label · count t.publishedPostCount
21
+ const catById = useMemo(() => new Map(categories.map((c) => [c.id, c])), [categories]);
22
+ const tagById = useMemo(() => new Map(tags.map((t) => [t.id, t])), [tags]);
23
+
24
+ return (
25
+ <TaxonomyContext.Provider value={{ categories, tags, catById, tagById }}>
26
+ {children}
27
+ </TaxonomyContext.Provider>
28
+ );
29
+ }
30
+
31
+ export function useTaxonomy() {
32
+ const ctx = useContext(TaxonomyContext);
33
+ if (!ctx) throw new Error("useTaxonomy must be used within <TaxonomyProvider>");
34
+ return ctx;
35
+ }
@@ -0,0 +1,38 @@
1
+ // usePostDetail — all post-detail logic, no markup: load a post by slug, expose a not-found state,
2
+ // resolve its categoryIds/tagIds to full category/tag objects via the shared taxonomy, and split the
3
+ // plain-text body into paragraphs. The field paths (media cover, id→label resolution, contentText
4
+ // split) are the bug-prone part — keep them verbatim; the PostDetail page only renders what this
5
+ // returns. richContent is available on the loaded post for a richer render (see INSTRUCTIONS).
6
+ import { useState, useEffect, useMemo } from "react";
7
+ import { getPostBySlug } from "@/rest/wix-blog";
8
+ import { useTaxonomy } from "@/context/TaxonomyContext";
9
+
10
+ export function usePostDetail(slug) {
11
+ const { catById, tagById } = useTaxonomy();
12
+ const [post, setPost] = useState(null);
13
+ const [notFound, setNotFound] = useState(false);
14
+
15
+ useEffect(() => {
16
+ setPost(null);
17
+ setNotFound(false);
18
+ getPostBySlug(slug).then((p) => (p ? setPost(p) : setNotFound(true)));
19
+ }, [slug]);
20
+
21
+ // Resolve ids → full objects; display .label, route by .slug (drop ids with no match).
22
+ const cats = useMemo(
23
+ () => (post?.categoryIds || []).map((id) => catById.get(id)).filter(Boolean),
24
+ [post, catById],
25
+ );
26
+ const tags = useMemo(
27
+ () => (post?.tagIds || []).map((id) => tagById.get(id)).filter(Boolean),
28
+ [post, tagById],
29
+ );
30
+
31
+ // contentText is plain text — split on "\n" for simple paragraphs (drop blank lines).
32
+ const paragraphs = useMemo(
33
+ () => (post?.contentText || "").split("\n").map((s) => s.trim()).filter(Boolean),
34
+ [post],
35
+ );
36
+
37
+ return { post, notFound, cats, tags, paragraphs };
38
+ }
@@ -0,0 +1,40 @@
1
+ // Blog feed — lists published posts (newest first, pinned lead), paginates via nextCursor, and
2
+ // shows the shipped empty state when the blog has no posts. Styled with base44 design tokens (shadcn Tailwind classes).
3
+ import { useEffect, useState } from "react";
4
+ import { queryPosts, getTotalPosts } from "@/rest/wix-blog";
5
+ import PostGrid from "@/components/PostGrid";
6
+
7
+ export default function Blog() {
8
+ const [posts, setPosts] = useState(null);
9
+ const [cursor, setCursor] = useState(null);
10
+ const [total, setTotal] = useState(null);
11
+
12
+ useEffect(() => {
13
+ getTotalPosts().then(setTotal);
14
+ // NB: destructure — queryPosts returns { posts, nextCursor }, not a bare array.
15
+ queryPosts({ limit: 20 }).then(({ posts, nextCursor }) => { setPosts(posts); setCursor(nextCursor); });
16
+ }, []);
17
+
18
+ const loadMore = () =>
19
+ queryPosts({ limit: 20, cursor }).then(({ posts: more, nextCursor }) => {
20
+ setPosts((p) => [...(p || []), ...more]);
21
+ setCursor(nextCursor);
22
+ });
23
+
24
+ return (
25
+ <main className="max-w-[1100px] mx-auto p-4">
26
+ <h1 className="font-display mb-4">Blog</h1>
27
+ {posts === null
28
+ ? <p className="text-muted-foreground">Loading…</p>
29
+ : <PostGrid posts={posts} empty={total === 0
30
+ ? "No posts yet — publish posts from your Wix dashboard to see them here."
31
+ : "No posts to show."} />}
32
+ {cursor && (
33
+ <div className="text-center mt-8">
34
+ <button onClick={loadMore}
35
+ className="py-3 px-6 cursor-pointer text-[15px] font-semibold bg-primary text-primary-foreground border-none rounded-sm">Load more</button>
36
+ </div>
37
+ )}
38
+ </main>
39
+ );
40
+ }