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.
Files changed (97) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/components/checkbox/checkbox-base.d.ts +2 -0
  3. package/components/checkbox/checkbox-base.js +4 -0
  4. package/components/checkbox/checkbox-base.js.map +1 -1
  5. package/components/checkbox/checkbox.js +3 -11
  6. package/components/checkbox/checkbox.js.map +1 -1
  7. package/components/checkbox/switch.js +1 -8
  8. package/components/checkbox/switch.js.map +1 -1
  9. package/components/color-picker/color-picker.js +3 -3
  10. package/components/color-picker/color-picker.js.map +1 -1
  11. package/components/combo/combo.d.ts +6 -4
  12. package/components/combo/combo.js +13 -24
  13. package/components/combo/combo.js.map +1 -1
  14. package/components/date-picker/date-picker.base.d.ts +3 -3
  15. package/components/date-picker/date-picker.base.js +2 -2
  16. package/components/date-picker/date-picker.base.js.map +1 -1
  17. package/components/date-picker/date-picker.d.ts +1 -1
  18. package/components/date-range-picker/date-range-picker.d.ts +1 -1
  19. package/components/date-time-input/date-time-input.base.d.ts +4 -4
  20. package/components/date-time-input/date-time-input.base.js +3 -5
  21. package/components/date-time-input/date-time-input.base.js.map +1 -1
  22. package/components/file-input/file-input.d.ts +5 -0
  23. package/components/file-input/file-input.js +4 -0
  24. package/components/file-input/file-input.js.map +1 -1
  25. package/components/input/input-base.d.ts +2 -2
  26. package/components/input/input-base.js +3 -5
  27. package/components/input/input-base.js.map +1 -1
  28. package/components/input/input.d.ts +1 -1
  29. package/components/radio/radio.d.ts +2 -0
  30. package/components/radio/radio.js +7 -11
  31. package/components/radio/radio.js.map +1 -1
  32. package/components/rating/rating.d.ts +3 -0
  33. package/components/rating/rating.js +17 -18
  34. package/components/rating/rating.js.map +1 -1
  35. package/components/select/select.js +1 -1
  36. package/components/select/select.js.map +1 -1
  37. package/components/slider/range-slider.d.ts +0 -1
  38. package/components/slider/range-slider.js +6 -11
  39. package/components/slider/range-slider.js.map +1 -1
  40. package/components/slider/slider-base.d.ts +4 -1
  41. package/components/slider/slider-base.js +20 -18
  42. package/components/slider/slider-base.js.map +1 -1
  43. package/components/slider/slider.d.ts +2 -0
  44. package/components/slider/slider.js +5 -1
  45. package/components/slider/slider.js.map +1 -1
  46. package/components/textarea/textarea.d.ts +1 -4
  47. package/components/textarea/textarea.js +3 -5
  48. package/components/textarea/textarea.js.map +1 -1
  49. package/components/validation-container/validation-container.js +2 -1
  50. package/components/validation-container/validation-container.js.map +1 -1
  51. package/components/virtualization/engine.d.ts +35 -4
  52. package/components/virtualization/engine.js +126 -61
  53. package/components/virtualization/engine.js.map +1 -1
  54. package/components/virtualization/recycle.d.ts +13 -0
  55. package/components/virtualization/recycle.js +152 -0
  56. package/components/virtualization/recycle.js.map +1 -0
  57. package/components/virtualization/virtualization.d.ts +32 -11
  58. package/components/virtualization/virtualization.js +14 -11
  59. package/components/virtualization/virtualization.js.map +1 -1
  60. package/custom-elements.json +2382 -79
  61. package/igniteui-webcomponents.html-data.json +1 -1
  62. package/index.d.ts +1 -1
  63. package/index.js.map +1 -1
  64. package/internals/controllers/aria-projection.d.ts +61 -23
  65. package/internals/controllers/aria-projection.js +77 -26
  66. package/internals/controllers/aria-projection.js.map +1 -1
  67. package/internals/mixins/forms/associated.js +34 -0
  68. package/internals/mixins/forms/associated.js.map +1 -1
  69. package/internals/mixins/forms/types.d.ts +5 -0
  70. package/internals/mixins/forms/types.js.map +1 -1
  71. package/internals/templates/toggle-shell.d.ts +15 -14
  72. package/internals/templates/toggle-shell.js +12 -8
  73. package/internals/templates/toggle-shell.js.map +1 -1
  74. package/internals/utils/dom.d.ts +2 -2
  75. package/internals/utils/dom.js +2 -2
  76. package/internals/utils/dom.js.map +1 -1
  77. package/package.json +1 -1
  78. package/skills/README.md +2 -4
  79. package/skills/igniteui-wc-choose-components/SKILL.md +2 -1
  80. package/skills/igniteui-wc-customize-component-theme/SKILL.md +2 -1
  81. package/skills/igniteui-wc-figma-to-app/SKILL.md +133 -712
  82. package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +42 -62
  83. package/skills/igniteui-wc-figma-to-app/references/design-provenance.md +199 -0
  84. package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +189 -107
  85. package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +129 -84
  86. package/skills/igniteui-wc-figma-to-app/references/figma-exploration.md +222 -0
  87. package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +81 -127
  88. package/skills/igniteui-wc-figma-to-app/references/project-setup.md +105 -0
  89. package/skills/igniteui-wc-figma-to-app/references/theme-generation.md +180 -0
  90. package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +74 -80
  91. package/skills/igniteui-wc-generate-from-image-design/SKILL.md +2 -1
  92. package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +3 -3
  93. package/skills/igniteui-wc-grids/SKILL.md +133 -0
  94. package/skills/igniteui-wc-integrate-with-framework/SKILL.md +2 -1
  95. package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +2 -1
  96. package/skills/igniteui-wc-optimize-bundle-size/SKILL.md +2 -1
  97. package/web-types.json +1 -1
@@ -2,19 +2,32 @@
2
2
 
3
3
  > **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
4
4
  >
5
- > Use this file in Phase 3 to translate Figma variable values (from
6
- > `figma_get_variable_defs`) into Ignite UI Theming MCP inputs. Read it in full before
7
- > calling any theming tool. For the theming system itself — palette semantics, token
8
- > rules, compound components — the source of truth is
9
- > [`igniteui-wc-customize-component-theme`](../../igniteui-wc-customize-component-theme/SKILL.md).
5
+ > Use this file in Phase 3 to translate Figma variable values (from `figma_get_variable_defs`) into Ignite UI Theming MCP inputs. Read it in full before calling any theming tool. For the theming system itself — palette semantics, token rules, compound components — the source of truth is [`igniteui-wc-customize-component-theme`](../../igniteui-wc-customize-component-theme/SKILL.md).
6
+
7
+ > **Tool names:** like SKILL.md, this file refers to theming tools by their base name. Match by the tool's base name (`create_palette`, `create_theme`, `create_component_theme`, …) on the connected `igniteui-theming` server; your client may show them as `mcp__igniteui-theming__create_palette` or similar. The `licensed` parameter is for Angular only — do not pass it for Web Components.
10
8
 
11
9
  ---
12
10
 
13
- ## How the Indigo.Design UI Kits Organize Variables
11
+ ## Two Paths
12
+
13
+ Which path you take depends on the provenance tiers recorded in Phase 1f ([design-provenance.md](design-provenance.md)):
14
+
15
+ | Path | When | What sets the look |
16
+ | --- | --- | --- |
17
+ | **A — Indigo.Design UI Kit** | Most components are Tier A | The kit variant **is** an Ignite UI design system. Palette and font come from the kit variables. Component proportions are already calibrated, so leave size, spacing, and roundness at their defaults. |
18
+ | **B — Any other kit, or no kit** | Most components are Tier B or C | The design system is only the **closest baseline**. Fidelity comes from palette seeds inferred from usage, type-style overrides, per-component radius tokens, and a measured `--ig-size`. See [Path B](#path-b--any-other-kit-or-no-kit). |
19
+
20
+ **Mixed files.** Count only the Table A rows that map to an Ignite UI component. Decorative Tier C frames that stay plain HTML do not count. The larger group chooses the path for the global theme; on a tie, ask the user. Then style the other group through component themes scoped to **those instances only**:
21
+
22
+ - Put a class on the minority instances (for example `class="kit-b"`), and pass it as `selector` to `create_component_theme`. Do not scope by the tag alone: a Tier A and a Tier B button are both `igc-button`, so that would restyle both.
23
+ - Tier B/C instances in a Path A app get the Path B token work (B2, B5–B8) in those scoped component themes.
24
+ - Tier A instances in a Path B app get their **kit's** design system: pass that kit's `designSystem` to their scoped component themes. Do not give them Path B treatment.
25
+
26
+ ---
14
27
 
15
- The **Indigo.Design UI Kits** are Figma component libraries published by Infragistics.
16
- Designers build their own app frames in Figma using these kits as shared libraries. The
17
- kits come in four design-system variants, each with light and dark themes:
28
+ ## Path A — How the Indigo.Design UI Kits Organize Variables
29
+
30
+ The **Indigo.Design UI Kits** are Figma component libraries published by Infragistics. Designers build their own app frames in Figma using these kits as shared libraries. The kits come in four design-system variants, each with light and dark themes:
18
31
 
19
32
  | Kit variant | Figma library name pattern | `designSystem` value |
20
33
  | ---------------------- | ----------------------------------------------- | -------------------- |
@@ -23,23 +36,18 @@ kits come in four design-system variants, each with light and dark themes:
23
36
  | Bootstrap | `Indigo.Design UI Kit for Bootstrap` | `"bootstrap"` |
24
37
  | Indigo | `Indigo.Design UI Kit` / `Indigo.Design System` | `"indigo"` |
25
38
 
26
- **Identifying the active kit variant** is the first task in Phase 3 because it sets the
27
- design system for the whole app. Use these signals in **strict precedence order** — stop
28
- at the first clear match:
39
+ **Identifying the active kit variant** is the first task in Phase 3 because it sets the design system for the whole app. Use these signals in **strict precedence order** — stop at the first clear match:
29
40
 
30
- 1. **Library source name** — `figma_get_design_context` / `figma_get_metadata` may
31
- reference the source library file name.
32
- 2. **Variable collection name** — `figma_get_variable_defs` may return collection names
33
- that include the design system (e.g. `Material/color/primary`).
34
- 3. **Elevation variable structure** — inspect `Elevations/*`:
41
+ 1. **Explicit user request** — "make it Material", "use Fluent", etc.
42
+ 2. **Library source name** — `figma_get_design_context` / `figma_get_metadata` may reference the source library file name.
43
+ 3. **Variable collection name** — `figma_get_variable_defs` may return collection names that include the design system (e.g. `Material/color/primary`).
44
+ 4. **Elevation variable structure** — inspect `Elevations/*`:
35
45
  - **Three-layer DROP_SHADOW** (umbra + penumbra + ambient, `Elevations/Shadow 01-03`) → **Material**
36
46
  - **Single-layer DROP_SHADOW** → Indigo, Fluent, or Bootstrap
37
- 4. **Palette shade naming** — `primary/500`, `primary/100`–`primary/900` follows the
38
- Material 100–900 convention → likely **Material**.
39
- 5. **Visual heuristics** — see the [Design System Detection table](#design-system-detection-from-figma).
47
+ 5. **Palette shade naming** — `primary/500`, `primary/100`–`primary/900` follows the Material 100–900 convention → likely **Material**.
48
+ 6. **Visual heuristics** — see the [Design System Detection table](#design-system-detection-from-figma).
40
49
 
41
- > **Never use font name as a primary signal.** "Titillium Web" is the default body font in
42
- > the Indigo.Design UI Kit for Material — it is not exclusive to any kit variant.
50
+ > **Never use font name as a primary signal.** "Titillium Web" is the default body font in the Indigo.Design UI Kit for Material — it is not exclusive to any kit variant.
43
51
 
44
52
  All four kit variants share the same variable naming conventions:
45
53
 
@@ -53,8 +61,7 @@ Component collection → per-component overrides (e.g. button/background = ali
53
61
 
54
62
  ## The Web Components Theming Contract
55
63
 
56
- Before mapping any value, understand what actually drives a Web Components theme. This is
57
- the single biggest difference from the Angular flow.
64
+ Before mapping any value, understand what actually drives a Web Components theme. This is the single biggest difference from the Angular flow.
58
65
 
59
66
  | Layer | What it is | How it gets set |
60
67
  | --- | --- | --- |
@@ -65,19 +72,132 @@ the single biggest difference from the Angular flow.
65
72
  | **Layout** | `--ig-size`, `--ig-spacing`, `--ig-radius-factor` | `set_size` / `set_spacing` / `set_roundness` |
66
73
  | **Per component** | component design tokens | `get_component_design_tokens` → `create_component_theme` |
67
74
 
68
- Components read the design system **at runtime from CSS variables** and fall back to
69
- `bootstrap` / `light` when they are absent. A correct palette with a missing
70
- `--ig-theme` gives you the right colors on the wrong component anatomy.
75
+ Components read the design system **at runtime from CSS variables** and fall back to `bootstrap` / `light` when they are absent. A correct palette with a missing `--ig-theme` gives you the right colors on the wrong component anatomy.
76
+
77
+ **Every theming tool that generates code (`create_*`, `set_size`, `set_spacing`, `set_roundness`) accepts `output: "css" | "sass"`, defaulting to CSS.** Choose once in Phase 3 based on whether the project has Sass, and stay consistent. The Web Components Sass API is `@use 'igniteui-theming'` with individual `palette()`, `typography()`, `elevations()`, and `spacing()` mixins — the Angular `core()` / `theme()` mixins do not exist here.
78
+
79
+ ---
80
+
81
+ ## Path B — Any Other Kit (or No Kit)
82
+
83
+ A third-party kit was not built for Ignite UI. Its variable names do not follow Ignite UI conventions, and its component proportions, radii, and type ramp differ from every Ignite UI design system. Treat theming as **fitting a baseline**: choose the closest design system, then override what the design measurably does differently.
84
+
85
+ ### B1 — Choose the Baseline Design System by Anatomy
86
+
87
+ Use the first rule that gives a clear answer:
88
+
89
+ 1. **Explicit user request.**
90
+ 2. **Kit with a direct counterpart:** Material 3 / Material kits → `material`; Fluent 2 → `fluent`; Bootstrap kits → `bootstrap`.
91
+ 3. **Otherwise, score the anatomy.** These are properties of the Ignite UI themes that you cannot fully override with tokens, so they decide the baseline:
92
+
93
+ | Observable in the design | `material` | `fluent` | `bootstrap` | `indigo` |
94
+ | --- | --- | --- | --- | --- |
95
+ | Text-field label | **Floating inside the field** (notched outline) | Above the field | Above the field | Above the field |
96
+ | Default button height | 36px | 32px | 38px | 28px |
97
+ | Default input height | 48px | 40px | 38px | 28px |
98
+ | Button label casing in the type preset | UPPERCASE | Capitalize | none | UPPERCASE |
99
+
100
+ The label position is the strongest signal. A design with labels above its fields (shadcn, Untitled UI, Ant, Tailwind-style kits, most in-house kits) should **not** use `material`, however "Material-like" its colors look. Among the label-above systems, choose the one whose default heights are closest to the measured controls. When heights are close to 36–40px buttons and 36–44px inputs, `bootstrap` or `fluent` is usually the better starting point. Casing is overridable (B4), so it only breaks ties.
101
+
102
+ These numbers come from the `igniteui-theming` component schemas and type presets at the default `--ig-size`. If a result looks off, confirm it with `get_component_design_tokens`.
103
+
104
+ ### B2 — Infer Color Roles From Usage, Not Names
105
+
106
+ Third-party variable names do not tell you which Ignite UI palette slot they fill. Kits call the brand color `primary`, `brand/600`, `colorBrandBackground`, `md.sys.color.primary`, or nothing at all. Build a **color census** from the design context of the target artboards, and take each seed from where it is **used**:
107
+
108
+ | Ignite UI palette input | Take the color from |
109
+ | --- | --- |
110
+ | `primary` | The fill of high-emphasis buttons. If there are none, the active tab indicator, checked checkbox/switch, or focused-field accent. |
111
+ | `secondary` | A second accent actually used on components: tonal/secondary buttons, selected chips, FAB. If none exists, reuse `primary`. Do not invent one. |
112
+ | `surface` | The page / artboard background. Additional depths (cards, sidebars) → B6. |
113
+ | `gray` | Omit at first. Pass it only if the generated grays visibly diverge from the design's borders and secondary text. |
114
+ | `error` / `warn` / `success` / `info` | Destructive buttons, error-state fields, alert and status colors |
115
+
116
+ In the **CSS path** these all go to `create_palette`, which takes `gray` and the status colors. In the **Sass path**, `create_theme` takes only `primaryColor`, `secondaryColor`, and `surfaceColor`: to set `gray` or a status color, also call `create_palette` (or `create_custom_palette`) and place its output **after** the theme output, so its `:root` palette variables override the generated ones.
117
+
118
+ **Seed-shade rule.** Ignite UI components paint their main fills with the **500** shade of a palette color. Pass the color that is *visible on the component* as the seed, whatever the kit calls it. Examples: Untitled UI buttons use `Brand/600`, Tailwind-style kits use `blue-600`, and Material 3 uses the tone-40 `primary`. Passing the kit's own `…/500` variable when the buttons are painted with `…/600` makes every component one step too light.
119
+
120
+ **Material baseline trap.** In the Ignite UI `material` schema, **control accents use the `secondary` palette**: contained-button fill, flat-button text, checkbox fill, and switch thumb. The navbar and tab indicators use `primary`. `fluent`, `bootstrap`, and `indigo` use `primary` for those controls. Most third-party kits, Material 3 included, paint buttons and checkboxes with their primary color. On a `material` baseline, therefore, seed `secondary` with the brand color seen on the buttons as well. Seed `primary` with the color used on app bars and tab indicators, which is often the same color. Otherwise every button comes out in an unrelated accent. Check the resolved roles with `read_resource({ uri: "theming://guidance/colors/roles" })`.
121
+
122
+ When the variables are available, resolve their alias chains and use them to *name* and *confirm* what the census found. When the variables and the census disagree, the census wins: it describes what the designer actually drew.
123
+
124
+ **Full ramps.** If the design visibly uses several shades of one color (hover, pressed, tinted backgrounds), use `create_custom_palette` with `mode: "explicit"` for that color. The explicit mode needs **all 14 shades** (`50`–`900` plus `A100`, `A200`, `A400`, `A700`). Align the kit's stops by lightness, not by label (Tailwind and Untitled UI have `25` and `950` stops that Ignite UI does not). Derive the accent shades from the neighboring stops. Use `mode: "shades"` for every color whose ramp the design does not show.
125
+
126
+ **Dark variant.** Decide it from the page background, as in [Light vs Dark Mode Detection](#light-vs-dark-mode-detection). Material 3 tonal surfaces (`surface-container-low` … `-highest`) are multiple surface depths. Handle them with B6, not with a lighter `surface` seed.
71
127
 
72
- **Every theming tool accepts `output: "css" | "sass"`, defaulting to CSS.** Choose once in
73
- Phase 3 based on whether the project has Sass, and stay consistent. The Web Components Sass
74
- API is `@use 'igniteui-theming'` with individual `palette()`, `typography()`, `elevations()`,
75
- and `spacing()` mixins — the Angular `core()` / `theme()` mixins do not exist here.
128
+ ### B3 — Typography
129
+
130
+ 1. **Family:** take it from the text styles actually used (the design context `font-['…']` classes). Load it in the app. Kits often use Inter, Geist, Roboto Flex, or SF Pro. SF Pro is licensed for Apple platforms only, so substitute a web font and say so.
131
+ 2. **Scale:** map the kit's ramp to Ignite UI type styles **by role and size ranking**, not by name. Override only the styles that differ (see [B4](#b4--button-casing-and-other-type-driven-anatomy) for how):
132
+
133
+ | Kit role (examples) | Ignite UI type style |
134
+ | --- | --- |
135
+ | Display / Hero / Heading XL | `h1`–`h3` (largest three) |
136
+ | Headline / Heading L–M / Title L | `h4`–`h6` |
137
+ | Title M–S / Subtitle / Label L (emphasized body) | `subtitle-1`, `subtitle-2` |
138
+ | Body L / Body M / Text md | `body-1`, `body-2` |
139
+ | Label M on buttons | `button` |
140
+ | Body S / Caption / Text xs | `caption` |
141
+ | Label S / Overline / Eyebrow | `overline` |
142
+
143
+ ### B4 — Button Casing and Other Type-Driven Anatomy
144
+
145
+ The `material` and `indigo` type presets set `button` to `text-transform: uppercase`. `fluent` uses `capitalize`. Nearly every current third-party kit, Material 3 included, uses sentence case. Unless the design shows uppercase labels, set the button's text transform to `none`, together with its measured size and weight.
146
+
147
+ **How to override type styles.** The theme's typography writes every property of every type style to a CSS variable on `:root`, named `--ig-<style>-<property>`, and the components read those variables inside their shadow roots. Add a `:root` block **after** the theme import or theme output that sets only the values that differ:
148
+
149
+ ```css
150
+ /* After the theme import in styles.css */
151
+ :root {
152
+ --ig-button-text-transform: none;
153
+ --ig-button-font-size: 0.875rem;
154
+ --ig-button-font-weight: 500;
155
+ --ig-h1-font-size: 2.25rem;
156
+ --ig-body-1-line-height: 1.5rem;
157
+ }
158
+ ```
159
+
160
+ Property names are `font-family`, `font-size`, `font-weight`, `font-style`, `line-height`, `letter-spacing`, `text-transform`, `margin-top`, and `margin-bottom`.
161
+
162
+ Ignite UI components read these variables inside their own shadow roots, so the overrides reach them. Inside a Lit view's shadow root, document CSS such as `.ig-typography h1` does not reach native headings. Apply the variables in the view's `static styles` yourself, for example `h1 { font-size: var(--ig-h1-font-size); font-weight: var(--ig-h1-font-weight); line-height: var(--ig-h1-line-height); }`.
163
+
164
+ > **Do not rely on `customScale`.** `create_typography` accepts a `customScale` argument, but `igniteui-theming` 29.0.0 drops it from the generated code (CSS and Sass) without a warning. Use the variable overrides above, and measure the result in Phase 5.
165
+
166
+ ### B5 — Radius: Per-Component Tokens, Not a Global Factor
167
+
168
+ `set_roundness` sets a single `radiusFactor` (0–1) that interpolates each component between **its own** minimum and maximum radius, and those ranges differ. For example, the button range is 0–20px, the card 0–24px, the dialog 0–36px, and the chip 0–16px. One factor therefore cannot reproduce a kit's radius language, such as "everything is 8px" or "pill buttons, 12px cards".
169
+
170
+ Instead, set the radius tokens that `get_component_design_tokens` returns for each component (`border-radius`, or variants such as `box-border-radius` / `border-border-radius` on `input-group`) to the **measured px value**, in the same `create_component_theme` call as the component's colors. A pill shape is half the control height, or a large value such as `9999px`.
171
+
172
+ ### B6 — Surfaces and Elevation
173
+
174
+ - **Depths:** kits built on borders instead of shadows (shadcn, Untitled UI, Fluent 2) use 2–4 surface tones. Express them with `create_custom_palette` surface shades or semantic variables (`--surface-1`, `--surface-2`), as in [Multiple Surface Depths](#multiple-surface-depths).
175
+ - **Shadows:** `create_elevations` only has the `material` and `indigo` presets. When the design is flat or border-first, keep the global elevations and set the components' shadow/elevation tokens to `none` or the measured `box-shadow` value. When the design uses shadows, pick the closer preset and verify the depth of cards, menus, and dialogs in Phase 5.
176
+ - **Borders:** a 1px neutral border on cards, inputs, and menus is part of the anatomy of most modern kits. Set it through the components' border tokens, bound to a gray or surface palette variable.
177
+
178
+ ### B7 — Density
179
+
180
+ Choose `--ig-size` **per component family**. Compare the measured height of each family (buttons, inputs, list rows, …) with that family's size steps in the baseline. Each component has its **own default step**. For example, on `material` the button default is large (36px) while the input default is medium (48px). So a design with 36px buttons and 48px inputs already matches both defaults and needs no change. The steps (default in bold):
181
+
182
+ | Design system | Button small / medium / large | Input small / medium / large |
183
+ | --- | --- | --- |
184
+ | `material` | 24 / 30 / **36px** | 40 / **48** / 56px |
185
+ | `fluent` | 24 / **32** / 38px | 32 / **40** / 48px |
186
+ | `bootstrap` | 32 / **38** / 48px | 32 / **38** / 48px |
187
+ | `indigo` | 24 / **28** / 32px | 24 / **28** / 32px |
188
+
189
+ For other families, read the steps and the default from `get_component_design_tokens`. For each family whose nearest step differs from its default, call `set_size` with that `component`. Set `--ig-size` globally only when **every** family moves in the same direction. Close a remaining 2–4px mismatch with the component's padding or height tokens, if it has them. Otherwise leave it: Phase 5 rates a difference of 4px or less as Cosmetic. It is never an anatomy delta. The `set_spacing` rule is unchanged: never convert a Figma pixel value into a multiplier.
190
+
191
+ ### B8 — States and Focus
192
+
193
+ Hover, pressed, disabled, and error variants in the kit are **token inputs**. Map their colors onto the matching state tokens (`hover-background`, `focus-*`, `disabled-*`, …) in the same component theme. Focus rings differ strongly between kits (a 2–3px offset ring in shadcn and Untitled UI, a bottom accent in Fluent). If the design specifies one, it belongs in the component tokens. Keep focus visible whatever the design shows: accessibility is not optional.
76
194
 
77
195
  ---
78
196
 
79
197
  ## Global Palette Mapping
80
198
 
199
+ > Path A name patterns. For Path B, use these tables only to *label* a variable after the color census (B2) has decided the role.
200
+
81
201
  ### Primary Color
82
202
 
83
203
  | Figma Variable Pattern | Theming Input | Notes |
@@ -87,9 +207,7 @@ and `spacing()` mixins — the Angular `core()` / `theme()` mixins do not exist
87
207
  | `Primary/Default` | `primary` | Alternative naming in some kit versions |
88
208
  | `palette/primary/500` | `primary` | Prefixed naming pattern |
89
209
 
90
- > **Parameter names differ between tools.** `create_palette` takes `primary`, `secondary`,
91
- > `surface`, `gray`, `info`, `success`, `warn`, `error`. `create_theme` takes
92
- > `primaryColor`, `secondaryColor`, `surfaceColor`. Do not mix them up.
210
+ > **Parameter names differ between tools.** `create_palette` takes `primary`, `secondary`, `surface`, `gray`, `info`, `success`, `warn`, `error`. `create_theme` takes `primaryColor`, `secondaryColor`, `surfaceColor`. Do not mix them up.
93
211
 
94
212
  ### Secondary / Accent Color
95
213
 
@@ -111,9 +229,7 @@ and `spacing()` mixins — the Angular `core()` / `theme()` mixins do not exist
111
229
 
112
230
  ### Gray / Neutral Palette
113
231
 
114
- The gray scale is derived automatically from the surface color, and **gray is inverted
115
- relative to surface** in dark themes. Do not pass gray unless the Figma grays clearly
116
- diverge from the generated ones. Read `theming://guidance/colors/rules` before overriding.
232
+ The gray scale is derived automatically from the surface color, and **gray is inverted relative to surface** in dark themes. Do not pass gray unless the Figma grays clearly diverge from the generated ones. Read `theming://guidance/colors/rules` before overriding.
117
233
 
118
234
  ### Semantic Status Colors
119
235
 
@@ -126,20 +242,16 @@ diverge from the generated ones. Read `theming://guidance/colors/rules` before o
126
242
 
127
243
  ### Multiple Surface Depths
128
244
 
129
- Designs frequently use two or three surface depths (page, panel, card) that a single
130
- generated `surface` cannot express. When that happens:
245
+ Designs frequently use two or three surface depths (page, panel, card) that a single generated `surface` cannot express. When that happens:
131
246
 
132
247
  - use `create_custom_palette` for explicit per-shade control, or
133
- - define semantic variables (`--surface-1`, `--surface-2`) alongside the palette and use
134
- them in view CSS.
248
+ - define semantic variables (`--surface-1`, `--surface-2`) alongside the palette and use them in view CSS.
135
249
 
136
250
  Never satisfy a second depth with a raw hex value in component styles.
137
251
 
138
252
  ### Resolving Colors Back Out
139
253
 
140
- Use `get_color({ color, variant, contrast, opacity })` to turn a color intent into the
141
- correct `var(--ig-<family>-<shade>)` reference — including contrast colors and
142
- transparency — instead of hand-writing variable names.
254
+ Use `get_color({ color, variant, contrast, opacity })` to turn a color intent into the correct `var(--ig-<family>-<shade>)` reference — including contrast colors and transparency — instead of hand-writing variable names.
143
255
 
144
256
  ---
145
257
 
@@ -152,43 +264,31 @@ transparency — instead of hand-writing variable names.
152
264
  | `typography/heading/font-family` | `fontFamily` | Use if the heading font differs |
153
265
  | `font/primary` | `fontFamily` | Alternative naming |
154
266
 
155
- `create_typography` also accepts `designSystem` (which type scale to start from) and
156
- `customScale` (per-style overrides of `fontSize`, `fontWeight`, `lineHeight`,
157
- `letterSpacing`, `textTransform`, margins) — use `customScale` only when the design's type
158
- ramp genuinely differs from the design system's.
267
+ `create_typography` also accepts `designSystem` (which type scale to start from). Its `customScale` argument is currently ignored by the generators; override individual type styles with the `--ig-<style>-<property>` variables instead (see [B4](#b4--button-casing-and-other-type-driven-anatomy)).
159
268
 
160
- In a CSS-only project, apply typography as plain CSS `font-family` / `font-size` /
161
- `font-weight` rules, or the CSS output of `create_typography`. **Do not emit Sass
162
- typography mixins into an app that has no Sass.**
269
+ In a CSS-only project, apply typography as plain CSS `font-family` / `font-size` / `font-weight` rules, or the CSS output of `create_typography`. **Do not emit Sass typography mixins into an app that has no Sass.**
163
270
 
164
- Web fonts must be loaded by the app (a `<link>` to the font provider or a local `@font-face`);
165
- setting a font family the browser cannot resolve silently falls back and fails Phase 5.
271
+ Web fonts must be loaded by the app (a `<link>` to the font provider or a local `@font-face`); setting a font family the browser cannot resolve silently falls back and fails Phase 5.
166
272
 
167
273
  ---
168
274
 
169
275
  ## Spacing, Sizing, and Roundness — Do Not Map Directly
170
276
 
171
- > **These tools are NOT equivalent to Figma spacing values.** Do not create a mapping
172
- > between Figma pixel values and these tools.
277
+ > **These tools are NOT equivalent to Figma spacing values.** Do not create a mapping between Figma pixel values and these tools.
173
278
 
174
- `set_spacing` takes a **multiplier** (`1.0` = default, plus optional `inline` / `block`
175
- multipliers). `set_roundness` takes a `radiusFactor` between **0 and 1**. `set_size` takes
176
- a **density** (`small` / `medium` / `large`, or `1`–`3`). Passing a Figma `spacing/md = 16`
177
- as `set_spacing({ spacing: 16 })` would produce a 1600% increase.
279
+ `set_spacing` takes a **multiplier** (`1.0` = default, plus optional `inline` / `block` multipliers). `set_roundness` takes a `radiusFactor` between **0 and 1**. `set_size` takes a **density** (`small` / `medium` / `large`, or `1`–`3`). Passing a Figma `spacing/md = 16` as `set_spacing({ spacing: 16 })` would produce a 1600% increase.
178
280
 
179
281
  ### When to touch these tools (sparingly)
180
282
 
181
283
  | Tool | Use only when | Never because |
182
284
  | ---------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
183
- | `set_size` | The design consistently uses a noticeably tighter or looser component density than the design system default | A Figma spacing variable happens to be named "compact" |
285
+ | `set_size` | Path A: the design consistently uses a noticeably tighter or looser density than the design system default. Path B: per family, as in B7 | A Figma spacing variable happens to be named "compact" |
184
286
  | `set_spacing` | Explicitly requested, or required to match a specific density contract; start at the default | A Figma `spacing/*` pixel value looks like the multiplier number |
185
- | `set_roundness` | The entire app has a clearly distinct border-radius language (fully squared vs fully rounded) | A Figma `border-radius/md = 8` maps numerically to a multiplier |
287
+ | `set_roundness` | The user explicitly asks for it. For Path B, use per-component radius tokens instead (B5) | A Figma `border-radius/md = 8` maps numerically to a multiplier |
186
288
 
187
289
  ### The correct adjustment path
188
290
 
189
- Scope `--ig-size` and `--ig-spacing` to the component that needs it — both tools take a
190
- `component` parameter (and `scope` for a sub-component or container selector) that generates
191
- exactly this:
291
+ Scope `--ig-size` and `--ig-spacing` to the component that needs it — both tools take a `component` parameter (and `scope` for a sub-component or container selector) that generates exactly this:
192
292
 
193
293
  ```
194
294
  set_size({ component: "calendar", size: "small", platform: "webcomponents" })
@@ -209,8 +309,9 @@ igc-calendar {
209
309
  }
210
310
  ```
211
311
 
212
- The Indigo.Design kit's component proportions are already calibrated per design system —
213
- start from the defaults and adjust only when there is a clear visual reason.
312
+ The Indigo.Design kit's component proportions are already calibrated per design system — start from the defaults and adjust only when there is a clear visual reason.
313
+
314
+ **Path B differs.** A third-party kit's proportions are *not* calibrated to Ignite UI, so the defaults are not a safe resting point. The prohibition still holds: never convert a px value into a multiplier. But do make the **categorical** choices from measurements: pick `--ig-size` from the nearest height step (B7), and set each component's radius token to the measured px value (B5). These are not multiplier conversions. They use each tool the way it was designed.
214
315
 
215
316
  ---
216
317
 
@@ -220,27 +321,27 @@ start from the defaults and adjust only when there is a clear visual reason.
220
321
  | -------------------------------------------------------- | ------------------------------------------------------------------------ |
221
322
  | Dark artboard background (`#121212`, `#1a1a1a`, similar) | `variant: "dark"` + the dark theme CSS (`themes/dark/<ds>.css`) |
222
323
  | Light artboard background (`#fff`, `#f5f5f5`, similar) | `variant: "light"` + the light theme CSS |
223
- | Multiple artboards — one light, one dark | Generate both; switch with a class, `prefers-color-scheme`, or `configureTheme` |
324
+ | Multiple artboards — one light, one dark | Ask the user which variant is primary. Generate it as the global theme and run Phase 5 against it. Then add the other variant (the other pre-built theme or a second theme output) under a class or `prefers-color-scheme`, and call `configureTheme` with the same design system and variant when switching at runtime (see `theme-generation.md § 3c`). Validate it against its own artboard |
224
325
  | `color/mode` variable present | Its value (`light` or `dark`) is the authoritative signal |
225
326
 
226
- Surface color must match the variant: a light surface with `variant: "dark"` produces
227
- unreadable components and a luminance warning from the palette tools. Read the warnings.
327
+ Surface color must match the variant: a light surface with `variant: "dark"` produces unreadable components and a luminance warning from the palette tools. Read the warnings.
228
328
 
229
329
  ---
230
330
 
231
331
  ## Design System Detection from Figma
232
332
 
333
+ > Path A (Indigo.Design kits) only. For any other kit, choose the baseline with the anatomy rubric in [B1](#b1--choose-the-baseline-design-system-by-anatomy).
334
+
233
335
  | Figma Visual Signal | Likely Design System | `designSystem` Value |
234
336
  | ------------------------------------------------------------------ | -------------------------- | -------------------- |
235
337
  | Three-layer `DROP_SHADOW` on elevation variables (`Shadow 01-03`) | Material Design | `"material"` |
236
- | Prominent single-layer shadows, rounded cards, ripple effects | Material Design | `"material"` |
338
+ | Prominent layered shadows, rounded cards, ripple effects | Material Design | `"material"` |
237
339
  | Flat surfaces, sharp corners, Segoe/Inter font | Microsoft Fluent | `"fluent"` |
238
340
  | Component borders, Bootstrap-like grid | Bootstrap | `"bootstrap"` |
239
341
  | Purple/indigo accents, rounded corners, single shadow | Infragistics Indigo | `"indigo"` |
240
342
  | `primary/500`, `primary/900` palette shade naming | Material (100–900 palette) | `"material"` |
241
343
 
242
- `create_elevations` accepts only `"material"` or `"indigo"` as its `designSystem` — for a
243
- Fluent or Bootstrap design, pick the closer of the two (usually `material`).
344
+ `create_elevations` accepts only `"material"` or `"indigo"` as its `designSystem` — for a Fluent or Bootstrap design, pick the closer of the two (usually `material`).
244
345
 
245
346
  ---
246
347
 
@@ -248,12 +349,11 @@ Fluent or Bootstrap design, pick the closer of the two (usually `material`).
248
349
 
249
350
  ### Step 1: Use the right theme key
250
351
 
251
- Theme keys are **not** tag names. Pass the key to `get_component_design_tokens` and
252
- `create_component_theme`:
352
+ Theme keys are **not** tag names. Pass the key to `get_component_design_tokens` and `create_component_theme`:
253
353
 
254
354
  | Component in the design | Theme key | Selector it generates for |
255
355
  | ----------------------- | ------------------- | --------------------------------- |
256
- | Text input / any input | `input-group` | `igc-input` |
356
+ | Text input | `input-group` | `igc-input` (other fields get it through their related themes; `igc-textarea` uses `textarea`) |
257
357
  | Navigation drawer | `navdrawer` | `igc-nav-drawer` |
258
358
  | Linear progress bar | `progress-linear` | `igc-linear-progress` |
259
359
  | Circular progress | `progress-circular` | `igc-circular-progress` |
@@ -265,18 +365,9 @@ Theme keys are **not** tag names. Pass the key to `get_component_design_tokens`
265
365
  | Dropdown menu | `drop-down` | `igc-dropdown` |
266
366
  | App scrollbars | `scrollbar` | `.ig-scrollbar` |
267
367
 
268
- Most other components use their obvious key (`card`, `list`, `navbar`, `chip`, `avatar`,
269
- `badge`, `calendar`, `date-picker`, `select`, `combo`, `tabs`, `stepper`, `tree`, `dialog`,
270
- `toast`, `snackbar`, `banner`, `tooltip`, `divider`, `rating`, `slider`, `switch`,
271
- `checkbox`, `radio`, `carousel`, `chat`, `expansion-panel`, `accordion`, `splitter`,
272
- `file-input`, `date-time-input`, `textarea`, `icon`, `ripple`, `highlight`).
368
+ Most other components use their obvious key (`card`, `list`, `navbar`, `chip`, `avatar`, `badge`, `calendar`, `date-picker`, `select`, `combo`, `tabs`, `stepper`, `tree`, `dialog`, `toast`, `snackbar`, `banner`, `tooltip`, `divider`, `rating`, `slider`, `switch`, `checkbox`, `radio`, `carousel`, `chat`, `expansion-panel`, `accordion`, `splitter`, `file-input`, `date-time-input`, `textarea`, `icon`, `ripple`, `highlight`).
273
369
 
274
- **Keys with no Web Components equivalent** — do not call the theming tools for these:
275
- `action-strip`, `bottom-nav`, `column-actions`, `overlay`, `query-builder`, `time-picker`,
276
- `date-range-start`, `date-range-end`. Sub-part keys (`card-header`, `list-item`, `step`,
277
- `tab-item`, `accordion-header`, `expansion-panel-header`, `drop-down-item`,
278
- `nav-drawer-item`) have no standalone selector either — style them through the parent's
279
- tokens, their documented `::part(...)`, or slotted content.
370
+ **Keys with no standalone Web Components selector in the theming tool** — do not call the theming tools for these: `action-strip`, `bottom-nav`, `column-actions`, `overlay`, `query-builder`, `time-picker`, `date-range-start`, `date-range-end`. (`action-strip` and `column-actions` are themed through the `grid` theme, which derives them.) Sub-part keys (`card-header`, `list-item`, `step`, `tab-item`, `accordion-header`, `expansion-panel-header`, `drop-down-item`, `nav-drawer-item`) have no standalone selector either — style them through the parent's tokens, their documented `::part(...)`, or slotted content.
280
371
 
281
372
  ### Step 2: Discover the tokens
282
373
 
@@ -284,11 +375,12 @@ tokens, their documented `::part(...)`, or slotted content.
284
375
  get_component_design_tokens({ component: "<theme key>" })
285
376
  ```
286
377
 
287
- The result lists every token with name, type, and description — and, for compound
288
- components, the **related themes** you must also theme.
378
+ The result lists every token with name, type, and description — and, for compound components, the **related themes** you must also theme.
289
379
 
290
380
  ### Step 3: Match Figma variables to token names
291
381
 
382
+ > **Path B:** third-party kits rarely have component variables in this form, and Tier C files usually have none. Take the component's colors, radius, borders, and state colors from the Phase 1d color census and measurements (B2, B5–B8). Use variables, when they exist, only to confirm them.
383
+
292
384
  Kit component variables follow `<component>/<role>/<state>`:
293
385
 
294
386
  - `button/background` → token `background`
@@ -297,8 +389,7 @@ Kit component variables follow `<component>/<role>/<state>`:
297
389
  - `grid/header-background` → token `header-background`
298
390
  - `navbar/background` → token `background`
299
391
 
300
- Lookup process: strip the component prefix, match the remainder against the token list, and
301
- when there is no exact match pick the token whose description names the same visual role.
392
+ Lookup process: strip the component prefix, match the remainder against the token list, and when there is no exact match pick the token whose description names the same visual role.
302
393
 
303
394
  | Component | Figma Variable | Likely Token Name | Notes |
304
395
  | --------- | -------------------------- | ----------------------- | ----------------------- |
@@ -320,8 +411,7 @@ when there is no exact match pick the token whose description names the same vis
320
411
 
321
412
  ### Step 4: Generate the component theme
322
413
 
323
- Pass **only tokens that differ from the global theme**, and express values as palette
324
- references — never raw hex:
414
+ Pass **only tokens that differ from the global theme**, and express values as palette references — never raw hex:
325
415
 
326
416
  ```
327
417
  create_component_theme({
@@ -329,7 +419,6 @@ create_component_theme({
329
419
  platform: "webcomponents",
330
420
  designSystem: "<resolved>",
331
421
  variant: "<light|dark>",
332
- licensed: <true if @infragistics>,
333
422
  tokens: {
334
423
  "background": "var(--ig-surface-100)",
335
424
  "foreground-color": "var(--ig-gray-900)"
@@ -339,22 +428,17 @@ create_component_theme({
339
428
  })
340
429
  ```
341
430
 
342
- Apply the generated block exactly as returned. Use `selector` to scope an override to one
343
- region instead of every instance in the app.
431
+ Apply the generated block exactly as returned. Use `selector` to scope an override to one region instead of every instance in the app.
344
432
 
345
433
  ### Step 5: Compound components
346
434
 
347
- `combo`, `select`, `date-picker`, `date-range-picker`, `grid`, and `banner` render internal
348
- children with their own themes. Theme each related theme returned in Step 1 using the
349
- parent's selector as the wrapper. Styling only the parent leaves dropdown surfaces,
350
- calendars, and action buttons off-theme — a guaranteed Phase 5 failure.
435
+ Compound components — any component whose `get_component_design_tokens` result lists related themes (for example `combo`, `select`, the date pickers, `card`, `navbar`, `dialog`, `banner`, and the grids) — render internal children with their own themes. Theme each related theme returned in Step 1 using the parent's selector as the wrapper. Styling only the parent leaves dropdown surfaces, calendars, and action buttons off-theme — a guaranteed Phase 5 failure.
351
436
 
352
437
  ---
353
438
 
354
439
  ## Chart Colors
355
440
 
356
- Charts have no design tokens. Take the series colors from the Figma design context and run
357
- them through the theming MCP before use:
441
+ Charts have no design tokens. Take the series colors from the Figma design context and run them through the theming MCP before use:
358
442
 
359
443
  ```
360
444
  get_chart_series_colors({ chartType: "category-chart" }) // which properties accept a brush list
@@ -362,9 +446,7 @@ get_chart_series_colors({ customBrushes: ["#9DE772", "#6DB1FF"] }) // validate t
362
446
  get_chart_series_colors({ mode: "color-blind" }) // accessible alternative palette
363
447
  ```
364
448
 
365
- Assign the result to the chart's `brushes` / `outlines` **properties** (arrays, not
366
- attributes). Without an explicit assignment the chart uses its own default palette and will
367
- not match the design.
449
+ Assign the result to the chart's brush **properties**: `brushes` / `outlines` on most charts, `brush` on `igc-sparkline`, `fillBrushes` on `igc-treemap`, and `brushes` / `outlines` on each `igc-ring-series` of a doughnut chart. Without an explicit assignment the chart uses its own default palette and will not match the design.
368
450
 
369
451
  ---
370
452
 
@@ -383,12 +465,12 @@ When multiple Figma variables could map to the same theming input:
383
465
 
384
466
  Do **not** call theming tools for:
385
467
 
386
- - Chart, gauge, and map components → configure via properties; series colors via
387
- `get_chart_series_colors`
388
- - Dock Manager → it exposes its own CSS custom properties
468
+ - Chart, gauge, and map components → configure via properties; series colors via `get_chart_series_colors`
389
469
  - Pure layout CSS (margins, grid columns, flex gaps) → write it directly in the view's styles
390
470
  - Icon colors → set `color` on the `igc-icon` host or its parent
391
471
 
472
+ Dock Manager **is** themed with the tools: use the theme key `dock-manager` (selector `igc-dockmanager`) like any other component. It also exposes its own CSS custom properties.
473
+
392
474
  ---
393
475
 
394
476
  ## Loading Reference Data