@wix/agent-skills 1.19.0 → 1.19.2
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.
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +33 -31
- package/skills/wix-app/references/DASHBOARD_PAGE.md +6 -10
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +17 -8
- package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +53 -131
- package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +1 -2
- package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +88 -73
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +46 -22
- package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +20 -6
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +9 -0
- package/skills/wix-app/references/editor-react-component/FUNCTION-HANDLERS.md +71 -31
- package/skills/wix-app/references/editor-react-component/PARTS.md +5 -2
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +4 -5
- package/skills/wix-app/scripts/pkg-root.cjs +73 -0
- package/skills/wix-app/scripts/scan-a11y-code.cjs +310 -40
- package/skills/wix-app/scripts/scan-a11y-eslint.cjs +118 -24
- package/skills/wix-app/scripts/scan-a11y-render.cjs +551 -0
- package/skills/wix-app/scripts/scan-a11y-review.cjs +373 -0
- package/skills/wix-base44-connector/SKILL.md +67 -43
- package/skills/wix-base44-connector/scripts/utils.cjs +39 -3
- package/skills/wix-docs/SKILL.md +47 -20
- package/skills/wix-headless/SKILL.md +1 -0
- package/skills/wix-headless/entry/bootstrap.mjs +106 -50
- package/skills/wix-headless/entry/skill.md +5 -3
- package/skills/wix-headless/references/CAPABILITIES.md +7 -2
- package/skills/wix-headless/references/SDK_HANDOFF.md +2 -1
- package/skills/wix-headless/references/inline-recipes/experience-store.md +48 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +350 -114
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +1 -1
- package/skills/wix-headless/references/managed/AUTHENTICATION.md +25 -5
- package/skills/wix-headless/references/managed/CREATE.md +5 -0
- package/skills/wix-headless-fast/SKILL.md +25 -7
- package/skills/wix-headless-fast/entry/skill.md +23 -14
- package/skills/wix-headless-fast/install/fast-path.mjs +48 -5
- package/skills/wix-headless-fast/install/pin-agents-md.mjs +57 -0
- package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +3 -3
- package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +204 -35
- package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +146 -36
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +8 -2
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +95 -20
- package/skills/wix-headless-fast/references/storefront/seed/SEED.md +21 -2
- package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +104 -18
- package/skills/wix-manage/SKILL.md +16 -10
- package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +4 -1
- package/skills/wix-manage/references/bookings/create-appointment-service.md +3 -1
- package/skills/wix-manage/references/bookings/create-class-service.md +3 -1
- package/skills/wix-manage/references/bookings/create-course-service.md +4 -2
- package/skills/wix-manage/references/bookings/end-to-end-booking-flow.md +68 -3
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-seasonal-promotion.md +1 -1
- package/skills/wix-manage/references/google-ads/billing-and-payment.md +3 -3
- package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +8 -8
- package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +4 -4
- package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +1 -1
- package/skills/wix-manage/references/google-ads/install-and-create-account.md +9 -9
- package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +108 -14
- package/skills/wix-manage/references/google-ads/query-campaign-analytics.md +7 -7
- package/skills/wix-manage/references/seo/manage-content-plan.md +182 -136
- package/skills/wix-manage/references/seo/manage-google-search-console.md +272 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +283 -0
- package/skills/wix-manage/references/stores/change-store-currency.md +1 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed-with-install.md +3 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +3 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +1 -1
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +69 -27
- package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +32 -14
- package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +14 -3
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductCard.js +41 -35
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +77 -30
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-cart.js +31 -2
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +31 -6
- package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +0 -80
- package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +0 -140
- package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +0 -112
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductCard.tsx +0 -100
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductDetailView.tsx +0 -130
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductGrid.tsx +0 -48
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ShopView.tsx +0 -66
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/VariantPicker.tsx +0 -103
- package/skills/wix-headless-fast/references/storefront/app-astro/pages/products/[slug].astro +0 -56
- package/skills/wix-headless-fast/references/storefront/app-astro/pages/shop.astro +0 -23
package/package.json
CHANGED
package/skills/wix-app/SKILL.md
CHANGED
|
@@ -22,14 +22,19 @@ Helps build extensions for Wix CLI applications. Covers all extension types: das
|
|
|
22
22
|
- [ ] Determined full scoped collection IDs if Data Collection extension is being created (see [Collection ID Coordination](#collection-id-coordination))
|
|
23
23
|
- [ ] Explained recommendation with reasoning
|
|
24
24
|
- [ ] **Step 2:** Read extension reference file(s) for the chosen type(s) and the project-wide [CODE_QUALITY.md](references/CODE_QUALITY.md)
|
|
25
|
-
- [ ] **Dashboard page UI:** Translated the prompt into a workflow before choosing components — what the user must understand, focus on, investigate, act on, and see confirmed. See [UX Success Model](references/dashboard-page/UX_SUCCESS_MODEL.md), and
|
|
26
|
-
- [ ] **The page shows aggregate numbers, not only rows** (`SummaryBar`) — unless the prompt asks for a single record. "How many, and which ones need me" is why someone opens a dashboard.
|
|
25
|
+
- [ ] **Dashboard page UI:** Translated the prompt into a workflow before choosing components — what the user must understand, focus on, investigate, act on, and see confirmed. See [UX Success Model](references/dashboard-page/UX_SUCCESS_MODEL.md), and the installed package's own `Collection Toolkit.md` guide for which component serves each need ([The Discovery Chain](references/WIX_PATTERNS_DOCS.md#the-discovery-chain)).
|
|
27
26
|
- [ ] **A row the user can open** — WDS `SidePanel` to inspect without losing the filtered list, or `EntityPage` for deep or shareable detail — unless the prompt is explicitly a report or an export.
|
|
28
27
|
- [ ] **Every filter reaches the query**: declared in the collection hook's `filters` and read inside `fetchData`. Filter UI that never narrows the rows is a defect that looks like a feature.
|
|
29
28
|
|
|
30
|
-
A filtered table with
|
|
31
|
-
- [ ] **🛑 Patterns Docs Gate (MANDATORY for any dashboard page UI):** Read [WIX_PATTERNS_DOCS.md](references/WIX_PATTERNS_DOCS.md), then
|
|
32
|
-
- [ ] **🛑 Component Docs Gate (MANDATORY, dashboard UI only):**
|
|
29
|
+
A filtered table with neither of the two is what gets built when nobody states the requirement — it is the most common way a generated dashboard disappoints.
|
|
30
|
+
- [ ] **🛑 Patterns Docs Gate (MANDATORY for any dashboard page UI):** Read [WIX_PATTERNS_DOCS.md](references/WIX_PATTERNS_DOCS.md), then **probe** `dist/docs/index.json` with `grep`/`python3` — never a whole-file `Read`, which truncates it silently. It is the one file that says, per symbol, where to import it from (`importPath`), whether its props live in the doc or in a `.d.ts` (`bundle`), and which worked examples exist (`examples`). Upgrade `@wix/patterns` if that file is missing. Patterns API facts come only from the published `dist/docs/` (pages), `dist/examples/` (worked calls) and `dist/dts-bundle/` (types) trees — never from `src/`, `dist/esm/`, or any other path inside the package, with one named exception: `dist/types/` when a bundle has stubbed the prop you need (WIX_PATTERNS_DOCS.md step 5).
|
|
31
|
+
- [ ] **🛑 Component Docs Gate (MANDATORY, dashboard UI only):** For each patterns symbol you are about to write, decided **from the index** which single artifact answers the question you actually have, and read that one — not all three:
|
|
32
|
+
- **Where do I import it from?** → the entry's `importPath`. No file read at all.
|
|
33
|
+
- **How do I call it?** (generics, what a callback receives and returns, how the pieces nest) → the **example** named in `examples`. One worked example beats reconstructing a call from a chain of type files; a hook's example is often filed under the component it pairs with.
|
|
34
|
+
- **What props, and which are optional?** → **the example first** — it shows the props in use, correctly typed. For what an example cannot show (optionality, union members, an exact callback signature): entry has `bundle` ⇒ read that `.d.ts`; entry has no `bundle` ⇒ the doc's own table is complete and marks `Required`, so read the doc. The two are mutually exclusive — reading both is always one hop too many. **Two thirds of bundles stub the parent that holds the props** (`propsTotal` far above what the file declares is the tell); when that happens, read the parent the index names — one hop — batch any `readWith` files you still need into a single call, and fall back to `dist/types/` for the declaration `tsc` enforces. WIX_PATTERNS_DOCS.md step 5 has the procedure.
|
|
35
|
+
- **Any setup requirement or gotcha?** → the doc's prose. Rare, but load-bearing where present (routers, providers).
|
|
36
|
+
|
|
37
|
+
State which artifact you read per symbol, and why, before the first line of JSX. Reading a doc *and* its bundle for the same symbol, or opening a page for an `importPath` the index already gave you, is the failure this gate exists to prevent.
|
|
33
38
|
- [ ] **Step 3:** Checked API references; used MCP discovery only for gaps
|
|
34
39
|
- [ ] Site/editor extensions only: kept SDK calls in the extension by default, routing out only business-wide methods a visitor genuinely cannot call (see [Identity and Elevation Requirement](#identity-and-elevation-requirement))
|
|
35
40
|
- [ ] **Step 4a:** Scaffolded each CLI-supported extension via `wix generate --params`
|
|
@@ -107,32 +112,31 @@ Dashboard pages at Wix are built from two libraries. For **every** UI element, r
|
|
|
107
112
|
|
|
108
113
|
### 1. `@wix/patterns` — page structure and data collections
|
|
109
114
|
|
|
110
|
-
Patterns owns the page shell and everything collection-shaped
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
| Collection state — paging, sorting, selection, loading | `useTableCollection()` and its sibling hooks (one per collection type) |
|
|
117
|
-
| Filters, search, sorting, view presets/tabs | the collection's filter and view APIs |
|
|
118
|
-
| Row actions, bulk actions, drag-and-drop | the collection's feature APIs |
|
|
119
|
-
| Multiple pages inside one extension | `PatternsReactRouter`, `PatternsReactRoute`, `usePatternsNavigate` |
|
|
120
|
-
| **Add / edit / view one item from a collection** | `EntityPage` + `useEntityPage` (fetch + save + validation), reached with `usePatternsNavigate().navigateToEntityPage`. Form state via `useForm` / `useController` from `@wix/patterns/form` (`useController`, never `register`). **Not** a dashboard modal — see [Entity create and edit](#entity-create-and-edit) |
|
|
121
|
-
| Overlays tied to a collection (item picker, bulk-action confirm) | `PickerModal` / `usePickerModal`, `bulkActionModal` |
|
|
122
|
-
|
|
123
|
-
**Looking a component up is two direct file reads** — no script, never `node_modules` browsed by hand. Resolve the installed package root once per session ([Prerequisites](references/WIX_PATTERNS_DOCS.md#prerequisites)), then reuse it. Start with what exists:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
cat <pkgRoot>/dist/dts-bundle/index.json
|
|
127
|
-
```
|
|
115
|
+
Patterns owns the page shell and everything collection-shaped: page shells and their header /
|
|
116
|
+
content / footer sub-parts, tables and grids and the switch between them, folder views,
|
|
117
|
+
collection state (paging, sorting, selection, loading), filters, search, view presets, row and
|
|
118
|
+
bulk actions, drag-and-drop, in-extension routing, the overlays tied to a collection, and the
|
|
119
|
+
add / edit / view page for one listed item. If you need one of those, it is patterns' — look it
|
|
120
|
+
up rather than assembling it from WDS parts.
|
|
128
121
|
|
|
129
|
-
|
|
122
|
+
**Which component serves a given need is the library's own answer, not this skill's.** It ships
|
|
123
|
+
that answer as guides inside the installed package, with every component name in them checked
|
|
124
|
+
against the real package at build time. Walk them: [The Discovery Chain](references/WIX_PATTERNS_DOCS.md#the-discovery-chain).
|
|
130
125
|
|
|
131
|
-
|
|
126
|
+
The short version — probe `<pkgRoot>/dist/docs/index.json` first (`grep`/`python3`, not a
|
|
127
|
+
whole-file `Read`), then the guides it lists. From
|
|
128
|
+
there the index answers per symbol: `importPath` is the import line (no read needed), `examples`
|
|
129
|
+
names the worked call, and `bundle` says whether props live in a `.d.ts` or in the doc's own
|
|
130
|
+
table. Read the one artifact your open question needs. Resolve `<pkgRoot>` once per session
|
|
131
|
+
([Prerequisites](references/WIX_PATTERNS_DOCS.md#prerequisites)) and reuse it.
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
**Add / edit / view one item from a collection is an `EntityPage`, not a dashboard modal** — see
|
|
134
|
+
[Entity create and edit](#entity-create-and-edit), and `Collection to Entity Flow.md` in the
|
|
135
|
+
package for the flow itself.
|
|
134
136
|
|
|
135
|
-
|
|
137
|
+
**Falling through to step 2 because a lookup was inconvenient is the single most common way a
|
|
138
|
+
dashboard page ends up built entirely from WDS.** A missing index means the lookup has not
|
|
139
|
+
happened yet, not that patterns lacks the component.
|
|
136
140
|
|
|
137
141
|
### 2. `@wix/design-system` — everything inside the shell
|
|
138
142
|
|
|
@@ -163,9 +167,9 @@ This is the most common place the selection order gets dropped: the collection g
|
|
|
163
167
|
|
|
164
168
|
The documented flow:
|
|
165
169
|
|
|
166
|
-
1. From the collection page's action cell or primary action, call `navigateToEntityPage({ path, entity })` from `usePatternsNavigate()`. (The patterns docs give this exact use case — "navigate to an entity page on an action cell click on a collection page" — and it renders the entity header immediately, before the fetch resolves.) On the **create** route there is no record to pass: omit `entity` and
|
|
170
|
+
1. From the collection page's action cell or primary action, call `navigateToEntityPage({ path, entity })` from `usePatternsNavigate()`. (The patterns docs give this exact use case — "navigate to an entity page on an action cell click on a collection page" — and it renders the entity header immediately, before the fetch resolves.) On the **create** route there is no record to pass: omit `entity` and read the **Create route** section of `<pkgRoot>/dist/docs/useEntityPage.md`, which is what the whole "add new" flow turns on.
|
|
167
171
|
2. Register the route with `PatternsReactRoute` inside `PatternsReactRouter`.
|
|
168
|
-
3. In the entity page, `useEntityPage({ fetch, onSave })` owns fetching, saving, validation, dirty state, loading skeletons, and error states. Form state comes from `useForm` / `useController` in `@wix/patterns/form`. The call itself — both generics, what `onSave` receives, which params exist — is in
|
|
172
|
+
3. In the entity page, `useEntityPage({ fetch, onSave })` owns fetching, saving, validation, dirty state, loading skeletons, and error states. Form state comes from `useForm` / `useController` in `@wix/patterns/form`. The call itself — both generics, what `onSave` receives, which params exist — is in `<pkgRoot>/dist/docs/useEntityPage.md`.
|
|
169
173
|
4. Compose the body from `EntityPage.Header`, `EntityPage.MainContent`, `EntityPage.AdditionalContent`, and `EntityPage.Card`. **WDS goes inside those cards** — `FormField`, `Input`, `Text` for the individual fields.
|
|
170
174
|
|
|
171
175
|
Use a Dashboard Modal for dialogs that neither write nor display a listed record: a delete or discard confirmation, an unsaved-changes prompt, an informational notice, or any dialog on a page that lists nothing. Dialog size and field count are not exceptions — a one-field create form over a listed record is still an `EntityPage`. Reach for a modal because the interaction persists nothing, never because "the form should open in a modal."
|
|
@@ -216,8 +220,6 @@ Use a Dashboard Modal for dialogs that neither write nor display a listed record
|
|
|
216
220
|
| Official Documentation Links | [DOCUMENTATION.md](references/DOCUMENTATION.md) |
|
|
217
221
|
| Wix Patterns Dashboard Pages | [WIX_PATTERNS_DOCS.md](references/WIX_PATTERNS_DOCS.md) |
|
|
218
222
|
| Dashboard UX Success Model (what a good dashboard contains) | [UX_SUCCESS_MODEL.md](references/dashboard-page/UX_SUCCESS_MODEL.md) |
|
|
219
|
-
| Dashboard Collection Toolkit (which component per user need) | [COLLECTION_TOOLKIT.md](references/dashboard-page/COLLECTION_TOOLKIT.md) |
|
|
220
|
-
| Reading a patterns bundle or doc file the index names | [PATTERNS_BUNDLE_READING.md](references/dashboard-page/PATTERNS_BUNDLE_READING.md) |
|
|
221
223
|
|
|
222
224
|
---
|
|
223
225
|
|
|
@@ -6,17 +6,13 @@ Dashboard pages appear in the site owner's Wix dashboard, where admins manage da
|
|
|
6
6
|
|
|
7
7
|
A dashboard page is a workflow, not a screen. The site owner has to understand the situation, focus on what needs attention, investigate one record, act, and see the result confirmed — so translate the prompt into those needs before choosing any component.
|
|
8
8
|
|
|
9
|
-
Do this first because a bare filtered table answers "what are all the records" and
|
|
9
|
+
Do this first because a bare filtered table answers "what are all the records" and neither "which one needs my attention" nor "why did this happen" — and a table is what you get by default if the workflow was never named. Read [UX Success Model](dashboard-page/UX_SUCCESS_MODEL.md) now, and run its evaluation checklist before calling the page done. Which component serves each need is the installed package's own answer — see [The Discovery Chain](WIX_PATTERNS_DOCS.md#the-discovery-chain).
|
|
10
10
|
|
|
11
11
|
## UI Libraries — Read Before Writing Any JSX
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
`@wix/patterns` first, `@wix/design-system` for the leaf UI inside its shell, custom React only when neither has it. Do not hand-write React for anything either library provides, and do not decide a component is missing without checking.
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
2. **`@wix/design-system` second** — the leaf UI inside that shell (inputs, buttons, form fields, text, layout, cards, badges, icons). Choose components via the `wix-design-system` skill.
|
|
17
|
-
3. **Custom React last** — only when neither library has it.
|
|
18
|
-
|
|
19
|
-
Do not hand-write React for anything either library already provides, and do not decide a component is missing without checking. Full rule: [SKILL.md → Component Selection Order](../SKILL.md#component-selection-order).
|
|
15
|
+
The order, what each library owns, and how to look a name up are stated once: [SKILL.md → Component Selection Order](../SKILL.md#component-selection-order).
|
|
20
16
|
|
|
21
17
|
## Scaffold
|
|
22
18
|
|
|
@@ -33,9 +29,9 @@ wix generate --params '{"extensionType":"DASHBOARD_PAGE","title":"<title>","rout
|
|
|
33
29
|
|
|
34
30
|
The CLI generates the folder, `page.tsx`, the builder file, the UUID, and the `src/extensions.ts` registration. After scaffolding, implement the page UI in the generated `page.tsx`.
|
|
35
31
|
|
|
36
|
-
**Never reuse `<route>` as a path prefix inside this page's `PatternsReactRouter`** — its location is already page-scoped, so a page scaffolded `route: "shifts"` still routes from `path="/"`, and `path="/shifts"` silently never matches. Page-relative paths:
|
|
32
|
+
**Never reuse `<route>` as a path prefix inside this page's `PatternsReactRouter`** — its location is already page-scoped, so a page scaffolded `route: "shifts"` still routes from `path="/"`, and `path="/shifts"` silently never matches. Page-relative paths: `<pkgRoot>/dist/docs/Collection to Entity Flow.md`.
|
|
37
33
|
|
|
38
|
-
**Then, before writing UI:** resolve the package root and
|
|
34
|
+
**Then, before writing UI:** resolve the package root and probe `<pkgRoot>/dist/docs/index.json` once with `grep`/`python3` — not a whole-file `Read`, which truncates it silently — per [Prerequisites](WIX_PATTERNS_DOCS.md#prerequisites). That index carries each symbol's `importPath`, `examples` and `bundle`, which is what decides whether you need to open anything else at all. Each Bash call is a fresh shell — re-set the path variable in every call.
|
|
39
35
|
|
|
40
36
|
## Capabilities
|
|
41
37
|
|
|
@@ -74,7 +70,7 @@ Dashboard Pages cannot use `<Modal />`. For a true dialog overlay you **MUST** u
|
|
|
74
70
|
>
|
|
75
71
|
> **If this page lists nothing** (settings, config) the rule doesn't apply. But "I built the list without `@wix/patterns`" is not an exception: a page that lists records should be a `CollectionPage`.
|
|
76
72
|
>
|
|
77
|
-
> See [Entity create and edit](../SKILL.md#entity-create-and-edit) and [WIX_PATTERNS_DOCS.md](WIX_PATTERNS_DOCS.md); for the `useEntityPage` call itself,
|
|
73
|
+
> See [Entity create and edit](../SKILL.md#entity-create-and-edit) and [WIX_PATTERNS_DOCS.md](WIX_PATTERNS_DOCS.md); for the `useEntityPage` call itself, `<pkgRoot>/dist/docs/useEntityPage.md`.
|
|
78
74
|
|
|
79
75
|
**Ecom Navigation:** See [Ecom Navigation Reference](dashboard-page/ECOM_NAVIGATION.md) for ecom-specific navigation helpers.
|
|
80
76
|
|
|
@@ -24,7 +24,8 @@ roles intact.
|
|
|
24
24
|
|
|
25
25
|
## Workflow
|
|
26
26
|
|
|
27
|
-
1. **Scaffold only when creating.** If the component folder does not exist, run
|
|
27
|
+
1. **Scaffold only when creating.** If the component folder does not exist, run
|
|
28
|
+
inside the Wix app project (the folder with `wix.config.json`):
|
|
28
29
|
|
|
29
30
|
```bash
|
|
30
31
|
npx wix generate --params '{"extensionType":"EDITOR_REACT_COMPONENT","name":"ComponentName","folder":"component-name","description":"A brief description"}'
|
|
@@ -37,7 +38,7 @@ roles intact.
|
|
|
37
38
|
accessibility-review dependencies are installed:
|
|
38
39
|
|
|
39
40
|
```bash
|
|
40
|
-
node -e "const fs=require('fs'),path=require('path'),ps=['@wix/react-component-schema','@wix/react-component-utils','@wix/editor-react-types','@babel/parser','@babel/traverse','@babel/types','eslint','eslint-plugin-jsx-a11y','@typescript-eslint/parser','typescript','@types/eslint-plugin-jsx-a11y'];const missing=ps.filter(p=>!(require.resolve.paths(p)||[]).some(d=>fs.existsSync(path.join(d,p,'package.json'))));if(missing.length){console.error('Missing dependencies: '+missing.join(', '));process.exit(1)}" || { d="$PWD"; while [ "$d" != "/" ] && [ ! -f "$d/yarn.lock" ]; do d="${d%/*}"; done; if [ -f "$d/yarn.lock" ]; then yarn add @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && yarn add -D @babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser 'typescript@<7' @types/eslint-plugin-jsx-a11y; else npm install @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && npm install --save-dev @babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser 'typescript@<7' @types/eslint-plugin-jsx-a11y; fi; }
|
|
41
|
+
node -e "const fs=require('fs'),path=require('path'),ps=['@wix/react-component-schema','@wix/react-component-utils','@wix/editor-react-types','@babel/parser','@babel/traverse','@babel/types','eslint','eslint-plugin-jsx-a11y','@typescript-eslint/parser','typescript','@types/eslint-plugin-jsx-a11y','jsdom','axe-core'];const missing=ps.filter(p=>!(require.resolve.paths(p)||[]).some(d=>fs.existsSync(path.join(d,p,'package.json'))));if(missing.length){console.error('Missing dependencies: '+missing.join(', '));process.exit(1)}" || { d="$PWD"; while [ "$d" != "/" ] && [ ! -f "$d/yarn.lock" ]; do d="${d%/*}"; done; if [ -f "$d/yarn.lock" ]; then yarn add @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && yarn add -D @babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser 'typescript@<7' @types/eslint-plugin-jsx-a11y jsdom axe-core; else npm install @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && npm install --save-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; fi; }
|
|
41
42
|
```
|
|
42
43
|
|
|
43
44
|
3. **Plan the contract and structure.** Identify props, semantic root, named
|
|
@@ -47,10 +48,16 @@ roles intact.
|
|
|
47
48
|
the props file, logic in TSX, styles in the CSS Module. Do not edit
|
|
48
49
|
`*.generated.ts`.
|
|
49
50
|
|
|
50
|
-
5. **Run the accessibility review.**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
5. **Run the accessibility review.** Once the JSX is complete, run from the
|
|
52
|
+
same folder (`<SKILL_ROOT>` is the directory containing the active `SKILL.md`):
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
node <SKILL_ROOT>/scripts/scan-a11y-review.cjs src/extensions/site/components/<component-name>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Then follow [`editor-react-component/ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md):
|
|
59
|
+
fix confirmed findings, rerun after each fix pass (at most two), and report
|
|
60
|
+
what remains.
|
|
54
61
|
|
|
55
62
|
6. **Configure the editor extension when required.** For a new component or a
|
|
56
63
|
requested sizing, installation, or manifest change, apply
|
|
@@ -103,7 +110,7 @@ extension configuration, and supporting files.
|
|
|
103
110
|
| Trigger | Read |
|
|
104
111
|
| --- | --- |
|
|
105
112
|
| Interactive/selectable part or custom state | [`DESIGN-STATES.md`](editor-react-component/DESIGN-STATES.md) |
|
|
106
|
-
|
|
|
113
|
+
| Creating interactive components or changing interactions/callbacks | [`FUNCTION-HANDLERS.md`](editor-react-component/FUNCTION-HANDLERS.md) |
|
|
107
114
|
| Browser APIs, effects, or time-dependent output | [`SSR.md`](editor-react-component/SSR.md) |
|
|
108
115
|
| Non-established CSS feature or DOM API, or user asks for one by name | [`BROWSER-SUPPORT.md`](editor-react-component/BROWSER-SUPPORT.md) |
|
|
109
116
|
| `npx wix build` or manifest generation exits with an error | [`MANIFEST-ERRORS.md`](editor-react-component/MANIFEST-ERRORS.md) |
|
|
@@ -121,7 +128,9 @@ extension configuration, and supporting files.
|
|
|
121
128
|
- Explicit foreground colors need a known contrasting background; transparent
|
|
122
129
|
roots inherit from the host.
|
|
123
130
|
- Baseline Widely Available CSS/DOM only, or supported fallbacks.
|
|
124
|
-
-
|
|
131
|
+
- Accessibility per part, per [`ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md):
|
|
132
|
+
read only `a11y.ariaLabel`, and only for a control without a visible name;
|
|
133
|
+
never spread the `a11y` object or add one-off ARIA props.
|
|
125
134
|
- Named parts: global class, module class, and `elementProps` (root uses
|
|
126
135
|
top-level props).
|
|
127
136
|
- Native design states: pair selectors with injected modifiers; keep non-input
|
|
@@ -2,174 +2,96 @@
|
|
|
2
2
|
|
|
3
3
|
## Prerequisites
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Resolve the package root once per session and reuse it — a bare `require.resolve` throws under Yarn PnP:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
node -
|
|
9
|
-
const fs = require('fs'), path = require('path');
|
|
10
|
-
function tryEnablePnp() {
|
|
11
|
-
let dir = process.cwd();
|
|
12
|
-
for (;;) {
|
|
13
|
-
const pnp = path.join(dir, '.pnp.cjs');
|
|
14
|
-
if (fs.existsSync(pnp)) { try { require(pnp).setup(); } catch {} return; }
|
|
15
|
-
const parent = path.dirname(dir);
|
|
16
|
-
if (parent === dir) return;
|
|
17
|
-
dir = parent;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
tryEnablePnp();
|
|
21
|
-
try {
|
|
22
|
-
console.log(path.dirname(require.resolve('@wix/patterns/package.json', { paths: [process.cwd()] })));
|
|
23
|
-
} catch {
|
|
24
|
-
let dir = process.cwd();
|
|
25
|
-
for (;;) {
|
|
26
|
-
const candidate = path.join(dir, 'node_modules', '@wix', 'patterns');
|
|
27
|
-
if (fs.existsSync(path.join(candidate, 'package.json'))) { console.log(candidate); process.exit(0); }
|
|
28
|
-
const parent = path.dirname(dir);
|
|
29
|
-
if (parent === dir) { console.error('@wix/patterns not found'); process.exit(1); }
|
|
30
|
-
dir = parent;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
"
|
|
8
|
+
node <this-skill-dir>/scripts/pkg-root.cjs @wix/patterns
|
|
34
9
|
```
|
|
35
10
|
|
|
36
|
-
|
|
11
|
+
Then check the install, two ways: `ls <pkgRoot>/dist/dts-bundle/index.json`, and — the one that matters — look for a **`Collection Toolkit`** key once step 1 has the docs index. The guides are *entries inside* that index rather than a directory, so no missing file reveals their absence.
|
|
37
12
|
|
|
38
|
-
|
|
13
|
+
**If either fails, stop and upgrade `@wix/patterns`.** "Which component serves this need" now lives in the package, so proceeding means guessing names; do not hunt elsewhere in `node_modules` for a substitute. Everything below degrades by version rather than breaking, so probe rather than version-check.
|
|
39
14
|
|
|
40
|
-
|
|
41
|
-
ls <pkgRoot>/dist/dts-bundle/index.json
|
|
42
|
-
```
|
|
15
|
+
**Patterns API facts come from three published trees only:** `dist/docs/` (pages), `dist/dts-bundle/` (types), `dist/examples/` (worked calls). Never take a component, prop or type from `src/`, `dist/esm/` or `dist/cjs/`, or a deep path a bundle mentions — internals change without notice. `dist/types/` is one narrow exception, used only where step 5 says: `package.json` points `types` at it, so it is what `tsc` enforces. Within those trees, `grep`/`sed` for one declaration usually beats a whole-file read.
|
|
43
16
|
|
|
44
|
-
|
|
17
|
+
## The Discovery Chain
|
|
45
18
|
|
|
46
|
-
|
|
19
|
+
### 1 — The index
|
|
47
20
|
|
|
48
|
-
|
|
21
|
+
**Probe `<pkgRoot>/dist/docs/index.json`; do not read it whole.** At ~80 KB a `Read` truncates part-way and reports nothing, so the tail goes silently missing. Pull what you need with one `grep`/`python3` call, resolving every symbol you plan to write in it.
|
|
49
22
|
|
|
50
|
-
|
|
23
|
+
Start here rather than the bundle index: it carries every documented name *and* the guides.
|
|
51
24
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
+-- Collection <- Table, Grid, TableGridSwitch, etc.
|
|
56
|
-
+-- Features <- filters, actions, sorting, drag-and-drop, etc.
|
|
57
|
-
```
|
|
25
|
+
- **Read each entry's `summary` before opening anything.** It is that page's opening paragraph, so for most questions the index *is* the answer and step 4 becomes no read.
|
|
26
|
+
- **Resolve against the keys *and* each entry's `symbols` aliases.** The index is keyed by Storybook title: `ExportButton` lives under `ExportTo`, `CollectionToolbarFilters` under `ToolbarFilters`. Matching is exact — scan for something close before concluding a name isn't covered.
|
|
27
|
+
- **`status: "deprecated"`** means use what `statusMessage` names. A deprecated component still renders, so nothing else stops you.
|
|
58
28
|
|
|
59
|
-
|
|
29
|
+
**Not in the docs index? Check `dist/dts-bundle/index.json` before concluding it does not exist.** It curates names with no page of their own — hooks, prop and query types, names re-exported from another package — and carries `importPath` and `file`, so step 4 still applies with no page to read.
|
|
60
30
|
|
|
61
|
-
|
|
31
|
+
**For that whole namespace cheaply, `Read <pkgRoot>/dist/dts-bundle/index.txt`** — ~9 KB, one read, every curated name with `kind`, `importPath` and file. From 1.469.0 it adds `bytes`, `props` (`5/63` — what the file declares against what the symbol has) and `stubs`: step 5's triage for every symbol at once, with the columns named in its header. Drop to the `.json` for `readWith`, `readWithBytes` and status prose.
|
|
62
32
|
|
|
63
|
-
|
|
64
|
-
| --- | --- | --- |
|
|
65
|
-
| `Table` | `TableState` | `useTableCollection()` |
|
|
66
|
-
| `Grid` | `GridState` | `useGridCollection()` |
|
|
67
|
-
| `TableGridSwitch` | `TableGridSwitchState` | `useTableGridSwitchCollection()` |
|
|
68
|
-
| `TableFolders` | `TableFoldersState` | `useTableFolders()` |
|
|
69
|
-
| `GridFolders` | `GridFoldersState` | `useGridFolders()` |
|
|
33
|
+
### 2 — Composition, once per session
|
|
70
34
|
|
|
71
|
-
|
|
35
|
+
`Read <pkgRoot>/dist/docs/Composition and Providers.md` before writing any patterns JSX: which provider, the four nesting layers, the collection triad, and why the provider must be a parent component rather than a sibling — the mistake that throws at runtime while the JSX looks right.
|
|
72
36
|
|
|
73
|
-
###
|
|
37
|
+
### 3 — Which component serves this need
|
|
74
38
|
|
|
75
|
-
|
|
|
39
|
+
| Building | Guide |
|
|
76
40
|
| --- | --- |
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
| `WixPatternsEssentialsProvider` | Yoshi Fullstack. |
|
|
80
|
-
| `WixPatternsBaseProvider` | App does **not** run under Giza/WixEssentials and you inject services (i18n, sentry) yourself. |
|
|
81
|
-
|
|
82
|
-
**Confirm the import path in the provider's own bundle** — not all share a subpath (`WixPatternsEssentialsProvider`, `WixPatternsBaseProvider` live under `@wix/patterns/essentials`).
|
|
83
|
-
|
|
84
|
-
### Keep Provider and Page Separate
|
|
85
|
-
|
|
86
|
-
The provider **must** be a parent of the page content: hooks like `useTableCollection` need its context above them in the tree.
|
|
87
|
-
|
|
88
|
-
**Wrong:** calling `useTableCollection` in the component that renders `WixPatternsProvider` — the hook runs before the provider exists, so it throws at runtime even though the JSX looks right.
|
|
89
|
-
|
|
90
|
-
**Correct — provider in root, page in a separate file:**
|
|
91
|
-
```tsx
|
|
92
|
-
// App.tsx
|
|
93
|
-
import { WixPatternsProvider } from '@wix/patterns/provider';
|
|
94
|
-
|
|
95
|
-
function App() {
|
|
96
|
-
return (
|
|
97
|
-
<WixPatternsProvider>
|
|
98
|
-
<MyCollectionPage />
|
|
99
|
-
</WixPatternsProvider>
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// MyCollectionPage.tsx
|
|
104
|
-
import { Table, useTableCollection, OffsetQuery } from '@wix/patterns';
|
|
105
|
-
import { CollectionPage } from '@wix/patterns/page';
|
|
106
|
-
|
|
107
|
-
function MyCollectionPage() {
|
|
108
|
-
// works — the provider context exists above this component
|
|
109
|
-
const state = useTableCollection({
|
|
110
|
-
queryName: 'my-items',
|
|
111
|
-
itemKey: (item) => item.id,
|
|
112
|
-
itemName: (item) => item.name,
|
|
113
|
-
fetchData: async (query: OffsetQuery) => ({ items: [], total: 0 }),
|
|
114
|
-
filters: {},
|
|
115
|
-
});
|
|
116
|
-
return (
|
|
117
|
-
<CollectionPage>
|
|
118
|
-
<Table state={state} columns={[{ title: 'Name', render: (item) => item.name }]} />
|
|
119
|
-
</CollectionPage>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
```
|
|
41
|
+
| Anything collection-shaped — tables, filters, search, aggregates, row and bulk actions, empty states | `dist/docs/Collection Toolkit.md` |
|
|
42
|
+
| The path from a listed row to one record, and its form | `dist/docs/Collection to Entity Flow.md` |
|
|
123
43
|
|
|
124
|
-
|
|
44
|
+
Each guide's index entry carries `relatedComponents`; every name in it resolves, because `@wix/patterns` fails its own build otherwise. Prefer one of those over a name you recall.
|
|
125
45
|
|
|
126
|
-
|
|
46
|
+
### 4 — Read only what answers your question, then stop
|
|
127
47
|
|
|
128
|
-
|
|
48
|
+
| Your question | Read | Path |
|
|
49
|
+
| --- | --- | --- |
|
|
50
|
+
| What is it, and how does it wire in? | **nothing** — the entry says | `summary` |
|
|
51
|
+
| Where do I import it from? | **nothing** — the entry says | `importPath` |
|
|
52
|
+
| How do I call it? | one **example**, or a call in a guide's prose | `dist/examples/<examples[i]>` · `dist/docs/<guide>.md` |
|
|
53
|
+
| What props, and which are optional? | the **example** first; then the **`.d.ts`** *or* the doc — never both | `bundle` present: `dist/dts-bundle/<bundle>` · absent: `dist/docs/<file>` |
|
|
54
|
+
| A setup requirement or gotcha? | the **doc's** prose | `dist/docs/<file>` |
|
|
129
55
|
|
|
130
|
-
|
|
56
|
+
Prefix the index's bare values with their tree — `file` → `dist/docs/`, `examples` → `dist/examples/`, `bundle` → `dist/dts-bundle/` — and never rebuild a path from a symbol name.
|
|
131
57
|
|
|
132
|
-
|
|
58
|
+
**Those two middle rows are one question in practice.** You ask how to call it, start writing, and the question turns prop-shaped mid-call — where the second row sends you to a `.d.ts` that may be stubbed (step 5). Take the props off the example first; go to the `.d.ts` only for what it cannot show — optionality, union members, an exact callback signature.
|
|
133
59
|
|
|
134
|
-
|
|
60
|
+
**A guide's prose often holds the call.** `PrimaryActions`' bundle stubs its own props type, while `usePatternsNavigate.md` carries `<PrimaryActions label="Add shift" onClick={…} />` verbatim. Check what you have already read before opening anything.
|
|
135
61
|
|
|
136
|
-
|
|
62
|
+
**`bundle` and a doc props table are mutually exclusive.** With `bundle`, the page's `### Props` is only a pointer; without it, that table marks what is required. Reading both is one hop too many.
|
|
137
63
|
|
|
138
|
-
|
|
64
|
+
**A `.d.ts` names props; it never says what they do.** Wiring and defaults live in prose: `CollectionSearch`'s bundle lists four optional props and no behaviour, while its page says the search term reaches your `fetchData` via `query.search`. When a behaviour question outlives the `summary`, open the page.
|
|
139
65
|
|
|
140
|
-
|
|
66
|
+
**Artifact not listed?** No `examples` — a hook's usage is usually filed under the component it pairs with (`useEntityPage` → `EntityPage/basic.tsx`). No `importPath` — a guide, or documented but not exported. Nothing at all — a state object you receive rather than construct; its doc is the only source.
|
|
141
67
|
|
|
142
|
-
|
|
68
|
+
### 5 — Traps that make a read wrong
|
|
143
69
|
|
|
144
|
-
|
|
70
|
+
**Search inside the file an index named, never across the tree.** A shared shape is re-stubbed in every bundle referencing it, so a tree-wide `grep` returns mostly pointers, and the first hit is rarely the declaration.
|
|
145
71
|
|
|
146
|
-
|
|
72
|
+
**Most bundles stub the parent holding the props — 70 of the 105 curated entries do** — and the index says so per entry. **`dist/dts-bundle/index.json` is the triage surface, not merely a fallback for names the docs index lacks:** a component entry carries `ownProps` / `inheritedProps` beside `bytes` and `readWith`, so "is this file the whole answer" is a lookup, not an inspection.
|
|
147
73
|
|
|
148
|
-
|
|
74
|
+
- `Table` → `ownProps: 5, inheritedProps: 58`, `readWith` naming 3 files. Five of sixty-three.
|
|
75
|
+
- `PrimaryActions` → `ownProps: 0, inheritedProps: 12`. A 470-byte file declaring none of them.
|
|
76
|
+
- No `ownProps` on a component entry means no split — that file *is* the whole answer.
|
|
149
77
|
|
|
150
|
-
|
|
78
|
+
A split is not a dead end: the parent is a real file, `readWith` names it, and from 1.469.0 so does the stub inside the file (`Full shape: types/Filter.d.ts`). **Read that one file — one hop, not N.** The rest of `readWith` is types referenced *inside* it, opened only if needed. Judge by the entry's own `bytes`, never `readWithBytes` — `Table`'s are 5,277 against 31,731 — since the combined figure talks you out of a read you should just do. A `…Params` type built from `Pick<>`/`Omit<>` is the same trap in another shape.
|
|
151
79
|
|
|
152
|
-
|
|
80
|
+
**When you do need several `readWith` files, read them in one call** — one `Read` per file in a single message. Reads measure ~21 ms each, so ten is a fifth of a second and one round trip. Deciding is what costs: decide once, then batch, and never hop one file per turn. Batching is not a licence to skip the filter, though — a few deliberate reads beat dozens of just-in-case ones.
|
|
153
81
|
|
|
154
|
-
|
|
155
|
-
| --- | --- |
|
|
156
|
-
| Navigate from a row / primary action to the item | `usePatternsNavigate()` → `navigateToEntityPage({ path, entity })` |
|
|
157
|
-
| Register the route | `PatternsReactRoute` inside `PatternsReactRouter` |
|
|
158
|
-
| Fetch, save, validation, dirty state, skeletons, errors | `useEntityPage({ fetch, onSave })` |
|
|
159
|
-
| Form state and field binding | `useForm` / `useController` from `@wix/patterns/form` — `useController`, never `register` |
|
|
160
|
-
| Body layout | `EntityPage.Header`, `.MainContent`, `.AdditionalContent`, `.Card` |
|
|
161
|
-
| The individual fields inside those cards | `@wix/design-system` (`FormField`, `Input`, `Text`) |
|
|
82
|
+
**If the parent is large, take the declaration `tsc` uses.** `dist/types/components/CollectionTable/CollectionTable.d.ts` is 5,919 B against the bundle's 20,802 B, carries JSDoc, and states `columns: TableColumn<T>[]` (required) outright. Nothing there is stubbed, so a `grep` for a prop name is reliable. This case only.
|
|
162
83
|
|
|
163
|
-
|
|
84
|
+
The generated files' conventions — which one-line stubs are answers rather than truncation, how entry-point files are scoped — are in `dist/docs/Reading the Doc Indices.md`, worth reading before your first `dist/dts-bundle/*.d.ts` of the session.
|
|
164
85
|
|
|
165
|
-
|
|
86
|
+
### Rules for the reads themselves
|
|
166
87
|
|
|
167
|
-
|
|
88
|
+
- **Use the exact `file`, `bundle` and `examples` values, prefixed per step 4.** Bundles nest one directory per kind, so `<Name>.d.ts` at the top level is wrong by construction, and an example slug is not derivable from a title.
|
|
89
|
+
- **Extract from the file the index named.** A whole-file `Read` is safe (`bytes` gives the size first); a scoped `grep`/`sed` is cheaper. If an extraction is empty or ambiguous, read the whole file rather than guess.
|
|
90
|
+
- **A `@wix/design-system` name is not yours to look up here.** Use the `wix-design-system` skill; never follow a deep `@wix/design-system/dist/...` path a bundle mentions.
|
|
91
|
+
- **If a name is in neither index, stop and say so**, naming the path that dead-ended. A wrong guess compiles and breaks at runtime.
|
|
168
92
|
|
|
169
|
-
|
|
93
|
+
## When Patterns Has No Equivalent
|
|
170
94
|
|
|
171
|
-
|
|
172
|
-
2. Render it *inside* the patterns page shell / collection, not as a replacement for it.
|
|
173
|
-
3. If WDS lacks it too, compose from WDS primitives (`Box`, `Card`, `Text`) — never restyle patterns internals, never add another UI library.
|
|
95
|
+
A concept is only "missing" after you have checked both indices **and** searched by keyword in what you have read. Then look it up via the `wix-design-system` skill and render it *inside* the patterns page shell rather than in place of it; if WDS lacks it too, compose from `Box`, `Card` and `Text`. Never restyle patterns internals, and never add another UI library.
|
|
174
96
|
|
|
175
|
-
Anything page- or collection-shaped
|
|
97
|
+
Anything page- or collection-shaped is patterns' territory; building one from WDS parts means a skipped lookup.
|
|
@@ -112,7 +112,6 @@ Presentation success applies across all five stages. Choose both the right **rep
|
|
|
112
112
|
| **Kanban** | Work moves through meaningful stages. | Stage, workload, and valid movement are understandable. |
|
|
113
113
|
| **Timeline or calendar** | Time, sequence, or scheduling matters. | Upcoming activity, conflicts, and timing are clear. |
|
|
114
114
|
| **Chart** | The user needs to understand a trend or relationship. | The visualization answers a specific business question. |
|
|
115
|
-
| **Summary metrics** | The user needs a quick health signal. | Metrics clarify current conditions and where to focus. |
|
|
116
115
|
|
|
117
116
|
- Choose the default view that best supports the primary task.
|
|
118
117
|
- Offer another view only when it provides distinct value.
|
|
@@ -130,7 +129,7 @@ Choose the smallest interface that gives users enough context and room to comple
|
|
|
130
129
|
| **Entity page** | The task involves complex details, multi-section editing, history, or related information. | The user has enough space and structure to complete deeper work. |
|
|
131
130
|
| **Inline or expanded row** | The user needs a quick inspection or simple action. | Detail appears without creating a separate workspace. |
|
|
132
131
|
|
|
133
|
-
Which Wix primitive builds each of these — and which components serve the summaries, filters and empty states named above — is in
|
|
132
|
+
Which Wix primitive builds each of these — and which components serve the summaries, filters and empty states named above — is in the installed package's `Collection Toolkit.md` guide — reached through [The Discovery Chain](../WIX_PATTERNS_DOCS.md#the-discovery-chain). Patterns has no side panel; that one is WDS.
|
|
134
133
|
|
|
135
134
|
|
|
136
135
|
## Data Success
|