@wix/agent-skills 1.6.0 → 1.7.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 (154) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +49 -42
  4. package/skills/wix-app/references/BACKEND_EVENT.md +10 -65
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +101 -406
  6. package/skills/wix-app/references/DASHBOARD_MENU_PLUGIN.md +14 -111
  7. package/skills/wix-app/references/DASHBOARD_MODAL.md +56 -205
  8. package/skills/wix-app/references/DASHBOARD_PAGE.md +19 -98
  9. package/skills/wix-app/references/DASHBOARD_PLUGIN.md +6 -108
  10. package/skills/wix-app/references/DATA_COLLECTION.md +113 -198
  11. package/skills/wix-app/references/EMBEDDED_SCRIPT.md +41 -268
  12. package/skills/wix-app/references/EXTENSION_REGISTRATION.md +27 -76
  13. package/skills/wix-app/references/SERVICE_PLUGIN.md +35 -188
  14. package/skills/wix-app/references/SITE_PLUGIN.md +8 -92
  15. package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +0 -44
  16. package/skills/wix-app/references/custom-element-widget/SETTINGS_PANEL.md +19 -330
  17. package/skills/wix-app/references/dashboard-menu-plugin/bookings-slots.md +0 -12
  18. package/skills/wix-app/references/dashboard-menu-plugin/ecommerce-slots.md +7 -0
  19. package/skills/wix-app/references/dashboard-menu-plugin/restaurants-slots.md +0 -12
  20. package/skills/wix-app/references/dashboard-plugin/SLOTS.md +3 -15
  21. package/skills/wix-app/references/service-plugin/ADDITIONAL-FEES.md +2 -18
  22. package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +2 -42
  23. package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +1 -11
  24. package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +1 -11
  25. package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +2 -40
  26. package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +2 -19
  27. package/skills/wix-app/references/service-plugin/VALIDATIONS.md +2 -18
  28. package/skills/wix-app/references/site-plugin/SLOTS.md +17 -68
  29. package/skills/wix-headless/SKILL.md +111 -389
  30. package/skills/wix-headless/references/BUILD.md +307 -0
  31. package/skills/wix-headless/references/DESIGN_SYSTEM.md +115 -0
  32. package/skills/wix-headless/references/DISCOVERY.md +237 -112
  33. package/skills/wix-headless/references/PLAN.md +82 -0
  34. package/skills/wix-headless/references/SEED.md +205 -0
  35. package/skills/wix-headless/references/SETUP.md +140 -134
  36. package/skills/wix-headless/references/astro/COMPOSE.md +142 -0
  37. package/skills/wix-headless/references/{blog → astro/blog}/BLOG_PAGES.md +1 -1
  38. package/skills/wix-headless/references/{blog → astro/blog}/BLOG_SETUP.md +2 -2
  39. package/skills/wix-headless/references/astro/cms/CMS_FOUNDATIONS.md +214 -0
  40. package/skills/wix-headless/references/{cms → astro/cms}/FAQ_KNOWLEDGE_BASE.md +6 -4
  41. package/skills/wix-headless/references/{cms → astro/cms}/PORTFOLIO.md +5 -5
  42. package/skills/wix-headless/references/{cms → astro/cms}/RESOURCE_LIBRARY.md +5 -5
  43. package/skills/wix-headless/references/{cms → astro/cms}/TEAM_DIRECTORY.md +5 -5
  44. package/skills/wix-headless/references/astro/designer/INSTRUCTIONS.md +331 -0
  45. package/skills/wix-headless/references/{ecom → astro/ecom}/CART_PAGES.md +1 -1
  46. package/skills/wix-headless/references/{ecom → astro/ecom}/CART_WIRING.md +1 -1
  47. package/skills/wix-headless/references/{ecom → astro/ecom}/COMPONENTS_CSS.md +3 -3
  48. package/skills/wix-headless/references/{forms → astro/forms}/CONTACT_FORM.md +13 -13
  49. package/skills/wix-headless/references/{gift-cards → astro/gift-cards}/COMPONENTS.md +1 -1
  50. package/skills/wix-headless/references/{gift-cards → astro/gift-cards}/PAGES.md +1 -1
  51. package/skills/wix-headless/references/{stores → astro/stores}/BACK_IN_STOCK.md +1 -1
  52. package/skills/wix-headless/references/{stores → astro/stores}/CATEGORY_PAGES.md +12 -13
  53. package/skills/wix-headless/references/{stores → astro/stores}/COMPONENTS_CSS.md +4 -4
  54. package/skills/wix-headless/references/{stores → astro/stores}/HOME_AND_NAV.md +11 -9
  55. package/skills/wix-headless/references/{stores → astro/stores}/PRODUCT_PAGES.md +5 -3
  56. package/skills/wix-headless/references/{stores → astro/stores}/SHARED_WIRING.md +3 -3
  57. package/skills/wix-headless/references/astro/templates/Footer.astro +27 -0
  58. package/skills/wix-headless/references/astro/templates/Layout.astro +132 -0
  59. package/skills/wix-headless/references/astro/templates/Navigation.astro +38 -0
  60. package/skills/wix-headless/references/astro/templates/astro.config.mjs +41 -0
  61. package/skills/wix-headless/references/astro/templates/ecom/components-ecom.css +302 -0
  62. package/skills/wix-headless/references/astro/templates/global.css +286 -0
  63. package/skills/wix-headless/references/astro/templates/index.astro +56 -0
  64. package/skills/wix-headless/{templates → references/astro/templates}/stores/back-in-stock.ts +1 -1
  65. package/skills/wix-headless/{templates → references/astro/templates}/stores/components-stores.css +138 -33
  66. package/skills/wix-headless/references/blog/BLOG_CONTENT.md +10 -11
  67. package/skills/wix-headless/references/blog/INSTRUCTIONS.md +5 -5
  68. package/skills/wix-headless/references/cms/CMS_FOUNDATIONS.md +31 -230
  69. package/skills/wix-headless/references/cms/INSTRUCTIONS.md +13 -8
  70. package/skills/wix-headless/references/custom/INSTRUCTIONS.md +38 -0
  71. package/skills/wix-headless/references/ecom/INSTRUCTIONS.md +10 -10
  72. package/skills/wix-headless/references/forms/INSTRUCTIONS.md +5 -5
  73. package/skills/wix-headless/references/gift-cards/INSTRUCTIONS.md +11 -11
  74. package/skills/wix-headless/references/images/INSTRUCTIONS.md +47 -50
  75. package/skills/wix-headless/references/seed-recipes.md +49 -0
  76. package/skills/wix-headless/references/shared/AUTHENTICATION.md +110 -0
  77. package/skills/wix-headless/references/shared/BUILD_NOISE.md +2 -2
  78. package/skills/wix-headless/references/shared/DOCS_SEARCH.md +41 -0
  79. package/skills/wix-headless/references/shared/IMAGE_GENERATION.md +17 -17
  80. package/skills/wix-headless/references/shared/IMPLEMENTER.md +20 -29
  81. package/skills/wix-headless/references/shared/PRODUCTION_SHARP_EDGES.md +1 -1
  82. package/skills/wix-headless/references/shared/RETURN_CONTRACT.md +25 -16
  83. package/skills/wix-headless/references/shared/STYLING.md +47 -10
  84. package/skills/wix-headless/references/stores/INSTRUCTIONS.md +25 -25
  85. package/skills/wix-headless/references/stores/PRODUCT_CATALOG_DATA.md +17 -17
  86. package/skills/wix-headless/references/verticals/_schema.json +31 -117
  87. package/skills/wix-headless/references/verticals/_schema.md +60 -150
  88. package/skills/wix-headless/references/verticals/blog.md +5 -99
  89. package/skills/wix-headless/references/verticals/cms.md +9 -100
  90. package/skills/wix-headless/references/verticals/ecom.md +5 -76
  91. package/skills/wix-headless/references/verticals/forms.md +5 -85
  92. package/skills/wix-headless/references/verticals/gift-cards.md +6 -103
  93. package/skills/wix-headless/references/verticals/stores.md +10 -144
  94. package/skills/wix-headless/scripts/check-manifest.mjs +5 -5
  95. package/skills/wix-headless/scripts/emit-design-tokens.mjs +29 -23
  96. package/skills/wix-headless/scripts/init-site-json.mjs +59 -21
  97. package/skills/wix-headless/scripts/patch-decorative-slots.mjs +67 -43
  98. package/skills/wix-headless/scripts/plan-entity-image-waves.mjs +3 -3
  99. package/skills/wix-headless/scripts/preview.sh +3 -3
  100. package/skills/wix-headless/scripts/release.sh +4 -4
  101. package/skills/wix-headless/scripts/scaffold.sh +75 -20
  102. package/skills/wix-headless/scripts/seed-utilities.sh +50 -12
  103. package/skills/wix-manage/SKILL.md +4 -8
  104. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
  105. package/skills/wix-manage/references/cms/cms-data-items-crud.md +4 -0
  106. package/skills/wix-manage/references/cms/cms-references-and-relationships.md +2 -0
  107. package/skills/wix-manage/references/cms/cms-schema-management.md +4 -0
  108. package/skills/wix-manage/references/ecommerce/api-shipping.md +443 -0
  109. package/skills/wix-manage/references/ecommerce/flow-add-free-shipping.md +5 -6
  110. package/skills/wix-manage/references/ecommerce/flow-fix-coverage-gaps.md +4 -5
  111. package/skills/wix-manage/references/ecommerce/flow-optimize-shipping-rates.md +4 -5
  112. package/skills/wix-manage/references/ecommerce/goal-increase-aov.md +1 -1
  113. package/skills/wix-manage/references/ecommerce/goal-reduce-cart-abandonment.md +1 -2
  114. package/skills/wix-manage/references/ecommerce/guardrail-shipping-health.md +2 -2
  115. package/skills/wix-manage/references/ecommerce/recipe-apply-shipping-recommendations.md +4 -5
  116. package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +7 -7
  117. package/skills/wix-manage/references/ecommerce/setup-discount-rules.md +209 -72
  118. package/skills/wix-manage/references/ecommerce/setup-store-pickup-location.md +9 -10
  119. package/skills/wix-manage/references/ecommerce/skill-graph.md +4 -4
  120. package/skills/wix-manage/references/forms/create-form.md +2 -0
  121. package/skills/wix-manage/references/stores/bulk-create-products-with-options.md +2 -0
  122. package/skills/wix-manage/references/stores/create-product-from-image.md +91 -38
  123. package/skills/wix-manage/references/stores/setup-online-store-catalog-v3.md +2 -0
  124. package/skills/wix-app/references/custom-element-widget/default-thumbnail.png +0 -0
  125. package/skills/wix-app/references/data-collection/extension-template.ts +0 -107
  126. package/skills/wix-headless/references/ORCHESTRATION.md +0 -269
  127. package/skills/wix-headless/references/commands/install-app.md +0 -42
  128. package/skills/wix-headless/references/commands/mcp-bootstrap.md +0 -28
  129. package/skills/wix-headless/references/designer/INSTRUCTIONS.md +0 -828
  130. package/skills/wix-headless/references/shared/MCP_PREFIX.md +0 -105
  131. package/skills/wix-headless/scripts/copy-utility-templates.mjs +0 -153
  132. package/skills/wix-headless/templates/ecom/components-ecom.css +0 -215
  133. package/skills/wix-manage/references/events/list-events.md +0 -203
  134. /package/skills/wix-headless/{templates → references/astro/templates}/ecom/CartBadge.tsx +0 -0
  135. /package/skills/wix-headless/{templates → references/astro/templates}/ecom/CartView.tsx +0 -0
  136. /package/skills/wix-headless/{templates → references/astro/templates}/ecom/cart.astro +0 -0
  137. /package/skills/wix-headless/{templates → references/astro/templates}/ecom/discounts.ts +0 -0
  138. /package/skills/wix-headless/{templates → references/astro/templates}/ecom/thank-you.astro +0 -0
  139. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/GiftCardPurchase.tsx +0 -0
  140. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/_home-teaser-snippet.astro +0 -0
  141. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/_nav-snippet.astro +0 -0
  142. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/components-gift-cards.css +0 -0
  143. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/gift-cards.astro +0 -0
  144. /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/gift-cards.ts +0 -0
  145. /package/skills/wix-headless/{templates → references/astro/templates}/stores/AddToCartButton.tsx +0 -0
  146. /package/skills/wix-headless/{templates → references/astro/templates}/stores/BackInStockForm.tsx +0 -0
  147. /package/skills/wix-headless/{templates → references/astro/templates}/stores/CategoryRail.astro +0 -0
  148. /package/skills/wix-headless/{templates → references/astro/templates}/stores/ProductCard.astro +0 -0
  149. /package/skills/wix-headless/{templates → references/astro/templates}/stores/ProductPurchase.tsx +0 -0
  150. /package/skills/wix-headless/{templates → references/astro/templates}/stores/SeoTags.astro +0 -0
  151. /package/skills/wix-headless/{templates → references/astro/templates}/stores/categories.ts +0 -0
  152. /package/skills/wix-headless/{templates → references/astro/templates}/stores/category/[slug].astro +0 -0
  153. /package/skills/wix-headless/{templates → references/astro/templates}/stores/products/[slug].astro +0 -0
  154. /package/skills/wix-headless/{templates → references/astro/templates}/stores/products/index.astro +0 -0
@@ -1,22 +1,13 @@
1
1
 
2
2
  # Wix Dashboard Menu Plugin Builder
3
3
 
4
- Creates dashboard menu plugin extensions for Wix CLI applications. Dashboard menu plugins are menu items that integrate into predefined **menu slots** on dashboard pages managed by Wix first-party business apps (Wix Stores, Wix Bookings, Wix Blog, Wix eCommerce, Wix Events, Wix CRM, Wix Restaurants).
4
+ Dashboard menu plugins are menu items that integrate into predefined **menu slots** on dashboard pages managed by Wix first-party business apps (Wix Stores, Wix Bookings, Wix Blog, Wix eCommerce, Wix Events, Wix CRM, Wix Restaurants).
5
5
 
6
- When clicked, a dashboard menu plugin either **navigates to a dashboard page** or **opens a dashboard modal**.
6
+ When clicked, a dashboard menu plugin either **navigates to a dashboard page** or **opens a dashboard modal**. They are configuration-only extensions — they do NOT have a React component file.
7
7
 
8
- Dashboard menu plugins are configuration-only extensions — they do NOT have a React component file.
8
+ ## Scaffold
9
9
 
10
-
11
- ## Quick Start Checklist
12
-
13
- Follow these steps in order when creating a dashboard menu plugin:
14
-
15
- 1. [ ] Identify the target menu slot ID — see [Slot Lookup Table](#slot-lookup-table) below, then read only the relevant vertical file
16
- 2. [ ] Create plugin folder: `src/extensions/dashboard/menu-plugins/<plugin-name>/`
17
- 3. [ ] Create `<plugin-name>.extension.ts` with `extensions.dashboardMenuPlugin()` and unique UUID
18
- 4. [ ] Configure the `action` field to either navigate to a dashboard page or open a modal
19
- 5. [ ] Update `src/extensions.ts` to import and use the new extension
10
+ Use `wix generate --params` with `extensionType: DASHBOARD_MENU_PLUGIN`. `extendsSlotId` comes from the [Slot Lookup Table](#slot-lookup-table) below; for the authoritative list of all supported `extendsSlotId` values, run `wix schema generate --type DASHBOARD_MENU_PLUGIN`. `action` must contain **exactly one** of `pageId` or `modalId`, referencing the `id` of an existing Dashboard Page or Dashboard Modal extension in the project. The CLI generates the folder, the configuration file, the UUID, and the `src/extensions.ts` registration.
20
11
 
21
12
  ## Architecture
22
13
 
@@ -27,117 +18,29 @@ Dashboard menu plugins operate as **click-to-action** menu items. They:
27
18
  - **Navigate to a dashboard page** — redirects to a specified dashboard page
28
19
  - **Open a dashboard modal** — displays a specified dashboard modal
29
20
 
30
- ## Files and Code Structure
31
-
32
- Dashboard menu plugins live under `src/extensions/dashboard/menu-plugins/`. Each plugin has its own folder containing a single file.
33
-
34
- ```
35
- src/extensions/dashboard/menu-plugins/
36
- └── <plugin-name>/
37
- └── <plugin-name>.extension.ts # Builder configuration
38
- ```
39
-
40
- > **Note:** This is the default folder structure created by the CLI. You can move the file to any location within the `src/` folder and update the references in your `extension.ts` file.
41
-
42
- ## Plugin Builder Configuration
43
-
44
- ### File: `<plugin-name>.extension.ts`
45
-
46
- ```typescript
47
- import { extensions } from "@wix/astro/builders";
48
-
49
- export const dashboardmenupluginMyMenuPlugin = extensions.dashboardMenuPlugin({
50
- id: "{{GENERATE_UUID}}",
51
- title: "My Menu Plugin",
52
- extends: "<MENU_SLOT_ID>",
53
- iconKey: "Sparkles",
54
- action: {
55
- navigateToPage: {
56
- pageId: "<DASHBOARD_PAGE_ID>",
57
- },
58
- },
59
- });
60
- ```
61
-
62
- **CRITICAL: UUID Generation**
63
-
64
- The `id` must be a unique, static UUID v4 string. Generate a fresh UUID for each extension — do NOT use `randomUUID()` or copy UUIDs from examples. Replace `{{GENERATE_UUID}}` with a freshly generated UUID like `"a1b2c3d4-e5f6-7890-abcd-ef1234567890"`.
65
-
66
- ### Builder Fields
67
-
68
- | Field | Type | Description |
69
- |-------|------|-------------|
70
- | `id` | string | Unique plugin ID (GUID). Must be unique across all extensions in the project. |
71
- | `title` | string | Text displayed for the menu item. |
72
- | `extends` | string | Menu slot ID where the extension integrates. See [Slot Lookup Table](#slot-lookup-table). |
73
- | `iconKey` | string | Icon name from Wix Design System appearing next to the title. |
74
- | `action` | object | Navigation configuration determining behavior when clicked. |
21
+ ## The `extendsSlotId` Field
75
22
 
76
- ### The `extends` Field
77
-
78
- The `extends` field specifies which dashboard menu slot hosts your menu plugin. Each Wix business app exposes menu slots on its dashboard pages. You must provide the exact slot ID.
23
+ Specifies which dashboard menu slot hosts your menu plugin. Each Wix business app exposes menu slots on its dashboard pages. You must provide the exact slot ID.
79
24
 
80
25
  **Important:** Some slots with the same ID appear on different pages within the dashboard. If you create a menu plugin for a slot that exists on multiple pages, the menu plugin is displayed on all of those pages.
81
26
 
82
27
  For the complete list of available menu slot IDs, see the [Slot Lookup Table](#slot-lookup-table) below. Read only the vertical file that matches the user's request.
83
28
 
84
- ### The `action` Field
85
-
86
- The `action` field determines what happens when the user clicks the menu item. You must configure exactly one of the following:
87
-
88
- #### Option 1: Navigate to a Dashboard Page
89
-
90
- ```typescript
91
- action: {
92
- navigateToPage: {
93
- pageId: "<DASHBOARD_PAGE_ID>",
94
- },
95
- },
96
- ```
97
-
98
- | Field | Type | Description |
99
- |-------|------|-------------|
100
- | `action.navigateToPage` | object | Page navigation configuration object. |
101
- | `action.navigateToPage.pageId` | string | The `id` of the target dashboard page extension. |
102
-
103
- #### Option 2: Open a Dashboard Modal
104
-
105
- ```typescript
106
- action: {
107
- openModal: {
108
- componentId: "<DASHBOARD_MODAL_ID>",
109
- },
110
- },
111
- ```
112
-
113
- | Field | Type | Description |
114
- |-------|------|-------------|
115
- | `action.openModal` | object | Modal navigation configuration object. |
116
- | `action.openModal.componentId` | string | The `id` of the target dashboard modal extension. |
117
-
118
- ### The `iconKey` Field
119
-
120
- The `iconKey` must be a valid icon name from the Wix Design System icon set (`@wix/wix-ui-icons-common`). Use the `wix-design-system` skill to look up available icon names.
121
-
122
- ## Extension Registration
123
-
124
- **Extension registration is MANDATORY and has TWO required steps.**
125
-
126
- ### Step 1: Create Plugin-Specific Extension File
29
+ ## The `action` Field
127
30
 
128
- Each dashboard menu plugin requires a `<plugin-name>.extension.ts` file in its folder. See [Plugin Builder Configuration](#plugin-builder-configuration) above.
31
+ The `action` field determines what happens when the user clicks the menu item. Configure **exactly one** of the following:
129
32
 
130
- ### Step 2: Register in Main Extensions File
33
+ | Action | Scaffold param | Value |
34
+ |---|---|---|
35
+ | Navigate to a dashboard page | `{ "action": { "pageId": "<PAGE_ID>" } }` | `pageId` is the `id` (UUID) of an existing dashboard page extension. |
36
+ | Open a dashboard modal | `{ "action": { "modalId": "<MODAL_ID>" } }` | `modalId` is the `id` (UUID) of an existing dashboard modal extension. |
131
37
 
132
- **CRITICAL:** After creating the plugin-specific extension file, you MUST read [Extension Registration reference](EXTENSION_REGISTRATION.md) and follow the "App Registration" section to update `src/extensions.ts`.
38
+ ## Icon Selection
133
39
 
134
- **Without completing Step 2, the dashboard menu plugin will not appear on the dashboard page.**
40
+ The generated builder file has an `iconKey` field. It must be a valid icon name from the Wix Design System icon set (`@wix/wix-ui-icons-common`). Use the `wix-design-system` skill to look up available icon names and update the generated builder file accordingly.
135
41
 
136
42
  ## Dashboard-Menu-Plugin-specific Conventions
137
43
 
138
- - The `extends` field MUST contain a valid menu slot ID from a Wix business app — do NOT invent slot IDs.
139
- - The `action.navigateToPage.pageId` MUST reference the `id` of an existing dashboard page extension in the project.
140
- - The `action.openModal.componentId` MUST reference the `id` of an existing dashboard modal extension in the project.
141
44
  - A dashboard menu plugin does NOT have a React component — it is configuration-only.
142
45
  - Do NOT confuse dashboard menu plugins with dashboard plugins — they are different extension types.
143
46
 
@@ -1,13 +1,27 @@
1
1
 
2
- ## Overview
2
+ # Wix Dashboard Modal
3
3
 
4
- Dashboard modals are popup dialogs triggered from dashboard pages or plugins. They consist of three files and use the Dashboard SDK for lifecycle control via `openModal()` and `closeModal()`.
4
+ Dashboard modals are popup dialogs triggered from dashboard pages or plugins. They use the Dashboard SDK for lifecycle control via `openModal()` and `closeModal()`.
5
+
6
+ ## Scaffold
7
+
8
+ Use `wix generate --params` with all required fields:
9
+
10
+ ```bash
11
+ wix generate --params '{"extensionType":"DASHBOARD_MODAL","title":"<title>","folder":"<folder>"}'
12
+ ```
13
+
14
+ | Field | Constraint |
15
+ | --- | --- |
16
+ | `title` | Display name for the modal. |
17
+ | `folder` | Lowercase alphanumeric and hyphens. |
18
+
19
+ The CLI generates the folder, the modal `.tsx`, the config file, the builder file, the UUID, and the `src/extensions.ts` registration. After scaffolding, implement the modal UI in the generated `.tsx`.
5
20
 
6
21
  ## Quick Reference
7
22
 
8
23
  | Task | Method | Example |
9
24
  |------|--------|---------|
10
- | Create modal | Create 3 files in `src/extensions/dashboard/modals/<folder>/` | See File Structure below |
11
25
  | Open modal | `dashboard.openModal()` | `openModal({ modalId: "modal-id" })` |
12
26
  | Pass data to modal | `params` in `openModal()` | `params: { userId: "123" }` |
13
27
  | Read data in modal | `observeState()` | `dashboard.observeState((state) => { ... })` |
@@ -15,124 +29,14 @@ Dashboard modals are popup dialogs triggered from dashboard pages or plugins. Th
15
29
  | Return data to parent | Pass data to `closeModal()` | `closeModal({ ... })` |
16
30
  | Wait for modal close | `modalClosed` Promise | `const { modalClosed } = openModal(...);` |
17
31
 
18
- ## File Structure
19
-
20
- Create **three files** in `src/extensions/dashboard/modals/<folder-name>/`:
21
-
22
- 1. **`extensions.ts`** - Builder configuration with modal ID, title, dimensions, component path
23
- 2. **`<modal-name>.tsx`** - React component rendering modal content
24
- 3. **`<modal-name>.config.ts`** - Configurable modal properties (title, width, height)
25
-
26
- ## Implementation
27
-
28
- ### Creating a Modal
29
-
30
- Create the three required files:
31
-
32
- **1. `extensions.ts`** - Modal builder configuration:
33
-
34
- ```typescript
35
- import { extensions } from '@wix/astro/builders';
36
- import config from './<modal-name>.config.ts';
37
-
38
- export default extensions.dashboardModal({
39
- id: "{{GENERATE_UUID}}",
40
- title: config.title,
41
- width: config.width,
42
- height: config.height,
43
- component: './extensions/dashboard/modals/<modal-name>/<modal-name>.tsx',
44
- });
45
-
46
- ```
47
-
48
- **CRITICAL: UUID Generation**
49
-
50
- The `id` must be a unique, static UUID v4 string. Generate a fresh UUID for each extension - do NOT use `randomUUID()` or copy UUIDs from examples. Replace `{{GENERATE_UUID}}` with a freshly generated UUID like `"a1b2c3d4-e5f6-7890-abcd-ef1234567890"`.
51
-
52
- Builder fields:
53
- | Field | Type | Description |
54
- |-------|------|-------------|
55
- | id | string | Unique modal ID (GUID). Used with `openModal()` |
56
- | title | string | Modal title shown in project dashboard |
57
- | width | number | Initial width while loading |
58
- | height | number | Initial height while loading |
59
- | component | string | Path to the modal content `.tsx` file |
60
-
61
- **2. `<modal-name>.tsx`** - Modal content component:
62
-
63
- ```typescript
64
- import type { FC } from 'react';
65
- import { dashboard } from '@wix/dashboard';
66
- import {
67
- WixDesignSystemProvider,
68
- Text,
69
- Box,
70
- CustomModalLayout,
71
- } from '@wix/design-system';
72
- import '@wix/design-system/styles.global.css';
73
- import config from './<modal-name>.config.ts';
74
-
75
- const { width, height, title } = config;
76
-
77
- // To open your modal, call `openModal` with your modal id.
78
- // e.g.
79
- // import { dashboard } from '@wix/dashboard';
80
- // function MyComponent() {
81
- // return <button onClick={() => dashboard.openModal({ modalId: '8ef4d434-9c80-44f5-a3f5-6f15f3a34be7' })}>Open Modal</button>;
82
- // }
83
- const Modal: FC = () => {
84
- return (
85
- <WixDesignSystemProvider features={{ newColorsBranding: true }}>
86
- <CustomModalLayout
87
- width={width}
88
- maxHeight={height}
89
- primaryButtonText="Save"
90
- secondaryButtonText="Cancel"
91
- primaryButtonOnClick={() => dashboard.closeModal()}
92
- secondaryButtonOnClick={() => dashboard.closeModal()}
93
- title={title}
94
- subtitle="Edit this file to customize your modal"
95
- content={
96
- <Box direction="vertical" align="center">
97
- <Text>Wix CLI Modal</Text>
98
- </Box>
99
- }
100
- />
101
- </WixDesignSystemProvider>
102
- );
103
- };
104
-
105
- export default Modal;
106
- ```
107
-
108
- **3. `<modal-name>.config.ts`** - Configurable properties:
109
-
110
- ```typescript
111
- export default {
112
- title: "My Modal",
113
- width: 600,
114
- height: 400,
115
- };
116
- ```
117
-
118
- Then register in `src/extensions.ts`:
119
-
120
- ```typescript
121
- import { dashboardmodalYourModal } from './extensions/dashboard/modals/<modal-name>/extensions.ts';
122
-
123
- export default app()
124
- .use(dashboardmodalYourModal)
125
- // ... other extensions
126
- ```
127
-
128
- ### Opening a Modal
32
+ ## Opening a Modal
129
33
 
130
34
  ```typescript
131
35
  import { dashboard } from "@wix/dashboard";
132
36
 
133
37
  // Simple open
134
38
  const result = await dashboard.openModal({
135
- modalId: "your-modal-id", // From .extension.ts id field
39
+ modalId: "your-modal-id", // The id generated by the CLI for this modal
136
40
  });
137
41
 
138
42
  // Pass data to modal via params
@@ -151,133 +55,80 @@ const { modalClosed } = dashboard.openModal({
151
55
  const result = await modalClosed; // Resolves with data from closeModal()
152
56
  ```
153
57
 
154
- ### Receiving Data in Modal
58
+ ## Receiving Data in Modal
155
59
 
156
- Use `observeState()` to access data passed via `params` in `openModal()`:
60
+ Inside the modal, subscribe via `dashboard.observeState()` to access whatever was passed in `openModal({ params })`. The callback receives the params object as `state`:
157
61
 
158
62
  ```typescript
159
63
  import { dashboard } from "@wix/dashboard";
160
- import { useEffect, useState } from "react";
161
-
162
- function MyModal() {
163
- const [modalData, setModalData] = useState<{ userId?: string; itemData?: any }>({});
164
-
165
- useEffect(() => {
166
- dashboard.observeState((state) => {
167
- // Access custom data passed through openModal params
168
- if (state.userId) {
169
- setModalData({
170
- userId: state.userId,
171
- itemData: state.itemData,
172
- });
173
- }
174
- });
175
- }, []);
176
-
177
- return <div>User ID: {modalData.userId}</div>;
178
- }
64
+
65
+ dashboard.observeState((state) => {
66
+ // state contains the keys you passed in `openModal({ params: { ... } })`
67
+ console.log(state.userId, state.itemData);
68
+ });
179
69
  ```
180
70
 
181
- ### Closing Modal
71
+ Call it inside a `useEffect` if you want to set local React state from the params.
72
+
73
+ ## Closing Modal
182
74
 
183
- Call `closeModal()` from within the modal extension to close it. Optionally pass data back to the opener.
75
+ Call `closeModal()` from within the modal extension. The optional argument is data passed back to the opener (resolved via `modalClosed`).
184
76
 
185
77
  ```typescript
186
78
  import { dashboard } from "@wix/dashboard";
187
79
 
188
- // Close without returning data
189
- dashboard.closeModal();
190
-
191
- // Close with custom return data
192
- dashboard.closeModal({ saved: true, itemId: "123" });
80
+ dashboard.closeModal({ saved: true, itemId: "123" }); // arg is optional
193
81
  ```
194
82
 
195
- | Parameter | Type | Description |
196
- |-----------|------|-------------|
197
- | closeData | Serializable (optional) | Data to pass back to the modal opener. Must be cloneable via [structured clone algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm). |
198
-
199
- **Supported types:** strings, numbers, booleans, plain objects, arrays, Dates, Maps, Sets, ArrayBuffers.
200
- **Not supported:** functions, DOM nodes, class instances with methods, Symbols, Promises.
83
+ The argument must be cloneable via the [structured clone algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) — strings, numbers, booleans, plain objects, arrays, Dates, Maps, Sets, ArrayBuffers. **Not supported:** functions, DOM nodes, class instances with methods, Symbols, Promises.
201
84
 
202
- **Returns:** `void`
85
+ ## Customizing Modal
203
86
 
204
- ### Customizing Modal
205
-
206
- Edit `.config.ts` for organized settings:
87
+ Edit `<modal>.config.ts` (generated alongside the modal) to change the title and dimensions. The generated `.tsx` already imports and uses it.
207
88
 
208
89
  ```typescript
90
+ // <modal>.config.ts
209
91
  export default {
210
92
  title: 'User Settings',
211
93
  width: 600,
212
94
  height: 500,
213
- }
214
- ```
215
-
216
- Import in `.tsx`:
217
-
218
- ```typescript
219
- import config from './modal.config.ts';
220
-
221
- export default function MyModal() {
222
- return (
223
- <CustomModalLayout
224
- title={config.title}
225
- // ... rest of component
226
- />
227
- );
228
- }
95
+ };
229
96
  ```
230
97
 
231
98
  ## Common Mistakes
232
99
 
233
100
  | Mistake | Fix |
234
101
  |---------|-----|
235
- | Can't find modal ID | Check `.extension.ts` file's `id` field |
236
- | Forgetting to register in `extensions.ts` | Import and `.use()` the modal |
102
+ | Can't find modal ID | Check the modal's generated builder file (`extensions.ts`) `id` field |
237
103
  | Using `extensionId` instead of `modalId` | Use `modalId` in `openModal()` |
238
104
  | Can't access params in modal | Use `dashboard.observeState()` to read passed data |
239
105
  | Modal won't close | Use `dashboard.closeModal()` from `@wix/dashboard` |
240
106
 
241
107
  ## Real-World Example
242
108
 
109
+ End-to-end edit-item flow. The scaffolded `<modal>.tsx` already wires up `CustomModalLayout` — the unique parts are on the opener side, in `observeState`, and in the save handler.
110
+
243
111
  ```typescript
244
- // Dashboard Page: Opening edit modal
245
- const handleEdit = async (item: Item) => {
112
+ // Dashboard Page: open the modal with the item to edit
113
+ const handleEdit = (item: Item) => {
246
114
  dashboard.openModal({
247
115
  modalId: "edit-item-modal-guid",
248
- params: {
249
- itemId: item._id,
250
- item: item, // Objects passed directly via params
251
- },
116
+ params: { item }, // objects are passed directly via params
252
117
  });
253
118
  };
254
119
 
255
- // Modal: Receiving and saving data
256
- export default function ItemEditModal() {
257
- const [formData, setFormData] = useState<Item | null>(null);
258
-
259
- useEffect(() => {
260
- dashboard.observeState((state) => {
261
- if (state.item) {
262
- setFormData(state.item);
263
- }
264
- });
265
- }, []);
266
-
267
- const handleSave = async () => {
268
- // Save logic
269
- dashboard.showToast({ message: "Saved!", type: "success" });
270
- dashboard.closeModal();
271
- };
272
-
273
- return (
274
- <CustomModalLayout
275
- title="Edit Item"
276
- primaryButtonText="Save"
277
- onCloseButtonClick={() => dashboard.closeModal()}
278
- primaryButtonOnClick={handleSave}
279
- content={/* form fields */}
280
- />
281
- );
282
- }
120
+ // Modal: read params, save, toast, close
121
+ const [formData, setFormData] = useState<Item | null>(null);
122
+
123
+ useEffect(() => {
124
+ dashboard.observeState((state) => {
125
+ if (state.item) setFormData(state.item);
126
+ });
127
+ }, []);
128
+
129
+ const handleSave = async () => {
130
+ // ...your save logic...
131
+ dashboard.showToast({ message: "Saved!", type: "success" });
132
+ dashboard.closeModal();
133
+ };
283
134
  ```
@@ -1,17 +1,22 @@
1
1
 
2
2
  # Wix Dashboard Page Builder
3
3
 
4
- Creates full-featured dashboard page extensions for Wix CLI applications. Dashboard pages appear in the Wix site owner's dashboard and enable site administrators to manage data, configure settings, and perform administrative tasks.
4
+ Dashboard pages appear in the site owner's Wix dashboard and enable site administrators to manage data, configure settings, and perform admin tasks.
5
5
 
6
+ ## Scaffold
6
7
 
7
- ## Quick Start Checklist
8
+ Use `wix generate --params` with all required fields:
8
9
 
9
- Follow these steps in order when creating a dashboard page:
10
+ ```bash
11
+ wix generate --params '{"extensionType":"DASHBOARD_PAGE","title":"<title>","route":"<route>"}'
12
+ ```
13
+
14
+ | Field | Constraint |
15
+ | --- | --- |
16
+ | `title` | Display name shown in the dashboard sidebar. |
17
+ | `route` | URL path segment (lowercase alphanumeric + hyphens). The page is served at `/dashboard/<route>`. The scaffold param is `route`; the builder file's runtime field is `routePath`. |
10
18
 
11
- 1. [ ] Create page folder: `src/extensions/dashboard/pages/<page-name>/`
12
- 2. [ ] Create `page.tsx` with WDS components wrapped in `WixDesignSystemProvider`
13
- 3. [ ] Create `extensions.ts` with `extensions.dashboardPage()` and unique UUID
14
- 4. [ ] Update `src/extensions.ts` to import and use the new extension
19
+ 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`.
15
20
 
16
21
  ## Capabilities
17
22
 
@@ -67,50 +72,15 @@ When building a dashboard page to configure an embedded script, see [Dynamic Par
67
72
  - All parameters must be saved as strings (convert booleans/numbers to strings)
68
73
  - Use `withProviders` wrapper when dynamic parameters are present
69
74
 
70
- ## Files and Code Structure
71
-
72
- Dashboard pages live under `src/extensions/dashboard/pages`. Each page has its own folder.
73
-
74
- **File structure:**
75
-
76
- - `src/extensions/dashboard/pages/<page>/page.tsx` — page component
77
-
78
- **Key metadata fields:**
79
-
80
- - `id` (string, GUID): Unique page ID used to register the page
81
- - `title` (string): Used for browser tab and optional sidebar label
82
- - `additionalRoutes` (string[], optional): Extra routes leading to this page
83
- - `sidebar.disabled` (boolean, optional): Hide page from sidebar (default false)
84
- - `sidebar.priority` (number, optional): Sidebar ordering; lower is higher priority
85
- - `sidebar.whenActive.selectedPageId` (string, optional): Which page appears selected when this page is active
86
- - `sidebar.whenActive.hideSidebar` (boolean, optional): Hide sidebar when this page is active
75
+ ## Optional builder fields
87
76
 
88
- ## WDS Provider Usage
77
+ The CLI scaffolds the builder with `id`, `title`, `routePath`, and `component`. To customize sidebar placement and routing, edit the generated builder file to set:
89
78
 
90
- Wrap your dashboard page component with `WixDesignSystemProvider` to enable WDS components and theming. You must also import the global CSS styles for WDS components to render correctly.
91
-
92
- ```typescript
93
- import { WixDesignSystemProvider } from "@wix/design-system";
94
- import '@wix/design-system/styles.global.css';
95
-
96
- export default function () {
97
- return (
98
- <WixDesignSystemProvider>
99
- <Page>
100
- <Page.Header
101
- title="My Page"
102
- subtitle="This is a subtitle for your page"
103
- />
104
- <Page.Content>
105
- <EmptyState title="My Page" subtitle="Hello World!" theme="page" />
106
- </Page.Content>
107
- </Page>
108
- </WixDesignSystemProvider>
109
- );
110
- }
111
- ```
112
-
113
- **Note:** When using dynamic parameters, use the `withProviders` wrapper instead. See [Dynamic Parameters](dashboard-page/DYNAMIC_PARAMETERS.md) for details.
79
+ - `additionalRoutes` (string[]): extra routes leading to this page.
80
+ - `sidebar.disabled` (boolean, default false): hide page from sidebar.
81
+ - `sidebar.priority` (number): sidebar ordering; lower is higher priority.
82
+ - `sidebar.whenActive.selectedPageId` (string): which page appears selected when this page is active.
83
+ - `sidebar.whenActive.hideSidebar` (boolean): hide sidebar when this page is active.
114
84
 
115
85
  ## Examples
116
86
 
@@ -169,55 +139,6 @@ const handleSave = async () => {
169
139
  };
170
140
  ```
171
141
 
172
- ## Extension Registration
173
-
174
- **Extension registration is MANDATORY and has TWO required steps.**
175
-
176
- ### Step 1: Create Page-Specific Extension File
177
-
178
- Each dashboard page requires an `extensions.ts` file in its folder:
179
-
180
- **File:** `src/extensions/dashboard/pages/<page-name>/extensions.ts`
181
-
182
- ```typescript
183
- import { extensions } from "@wix/astro/builders";
184
-
185
- export const dashboardpageMyPage = extensions.dashboardPage({
186
- id: "{{GENERATE_UUID}}",
187
- title: "My Page",
188
- routePath: "my-page",
189
- component: "./extensions/dashboard/pages/my-page/page.tsx",
190
- });
191
- ```
192
-
193
- **CRITICAL: UUID Generation**
194
-
195
- The `id` must be a unique, static UUID v4 string. Generate a fresh UUID for each extension - do NOT use `randomUUID()` or copy UUIDs from examples. Replace `{{GENERATE_UUID}}` with a freshly generated UUID like `"a1b2c3d4-e5f6-7890-abcd-ef1234567890"`.
196
-
197
- | Property | Type | Description |
198
- | ----------- | ------ | ---------------------------------------------------------------------------------------------------- |
199
- | `id` | string | Unique static UUID v4 (generate fresh - see note above) |
200
- | `title` | string | Display title in dashboard sidebar |
201
- | `routePath` | string | URL path segment. Lowercase letters, numbers, dashes, and slashes only. Must NOT start with a slash. |
202
- | `component` | string | Relative path to the page component (.tsx) |
203
-
204
- ### Step 2: Register in Main Extensions File
205
-
206
- **CRITICAL:** After creating the page-specific extension file, you MUST read [Extension Registration reference](EXTENSION_REGISTRATION.md) and follow the "App Registration" section to update `src/extensions.ts`.
207
-
208
- **Without completing Step 2, the dashboard page will not appear in the Wix dashboard.**
209
-
210
- ## Common Mistakes - Do NOT
211
-
212
- **API confusion with other extension types:**
213
-
214
- | WRONG (Embedded Script API) | CORRECT (Dashboard Page API) |
215
- | --------------------------- | ---------------------------- |
216
- | `name: "..."` | `title: "..."` |
217
- | `source: "..."` | `component: "..."` |
218
- | `route: "..."` | `routePath: "..."` |
219
-
220
- Do NOT copy field names from embedded script or other extension registrations. Dashboard pages use `title`, `routePath`, and `component`.
221
142
 
222
143
  ## API Spec Support
223
144