igniteui-angular 22.2.0-rc.1 → 22.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +1 -1
  2. package/button-group/README.md +42 -9
  3. package/calendar/README.md +30 -20
  4. package/card/README.md +1 -1
  5. package/fesm2022/igniteui-angular-accordion.mjs +7 -7
  6. package/fesm2022/igniteui-angular-action-strip.mjs +11 -22
  7. package/fesm2022/igniteui-angular-action-strip.mjs.map +1 -1
  8. package/fesm2022/igniteui-angular-avatar.mjs +7 -7
  9. package/fesm2022/igniteui-angular-badge.mjs +7 -7
  10. package/fesm2022/igniteui-angular-banner.mjs +10 -10
  11. package/fesm2022/igniteui-angular-bottom-nav.mjs +22 -22
  12. package/fesm2022/igniteui-angular-button-group.mjs +32 -35
  13. package/fesm2022/igniteui-angular-button-group.mjs.map +1 -1
  14. package/fesm2022/igniteui-angular-calendar.mjs +132 -180
  15. package/fesm2022/igniteui-angular-calendar.mjs.map +1 -1
  16. package/fesm2022/igniteui-angular-card.mjs +47 -58
  17. package/fesm2022/igniteui-angular-card.mjs.map +1 -1
  18. package/fesm2022/igniteui-angular-carousel.mjs +22 -22
  19. package/fesm2022/igniteui-angular-chat-extras.mjs +6 -6
  20. package/fesm2022/igniteui-angular-chat.mjs +12 -12
  21. package/fesm2022/igniteui-angular-checkbox.mjs +7 -7
  22. package/fesm2022/igniteui-angular-chips.mjs +10 -10
  23. package/fesm2022/igniteui-angular-combo.mjs +66 -60
  24. package/fesm2022/igniteui-angular-combo.mjs.map +1 -1
  25. package/fesm2022/igniteui-angular-core.mjs +107 -79
  26. package/fesm2022/igniteui-angular-core.mjs.map +1 -1
  27. package/fesm2022/igniteui-angular-date-picker.mjs +38 -38
  28. package/fesm2022/igniteui-angular-dialog.mjs +13 -13
  29. package/fesm2022/igniteui-angular-directives.mjs +194 -194
  30. package/fesm2022/igniteui-angular-drop-down.mjs +29 -29
  31. package/fesm2022/igniteui-angular-expansion-panel.mjs +28 -28
  32. package/fesm2022/igniteui-angular-grids-core.mjs +737 -661
  33. package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
  34. package/fesm2022/igniteui-angular-grids-grid.mjs +69 -58
  35. package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
  36. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +37 -37
  37. package/fesm2022/igniteui-angular-grids-lite.mjs +25 -17
  38. package/fesm2022/igniteui-angular-grids-lite.mjs.map +1 -1
  39. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs +92 -81
  40. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs.map +1 -1
  41. package/fesm2022/igniteui-angular-grids-tree-grid.mjs +55 -55
  42. package/fesm2022/igniteui-angular-icon.mjs +10 -10
  43. package/fesm2022/igniteui-angular-input-group.mjs +25 -25
  44. package/fesm2022/igniteui-angular-list.mjs +40 -40
  45. package/fesm2022/igniteui-angular-navbar.mjs +13 -13
  46. package/fesm2022/igniteui-angular-navigation-drawer.mjs +43 -38
  47. package/fesm2022/igniteui-angular-navigation-drawer.mjs.map +1 -1
  48. package/fesm2022/igniteui-angular-paginator.mjs +19 -19
  49. package/fesm2022/igniteui-angular-progressbar.mjs +19 -19
  50. package/fesm2022/igniteui-angular-query-builder.mjs +22 -22
  51. package/fesm2022/igniteui-angular-radio.mjs +25 -21
  52. package/fesm2022/igniteui-angular-radio.mjs.map +1 -1
  53. package/fesm2022/igniteui-angular-select.mjs +25 -25
  54. package/fesm2022/igniteui-angular-simple-combo.mjs +9 -9
  55. package/fesm2022/igniteui-angular-simple-combo.mjs.map +1 -1
  56. package/fesm2022/igniteui-angular-slider.mjs +28 -28
  57. package/fesm2022/igniteui-angular-snackbar.mjs +7 -7
  58. package/fesm2022/igniteui-angular-splitter.mjs +13 -13
  59. package/fesm2022/igniteui-angular-stepper.mjs +34 -34
  60. package/fesm2022/igniteui-angular-switch.mjs +7 -7
  61. package/fesm2022/igniteui-angular-tabs.mjs +34 -34
  62. package/fesm2022/igniteui-angular-time-picker.mjs +19 -19
  63. package/fesm2022/igniteui-angular-toast.mjs +7 -7
  64. package/fesm2022/igniteui-angular-tree.mjs +28 -28
  65. package/fesm2022/igniteui-angular-virtual-scroll.mjs +497 -145
  66. package/fesm2022/igniteui-angular-virtual-scroll.mjs.map +1 -1
  67. package/migrations/common/UpdateChanges.d.ts +25 -5
  68. package/migrations/common/UpdateChanges.js +218 -34
  69. package/migrations/common/UpdateChanges.spec.js +763 -0
  70. package/migrations/migration-collection.json +1 -1
  71. package/migrations/update-22_2_0/index.js +145 -0
  72. package/migrations/update-22_2_0/index.spec.js +133 -0
  73. package/navigation-drawer/README.md +1 -1
  74. package/package.json +4 -4
  75. package/schematics/tsconfig.tsbuildinfo +1 -1
  76. package/skills/igniteui-angular-components/SKILL.md +9 -5
  77. package/skills/igniteui-angular-components/references/form-controls.md +1 -1
  78. package/skills/igniteui-angular-components/references/mcp-setup.md +14 -2
  79. package/skills/igniteui-angular-figma-to-app/SKILL.md +112 -525
  80. package/skills/igniteui-angular-figma-to-app/references/asset-extraction.md +49 -75
  81. package/skills/igniteui-angular-figma-to-app/references/design-provenance.md +201 -0
  82. package/skills/igniteui-angular-figma-to-app/references/design-token-bridge.md +175 -52
  83. package/skills/igniteui-angular-figma-to-app/references/figma-component-map.md +153 -99
  84. package/skills/igniteui-angular-figma-to-app/references/figma-exploration.md +226 -0
  85. package/skills/igniteui-angular-figma-to-app/references/mcp-setup.md +71 -105
  86. package/skills/igniteui-angular-figma-to-app/references/project-setup.md +63 -0
  87. package/skills/igniteui-angular-figma-to-app/references/theme-generation.md +120 -0
  88. package/skills/igniteui-angular-figma-to-app/references/validation-patterns.md +48 -50
  89. package/skills/igniteui-angular-generate-from-image-design/SKILL.md +11 -7
  90. package/skills/igniteui-angular-grids/SKILL.md +7 -3
  91. package/skills/igniteui-angular-grids/references/editing.md +1 -2
  92. package/skills/igniteui-angular-grids/references/grid-migration.md +1 -1
  93. package/skills/igniteui-angular-theming/SKILL.md +9 -5
  94. package/skills/igniteui-angular-theming/references/mcp-setup.md +12 -2
  95. package/types/igniteui-angular-button-group.d.ts +49 -34
  96. package/types/igniteui-angular-calendar.d.ts +33 -50
  97. package/types/igniteui-angular-card.d.ts +12 -17
  98. package/types/igniteui-angular-combo.d.ts +6 -0
  99. package/types/igniteui-angular-core.d.ts +10 -2
  100. package/types/igniteui-angular-grids-core.d.ts +48 -4
  101. package/types/igniteui-angular-grids-grid.d.ts +4 -0
  102. package/types/igniteui-angular-grids-lite.d.ts +5 -1
  103. package/types/igniteui-angular-grids-pivot-grid.d.ts +5 -1
  104. package/types/igniteui-angular-navigation-drawer.d.ts +1 -0
  105. package/types/igniteui-angular-radio.d.ts +5 -0
  106. package/types/igniteui-angular-virtual-scroll.d.ts +41 -13
  107. package/virtual-scroll/README.md +32 -1
@@ -2,16 +2,30 @@
2
2
 
3
3
  > **Part of the [`igniteui-angular-figma-to-app`](../SKILL.md) skill.**
4
4
  >
5
- > Use this file in Phase 3 to translate Figma variable values (from `figma_get_variable_defs`)
6
- > into Ignite UI Theming MCP inputs. Read this file in full before calling any theming tool.
5
+ > Use this file in Phase 3 to translate Figma variable values (from `figma_get_variable_defs`) into Ignite UI Theming MCP inputs. Read this file in full before calling any theming tool.
7
6
 
8
7
  ---
9
8
 
10
- ## How the Indigo.Design UI Kits Organize Variables
9
+ ## Two Paths
11
10
 
12
- The **Indigo.Design UI Kits** are Figma component libraries published by Infragistics.
13
- Designers build their own app frames in Figma using these kits as shared libraries.
14
- The kits come in four design-system variants, each with light and dark themes:
11
+ Which path you take depends on the provenance tiers recorded in Phase 1f ([design-provenance.md](design-provenance.md)):
12
+
13
+ | Path | When | What sets the look |
14
+ | --- | --- | --- |
15
+ | **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. |
16
+ | **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). |
17
+
18
+ **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**:
19
+
20
+ - Put a class on the minority instances (for example `class="kit-b"`), and pass it as `selector` to `theming_create_component_theme`. Do not scope by the component selector alone: a Tier A and a Tier B button both render `[igxButton]`, so that would restyle both.
21
+ - Tier B/C instances in a Path A app get the Path B token work (B2, B5–B8) in those scoped component themes.
22
+ - 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.
23
+
24
+ ---
25
+
26
+ ## Path A — How the Indigo.Design UI Kits Organize Variables
27
+
28
+ 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:
15
29
 
16
30
  | Kit variant | Figma library name pattern | Ignite UI `designSystem` |
17
31
  | ---------------------- | ----------------------------------------------- | ------------------------ |
@@ -20,25 +34,18 @@ The kits come in four design-system variants, each with light and dark themes:
20
34
  | Bootstrap | `Indigo.Design UI Kit for Bootstrap` | `"bootstrap"` |
21
35
  | Indigo | `Indigo.Design UI Kit` / `Indigo.Design System` | `"indigo"` |
22
36
 
23
- **Identifying the active kit variant** is the first task in Phase 3 because it sets
24
- the `designSystem` parameter for `theming_create_theme`. Use these signals in **strict
25
- precedence order** — stop at the first clear match:
37
+ **Identifying the active kit variant** is the first task in Phase 3 because it sets the `designSystem` parameter for `theming_create_theme`. Use these signals in **strict precedence order** — stop at the first clear match:
26
38
 
27
- 1. **Library source name** — `figma_get_design_context` and `figma_get_metadata` responses
28
- may reference the source library file name (e.g. `"Indigo.Design UI Kit for Material"`).
29
- 2. **Variable collection name** — `figma_get_variable_defs` may return collection names
30
- that include the design system (e.g. `Material/color/primary`).
31
- 3. **Elevation variable structure** — inspect the `Elevations/*` variables from
32
- `figma_get_variable_defs`:
39
+ 1. **Explicit user request** — "make it Material", "use Fluent", etc.
40
+ 2. **Library source name** — `figma_get_design_context` and `figma_get_metadata` responses may reference the source library file name (e.g. `"Indigo.Design UI Kit for Material"`).
41
+ 3. **Variable collection name** — `figma_get_variable_defs` may return collection names that include the design system (e.g. `Material/color/primary`).
42
+ 4. **Elevation variable structure** — inspect the `Elevations/*` variables from `figma_get_variable_defs`:
33
43
  - **Three-layer DROP_SHADOW** (umbra + penumbra + ambient, `Elevations/Shadow 01-03`) → **Material**
34
44
  - **Single-layer DROP_SHADOW** → Indigo, Fluent, or Bootstrap
35
- 4. **Palette shade naming** — variables named `primary/500`, `primary/100`–`primary/900`
36
- follow the Material 100–900 convention → likely **Material**.
37
- 5. **Visual heuristics** (use only when all above are inconclusive) — see the
38
- [Design System Detection table](#design-system-detection-from-figma) below.
45
+ 5. **Palette shade naming** — variables named `primary/500`, `primary/100`–`primary/900` follow the Material 100–900 convention → likely **Material**.
46
+ 6. **Visual heuristics** (use only when all above are inconclusive) — see the [Design System Detection table](#design-system-detection-from-figma) below.
39
47
 
40
- > **Never use font name as a primary signal.** "Titillium Web" is the default body font
41
- > in the Indigo.Design UI Kit for Material — it is not exclusive to any single kit variant.
48
+ > **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 single kit variant.
42
49
 
43
50
  All four kit variants share the same variable naming conventions described below. The Ignite UI theming system uses Figma variable collections that mirror its own token structure:
44
51
 
@@ -52,8 +59,124 @@ The `figma_get_variable_defs` response returns a flat map of resolved variable n
52
59
 
53
60
  ---
54
61
 
62
+ ## Path B — Any Other Kit (or No Kit)
63
+
64
+ 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.
65
+
66
+ ### B1 — Choose the Baseline Design System by Anatomy
67
+
68
+ Use the first rule that gives a clear answer:
69
+
70
+ 1. **Explicit user request.**
71
+ 2. **Kit with a direct counterpart:** Material 3 / Material kits → `material`; Fluent 2 → `fluent`; Bootstrap kits → `bootstrap`.
72
+ 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:
73
+
74
+ | Observable in the design | `material` | `fluent` | `bootstrap` | `indigo` |
75
+ | --- | --- | --- | --- | --- |
76
+ | Text-field label | **Floating inside the field** (notched outline) | Above the field | Above the field | Above the field |
77
+ | Default button height | 36px | 32px | 38px | 28px |
78
+ | Default input height | 48px | 40px | 38px | 28px |
79
+ | Button label casing in the type preset | UPPERCASE | Capitalize | none | UPPERCASE |
80
+
81
+ 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.
82
+
83
+ 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 `theming_get_component_design_tokens`.
84
+
85
+ ### B2 — Infer Color Roles From Usage, Not Names
86
+
87
+ 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**:
88
+
89
+ | Ignite UI palette input | Take the color from |
90
+ | --- | --- |
91
+ | `primary` | The fill of high-emphasis buttons. If there are none, the active tab indicator, checked checkbox/switch, or focused-field accent. |
92
+ | `secondary` | A second accent actually used on components: tonal/secondary buttons, selected chips, FAB. If none exists, reuse `primary`. Do not invent one. |
93
+ | `surface` | The page / artboard background. Additional depths (cards, sidebars) → B6. |
94
+ | `gray` | Omit at first. Pass it only if the generated grays visibly diverge from the design's borders and secondary text. |
95
+ | `error` / `warn` / `success` / `info` | Destructive buttons, error-state fields, alert and status colors |
96
+
97
+ `theming_create_theme` takes only `primaryColor`, `secondaryColor`, and `surfaceColor`. To set `gray` or the status colors, also call `theming_create_palette` with all the seeds (plus `variant`), or `theming_create_custom_palette`, and place its output **after** the theme output. Its `:root` palette variables then override the ones the theme generated.
98
+
99
+ **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.
100
+
101
+ **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 `theming_read_resource({ uri: "theming://guidance/colors/roles" })`.
102
+
103
+ 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.
104
+
105
+ **Full ramps.** If the design visibly uses several shades of one color (hover, pressed, tinted backgrounds), use `theming_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.
106
+
107
+ **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.
108
+
109
+ ### B3 — Typography
110
+
111
+ 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.
112
+ 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):
113
+
114
+ | Kit role (examples) | Ignite UI type style |
115
+ | --- | --- |
116
+ | Display / Hero / Heading XL | `h1`–`h3` (largest three) |
117
+ | Headline / Heading L–M / Title L | `h4`–`h6` |
118
+ | Title M–S / Subtitle / Label L (emphasized body) | `subtitle-1`, `subtitle-2` |
119
+ | Body L / Body M / Text md | `body-1`, `body-2` |
120
+ | Label M on buttons | `button` |
121
+ | Body S / Caption / Text xs | `caption` |
122
+ | Label S / Overline / Eyebrow | `overline` |
123
+
124
+ ### B4 — Button Casing and Other Type-Driven Anatomy
125
+
126
+ 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.
127
+
128
+ **How to override type styles.** The theme's `typography` output writes every property of every type style to a CSS variable on `:root`, named `--ig-<style>-<property>`, and the components read those variables. Add a `:root` block **after** the theme output that sets only the values that differ:
129
+
130
+ ```scss
131
+ // After @include theme(...) / typography(...) in styles.scss
132
+ :root {
133
+ --ig-button-text-transform: none;
134
+ --ig-button-font-size: 0.875rem;
135
+ --ig-button-font-weight: 500;
136
+ --ig-h1-font-size: 2.25rem;
137
+ --ig-body-1-line-height: 1.5rem;
138
+ }
139
+ ```
140
+
141
+ Property names are `font-family`, `font-size`, `font-weight`, `font-style`, `line-height`, `letter-spacing`, `text-transform`, `margin-top`, and `margin-bottom`.
142
+
143
+ > **Do not rely on `customScale`.** `theming_create_typography` accepts a `customScale` argument, but `igniteui-theming` 29.0.0 drops it from the generated code without a warning. Use the variable overrides above, and measure the result in Phase 5.
144
+
145
+ ### B5 — Radius: Per-Component Tokens, Not a Global Factor
146
+
147
+ `theming_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".
148
+
149
+ Instead, set the radius tokens that `theming_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 `theming_create_component_theme` call as the component's colors. A pill shape is half the control height, or a large value such as `9999px`.
150
+
151
+ ### B6 — Surfaces and Elevation
152
+
153
+ - **Depths:** kits built on borders instead of shadows (shadcn, Untitled UI, Fluent 2) use 2–4 surface tones. Express them with `theming_create_custom_palette` surface shades, or with semantic CSS variables (`--surface-1`, `--surface-2`) bound to palette shades.
154
+ - **Shadows:** `theming_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.
155
+ - **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.
156
+
157
+ ### B7 — Density
158
+
159
+ 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):
160
+
161
+ | Design system | Button small / medium / large | Input small / medium / large |
162
+ | --- | --- | --- |
163
+ | `material` | 24 / 30 / **36px** | 40 / **48** / 56px |
164
+ | `fluent` | 24 / **32** / 38px | 32 / **40** / 48px |
165
+ | `bootstrap` | 32 / **38** / 48px | 32 / **38** / 48px |
166
+ | `indigo` | 24 / **28** / 32px | 24 / **28** / 32px |
167
+
168
+ For other families, read the steps and the default from `theming_get_component_design_tokens`. For each family whose nearest step differs from its default, call `theming_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 `theming_set_spacing` rule is unchanged: never convert a Figma pixel value into a multiplier.
169
+
170
+ ### B8 — States and Focus
171
+
172
+ 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.
173
+
174
+ ---
175
+
55
176
  ## Global Palette Mapping
56
177
 
178
+ > Path A name patterns. For Path B, use these tables only to *label* a variable after the color census (B2) has decided the role.
179
+
57
180
  ### Primary Color
58
181
 
59
182
  | Figma Variable Pattern | Theming Input | Notes |
@@ -63,9 +186,7 @@ The `figma_get_variable_defs` response returns a flat map of resolved variable n
63
186
  | `Primary/Default` | `primary` | Alternative naming in some kit versions |
64
187
  | `palette/primary/500` | `primary` | Prefixed naming pattern |
65
188
 
66
- > **Parameter names:** `theming_create_palette` uses `primary`, `secondary`, `surface`
67
- > (short names). `theming_create_theme` uses `primaryColor`, `secondaryColor`,
68
- > `surfaceColor` (long names). Do **not** mix them up.
189
+ > **Parameter names:** `theming_create_palette` uses `primary`, `secondary`, `surface` (short names). `theming_create_theme` uses `primaryColor`, `secondaryColor`, `surfaceColor` (long names). Do **not** mix them up.
69
190
 
70
191
  ### Secondary / Accent Color
71
192
 
@@ -87,20 +208,16 @@ The `figma_get_variable_defs` response returns a flat map of resolved variable n
87
208
 
88
209
  ### Gray / Neutral Palette
89
210
 
90
- The Ignite UI theming system derives the gray scale automatically from the surface color.
91
- You do **not** need to pass gray values to `theming_create_palette` explicitly unless you
92
- need a custom gray family. If the Figma file has explicit gray variables, compare them
93
- against the auto-generated palette after calling `theming_create_palette` and only add
94
- a custom gray override if they differ significantly.
211
+ The Ignite UI theming system derives the gray scale automatically from the surface color. You do **not** need to pass gray values to `theming_create_palette` explicitly unless you need a custom gray family. If the Figma file has explicit gray variables, compare them against the auto-generated palette after calling `theming_create_palette` and only add a custom gray override if they differ significantly.
95
212
 
96
213
  ### Semantic Status Colors
97
214
 
98
215
  | Figma Variable Pattern | Theming Input | Notes |
99
216
  | -------------------------------- | ------------------------------------------ | -------- |
100
- | `color/success` or `success/500` | `successColor` in `theming_create_palette` | Optional |
101
- | `color/warning` or `warning/500` | `warningColor` in `theming_create_palette` | Optional |
102
- | `color/error` or `error/500` | `errorColor` in `theming_create_palette` | Optional |
103
- | `color/info` or `info/500` | `infoColor` in `theming_create_palette` | Optional |
217
+ | `color/success` or `success/500` | `success` in `theming_create_palette` | Optional |
218
+ | `color/warning` or `warning/500` | `warn` in `theming_create_palette` | Optional — the parameter is `warn`, not `warning` |
219
+ | `color/error` or `error/500` | `error` in `theming_create_palette` | Optional |
220
+ | `color/info` or `info/500` | `info` in `theming_create_palette` | Optional |
104
221
 
105
222
  ---
106
223
 
@@ -112,11 +229,9 @@ a custom gray override if they differ significantly.
112
229
  | `typography/body/font-family` | `fontFamily` | Body font family |
113
230
  | `typography/heading/font-family` | `fontFamily` | Use if heading font differs from body |
114
231
  | `font/primary` | `fontFamily` | Alternative naming |
115
- | `font/display` | Pass as `displayFontFamily` if the tool supports it | Display/headline font |
232
+ | `font/display` | No separate parameter — set `--ig-h1-font-family` … `--ig-h6-font-family` (see B4) | Display/headline font |
116
233
 
117
- > **fontFamily double-quote bug:** `theming_create_theme` may double-wrap the fontFamily
118
- > string in its Sass output, producing invalid Sass such as `""'Titillium Web', sans-serif""`.
119
- > If you see this pattern, strip the outer quotes before applying to `styles.scss`:
234
+ > **fontFamily double-quote bug:** `theming_create_theme` may double-wrap the fontFamily string in its Sass output, producing invalid Sass such as `""'Titillium Web', sans-serif""`. If you see this pattern, strip the outer quotes before applying to `styles.scss`:
120
235
  >
121
236
  > ```scss
122
237
  > // BAD (generated with bug)
@@ -127,8 +242,7 @@ a custom gray override if they differ significantly.
127
242
  > $font-family: 'Titillium Web', sans-serif;
128
243
  > ```
129
244
 
130
- > **Comma-separated font families** must be wrapped in parentheses when used in Sass
131
- > typography mixins:
245
+ > **Comma-separated font families** must be wrapped in parentheses when used in Sass typography mixins:
132
246
  >
133
247
  > ```scss
134
248
  > // BAD — parsed as multiple Sass arguments
@@ -147,8 +261,7 @@ a custom gray override if they differ significantly.
147
261
 
148
262
  ## Spacing, Sizing, and Roundness — Do Not Map Directly
149
263
 
150
- > **These Ignite UI theming tools are NOT equivalent to Figma spacing values.**
151
- > Do not create a mapping between Figma pixel values and these tools.
264
+ > **These Ignite UI theming tools are NOT equivalent to Figma spacing values.** Do not create a mapping between Figma pixel values and these tools.
152
265
 
153
266
  `theming_set_spacing` and `theming_set_roundness` accept **multipliers**, not pixel values. Passing a Figma `spacing/md = 16` as `theming_set_spacing({ spacing: 16 })` would produce a 1600% increase over the default — a catastrophic result.
154
267
 
@@ -158,16 +271,13 @@ a custom gray override if they differ significantly.
158
271
 
159
272
  | Tool | Use only when | Never use because |
160
273
  | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
161
- | `theming_set_size` | The Figma design clearly and consistently uses a noticeably tighter or looser component density than the design system default — e.g. a data-dense admin UI vs a spacious marketing page | A Figma spacing variable happens to match the name "compact" |
274
+ | `theming_set_size` | Path A: the Figma design clearly and consistently uses a noticeably tighter or looser component density than the design system default — e.g. a data-dense admin UI vs a spacious marketing page. Path B: per family, as described in B7 | A Figma spacing variable happens to match the name "compact" |
162
275
  | `theming_set_spacing` | Explicitly requested by the user or required to match a very specific density contract; default (1.0) should be the starting point | A Figma `spacing/*` pixel value looks similar to the multiplier number |
163
- | `theming_set_roundness` | The entire app has a clearly distinct border-radius language from the design system default (e.g. fully squared off vs fully rounded) | A Figma `border-radius/md = 8` maps numerically to the multiplier |
276
+ | `theming_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 the multiplier |
164
277
 
165
278
  ### The correct adjustment path
166
279
 
167
- When a specific component needs tighter or looser density or spacing, scope `--ig-size`
168
- and `--ig-spacing` to that component’s selector — not raw CSS overrides, not
169
- `::ng-deep`. Both `theming_set_size` and `theming_set_spacing` accept a `component`
170
- parameter that generates exactly this scoped output:
280
+ When a specific component needs tighter or looser density or spacing, scope `--ig-size` and `--ig-spacing` to that component’s selector — not raw CSS overrides, not `::ng-deep`. Both `theming_set_size` and `theming_set_spacing` accept a `component` parameter that generates exactly this scoped output:
171
281
 
172
282
  ```
173
283
  // Scoped size for one component type
@@ -194,8 +304,10 @@ igx-calendar {
194
304
  }
195
305
  ```
196
306
 
197
- The Indigo.Design kit’s component proportions are already calibrated for each design
198
- system; start from the defaults and only adjust when there is a clear visual reason.
307
+ The Indigo.Design kit’s component proportions are already calibrated for each design system; start from the defaults and only adjust when there is a clear visual reason.
308
+
309
+ **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.
310
+
199
311
 
200
312
  ---
201
313
 
@@ -207,17 +319,19 @@ Detect from the Figma artboard:
207
319
  | -------------------------------------------------------- | ---------------------------------------------------------------------- |
208
320
  | Dark artboard background (`#121212`, `#1a1a1a`, similar) | Use `variant: "dark"` in `theming_create_theme` |
209
321
  | Light artboard background (`#fff`, `#f5f5f5`, similar) | Use `variant: "light"` in `theming_create_theme` |
210
- | Multiple artboards — one light, one dark | Generate both theme variants with a `prefers-color-scheme` media query |
322
+ | 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 call `theming_create_theme` again for the other variant and apply it under a class (e.g. `.dark-theme`) or a `prefers-color-scheme` media query. Validate the second variant against its own artboard |
211
323
  | `color/mode` variable present | Its value (`light` or `dark`) is the authoritative signal |
212
324
 
213
325
  ---
214
326
 
215
327
  ## Design System Detection from Figma
216
328
 
329
+ > 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).
330
+
217
331
  | Figma Visual Signal | Likely Design System | `designSystem` Value |
218
332
  | ------------------------------------------------------------------ | -------------------------- | ----------------------- |
219
333
  | Three-layer `DROP_SHADOW` on elevation variables (`Shadow 01-03`) | Material Design | `"material"` |
220
- | Prominent single-layer shadows, rounded cards, ripple effects | Material Design | `"material"` |
334
+ | Prominent layered shadows, rounded cards, ripple effects | Material Design | `"material"` |
221
335
  | Flat surfaces, sharp corners, Segoe/Inter font | Microsoft Fluent | `"fluent"` |
222
336
  | Component borders, Bootstrap-like grid | Bootstrap | `"bootstrap"` |
223
337
  | Heavy use of purple/indigo accents, rounded corners, single shadow | Infragistics Indigo | `"indigo"` |
@@ -236,10 +350,14 @@ For each Ignite UI Angular component you use, follow this lookup order:
236
350
  theming_get_component_design_tokens({ component: "<component-name>" })
237
351
  ```
238
352
 
353
+ Use the **theming tool's component names**, not Angular selectors: `input-group`, `navbar`, `grid`, `card`. Components with variants need the variant name — `contained-button`, `flat-button`, `outlined-button`, `fab-button` (and the same for icon buttons). Passing plain `button` returns an error that lists the valid variant names.
354
+
239
355
  The result lists every available token with its name, type, and description.
240
356
 
241
357
  ### Step 2: Match Figma variables to token names
242
358
 
359
+ > **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.
360
+
243
361
  The **Indigo.Design UI Kits** use component-level variables that follow the pattern:
244
362
 
245
363
  ```
@@ -290,7 +408,10 @@ Pass **only tokens that differ from the global theme** to avoid over-specificati
290
408
  theming_create_component_theme({
291
409
  component: "<component-name>",
292
410
  platform: "angular",
411
+ designSystem: "<resolved in 3b>", // required in practice: the tool defaults to "material"
412
+ variant: "<light|dark>", // the tool defaults to "light"
293
413
  licensed: <true if @infragistics>,
414
+ selector: "<optional: scope to a class, e.g. .kit-b>",
294
415
  tokens: {
295
416
  "background": "<resolved color>",
296
417
  "foreground-color": "<resolved color>"
@@ -319,6 +440,8 @@ When multiple Figma variables could map to the same theming input, use this prio
319
440
  Do **not** call theming tools for:
320
441
 
321
442
  - Chart, gauge, and map DV components → configure via component `[input]` bindings only
322
- - Tile Manager and Dock Manager → these are web components with their own CSS custom properties
443
+ - Tile Manager → a web component with its own CSS custom properties
323
444
  - Pure layout CSS (margins, grid columns, flex gaps) → write directly in SCSS
324
445
  - Icon SVG fill colors → use `color` CSS property or the custom `--foreground` CSS property on the `igx-icon` host or its parent
446
+
447
+ 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.