@wix/agent-skills 1.14.0 → 1.15.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 (247) hide show
  1. package/README.md +4 -1
  2. package/package.json +1 -1
  3. package/skills/README.md +23 -0
  4. package/skills/wix-app/SKILL.md +10 -2
  5. package/skills/wix-app/references/AUTO_PATTERNS_DASHBOARD.md +326 -0
  6. package/skills/wix-app/references/CODE_QUALITY.md +1 -0
  7. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +124 -115
  8. package/skills/wix-app/references/DASHBOARD_PAGE.md +3 -0
  9. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +23 -9
  10. package/skills/wix-app/references/SITE_PLUGIN.md +1 -1
  11. package/skills/wix-app/references/auto-patterns-dashboard/action-cell.md +115 -0
  12. package/skills/wix-app/references/auto-patterns-dashboard/app-config-structure.md +264 -0
  13. package/skills/wix-app/references/auto-patterns-dashboard/app-context.md +37 -0
  14. package/skills/wix-app/references/auto-patterns-dashboard/bulk-actions.md +86 -0
  15. package/skills/wix-app/references/auto-patterns-dashboard/collection-page-actions.md +119 -0
  16. package/skills/wix-app/references/auto-patterns-dashboard/collection-page.md +103 -0
  17. package/skills/wix-app/references/auto-patterns-dashboard/custom-actions-override.md +76 -0
  18. package/skills/wix-app/references/auto-patterns-dashboard/custom-columns-override.md +82 -0
  19. package/skills/wix-app/references/auto-patterns-dashboard/custom-components-override.md +89 -0
  20. package/skills/wix-app/references/auto-patterns-dashboard/custom-header-override.md +124 -0
  21. package/skills/wix-app/references/auto-patterns-dashboard/custom-sections-override.md +91 -0
  22. package/skills/wix-app/references/auto-patterns-dashboard/custom-slots-override.md +71 -0
  23. package/skills/wix-app/references/auto-patterns-dashboard/entity-page-actions.md +70 -0
  24. package/skills/wix-app/references/auto-patterns-dashboard/entity-page-view-actions.md +73 -0
  25. package/skills/wix-app/references/auto-patterns-dashboard/entity-page.md +98 -0
  26. package/skills/wix-app/references/auto-patterns-dashboard/example-patterns.json +278 -0
  27. package/skills/wix-app/references/auto-patterns-dashboard/pages-configuration.md +94 -0
  28. package/skills/wix-app/references/auto-patterns-dashboard/resolved-action.md +43 -0
  29. package/skills/wix-app/references/auto-patterns-dashboard/sdk-utilities.md +66 -0
  30. package/skills/wix-app/references/auto-patterns-dashboard/views.md +76 -0
  31. package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +1 -14
  32. package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +54 -29
  33. package/skills/wix-app/references/editor-react-component/COMPONENT-CONFIGURATION.md +2 -2
  34. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +17 -105
  35. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +127 -0
  36. package/skills/wix-app/references/editor-react-component/PARTS.md +2 -1
  37. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +15 -15
  38. package/skills/wix-app/references/editor-react-component/REACT-PATTERNS.md +25 -53
  39. package/skills/wix-app/scripts/generate-auto-patterns.js +510 -0
  40. package/skills/wix-auth/SKILL.md +12 -0
  41. package/skills/wix-auth/references/device-flow.md +140 -0
  42. package/skills/wix-docs/SKILL.md +188 -0
  43. package/skills/wix-docs/references/API_SPEC_SEARCH.md +213 -0
  44. package/skills/wix-docs/references/EXTRACTING.md +120 -0
  45. package/skills/wix-headless/SKILL.md +84 -130
  46. package/skills/wix-headless/entry/bootstrap.mjs +93 -0
  47. package/skills/wix-headless/entry/skill.md +78 -0
  48. package/skills/wix-headless/references/AI_FEATURES.md +178 -0
  49. package/skills/wix-headless/references/CAPABILITIES.md +84 -0
  50. package/skills/wix-headless/references/DISCOVERY.md +34 -56
  51. package/skills/wix-headless/references/DOC_DISCOVERY.md +37 -0
  52. package/skills/wix-headless/references/FEEDBACK.md +118 -0
  53. package/skills/wix-headless/references/IMAGE_GENERATION.md +69 -0
  54. package/skills/wix-headless/references/SDK_HANDOFF.md +97 -0
  55. package/skills/wix-headless/references/SEED.md +44 -188
  56. package/skills/wix-headless/references/SETUP.md +32 -103
  57. package/skills/wix-headless/references/astro.md +98 -0
  58. package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +196 -0
  59. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +236 -0
  60. package/skills/wix-headless/references/inline-recipes/how-to-code-bookings.md +279 -0
  61. package/skills/wix-headless/references/inline-recipes/how-to-code-cms.md +163 -0
  62. package/skills/wix-headless/references/inline-recipes/how-to-code-events.md +203 -0
  63. package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +222 -0
  64. package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +124 -0
  65. package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +160 -0
  66. package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +118 -0
  67. package/skills/wix-headless/references/inline-recipes/how-to-code-portfolio.md +132 -0
  68. package/skills/wix-headless/references/inline-recipes/how-to-code-pricing-plans.md +124 -0
  69. package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-orders.md +188 -0
  70. package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-reservations.md +173 -0
  71. package/skills/wix-headless/references/inline-recipes/how-to-code-restaurants.md +161 -0
  72. package/skills/wix-headless/references/inline-recipes/setup-blog.md +175 -0
  73. package/skills/wix-headless/references/inline-recipes/setup-bookings.md +228 -0
  74. package/skills/wix-headless/references/inline-recipes/setup-cms.md +200 -0
  75. package/skills/wix-headless/references/inline-recipes/setup-events.md +196 -0
  76. package/skills/wix-headless/references/inline-recipes/setup-forms.md +174 -0
  77. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +176 -0
  78. package/skills/wix-headless/references/inline-recipes/setup-portfolio.md +153 -0
  79. package/skills/wix-headless/references/inline-recipes/setup-pricing-plans.md +229 -0
  80. package/skills/wix-headless/references/inline-recipes/setup-restaurant-orders.md +161 -0
  81. package/skills/wix-headless/references/inline-recipes/setup-restaurant-reservations.md +117 -0
  82. package/skills/wix-headless/references/inline-recipes/setup-restaurants.md +152 -0
  83. package/skills/wix-headless/references/managed/AUTHENTICATION.md +57 -0
  84. package/skills/wix-headless/references/managed/CONNECT.md +74 -0
  85. package/skills/wix-headless/references/managed/CREATE.md +130 -0
  86. package/skills/wix-headless/references/managed/DEPLOYMENT.md +57 -0
  87. package/skills/wix-headless/references/non-astro.md +59 -0
  88. package/skills/wix-headless/references/self-managed/AUTHENTICATION.md +22 -0
  89. package/skills/wix-headless/references/self-managed/DEPLOYMENT.md +7 -0
  90. package/skills/wix-headless/references/stripe/AUTHENTICATION.md +55 -0
  91. package/skills/wix-headless/references/stripe/DEPLOYMENT.md +63 -0
  92. package/skills/wix-manage/SKILL.md +24 -1
  93. package/skills/wix-manage/references/analytics/query-site-analytics.md +241 -0
  94. package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +1 -1
  95. package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +265 -0
  96. package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +436 -0
  97. package/skills/wix-manage/references/marketing/generate-and-publish-marketing-plan.md +209 -0
  98. package/skills/wix-manage/references/rich-content/author-ricos-rich-content.md +249 -0
  99. package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +51 -0
  100. package/skills/wix-vibe-headless/SKILL.md +136 -0
  101. package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +128 -0
  102. package/skills/wix-vibe-headless/references/blog/wix-blog.js +217 -0
  103. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +153 -0
  104. package/skills/wix-vibe-headless/references/bookings/wix-bookings-checkout.js +147 -0
  105. package/skills/wix-vibe-headless/references/bookings/wix-bookings-services.js +215 -0
  106. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +154 -0
  107. package/skills/wix-vibe-headless/references/cms/wix-cms.js +186 -0
  108. package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +142 -0
  109. package/skills/wix-vibe-headless/references/events/wix-events-browse.js +135 -0
  110. package/skills/wix-vibe-headless/references/events/wix-events-registration.js +187 -0
  111. package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +211 -0
  112. package/skills/wix-vibe-headless/references/members/wix-members-auth.js +387 -0
  113. package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +111 -0
  114. package/skills/wix-vibe-headless/references/portfolio/wix-portfolio.js +194 -0
  115. package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +127 -0
  116. package/skills/wix-vibe-headless/references/pricing-plans/wix-pricing-plans.js +157 -0
  117. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +138 -0
  118. package/skills/wix-vibe-headless/references/restaurants/wix-restaurants-menu.js +224 -0
  119. package/skills/wix-vibe-headless/references/restaurants/wix-restaurants-ordering.js +156 -0
  120. package/skills/wix-vibe-headless/references/restaurants/wix-restaurants-reservations.js +107 -0
  121. package/skills/wix-vibe-headless/references/shared/wix-client.js +186 -0
  122. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +155 -0
  123. package/skills/wix-vibe-headless/references/storefront/wix-store-cart.js +147 -0
  124. package/skills/wix-vibe-headless/references/storefront/wix-store-catalog.js +142 -0
  125. package/skills/wix-headless/references/BUILD-astro.md +0 -253
  126. package/skills/wix-headless/references/BUILD-own-build.md +0 -167
  127. package/skills/wix-headless/references/BUILD.md +0 -105
  128. package/skills/wix-headless/references/DESIGN_SYSTEM.md +0 -165
  129. package/skills/wix-headless/references/DISCOVERY-connect.md +0 -55
  130. package/skills/wix-headless/references/DISCOVERY-create.md +0 -238
  131. package/skills/wix-headless/references/PLAN-connect.md +0 -19
  132. package/skills/wix-headless/references/PLAN-create.md +0 -17
  133. package/skills/wix-headless/references/PLAN.md +0 -92
  134. package/skills/wix-headless/references/astro/blog/BLOG_PAGES.md +0 -300
  135. package/skills/wix-headless/references/astro/blog/BLOG_SETUP.md +0 -218
  136. package/skills/wix-headless/references/astro/bookings/COMPONENTS.md +0 -45
  137. package/skills/wix-headless/references/astro/bookings/SERVICES_PAGES.md +0 -77
  138. package/skills/wix-headless/references/astro/cms/CMS_FOUNDATIONS.md +0 -214
  139. package/skills/wix-headless/references/astro/cms/FAQ_KNOWLEDGE_BASE.md +0 -231
  140. package/skills/wix-headless/references/astro/cms/PORTFOLIO.md +0 -453
  141. package/skills/wix-headless/references/astro/cms/RESOURCE_LIBRARY.md +0 -354
  142. package/skills/wix-headless/references/astro/cms/TEAM_DIRECTORY.md +0 -299
  143. package/skills/wix-headless/references/astro/designer/INSTRUCTIONS.md +0 -351
  144. package/skills/wix-headless/references/astro/ecom/CART_PAGES.md +0 -119
  145. package/skills/wix-headless/references/astro/ecom/CART_WIRING.md +0 -103
  146. package/skills/wix-headless/references/astro/ecom/COMPONENTS_CSS.md +0 -132
  147. package/skills/wix-headless/references/astro/forms/CONTACT_FORM.md +0 -463
  148. package/skills/wix-headless/references/astro/gift-cards/COMPONENTS.md +0 -119
  149. package/skills/wix-headless/references/astro/gift-cards/PAGES.md +0 -129
  150. package/skills/wix-headless/references/astro/stores/BACK_IN_STOCK.md +0 -178
  151. package/skills/wix-headless/references/astro/stores/CATEGORY_PAGES.md +0 -85
  152. package/skills/wix-headless/references/astro/stores/COMPONENTS_CSS.md +0 -129
  153. package/skills/wix-headless/references/astro/stores/HOME_AND_NAV.md +0 -229
  154. package/skills/wix-headless/references/astro/stores/PRODUCT_PAGES.md +0 -215
  155. package/skills/wix-headless/references/astro/stores/SHARED_WIRING.md +0 -165
  156. package/skills/wix-headless/references/astro/templates/Layout.astro +0 -132
  157. package/skills/wix-headless/references/astro/templates/astro.config.mjs +0 -41
  158. package/skills/wix-headless/references/astro/templates/bookings/AvailabilityCalendar.tsx +0 -374
  159. package/skills/wix-headless/references/astro/templates/bookings/BookingForm.tsx +0 -136
  160. package/skills/wix-headless/references/astro/templates/bookings/SeoTags.astro +0 -25
  161. package/skills/wix-headless/references/astro/templates/bookings/ServiceBookingFlow.tsx +0 -71
  162. package/skills/wix-headless/references/astro/templates/bookings/ServiceCard.astro +0 -54
  163. package/skills/wix-headless/references/astro/templates/bookings/booking-confirmation.astro +0 -49
  164. package/skills/wix-headless/references/astro/templates/bookings/bookingDriver.ts +0 -245
  165. package/skills/wix-headless/references/astro/templates/bookings/components-bookings.css +0 -424
  166. package/skills/wix-headless/references/astro/templates/bookings/services/[slug].astro +0 -176
  167. package/skills/wix-headless/references/astro/templates/bookings/services/index.astro +0 -181
  168. package/skills/wix-headless/references/astro/templates/ecom/CartBadge.tsx +0 -84
  169. package/skills/wix-headless/references/astro/templates/ecom/CartView.tsx +0 -543
  170. package/skills/wix-headless/references/astro/templates/ecom/cart.astro +0 -13
  171. package/skills/wix-headless/references/astro/templates/ecom/components-ecom.css +0 -302
  172. package/skills/wix-headless/references/astro/templates/ecom/discounts.ts +0 -71
  173. package/skills/wix-headless/references/astro/templates/ecom/thank-you.astro +0 -24
  174. package/skills/wix-headless/references/astro/templates/gift-cards/GiftCardPurchase.tsx +0 -172
  175. package/skills/wix-headless/references/astro/templates/gift-cards/_home-teaser-snippet.astro +0 -42
  176. package/skills/wix-headless/references/astro/templates/gift-cards/_nav-snippet.astro +0 -11
  177. package/skills/wix-headless/references/astro/templates/gift-cards/components-gift-cards.css +0 -220
  178. package/skills/wix-headless/references/astro/templates/gift-cards/gift-cards.astro +0 -51
  179. package/skills/wix-headless/references/astro/templates/gift-cards/gift-cards.ts +0 -75
  180. package/skills/wix-headless/references/astro/templates/global.css +0 -288
  181. package/skills/wix-headless/references/astro/templates/stores/AddToCartButton.tsx +0 -77
  182. package/skills/wix-headless/references/astro/templates/stores/BackInStockForm.tsx +0 -176
  183. package/skills/wix-headless/references/astro/templates/stores/CategoryRail.astro +0 -69
  184. package/skills/wix-headless/references/astro/templates/stores/ProductCard.astro +0 -79
  185. package/skills/wix-headless/references/astro/templates/stores/ProductPurchase.tsx +0 -397
  186. package/skills/wix-headless/references/astro/templates/stores/SeoTags.astro +0 -21
  187. package/skills/wix-headless/references/astro/templates/stores/back-in-stock.ts +0 -67
  188. package/skills/wix-headless/references/astro/templates/stores/categories.ts +0 -155
  189. package/skills/wix-headless/references/astro/templates/stores/category/[slug].astro +0 -130
  190. package/skills/wix-headless/references/astro/templates/stores/components-stores.css +0 -400
  191. package/skills/wix-headless/references/astro/templates/stores/products/[slug].astro +0 -128
  192. package/skills/wix-headless/references/astro/templates/stores/products/index.astro +0 -101
  193. package/skills/wix-headless/references/blog/BLOG_CONTENT.md +0 -161
  194. package/skills/wix-headless/references/blog/INSTRUCTIONS.md +0 -32
  195. package/skills/wix-headless/references/bookings/FLOW.md +0 -246
  196. package/skills/wix-headless/references/bookings/INSTRUCTIONS.md +0 -95
  197. package/skills/wix-headless/references/bookings/SERVICES_DATA.md +0 -355
  198. package/skills/wix-headless/references/cms/CMS_FOUNDATIONS.md +0 -176
  199. package/skills/wix-headless/references/cms/INSTRUCTIONS.md +0 -71
  200. package/skills/wix-headless/references/commands/known-apps.json +0 -6
  201. package/skills/wix-headless/references/custom/CONNECTION_PLAN.md +0 -142
  202. package/skills/wix-headless/references/custom/INSTRUCTIONS.md +0 -88
  203. package/skills/wix-headless/references/custom/blog/WIRING.md +0 -52
  204. package/skills/wix-headless/references/custom/bookings/WIRING.md +0 -197
  205. package/skills/wix-headless/references/custom/cms/WIRING.md +0 -97
  206. package/skills/wix-headless/references/custom/ecom/WIRING.md +0 -67
  207. package/skills/wix-headless/references/custom/forms/WIRING.md +0 -101
  208. package/skills/wix-headless/references/custom/stores/WIRING.md +0 -80
  209. package/skills/wix-headless/references/ecom/INSTRUCTIONS.md +0 -59
  210. package/skills/wix-headless/references/forms/INSTRUCTIONS.md +0 -43
  211. package/skills/wix-headless/references/gift-cards/INSTRUCTIONS.md +0 -51
  212. package/skills/wix-headless/references/images/INSTRUCTIONS.md +0 -357
  213. package/skills/wix-headless/references/seed-recipes.md +0 -49
  214. package/skills/wix-headless/references/shared/AGENTS_MD.md +0 -47
  215. package/skills/wix-headless/references/shared/AUTHENTICATION.md +0 -108
  216. package/skills/wix-headless/references/shared/BUILD_NOISE.md +0 -8
  217. package/skills/wix-headless/references/shared/DESIGN_MD.md +0 -84
  218. package/skills/wix-headless/references/shared/DOCS_SEARCH.md +0 -41
  219. package/skills/wix-headless/references/shared/IMAGE_GENERATION.md +0 -186
  220. package/skills/wix-headless/references/shared/IMPLEMENTER.md +0 -206
  221. package/skills/wix-headless/references/shared/PRODUCTION_SHARP_EDGES.md +0 -97
  222. package/skills/wix-headless/references/shared/RETURN_CONTRACT.md +0 -143
  223. package/skills/wix-headless/references/shared/STYLING.md +0 -140
  224. package/skills/wix-headless/references/stores/INSTRUCTIONS.md +0 -126
  225. package/skills/wix-headless/references/stores/PRODUCT_CATALOG_DATA.md +0 -252
  226. package/skills/wix-headless/references/verticals/_schema.json +0 -74
  227. package/skills/wix-headless/references/verticals/_schema.md +0 -95
  228. package/skills/wix-headless/references/verticals/blog.md +0 -31
  229. package/skills/wix-headless/references/verticals/bookings.md +0 -41
  230. package/skills/wix-headless/references/verticals/cms.md +0 -30
  231. package/skills/wix-headless/references/verticals/ecom.md +0 -25
  232. package/skills/wix-headless/references/verticals/forms.md +0 -26
  233. package/skills/wix-headless/references/verticals/gift-cards.md +0 -24
  234. package/skills/wix-headless/references/verticals/stores.md +0 -33
  235. package/skills/wix-headless/scripts/check-manifest.mjs +0 -335
  236. package/skills/wix-headless/scripts/compose.mjs +0 -520
  237. package/skills/wix-headless/scripts/emit-design-tokens.mjs +0 -157
  238. package/skills/wix-headless/scripts/flatten.sh +0 -61
  239. package/skills/wix-headless/scripts/generate-images.mjs +0 -242
  240. package/skills/wix-headless/scripts/patch-decorative-slots.mjs +0 -154
  241. package/skills/wix-headless/scripts/plan-entity-image-waves.mjs +0 -190
  242. package/skills/wix-headless/scripts/scaffold.sh +0 -139
  243. package/skills/wix-headless/scripts/seed-utilities.sh +0 -93
  244. package/skills/wix-headless/scripts/write-decorative-json.mjs +0 -62
  245. package/skills/wix-headless/shared-utilities/analytics.ts +0 -40
  246. package/skills/wix-headless/shared-utilities/ricos.ts +0 -179
  247. package/skills/wix-headless/shared-utilities/wix-image.ts +0 -72
@@ -1,77 +0,0 @@
1
- # Bookings Pages — the SSR routes (astro)
2
-
3
- The `pages` scope of the bookings vertical. You write the route files. The
4
- **logic** is in `../../bookings/FLOW.md` (read it first); this doc is the astro
5
- wiring + the gotchas. Read `references/shared/IMPLEMENTER.md` +
6
- `references/shared/STYLING.md` first.
7
-
8
- > **Start from the templates — don't re-author the SSR data access.** Examples at
9
- > `<SKILL_ROOT>/references/astro/templates/bookings/`: `ServiceCard.astro`,
10
- > `services/index.astro`, `services/[slug].astro`, `booking-confirmation.astro`.
11
- > Read and adapt (copy, headings, styling); keep the SDK query shapes.
12
-
13
- ## Pages you write
14
-
15
- | File | From template | Role |
16
- |------|---------------|------|
17
- | `src/pages/services/index.astro` | `…/services/index.astro` | SSR catalog grid (SEO). `queryServices` via ambient `@wix/essentials`. |
18
- | `src/components/ServiceCard.astro` | `…/ServiceCard.astro` | static service card for the grid. |
19
- | `src/pages/services/[slug].astro` | `…/services/[slug].astro` | SSR detail (SEO) + mounts `<ServiceBookingFlow client:only="react">`. Also fetches the **booking-form schema** and passes `fields` to the island. |
20
- | `src/pages/booking-confirmation.astro` | `…/booking-confirmation.astro` | confirmation — renders from the `service`/`startDate` query params (no re-fetch). |
21
-
22
- Plus the nav/home links (shell chain — see below).
23
-
24
- ## astro-specific rules
25
-
26
- 1. **SSR reads use the ambient `@wix/essentials` client — never `OAuthStrategy`.**
27
- `const result = await auth.elevate(services.queryServices)({ query: { filter: { appId: BOOKING_APP_ID }, paging: { limit: 100 } }, conditionalFields: ["STAFF_MEMBER_DETAILS"] }).find();`
28
- Building `createClient({ auth: OAuthStrategy({ clientId: import.meta.env.* }) })`
29
- in frontmatter 500s in the deployed runtime (the env var is client-only).
30
- Always include **`appId`** in the filter. Single service by slug: the
31
- `.eq("mainSlug.name", slug).eq("appId", BOOKING_APP_ID).limit(1).find()` chain.
32
- The same elevation works for `services.queryLocations` and
33
- `categoriesV2.queryCategories` (used by the optional catalog filters, below).
34
- 1b. **Optional catalog filters (location + category) — auto-skip; see `../../bookings/FLOW.md` §7.**
35
- The catalog page reads `?locationId`/`?category` from the request URL and merges
36
- them into the **same** `queryServices` filter (location → `locations.business.id`
37
- $hasSome, or the synthetic `locations.type` mapping; category → `category.id` $eq).
38
- It SSRs `queryLocations()` (show the selector only when business+custom+customer
39
- count > 1) and `queryCategories().find()` (non-fatal — render without the bar on
40
- failure; show only when > 1 category). The chosen location is carried into the
41
- detail link (`ServiceCard` `locationId`/`locationType` props) so availability is
42
- scoped to it. Reference: `…/templates/bookings/services/index.astro`.
43
- 2. **The detail page fetches the booking-form schema server-side.** Read
44
- `service.form._id`'s form via `@wix/forms` (`auth.elevate(forms.getForm)(formId)`),
45
- map `formFields` to `{ label, target, required, componentType, identifier, options }`,
46
- and pass the array as `fields` into `<ServiceBookingFlow>`. **Filter to fields with a
47
- recognized string `componentType`** (`TEXT_INPUT`/`PHONE_INPUT`/`DROPDOWN`) — skip
48
- complex object-valued fields (e.g. the default form's multi-line `ADDRESS`), or
49
- `createBooking` fails with "must be object". Pass the full `service` too — the
50
- booking step reads its payment/policy. Same field-mapping as `../forms/CONTACT_FORM.md`.
51
- Also pass, through to `<ServiceBookingFlow>`: `service.staffMemberDetails?.staffMembers`
52
- (the staff picker — the service was queried with `STAFF_MEMBER_DETAILS`); the
53
- service's **business `locations`** — sourced from `auth.elevate(services.queryLocations)()`
54
- (the site's real business locations) intersected with the service's own location ids,
55
- NOT from `service.locations` alone (its ids can be ones the availability engine doesn't
56
- recognize → 0 slots) — so the calendar scopes availability to one location and avoids
57
- duplicate per-location slots (FLOW.md §7); and the `?locationId` read from the request
58
- URL (the picker's default).
59
- 3. **Only the read pages are SSR.** The detail page SSRs the service info for SEO,
60
- then the booking UI runs in the `client:only` island. Do not SSR availability.
61
- 4. **Confirmation renders from query params.** The booking step redirects with
62
- `?service=…&startDate=…`; render those. Do not re-fetch a stranger's booking
63
- from this public page.
64
- 5. **Two dirs deep** (`services/[slug].astro`) → import with `../../`, not `../../../`.
65
-
66
- ## Shell chain — nav + home (this scope patches shared files)
67
-
68
- - **Navigation** — at `<!-- nav:links -->` in `src/components/Navigation.astro`,
69
- append a link to **`/services`** (label fitting the brand: "Book", "Services", "Appointments").
70
- - **Home** — at `<!-- home:bookings -->` in `src/pages/index.astro`, add a short,
71
- brand-voiced CTA linking to **`/services`** (heading + a line + a button-styled
72
- link). Use the site's primary-action token (`--color-accent`). Do not list
73
- specific services or hardcode slugs — the catalog renders them live.
74
- - Append at the markers; keep the markers; never replace other packs' insertions.
75
-
76
- ## Return
77
- `{ status, phase, scope: "pages", summary, data, files, errors }`. Run the pre-return file-existence assertion (`../../bookings/INSTRUCTIONS.md`). If `index.astro`/`Navigation.astro` lacks its marker, return `status: "partial"` with the coded error.
@@ -1,214 +0,0 @@
1
- # CMS Foundations — Code Patterns for `@wix/data` (astro)
2
-
3
- The **rendering / code-patterns** half of CMS foundations: service module template, `@wix/data` SDK queries, image resolution, elevated access, and rich-text (Ricos) rendering — everything a CMS **page** scope needs to read collections and render them in Astro.
4
-
5
- > **Seeding lives in the business track.** Creating collections and inserting/verifying items via REST is **not** here — it is in `<SKILL_ROOT>/references/cms/CMS_FOUNDATIONS.md` (the `seed` scope's doc). This file is consumed by the `pages` scope; that file by the `seed` scope. The `cms/INSTRUCTIONS.md` router points each scope at the right half.
6
-
7
- > **Import note (read first).** The Wix Data items API is the **`items`** named export of **`@wix/data`**: `import { items } from "@wix/data"`, then `items.query` / `items.insert` / `items.update` / `items.remove` (plus `items.bulkInsert` / `bulkSave` / `bulkPatch` / …). This is the documented form and what every CMS page here uses. Do **not** import from the internal `@wix/wix-data-items-sdk`. SETUP.md's per-pack install table (Step 4c) installs `@wix/data` + `@wix/essentials` for the cms pack.
8
-
9
- ## Rendering Ricos rich-text fields
10
-
11
- Wix CMS stores `RICH_TEXT` / `RICH_CONTENT` fields as **Ricos JSON** — a structured node tree (PARAGRAPH, HEADING, BULLETED_LIST, etc.), not HTML. The dashboard's rich-text editor reads and writes this format.
12
-
13
- For SSR Astro pages (about, faq, portfolio, team, resource), import the seeded `renderRicos` util from `src/utils/ricos.ts`. The util is shipped by `seed-utilities.sh` (copied from `<SKILL_ROOT>/shared-utilities/ricos.ts` during Setup), so it's already on disk — do NOT inline a Ricos walker in your page.
14
-
15
- ```astro
16
- ---
17
- import { items } from "@wix/data";
18
- import { auth } from "@wix/essentials";
19
- import { renderRicos } from "../utils/ricos";
20
-
21
- const elevatedQuery = auth.elevate(items.query);
22
- const { items: results } = await elevatedQuery("about-content")
23
- .limit(1)
24
- .find();
25
- const about = results[0];
26
- const bodyHtml = renderRicos(about?.body);
27
- ---
28
-
29
- <article class="prose">
30
- <h1>{about?.heading}</h1>
31
- <div set:html={bodyHtml} />
32
- </article>
33
- ```
34
-
35
- The util covers the common subset (PARAGRAPH, HEADING 1-6, BULLETED_LIST / ORDERED_LIST / LIST_ITEM, BLOCKQUOTE, DIVIDER + BOLD / ITALIC / UNDERLINE / LINK decorations). Anything outside that set renders defensively as a `<p>` with the raw text — never throws.
36
-
37
- > **Why not @wix/ricos?** The blog vertical uses `@wix/ricos`'s React `RicosViewer` as a client island because blog posts can carry the full Ricos feature set (galleries, polls, embedded media). For static CMS pages, that's ~80kb of React for paragraphs and lists — overkill. Use the seeded SSR walker instead.
38
-
39
- > **Do NOT `set:html={item.body}` directly.** That ships JSON-encoded text into the page (e.g. `[object Object]` or `{"nodes":...}`). Always go through `renderRicos`.
40
-
41
- > **Critical Rules — Read Before Starting**
42
- > 1. **Collection IDs have NO namespace** — user collections use just the name (e.g., `"Projects"`). Only Wix App collections use `<namespace>/<name>`. Verify via `curl`: `GET /wix-data/v2/collections?fields=id`.
43
- > 2. **SDK query pattern** — `items.query("CollectionId").find()`. There is no `items.queryDataItems()` in the SDK.
44
- > 3. **`auth.elevate` on every query** — without it, restricted collections silently return no items.
45
- > 4. **CMS only for user collections** — use `@wix/blog` for blog posts, `@wix/stores` for products, `@wix/forms` for form submissions.
46
-
47
- ## Prerequisites (page-side)
48
-
49
- - `@wix/data` + `@wix/essentials` installed (collected by SETUP.md Step 4c — do NOT install independently).
50
- - The collections + items already created and seeded by the `seed` scope (see `../../cms/CMS_FOUNDATIONS.md`). Pages only **read**.
51
-
52
- ## Collection ID Format
53
-
54
- Native (user-created) CMS collections use **just the collection name** — no namespace prefix.
55
-
56
- Example: if the collection is called `Projects`, the collection ID is simply `"Projects"`.
57
-
58
- Only Wix App collections (e.g., `Members/PublicData`, `Locations/Locations`) use a `<namespace>/<name>` format. User-created collections never use a namespace.
59
-
60
- > **How to verify**: Call `GET /wix-data/v2/collections?fields=id` via `curl` (with the standard REST headers from `../../shared/AUTHENTICATION.md`) and use the exact `id` value from the response. Never guess — the dashboard name may differ from the ID.
61
-
62
- ## Quick Reference — Inline Query (Simple Pages)
63
-
64
- For pages that just need to list items from a collection:
65
-
66
- ```astro
67
- ---
68
- import { items } from "@wix/data";
69
- import { auth } from "@wix/essentials";
70
-
71
- // Always elevate queries for permission safety
72
- const elevatedQuery = auth.elevate(items.query);
73
- const { items: results } = await elevatedQuery("MyCollection")
74
- .ascending("sortField")
75
- .limit(50)
76
- .find();
77
-
78
- // Fields are directly on each item (NOT item.data.field)
79
- const myItems = results.map((item) => ({
80
- name: item.name, // correct
81
- // name: item.data.name // wrong — REST pattern, not SDK
82
- }));
83
- ---
84
- ```
85
-
86
- > **Common mistake:** `items.queryDataItems(...)` does NOT exist in the
87
- > `@wix/data` SDK. The REST API uses `/items/query` with a `dataCollectionId`
88
- > body field, but the SDK uses `items.query("collectionId")` — a chainable
89
- > QueryBuilder. Do not confuse REST and SDK patterns.
90
-
91
- ## Service Module Template
92
-
93
- Every CMS use case follows the same `src/lib/{usecase}.ts` pattern — a typed interface and query functions that pages import.
94
-
95
- ```typescript
96
- import { items } from "@wix/data";
97
- import { auth } from "@wix/essentials";
98
- import { media } from "@wix/sdk";
99
-
100
- // -- Collection ID (use exact name from Wix dashboard — no namespace for native collections) --
101
- const COLLECTION_ID = "collection-name";
102
-
103
- // -- Typed interface matching collection fields --
104
- export interface CollectionItem {
105
- _id: string;
106
- title: string;
107
- slug: string;
108
- // ...add fields matching your collection schema
109
- coverImage?: string;
110
- }
111
-
112
- // -- Image resolution helper --
113
- function resolveImage(wixImageUrl: string | undefined, width = 800, height = 600): string | undefined {
114
- if (!wixImageUrl) return undefined;
115
- return media.getScaledToFillImageUrl(wixImageUrl, width, height, {});
116
- }
117
-
118
- // -- Query all items --
119
- // Wrap every Wix SDK await in try/catch. If the query throws at SSR, an empty
120
- // array keeps the page renderable instead of crashing it. (Unguarded SSR
121
- // awaits truncate Astro's response stream mid-body — nav renders, then blank.)
122
- export async function queryItems(): Promise<CollectionItem[]> {
123
- try {
124
- const elevatedQuery = auth.elevate(items.query);
125
- const { items: results } = await elevatedQuery(COLLECTION_ID)
126
- .ascending("orderIndex")
127
- .limit(50)
128
- .find();
129
-
130
- return results.map((item) => ({
131
- ...item,
132
- coverImage: resolveImage(item.coverImage),
133
- })) as CollectionItem[];
134
- } catch (err) {
135
- console.error(`[cms:${COLLECTION_ID}] query failed:`, err);
136
- return [];
137
- }
138
- }
139
-
140
- // -- Get single item by slug --
141
- export async function getItemBySlug(slug: string): Promise<CollectionItem | null> {
142
- try {
143
- const elevatedQuery = auth.elevate(items.query);
144
- const { items: results } = await elevatedQuery(COLLECTION_ID)
145
- .eq("slug", slug)
146
- .limit(1)
147
- .find();
148
-
149
- const item = results[0];
150
- if (!item) return null;
151
-
152
- return {
153
- ...item,
154
- coverImage: resolveImage(item.coverImage),
155
- } as CollectionItem;
156
- } catch (err) {
157
- console.error(`[cms:${COLLECTION_ID}] getItemBySlug failed:`, err);
158
- return null;
159
- }
160
- }
161
- ```
162
-
163
- Key details:
164
- - `auth.elevate(items.query)` wraps the query for restricted collections — always use this by default since collection permissions vary
165
- - `media.getScaledToFillImageUrl(url, w, h, {})` resolves `wix:image://` URLs to sized CDN URLs
166
- - Sort by `orderIndex` (ascending) for manually ordered content, or `_createdDate` (descending) for chronological
167
- - The interface must match the collection fields — check the dashboard, don't guess
168
-
169
- ## Multi-Image Resolution
170
-
171
- For collections with image arrays (e.g., gallery images):
172
-
173
- ```typescript
174
- function resolveImages(imageUrls: string[] | undefined, width = 800, height = 600): string[] {
175
- if (!imageUrls || imageUrls.length === 0) return [];
176
- return imageUrls
177
- .map((url) => media.getScaledToFillImageUrl(url, width, height, {}))
178
- .filter(Boolean);
179
- }
180
- ```
181
-
182
- ## Category Filtering Pattern
183
-
184
- Many use cases filter by category via URL search params (server-rendered, no client JS):
185
-
186
- ```astro
187
- ---
188
- const activeCategory = Astro.url.searchParams.get("category");
189
- const allItems = await queryItems();
190
- const filtered = activeCategory
191
- ? allItems.filter((item) => item.category === activeCategory)
192
- : allItems;
193
- const categories = [...new Set(allItems.map((item) => item.category).filter(Boolean))];
194
- ---
195
-
196
- <nav>
197
- <a href="?" class:list={[!activeCategory && "active"]}>All</a>
198
- {categories.map((cat) => (
199
- <a
200
- href={`?category=${encodeURIComponent(cat)}`}
201
- class:list={[activeCategory === cat && "active"]}
202
- >{cat}</a>
203
- ))}
204
- </nav>
205
- ```
206
-
207
- > **Styling note:** Category filter pill styling composes `@theme` tokens as Tailwind utilities at the call site — see `../../shared/STYLING.md`.
208
-
209
- ## Testing
210
-
211
- 1. Confirm the collection exists in the Wix dashboard → CMS (the `seed` scope created it — see `../../cms/CMS_FOUNDATIONS.md`).
212
- 2. Run `npx @wix/cli@latest dev`.
213
- 3. Navigate to the listing page — should show items.
214
- 4. Click an item — should navigate to the detail page.
@@ -1,231 +0,0 @@
1
- # Recipe: FAQ / Knowledge Base
2
-
3
- Build a FAQ page using `@wix/data` — Q&A pairs organized by category with accordion UI and client-side search. Use for frequently asked questions, help centers, or knowledge bases.
4
-
5
- > Read `CMS_FOUNDATIONS.md` (this folder — service module, query patterns, image resolution, elevation) for page-rendering patterns, and `../../cms/CMS_FOUNDATIONS.md` for REST-based seeding.
6
-
7
- ## Collection Schema
8
-
9
- The schema the `seed` scope creates via REST (see `../../cms/CMS_FOUNDATIONS.md`) — fields:
10
-
11
- | Field | Type | Purpose |
12
- |-------|------|---------|
13
- | `question` | Text | The question |
14
- | `slug` | Text | URL-friendly identifier (for anchor links) |
15
- | `answer` | Rich Text | The answer (HTML) |
16
- | `category` | Text | FAQ category (e.g., "Shipping", "Returns") |
17
- | `orderIndex` | Number | Manual sort order within category |
18
- | `published` | Boolean | Publish status |
19
-
20
- ## Files to Create
21
-
22
- | File | Purpose |
23
- |------|---------|
24
- | `src/lib/faq.ts` | Service module — queries, category grouping |
25
- | `src/pages/faq/index.astro` | Single FAQ page with category sections |
26
- | `src/components/FaqSection.tsx` | React island — accordion + search combined |
27
-
28
- > FAQ is a single-page pattern — no detail pages needed.
29
-
30
- ## Implementation
31
-
32
- ### 1. FAQ Service Module (`src/lib/faq.ts`)
33
-
34
- ```typescript
35
- import { items } from "@wix/data";
36
- import { auth } from "@wix/essentials";
37
-
38
- const COLLECTION_ID = "FAQ";
39
-
40
- export interface FaqItem {
41
- _id: string;
42
- question: string;
43
- slug: string;
44
- answer: string;
45
- category: string;
46
- orderIndex: number;
47
- }
48
-
49
- function mapFaqItem(item: Record<string, any>): FaqItem {
50
- return {
51
- _id: item._id,
52
- question: item.question ?? "",
53
- slug: item.slug ?? "",
54
- answer: item.answer ?? "",
55
- category: item.category ?? "General",
56
- orderIndex: item.orderIndex ?? 0,
57
- };
58
- }
59
-
60
- export async function queryFaqItems(): Promise<FaqItem[]> {
61
- const elevatedQuery = auth.elevate(items.query);
62
- const { items: results } = await elevatedQuery(COLLECTION_ID)
63
- .eq("published", true)
64
- .ascending("orderIndex")
65
- .limit(200)
66
- .find();
67
-
68
- return results.map(mapFaqItem);
69
- }
70
-
71
- export function groupByCategory(faqItems: FaqItem[]): Map<string, FaqItem[]> {
72
- return faqItems.reduce((map, item) => {
73
- const cat = item.category || "General";
74
- if (!map.has(cat)) map.set(cat, []);
75
- map.get(cat)!.push(item);
76
- return map;
77
- }, new Map<string, FaqItem[]>());
78
- }
79
- ```
80
-
81
- Key details:
82
- - No image resolution needed — FAQ items are text-only
83
- - `published` filter ensures draft items don't appear
84
- - Higher limit (200) since FAQ items are lightweight
85
- - Update `COLLECTION_ID` to match the exact collection name from the Wix dashboard (no namespace prefix for native collections)
86
-
87
- ### 2. FAQ Section React Island (`src/components/FaqSection.tsx`)
88
-
89
- ```tsx
90
- import { useState } from "react";
91
-
92
- interface FaqItem {
93
- _id: string;
94
- question: string;
95
- slug: string;
96
- answer: string;
97
- category: string;
98
- }
99
-
100
- interface Props {
101
- categories: Array<{ name: string; items: FaqItem[] }>;
102
- }
103
-
104
- export default function FaqSection({ categories }: Props) {
105
- const [search, setSearch] = useState("");
106
- const query = search.toLowerCase().trim();
107
-
108
- const filtered = query
109
- ? categories
110
- .map((cat) => ({
111
- ...cat,
112
- items: cat.items.filter(
113
- (item) =>
114
- item.question.toLowerCase().includes(query) ||
115
- item.answer.toLowerCase().includes(query)
116
- ),
117
- }))
118
- .filter((cat) => cat.items.length > 0)
119
- : categories;
120
-
121
- return (
122
- <div>
123
- <div>
124
- <input
125
- type="text"
126
- placeholder="Search questions..."
127
- value={search}
128
- onChange={(e) => setSearch(e.target.value)}
129
- className="faq-search"
130
- />
131
- </div>
132
-
133
- {filtered.length === 0 && (
134
- <p>No matching questions found.</p>
135
- )}
136
-
137
- {filtered.map((cat) => (
138
- <section key={cat.name} className="faq-section" id={cat.name.toLowerCase().replace(/\s+/g, "-")}>
139
- <h2 className="faq-category">{cat.name}</h2>
140
- <div>
141
- {cat.items.map((item) => (
142
- <details key={item._id} className="faq-item" id={item.slug}>
143
- <summary className="faq-question">
144
- <span>{item.question}</span>
145
- <svg
146
- className="faq-toggle"
147
- xmlns="http://www.w3.org/2000/svg"
148
- viewBox="0 0 24 24"
149
- fill="none"
150
- stroke="currentColor"
151
- strokeWidth="2"
152
- strokeLinecap="round"
153
- strokeLinejoin="round"
154
- >
155
- <polyline points="6 9 12 15 18 9" />
156
- </svg>
157
- </summary>
158
- <div
159
- className="faq-answer"
160
- dangerouslySetInnerHTML={{ __html: item.answer }}
161
- />
162
- </details>
163
- ))}
164
- </div>
165
- </section>
166
- ))}
167
- </div>
168
- );
169
- }
170
- ```
171
-
172
- > **Styling note:** Uses `.faq-search`, `.faq-section`, `.faq-category`, `.faq-item`, `.faq-question`, `.faq-toggle`, `.faq-answer` from the designed component's `<style is:global>` block. See `references/shared/STYLING.md` (FAQ Accordion).
173
-
174
- Key details:
175
- - `<details>/<summary>` for native accordion behavior — no JavaScript needed for open/close
176
- - CSS transition on the chevron via the `.faq-toggle` class
177
- - Client-side search filters across both question and answer text
178
- - `dangerouslySetInnerHTML` for rich text answers (content is from the CMS, not user input)
179
- - Anchor `id` on each category section and question for direct linking
180
-
181
- ### 3. FAQ Page (`src/pages/faq/index.astro`)
182
-
183
- **Layout width:** Center the page column with `container-reading` (from designer `global.css`) or `max-w-6xl mx-auto px-6` when `--container-6xl` exists in `@theme`. **Do not** use `max-w-3xl` unless `--container-3xl` is declared in `@theme` — with only a spacing scale, Tailwind maps `max-w-3xl` to ~5rem and the FAQ collapses to one word per line. See `references/shared/STYLING.md` § "Prose / reading width".
184
-
185
- ```astro
186
- ---
187
- import Layout from "../../layouts/Layout.astro";
188
- import FaqSection from "../../components/FaqSection";
189
- import { queryFaqItems, groupByCategory } from "../../lib/faq";
190
-
191
- const faqItems = await queryFaqItems();
192
- const grouped = groupByCategory(faqItems);
193
- const categories = [...grouped.entries()].map(([name, items]) => ({ name, items }));
194
- ---
195
-
196
- <Layout title="FAQ">
197
- <main>
198
- <div class="container-reading px-6">
199
- <h1>Frequently Asked Questions</h1>
200
- <p>Find answers to common questions below, or use the search to find what you need.</p>
201
-
202
- {categories.length > 1 && (
203
- <nav>
204
- {categories.map((cat) => (
205
- <a
206
- href={`#${cat.name.toLowerCase().replace(/\s+/g, "-")}`}
207
- >{cat.name}</a>
208
- ))}
209
- </nav>
210
- )}
211
-
212
- <FaqSection client:only="react" categories={categories} />
213
- </div>
214
- </main>
215
- </Layout>
216
- ```
217
-
218
- Key details:
219
- - Category jump links in the nav work because `FaqSection` renders matching `id` attributes
220
- - `client:only="react"` — required for search state
221
- - Data is fetched server-side and passed as props to the React island
222
-
223
- ## Testing
224
-
225
- Assumes the `seed` scope has already created the "FAQ" collection and inserted items via REST (see `../../cms/CMS_FOUNDATIONS.md`) — with 6+ FAQ items across 2+ categories, all `published: true`.
226
-
227
- 1. Run `npx @wix/cli@latest dev`
228
- 2. `/faq` — shows all questions grouped by category
229
- 3. Click a question — accordion opens with the answer
230
- 4. Type in search — filters questions in real-time
231
- 5. Click a category jump link — scrolls to that section