@wix/agent-skills 1.18.0 → 1.18.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 +4 -4
- package/skills/wix-app/references/APP_VALIDATION.md +7 -33
- package/skills/wix-app/references/DASHBOARD_PAGE.md +18 -14
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +75 -92
- package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +23 -26
- package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +7 -6
- package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +71 -4
- package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +67 -7
- package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +1 -1
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +9 -6
- package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +59 -89
- package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +23 -4
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +29 -14
- package/skills/wix-base44-connector/SKILL.md +168 -48
- package/skills/wix-base44-connector/scripts/{utils.js → utils.cjs} +69 -48
- package/skills/wix-docs/SKILL.md +109 -111
- package/skills/wix-docs/references/API_SPEC_SEARCH.md +35 -23
- package/skills/wix-docs/references/CALLING.md +91 -0
- package/skills/wix-docs/references/EXTRACTING.md +5 -3
- package/skills/wix-headless/references/DOC_DISCOVERY.md +9 -3
- package/skills/wix-headless/references/inline-recipes/setup-forms.md +57 -10
- package/skills/wix-manage/SKILL.md +106 -92
- package/skills/wix-manage/references/dashboard-navigation/routes.json +12 -52
- package/skills/wix-manage/references/ecommerce/shipping/ecom-shipping-api.md +0 -2
- package/skills/wix-manage/references/forms/create-form.md +272 -184
- package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +13 -10
- package/skills/wix-manage/references/forms/update-form.md +122 -0
- package/skills/wix-manage/references/media/generate-image-with-ai.md +86 -0
- package/skills/wix-manage/references/seo/manage-content-plan.md +247 -0
- package/skills/wix-manage/references/seo/manage-seo-tags.md +59 -6
- package/skills/wix-manage/references/stores/change-store-currency.md +10 -0
- package/skills/wix-manage/references/stores/create-product-catalog-v3.md +16 -1
- package/skills/wix-manage/references/stores/update-product-with-options.md +9 -0
- package/skills/wix-vibe-headless/SKILL.md +17 -18
- package/skills/wix-vibe-headless/install/pin-agents-md.cjs +1 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed-with-install.md +118 -0
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +55 -62
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +31 -29
- package/skills/wix-vibe-headless/platforms/base44.md +12 -5
- package/skills/wix-vibe-headless/platforms/generic.md +13 -12
- package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +4 -13
- package/skills/wix-vibe-headless/references/blog/seed/SEED.md +4 -8
- package/skills/wix-vibe-headless/references/blog/seed/{seed-blog.js → seed-blog.cjs} +2 -3
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +5 -14
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +5 -9
- package/skills/wix-vibe-headless/references/bookings/seed/{seed-bookings.js → seed-bookings.cjs} +2 -2
- package/skills/wix-vibe-headless/references/bookings/seed/{seed-rentals.js → seed-rentals.cjs} +3 -3
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +1 -1
- package/skills/wix-vibe-headless/references/cms/seed/SEED.md +2 -2
- package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +4 -13
- package/skills/wix-vibe-headless/references/events/seed/SEED.md +3 -7
- package/skills/wix-vibe-headless/references/events/seed/{seed-events.js → seed-events.cjs} +2 -2
- package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +24 -7
- package/skills/wix-vibe-headless/references/forms/seed/SEED.md +91 -17
- package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +4 -13
- package/skills/wix-vibe-headless/references/members/seed/SEED.md +2 -3
- package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +4 -13
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +1 -1
- package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +3 -7
- package/skills/wix-vibe-headless/references/portfolio/seed/{seed-portfolio.js → seed-portfolio.cjs} +2 -2
- package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +5 -14
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +1 -1
- package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +3 -7
- package/skills/wix-vibe-headless/references/pricing-plans/seed/{seed-pricing-plans.js → seed-pricing-plans.cjs} +2 -2
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -15
- package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +3 -7
- package/skills/wix-vibe-headless/references/restaurants/seed/{seed-restaurants.js → seed-restaurants.cjs} +2 -2
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +359 -327
- package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +1 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +2 -2
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +63 -78
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +59 -43
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +46 -10
- package/skills/wix-vibe-headless/references/storefront/seed/{seed-store.js → seed-store.cjs} +163 -25
- package/skills/wix-vibe-headless/references/storefront/app/pages/Shop.jsx +0 -75
|
@@ -23,7 +23,7 @@ Everything is under `.agents/skills/wix-vibe-headless/references/`.
|
|
|
23
23
|
**shapes**, fieldsets, and paging.
|
|
24
24
|
- `app/{components,pages,hooks,context}/…` — a **reference UI** (+ hooks/providers) built on that data
|
|
25
25
|
layer; the field shapes and route patterns it uses (e.g. `/product/:slug`) are the data contract.
|
|
26
|
-
- `seed/seed-*.
|
|
26
|
+
- `seed/seed-*.cjs` — build-time **seeding functions** that create content.
|
|
27
27
|
- `INSTRUCTIONS.md` — the vertical's build guide + field-shape snippets; `seed/SEED.md` — how the seed
|
|
28
28
|
module is run.
|
|
29
29
|
|
|
@@ -31,15 +31,15 @@ Everything is under `.agents/skills/wix-vibe-headless/references/`.
|
|
|
31
31
|
|
|
32
32
|
| vertical | `app/rest/` data layer | seed module |
|
|
33
33
|
|---|---|---|
|
|
34
|
-
| storefront | `wix-store-catalog.js`, `wix-store-cart.js` — products & variants; server cart + checkout redirect | `seed-store.
|
|
35
|
-
| bookings | `wix-bookings-services.js`, `wix-bookings-checkout.js` — services/categories/slots; booking + checkout | `seed-bookings.
|
|
36
|
-
| blog | `wix-blog.js` — posts (list + by-slug), categories, tags | `seed-blog.
|
|
37
|
-
| events | `wix-events-browse.js`, `wix-events-registration.js` — events & categories; RSVP / ticketing + checkout | `seed-events.
|
|
38
|
-
| portfolio | `wix-portfolio.js` — collections, projects, galleries | `seed-portfolio.
|
|
39
|
-
| restaurants | `wix-restaurants-menu.js`, `-ordering.js`, `-reservations.js` — menu; online ordering; table reservations | `seed-restaurants.
|
|
34
|
+
| storefront | `wix-store-catalog.js`, `wix-store-cart.js` — products & variants; server cart + checkout redirect | `seed-store.cjs` |
|
|
35
|
+
| bookings | `wix-bookings-services.js`, `wix-bookings-checkout.js` — services/categories/slots; booking + checkout | `seed-bookings.cjs` |
|
|
36
|
+
| blog | `wix-blog.js` — posts (list + by-slug), categories, tags | `seed-blog.cjs` |
|
|
37
|
+
| events | `wix-events-browse.js`, `wix-events-registration.js` — events & categories; RSVP / ticketing + checkout | `seed-events.cjs` |
|
|
38
|
+
| portfolio | `wix-portfolio.js` — collections, projects, galleries | `seed-portfolio.cjs` |
|
|
39
|
+
| restaurants | `wix-restaurants-menu.js`, `-ordering.js`, `-reservations.js` — menu; online ordering; table reservations | `seed-restaurants.cjs` |
|
|
40
40
|
| forms | `wix-forms.js`, `wix-forms-submissions.js` — any visitor-fillable form: read the schema; upload attachments, create a submission (schema accessors ship alongside in `lib/wix-form-schema-utils.js`) | *(none — REST shapes in `seed/SEED.md`)* |
|
|
41
|
-
| cms | `wix-cms.js` — Wix Data collections: list / detail / filter | `seed
|
|
42
|
-
| pricing-plans | `wix-pricing-plans.js` — plans list + subscribe/checkout | `seed-pricing-plans.
|
|
41
|
+
| cms | `wix-cms.js` — Wix Data collections: list / detail / filter | *(none — see `seed/SEED.md`)* |
|
|
42
|
+
| pricing-plans | `wix-pricing-plans.js` — plans list + subscribe/checkout | `seed-pricing-plans.cjs` |
|
|
43
43
|
| members | `wix-members-auth.js` — custom login/signup (email+password, social, SSO), session, account | *(none — members sign up at runtime; nothing to seed)* |
|
|
44
44
|
|
|
45
45
|
Anything in the docs about the **host's own setup** — copying files into `src/`, its `@/` alias, its
|
|
@@ -57,7 +57,7 @@ within each. **One exception — `forms` must be seeded before its UI is built;
|
|
|
57
57
|
### 1 · Install the skills
|
|
58
58
|
|
|
59
59
|
Two skills, into `.agents/skills/`: **`wix-vibe-headless`** (this build guide + the seed modules —
|
|
60
|
-
self-contained) and **`wix-docs`** (
|
|
60
|
+
self-contained) and **`wix-docs`** (search/read the Wix API reference).
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
63
|
CI=1 npx skills@latest add wix/skills/skills/wix-vibe-headless --yes
|
|
@@ -110,8 +110,9 @@ V=<vertical>
|
|
|
110
110
|
find .agents/skills/wix-vibe-headless/references/$V/seed -name '*.js' -exec tail -n +1 {} +
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
They encode the Wix API sequences (incl. app-install + provisioning-race handling)
|
|
114
|
-
|
|
113
|
+
They encode the Wix API sequences (incl. app-install + provisioning-race handling). For anything
|
|
114
|
+
they don't cover, consult the official Wix API documentation using the documentation skill available
|
|
115
|
+
in your environment. Content queries return `REQUIRED_APP_NOT_INSTALLED` until the app is
|
|
115
116
|
installed + seeded (expected; the seed modules install it first). Image seeding = two Wix Media calls
|
|
116
117
|
(`generate-upload-url` → `PUT` the bytes) before attaching.
|
|
117
118
|
|
|
@@ -40,16 +40,9 @@ end). (Files missing? the install's `deploy` result lists what it wrote; re-run
|
|
|
40
40
|
`references/blog/app/` → `src/`.)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
## STEP 2 — Theme
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
`--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`, `text-foreground`,
|
|
47
|
-
`bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`, `font-display`). Those tokens
|
|
48
|
-
are **already set to the brand by the design phase**, so the shipped pages are themed with zero work
|
|
49
|
-
here. To adjust the palette, edit `index.css` (`:root` **and** `.dark`) — the base44 way; **never add
|
|
50
|
-
a parallel theme file (e.g. a `theme.css`) or restyle the shipped JSX.** Build the Home/Header you add
|
|
51
|
-
(STEP 3) from the **same** base44 tokens/classes so it matches automatically. A dark brand is just
|
|
52
|
-
base44's dark palette in `index.css` — no per-component work.
|
|
43
|
+
## STEP 2 — Theme
|
|
44
|
+
Use the existing Base44 theme in `src/index.css` so your pages and the shipped components
|
|
45
|
+
share the same colors and typography.
|
|
53
46
|
|
|
54
47
|
## STEP 3 — Wire routes + provider (surgical `find_replace` on `src/App.jsx`, never a rewrite)
|
|
55
48
|
**No file reads needed to wire this.** Every shipped page and `WixManageBanner` is a default export that takes **no props** — wire them exactly as the snippet shows; nothing in those files needs looking up.
|
|
@@ -206,10 +199,9 @@ reference page inline.
|
|
|
206
199
|
included; add them as an authenticated `wixApiRequest` call).
|
|
207
200
|
|
|
208
201
|
Fallback only — when you hit an error or need something not shown here: read the relevant shipped file
|
|
209
|
-
under `src/`, or look it up via the
|
|
202
|
+
under `src/`, or look it up via the documentation skill available in your environment.
|
|
210
203
|
|
|
211
204
|
## Hard rules
|
|
212
|
-
- Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
|
|
213
205
|
- Header/footer live in a `Layout` around `<Outlet/>` (STEP 3) — never edit the shipped `Blog`/`PostDetail`/category/tag pages to add chrome.
|
|
214
206
|
- The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your `Header` is plain in-flow markup (not `position:fixed`).
|
|
215
207
|
- Route by `slug` through the shipped helpers — never hand-build a post/category/tag URL. Display categories/tags by `.label` (not `.name`).
|
|
@@ -226,7 +218,6 @@ connector) — separate from this client build; run in parallel.
|
|
|
226
218
|
|
|
227
219
|
## Verify (before declaring done)
|
|
228
220
|
- [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
|
|
229
|
-
- [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
|
|
230
221
|
- [ ] **Opened the vertical's data route(s)** (not just the home page) — `/blog` and a post detail page (plus a category/tag page) — and confirmed the shipped components render themed (surface, text, brand) with images.
|
|
231
222
|
- [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all routes; shipped `Blog`/`PostDetail`/`CategoryPage`/`TagPage` untouched; content clears the fixed chrome; `<TaxonomyProvider>` wraps the tree.
|
|
232
223
|
- [ ] Feed lists live published posts (newest first) and paginates via `nextCursor`; post detail loads by `slug`; a bad slug shows the not-found state (no invented post).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Blog — seeding
|
|
2
2
|
|
|
3
|
-
Seed a Wix Blog (Blog V3) by **calling `seed-blog.
|
|
3
|
+
Seed a Wix Blog (Blog V3) by **calling `seed-blog.cjs`** — don't hand-write the REST calls. It's
|
|
4
4
|
a build-time module (run via `exec_tool`, not shipped in the app) that abstracts every Wix Blog
|
|
5
5
|
seed operation. `require` it and call the functions with plain data.
|
|
6
6
|
|
|
7
7
|
> **NOT yet live-verified — transcribed from `setup-blog.md`.** Endpoints/fields mirror the recipe
|
|
8
|
-
> exactly; if a call returns an unexpected shape, use the
|
|
8
|
+
> exactly; if a call returns an unexpected shape, use the documentation skill available in your environment (never guess).
|
|
9
9
|
|
|
10
10
|
**DEFAULT — one call.** `setupBlog(ctx, plan)` runs the whole flow (memberId → categories/tags →
|
|
11
11
|
posts → covers), keeping every id in memory. Pass category/tag **names** and it resolves them to
|
|
@@ -15,11 +15,7 @@ for you (Blog binds the cover by the Wix Media file id, not a url).
|
|
|
15
15
|
```js
|
|
16
16
|
// build-time exec_tool
|
|
17
17
|
const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix");
|
|
18
|
-
const
|
|
19
|
-
// exec_tool's require can return EMPTY exports for these build-time modules — load the file itself:
|
|
20
|
-
const seed = (() => { const m = { exports: {} };
|
|
21
|
-
new Function("module", "exports", "require", fs.readFileSync("/app/.agents/skills/wix-vibe-headless/references/blog/seed/seed-blog.js", "utf8"))(m, m.exports, require);
|
|
22
|
-
return m.exports; })();
|
|
18
|
+
const seed = require(require("path").resolve(".agents/skills/wix-vibe-headless/references/blog/seed/seed-blog.cjs"));
|
|
23
19
|
const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
24
20
|
|
|
25
21
|
const result = await seed.setupBlog(ctx, {
|
|
@@ -88,7 +84,7 @@ first** (`installBlogApp`, idempotent), so seeding works even if the site doesn'
|
|
|
88
84
|
|
|
89
85
|
## Reference
|
|
90
86
|
If a call returns a shape you didn't expect, or you need an operation this module doesn't cover,
|
|
91
|
-
use the
|
|
87
|
+
use the documentation skill available in your environment to search + read the live Wix Blog API reference — never guess. The
|
|
92
88
|
authoritative source recipe is `wix-headless/references/inline-recipes/setup-blog.md`.
|
|
93
89
|
|
|
94
90
|
Read a method's page before writing its call: it carries the exact body shape, the required
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Usage (build-time exec_tool):
|
|
8
8
|
// const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix"); // Base44
|
|
9
|
-
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/blog/seed/seed-blog.
|
|
9
|
+
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/blog/seed/seed-blog.cjs");
|
|
10
10
|
// const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
11
11
|
// const memberId = await seed.getAuthorMemberId(ctx); // STEP 1 — required for every post
|
|
12
12
|
// const cats = await seed.createCategories(ctx, ["Recipes", "Brewing"]); // STEP 3 — only if the brief groups posts
|
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
// await seed.attachPostCovers(ctx, posts.map((p, i) => ({ postId: p.id, fileId: files[i].id })));
|
|
23
23
|
//
|
|
24
24
|
// Live-verified end-to-end (members author, categories, posts single+bulk, tags, covers, idempotent
|
|
25
|
-
// re-runs). If any call ever fails with a shape the caller didn't expect, fall back to the
|
|
26
|
-
// skill (search + read the live Wix Blog API reference) — never guess. Source recipe:
|
|
25
|
+
// re-runs). If any call ever fails with a shape the caller didn't expect, fall back to the documentation skill available in your environment (search + read the live Wix Blog API reference) — never guess. Source recipe:
|
|
27
26
|
// wix-headless/references/inline-recipes/setup-blog.md.
|
|
28
27
|
|
|
29
28
|
const API = "https://www.wixapis.com";
|
|
@@ -51,16 +51,9 @@ the end). (Files missing? the install's `deploy` result lists what it wrote; re-
|
|
|
51
51
|
`references/bookings/app/` → `src/`.)
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
## STEP 2 — Theme
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
`--muted`, `--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`,
|
|
58
|
-
`text-foreground`, `bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`,
|
|
59
|
-
`font-display`). Those tokens are **already set to the brand by the design phase**, so the shipped
|
|
60
|
-
pages are themed with zero work here. To adjust the palette, edit `index.css` (`:root` **and**
|
|
61
|
-
`.dark`) — the base44 way; **never add a parallel theme file (e.g. a `theme.css`) or restyle the
|
|
62
|
-
shipped JSX.** Build the Home/Header you add (STEP 3) from the **same** base44 tokens/classes so it
|
|
63
|
-
matches automatically. A dark brand is just base44's dark palette in `index.css` — no per-component work.
|
|
54
|
+
## STEP 2 — Theme
|
|
55
|
+
Use the existing Base44 theme in `src/index.css` so your pages and the shipped components
|
|
56
|
+
share the same colors and typography.
|
|
64
57
|
|
|
65
58
|
## STEP 3 — Wire routes (surgical `find_replace` on `src/App.jsx`, never a rewrite)
|
|
66
59
|
**No file reads needed to wire this.** Every shipped page and `WixManageBanner` is a default export that takes **no props** — wire them exactly as the snippet shows; nothing in those files needs looking up.
|
|
@@ -207,7 +200,7 @@ window.location.href = checkoutUrl; // hosted checkout; on return the booking
|
|
|
207
200
|
## Extending the client
|
|
208
201
|
The shipped flow covers **APPOINTMENT and CLASS** services (`listSlotsForService` routes by
|
|
209
202
|
`service.type`). For anything beyond that, add a helper on `wixApiRequest`, looking the endpoint up
|
|
210
|
-
|
|
203
|
+
using the documentation skill available in your environment first (never guess):
|
|
211
204
|
- **COURSE** enrollment — a course is enrolled as a *whole*, not per session; `listEventTimeSlots`
|
|
212
205
|
returns no slots for it, so the slot-picker flow doesn't apply (course-specific flow).
|
|
213
206
|
- **Service variants / participants** (duration- or person-based pricing), **add-ons**, and
|
|
@@ -217,7 +210,7 @@ in the **`wix-docs`** skill first (never guess):
|
|
|
217
210
|
them see their own appointments.
|
|
218
211
|
|
|
219
212
|
Fallback only — when you hit an error or need something not shown here: read the relevant shipped
|
|
220
|
-
file under `src/`, or look it up via the
|
|
213
|
+
file under `src/`, or look it up via the documentation skill available in your environment. Each helper in
|
|
221
214
|
`wix-bookings-services.js` / `wix-bookings-checkout.js` links its own reference page inline; these are
|
|
222
215
|
the areas they sit in:
|
|
223
216
|
- Bookings (services, categories, bookings): https://dev.wix.com/docs/api-reference/business-solutions/bookings.md
|
|
@@ -269,7 +262,6 @@ identical.
|
|
|
269
262
|
- **One unit type per service.** A room rented by the hour *and* by the day is two services.
|
|
270
263
|
|
|
271
264
|
## Hard rules
|
|
272
|
-
- Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
|
|
273
265
|
- Header/footer live in a `Layout` around `<Outlet/>` (STEP 3) — never edit the shipped
|
|
274
266
|
`Services`/`ServiceDetail` to add chrome.
|
|
275
267
|
- The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your
|
|
@@ -297,7 +289,6 @@ build; run in parallel.
|
|
|
297
289
|
|
|
298
290
|
## Verify (before declaring done)
|
|
299
291
|
- [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
|
|
300
|
-
- [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
|
|
301
292
|
- [ ] **Opened `/services` and a service detail page** (not just the home page) and confirmed the shipped cards render themed (surface, text, brand color) with images.
|
|
302
293
|
- [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all
|
|
303
294
|
routes; shipped `Services`/`ServiceDetail` untouched; content clears the fixed chrome.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bookings — seeding
|
|
2
2
|
|
|
3
|
-
Seed a Wix Bookings catalog by **calling `seed-bookings.
|
|
3
|
+
Seed a Wix Bookings catalog by **calling `seed-bookings.cjs`** — don't hand-write the REST calls.
|
|
4
4
|
It's a build-time module (run via `exec_tool`, not shipped in the app) that abstracts every Wix
|
|
5
5
|
Bookings seed operation. Load it and call **`setupBookings` — the one-call path** — with plain data.
|
|
6
6
|
|
|
@@ -9,11 +9,7 @@ Bookings seed operation. Load it and call **`setupBookings` — the one-call pat
|
|
|
9
9
|
```js
|
|
10
10
|
// build-time exec_tool
|
|
11
11
|
const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix");
|
|
12
|
-
const
|
|
13
|
-
// exec_tool's require can return EMPTY exports for these build-time modules — load the file itself:
|
|
14
|
-
const seed = (() => { const m = { exports: {} };
|
|
15
|
-
new Function("module", "exports", "require", fs.readFileSync("/app/.agents/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.js", "utf8"))(m, m.exports, require);
|
|
16
|
-
return m.exports; })();
|
|
12
|
+
const seed = require(require("path").resolve(".agents/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.cjs"));
|
|
17
13
|
const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
18
14
|
|
|
19
15
|
// ONE call: install → resolve staff → categories → services → CLASS sessions → images, all in the
|
|
@@ -103,12 +99,12 @@ same body; don't loop and don't re-create the ones that already succeeded.
|
|
|
103
99
|
|
|
104
100
|
## Rentals
|
|
105
101
|
|
|
106
|
-
`seed-rentals.
|
|
102
|
+
`seed-rentals.cjs` is the rentals half — the same transport, a different create order and payload.
|
|
107
103
|
Wix Rentals has no APIs of its own, so a rental is a Bookings service with rentals-specific
|
|
108
104
|
field values.
|
|
109
105
|
|
|
110
106
|
```js
|
|
111
|
-
const seed = require("
|
|
107
|
+
const seed = require(require("path").resolve(".agents/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.cjs"));
|
|
112
108
|
await seed.setupRentals(ctx, {
|
|
113
109
|
resourceTypeName: "Meeting rooms",
|
|
114
110
|
resources: ["Room A", "Room B"], // parallel capacity = MORE RESOURCES
|
|
@@ -144,7 +140,7 @@ than a multi-service group. Pass `workingHours` only when the brief names openin
|
|
|
144
140
|
|
|
145
141
|
## Reference
|
|
146
142
|
If a call returns a shape you didn't expect, or you need an operation this module doesn't cover,
|
|
147
|
-
use the
|
|
143
|
+
use the documentation skill available in your environment to search + read the live Wix API reference — never guess. The
|
|
148
144
|
authoritative source recipe is `wix-headless/references/inline-recipes/setup-bookings.md`.
|
|
149
145
|
|
|
150
146
|
Read a method's page before writing its call: it carries the exact body shape, the required
|
package/skills/wix-vibe-headless/references/bookings/seed/{seed-bookings.js → seed-bookings.cjs}
RENAMED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Usage (build-time exec_tool):
|
|
10
10
|
// const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix"); // Base44 (generic: use $TOKEN)
|
|
11
|
-
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.
|
|
11
|
+
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.cjs");
|
|
12
12
|
// const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
13
13
|
//
|
|
14
14
|
// await seed.installBookingsApp(ctx); // if the site doesn't have Wix Bookings yet
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
// // await seed.attachServiceImage(ctx, { serviceId: s.id, revision: s.revision, image: { id: file.id, url: file.url, width: 1024, height: 1024 } });
|
|
33
33
|
//
|
|
34
34
|
// If any call fails with a shape the caller didn't expect, or you need an operation this module
|
|
35
|
-
// doesn't cover, fall back to the
|
|
35
|
+
// doesn't cover, fall back to the documentation skill available in your environment (search + read the live Wix API reference) —
|
|
36
36
|
// never guess. Source recipe (authoritative): wix-headless/references/inline-recipes/setup-bookings.md.
|
|
37
37
|
|
|
38
38
|
const API = "https://www.wixapis.com";
|
package/skills/wix-vibe-headless/references/bookings/seed/{seed-rentals.js → seed-rentals.cjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Rentals seed helpers — run at BUILD TIME via exec_tool (NOT shipped in the app).
|
|
2
|
-
// A DELTA on seed-bookings.
|
|
2
|
+
// A DELTA on seed-bookings.cjs: Wix Rentals has no APIs of its own, so a rental is a Bookings
|
|
3
3
|
// service carrying rentals-specific field values. Everything about the transport, images and
|
|
4
4
|
// error handling is the same; only the create order and the service payload differ.
|
|
5
5
|
//
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// Usage (build-time exec_tool) — prefer `setupRentals`, which runs the whole flow in the one order
|
|
10
10
|
// that works and threads the resource ids into each service for you:
|
|
11
11
|
// const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix");
|
|
12
|
-
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.
|
|
12
|
+
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.cjs");
|
|
13
13
|
// const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
14
14
|
// await seed.setupRentals(ctx, {
|
|
15
15
|
// resourceTypeName: "Meeting rooms",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
// 2. Resources created before the service, and their ids listed in `serviceResources[].resourceIds`.
|
|
28
28
|
// 3. No category — a rental is surfaced by its `appId`, not by a Bookings category.
|
|
29
29
|
//
|
|
30
|
-
// Images are reused from seed-bookings.
|
|
30
|
+
// Images are reused from seed-bookings.cjs — require both.
|
|
31
31
|
// Source recipe: wix-headless/references/inline-recipes/setup-rentals.md.
|
|
32
32
|
|
|
33
33
|
const API = "https://www.wixapis.com";
|
|
@@ -148,7 +148,7 @@ Validate the mime type and the size there as well.
|
|
|
148
148
|
|
|
149
149
|
## Fallback — beyond the helpers
|
|
150
150
|
Need something the helpers don't cover? Call it yourself with `wixApiRequest`, but look up the exact
|
|
151
|
-
endpoint/method/body in the official Wix reference first (or use the
|
|
151
|
+
endpoint/method/body in the official Wix reference first (or use the documentation skill available in your environment) — never guess.
|
|
152
152
|
- Data Items API: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items.md
|
|
153
153
|
- Partial update (Patch): https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/patch-data-item.md
|
|
154
154
|
- Upsert by id (Save): https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/save-data-item.md
|
|
@@ -141,5 +141,5 @@ permission scope, and the response envelope.
|
|
|
141
141
|
- Bulk Insert Data Item References: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/bulk-insert-data-item-references.md
|
|
142
142
|
- Data Items API: https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items.md
|
|
143
143
|
- Collections: https://dev.wix.com/docs/api-reference/business-solutions/cms/collection-management/data-collections.md
|
|
144
|
-
- Anything not covered → use the
|
|
145
|
-
- Anything not covered → use the
|
|
144
|
+
- Anything not covered → use the documentation skill available in your environment (search + read the live reference); never guess.
|
|
145
|
+
- Anything not covered → use the documentation skill available in your environment (search + read the live reference); never guess.
|
|
@@ -47,16 +47,9 @@ end). (Files missing? the install's `deploy` result lists what it wrote; re-run
|
|
|
47
47
|
`references/events/app/` → `src/`.)
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
## STEP 2 — Theme
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
`--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`, `text-foreground`,
|
|
54
|
-
`bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`, `font-display`). Those tokens
|
|
55
|
-
are **already set to the brand by the design phase**, so the shipped pages are themed with zero work
|
|
56
|
-
here. To adjust the palette, edit `index.css` (`:root` **and** `.dark`) — the base44 way; **never add
|
|
57
|
-
a parallel theme file (e.g. a `theme.css`) or restyle the shipped JSX.** Build the Home/Header you add
|
|
58
|
-
(STEP 3) from the **same** base44 tokens/classes so it matches automatically. A dark brand is just
|
|
59
|
-
base44's dark palette in `index.css` — no per-component work.
|
|
50
|
+
## STEP 2 — Theme
|
|
51
|
+
Use the existing Base44 theme in `src/index.css` so your pages and the shipped components
|
|
52
|
+
share the same colors and typography.
|
|
60
53
|
|
|
61
54
|
## STEP 3 — Wire routes + provider (surgical `find_replace` on `src/App.jsx`, never a rewrite)
|
|
62
55
|
**No file reads needed to wire this.** Every shipped page and `WixManageBanner` is a default export that takes **no props** — wire them exactly as the snippet shows; nothing in those files needs looking up.
|
|
@@ -206,10 +199,9 @@ official Wix Events API reference first, never guess:
|
|
|
206
199
|
- Member login + "my registrations" → the **members** vertical (`references/members/INSTRUCTIONS.md`).
|
|
207
200
|
|
|
208
201
|
Fallback only — when you hit an error or need something not shown here: read the relevant shipped file
|
|
209
|
-
under `src/`, or look it up via the
|
|
202
|
+
under `src/`, or look it up via the documentation skill available in your environment.
|
|
210
203
|
|
|
211
204
|
## Hard rules
|
|
212
|
-
- Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
|
|
213
205
|
- Header/footer live in a `Layout` around `<Outlet/>` (STEP 3) — never edit the shipped `Events`/`EventDetail` to add chrome.
|
|
214
206
|
- The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your `Header` is plain in-flow markup (not `position:fixed`).
|
|
215
207
|
- Paid ticket checkout goes through the shipped reserve → `getTicketCheckoutUrl` redirect (the Wix-hosted ticket form) — never a hand-built registration/ticket/payment URL.
|
|
@@ -225,7 +217,6 @@ parallel.
|
|
|
225
217
|
|
|
226
218
|
## Verify (before declaring done)
|
|
227
219
|
- [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
|
|
228
|
-
- [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
|
|
229
220
|
- [ ] Opened the vertical's data route(s) (not just the home page) and confirmed the shipped components render themed (surface, text, brand) with images.
|
|
230
221
|
- [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all routes; shipped `Events`/`EventDetail` untouched; content clears the fixed chrome.
|
|
231
222
|
- [ ] Event grid renders live events; clicking a card opens the detail page by `slug`; visitor token persists across reload.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Events — seeding
|
|
2
2
|
|
|
3
|
-
Seed Wix Events (Events V3) by **calling `seed-events.
|
|
3
|
+
Seed Wix Events (Events V3) by **calling `seed-events.cjs`** — don't hand-write the REST calls. It's
|
|
4
4
|
a build-time module (run via `exec_tool`, not shipped in the app) that abstracts every Wix Events
|
|
5
5
|
seed operation. `require` it and call the functions with plain data.
|
|
6
6
|
|
|
@@ -14,11 +14,7 @@ after create, and **publishing is one-way**. So per event: create DRAFT → (tic
|
|
|
14
14
|
```js
|
|
15
15
|
// build-time exec_tool
|
|
16
16
|
const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix");
|
|
17
|
-
const
|
|
18
|
-
// exec_tool's require can return EMPTY exports for these build-time modules — load the file itself:
|
|
19
|
-
const seed = (() => { const m = { exports: {} };
|
|
20
|
-
new Function("module", "exports", "require", fs.readFileSync("/app/.agents/skills/wix-vibe-headless/references/events/seed/seed-events.js", "utf8"))(m, m.exports, require);
|
|
21
|
-
return m.exports; })();
|
|
17
|
+
const seed = require(require("path").resolve(".agents/skills/wix-vibe-headless/references/events/seed/seed-events.cjs"));
|
|
22
18
|
const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
23
19
|
|
|
24
20
|
// DEFAULT — one call runs the whole flow per event (create DRAFT → tiers → publish), then resolves
|
|
@@ -94,7 +90,7 @@ Free/RSVP events need neither.
|
|
|
94
90
|
|
|
95
91
|
## Reference
|
|
96
92
|
If a call returns a shape you didn't expect, or you need an operation this module doesn't cover,
|
|
97
|
-
use the
|
|
93
|
+
use the documentation skill available in your environment to search + read the live Wix API reference — never guess. The
|
|
98
94
|
authoritative source recipe is `wix-headless/references/inline-recipes/setup-events.md`.
|
|
99
95
|
|
|
100
96
|
Read a method's page before writing its call: it carries the exact body shape, the required
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Usage (build-time exec_tool):
|
|
10
10
|
// const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix"); // Base44 (generic: use $TOKEN)
|
|
11
|
-
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/events/seed/seed-events.
|
|
11
|
+
// const seed = require("/app/.agents/skills/wix-vibe-headless/references/events/seed/seed-events.cjs");
|
|
12
12
|
// const ctx = { token: accessToken, siteId: WIX_METASITE_ID };
|
|
13
13
|
//
|
|
14
14
|
// // setupEvents installs the Wix Events app first (installEventsApp) — base44 sites may not have it.
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
// const file = await seed.importImage(ctx, imageUrl); // → { id, url } (Wix Media file id + wixstatic url)
|
|
32
32
|
// await seed.setEventMainImage(ctx, { eventId: ev.id, id: file.id, url: file.url, height: 1024, width: 1024, altText: ev.slug });
|
|
33
33
|
//
|
|
34
|
-
// If any call fails with a shape the caller didn't expect, fall back to the
|
|
34
|
+
// If any call fails with a shape the caller didn't expect, fall back to the documentation skill available in your environment
|
|
35
35
|
// (search + read the live Wix API reference) — never guess. Source recipe (authoritative):
|
|
36
36
|
// wix-headless/references/inline-recipes/setup-events.md.
|
|
37
37
|
|
|
@@ -15,6 +15,12 @@ field — the shipped utils supply the schema behind it, the state, the validati
|
|
|
15
15
|
> Use **`cms`** only when the app must **read the entries back** (a gallery, a listing, "my
|
|
16
16
|
> submissions") — a visitor cannot read Forms submissions. Submit-only → forms.
|
|
17
17
|
|
|
18
|
+
> **⚠️ "Add a field" is a SCHEMA change.** *"Add a dropdown for job industry"*, *"make the phone
|
|
19
|
+
> optional"*, *"drop the budget question"* — all reads like UI work and all are a `PATCH` to the live
|
|
20
|
+
> schema (`seed/SEED.md`, REVISE): patch it, verify, rewrite `wix-forms.config.js`, **then** wire the
|
|
21
|
+
> control. A field the visitor can fill that isn't in the schema is **silent data loss** — the value
|
|
22
|
+
> reaches no submission, inbox or contact, and the submit still resolves `true`.
|
|
23
|
+
|
|
18
24
|
## What ships (utils only)
|
|
19
25
|
|
|
20
26
|
| file | what it is |
|
|
@@ -24,7 +30,7 @@ field — the shipped utils supply the schema behind it, the state, the validati
|
|
|
24
30
|
| `rest/wix-forms-submissions.js` | Write transport: `toSubmissionValues`, `createSubmission`, `SUBMITTED_OK`, the file flow (`getMediaUploadUrl`, `uploadSubmissionFile`, `uploadFormFiles`), `submissionViolations`. |
|
|
25
31
|
| `hooks/useWixForm.js` | The form's non-visual half: `useWixForm(formId)` → `{ form, values, setValues, bind, submit, validate, errors, loading, read }`. Also exports `validateField`, `mapSubmissionErrors`, `FORM_ERROR`. Not on React? Those plus `lib/` are the load-bearing part; port the state around them. |
|
|
26
32
|
| `wix-config.js` *(shared)* | the two ids, written by the install step. |
|
|
27
|
-
| `wix-forms.config.js` *(generated)* | **the gate** — `WIX_FORMS`: each form's `formId` + read-back `targets`, written by the seed after verification. |
|
|
33
|
+
| `wix-forms.config.js` *(generated)* | **the gate** — `WIX_FORMS`: each form's `formId` + read-back `targets`, written by the seed after verification. Its one later edit is a verified schema change (REVISE), never a hand-typed field. |
|
|
28
34
|
| `WixManageBanner` *(shared)* | Dev-only manage banner — mount it in your Layout. |
|
|
29
35
|
|
|
30
36
|
## Prerequisites — a HARD GATE
|
|
@@ -384,6 +390,9 @@ Don't reach for `role="form"`, an `aria-label` on an input that already has a `<
|
|
|
384
390
|
## Hard rules
|
|
385
391
|
|
|
386
392
|
- A visitor-fillable form is this vertical, not `cms`.
|
|
393
|
+
- **Never hold a form field in local component state** — a value outside the hook's `values` submits
|
|
394
|
+
nothing. Adding a field is a schema change: `seed/SEED.md`, REVISE.
|
|
395
|
+
- **Never answer a field request with a dashboard link** — that link is for the owner's own edits.
|
|
387
396
|
- Read and write only through the shipped helpers — never hand-build a Wix Forms URL.
|
|
388
397
|
- Never invent a `target`, label, option or constraint — every one comes from the schema (authored
|
|
389
398
|
markup included). Never detect a control by its `target` name either.
|
|
@@ -412,8 +421,9 @@ Don't reach for `role="form"`, an `aria-label` on an input that already has a `<
|
|
|
412
421
|
|
|
413
422
|
Three sources answer what this file doesn't: the **JSDoc** in `hooks/useWixForm.js` and
|
|
414
423
|
`lib/wix-form-schema-utils.js`; the **Wix reference** below; and `seed/SEED.md` for how a field was
|
|
415
|
-
authored. Calling an endpoint the helpers don't wrap is fine via
|
|
416
|
-
method and body
|
|
424
|
+
authored, and REVISE for changing one. Calling an endpoint the helpers don't wrap is fine via
|
|
425
|
+
`wixApiRequest` — first look up the exact method and body in official Wix API documentation using
|
|
426
|
+
the documentation skill available in your environment; never guess.
|
|
417
427
|
|
|
418
428
|
- Form object (the shape `form` and its fields arrive in): https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/form-object.md
|
|
419
429
|
- Form Schemas API: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas.md
|
|
@@ -438,21 +448,28 @@ checks the dashboard summary, sends and deletes one real submission), then write
|
|
|
438
448
|
`src/rest/wix-forms.config.js`. Needs an elevated credential, and **does not run in parallel with the
|
|
439
449
|
client** — see Prerequisites.
|
|
440
450
|
|
|
451
|
+
**Changing a form that already exists** — a new field, a relabel, a tightened rule — is that doc's
|
|
452
|
+
**REVISE** action: `PATCH` on the current `revision`, re-verify, rewrite the config, wire the
|
|
453
|
+
control. Never a second create.
|
|
454
|
+
|
|
441
455
|
## Point the user to their dashboard
|
|
442
456
|
|
|
443
457
|
Substitute the site's `metaSiteId`:
|
|
444
458
|
|
|
445
459
|
- **Forms list** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-forms`
|
|
446
|
-
- **Form builder** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-forms/form/{formId}` →
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
- **
|
|
460
|
+
- **Form builder** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-forms/form/{formId}` → where
|
|
461
|
+
the **owner** edits fields; a relabel or new option reaches a looped form with no code change, a new
|
|
462
|
+
field still needs a control. **Asked to change the form yourself? REVISE, not this link.**
|
|
463
|
+
- **Submissions** — `https://manage.wix.com/dashboard/{metaSiteId}/wix-forms/form/{formId}/submissions`
|
|
464
|
+
→ per form, off its builder path; there's no site-wide submissions page to link
|
|
450
465
|
- **Contacts** — `https://manage.wix.com/dashboard/{metaSiteId}/contacts` → contact-mapped fields
|
|
451
466
|
create or update a contact automatically.
|
|
452
467
|
|
|
453
468
|
## Verify
|
|
454
469
|
|
|
455
470
|
- [ ] `wix-forms.config.js` exists; every `formId` comes from `WIX_FORMS`, none typed by hand.
|
|
471
|
+
- [ ] Every control's `name` inside the `<form>` is a target in `WIX_FORMS.<key>.targets`, and its
|
|
472
|
+
value lives in the hook's `values` — **no field is backed by local state**.
|
|
456
473
|
- [ ] `WIX_CLIENT_ID` set (not the placeholder).
|
|
457
474
|
- [ ] Looped form: relabel a field in the dashboard, reload, the new label appears with no code
|
|
458
475
|
change. Authored form: every `target` in the JSX matches `WIX_FORMS.<key>.targets` exactly.
|