igniteui-webcomponents 7.4.0 → 7.4.1
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/CHANGELOG.md +38 -0
- package/components/checkbox/checkbox-base.d.ts +2 -0
- package/components/checkbox/checkbox-base.js +4 -0
- package/components/checkbox/checkbox-base.js.map +1 -1
- package/components/checkbox/checkbox.js +3 -11
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/switch.js +1 -8
- package/components/checkbox/switch.js.map +1 -1
- package/components/color-picker/color-picker.js +3 -3
- package/components/color-picker/color-picker.js.map +1 -1
- package/components/combo/combo.d.ts +6 -4
- package/components/combo/combo.js +13 -24
- package/components/combo/combo.js.map +1 -1
- package/components/date-picker/date-picker.base.d.ts +3 -3
- package/components/date-picker/date-picker.base.js +2 -2
- package/components/date-picker/date-picker.base.js.map +1 -1
- package/components/date-picker/date-picker.d.ts +1 -1
- package/components/date-range-picker/date-range-picker.d.ts +1 -1
- package/components/date-time-input/date-time-input.base.d.ts +4 -4
- package/components/date-time-input/date-time-input.base.js +3 -5
- package/components/date-time-input/date-time-input.base.js.map +1 -1
- package/components/file-input/file-input.d.ts +5 -0
- package/components/file-input/file-input.js +4 -0
- package/components/file-input/file-input.js.map +1 -1
- package/components/input/input-base.d.ts +2 -2
- package/components/input/input-base.js +3 -5
- package/components/input/input-base.js.map +1 -1
- package/components/input/input.d.ts +1 -1
- package/components/radio/radio.d.ts +2 -0
- package/components/radio/radio.js +7 -11
- package/components/radio/radio.js.map +1 -1
- package/components/rating/rating.d.ts +3 -0
- package/components/rating/rating.js +17 -18
- package/components/rating/rating.js.map +1 -1
- package/components/select/select.js +1 -1
- package/components/select/select.js.map +1 -1
- package/components/slider/range-slider.d.ts +0 -1
- package/components/slider/range-slider.js +6 -11
- package/components/slider/range-slider.js.map +1 -1
- package/components/slider/slider-base.d.ts +4 -1
- package/components/slider/slider-base.js +20 -18
- package/components/slider/slider-base.js.map +1 -1
- package/components/slider/slider.d.ts +2 -0
- package/components/slider/slider.js +5 -1
- package/components/slider/slider.js.map +1 -1
- package/components/textarea/textarea.d.ts +1 -4
- package/components/textarea/textarea.js +3 -5
- package/components/textarea/textarea.js.map +1 -1
- package/components/validation-container/validation-container.js +2 -1
- package/components/validation-container/validation-container.js.map +1 -1
- package/components/virtualization/engine.d.ts +35 -4
- package/components/virtualization/engine.js +126 -61
- package/components/virtualization/engine.js.map +1 -1
- package/components/virtualization/recycle.d.ts +13 -0
- package/components/virtualization/recycle.js +152 -0
- package/components/virtualization/recycle.js.map +1 -0
- package/components/virtualization/virtualization.d.ts +32 -11
- package/components/virtualization/virtualization.js +14 -11
- package/components/virtualization/virtualization.js.map +1 -1
- package/custom-elements.json +2382 -79
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/internals/controllers/aria-projection.d.ts +61 -23
- package/internals/controllers/aria-projection.js +77 -26
- package/internals/controllers/aria-projection.js.map +1 -1
- package/internals/mixins/forms/associated.js +34 -0
- package/internals/mixins/forms/associated.js.map +1 -1
- package/internals/mixins/forms/types.d.ts +5 -0
- package/internals/mixins/forms/types.js.map +1 -1
- package/internals/templates/toggle-shell.d.ts +15 -14
- package/internals/templates/toggle-shell.js +12 -8
- package/internals/templates/toggle-shell.js.map +1 -1
- package/internals/utils/dom.d.ts +2 -2
- package/internals/utils/dom.js +2 -2
- package/internals/utils/dom.js.map +1 -1
- package/package.json +1 -1
- package/skills/README.md +2 -4
- package/skills/igniteui-wc-choose-components/SKILL.md +2 -1
- package/skills/igniteui-wc-customize-component-theme/SKILL.md +2 -1
- package/skills/igniteui-wc-figma-to-app/SKILL.md +133 -712
- package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +42 -62
- package/skills/igniteui-wc-figma-to-app/references/design-provenance.md +199 -0
- package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +189 -107
- package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +129 -84
- package/skills/igniteui-wc-figma-to-app/references/figma-exploration.md +222 -0
- package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +81 -127
- package/skills/igniteui-wc-figma-to-app/references/project-setup.md +105 -0
- package/skills/igniteui-wc-figma-to-app/references/theme-generation.md +180 -0
- package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +74 -80
- package/skills/igniteui-wc-generate-from-image-design/SKILL.md +2 -1
- package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +3 -3
- package/skills/igniteui-wc-grids/SKILL.md +133 -0
- package/skills/igniteui-wc-integrate-with-framework/SKILL.md +2 -1
- package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +2 -1
- package/skills/igniteui-wc-optimize-bundle-size/SKILL.md +2 -1
- package/web-types.json +1 -1
|
@@ -1,39 +1,87 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Figma Components → Ignite UI Web Components Map
|
|
2
2
|
|
|
3
3
|
> **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
|
|
4
4
|
>
|
|
5
|
-
>
|
|
6
|
-
> Indigo variants) that designers use to build their app screens. Every component instance
|
|
7
|
-
> in a design file is drawn from one of these libraries and maps to an Ignite UI Web
|
|
8
|
-
> Components control.
|
|
5
|
+
> Use this file in Phase 2a to resolve every row of the Phase 1g Table A to a tag, component class, package, and `get_doc` name. It has two entry points:
|
|
9
6
|
>
|
|
10
|
-
>
|
|
11
|
-
>
|
|
12
|
-
>
|
|
7
|
+
> - **Canonical Role Index** (next section). Use it for **Tier B and Tier C** layers: components from any other UI kit, or un-componentized frames, after they are normalized with [design-provenance.md](design-provenance.md).
|
|
8
|
+
> - **Kit Component Name** tables (the sections after it). Use them for **Tier A** layers from the Infragistics **Indigo.Design UI Kits** (Material, Fluent, Bootstrap, Indigo variants), whose layer names map to Ignite UI directly.
|
|
9
|
+
>
|
|
10
|
+
> When a role or layer name is in neither, call `list_components` then `get_doc` on the closest match.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Canonical Role Index
|
|
15
|
+
|
|
16
|
+
Normalized roles from `design-provenance.md` → the Ignite UI tag, and the section below that holds its full row (class, package, doc name, key attributes).
|
|
17
|
+
|
|
18
|
+
| Canonical role (+ normalized props) | Ignite UI Web Components | Section |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `button` · high | `<igc-button variant="contained">` | Button Components |
|
|
21
|
+
| `button` · medium (outlined) | `<igc-button variant="outlined">` | Button Components |
|
|
22
|
+
| `button` · medium (tonal / secondary fill) | `<igc-button variant="contained">` + `contained-button` tokens set to the **measured** tonal fill and text colors (usually a light shade such as `var(--ig-primary-100)`). Do not use the plain `secondary` palette: on a `material` baseline it holds the brand color, so tonal buttons would look like high-emphasis ones | Button Components |
|
|
23
|
+
| `button` · low | `<igc-button variant="flat">` | Button Components |
|
|
24
|
+
| `button` · link | `<igc-button variant="flat" href="…">`, or a plain `<a>` styled as a link | Button Components |
|
|
25
|
+
| `button` · elevated | `<igc-button variant="contained">` + elevation via tokens | Button Components |
|
|
26
|
+
| `button` · danger | Same variant + tokens bound to `--ig-error-*` | Button Components |
|
|
27
|
+
| `icon-button` | `<igc-icon-button variant="flat\|outlined\|contained">` | Button Components |
|
|
28
|
+
| `fab` | `<igc-button variant="fab">` | Button Components |
|
|
29
|
+
| `toggle-group` | `<igc-button-group>` + `<igc-toggle-button>` | Button Components |
|
|
30
|
+
| `text-field` · outlined | `<igc-input outlined>` | Form Controls |
|
|
31
|
+
| `text-field` · filled / underlined | `<igc-input>` (close the look with `input-group` tokens) | Form Controls |
|
|
32
|
+
| `textarea` | `<igc-textarea>` | Form Controls |
|
|
33
|
+
| `select` | `<igc-select>` | Form Controls |
|
|
34
|
+
| `combobox` (single, searchable) | `<igc-combo single-select>` | Form Controls |
|
|
35
|
+
| `combobox` (multi / tags) | `<igc-combo>` | Form Controls |
|
|
36
|
+
| `checkbox` / `radio` / `switch` | `<igc-checkbox>` / `<igc-radio-group>`+`<igc-radio>` / `<igc-switch>` | Form Controls |
|
|
37
|
+
| `slider` / `range-slider` | `<igc-slider>` / `<igc-range-slider>` | Form Controls |
|
|
38
|
+
| `rating` | `<igc-rating>` | Form Controls |
|
|
39
|
+
| `file-upload` | `<igc-file-input>` | Form Controls |
|
|
40
|
+
| `color-picker` | `<igc-color-picker>` | Form Controls |
|
|
41
|
+
| `date-picker` / `date-range-picker` / `calendar` | `<igc-date-picker>` / `<igc-date-range-picker>` / `<igc-calendar>` | Date & Time |
|
|
42
|
+
| `time-picker` | `<igc-date-time-input>` with a time format | Date & Time |
|
|
43
|
+
| `app-bar` | `<igc-navbar>` | Navigation |
|
|
44
|
+
| `side-nav` (expanded, always visible) | `<igc-nav-drawer position="relative" open>` | Navigation |
|
|
45
|
+
| navigation rail (icon-only) | `<igc-nav-drawer position="relative">` (**not** `open`) with the rail items in the `mini` slot. The mini rail is hidden while the drawer is open | Navigation |
|
|
46
|
+
| `tabs` | `<igc-tabs>` | Navigation |
|
|
47
|
+
| `breadcrumbs` | `<igc-breadcrumbs>` + `<igc-breadcrumb>` | Navigation |
|
|
48
|
+
| `stepper` | `<igc-stepper>` | Navigation |
|
|
49
|
+
| `menu` | `<igc-dropdown>` | Form Controls |
|
|
50
|
+
| `accordion` / `expansion-panel` | `<igc-accordion>` / `<igc-expansion-panel>` | Layout |
|
|
51
|
+
| `card` | `<igc-card>` (only when header/media/content/actions anatomy fits) | Data Display |
|
|
52
|
+
| `list` | `<igc-list>` | Data Display |
|
|
53
|
+
| `tree` | `<igc-tree>` | Data Display |
|
|
54
|
+
| `data-table` (simple, read-only) | `<igc-grid-lite>` | Grids |
|
|
55
|
+
| `data-table` (editing, grouping, paging, summaries…) | `<igc-grid>` and family | Grids |
|
|
56
|
+
| `avatar` | `<igc-avatar>` | Data Display |
|
|
57
|
+
| `tag` / `count-badge` | `<igc-badge>` | Data Display |
|
|
58
|
+
| `chip` | `<igc-chip>` | Data Display |
|
|
59
|
+
| `progress-linear` / `progress-circular` | `<igc-linear-progress>` / `<igc-circular-progress>` | Data Display |
|
|
60
|
+
| `divider` | `<igc-divider>` | Data Display |
|
|
61
|
+
| `carousel` | `<igc-carousel>` | Data Display |
|
|
62
|
+
| `dialog` | `<igc-dialog>` | Feedback / Overlay |
|
|
63
|
+
| `toast` (text only) / (with action) | `<igc-toast>` / `<igc-snackbar>` | Feedback / Overlay |
|
|
64
|
+
| `inline-alert` | `<igc-banner>` | Feedback / Overlay |
|
|
65
|
+
| `tooltip` | `<igc-tooltip>` | Feedback / Overlay |
|
|
66
|
+
| `qr-code` | `<igc-qr-code>` | Data Display |
|
|
67
|
+
| `chart-*` / `gauge-*` / `map` | See the DV table | Charts, Gauges, and Maps |
|
|
68
|
+
| `bottom-nav`, `sheet`, `skeleton`, `pagination` (standalone) | No direct component | Components With No Web Components Equivalent |
|
|
13
69
|
|
|
14
70
|
---
|
|
15
71
|
|
|
16
|
-
## How to Use
|
|
72
|
+
## How to Use the Kit Tables
|
|
17
73
|
|
|
18
|
-
1. Find the kit component name (as it appears in the Figma layers panel or the
|
|
19
|
-
Indigo.Design kit library) in the **Kit Component Name** column.
|
|
74
|
+
1. Find the kit component name (as it appears in the Figma layers panel or the Indigo.Design kit library) in the **Kit Component Name** column.
|
|
20
75
|
2. Read the **Tag**, **Class**, and **Package** columns for the markup and imports.
|
|
21
|
-
3. Call `get_doc({ framework: "webcomponents", name: "<doc name>" })` for usage patterns
|
|
22
|
-
|
|
23
|
-
for the full property/method/event API.
|
|
24
|
-
4. Consult **Key attributes / slots** for the properties most commonly configured from
|
|
25
|
-
Figma variants. These are starting points, not a substitute for the docs.
|
|
76
|
+
3. Call `get_doc({ framework: "webcomponents", name: "<doc name>" })` for usage patterns and slots, then `get_api_reference({ platform: "webcomponents", component: "<Class>" })` for the full property/method/event API.
|
|
77
|
+
4. Consult **Key attributes / slots** for the properties most commonly configured from Figma variants. These are starting points, not a substitute for the docs.
|
|
26
78
|
|
|
27
|
-
> The kit component names are identical across all four kit variants (Material, Fluent,
|
|
28
|
-
> Bootstrap, Indigo). The kit variant determines the theme, not the component name.
|
|
79
|
+
> The kit component names are identical across all four kit variants (Material, Fluent, Bootstrap, Indigo). The kit variant determines the theme, not the component name.
|
|
29
80
|
|
|
30
81
|
### Doc-name rules you will hit immediately
|
|
31
82
|
|
|
32
|
-
- **Doc names are topic-page names, not tag names.** `navigation-drawer`, `text-area`,
|
|
33
|
-
|
|
34
|
-
- **`get_doc` normalizes and aliases input.** It strips the `Igc` prefix and the
|
|
35
|
-
`Component` suffix, so `IgcCarouselComponent` resolves to `carousel`. It also aliases
|
|
36
|
-
these Web Components names:
|
|
83
|
+
- **Doc names are topic-page names, not tag names.** `navigation-drawer`, `text-area`, `data-grid`, `circular-progress`.
|
|
84
|
+
- **`get_doc` normalizes and aliases input.** It strips the `Igc` prefix and the `Component` suffix, so `IgcCarouselComponent` resolves to `carousel`. It also aliases these Web Components names:
|
|
37
85
|
|
|
38
86
|
| You pass | Resolves to |
|
|
39
87
|
| --- | --- |
|
|
@@ -48,10 +96,8 @@
|
|
|
48
96
|
| `range-slider` | `slider` |
|
|
49
97
|
| `geographic-map` | `geo-map` |
|
|
50
98
|
|
|
51
|
-
- Combo has several topic pages (`overview`, `features`, `single-selection`, `templates`);
|
|
52
|
-
|
|
53
|
-
- Always confirm against a live `list_components({ framework: "webcomponents" })` — the
|
|
54
|
-
catalog is the source of truth, this table is a shortcut.
|
|
99
|
+
- Combo has several topic pages (`overview`, `features`, `single-selection`, `templates`); read `overview` first, then the specific one the design needs.
|
|
100
|
+
- Always confirm against a live `list_components({ framework: "webcomponents" })` — the catalog is the source of truth, this table is a shortcut.
|
|
55
101
|
|
|
56
102
|
### Registration cheat sheet
|
|
57
103
|
|
|
@@ -59,13 +105,11 @@
|
|
|
59
105
|
| --- | --- |
|
|
60
106
|
| `igniteui-webcomponents` | `defineComponents(IgcNavbarComponent, IgcCardComponent, …)` |
|
|
61
107
|
| `igniteui-webcomponents-grids` | `IgcGridComponent.register()` (per grid type) |
|
|
62
|
-
| `igniteui-grid-lite` |
|
|
108
|
+
| `igniteui-grid-lite` | `IgcGridLite.register()`, or `import 'igniteui-grid-lite/define'`; the column tag is `igc-grid-lite-column` |
|
|
63
109
|
| `igniteui-webcomponents-charts` / `-gauges` / `-maps` | `ModuleManager.register(IgcCategoryChartModule, …)` from `igniteui-webcomponents-core` |
|
|
64
|
-
| `igniteui-dockmanager` | `defineCustomElements()`
|
|
110
|
+
| `igniteui-dockmanager` | `defineComponents(IgcDockManagerComponent)` from `igniteui-dockmanager` (`defineCustomElements()` is deprecated since 2.0.0) |
|
|
65
111
|
|
|
66
|
-
Licensed projects use the same names prefixed with `@infragistics/` (e.g.
|
|
67
|
-
`@infragistics/igniteui-webcomponents-grids`). Resolve the layout once in Phase 0b and keep
|
|
68
|
-
it consistent.
|
|
112
|
+
Licensed projects use the same names prefixed with `@infragistics/` (e.g. `@infragistics/igniteui-webcomponents-grids`, `@infragistics/igniteui-dockmanager`). `igniteui-webcomponents` itself is MIT and has no licensed variant. Resolve the layout once in Phase 0b and keep it consistent.
|
|
69
113
|
|
|
70
114
|
---
|
|
71
115
|
|
|
@@ -80,21 +124,13 @@ it consistent.
|
|
|
80
124
|
| `_Icon Button/*` | `<igc-icon-button variant="flat">` | `IgcIconButtonComponent` | `igniteui-webcomponents` | `icon-button` | `variant` (`flat\|contained\|outlined`), `name`, `collection` |
|
|
81
125
|
| `_Button Group` | `<igc-button-group>` | `IgcButtonGroupComponent` | `igniteui-webcomponents` | `button-group` | `selection`, `alignment`; `<igc-toggle-button>` children |
|
|
82
126
|
|
|
83
|
-
> `variant` is an **attribute** on the element itself — there is no directive equivalent of
|
|
84
|
-
> Angular's `igxButton`. Icon-only buttons need an `aria-label` for the Phase 5g check.
|
|
127
|
+
> `variant` is an **attribute** on the element itself — there is no directive equivalent of Angular's `igxButton`. Icon-only buttons need an `aria-label` for the Phase 5g check.
|
|
85
128
|
|
|
86
129
|
---
|
|
87
130
|
|
|
88
131
|
## Form Controls
|
|
89
132
|
|
|
90
|
-
> **Input variants.** The kits express `line` / `box` / `border` input types. Web Components
|
|
91
|
-
> expose a single boolean **`outlined`** attribute (inherited from the shared input base) on
|
|
92
|
-
> `igc-input`, `igc-textarea`, `igc-mask-input`, `igc-date-time-input`, `igc-file-input`,
|
|
93
|
-
> `igc-select`, `igc-combo`, `igc-date-picker`, and `igc-date-range-picker`.
|
|
94
|
-
> Map `_Input/Border` → `outlined`; `_Input/Line` and `_Input/Box` → default.
|
|
95
|
-
> There is **no** global injection-token equivalent of Angular's `IGX_INPUT_GROUP_TYPE` —
|
|
96
|
-
> set the attribute per control, and close residual differences with `input-group`
|
|
97
|
-
> component tokens (Phase 3d), never with internal class selectors.
|
|
133
|
+
> **Input variants.** The kits express `line` / `box` / `border` input types. Web Components expose a single boolean **`outlined`** attribute on `igc-input`, `igc-textarea`, `igc-mask-input`, `igc-date-time-input`, `igc-file-input`, `igc-select`, `igc-combo`, `igc-date-picker`, and `igc-date-range-picker`. Map `_Input/Border` → `outlined`; `_Input/Line` and `_Input/Box` → default. There is **no** global injection-token equivalent of Angular's `IGX_INPUT_GROUP_TYPE` — set the attribute per control, and close residual differences with `input-group` component tokens (Phase 3d), never with internal class selectors.
|
|
98
134
|
|
|
99
135
|
| Kit Component Name | Tag | Class | Package | Doc | Key attributes / slots |
|
|
100
136
|
| ------------------------------ | ------------------------- | ------------------------------- | ------------------------ | ------------------- | --------------------------------------------------------------------------- |
|
|
@@ -102,7 +138,7 @@ it consistent.
|
|
|
102
138
|
| `_Input/Border` | `<igc-input outlined>` | `IgcInputComponent` | `igniteui-webcomponents` | `input` | `outlined` |
|
|
103
139
|
| `_Input/Search` | `<igc-input type="search">` | `IgcInputComponent` | `igniteui-webcomponents` | `input` | Add a search `igc-icon` in the `prefix` slot |
|
|
104
140
|
| `_Text Area` | `<igc-textarea>` | `IgcTextareaComponent` | `igniteui-webcomponents` | `text-area` | `label`, `rows`, `resize`, `outlined` |
|
|
105
|
-
| `_Masked Input` | `<igc-mask-input>` | `IgcMaskInputComponent` | `igniteui-webcomponents` | `mask-input` | `mask`, `prompt
|
|
141
|
+
| `_Masked Input` | `<igc-mask-input>` | `IgcMaskInputComponent` | `igniteui-webcomponents` | `mask-input` | `mask`, `prompt`, `value-mode` |
|
|
106
142
|
| `_File Upload` | `<igc-file-input>` | `IgcFileInputComponent` | `igniteui-webcomponents` | `file-input` | `multiple`, `accept`, `label` |
|
|
107
143
|
| `_Combo` / `_ComboBox` | `<igc-combo>` | `IgcComboComponent` | `igniteui-webcomponents` | `combo` → `overview` | `.data`, `display-key`, `value-key`, `group-key`, `single-select`, `outlined` |
|
|
108
144
|
| `_Simple Combo` | `<igc-combo single-select>` | `IgcComboComponent` | `igniteui-webcomponents` | `single-selection` | `single-select` — theme key is `simple-combo` |
|
|
@@ -114,6 +150,7 @@ it consistent.
|
|
|
114
150
|
| `_Slider` | `<igc-slider>` | `IgcSliderComponent` | `igniteui-webcomponents` | `slider` | `min`, `max`, `step`, `value`, `discrete-track` |
|
|
115
151
|
| `_Range Slider` | `<igc-range-slider>` | `IgcRangeSliderComponent` | `igniteui-webcomponents` | `slider` | `lower`, `upper` |
|
|
116
152
|
| `_Rating` | `<igc-rating>` | `IgcRatingComponent` | `igniteui-webcomponents` | `rating` | `value`, `max`, `step`, `single`, `allow-reset`, `hover-preview`, `readonly`; slots `symbol`, `value-label`; `igcChange` event |
|
|
153
|
+
| `_Color Picker` | `<igc-color-picker>` | `IgcColorPickerComponent` | `igniteui-webcomponents` | confirm via `list_components` | `value`, `format`, `label`, `mode`, `show-alpha`, `hide-formats` |
|
|
117
154
|
|
|
118
155
|
---
|
|
119
156
|
|
|
@@ -126,8 +163,7 @@ it consistent.
|
|
|
126
163
|
| `_Time Picker` | `<igc-date-time-input>` | `IgcDateTimeInputComponent` | `igniteui-webcomponents` | `date-time-input` | **No dedicated time picker in Web Components** — use a time `input-format` |
|
|
127
164
|
| `_Calendar` | `<igc-calendar>` | `IgcCalendarComponent` | `igniteui-webcomponents` | `calendar` | `selection` (`single\|multiple\|range`), `value`, `values`, `visible-months`, `week-start`, `show-week-numbers`, `header-orientation` |
|
|
128
165
|
|
|
129
|
-
>
|
|
130
|
-
> separate theme. Follow the related-theme chain from `get_component_design_tokens`.
|
|
166
|
+
> The date pickers are **compound** — their dropdown and calendar surfaces are separate themes. Follow the related-theme chain from `get_component_design_tokens`.
|
|
131
167
|
|
|
132
168
|
---
|
|
133
169
|
|
|
@@ -140,11 +176,10 @@ it consistent.
|
|
|
140
176
|
| `_Tabs` | `<igc-tabs>` | `IgcTabsComponent` | `igniteui-webcomponents` | `tabs` | `alignment`, `activation`; `<igc-tab label="…">` children with `prefix`/`suffix` slots |
|
|
141
177
|
| `_Bottom Navigation` | — | — | — | — | **Not available in Web Components.** Use `igc-tabs` or custom markup; document the substitution. |
|
|
142
178
|
| `_Stepper` | `<igc-stepper>` | `IgcStepperComponent` | `igniteui-webcomponents` | `stepper` | `orientation`, `step-type`, `linear`, `title-position`; `<igc-step>` children |
|
|
179
|
+
| `_Breadcrumbs` | `<igc-breadcrumbs>` | `IgcBreadcrumbsComponent` | `igniteui-webcomponents` | confirm via `list_components` | `separator`; default slot contains `<igc-breadcrumb>` children; wrap in `<nav aria-label="…">` |
|
|
180
|
+
| `_Breadcrumb` | `<igc-breadcrumb>` | `IgcBreadcrumbComponent` | `igniteui-webcomponents` | confirm via `list_components` | `current`, `disabled`; slots `prefix`, `suffix`, `separator` |
|
|
143
181
|
|
|
144
|
-
> A design showing a persistent, always-visible sidebar maps to
|
|
145
|
-
> `<igc-nav-drawer position="relative" open>` — not the modal default. The drawer's width is
|
|
146
|
-
> controlled by the `--menu-full-width` / `--menu-mini-width` custom properties on the host,
|
|
147
|
-
> which are **not** design tokens and will not appear in `get_component_design_tokens`.
|
|
182
|
+
> A design showing a persistent, always-visible sidebar maps to `<igc-nav-drawer position="relative" open>` — not the modal default. The drawer's width comes from the `navdrawer` design tokens `size` and `size--mini`, exposed as `--ig-nav-drawer-size` (default 15rem) and `--ig-nav-drawer-size--mini`. Set them through `create_component_theme` like any other token.
|
|
148
183
|
|
|
149
184
|
---
|
|
150
185
|
|
|
@@ -176,6 +211,7 @@ it consistent.
|
|
|
176
211
|
| `_Circular Progress` | `<igc-circular-progress>` | `IgcCircularProgressComponent` | `igniteui-webcomponents` | `circular-progress` | `value`, `max`, `indeterminate` — theme key `progress-circular` |
|
|
177
212
|
| `_Divider` | `<igc-divider>` | `IgcDividerComponent` | `igniteui-webcomponents` | `divider` | `type` (`solid\|dashed`), `vertical`, `middle` |
|
|
178
213
|
| `_Chat` | `<igc-chat>` | `IgcChatComponent` | `igniteui-webcomponents` | `chat` | `.messages`, `.options` assigned as properties |
|
|
214
|
+
| `_QR Code` | `<igc-qr-code>` | `IgcQrCodeComponent` | `igniteui-webcomponents` | confirm via `list_components` | `value`, `size`, `error-level`, `logo-src`, `dot-style`, `square-style` |
|
|
179
215
|
| `_Paginator` | `<igc-paginator>` | grid package | `igniteui-webcomponents-grids` | search `grid-paging` | Part of the grid packages, not a standalone core component |
|
|
180
216
|
|
|
181
217
|
---
|
|
@@ -205,27 +241,18 @@ it consistent.
|
|
|
205
241
|
Grid rules that differ from Angular:
|
|
206
242
|
|
|
207
243
|
- Register per grid type: `IgcGridComponent.register()`.
|
|
208
|
-
- The grid packages ship their **own theme CSS** —
|
|
209
|
-
`igniteui-webcomponents-grids/grids/themes/<variant>/<design-system>.css` — in addition to
|
|
210
|
-
the core theme. Inside a Lit component, import it `?inline` and inject it into the shadow
|
|
211
|
-
root; at app level, import it normally.
|
|
244
|
+
- The grid packages ship their **own theme CSS** — `igniteui-webcomponents-grids/grids/themes/<variant>/<design-system>.css` — in addition to the core theme. Inside a Lit component, import it `?inline` and inject it into the shadow root; at app level, import it normally.
|
|
212
245
|
- `data` is a property, not an attribute: `.data=${rows}` / `grid.data = rows`.
|
|
213
246
|
- Leave at least one `<igc-column>` without a `width` so it fills the remaining space.
|
|
214
|
-
- Feature docs are separate pages (`grid-editing`, `grid-filtering`, `grid-paging`, …) —
|
|
215
|
-
fetch the ones the artboard actually shows.
|
|
247
|
+
- Feature docs are separate pages (`grid-editing`, `grid-filtering`, `grid-paging`, …) — fetch the ones the artboard actually shows.
|
|
216
248
|
|
|
217
249
|
---
|
|
218
250
|
|
|
219
251
|
## Charts, Gauges, and Maps
|
|
220
252
|
|
|
221
|
-
> These are DV components. They have **no design tokens** — do not call
|
|
222
|
-
> `get_component_design_tokens` for them. Configure everything through properties, and take
|
|
223
|
-
> series colors from `theming_get_chart_series_colors` plus the Figma values captured in
|
|
224
|
-
> Phase 1d.
|
|
253
|
+
> These are DV components. They have **no design tokens** — do not call `get_component_design_tokens` for them. Configure everything through properties, and take series colors from `theming_get_chart_series_colors` plus the Figma values captured in Phase 1d.
|
|
225
254
|
>
|
|
226
|
-
> Registration for all three packages goes through
|
|
227
|
-
> `ModuleManager.register(IgcXxxModule, …)` imported from `igniteui-webcomponents-core`.
|
|
228
|
-
> Array and function values must be **assigned as properties**, never as attributes.
|
|
255
|
+
> Registration for all three packages goes through `ModuleManager.register(IgcXxxModule, …)` imported from `igniteui-webcomponents-core`. Array and function values must be **assigned as properties**, never as attributes.
|
|
229
256
|
|
|
230
257
|
| Kit Component Name | Tag | Class | Package | Doc |
|
|
231
258
|
| --------------------------------------------------------- | ------------------------- | ---------------------------- | -------------------------------- | --------------------------------------------- |
|
|
@@ -244,12 +271,9 @@ Grid rules that differ from Angular:
|
|
|
244
271
|
|
|
245
272
|
DV specifics worth knowing before Phase 4:
|
|
246
273
|
|
|
247
|
-
- Gauge and chart **attributes are kebab-case** (`minimum-value`, `maximum-value`,
|
|
248
|
-
|
|
249
|
-
-
|
|
250
|
-
appear in `get_api_reference` for `IgcCategoryChartComponent` — find them with `search_api`.
|
|
251
|
-
- Category charts show markers by default; if the design has none, set the documented
|
|
252
|
-
no-marker value.
|
|
274
|
+
- Gauge and chart **attributes are kebab-case** (`minimum-value`, `maximum-value`, `chart-type`), while collection-valued members such as `dataSource` are properties.
|
|
275
|
+
- `plotAreaBackground` and `areaFillOpacity` are inherited from parent classes and will not appear in `get_api_reference` for `IgcCategoryChartComponent` — find them with `search_api`.
|
|
276
|
+
- Category charts show markers by default; if the design has none, set the documented no-marker value.
|
|
253
277
|
- Give charts an explicit height (and their grid track a `min-height`) or they collapse.
|
|
254
278
|
|
|
255
279
|
---
|
|
@@ -268,8 +292,7 @@ registerIconFromText('home', '<svg …></svg>', 'material');
|
|
|
268
292
|
await registerIcon('search', 'https://example.com/icons/search.svg');
|
|
269
293
|
```
|
|
270
294
|
|
|
271
|
-
For the Material Icons Extended set used by the Indigo.Design UI Kit for Material — Figma
|
|
272
|
-
component descriptions carry the suffix **"material extended"**:
|
|
295
|
+
For the Material Icons Extended set used by the Indigo.Design UI Kit for Material — Figma component descriptions carry the suffix **"material extended"**:
|
|
273
296
|
|
|
274
297
|
```bash
|
|
275
298
|
npm install @igniteui/material-icons-extended
|
|
@@ -288,28 +311,52 @@ for (const icon of all) {
|
|
|
288
311
|
<igc-icon name="credit-cards"></igc-icon>
|
|
289
312
|
```
|
|
290
313
|
|
|
291
|
-
**Detection in Phase 1d:** scan `data-name` values and component descriptions for
|
|
292
|
-
"material extended". If found, add the package to the required list and get approval before
|
|
293
|
-
Phase 4. `setIconRef(name, collection, meta)` lets you alias one registered icon to another
|
|
294
|
-
name when the design reuses a glyph under a different label.
|
|
314
|
+
**Detection in Phase 1d:** scan `data-name` values and component descriptions for "material extended". If found, add the package to the required list and get approval before Phase 4. `setIconRef(name, collection, meta)` lets you alias one registered icon to another name when the design reuses a glyph under a different label.
|
|
295
315
|
|
|
296
316
|
Registered icons are never extracted as image assets — see `asset-extraction.md`.
|
|
297
317
|
|
|
318
|
+
### Icons from other kits
|
|
319
|
+
|
|
320
|
+
Third-party kits come with their own icon sets. Identify the set from the icon instance names (`lucide/chevron-down`, `ic_fluent_…`, `Icon / arrow-right`, `Symbols/…`), from the component descriptions, or from the kit fingerprint in `design-provenance.md`. Then register glyphs **from that set's SVG package**, so names, weights, and stroke widths match the design:
|
|
321
|
+
|
|
322
|
+
| Icon set | SVG source package (confirm name, version, and license before installing) |
|
|
323
|
+
| --- | --- |
|
|
324
|
+
| Material Symbols | `@material-symbols/svg-400` (pick the weight/fill the design uses) |
|
|
325
|
+
| Fluent System Icons | `@fluentui/svg-icons` |
|
|
326
|
+
| Lucide (shadcn/ui kits) | `lucide-static` |
|
|
327
|
+
| Bootstrap Icons | `bootstrap-icons` |
|
|
328
|
+
| Heroicons | `heroicons` |
|
|
329
|
+
| Phosphor | `@phosphor-icons/core` |
|
|
330
|
+
| Ant Design Icons | `@ant-design/icons-svg` |
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
import chevronDown from 'lucide-static/icons/chevron-down.svg?raw';
|
|
334
|
+
registerIconFromText('chevron-down', chevronDown, 'lucide');
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
```html
|
|
338
|
+
<igc-icon name="chevron-down" collection="lucide"></igc-icon>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Register only the glyphs the design uses: importing a whole set inflates the bundle. When the set is paid (for example Untitled UI Icons Pro) or unknown, or is not licensed for the web (SF Symbols), extract the used glyphs as SVG with Tier 1 Method B from `asset-extraction.md` and register those instead. Tell the user which icons came from a licensed set.
|
|
342
|
+
|
|
298
343
|
---
|
|
299
344
|
|
|
300
|
-
## Components
|
|
345
|
+
## Components With No Web Components Equivalent
|
|
301
346
|
|
|
302
|
-
Check this list before assuming a 1:1 mapping exists. When you hit one, substitute and
|
|
303
|
-
document the substitution in a code comment and in the Phase 2d plan.
|
|
347
|
+
Check this list before assuming a 1:1 mapping exists. When you hit one, substitute and document the substitution in a code comment and in the Phase 2d plan.
|
|
304
348
|
|
|
305
|
-
| Kit component
|
|
349
|
+
| Kit component / role | Status in Web Components | Substitute |
|
|
306
350
|
| ----------------- | ------------------------- | ------------------------------------------------------------------ |
|
|
307
351
|
| `_Bottom Navigation` | Not available | `igc-tabs`, or custom markup styled from the design |
|
|
308
352
|
| `_Time Picker` | Not available as a picker | `igc-date-time-input` with a time input format |
|
|
309
353
|
| `_Autocomplete` | Not available | `igc-combo` with filtering, or `igc-input` + `igc-dropdown` |
|
|
310
|
-
| `_Action Strip` |
|
|
354
|
+
| `_Action Strip` | Grid packages only (`igc-action-strip`) | Inside grids, use `igc-action-strip`; elsewhere, slotted icon buttons positioned over the row/card |
|
|
311
355
|
| `_Chips Area` | Not a component | A flex container around `igc-chip` elements |
|
|
312
356
|
| `_Query Builder` | Grid packages only | `query-builder` doc — confirm availability for the installed package |
|
|
357
|
+
| Sheet / side sheet (other kits) | Not available | `igc-nav-drawer` for navigation; `igc-dialog` or custom markup for content panels |
|
|
358
|
+
| Skeleton loader (other kits) | Not available | Custom markup with a CSS shimmer bound to palette variables |
|
|
359
|
+
| Standalone pagination (other kits) | Grid packages only (`igc-paginator`) | `igc-paginator` when paging a grid; otherwise custom markup with `igc-icon-button`s |
|
|
313
360
|
|
|
314
361
|
---
|
|
315
362
|
|
|
@@ -317,9 +364,7 @@ document the substitution in a code comment and in the Phase 2d plan.
|
|
|
317
364
|
|
|
318
365
|
When you encounter a Figma layer that is **not in this file**:
|
|
319
366
|
|
|
320
|
-
1.
|
|
321
|
-
2. Call `list_components({ framework: "webcomponents", filter: "<keyword>" })` and scan for
|
|
322
|
-
the closest match.
|
|
367
|
+
1. Normalize it with [design-provenance.md](design-provenance.md) (Tier B variant properties, or Tier C structure) and retry the Canonical Role Index. Otherwise, extract the visual pattern (is it a list? a form field? a card?).
|
|
368
|
+
2. Call `list_components({ framework: "webcomponents", filter: "<keyword>" })` and scan for the closest match.
|
|
323
369
|
3. Call `get_doc` (and `get_api_reference` when you need the full API) before writing code.
|
|
324
|
-
4. If no Ignite UI component matches after a genuine attempt, use plain semantic HTML and
|
|
325
|
-
document the reason in a code comment.
|
|
370
|
+
4. If no Ignite UI component matches after a genuine attempt, use plain semantic HTML and document the reason in a code comment.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Figma Design Exploration
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
|
|
4
|
+
>
|
|
5
|
+
> Use this file in Phase 1 to explore the Figma design and capture everything needed for implementation and validation. Read in full before the first Figma MCP call.
|
|
6
|
+
|
|
7
|
+
**Goal:** understand the full design structure and capture all data needed for implementation and validation before writing any code.
|
|
8
|
+
|
|
9
|
+
> **Rate-limit awareness:** Figma MCP limits depend on the **seat**, not only the plan (as published in September 2026; verify at https://developers.figma.com/docs/figma-mcp-server/rate-limits-access/): **View/Collab seats** get up to 6 calls/month (20 on Starter). **Dev/Full seats** get 200/day (Starter, Professional) or 600/day (Organization, Enterprise), with 10–20/min.
|
|
10
|
+
>
|
|
11
|
+
> Estimated call budget for a 5-artboard design: `figma_get_metadata` ×2 + `figma_get_screenshot` ×5 + `figma_get_design_context` ×5 + `figma_get_variable_defs` ×1 per target page + `figma_get_code_connect_map` ×5 + `figma_get_libraries` ×1 = **~19 calls**. Retries and sparse-response follow-ups add to this. **Compare the estimate with the user's remaining quota before starting.** On a View/Collab seat (6/month on Professional and above) even one artboard may not fit. The Starter View/Collab limit (20/month) covers a small design with no retries. When the estimate does not fit, say so and suggest a Dev/Full seat, or the REST API with a personal access token for metadata and assets. Strategies:
|
|
12
|
+
> 1. Call `figma_get_variable_defs` once per **target page**, not once per artboard. It returns the variables used inside the node you pass, so one page-level call covers every artboard on that page.
|
|
13
|
+
> 2. Prioritize `figma_get_design_context` over additional screenshots if quota is tight.
|
|
14
|
+
> 3. For large files, consider implementing one artboard per monthly budget cycle.
|
|
15
|
+
>
|
|
16
|
+
> Use `figma_get_metadata` first to discover structure cheaply, then call `figma_get_design_context` only for the artboards you will implement.
|
|
17
|
+
|
|
18
|
+
## Before the First Call: Determine the Figma MCP Variant
|
|
19
|
+
|
|
20
|
+
Figma has two official MCP servers (setup: `mcp-setup.md § 1. Figma MCP`). Establish which one is connected **before** Phase 1, because it decides how you address artboards.
|
|
21
|
+
|
|
22
|
+
| Variant | How to recognize it | How you drive it |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| **Remote** | Configured URL `https://mcp.figma.com/mcp`; the tools take `fileKey` | Pass `fileKey` and a `nodeId` (page or artboard) on **every** call. You can iterate artboards without the user. |
|
|
25
|
+
| **Desktop** | Configured URL `http://127.0.0.1:3845/mcp`; the tools take no `fileKey` | Works only on the file **open in the Figma desktop app**. Pass the `nodeId` from a frame link, or act on the current selection. |
|
|
26
|
+
|
|
27
|
+
Prefer the remote variant, and ask the user once for the file URL:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
https://figma.com/design/:fileKey/:fileName?node-id=1-2 → fileKey = ":fileKey", nodeId = "1:2"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
On the remote variant, treat both `fileKey` and `nodeId` as required, even if the schema marks `nodeId` optional. Calls without a node are not reliably supported.
|
|
34
|
+
|
|
35
|
+
On the desktop variant:
|
|
36
|
+
|
|
37
|
+
1. Make sure the user has the design file **open** in the desktop app.
|
|
38
|
+
2. When the user can share frame links (right-click → **Copy link to selection**), pass each frame's `nodeId` and **check that the response describes the requested frame** (same name and size as in the Phase 1a metadata).
|
|
39
|
+
3. If the response describes a different node, or the user cannot share links, fall back to selection: ask *"In Figma, please click the **[Artboard Name]** frame to select it, then confirm."*, wait for confirmation, and call the tool with no node. Never batch selection-based calls: each one depends on what the user has selected at that moment.
|
|
40
|
+
|
|
41
|
+
## 1a: Discover Pages and Artboards
|
|
42
|
+
|
|
43
|
+
The goal is to list the pages, then get each relevant page's artboard tree. The calls differ by variant:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
// Remote variant: fileKey and nodeId are both required
|
|
47
|
+
figma_get_metadata({ fileKey: "<fileKey>", nodeId: "<pageId>" })
|
|
48
|
+
|
|
49
|
+
// Desktop variant: a nodeId from a page or frame link, or no arguments to use the current selection
|
|
50
|
+
figma_get_metadata({ nodeId: "<pageId>" })
|
|
51
|
+
figma_get_metadata({})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Remote variant.** Choose the starting `nodeId` like this:
|
|
55
|
+
|
|
56
|
+
1. If the shared URL has a `node-id`, use it (replace `-` with `:`, e.g. `1-2` → `1:2`). URL format: `https://figma.com/design/:fileKey/:name?node-id=1-2`.
|
|
57
|
+
2. Otherwise, list the pages with the REST API when a token is available. It costs no MCP quota: `GET https://api.figma.com/v1/files/:fileKey?depth=1` returns `document.children[]` with each page's `id` and `name`.
|
|
58
|
+
3. Otherwise, ask the user to copy the link to the page or a frame (right-click → **Copy link to selection**) and take its `node-id`.
|
|
59
|
+
|
|
60
|
+
If that node is a single frame rather than a page, the response covers only that frame's subtree. To see its sibling artboards, get the page's `id` (step 2 or 3) and call `figma_get_metadata` again with it. Repeat for every page that looks relevant.
|
|
61
|
+
|
|
62
|
+
**Desktop variant.** The user must have the file open in the desktop app. With a link to the page or a frame, pass its `nodeId` and check the response. Otherwise ask the user to open the relevant page and select its top-level frames (or the page in the Layers panel), then call `figma_get_metadata({})`. Repeat for each relevant page, waiting for confirmation each time.
|
|
63
|
+
|
|
64
|
+
## 1b: Select Target Artboards
|
|
65
|
+
|
|
66
|
+
If there are multiple pages or artboards, show the user a list:
|
|
67
|
+
|
|
68
|
+
> "I found these artboards in your Figma file:
|
|
69
|
+
>
|
|
70
|
+
> - Page 1: [list artboard names + node IDs]
|
|
71
|
+
> - Page 2: [list artboard names + node IDs]
|
|
72
|
+
>
|
|
73
|
+
> Which artboards should I implement? (You can say 'all' or list specific names.)"
|
|
74
|
+
|
|
75
|
+
Wait for confirmation before proceeding.
|
|
76
|
+
|
|
77
|
+
## 1c: Capture Reference Screenshots
|
|
78
|
+
|
|
79
|
+
For each target artboard:
|
|
80
|
+
|
|
81
|
+
1. **Remote variant:** call `figma_get_screenshot({ fileKey: "<fileKey>", nodeId: "<artboardId>", maxDimension: 2048 })`. **Desktop variant:** call `figma_get_screenshot({ nodeId: "<artboardId>" })` and check that the image shows the requested artboard. If it does not, or you have no node ID, ask the user to select the artboard, wait for confirmation, then call `figma_get_screenshot({})`. Do **not** batch selection-based calls.
|
|
82
|
+
2. **Save each screenshot to disk** (e.g. `.figma-reference/<artboard-name>.png`). Phase 5 compares against these files. If the tool returns a URL, download it right away (it is short-lived). If it returns the image inline and you cannot write it to disk, export the node through the REST API instead (`GET /v1/images/:fileKey?ids=<nodeId>&format=png&scale=2`, see `asset-extraction.md`) when a token is available. Otherwise keep the image in context for Phase 5. Record `{ artboardName, nodeId, file, width, height }`.
|
|
83
|
+
|
|
84
|
+
After all artboards are captured, confirm the count:
|
|
85
|
+
|
|
86
|
+
> *"I have N reference screenshots: [list artboard names]. Proceeding to design context extraction."*
|
|
87
|
+
|
|
88
|
+
If any are missing, recapture them: by `nodeId` on the remote server, or by asking the user to select the artboard on the desktop server.
|
|
89
|
+
|
|
90
|
+
> Never skip this step. The screenshots are your ground truth for Phase 5 validation.
|
|
91
|
+
|
|
92
|
+
## 1d: Extract Design Context
|
|
93
|
+
|
|
94
|
+
> **Output format:** `figma_get_design_context` returns **React + Tailwind CSS reference code**, not structured Web Components metadata. Do **not** copy that code into the project. Read the JSX to extract the information below. Asset URLs in the output (localhost on the desktop server, https on the remote server) are short-lived previews — do **not** use them as final assets (see Phase 1h and `references/asset-extraction.md`).
|
|
95
|
+
|
|
96
|
+
For **each** target artboard:
|
|
97
|
+
|
|
98
|
+
1. On the remote variant, pass `fileKey` and `nodeId`. On the desktop variant, pass the `nodeId` and check the response, or fall back to selection (see [Before the First Call](#before-the-first-call-determine-the-figma-mcp-variant)).
|
|
99
|
+
2. Call:
|
|
100
|
+
```
|
|
101
|
+
figma_get_design_context({
|
|
102
|
+
fileKey: "<fileKey>", // remote variant only
|
|
103
|
+
nodeId: "<artboardId>", // both variants (desktop: check the response)
|
|
104
|
+
})
|
|
105
|
+
```
|
|
106
|
+
3. From the React+Tailwind output, extract:
|
|
107
|
+
|
|
108
|
+
- **Component layer names and props** — the `data-name` attributes and any component props or variant values in the JSX. Phase 1f classifies and normalizes them.
|
|
109
|
+
- **Layout structure** — `flex`, `grid`, `gap-*`, `p-*`, `w-*`, `h-*` Tailwind classes on container divs
|
|
110
|
+
- **Typography** — `font-['...']`, `text-[...]`, `font-weight` classes
|
|
111
|
+
- **Surface colors** — `bg-[#XXXXXX]` classes on container `<div>` elements that wrap major sections (these become plain `<div>` wrappers in the view, not Ignite UI components)
|
|
112
|
+
- **Border/roundness** — `rounded-[...]`, `border`, `border-[...]` classes on containers and cards
|
|
113
|
+
- **Input type variants** *(Tier A only)* — look for hidden zero-size nodes (`size-[0.5px]`) whose `data-name` contains a component type (e.g. `"Date Picker Type"`, `"Combo Input"`). These are the Indigo.Design kit's **variant indicator nodes**, and their name encodes which input variant (border/line/box) is active for that component. For other kits, read the field style from its variant property or visuals (outlined / filled / underlined, label floating or above). Web Components expose this as the boolean `outlined` attribute, not a three-way type (SKILL.md Phase 4, rule 12).
|
|
114
|
+
- **Chart series colors** — for any chart layer, note the fill colors on its series paths
|
|
115
|
+
- **Color census** — which colors appear on which kinds of element: high-emphasis button fills, page and card backgrounds, borders, primary and secondary text, error states. For Tier B/C designs, Phase 3 seeds the palette from this (see `design-token-bridge.md § B2`), not from variable names.
|
|
116
|
+
- **Measured control heights** — button, input, and list-row heights. Phase 3 uses them to pick `--ig-size`.
|
|
117
|
+
- **Action controls** — list every button, icon button, and toolbar action visible in the artboard; this is your authoritative inventory — do not add actions not present in the design
|
|
118
|
+
- **Provenance signals** — library/source file names (e.g. `Indigo.Design UI Kit for Material`, `Material 3 Design Kit`, `shadcn/ui`), naming conventions (`_Button/…` vs `Button` with `Variant=…`), and un-componentized frames. Phase 1f turns them into a tier for each instance.
|
|
119
|
+
|
|
120
|
+
4. Record all surface containers for **Table B — Layout Surfaces** (Phase 1g).
|
|
121
|
+
|
|
122
|
+
## 1e: Extract Design Tokens
|
|
123
|
+
|
|
124
|
+
> `figma_get_variable_defs` returns the variables and styles **used inside the node you pass** (or the current selection), not every variable in the file. Call it **once per target page**, with the page's node ID. That covers every target artboard on the page without spending a call per artboard. If the targets span two pages, call it twice.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
// Remote variant
|
|
128
|
+
figma_get_variable_defs({ fileKey: "<fileKey>", nodeId: "<pageId>" })
|
|
129
|
+
|
|
130
|
+
// Desktop variant: the page's nodeId (check the response), or select the page and pass nothing
|
|
131
|
+
figma_get_variable_defs({ nodeId: "<pageId>" })
|
|
132
|
+
figma_get_variable_defs({})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The response contains a map of variable names to values, e.g.:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
"color/primary/500": "#6200EE"
|
|
139
|
+
"color/surface": "#FFFFFF"
|
|
140
|
+
"typography/body/font-family": "Roboto"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Use `references/design-token-bridge.md` to map color and typography variables to Ignite UI theming inputs in Phase 3. Third-party kits name variables differently (`md.sys.color.primary`, `Colors/Brand/600`, `colorBrandBackground`, `primary-foreground`, …). Record them as-is. Phase 3 matches them to roles by **usage** (the Phase 1d color census), not by name. Files without variables are normal for Tier C designs. The color census then provides every seed. Do **not** attempt to map Figma spacing or sizing values — see `references/design-token-bridge.md § Spacing, Sizing, and Roundness` for why.
|
|
144
|
+
|
|
145
|
+
## 1f: Classify Provenance and Normalize Components
|
|
146
|
+
|
|
147
|
+
Read [design-provenance.md](design-provenance.md) in full.
|
|
148
|
+
|
|
149
|
+
1. Call `figma_get_libraries` **once per file**, if the connected server exposes it. The subscribed library names (`Indigo.Design UI Kit for Material`, `Material 3 Design Kit`, `shadcn/ui`, an in-house library) are the fastest provenance signal.
|
|
150
|
+
2. Check for Code Connect mappings:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
figma_get_code_connect_map({ fileKey: "<fileKey>", nodeId: "<artboardId>" }) // remote variant
|
|
154
|
+
figma_get_code_connect_map({ nodeId: "<artboardId>" }) // desktop variant
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Mappings are strong evidence of a component's **role and props**. They may point at **another library** (e.g. a shadcn kit connected to `@/components/ui/button`). Never copy their imports or tags: the target is always Ignite UI for Web Components.
|
|
158
|
+
|
|
159
|
+
3. Classify **every** component-like layer as **Tier A** (Indigo.Design kit), **Tier B** (any other component library), or **Tier C** (un-componentized). Classify per instance, not per file.
|
|
160
|
+
4. Normalize Tier B instances to a canonical role + emphasis/style + measured height, using their variant properties. When names are ambiguous and a file key and token are available, read exact `componentProperties` from the REST API (`design-provenance.md § Step 1`).
|
|
161
|
+
5. Infer Tier C roles from structure and visuals. Mark them **low confidence**.
|
|
162
|
+
6. Record the dominant tier. It selects the Phase 3 theming path (A or B).
|
|
163
|
+
|
|
164
|
+
## 1g: Build the Decomposition Table
|
|
165
|
+
|
|
166
|
+
Before writing any code, produce **two tables** for **each artboard**.
|
|
167
|
+
|
|
168
|
+
### Table A — Ignite UI Components
|
|
169
|
+
|
|
170
|
+
| Figma Layer Name | Tier | Kit / Source | Canonical Role + Props | Ignite UI Tag | Package | Confidence | Token Work | Suspected Anatomy Deltas | Data Type |
|
|
171
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
172
|
+
| _e.g._ `_NavBar` | A | Indigo.Design (Material) | `app-bar` | `<igc-navbar>` | `igniteui-webcomponents` | high | — | — | n/a |
|
|
173
|
+
| _e.g._ `_Grid/Default` | A | Indigo.Design (Material) | `data-table` | `<igc-grid>` | `igniteui-webcomponents-grids` | high | — | — | Tabular records |
|
|
174
|
+
| _e.g._ `Button` (`Variant=outline, Size=sm`) | B | shadcn/ui | `button` · medium · 32px | `<igc-button variant="outlined">` | `igniteui-webcomponents` | high | radius, casing, size | — | n/a |
|
|
175
|
+
| _e.g._ `Text field` (`Style=Filled`) | B | M3 Design Kit | `text-field` · filled · label-floating · 56px | `<igc-input>` | `igniteui-webcomponents` | high | height, fill color | — | n/a |
|
|
176
|
+
| _e.g._ `Segmented button` | B | M3 Design Kit | `toggle-group` · 40px | `<igc-button-group>` | `igniteui-webcomponents` | high | radius, colors | check icon on the selected segment | n/a |
|
|
177
|
+
| _e.g._ `Frame 427` | C | — | `tag` · pill · 24px | `<igc-badge>` | `igniteui-webcomponents` | low | radius, colors | — (confirm the role) | n/a |
|
|
178
|
+
|
|
179
|
+
The **Package** column is not optional in Web Components: general UI (`igniteui-webcomponents`, MIT), grids, charts, and dock manager ship as separate packages, and the commercial ones come in trial and `@infragistics` licensed variants.
|
|
180
|
+
|
|
181
|
+
- **Token Work** lists what Phase 3 must set: colors, radius, borders, casing, size. These are implementation work. They are **never** anatomy deltas and never become Accepted.
|
|
182
|
+
- **Suspected Anatomy Deltas** lists only structural differences that tokens, documented `::part(...)` selectors, and slotted content cannot close. They are suspicions at this point: you only know what Ignite UI renders after reading its doc in Phase 2b. Confirm them in the Phase 2d ledger.
|
|
183
|
+
|
|
184
|
+
Fallback to plain semantic HTML only when no Ignite UI component can match the layer after consulting `references/figma-component-map.md`. Document the reason inline.
|
|
185
|
+
|
|
186
|
+
### Table B — Layout Surfaces
|
|
187
|
+
|
|
188
|
+
Record every **non-`igc-*` container** that carries visual properties (background color, border, padding, shadow). These are plain `<div>` wrappers in the view — not Ignite UI components — but they are critical to visual fidelity. Populate this table from the `bg-[...]`, `rounded-[...]`, `border`, `p-[...]`, and `shadow-[...]` Tailwind classes observed on container divs in the Phase 1d design context output.
|
|
189
|
+
|
|
190
|
+
| Figma Frame / Container Name | Background | Border-Radius | Padding | Border | Shadow | Encloses (child sections) |
|
|
191
|
+
| ---------------------------- | ---------- | ------------- | ------- | ------ | ------ | ------------------------- |
|
|
192
|
+
| _e.g._ `Budget Categories` | `#222222` | `4px` | `24px` | none | none | Categories list, Add button |
|
|
193
|
+
| _e.g._ `Friend Card` | `#222222` | `8px` | `24px 16px` | `1px solid #333` | none | Avatar, name, phone, email, buttons |
|
|
194
|
+
|
|
195
|
+
> **Rule:** if a section appears on a surface in Figma (i.e. its container has a non-transparent background), it **must** have that background in the implementation. If a section floats on the page background (transparent), do **not** add a surface wrapper. Never infer surface structure from another page — always derive it from the design context for the specific artboard being implemented.
|
|
196
|
+
|
|
197
|
+
Present both tables to the user for review before proceeding. List **low-confidence** mappings first and ask the user to confirm or correct them. A wrong role is the most expensive mistake to fix after Phase 4.
|
|
198
|
+
|
|
199
|
+
## 1h: Extract Image Assets
|
|
200
|
+
|
|
201
|
+
Read [references/asset-extraction.md](asset-extraction.md) in full before running any extraction.
|
|
202
|
+
|
|
203
|
+
**Zero-placeholder policy:** every image visible in the Figma design must be extracted and committed to the project's assets directory before Phase 4. Gradient placeholders are not acceptable.
|
|
204
|
+
|
|
205
|
+
**Step 0 — File key and token.** Reuse the file key from Phase 1 (the remote server always has one). On the desktop server without one, ask the user for the file URL (Figma desktop: right-click the file tab → **Copy link**). Tier 1 also needs a REST API token (`mcp-setup.md § Personal access token`). Without both you fall back to Tier 2 or 3.
|
|
206
|
+
|
|
207
|
+
From the decomposition tables, identify every layer that is a **static image asset** (photo, background, logo, custom icon, illustration) rather than an Ignite UI component. Do **not** extract component instances that Table A maps to a component, whatever kit they come from, or icons available from a registerable icon package (`figma-component-map.md § Icons`, which also covers third-party kit icon sets).
|
|
208
|
+
|
|
209
|
+
**Use the four-tier decision tree from `asset-extraction.md`** (these asset tiers 1–4 are unrelated to the provenance Tiers A–C):
|
|
210
|
+
|
|
211
|
+
| Tier | Method | When to use |
|
|
212
|
+
| ---- | ------ | ----------- |
|
|
213
|
+
| **1** | REST API `/v1/files/:key/images` (Method A) or `/v1/images/:key` (Method B) | `FILE_KEY` **and** `FIGMA_TOKEN` available — always the highest fidelity |
|
|
214
|
+
| **2** | Download the asset URLs from `figma_get_design_context` (localhost on desktop, https on remote), or `figma_download_assets` on remote | No REST access; the design context returned asset URLs |
|
|
215
|
+
| **3** | `figma_get_screenshot` per node (`nodeId`, or the selection on desktop) | No REST access and no asset URL for this node |
|
|
216
|
+
| **4** | CSS gradient/color placeholder with `// TODO` comment | Only for confirmed pure-color fills — never as a shortcut |
|
|
217
|
+
|
|
218
|
+
Save assets under the project's static directory — `src/assets/images/` and `src/assets/icons/` in a CLI-scaffolded Vite project (copied to the build output by `vite-plugin-static-copy`); `public/` in a stock Vite app. Match whatever the project already uses.
|
|
219
|
+
|
|
220
|
+
Build a concise asset manifest (see `asset-extraction.md § Build an Asset Manifest`) so the implementation phase uses consistent paths.
|
|
221
|
+
|
|
222
|
+
If you used Tier 2 or Tier 3 for any asset, tell the user which ones need re-export once the file key and a REST API token are available.
|