@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.
- package/README.md +2 -2
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +49 -42
- package/skills/wix-app/references/BACKEND_EVENT.md +10 -65
- package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +101 -406
- package/skills/wix-app/references/DASHBOARD_MENU_PLUGIN.md +14 -111
- package/skills/wix-app/references/DASHBOARD_MODAL.md +56 -205
- package/skills/wix-app/references/DASHBOARD_PAGE.md +19 -98
- package/skills/wix-app/references/DASHBOARD_PLUGIN.md +6 -108
- package/skills/wix-app/references/DATA_COLLECTION.md +113 -198
- package/skills/wix-app/references/EMBEDDED_SCRIPT.md +41 -268
- package/skills/wix-app/references/EXTENSION_REGISTRATION.md +27 -76
- package/skills/wix-app/references/SERVICE_PLUGIN.md +35 -188
- package/skills/wix-app/references/SITE_PLUGIN.md +8 -92
- package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +0 -44
- package/skills/wix-app/references/custom-element-widget/SETTINGS_PANEL.md +19 -330
- package/skills/wix-app/references/dashboard-menu-plugin/bookings-slots.md +0 -12
- package/skills/wix-app/references/dashboard-menu-plugin/ecommerce-slots.md +7 -0
- package/skills/wix-app/references/dashboard-menu-plugin/restaurants-slots.md +0 -12
- package/skills/wix-app/references/dashboard-plugin/SLOTS.md +3 -15
- package/skills/wix-app/references/service-plugin/ADDITIONAL-FEES.md +2 -18
- package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +2 -42
- package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +1 -11
- package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +1 -11
- package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +2 -40
- package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +2 -19
- package/skills/wix-app/references/service-plugin/VALIDATIONS.md +2 -18
- package/skills/wix-app/references/site-plugin/SLOTS.md +17 -68
- package/skills/wix-headless/SKILL.md +111 -389
- package/skills/wix-headless/references/BUILD.md +307 -0
- package/skills/wix-headless/references/DESIGN_SYSTEM.md +115 -0
- package/skills/wix-headless/references/DISCOVERY.md +237 -112
- package/skills/wix-headless/references/PLAN.md +82 -0
- package/skills/wix-headless/references/SEED.md +205 -0
- package/skills/wix-headless/references/SETUP.md +140 -134
- package/skills/wix-headless/references/astro/COMPOSE.md +142 -0
- package/skills/wix-headless/references/{blog → astro/blog}/BLOG_PAGES.md +1 -1
- package/skills/wix-headless/references/{blog → astro/blog}/BLOG_SETUP.md +2 -2
- package/skills/wix-headless/references/astro/cms/CMS_FOUNDATIONS.md +214 -0
- package/skills/wix-headless/references/{cms → astro/cms}/FAQ_KNOWLEDGE_BASE.md +6 -4
- package/skills/wix-headless/references/{cms → astro/cms}/PORTFOLIO.md +5 -5
- package/skills/wix-headless/references/{cms → astro/cms}/RESOURCE_LIBRARY.md +5 -5
- package/skills/wix-headless/references/{cms → astro/cms}/TEAM_DIRECTORY.md +5 -5
- package/skills/wix-headless/references/astro/designer/INSTRUCTIONS.md +331 -0
- package/skills/wix-headless/references/{ecom → astro/ecom}/CART_PAGES.md +1 -1
- package/skills/wix-headless/references/{ecom → astro/ecom}/CART_WIRING.md +1 -1
- package/skills/wix-headless/references/{ecom → astro/ecom}/COMPONENTS_CSS.md +3 -3
- package/skills/wix-headless/references/{forms → astro/forms}/CONTACT_FORM.md +13 -13
- package/skills/wix-headless/references/{gift-cards → astro/gift-cards}/COMPONENTS.md +1 -1
- package/skills/wix-headless/references/{gift-cards → astro/gift-cards}/PAGES.md +1 -1
- package/skills/wix-headless/references/{stores → astro/stores}/BACK_IN_STOCK.md +1 -1
- package/skills/wix-headless/references/{stores → astro/stores}/CATEGORY_PAGES.md +12 -13
- package/skills/wix-headless/references/{stores → astro/stores}/COMPONENTS_CSS.md +4 -4
- package/skills/wix-headless/references/{stores → astro/stores}/HOME_AND_NAV.md +11 -9
- package/skills/wix-headless/references/{stores → astro/stores}/PRODUCT_PAGES.md +5 -3
- package/skills/wix-headless/references/{stores → astro/stores}/SHARED_WIRING.md +3 -3
- package/skills/wix-headless/references/astro/templates/Footer.astro +27 -0
- package/skills/wix-headless/references/astro/templates/Layout.astro +132 -0
- package/skills/wix-headless/references/astro/templates/Navigation.astro +38 -0
- package/skills/wix-headless/references/astro/templates/astro.config.mjs +41 -0
- package/skills/wix-headless/references/astro/templates/ecom/components-ecom.css +302 -0
- package/skills/wix-headless/references/astro/templates/global.css +286 -0
- package/skills/wix-headless/references/astro/templates/index.astro +56 -0
- package/skills/wix-headless/{templates → references/astro/templates}/stores/back-in-stock.ts +1 -1
- package/skills/wix-headless/{templates → references/astro/templates}/stores/components-stores.css +138 -33
- package/skills/wix-headless/references/blog/BLOG_CONTENT.md +10 -11
- package/skills/wix-headless/references/blog/INSTRUCTIONS.md +5 -5
- package/skills/wix-headless/references/cms/CMS_FOUNDATIONS.md +31 -230
- package/skills/wix-headless/references/cms/INSTRUCTIONS.md +13 -8
- package/skills/wix-headless/references/custom/INSTRUCTIONS.md +38 -0
- package/skills/wix-headless/references/ecom/INSTRUCTIONS.md +10 -10
- package/skills/wix-headless/references/forms/INSTRUCTIONS.md +5 -5
- package/skills/wix-headless/references/gift-cards/INSTRUCTIONS.md +11 -11
- package/skills/wix-headless/references/images/INSTRUCTIONS.md +47 -50
- package/skills/wix-headless/references/seed-recipes.md +49 -0
- package/skills/wix-headless/references/shared/AUTHENTICATION.md +110 -0
- package/skills/wix-headless/references/shared/BUILD_NOISE.md +2 -2
- package/skills/wix-headless/references/shared/DOCS_SEARCH.md +41 -0
- package/skills/wix-headless/references/shared/IMAGE_GENERATION.md +17 -17
- package/skills/wix-headless/references/shared/IMPLEMENTER.md +20 -29
- package/skills/wix-headless/references/shared/PRODUCTION_SHARP_EDGES.md +1 -1
- package/skills/wix-headless/references/shared/RETURN_CONTRACT.md +25 -16
- package/skills/wix-headless/references/shared/STYLING.md +47 -10
- package/skills/wix-headless/references/stores/INSTRUCTIONS.md +25 -25
- package/skills/wix-headless/references/stores/PRODUCT_CATALOG_DATA.md +17 -17
- package/skills/wix-headless/references/verticals/_schema.json +31 -117
- package/skills/wix-headless/references/verticals/_schema.md +60 -150
- package/skills/wix-headless/references/verticals/blog.md +5 -99
- package/skills/wix-headless/references/verticals/cms.md +9 -100
- package/skills/wix-headless/references/verticals/ecom.md +5 -76
- package/skills/wix-headless/references/verticals/forms.md +5 -85
- package/skills/wix-headless/references/verticals/gift-cards.md +6 -103
- package/skills/wix-headless/references/verticals/stores.md +10 -144
- package/skills/wix-headless/scripts/check-manifest.mjs +5 -5
- package/skills/wix-headless/scripts/emit-design-tokens.mjs +29 -23
- package/skills/wix-headless/scripts/init-site-json.mjs +59 -21
- package/skills/wix-headless/scripts/patch-decorative-slots.mjs +67 -43
- package/skills/wix-headless/scripts/plan-entity-image-waves.mjs +3 -3
- package/skills/wix-headless/scripts/preview.sh +3 -3
- package/skills/wix-headless/scripts/release.sh +4 -4
- package/skills/wix-headless/scripts/scaffold.sh +75 -20
- package/skills/wix-headless/scripts/seed-utilities.sh +50 -12
- package/skills/wix-manage/SKILL.md +4 -8
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +4 -0
- package/skills/wix-manage/references/cms/cms-references-and-relationships.md +2 -0
- package/skills/wix-manage/references/cms/cms-schema-management.md +4 -0
- package/skills/wix-manage/references/ecommerce/api-shipping.md +443 -0
- package/skills/wix-manage/references/ecommerce/flow-add-free-shipping.md +5 -6
- package/skills/wix-manage/references/ecommerce/flow-fix-coverage-gaps.md +4 -5
- package/skills/wix-manage/references/ecommerce/flow-optimize-shipping-rates.md +4 -5
- package/skills/wix-manage/references/ecommerce/goal-increase-aov.md +1 -1
- package/skills/wix-manage/references/ecommerce/goal-reduce-cart-abandonment.md +1 -2
- package/skills/wix-manage/references/ecommerce/guardrail-shipping-health.md +2 -2
- package/skills/wix-manage/references/ecommerce/recipe-apply-shipping-recommendations.md +4 -5
- package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +7 -7
- package/skills/wix-manage/references/ecommerce/setup-discount-rules.md +209 -72
- package/skills/wix-manage/references/ecommerce/setup-store-pickup-location.md +9 -10
- package/skills/wix-manage/references/ecommerce/skill-graph.md +4 -4
- package/skills/wix-manage/references/forms/create-form.md +2 -0
- package/skills/wix-manage/references/stores/bulk-create-products-with-options.md +2 -0
- package/skills/wix-manage/references/stores/create-product-from-image.md +91 -38
- package/skills/wix-manage/references/stores/setup-online-store-catalog-v3.md +2 -0
- package/skills/wix-app/references/custom-element-widget/default-thumbnail.png +0 -0
- package/skills/wix-app/references/data-collection/extension-template.ts +0 -107
- package/skills/wix-headless/references/ORCHESTRATION.md +0 -269
- package/skills/wix-headless/references/commands/install-app.md +0 -42
- package/skills/wix-headless/references/commands/mcp-bootstrap.md +0 -28
- package/skills/wix-headless/references/designer/INSTRUCTIONS.md +0 -828
- package/skills/wix-headless/references/shared/MCP_PREFIX.md +0 -105
- package/skills/wix-headless/scripts/copy-utility-templates.mjs +0 -153
- package/skills/wix-headless/templates/ecom/components-ecom.css +0 -215
- package/skills/wix-manage/references/events/list-events.md +0 -203
- /package/skills/wix-headless/{templates → references/astro/templates}/ecom/CartBadge.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/ecom/CartView.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/ecom/cart.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/ecom/discounts.ts +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/ecom/thank-you.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/GiftCardPurchase.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/_home-teaser-snippet.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/_nav-snippet.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/components-gift-cards.css +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/gift-cards.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/gift-cards/gift-cards.ts +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/AddToCartButton.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/BackInStockForm.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/CategoryRail.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/ProductCard.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/ProductPurchase.tsx +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/SeoTags.astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/categories.ts +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/category/[slug].astro +0 -0
- /package/skills/wix-headless/{templates → references/astro/templates}/stores/products/[slug].astro +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
+
The `action` field determines what happens when the user clicks the menu item. Configure **exactly one** of the following:
|
|
129
32
|
|
|
130
|
-
|
|
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
|
-
|
|
38
|
+
## Icon Selection
|
|
133
39
|
|
|
134
|
-
|
|
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
|
-
|
|
2
|
+
# Wix Dashboard Modal
|
|
3
3
|
|
|
4
|
-
Dashboard modals are popup dialogs triggered from dashboard pages or plugins. They
|
|
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
|
-
##
|
|
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", //
|
|
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
|
-
|
|
58
|
+
## Receiving Data in Modal
|
|
155
59
|
|
|
156
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
85
|
+
## Customizing Modal
|
|
203
86
|
|
|
204
|
-
|
|
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
|
|
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:
|
|
245
|
-
const handleEdit =
|
|
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:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8
|
+
Use `wix generate --params` with all required fields:
|
|
8
9
|
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|