@wix/agent-skills 1.35.1 → 1.36.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 (49) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/references/CODE_QUALITY.md +1 -1
  3. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +27 -29
  4. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +1 -1
  5. package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +26 -25
  6. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +12 -42
  7. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +9 -20
  8. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +5 -4
  9. package/skills/wix-app/references/editor-react-component/PARTS.md +1 -1
  10. package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +1 -1
  11. package/skills/wix-app/references/editor-react-component/VECTOR-ART.md +95 -0
  12. package/skills/wix-app/references/editor-react-component/VISUAL-QUALITY.md +39 -0
  13. package/skills/wix-docs/references/CALLING.md +1 -1
  14. package/skills/wix-headless-kit/guides/api-run.md +1 -1
  15. package/skills/wix-headless-kit/install/pins.json +1 -1
  16. package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +1 -1
  17. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +0 -1
  18. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +1 -1
  19. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +0 -1
  20. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +1 -1
  21. package/skills/wix-headless-templates/donations/rest/campaigns.ts +0 -1
  22. package/skills/wix-headless-templates/donations/rest/donate.ts +1 -1
  23. package/skills/wix-headless-templates/events/seed/seed-events.mjs +1 -1
  24. package/skills/wix-headless-templates/faq/INSTRUCTIONS.md +1 -1
  25. package/skills/wix-headless-templates/faq/app/wix/faq/faq.ts +2 -2
  26. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq.ts +2 -2
  27. package/skills/wix-headless-templates/faq/rest/faq.ts +2 -2
  28. package/skills/wix-headless-templates/faq/seed/SEED.md +1 -1
  29. package/skills/wix-headless-templates/faq/seed/read-site.mjs +1 -1
  30. package/skills/wix-headless-templates/faq/seed/seed-faq.mjs +5 -5
  31. package/skills/wix-headless-templates/forms/app/wix/forms/forms.ts +2 -2
  32. package/skills/wix-headless-templates/forms/app/wix/forms/submissions.ts +2 -2
  33. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms.ts +2 -2
  34. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions.ts +2 -2
  35. package/skills/wix-headless-templates/members/seed/read-site.mjs +1 -1
  36. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access.ts +1 -1
  37. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access.ts +1 -1
  38. package/skills/wix-headless-templates/pricing-plans/rest/plan-access.ts +1 -1
  39. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu.ts +0 -1
  40. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu.ts +0 -1
  41. package/skills/wix-headless-templates/restaurants/rest/menu.ts +0 -1
  42. package/skills/wix-headless-templates/shared/rest/client.ts +1 -1
  43. package/skills/wix-headless-templates/shared/seed/site.mjs +2 -1
  44. package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +0 -1
  45. package/skills/wix-manage/references/google-ads/install-and-create-account.md +0 -1
  46. package/skills/wix-manage/references/rich-content/ricos-converter-service.md +1 -1
  47. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +5 -5
  48. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +0 -9
  49. package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/agent-skills",
3
- "version": "1.35.1",
3
+ "version": "1.36.0",
4
4
  "description": "Wix Skills for AI coding agents — versioned npm distribution of the wix/skills content.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -8,7 +8,7 @@ Applies to all generated code across every Wix CLI app extension type. Each per-
8
8
  - Prefer type-narrowing and exhaustive logic over assertions; avoid non-null assertions (`!`) and unsafe casts (`as any`).
9
9
  - Treat optional values, refs, and array indexing results as possibly undefined and handle them explicitly.
10
10
  - Use exhaustive checks for unions (e.g., `switch` with a `never` check) and return total values (no implicit `undefined`).
11
- - Do NOT use `// @ts-ignore` or `// @ts-expect-error`; fix the types or add guards instead.
11
+ - Do NOT use `// @ts-ignore` or `// @ts-expect-error`; fix the types or add guards instead. The one exception is a `// @ts-ignore` directly above an import of a context provider's hook by its `moduleSpecifier`: TypeScript cannot resolve that specifier, because the site's import map supplies it only at runtime.
12
12
 
13
13
  ## Core Principles
14
14
 
@@ -21,18 +21,17 @@ Supplementary files are allowed; keep scaffold roles intact.
21
21
 
22
22
  ## Required Reading (blocking)
23
23
 
24
- Before writing code, open and read in full every reference in the matching
25
- row. An unopened one is a failed run. Open paths directly; never skim or
26
- grep instead.
24
+ Before writing code, read every reference in the matched row in full.
25
+ Unopened references fail the run—open paths directly; no skim or grep.
27
26
 
28
27
  | Scope | Required references |
29
28
  | --- | --- |
30
- | Creating a component | [`REACT-GUIDELINES.md`](editor-react-component/REACT-GUIDELINES.md), [`COMPONENT-CONTRACT.md`](editor-react-component/COMPONENT-CONTRACT.md), [`PARTS.md`](editor-react-component/PARTS.md), [`PROPS-VS-CSS.md`](editor-react-component/PROPS-VS-CSS.md), [`CSS-GUIDELINES.md`](editor-react-component/CSS-GUIDELINES.md), [`DIRECTIONALITY.md`](editor-react-component/DIRECTIONALITY.md), [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md), [`COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md), [`EDITOR-EXTENSION-CONFIGURATION.md`](editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md), [`OVERFLOW.md`](editor-react-component/OVERFLOW.md) |
29
+ | Creating a component | [`REACT-GUIDELINES.md`](editor-react-component/REACT-GUIDELINES.md), [`COMPONENT-CONTRACT.md`](editor-react-component/COMPONENT-CONTRACT.md), [`PARTS.md`](editor-react-component/PARTS.md), [`PROPS-VS-CSS.md`](editor-react-component/PROPS-VS-CSS.md), [`CSS-GUIDELINES.md`](editor-react-component/CSS-GUIDELINES.md), [`VISUAL-QUALITY.md`](editor-react-component/VISUAL-QUALITY.md), [`DIRECTIONALITY.md`](editor-react-component/DIRECTIONALITY.md), [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md), [`COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md), [`EDITOR-EXTENSION-CONFIGURATION.md`](editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md), [`OVERFLOW.md`](editor-react-component/OVERFLOW.md) |
31
30
  | Editing React or JSX | [`REACT-GUIDELINES.md`](editor-react-component/REACT-GUIDELINES.md), [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md) |
32
31
  | Changing public contract, semantic root, or named parts | [`COMPONENT-CONTRACT.md`](editor-react-component/COMPONENT-CONTRACT.md), [`PARTS.md`](editor-react-component/PARTS.md), [`PROPS-VS-CSS.md`](editor-react-component/PROPS-VS-CSS.md) |
33
32
  | Changing public data props or elected root global class | [`COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) |
34
33
  | Item array where only one body is visible | [`COMPONENT-CONTRACT.md`](editor-react-component/COMPONENT-CONTRACT.md), [`PROPS-VS-CSS.md`](editor-react-component/PROPS-VS-CSS.md), [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md), [`DESIGN-STATES.md`](editor-react-component/DESIGN-STATES.md) |
35
- | Creating or changing CSS | [`CSS-GUIDELINES.md`](editor-react-component/CSS-GUIDELINES.md) |
34
+ | Creating or changing CSS | [`CSS-GUIDELINES.md`](editor-react-component/CSS-GUIDELINES.md), [`VISUAL-QUALITY.md`](editor-react-component/VISUAL-QUALITY.md) |
36
35
  | Creating or changing layout/content | [`OVERFLOW.md`](editor-react-component/OVERFLOW.md) |
37
36
  | Root direction contract, direction-sensitive behavior, or `ReactNode` slot | [`DIRECTIONALITY.md`](editor-react-component/DIRECTIONALITY.md) |
38
37
  | Sizing, installation, or manifest overrides | [`EDITOR-EXTENSION-CONFIGURATION.md`](editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md) |
@@ -47,14 +46,13 @@ grep instead.
47
46
  ```
48
47
 
49
48
  Never rerun the scaffold for an existing component.
50
- Write a meaningful `description` in 1-2 plain sentences (max 300 chars): what
51
- the user sees, when to use it, and capabilities that affect that choice.
52
- Don't repeat the name or add implementation details.
49
+ Write a meaningful `description` (max 300 chars, 1-2 sentences): what users see,
50
+ when to use it, and capability tradeoffs—no name repeat or implementation detail.
53
51
 
54
52
  2. **Run the dependency preflight.**
55
53
 
56
54
  ```bash
57
- deps=(@wix/react-component-schema @wix/react-component-utils @wix/editor-react-types)
55
+ deps=(@wix/react-component-schema @wix/react-component-utils @wix/editor-react-types clsx deepmerge-ts)
58
56
  dev=(@babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser 'typescript@<7' @types/eslint-plugin-jsx-a11y jsdom axe-core)
59
57
 
60
58
  node - "${deps[@]}" "${dev[@]}" <<'JS' || {
@@ -63,7 +61,7 @@ grep instead.
63
61
  .map(p => p.replace(/@<7$/, ''))
64
62
  .filter(p => !require.resolve.paths(p)?.some(d => fs.existsSync(path.join(d, p, 'package.json'))));
65
63
  if (missing.length) {
66
- console.error(`Missing dependencies: ${missing.join(', ')}`);
64
+ console.error(`Missing: ${missing.join(', ')}`);
67
65
  process.exit(1);
68
66
  }
69
67
  JS
@@ -74,27 +72,26 @@ grep instead.
74
72
  }
75
73
  ```
76
74
 
77
- 3. **Plan.** Identify props, root, parts, and states; open all required references first.
78
- Use them and the scaffold before inspecting package declarations; inspect
79
- only for undocumented APIs or fields, or typecheck failures. Declarations
80
- govern API shapes; retain editor rules.
75
+ 3. **Plan.** Identify props, root, parts, and states; open required references first.
76
+ Use them and the scaffold before package declarations—only for undocumented APIs
77
+ or typecheck failures. Declarations govern API shapes; keep editor rules.
81
78
 
82
79
  4. **Implement.** Keep props, logic, and styles in their scaffolded editable
83
80
  files. Format edited source files with the app's formatter. Never edit or format `*.generated.ts`.
84
81
 
85
- 5. **Run the accessibility review (mandatory).** Once the JSX is complete, run from the
86
- same folder (`<SKILL_ROOT>` is the directory containing the active `SKILL.md`):
82
+ 5. **Run the a11y review (mandatory).** After JSX, run from the
83
+ same folder (`<SKILL_ROOT>` contains the active `SKILL.md`):
87
84
 
88
85
  ```bash
89
86
  node <SKILL_ROOT>/scripts/scan-a11y-review.cjs src/extensions/site/components/<component-name>
90
87
  ```
91
88
 
92
- Follow [`editor-react-component/ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md); fix and
89
+ Follow [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md); fix and
93
90
  rerun at most twice, then report remaining findings.
94
91
 
95
92
  6. **Configure the editor extension.** For creation or a requested sizing,
96
93
  installation, or manifest change, apply
97
- [`editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md`](editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md)
94
+ [`EDITOR-EXTENSION-CONFIGURATION.md`](editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md)
98
95
  to the extension; otherwise leave it unchanged. Synchronize preview
99
96
  `requiredDataFields` and `rootClassName`.
100
97
 
@@ -105,15 +102,15 @@ grep instead.
105
102
  npx wix build && npx wix generate manifest
106
103
  ```
107
104
 
108
- Run `npx tsc --noEmit`, relevant tests/lint, and the accessibility review.
105
+ Run `npx tsc --noEmit`, relevant tests/lint, and the a11y review.
109
106
  If later edits affect a check, rerun that check. Inspect the manifest when generated; never hand-repair it.
110
107
  Diagnose failures with
111
- [`editor-react-component/MANIFEST-ERRORS.md`](editor-react-component/MANIFEST-ERRORS.md).
108
+ [`MANIFEST-ERRORS.md`](editor-react-component/MANIFEST-ERRORS.md).
112
109
 
113
- For creation/layout changes, complete the routed overflow resize review.
110
+ For creation/layout changes, run the overflow resize review.
114
111
 
115
- 8. **Report.** Summarize files, checks, blockers, unrun checks.
116
- List required references as read/unread; read any unread one and fix first.
112
+ 8. **Report.** Summarize files, checks, blockers, and skipped checks.
113
+ List references read/unread; fix unread before closing.
117
114
 
118
115
  ## Reference Policy
119
116
 
@@ -133,10 +130,11 @@ trigger. Preserve unrelated behavior. References are leaves.
133
130
  | Animation, video, carousel, or other playable/looped/autoplaying content | [`ANIMATED-COMPONENTS.md`](editor-react-component/ANIMATED-COMPONENTS.md), [`COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) |
134
131
  | Site/runtime/editor context hooks needed | [`SITE-CONTEXT-HOOKS.md`](editor-react-component/SITE-CONTEXT-HOOKS.md) (+ [`COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) when design-mode behavior differs) |
135
132
  | Branded, themed, or brand-aware component requested | [`BRANDED-COMPONENTS.md`](editor-react-component/BRANDED-COMPONENTS.md) |
133
+ | Owner-replaceable icon/SVG (not fixed UI glyphs) | [`VECTOR-ART.md`](editor-react-component/VECTOR-ART.md) |
136
134
 
137
135
  ## Non-Negotiables
138
136
 
139
- - React 18 only; do not assume React 19 runtime features.
137
+ - React 18 only; no React 19 runtime features.
140
138
  - Include typed `id`, `className`, `direction`, and `a11y` support.
141
139
  - Elected root: `dir={direction}`, fallback-direction class, logical CSS for
142
140
  direction-sensitive layout.
@@ -148,13 +146,13 @@ trigger. Preserve unrelated behavior. References are leaves.
148
146
  - Named parts: global class, module class, and `elementProps` (root uses
149
147
  top-level props).
150
148
  - Every visible text: a text prop plus a named part; no JSX text literals.
151
- - Native design states: interactive elements only, never a non-interactive root
152
- or part; pair selectors with injected modifiers; toggle custom state classes
153
- from data, each with a matching `:global()` rule.
149
+ - Native design states: interactive elements only; pair selectors with injected
150
+ modifiers. Custom states need a class toggle from logic or data, or a root prop
151
+ trigger; styled states need matching `:global()` rules.
154
152
  - Open/close/reveal: props-only root
155
153
  `isOpen: ElementState<boolean>` synced to state; module classes, no `--open` class.
156
- - Single-visible-body arrays: `name` per item, `ActiveItemIndex<'prop'>`, render
157
- all bodies, hide inactive accessibly.
154
+ - Single-visible-body arrays: `ActiveItemIndex<'prop'>`, render all bodies,
155
+ hide inactive accessibly; item `name` only when rendered.
158
156
  - No arrays inside array items; keep group fields flat (no object props).
159
157
  - Autoplay/loop: play/pause control, honor reduced motion, suppress autoplay in
160
158
  editor design mode.
@@ -197,7 +197,7 @@ Wire the named part completely:
197
197
  <button
198
198
  type="button"
199
199
  {...elementProps?.myAnimationPlayButton}
200
- className={classNames(
200
+ className={clsx(
201
201
  'my-animation-play-button',
202
202
  styles.playButton,
203
203
  elementProps?.myAnimationPlayButton?.className,
@@ -43,12 +43,12 @@ Rules:
43
43
  when requested. Keep implementation handlers internal.
44
44
  - Use `Array<T>`, not `T[]`, for exported arrays.
45
45
  - Use a native link for a CTA with a real `href`, or a native button for an
46
- action. Never fall back to `href="#"`: it has no meaningful destination.
46
+ action. Never use `href="#"`: it has no destination.
47
47
 
48
48
  ## Numeric Range Constraints
49
49
 
50
- Use inline `@min` and `@max` JSDoc tags for fixed-domain numeric props. Manifest
51
- generation reads the tags automatically.
50
+ Use inline `@min`, `@max` JSDoc tags for fixed-domain numeric props. Manifest
51
+ generation reads them automatically.
52
52
 
53
53
  ```ts
54
54
  export type RatingProps = {
@@ -57,12 +57,12 @@ export type RatingProps = {
57
57
  };
58
58
  ```
59
59
 
60
- Use fixed bounds for ratings, percentages, playback speed, columns, etc. Omit
61
- for open-ended values or indices tied to a dynamic collection.
60
+ Use for ratings, percentages, columns; omit for open-ended values or indices
61
+ tied to a dynamic collection.
62
62
 
63
63
  ## Named Parts and `elementProps`
64
64
 
65
- Treat an independently editable inner element as a named part. Wiring rules:
65
+ An independently editable inner element is a named part:
66
66
 
67
67
  - Root receives top-level `id`, `className`, `direction`, `a11y` — no
68
68
  `elementProps` entry.
@@ -75,7 +75,7 @@ On a raw HTML element, spread the entry and explicitly merge its injected
75
75
  ```tsx
76
76
  <a
77
77
  {...elementProps?.planCardCta}
78
- className={classNames(
78
+ className={clsx(
79
79
  'plan-card-cta',
80
80
  styles.cta,
81
81
  elementProps?.planCardCta?.className,
@@ -118,12 +118,12 @@ does not inherit the component's direction.
118
118
 
119
119
  ### Array Props
120
120
 
121
- Array elements must be objects with named keys for semantics and extensibility.
121
+ Array elements must be objects with named keys for semantics and extensibility. Always declare array-item fields optional.
122
122
 
123
123
  ```ts
124
124
  type GalleryProps = {
125
- images: Array<{ image: Image; caption?: string }>;
126
- tags: Array<{ label: string }>;
125
+ images: Array<{ image?: Image; caption?: string }>;
126
+ tags: Array<{ label?: string }>;
127
127
  };
128
128
  ```
129
129
 
@@ -131,22 +131,25 @@ Do not export `Array<string>`, `Array<Image>`, `Array<Array<T>>`, or nested
131
131
  arrays inside items.
132
132
 
133
133
  The parent owns the array. Item sub-components receive one item, not the
134
- collection. Do not add an `id` field for React keys—use the item's semantic
135
- named fields instead. Prefer: (1) a stable unique field (`value`, `uri`, `label`, …), (2)
136
- else slug a user-facing string (`name`, `label`), (3) else the array index.
134
+ collection. Do not add an `id` field for React keys—use semantic named fields.
135
+ Prefer: (1) a stable unique field (`value`, `uri`, `label`, …), (2) else slug a
136
+ user-facing string (`name`, `label`), (3) else the index.
137
137
 
138
138
  ## Active-Item Components
139
139
 
140
- Apply this contract when an array-driven UI shows one item body at a time (tabs,
141
- slides, steps). Skip for always-visible lists, multi-select, or multi-expand.
140
+ Apply when an array-driven UI shows one item body at a time (tabs, slides,
141
+ steps). Skip for always-visible lists, multi-select, or multi-expand.
142
142
 
143
- - Every item needs `name: string` (used for hat-selector labels).
143
+ - Declare `name` only when a part renders it; the hat shows `name`, else
144
+ "Item N". A visible per-item trigger label (tabs, steps) is the `name` field.
145
+ Slides, cards, carousels with no per-item label: no `name`. Never declare an
146
+ item field no part renders.
144
147
  - **Import and use `ActiveItemIndex<'arrayPropName'>`** from
145
148
  `@wix/react-component-utils`. The type argument must match the array prop name
146
149
  exactly, and `defaultProps` must set the index to `0`.
147
- - Render all bodies with `.map()`. Active body gets --active; inactive bodies get functional CSS visibility, aria-hidden, and inert.
148
- - With React 18 types, spread `...(!isActive ? { inert: 'true' } : {})` onto an inactive body; this emits the boolean HTML attribute without a TypeScript prop error. Use the app's typecheck instead of a scratch TypeScript project.
149
- - Provide keyboard navigation and the matching ARIA pattern.
150
+ - Render all bodies with `.map()`. Active body gets `--active`; inactive bodies get CSS visibility, `aria-hidden`, and `inert`.
151
+ - React 18 types: spread `...(!isActive ? { inert: 'true' } : {})` onto an inactive body; it emits the boolean attribute without a type error. Typecheck with the app, not a scratch project.
152
+ - Keyboard navigation and the matching ARIA pattern.
150
153
 
151
154
  ```ts
152
155
  import type { A11y, Direction } from '@wix/editor-react-types';
@@ -180,7 +183,7 @@ one representation of it.
180
183
  Common fields in the installed types: `Image` has required `url: string` and
181
184
  optional `uri`, `alt`, `width`, `height`; `Link` has optional `href`, `target`
182
185
  (`'_self' | '_blank'`), and `rel`. Use `image.url` for `<img src>`,
183
- `image.alt` for its alternative text, and `link.href` for `<a href>`.
186
+ `image.alt` for alt text, and `link.href` for `<a href>`.
184
187
 
185
188
  Do not represent media as a URL/source string or split its metadata across
186
189
  primitive props. Preserve the media object through the public contract so the
@@ -216,7 +219,7 @@ export const defaultProps = {
216
219
  ```
217
220
 
218
221
  Use distinct Wix-hosted defaults per image slot; keep all fallback data in
219
- `defaultProps` so rendering never hardcodes a second fallback in JSX.
222
+ `defaultProps` so JSX never hardcodes a second fallback.
220
223
 
221
224
  Use this pool in order, cycling only when more than five defaults are needed:
222
225
 
@@ -228,8 +231,6 @@ Use this pool in order, cycling only when more than five defaults are needed:
228
231
  | 4 | `11062b_45e67783d39c4963ab9e4fc418173233~mv2.jpg` | Abstract pink waves |
229
232
  | 5 | `11062b_4c11f014b0d04948b2e6f554076bc40a~mv2.jpg` | Coastal village aerial |
230
233
 
231
- For one image use entry 1; for multiple slots use a different entry each.
232
-
233
234
  ## Internal File Splitting
234
235
 
235
236
  Split independently understandable units when it makes the main component easier
@@ -248,7 +249,7 @@ component-name/
248
249
  └── component-name.module.css
249
250
  ```
250
251
 
251
- Do not extract tiny fragments merely to satisfy a line-count threshold.
252
+ Do not extract tiny fragments just to pass a line-count threshold.
252
253
 
253
254
  ## Checklist
254
255
 
@@ -256,7 +257,7 @@ Do not extract tiny fragments merely to satisfy a line-count threshold.
256
257
  - [ ] Props hold authored data/behavior; derived values stay internal.
257
258
  - [ ] Fixed-domain numeric props use `@min`/`@max` JSDoc tags.
258
259
  - [ ] Named inner parts have `elementProps` wiring; leaf components avoid exported `children`.
259
- - [ ] One-body-visible arrays use the active-item contract and render all bodies.
260
+ - [ ] One-body-visible arrays use the active-item contract and render all bodies; `name` only when a part renders it.
260
261
  - [ ] Array elements are objects with semantic named fields. No separate `id` field added to item types; React keys use item fields (stable unique → slug → index), not a typed `id`.
261
262
  - [ ] Authored media uses the corresponding Wix media type, not URL/source strings or flattened metadata.
262
263
  - [ ] Defaults live only in the props file (no JSX fallbacks).
@@ -3,9 +3,6 @@
3
3
  Use these rules for the scaffolded `<component-name>.module.css` file and any
4
4
  colocated CSS Modules owned by internal sub-components.
5
5
 
6
- **Visual intent.** When the request specifies how the component should look —
7
- mood, palette, layout style, or a reference — follow that direction. Default to a modern, refined look — intentional layout, pleasing proportions, polished and deliberate styling.
8
-
9
6
  ## Contents
10
7
 
11
8
  - [Classes and Named Parts](#classes-and-named-parts)
@@ -15,12 +12,11 @@ mood, palette, layout style, or a reference — follow that direction. Default t
15
12
  - [Responsiveness and Direction](#responsiveness-and-direction)
16
13
  - [Editable Values](#editable-values)
17
14
  - [Interaction and Motion](#interaction-and-motion)
18
- - [Default Visual Quality](#default-visual-quality)
19
15
  - [Checklist](#checklist)
20
16
 
21
17
  ## Classes and Named Parts
22
18
 
23
- Apply classes with `classnames`:
19
+ Apply classes with `clsx` (`import clsx from 'clsx'`):
24
20
 
25
21
  | Element | Classes |
26
22
  | --- | --- |
@@ -37,7 +33,7 @@ spread its `elementProps` entry and merge the injected class.
37
33
  ```tsx
38
34
  <h2
39
35
  {...elementProps?.profileCardHeading}
40
- className={classNames(
36
+ className={clsx(
41
37
  'profile-card-heading',
42
38
  styles.heading,
43
39
  elementProps?.profileCardHeading?.className,
@@ -71,11 +67,11 @@ Do not use compound selectors, tag selectors, child/sibling combinators, or CSS
71
67
  nesting for editable styling. They make an element's editor surface depend on
72
68
  DOM context.
73
69
 
74
- Narrow exception: a relationship selector may control behavior-only visibility
75
- when the behavior requires ancestor state and the rule does not define editable
76
- appearance. A hover-revealed play/pause control is the canonical case. Keep all
77
- of the control's size, color, border, typography, and state styling on its own
78
- single-class rules.
70
+ Narrow exceptions, neither defining editable appearance: a relationship
71
+ selector for behavior-only visibility that needs ancestor state (a
72
+ hover-revealed play/pause control), and an icon part's layout-only `svg` rule
73
+ (`VECTOR-ART.md`). Keep each control's size, color, border, typography, and state
74
+ styling on its own single-class rules.
79
75
 
80
76
  ## Root Layout
81
77
 
@@ -218,11 +214,14 @@ per icon (`--start-icon-size`), applied via `inline-size`/`block-size` and
218
214
  }
219
215
  ```
220
216
 
217
+ - **Replaceable**: follow `VECTOR-ART.md`.
218
+
221
219
  ## Interaction and Motion
222
220
 
223
221
  - Set `pointer-events: auto` on the root and each interactive element.
224
- - Pair native interaction selectors with the matching editor-injected global
225
- state modifier. Toggle custom state modifiers from component data.
222
+ - Pair native design states (`hover`, `focus`, `disabled`, `invalid`) with
223
+ the matching editor-injected global modifier. Custom modifiers need a class
224
+ toggle from component logic/data or a root prop trigger (`DESIGN-STATES.md` §5).
226
225
  - Do not add decorative transitions or animations.
227
226
  - When motion is functionally required, list the exact transition properties;
228
227
  never use `transition: all` or an implicit `all` shorthand.
@@ -233,32 +232,6 @@ per icon (`--start-icon-size`), applied via `inline-size`/`block-size` and
233
232
  }
234
233
  ```
235
234
 
236
- ## Default Visual Quality
237
-
238
- Create a clear hierarchy with at least two techniques that fit the component:
239
- a defined surface, border or soft shadow, type scale or weight, spacing, an
240
- accent, or visible interaction states. Use these neutral defaults unless the
241
- request or existing design provides better values:
242
-
243
- - 16px or larger body text, 14px or larger labels, and 600–700 weight for titles
244
- - 8–16px spacing inside controls and 16–32px spacing inside containers
245
- - 8–12px corner radii for cards and controls; `50%` for circular media
246
- - a subtle border or soft shadow when a card, panel, or control needs separation
247
- - touch targets at least 44 by 44px and visible keyboard focus states
248
-
249
- ### Foreground and Background Ownership
250
-
251
- If the component is a self-contained block (card, panel, banner, accordion item), give the root a background. An inline control meant to blend in (link, ghost button, icon button) may leave it transparent.
252
-
253
- - On a transparent root, don't hardcode text or icon colors; inherit them from the parent.
254
- - Set the background and main text/icon color together on the same element. Any secondary text (captions, hints, icons) must still be readable against that same background.
255
- - If an interactive state changes the background, set the foreground color in that state too. Don't assume a color inherited from a parent or from a previous state will still look right on the new background.
256
- - In every default and interactive state, meet WCAG AA contrast: 4.5:1 for body text and 3:1 for large text and UI controls.
257
-
258
- A neutral owned surface may use a light background with dark primary and
259
- secondary foregrounds, plus one accessible accent. The exact colors are not a
260
- contract; the contrast relationship is.
261
-
262
235
  ## Checklist
263
236
 
264
237
  - [ ] The scaffolded component and each extracted internal sub-component own
@@ -273,8 +246,5 @@ contract; the contrast relationship is.
273
246
  - [ ] Every part that sets `font-size` also sets `font-family`, on the part that
274
247
  should own the typography control.
275
248
  - [ ] Interactive elements expose pointer events and accessible design states.
276
- - [ ] Visual containers have deliberate hierarchy rather than bare scaffolding.
277
- - [ ] Every explicit foreground has a known contrasting background; transparent
278
- components inherit foregrounds from their host.
279
249
  - [ ] No unexposed descendant paints an opaque surface; promote it to a named
280
250
  part instead.
@@ -6,16 +6,6 @@ eligible interaction (`hover`, `focus`, `disabled`, `invalid`) or per a
6
6
  selectable value in its data (`selected`, `active`, `checked`, …). Author states
7
7
  in the component's `.tsx` and `.module.css`.
8
8
 
9
- ## Contents
10
-
11
- - [Choose Supported States](#1-choose-supported-states)
12
- - [Name the State Class](#2-name-the-state-class)
13
- - [Author CSS](#3-author-css)
14
- - [Wire React](#4-wire-react)
15
- - [Use Prop-Triggered States on the Root Only](#5-use-prop-triggered-states-on-the-root-only)
16
- - [Expose Open/Collapsed Toggles](#6-expose-opencollapsed-toggles)
17
- - [Checklist](#checklist)
18
-
19
9
  ## 1. Choose Supported States
20
10
 
21
11
  | Element | Author these states |
@@ -48,7 +38,7 @@ Flat: the element's own global class + `--<state>`. Because inner-part
48
38
  global classes are prefixed with the component name, the state class is prefixed too —
49
39
  e.g. `pricing-card-cta--hover`, `pricing-card-plan-row--selected`. Never bare
50
40
  (`cta--hover` collides with other components) and never
51
- nested (`card__row--selected`).
41
+ nested (`card__row--selected`). Add it only to an element that has its base class.
52
42
 
53
43
  ## 3. Author CSS
54
44
 
@@ -58,7 +48,7 @@ state selector. When both set the same property, write the state selector
58
48
  value as the part's resting `defaultValue`, even though runtime CSS renders
59
49
  correctly.
60
50
 
61
- - **Native design state** — pair the pseudo-class with the `:global` modifier.
51
+ - **Native (`hover`, `focus`, `disabled`, `invalid`)** — pair the pseudo-class with the `:global` modifier.
62
52
  Every exposed native state needs both selectors in the same rule; do not
63
53
  split the pair across states. A standalone `:focus-visible` accessibility
64
54
  rule on a non-input control is not an editor design state and has no global
@@ -101,10 +91,9 @@ The local static accessibility scan cannot measure rendered color contrast.
101
91
  - **Native** — render the correct interactive element (`<button>`, an
102
92
  interactive `role`, or a handler). No custom state class is needed, but the
103
93
  element must still satisfy the accessibility contract for its semantics.
104
- - **Custom** — toggle the global state class from the element's data, except
105
- for open/collapsed content (§6). Every state class toggled in TSX needs a
106
- matching `:global()` rule in §3; without one the manifest generator silently
107
- drops the state.
94
+ - **Custom** — each `:global()` state rule must have a matching class toggle
95
+ driven by component logic or data, or a root prop trigger (§5). Open/collapsed
96
+ content uses §6.
108
97
  - **Inner elements** — every named inner element gets an `elementProps` entry;
109
98
  spread it so editor-driven states reach it. On a raw HTML element also merge
110
99
  `elementProps?.<key>.className` inline; on a skill-built sub-component the
@@ -115,14 +104,14 @@ The local static accessibility scan cannot measure rendered color contrast.
115
104
  <button
116
105
  type="button"
117
106
  {...elementProps?.pricingCardCta}
118
- className={classNames('pricing-card-cta', styles.cta, elementProps?.pricingCardCta?.className)}
107
+ className={clsx('pricing-card-cta', styles.cta, elementProps?.pricingCardCta?.className)}
119
108
  >
120
109
  {label}
121
110
  </button>
122
111
 
123
112
  <li
124
113
  {...elementProps?.pricingCardPlanRow}
125
- className={classNames(
114
+ className={clsx(
126
115
  'pricing-card-plan-row',
127
116
  styles.planRow,
128
117
  row.selected && 'pricing-card-plan-row--selected',
@@ -205,7 +194,7 @@ React.useEffect(() => setOpen(Boolean(isOpen)), [isOpen]);
205
194
  {...elementProps?.infoPanelContent}
206
195
  aria-hidden={!open}
207
196
  {...(!open && { inert: '' })}
208
- className={classNames(
197
+ className={clsx(
209
198
  'info-panel-content',
210
199
  styles.content,
211
200
  open && styles.contentOpen,
@@ -229,7 +218,7 @@ React.useEffect(() => setOpen(Boolean(isOpen)), [isOpen]);
229
218
  - [ ] Non-input controls retain a standalone `:focus-visible` keyboard indicator.
230
219
  - [ ] Custom state classes are flat, global, and prefixed by component and part.
231
220
  - [ ] Named inner parts spread and merge their `elementProps` entry.
232
- - [ ] Every state class toggled in TSX has a matching `:global()` CSS rule.
221
+ - [ ] Custom CSS state rules and their class toggles or root prop triggers match.
233
222
  - [ ] `ElementState<boolean>` is used only for a component-level root state.
234
223
  - [ ] An open/collapsed component exposes a props-only `isOpen` root state,
235
224
  syncs internal state from it, always renders its content, and adds no
@@ -23,12 +23,13 @@ After each fix, re-run `npx wix build && npx wix generate manifest` to confirm.
23
23
  ## Warnings
24
24
 
25
25
  The build can also print non-fatal warnings such as
26
- `[css] … styles selectors that matched no element in the extraction render`.
26
+ `.item is missing from initial render (<file>)`.
27
27
  Read every warning and fix it; this is mandatory, with one exception below.
28
28
 
29
- - **A part's own class** (`.errorMessage`, `.item`) means the part is not
30
- mounted in the extraction render. Keep it mounted per `PARTS.md`, then
31
- re-run build and manifest generation.
29
+ - **A `.tsx` file in parentheses**, or **a part's own class** (`.errorMessage`,
30
+ `.item`) in a `.css` file, means the part is not mounted in the extraction
31
+ render. Keep it mounted and hide it with `hidden` or CSS per `PARTS.md`,
32
+ then re-run build and manifest generation.
32
33
  - **A class applied only by state** (`.contentOpen` from `open && styles.contentOpen`)
33
34
  is expected: the part is mounted and only the state look is absent. Leave the
34
35
  markup and CSS unchanged; do not force the state on or remove the styling.
@@ -71,7 +71,7 @@ const item = current ?? placeholderItem; // placeholder shows only while hidden
71
71
  <div hidden={phase !== 'question'}>
72
72
  <h3
73
73
  {...elementProps?.quizQuestion}
74
- className={classNames('quiz-question', styles.question, elementProps?.quizQuestion?.className)}
74
+ className={clsx('quiz-question', styles.question, elementProps?.quizQuestion?.className)}
75
75
  >
76
76
  {item.question}
77
77
  </h3>
@@ -32,7 +32,7 @@ Use this pattern:
32
32
  ```tsx
33
33
  <div
34
34
  {...elementProps?.audioPlayerProgressBar}
35
- className={classNames(
35
+ className={clsx(
36
36
  'audio-player-progress-bar',
37
37
  styles.progressBar,
38
38
  elementProps?.audioPlayerProgressBar?.className,
@@ -0,0 +1,95 @@
1
+ # Vector Art
2
+
3
+ Use this reference when a component shows an icon or other SVG the site owner
4
+ can replace. Fixed glyphs stay inline per
5
+ CSS-GUIDELINES.md "SVG Icons".
6
+
7
+ ## The Prop
8
+
9
+ Import `VectorArt` from `@wix/editor-react-types`. All fields are required; keep
10
+ the whole object, never flatten it to a URL string.
11
+
12
+ Declare it at the top level or as an array-item field, never in `elementProps`,
13
+ which stays `className` only:
14
+
15
+ ```ts
16
+ export type FeatureRowProps = {
17
+ icon?: VectorArt;
18
+ elementProps?: { featureRowIcon?: { className?: string } };
19
+ };
20
+ ```
21
+
22
+ ## Render and Style
23
+
24
+ The icon is a named part per `PARTS.md`. Inject `svgContent` unmodified (no
25
+ `.replace()` or added attributes). Mark it `aria-hidden="true"` beside a visible label, or name the
26
+ control with `a11y.ariaLabel` per `ACCESSIBILITY.md`.
27
+
28
+ ```tsx
29
+ {icon && (
30
+ <span
31
+ {...elementProps?.featureRowIcon}
32
+ className={clsx('feature-row-icon', styles.icon, elementProps?.featureRowIcon?.className)}
33
+ aria-hidden="true"
34
+ dangerouslySetInnerHTML={{ __html: icon.svgContent }}
35
+ />
36
+ )}
37
+ ```
38
+
39
+ Declare the controls per CSS-GUIDELINES.md "SVG Icons", plus `--icon-rotation`
40
+ via `rotate`. Add no border, background, or padding.
41
+
42
+ ```css
43
+ .icon {
44
+ --icon-size: 24px;
45
+ --icon-color: #116dff;
46
+ --icon-rotation: 0deg;
47
+ display: block;
48
+ inline-size: var(--icon-size);
49
+ block-size: var(--icon-size);
50
+ fill: var(--icon-color);
51
+ rotate: var(--icon-rotation);
52
+ }
53
+
54
+ .icon svg {
55
+ display: block;
56
+ inline-size: 100%;
57
+ block-size: 100%;
58
+ }
59
+ ```
60
+
61
+ With several icons, give each part its own class and prefixed properties;
62
+ shared names merge into one control. Only the property-free `svg` rule may be
63
+ shared (`.startIcon svg, .endIcon svg`).
64
+
65
+ ## Defaults
66
+
67
+ Populate all six fields in `defaultProps`; keep them there, with no second
68
+ fallback in JSX. Never invent a `uri` or use a `data:` URI.
69
+
70
+ ```ts
71
+ export const defaultProps = {
72
+ icon: {
73
+ uri: '417ddd_00f94d35a8f84b959241a5d4293ee772.svg',
74
+ viewBox: '0 0 200 200',
75
+ contentBox: '10 10 180 180',
76
+ colors: {},
77
+ contentType: 'shape',
78
+ svgContent:
79
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" data-type="shape"><path d="M100 190c49.706 0 90-40.294 90-90s-40.294-90-90-90-90 40.294-90 90 40.294 90 90 90"/></svg>',
80
+ },
81
+ } as const satisfies Omit<FeatureRowProps, 'id' | 'className'>;
82
+ ```
83
+
84
+ For further slots substitute `uri` and the path `d` (same `viewBox` and `contentBox`):
85
+
86
+ | `uri` | Shape | path `d` |
87
+ | --- | --- | --- |
88
+ | `417ddd_3d6ddf28b43e45499ea8557b8d963c79.svg` | Arch | `M100 10c49.704 0 90 37.654 90 84.102V190H10V94.102C10 47.654 50.294 10 100 10` |
89
+ | `417ddd_c4e65c20d3844ffd97c9b2551ce7d269.svg` | Heptagon | `m100 10 72.174 35.651L190 125.76 140.054 190H59.946L10 125.759l17.826-80.108z` |
90
+
91
+ ## Checklist
92
+
93
+ - [ ] A replaceable icon is a `VectorArt` prop, not an inline `<svg>` or URL string.
94
+ - [ ] Each icon is its own named part injecting `svgContent` unmodified, with prefixed `--icon-*` properties.
95
+ - [ ] `defaultProps` carries all six fields with a `uri` from the pool.
@@ -0,0 +1,39 @@
1
+ # Visual Quality
2
+
3
+ Use this reference for a component's default look: hierarchy, spacing, and
4
+ foreground/background contrast.
5
+
6
+ **Visual intent.** When the request specifies how the component should look —
7
+ mood, palette, layout style, or a reference — follow that direction. Default to a modern, refined look — intentional layout, pleasing proportions, polished and deliberate styling.
8
+
9
+ ## Default Visual Quality
10
+
11
+ Create a clear hierarchy with at least two techniques that fit the component:
12
+ a defined surface, border or soft shadow, type scale or weight, spacing, an
13
+ accent, or visible interaction states. Use these neutral defaults unless the
14
+ request or existing design provides better values:
15
+
16
+ - 16px or larger body text, 14px or larger labels, and 600–700 weight for titles
17
+ - 8–16px spacing inside controls and 16–32px spacing inside containers
18
+ - 8–12px corner radii for cards and controls; `50%` for circular media
19
+ - a subtle border or soft shadow when a card, panel, or control needs separation
20
+ - touch targets at least 44 by 44px and visible keyboard focus states
21
+
22
+ ### Foreground and Background Ownership
23
+
24
+ If the component is a self-contained block (card, panel, banner, accordion item), give the root a background. An inline control meant to blend in (link, ghost button, icon button) may leave it transparent.
25
+
26
+ - On a transparent root, don't hardcode text or icon colors; inherit them from the parent.
27
+ - Set the background and main text/icon color together on the same element. Any secondary text (captions, hints, icons) must still be readable against that same background.
28
+ - If an interactive state changes the background, set the foreground color in that state too. Don't assume a color inherited from a parent or from a previous state will still look right on the new background.
29
+ - In every default and interactive state, meet WCAG AA contrast: 4.5:1 for body text and 3:1 for large text and UI controls.
30
+
31
+ A neutral owned surface may use a light background with dark primary and
32
+ secondary foregrounds, plus one accessible accent. The exact colors are not a
33
+ contract; the contrast relationship is.
34
+
35
+ ## Checklist
36
+
37
+ - [ ] Visual containers have deliberate hierarchy rather than bare scaffolding.
38
+ - [ ] Every explicit foreground has a known contrasting background; transparent
39
+ components inherit foregrounds from their host.
@@ -68,7 +68,7 @@ Append `.md` to read:
68
68
  - [`rest-api-authentication`](https://dev.wix.com/docs/api-reference/articles/authentication/rest-api-authentication) — headers, token kinds
69
69
  - [`retrieve-tokens`](https://dev.wix.com/docs/api-reference/business-management/headless/authentication/retrieve-tokens) — the `/oauth2/token` contract, all grant types
70
70
  - [`about-authentication`](https://dev.wix.com/docs/go-headless/authentication/about-authentication) — visitor vs member sessions
71
- - [`create-an-oauth-app-for-visitors-and-members`](https://dev.wix.com/docs/go-headless/getting-started/setup/authentication/create-an-oauth-app-for-visitors-and-members) — where the client id comes from
71
+ - [`create-oauth-app`](https://dev.wix.com/docs/api-reference/business-management/headless/oauth-apps/create-oauth-app) — where the client id comes from
72
72
  - [`set-up-a-headless-client`](https://dev.wix.com/docs/go-headless/authentication/setup/set-up-a-headless-client) — wiring the client
73
73
 
74
74
  ## Dynamic Site Context — "what IS this site?"
@@ -69,7 +69,7 @@ visitor tokens only, which cover what a visitor may see and nothing here.
69
69
 
70
70
  Unchanged from SKILL.md step 2 and its Verticals table: the brief names the business, the table
71
71
  names the solutions it needs. Read each solution's `{TEMPLATES}/{solution}/INSTRUCTIONS.md` for
72
- what it covers and `{TEMPLATES}/{solution}/seed/SEED.md` for what a seeded site holds.
72
+ what it covers and `{TEMPLATES}/{solution}/seed/SEED.md` (`{solution}` is the template folder name, e.g. `storefront`, `bookings`) for what a seeded site holds.
73
73
 
74
74
  A brief that needs no solution (a game, a landing page, a tool) is a run of two steps: the site
75
75
  (step 2, with no `seedOptions`) and the frontend (step 5). No apps, no seed.
@@ -3,6 +3,6 @@
3
3
  "@wix/create-new": "0.0.124",
4
4
  "typescript": "5.8.3",
5
5
  "templates": {
6
- "ref": "v1.35.1"
6
+ "ref": "v1.36.0"
7
7
  }
8
8
  }
@@ -118,7 +118,7 @@ export async function installBlogApp(ctx) {
118
118
 
119
119
  // Every post create needs a REAL author memberId — a fabricated id fails with
120
120
  // "memberIds ... do not exist". A provisioned site has the owner as members[0].
121
- // docs: https://dev.wix.com/docs/api-reference/crm/members-contacts/members/members/list-members.md
121
+ // docs: https://dev.wix.com/docs/api-reference/crm/members-contacts/members/member-management/members/list-members.md
122
122
  export async function getAuthorMemberId(ctx) {
123
123
  const r = await req(ctx, "/members/v1/members?fieldsets=PUBLIC&paging.limit=1", { method: "GET" });
124
124
  const id = r.members?.[0]?.id;
@@ -22,7 +22,6 @@ const settingsApi = wixModule(ecommerceSettings);
22
22
  // The metrics list is EMPTY on a campaign nobody has donated to yet, and the campaign entity carries
23
23
  // formatted amounts but no currency code — so a fresh site would format nothing. The site's currency
24
24
  // comes from the eCommerce settings then (BUSINESS_INFO), read once per process; "" when refused.
25
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
26
25
  let siteCurrencyPromise: Promise<string> | null = null;
27
26
  function siteCurrency(): Promise<string> {
28
27
  siteCurrencyPromise ??= settingsApi
@@ -6,7 +6,7 @@
6
6
  // (shared with the REST twin); this file is the transport only. Copy as-is.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { cartV2 as cartV2Module, orders as ordersModule } from "@wix/ecom";
11
11
  import { redirects as redirectsModule } from "@wix/redirects";
12
12
  import { wixModule } from "../sdk";
@@ -22,7 +22,6 @@ const settingsApi = wixModule(ecommerceSettings);
22
22
  // The metrics list is EMPTY on a campaign nobody has donated to yet, and the campaign entity carries
23
23
  // formatted amounts but no currency code — so a fresh site would format nothing. The site's currency
24
24
  // comes from the eCommerce settings then (BUSINESS_INFO), read once per process; "" when refused.
25
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
26
25
  let siteCurrencyPromise: Promise<string> | null = null;
27
26
  function siteCurrency(): Promise<string> {
28
27
  siteCurrencyPromise ??= settingsApi
@@ -6,7 +6,7 @@
6
6
  // (shared with the REST twin); this file is the transport only. Copy as-is.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { cartV2 as cartV2Module, orders as ordersModule } from "@wix/ecom";
11
11
  import { redirects as redirectsModule } from "@wix/redirects";
12
12
  import { wixModule } from "../sdk";
@@ -16,7 +16,6 @@ const BASE = "/donation-campaigns/v2/donation-campaigns";
16
16
  // A campaign nobody has donated to yet has no metrics entry, and the entity carries no currency code:
17
17
  // the site's currency then comes from the eCommerce settings, read once.
18
18
  // GET /_api/ecommerce-settings/v1/ecommerce-settings?fields=BUSINESS_INFO → { ecommerceSettings: { businessInfo: { currency } } }
19
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
20
19
  let siteCurrencyPromise: Promise<string> | null = null;
21
20
  function siteCurrency(): Promise<string> {
22
21
  siteCurrencyPromise ??= wixRequest<Raw>("/_api/ecommerce-settings/v1/ecommerce-settings", { method: "GET", query: { fields: ["BUSINESS_INFO"] } })
@@ -6,7 +6,7 @@
6
6
  // order yourself, never hand-build a checkout URL.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { wixRequest } from "../../shared/rest/client.js";
11
11
  import {
12
12
  cartBody,
@@ -85,7 +85,7 @@ function buildRegistration(ev) {
85
85
  // Forms API AFTER the event exists (Create Event ignores form.controls; probed live 2026-09-28). The
86
86
  // control lands as a count input (options "0".."N") plus a names list capped at N — the shape the
87
87
  // site's form reader (events-core toRsvpForm) reads its max from — and takes effect at once.
88
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/forms/add-control.md
88
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/form/add-control.md
89
89
  export async function addGuestControl(ctx, eventId, guests) {
90
90
  const n = Number(guests);
91
91
  if (!Number.isInteger(n) || n < 1) return false;
@@ -296,7 +296,7 @@ without telling the owner.
296
296
 
297
297
  ## Verification caveats
298
298
 
299
- The FAQ API's reference exists (`https://dev.wix.com/docs/rest/business-management/faq-app/…`) and the
299
+ The FAQ API's reference exists (`https://dev.wix.com/docs/api-reference/business-management/faq-app/…`) and the
300
300
  shipped calls follow it: `POST /faq/v2/categories/query`, `POST /faq/v2/question-entries/query`, the
301
301
  `RICH_CONTENT` content format and the `SHARE_LINKS` field set. Not confirmed on a live site, and
302
302
  guarded in the code:
@@ -3,8 +3,8 @@
3
3
  // rules and mappers live in ./faq-core (shared with the REST twin in templates/faq/rest/); this file
4
4
  // is the transport only. Copy as-is; extend by adding functions, not by editing these. The vertical
5
5
  // is read-only: authoring stays in the dashboard.
6
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
7
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
6
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
8
8
  import { category as categoryModule, questionEntry as questionModule } from "@wix/faq";
9
9
  import { wixModule } from "../sdk";
10
10
  import { imgSrc } from "../media";
@@ -3,8 +3,8 @@
3
3
  // rules and mappers live in ./faq-core (shared with the REST twin in templates/faq/rest/); this file
4
4
  // is the transport only. Copy as-is; extend by adding functions, not by editing these. The vertical
5
5
  // is read-only: authoring stays in the dashboard.
6
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
7
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
6
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
8
8
  import { category as categoryModule, questionEntry as questionModule } from "@wix/faq";
9
9
  import { wixModule } from "../sdk";
10
10
  import { imgSrc } from "../media";
@@ -5,8 +5,8 @@
5
5
  // them is not documented — the reference shows an elevated example — so a 403 here means the site's
6
6
  // read needs a server-side path, not that the body is wrong (INSTRUCTIONS.md, verification caveats).
7
7
  // Porting: keep the paths, keep the bodies, port the core once.
8
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
9
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
8
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
10
10
  import { wixRequest } from "../../shared/rest/client.js";
11
11
  import { imgSrc } from "../../shared/rest/media.js";
12
12
  import {
@@ -82,7 +82,7 @@ partial re-seed.
82
82
 
83
83
  ## Verification caveats
84
84
 
85
- The FAQ API's reference pages exist (`dev.wix.com/docs/rest/business-management/faq-app/…`) and
85
+ The FAQ API's reference pages exist (`dev.wix.com/docs/api-reference/business-management/faq-app/…`) and
86
86
  every path, verb, and body here follows them; the following were not checked on a live site:
87
87
 
88
88
  - Whether the create endpoints answer 409 on a duplicate title/question or create a second copy. The
@@ -3,7 +3,7 @@
3
3
  import { runReader } from "../../shared/seed/read-site.mjs";
4
4
 
5
5
  const FAQ_APP_ID = "14c92d28-031e-7910-c9a8-a670011e062d";
6
- const D = "https://dev.wix.com/docs/rest/business-management/faq-app/faq";
6
+ const D = "https://dev.wix.com/docs/api-reference/business-management/faq-app";
7
7
 
8
8
  await runReader({
9
9
  vertical: "faq",
@@ -25,7 +25,7 @@ import { readFileSync } from "node:fs";
25
25
 
26
26
  const API = "https://www.wixapis.com";
27
27
  const FAQ_APP_ID = "14c92d28-031e-7910-c9a8-a670011e062d";
28
- const D = "https://dev.wix.com/docs/rest/business-management/faq-app/faq";
28
+ const D = "https://dev.wix.com/docs/api-reference/business-management/faq-app";
29
29
  /** The API's page cap (CursorPaging.limit max 100). */
30
30
  const PAGE_LIMIT = 100;
31
31
  /** sortOrder step — increments of 10 leave room to insert between items later (the reference's own tip). */
@@ -134,14 +134,14 @@ export async function installFaqApp(ctx) {
134
134
  }
135
135
 
136
136
  // Existing categories, straight from the query (the source of truth for what persisted).
137
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
137
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
138
138
  export async function readCategories(ctx) {
139
139
  const r = await reqRetryOnce(ctx, "/faq/v2/categories/query", { body: { query: { cursorPaging: { limit: PAGE_LIMIT } } } });
140
140
  return (r.categories ?? []).map((c) => ({ id: rawId(c), title: c.title ?? "", sortOrder: typeof c.sortOrder === "number" ? c.sortOrder : null }));
141
141
  }
142
142
 
143
143
  // Every existing question (paged by cursor; PLAIN_TEXT keeps the read light — only the text is compared).
144
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
144
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
145
145
  export async function readQuestions(ctx) {
146
146
  const out = [];
147
147
  let cursor = null;
@@ -164,7 +164,7 @@ export async function readQuestions(ctx) {
164
164
  // 2. Idempotency — an already-present title (a partial-failure re-run, Wix's sample content) is kept.
165
165
  // New categories append after the existing ones: sortOrder = max(existing) + 10, +20, …
166
166
  // Body is NESTED: { category: { title, sortOrder } } → { category: { id, … } }.
167
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/create-category.md
167
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/create-category.md
168
168
  export async function ensureCategories(ctx, titles) {
169
169
  let existing = await readCategories(ctx);
170
170
  const byTitle = () => new Map(existing.map((c) => [norm(c.title), c]));
@@ -196,7 +196,7 @@ export async function ensureCategories(ctx, titles) {
196
196
 
197
197
  // One question, one call (the SDK exports no bulk create). Body is NESTED: { questionEntry: { … } } →
198
198
  // { questionEntry: { id, slug, … } }. `question` and `categoryId` are required; the answer is a oneof.
199
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/create-question-entry.md
199
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/create-question-entry.md
200
200
  export async function createQuestion(ctx, { question, categoryId, sortOrder, labels, answer }, idx) {
201
201
  const body = {
202
202
  questionEntry: {
@@ -13,8 +13,8 @@
13
13
  // implicit visitor access so a published site can render its own forms. Do NOT add a backend, a
14
14
  // connector token, or auth.elevate to make a form load.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/get-form.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/list-forms.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/get-form.md
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/list-forms.md
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/about-form-fields.md
19
19
  import { wixFetch } from "../sdk";
20
20
  import { imgSrc } from "../media";
@@ -13,8 +13,8 @@
13
13
  // scope and 403s. The resolved create IS the confirmation — show a thank-you; the entry appears
14
14
  // in the owner's dashboard. A site that must LIST what visitors submitted needs `cms` instead.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/create-submission.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/get-media-upload-url.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/create-submission.md?apiView=SDK
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/get-media-upload-url.md?apiView=SDK
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/about-submission-values.md
19
19
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
20
20
  import { submissions as submissionsModule } from "@wix/forms";
@@ -13,8 +13,8 @@
13
13
  // implicit visitor access so a published site can render its own forms. Do NOT add a backend, a
14
14
  // connector token, or auth.elevate to make a form load.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/get-form.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/list-forms.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/get-form.md
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/list-forms.md
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/about-form-fields.md
19
19
  import { wixFetch } from "../sdk";
20
20
  import { imgSrc } from "../media";
@@ -13,8 +13,8 @@
13
13
  // scope and 403s. The resolved create IS the confirmation — show a thank-you; the entry appears
14
14
  // in the owner's dashboard. A site that must LIST what visitors submitted needs `cms` instead.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/create-submission.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/get-media-upload-url.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/create-submission.md?apiView=SDK
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/get-media-upload-url.md?apiView=SDK
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/about-submission-values.md
19
19
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
20
20
  import { submissions as submissionsModule } from "@wix/forms";
@@ -3,7 +3,7 @@
3
3
  import { runReader } from "../../shared/seed/read-site.mjs";
4
4
 
5
5
  const MEMBERS_AREA_APP_ID = "14cc59bc-f0b7-15b8-e1c7-89ce41d0e0c9";
6
- const D = "https://dev.wix.com/docs/api-reference/crm/members-contacts/members/members";
6
+ const D = "https://dev.wix.com/docs/api-reference/crm/members-contacts/members/member-management/members";
7
7
 
8
8
  await runReader({
9
9
  vertical: "members",
@@ -12,7 +12,7 @@
12
12
  // manual client (React SPA, lib) — the shared seam holds a VISITOR token; pass a call bound to the
13
13
  // member's client instead, e.g. from templates/members' client.ts strategy:
14
14
  // `createClient({ auth: membersAuth, modules: { orders } }).orders.memberListOrders`.
15
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
15
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
16
16
  import { orders as ordersModule } from "@wix/pricing-plans";
17
17
  import { wixModule } from "../sdk";
18
18
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "./plan-access-core";
@@ -12,7 +12,7 @@
12
12
  // manual client (React SPA, lib) — the shared seam holds a VISITOR token; pass a call bound to the
13
13
  // member's client instead, e.g. from templates/members' client.ts strategy:
14
14
  // `createClient({ auth: membersAuth, modules: { orders } }).orders.memberListOrders`.
15
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
15
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
16
16
  import { orders as ordersModule } from "@wix/pricing-plans";
17
17
  import { wixModule } from "../sdk";
18
18
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "./plan-access-core";
@@ -4,7 +4,7 @@
4
4
  // after the members vertical's rest/auth.ts login (`loggedInHint()` true) — and is refused for a
5
5
  // visitor, so callers check the session first (the store does) and never call for a visitor.
6
6
  // Porting: keep the path and the query string; the rule is one line in the core.
7
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
8
8
  import { wixRequest } from "../../shared/rest/client.js";
9
9
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "../app/wix/pricing-plans/plan-access-core.js";
10
10
  import type { Raw } from "../app/wix/pricing-plans/plans-core.js";
@@ -9,7 +9,6 @@
9
9
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifier-groups/list-modifier-groups.md
10
10
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifiers/list-modifiers.md
11
11
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-labels/list-labels.md
12
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
13
12
  import {
14
13
  menus as menusModule,
15
14
  sections as sectionsModule,
@@ -9,7 +9,6 @@
9
9
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifier-groups/list-modifier-groups.md
10
10
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifiers/list-modifiers.md
11
11
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-labels/list-labels.md
12
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
13
12
  import {
14
13
  menus as menusModule,
15
14
  sections as sectionsModule,
@@ -6,7 +6,6 @@
6
6
  // port the core once. Entities carry `id` here (the SDK spells it `_id`); the core accepts both.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/menus/list-menus.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/items/list-items.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
10
9
  import { wixRequest } from "../../shared/rest/client.js";
11
10
  import { imgSrc } from "../../shared/rest/media.js";
12
11
  import {
@@ -14,7 +14,7 @@
14
14
  // server (a Python/PHP/Go port) — the SHOPPER'S SESSION, one token set per shopper. Never one
15
15
  // process-wide token for everyone: that is one shared cart for all visitors.
16
16
  // This is the only part of a port that isn't line-for-line.
17
- // docs: https://dev.wix.com/docs/go-headless/coding/authentication/visitors.md
17
+ // docs: https://dev.wix.com/docs/go-headless/authentication/visitors/authenticate-visitors-rest.md
18
18
  import { WIX_CLIENT_ID } from "./config.js";
19
19
 
20
20
  export const WIX_API_BASE = "https://www.wixapis.com";
@@ -7,7 +7,8 @@ const API = "https://www.wixapis.com";
7
7
  // cannot be repriced afterwards. A new site starts in the currency of the account that created
8
8
  // it, not the business's. Reads can report the old currency for a few seconds after this returns;
9
9
  // that lag is expected and self-resolves.
10
- // docs: https://dev.wix.com/docs/rest/business-management/site-properties/properties/update-site-properties
10
+ // No reference page documents this PATCH any more (Update Site Properties left the docs). The docs
11
+ // cover the same field only under Update Business Region, a different endpoint and body.
11
12
  export async function setSiteCurrency(ctx, currency) {
12
13
  if (!/^[A-Z]{3}$/.test(currency)) throw new Error(`currency must be a 3-letter ISO code, got "${currency}"`);
13
14
  const res = await fetch(`${API}/site-properties/v4/properties`, {
@@ -107,4 +107,3 @@ Returns `lowOffer` / `mediumOffer` / `highOffer`, each with `incentiveId`, `awar
107
107
  - [Get Keyword Theme Suggestions](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-keyword-theme-suggestions)
108
108
  - [Get Geo Options](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-geo-options)
109
109
  - [Get Budget Suggestions](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-budget-suggestions)
110
- - [Get Incentives](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-incentives)
@@ -152,4 +152,3 @@ Returns `{}`. Errors with `ACCOUNT_NOT_FOUND` if no account exists.
152
152
  - [Account Service](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/introduction)
153
153
  - [Create Account](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/create-account)
154
154
  - [Get Account For Current Site](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/get-account-for-current-site)
155
- - [Get Incentives](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-incentives)
@@ -13,7 +13,7 @@ Ricos is Wix's rich content format used across various Wix applications (Blog, S
13
13
  - **Convert to Ricos**: Transform HTML, Markdown, or plain text into a Ricos document
14
14
  - **Convert from Ricos**: Transform a Ricos document back to HTML, Markdown, or plain text
15
15
 
16
- Learn more about [Rich Content](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-rich-content) and [Ricos document structure](https://dev.wix.com/docs/ricos/getting-started/introduction).
16
+ Learn more about [Rich Content](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-rich-content) and [Ricos document structure](https://dev.wix.com/docs/api-reference/assets/rich-content/ricos-documents/document-object).
17
17
 
18
18
  ## Required API Endpoints
19
19
 
@@ -96,9 +96,9 @@ Primary entities:
96
96
 
97
97
  | Entity | What it does | Docs |
98
98
  | --- | --- | --- |
99
- | `cart` | First phase of the purchase flow; holds line items, buyer references, discounts, and pricing context before checkout | [About the eCommerce Cart API](https://dev.wix.com/docs/rest/business-solutions/e-commerce/purchase-flow/cart/cart/introduction) |
100
- | `current-cart` | Visitor/member scoped cart used in live purchase flows | [About the eCommerce Current Cart API](https://dev.wix.com/docs/sdk/backend-modules/ecom/current-cart/introduction) |
101
- | `checkout` | Second phase of purchase flow; holds calculated prices, tax, billing, shipping, and discount state before order creation | [About the eCommerce Checkout API](https://dev.wix.com/docs/sdk/backend-modules/ecom/checkout/introduction) |
99
+ | `cart` | First phase of the purchase flow; holds line items, buyer references, discounts, and pricing context before checkout | [About the Cart API (Cart V2, replaces the eCommerce Cart API)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction) |
100
+ | `current-cart` | Visitor/member scoped cart used in live purchase flows | [About the Cart API (Cart V2, its Current Cart service)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction?apiView=SDK) |
101
+ | `checkout` | Second phase of purchase flow; holds calculated prices, tax, billing, shipping, and discount state before order creation | [About the Cart API (Cart V2, replaces the eCommerce Checkout API)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction?apiView=SDK) |
102
102
  | `order` | Final commerce record for completed or externally recorded purchases | [About the Orders API](https://dev.wix.com/docs/rest/business-solutions/e-commerce/orders/orders/introduction) |
103
103
  | `order-billing` | Payment capture, void, and refund operations for eCommerce orders | [About the Order Billing API](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/order-billing/introduction) |
104
104
 
@@ -179,7 +179,7 @@ Primary entities:
179
179
  | `ticket-definition` | Ticket type template such as General Admission or VIP | [Event Management introduction](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/introduction) |
180
180
  | `ticket` | Purchased ticket with guest and check-in state | [About the Tickets API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/ticketing/tickets/introduction?apiView=SDK) |
181
181
  | `event-order` | Ticket purchase and registration order lifecycle | [About the Orders API](https://dev.wix.com/docs/sdk/backend-modules/events/orders/on-order-initiated) |
182
- | `rsvp` | RSVP response and attendance state for non-ticketed events | [About RSVP API](https://dev.wix.com/docs/sdk/backend-modules/events/rsvp/introduction) |
182
+ | `rsvp` | RSVP response and attendance state for non-ticketed events | [About the RSVP API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/rsvp-v2/introduction?apiView=SDK) |
183
183
  | `event-guest` | Unified guest record across ticketed and RSVP events | [About the Event Guests API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/event-guests/introduction?apiView=SDK) |
184
184
  | `events-registration` | Registration layer connecting RSVP, ticketing, and guests | [About Events Registration](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/introduction) |
185
185
 
@@ -212,7 +212,7 @@ Primary entities:
212
212
  | `reservation` | Reservation lifecycle record for a party at a restaurant | [About the Reservations API](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/wix-restaurants-new/reservations/reservations/introduction) |
213
213
  | `restaurant-time-slot` | Availability window for reservation booking | [Reservations API introduction](https://dev.wix.com/docs/rest/business-solutions/restaurants/wix-restaurants-new/reservations/introduction) |
214
214
  | `experience` | Special dining experience such as chef's table or tasting menu | [Experiences API](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/wix-restaurants-new/reservations/experiences/introduction) |
215
- | `restaurant-order-legacy` | Legacy restaurant order model from the original Restaurants Orders app | [About Wix Restaurants Orders](https://dev.wix.com/docs/rest/business-solutions/restaurants/wix-restaurants/orders/introduction) |
215
+ | `restaurant-order-legacy` | Legacy restaurant order model from the original Restaurants Orders app | [Restaurants Online Orders (the legacy Orders docs are removed)](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders) |
216
216
 
217
217
  Mapper notes:
218
218
  - Restaurants spans multiple subdomains: menus, reservations, and in some cases restaurant ordering.
@@ -273,15 +273,6 @@
273
273
  "reason": "Ephemeral purchase-flow state; checkouts are not migratable records.",
274
274
  "reviewedOn": "2026-08-11"
275
275
  },
276
- {
277
- "id": "api-reference/business-solutions/e-commerce/purchase-flow/skills",
278
- "title": "Skills",
279
- "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/skills",
280
- "group": "Purchase Flow",
281
- "verdict": "not-relevant",
282
- "reason": "AI-skill documentation page, not a data surface.",
283
- "reviewedOn": "2026-08-11"
284
- },
285
276
  {
286
277
  "id": "api-reference/business-solutions/e-commerce/shipping-delivery/delivery-profiles",
287
278
  "title": "Delivery Profiles",
@@ -237,7 +237,7 @@ metrics, members-only posts)? Extend with `wixApiRequest`, but look up the exact
237
237
  in the **official Wix API reference** first — never guess. Each helper in `wix-blog.js` links its
238
238
  reference page inline.
239
239
  - Blog API reference: https://dev.wix.com/docs/api-reference/business-solutions/blog.md
240
- - Rendering `richContent` (Ricos document): https://dev.wix.com/docs/ricos/api-reference/ricos-document
240
+ - Rendering `richContent` (Ricos document): https://dev.wix.com/docs/api-reference/assets/rich-content/ricos-documents/document-object
241
241
  - **Members-only posts** → the **members** vertical: once a member is logged in, the shipped read
242
242
  helpers return the gated content with no extra code (member *writes* — comments, likes — are not
243
243
  included; add them as an authenticated `wixApiRequest` call).