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
@@ -0,0 +1,226 @@
1
+ # Figma Design Exploration
2
+
3
+ > **Part of the [`igniteui-angular-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 code**, not structured Angular metadata. The response is explicitly tagged *"SUPER CRITICAL: The generated React+Tailwind code MUST be converted to match the target project's technology stack."* Do **not** copy the React code into Angular files. Instead, 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
+ clientLanguages: "typescript",
105
+ clientFrameworks: "angular",
106
+ artifactType: "WEB_PAGE_OR_APP_SCREEN",
107
+ taskType: "CREATE_ARTIFACT"
108
+ })
109
+ ```
110
+ 3. From the React+Tailwind output, extract:
111
+
112
+ - **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.
113
+ - **Layout structure** — `flex`, `grid`, `gap-*`, `p-*`, `w-*`, `h-*` Tailwind classes on container divs
114
+ - **Typography** — `font-['...']`, `text-[...]`, `font-weight` classes
115
+ - **Surface colors** — `bg-[#XXXXXX]` classes on container `<div>` elements that wrap major sections (these become plain `<div>` wrappers in Angular with `background: #XXXXXX`)
116
+ - **Border/roundness** — `rounded-[...]`, `border`, `border-[...]` classes on containers and cards
117
+ - **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).
118
+ - **Chart series colors** — for any chart layer, note the fill colors on its series paths
119
+ - **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.
120
+ - **Measured control heights** — button, input, and list-row heights. Phase 3 uses them to pick `--ig-size`.
121
+ - **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
122
+ - **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.
123
+
124
+ 4. Record all surface containers for **Table B — Layout Surfaces** (Phase 1g).
125
+
126
+ ## 1e: Extract Design Tokens
127
+
128
+ > `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.
129
+
130
+ ```
131
+ // Remote variant
132
+ figma_get_variable_defs({ fileKey: "<fileKey>", nodeId: "<pageId>" })
133
+
134
+ // Desktop variant: the page's nodeId (check the response), or select the page and pass nothing
135
+ figma_get_variable_defs({ nodeId: "<pageId>" })
136
+ figma_get_variable_defs({})
137
+ ```
138
+
139
+ The response contains a map of variable names to values, e.g.:
140
+
141
+ ```
142
+ "color/primary/500": "#6200EE"
143
+ "color/surface": "#FFFFFF"
144
+ "typography/body/font-family": "Roboto"
145
+ ```
146
+
147
+ 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.
148
+
149
+ ## 1f: Classify Provenance and Normalize Components
150
+
151
+ Read [design-provenance.md](design-provenance.md) in full.
152
+
153
+ 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.
154
+ 2. Check for Code Connect mappings:
155
+
156
+ ```
157
+ figma_get_code_connect_map({ fileKey: "<fileKey>", nodeId: "<artboardId>" }) // remote variant
158
+ figma_get_code_connect_map({ nodeId: "<artboardId>" }) // desktop variant
159
+ ```
160
+
161
+ 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 selectors: the target is always Ignite UI for Angular.
162
+
163
+ 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.
164
+ 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`).
165
+ 5. Infer Tier C roles from structure and visuals. Mark them **low confidence**.
166
+ 6. Record the dominant tier. It selects the Phase 3 theming path (A or B).
167
+
168
+ ## 1g: Build the Decomposition Table
169
+
170
+ Before writing any code, produce **two tables** for **each artboard**.
171
+
172
+ ### Table A — Ignite UI Components
173
+
174
+ | Figma Layer Name | Tier | Kit / Source | Canonical Role + Props | Ignite UI Component | Confidence | Token Work | Suspected Anatomy Deltas | Data Type |
175
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
176
+ | _e.g._ `_NavBar` | A | Indigo.Design (Material) | `app-bar` | `IgxNavbarComponent` | high | — | — | n/a |
177
+ | _e.g._ `_Grid/Default` | A | Indigo.Design (Material) | `data-table` | `IgxGridComponent` | high | — | — | Tabular records |
178
+ | _e.g._ `Button` (`Variant=outline, Size=sm`) | B | shadcn/ui | `button` · medium · 32px | `igxButton="outlined"` | high | radius, casing, size | — | n/a |
179
+ | _e.g._ `Text field` (`Style=Filled`) | B | M3 Design Kit | `text-field` · filled · label-floating · 56px | `igx-input-group type="box"` | high | height, fill color | — | n/a |
180
+ | _e.g._ `Segmented button` | B | M3 Design Kit | `toggle-group` · 40px | `IgxButtonGroupComponent` | high | radius, colors | check icon on the selected segment | n/a |
181
+ | _e.g._ `Frame 427` | C | — | `tag` · pill · 24px | `IgxBadgeComponent` | low | radius, colors | — (confirm the role) | n/a |
182
+
183
+ - **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.
184
+ - **Suspected Anatomy Deltas** lists only structural differences that tokens, documented parts, and projected 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.
185
+
186
+ 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.
187
+
188
+ ### Table B — Layout Surfaces
189
+
190
+ Record every **non-IgxXxx container** that carries visual properties (background color, border, padding, shadow). These are plain `<div>` wrappers in Angular — 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.
191
+
192
+ | Figma Frame / Container Name | Background | Border-Radius | Padding | Border | Shadow | Encloses (child sections) |
193
+ | ---------------------------- | ---------- | ------------- | ------- | ------ | ------ | ------------------------- |
194
+ | _e.g._ `Budget Categories` | `#222222` | `4px` | `24px` | none | none | Categories list, Add button |
195
+ | _e.g._ `Friend Card` | `#222222` | `8px` | `24px 16px` | `1px solid #333` | none | Avatar, name, phone, email, buttons |
196
+
197
+ > **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 Angular 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.
198
+
199
+ 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.
200
+
201
+ ## 1h: Extract Image Assets
202
+
203
+ Read [references/asset-extraction.md](asset-extraction.md) in full before running any extraction.
204
+
205
+ **Zero-placeholder policy:** every image visible in the Figma design must be extracted and committed to `src/assets/` before Phase 4. Gradient placeholders are not acceptable.
206
+
207
+ **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.
208
+
209
+ 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 from other kits`).
210
+
211
+ **Use the four-tier decision tree from `asset-extraction.md`** (these asset tiers 1–4 are unrelated to the provenance Tiers A–C):
212
+
213
+ | Tier | Method | When to use |
214
+ | ---- | ------ | ----------- |
215
+ | **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 |
216
+ | **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 |
217
+ | **3** | `figma_get_screenshot` per node (`nodeId`, or the selection on desktop) | No REST access and no asset URL for this node |
218
+ | **4** | CSS gradient/color placeholder with `// TODO` comment | Only for confirmed pure-color fills — never as a shortcut |
219
+
220
+ After extraction, save assets to:
221
+ - `src/assets/images/` — raster images (PNG, JPG)
222
+ - `src/assets/icons/` — SVG icons and logos
223
+
224
+ Build a concise asset manifest (see `asset-extraction.md § Build an Asset Manifest`) so the implementation phase uses consistent paths.
225
+
226
+ 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.
@@ -2,8 +2,7 @@
2
2
 
3
3
  > **Part of the [`igniteui-angular-figma-to-app`](../SKILL.md) skill.**
4
4
  >
5
- > This file contains setup instructions for all four MCP servers required by this skill.
6
- > Configure all four before running the Figma-to-app workflow.
5
+ > This file contains setup instructions for all four MCP servers required by this skill. Configure all four before running the Figma-to-app workflow.
7
6
 
8
7
  ---
9
8
 
@@ -11,7 +10,7 @@
11
10
 
12
11
  | Server | Purpose | Verify with |
13
12
  | ------------------------------------------ | --------------------------------------------------- | ---------------------------------------------- |
14
- | **Figma** | Read artboard structure, screenshots, design tokens | `figma_get_metadata` (no nodeId) |
13
+ | **Figma** | Read artboard structure, screenshots, design tokens | `figma_get_metadata` tool schema |
15
14
  | **Ignite UI CLI** (`igniteui-cli`) | Component docs, API reference | `list_components` |
16
15
  | **Ignite UI Theming** (`igniteui-theming`) | Palette + component-level theming code | `theming_detect_platform` |
17
16
  | **Playwright** | Browser automation, screenshots, DOM measurement | `playwright_browser_navigate` to `about:blank` |
@@ -20,141 +19,122 @@
20
19
 
21
20
  ## 1. Figma MCP
22
21
 
23
- The Figma MCP server connects your AI tool to the Figma desktop app or a Figma file URL.
24
- It requires a **Figma personal access token**.
22
+ Figma provides two official MCP servers. Both are HTTP servers — there is **no npm package** to install for either one. Source: https://developers.figma.com/docs/figma-mcp-server/
25
23
 
26
- ### Get a Figma Access Token
24
+ | Server | URL | Authentication | How tools find a node |
25
+ | --- | --- | --- | --- |
26
+ | **Desktop** (local) | `http://127.0.0.1:3845/mcp` | None — the Figma desktop app must be running with the server enabled | The **file open in the desktop app**: the current selection, or the node ID taken from a pasted frame link |
27
+ | **Remote** | `https://mcp.figma.com/mcp` | Figma OAuth sign-in on first use | A **link** to a frame or layer, from which the file key and node ID are taken. No selection |
27
28
 
28
- 1. Open Figma → click your avatar (top-right) → **Settings**
29
- 2. Scroll to **Personal access tokens** → **Generate new token**
30
- 3. Give it a name (e.g. `mcp-agent`) → copy the token value
29
+ Prefer the **remote** server when the user can share file links: you can move between artboards without asking the user to click anything. Use the **desktop** server when the file is only available in the user's desktop app.
31
30
 
32
- ### VS Code
31
+ ### Desktop server
33
32
 
34
- Create or edit `.vscode/mcp.json`:
33
+ 1. In the Figma desktop app, open the design file and switch to **Dev Mode**.
34
+ 2. In the inspect panel's **MCP server** section, select **Enable desktop MCP server**. A confirmation appears at the bottom of the screen.
35
+ 3. Add the server to the client:
36
+
37
+ **VS Code** (`.vscode/mcp.json`):
35
38
 
36
- ~~~json
39
+ ```json
37
40
  {
38
41
  "servers": {
39
- "figma": {
40
- "command": "npx",
41
- "args": ["-y", "@figma/mcp@latest"],
42
- "env": {
43
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
44
- }
42
+ "figma-desktop": {
43
+ "type": "http",
44
+ "url": "http://127.0.0.1:3845/mcp"
45
45
  }
46
46
  }
47
47
  }
48
- ~~~
49
-
50
- ### Cursor
48
+ ```
51
49
 
52
- Create or edit `.cursor/mcp.json`:
50
+ **Cursor** (`.cursor/mcp.json`):
53
51
 
54
52
  ```json
55
53
  {
56
54
  "mcpServers": {
57
- "figma": {
58
- "command": "npx",
59
- "args": ["-y", "@figma/mcp@latest"],
60
- "env": {
61
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
62
- }
55
+ "figma-desktop": {
56
+ "url": "http://127.0.0.1:3845/mcp"
63
57
  }
64
58
  }
65
59
  }
66
60
  ```
67
61
 
68
- ### Claude Code
62
+ **Claude Code:**
69
63
 
70
64
  ```bash
71
- claude mcp add figma -- npx -y @figma/mcp@latest --figma-access-token YOUR_TOKEN_HERE
65
+ claude mcp add --transport http figma-desktop http://127.0.0.1:3845/mcp
72
66
  ```
73
67
 
74
- Or add the entry to the project's `.mcp.json` (created at the repo root):
68
+ **JetBrains IDEs:** **Settings → Tools → AI Assistant → MCP Servers → + Add MCP Server**, then add an HTTP server with the URL `http://127.0.0.1:3845/mcp`.
69
+
70
+ Official guide: https://developers.figma.com/docs/figma-mcp-server/local-server-installation/
71
+
72
+ ### Remote server
73
+
74
+ **VS Code** (`.vscode/mcp.json`):
75
75
 
76
76
  ```json
77
77
  {
78
- "mcpServers": {
78
+ "servers": {
79
79
  "figma": {
80
- "command": "npx",
81
- "args": ["-y", "@figma/mcp@latest"],
82
- "env": {
83
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
84
- }
80
+ "type": "http",
81
+ "url": "https://mcp.figma.com/mcp"
85
82
  }
86
83
  }
87
84
  }
88
85
  ```
89
86
 
90
- ### JetBrains IDEs
87
+ **Cursor:** use the one-click install link from Figma's guide, or add the same URL as an HTTP server in `.cursor/mcp.json`.
91
88
 
92
- 1. **Settings → Tools → AI Assistant → MCP Servers → + Add MCP Server**
93
- 2. Command: `npx`, Arguments: `-y @figma/mcp@latest`
94
- 3. Environment: `FIGMA_ACCESS_TOKEN=YOUR_TOKEN_HERE`
89
+ **Claude Code:**
95
90
 
96
- ### Figma Desktop App Plugin (Recommended)
91
+ ```bash
92
+ claude mcp add --transport http figma https://mcp.figma.com/mcp
93
+ ```
97
94
 
98
- If you use the Figma desktop app, the preferred setup is through the Figma MCP plugin for your editor. Follow Figma's official installation guide: https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/
95
+ The client opens Figma's OAuth flow the first time a tool is called.
99
96
 
100
- This approach connects to the currently open Figma file and the selected node without needing to pass node IDs manually.
97
+ Official guide: https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/
101
98
 
102
- > **Session-binding behaviour:** The Figma MCP tools (`figma_get_screenshot`,
103
- > `figma_get_design_context`, `figma_get_variable_defs`) always operate on the
104
- > **currently selected node in the Figma desktop app**. Any `nodeId` parameter passed
105
- > to these tools is **silently ignored** — the tool returns data for whatever is
106
- > selected, not for the specified ID.
107
- >
108
- > **Consequence:** you cannot programmatically navigate between artboards by passing
109
- > node IDs. To get screenshots or design context for a specific artboard you **must**
110
- > ask the user to click that artboard frame in Figma before calling the tool.
111
- >
112
- > The correct pattern in every Phase 1 step:
113
- > ```
114
- > // 1. Ask the user
115
- > "In Figma, please click the [Artboard Name] frame to select it, then confirm."
116
- > // 2. Wait for confirmation
117
- > // 3. Only then call the tool
118
- > figma_get_screenshot({})
119
- > figma_get_design_context({ clientLanguages: "typescript", clientFrameworks: "angular", ... })
120
- > ```
99
+ > Neither server needs a secret in the config file, so both entries are safe to commit.
121
100
 
122
- ### Verifying Figma MCP
101
+ ### Personal access token (REST API only)
123
102
 
124
- Call `figma_get_metadata` with **no `nodeId`**. It should return either:
103
+ The MCP servers do **not** use a personal access token. You need one only for the Figma **REST API** calls in this skill: Tier 1 asset export (`asset-extraction.md`) and reading exact variant properties (`design-provenance.md § Step 1`).
125
104
 
126
- - A list of top-level pages if something is selected in the Figma desktop app, or
127
- - A prompt to open a Figma file
105
+ 1. Figma → avatar → **Settings** → **Security** → **Personal access tokens** → **Generate new token**, with read access to file content.
106
+ 2. Ask the user to export it in the shell that runs the agent (`export FIGMA_TOKEN=…`). **Never** write it into a project file, `mcp.json`, or source control.
128
107
 
129
- > **Rate limits:** Starter plan: 6 calls/month · Organization: 200/day · Enterprise: 600/day.
130
- > Use `figma_get_metadata` for structural discovery and `figma_get_design_context` only for
131
- > target artboards to conserve quota.
108
+ Without a token, asset extraction falls back to Tier 2/3 and variant properties come from the design context only.
109
+
110
+ ### Verifying Figma MCP
111
+
112
+ Check that the Figma tools (`figma_get_metadata`, `figma_get_design_context`, …) are listed. Do not spend a call just to verify: View/Collab seats have very small quotas. Tell which server is connected from its **configured URL** (`127.0.0.1:3845` → desktop, `mcp.figma.com` → remote); see `figma-exploration.md` for how each is driven.
113
+
114
+ > **Rate limits** (per seat; 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 on Starter and Professional, and 600/day on Organization and Enterprise, with per-minute caps of 10–20. Use `figma_get_metadata` for structural discovery and `figma_get_design_context` only for target artboards to conserve quota.
132
115
 
133
116
  ### Troubleshooting Figma MCP
134
117
 
135
118
  | Problem | Fix |
136
119
  | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
137
- | `figma_get_metadata` returns an error | Token may be expired or invalid — regenerate it |
120
+ | `figma_get_metadata` returns an error | Desktop: the Figma desktop app is closed, the server is not enabled in Dev Mode, or no file is open. Remote: sign in again through OAuth |
138
121
  | Tools not available after config | Restart the editor/IDE |
139
122
  | `File not found` | Verify the Figma file URL is correct and you have access |
140
- | 6 calls/month exceeded | Upgrade to an Organization plan or use the Figma REST API with a personal access token for higher-volume development work |
123
+ | Monthly/daily call quota exceeded | A View/Collab seat allows 6 calls/month (20 on Starter) — use a Dev/Full seat, or the Figma REST API with a personal access token for metadata and assets |
141
124
 
142
125
  ---
143
126
 
144
127
  ## 2. Ignite UI CLI MCP (`igniteui-cli`)
145
128
 
146
- > **Projects created with `npx igniteui-cli new` already have this configured.**
147
- > `npx igniteui-cli new` writes the Ignite UI CLI MCP entry into `.vscode/mcp.json`
148
- > automatically during scaffolding. For existing projects that lack this config, run:
129
+ > **Projects created with `npx igniteui-cli new` already have this configured.** `npx igniteui-cli new` runs the same setup as `ai-config`: it adds both `igniteui-cli` and `igniteui-theming` to the config file of the assistant chosen with `--assistants` (`.mcp.json` by default). For existing projects that lack this config, run:
149
130
  >
150
131
  > ```bash
151
132
  > npx -y igniteui-cli ai-config
152
133
  > ```
153
134
  >
154
- > This configures **both** the `igniteui-cli` and `igniteui-theming` MCP servers and copies
155
- > the Agent Skills in one step, preserving existing server entries. Only follow the manual
156
- > steps below (and in section 3) when `npx igniteui-cli ai-config` is not available or you
157
- > need to configure an editor it does not cover.
135
+ > This configures **both** the `igniteui-cli` and `igniteui-theming` MCP servers and copies the Agent Skills in one step, preserving existing server entries. Agents should run it themselves rather than asking the user to. Only follow the manual steps below (and in section 3) when `npx igniteui-cli ai-config` is not available or you need to configure an editor it does not cover.
136
+ >
137
+ > When `igniteui-cli` is installed globally (`npm install -g igniteui-cli`), `ig ai-config` and `ig mcp` are equivalent to the `npx` commands, and a server entry can use `"command": "ig", "args": ["mcp"]`.
158
138
 
159
139
  ### VS Code
160
140
 
@@ -220,8 +200,7 @@ The `list_components` tool should return a full component list for the Angular f
220
200
 
221
201
  ## 3. Ignite UI Theming MCP (`igniteui-theming`)
222
202
 
223
- > **`npx -y igniteui-cli ai-config` configures this server too** (see section 2). Use the
224
- > manual steps below only when `ai-config` is unavailable or doesn't cover your editor.
203
+ > **`npx -y igniteui-cli ai-config` configures this server too** (see section 2). Use the manual steps below only when `ai-config` is unavailable or doesn't cover your editor.
225
204
 
226
205
  ### VS Code
227
206
 
@@ -281,8 +260,7 @@ Or add the entry to the project's `.mcp.json` (created at the repo root):
281
260
 
282
261
  Ask your AI assistant: _"Detect which Ignite UI platform my project uses."_
283
262
 
284
- The `theming_detect_platform` tool should analyze your `package.json` and return the
285
- detected platform (e.g., `angular`, `angular-licensed`).
263
+ The `theming_detect_platform` tool should analyze your `package.json` and return the detected platform (`angular`). Licensed projects (`@infragistics/igniteui-angular`) are also detected as `angular`, with `licensed: true`.
286
264
 
287
265
  ---
288
266
 
@@ -344,7 +322,7 @@ Or add the entry to the project's `.mcp.json` (created at the repo root):
344
322
 
345
323
  ### Verifying Playwright MCP
346
324
 
347
- Navigate to a URL: _"Navigate the browser to `https://example.com`."_
325
+ Navigate to a URL: _"Navigate the browser to `about:blank`."_
348
326
 
349
327
  The `playwright_browser_navigate` tool should open the page without error.
350
328
 
@@ -355,20 +333,18 @@ The `playwright_browser_navigate` tool should open the page without error.
355
333
  | Screenshots are blank | Make sure the dev server is running (`npm start`) |
356
334
  | Page resets to `about:blank` after resize | Always re-navigate after `playwright_browser_resize` |
357
335
  | Console shows `ERR_CONNECTION_REFUSED` | The Angular dev server is not running |
358
- | `browser_evaluate` fails with `__name is not defined` | Pass code using the `function` parameter (not `script`): `playwright_browser_evaluate({ function: "() => { ... }" })` |
336
+ | `browser_evaluate` fails with _"Invalid input: expected string, received undefined"_ | Pass code using the `function` parameter (not `script`): `playwright_browser_evaluate({ function: "() => { ... }" })` |
359
337
  | `playwright_browser_take_screenshot` returns empty | Re-navigate to the target URL first |
360
338
 
361
339
  ---
362
340
 
363
341
  ## Combined JSON Config (All Four Servers)
364
342
 
365
- > **If your project was created with `npx igniteui-cli new`:** the Ignite UI CLI entry is already in
366
- > `.vscode/mcp.json`. Open that file and **add only the three entries below** (Figma,
367
- > Ignite UI Theming, Playwright) to the existing `"servers"` block — do not duplicate
368
- > the `igniteui-cli` entry.
343
+ > **If your project was created with `npx igniteui-cli new`:** `igniteui-cli` and `igniteui-theming` are already in your client's config file (the one chosen with `--assistants`; `.mcp.json` by default). Add only the Figma and Playwright entries below — do not duplicate the others.
369
344
  >
370
345
  > **Fresh setup (no existing `.vscode/mcp.json`):** use the complete blocks below.
371
- > Replace `YOUR_TOKEN_HERE` with your actual Figma personal access token.
346
+ >
347
+ > The blocks use Figma's **remote** server. To use the desktop server instead, replace the `figma` entry with the desktop entry from section 1 (`http://127.0.0.1:3845/mcp`). No Figma token belongs in these files.
372
348
 
373
349
  ### VS Code (`.vscode/mcp.json`)
374
350
 
@@ -376,11 +352,8 @@ The `playwright_browser_navigate` tool should open the page without error.
376
352
  {
377
353
  "servers": {
378
354
  "figma": {
379
- "command": "npx",
380
- "args": ["-y", "@figma/mcp@latest"],
381
- "env": {
382
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
383
- }
355
+ "type": "http",
356
+ "url": "https://mcp.figma.com/mcp"
384
357
  },
385
358
  "igniteui-cli": {
386
359
  "command": "npx",
@@ -404,11 +377,7 @@ The `playwright_browser_navigate` tool should open the page without error.
404
377
  {
405
378
  "mcpServers": {
406
379
  "figma": {
407
- "command": "npx",
408
- "args": ["-y", "@figma/mcp@latest"],
409
- "env": {
410
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
411
- }
380
+ "url": "https://mcp.figma.com/mcp"
412
381
  },
413
382
  "igniteui-cli": {
414
383
  "command": "npx",
@@ -432,11 +401,8 @@ The `playwright_browser_navigate` tool should open the page without error.
432
401
  {
433
402
  "mcpServers": {
434
403
  "figma": {
435
- "command": "npx",
436
- "args": ["-y", "@figma/mcp@latest"],
437
- "env": {
438
- "FIGMA_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
439
- }
404
+ "type": "http",
405
+ "url": "https://mcp.figma.com/mcp"
440
406
  },
441
407
  "igniteui-cli": {
442
408
  "command": "npx",
@@ -0,0 +1,63 @@
1
+ # Project Detection and Scaffolding
2
+
3
+ > **Part of the [`igniteui-angular-figma-to-app`](../SKILL.md) skill.**
4
+ >
5
+ > Use this file in Phase 0b to detect an existing Ignite UI Angular project or scaffold a new one. Read in full before checking the project or running `igniteui-cli new`.
6
+
7
+ Check whether the current working directory contains a valid Angular + Ignite UI project:
8
+
9
+ ```
10
+ 1. Does package.json exist?
11
+ 2. Does it list "igniteui-angular" OR "@infragistics/igniteui-angular" in dependencies?
12
+ 3. Is there a src/app/ directory?
13
+ ```
14
+
15
+ **If a valid project is found:**
16
+
17
+ - Note the package layout: `igniteui-angular` (open-source) or `@infragistics/igniteui-angular` (licensed)
18
+ - Note the Angular version from `package.json`
19
+ - **Check the MCP configuration for all four required server entries** — a Figma entry (`figma` or `figma-desktop`), `igniteui-cli`, `igniteui-theming`, and `playwright` in the config file your client reads (`.mcp.json`, `.vscode/mcp.json`, `.cursor/mcp.json`, …). If `igniteui-cli` or `igniteui-theming` is missing, run `npx -y igniteui-cli ai-config` (or `ig ai-config` when `igniteui-cli` is installed globally) from the project root yourself — it configures both servers and copies the Agent Skills, preserving existing entries. Add a missing Figma entry and `playwright` from [references/mcp-setup.md](mcp-setup.md). Projects scaffolded with `npx igniteui-cli new` already have `igniteui-cli` **and** `igniteui-theming`; they typically lack Figma and Playwright. A reload is required before newly configured servers' tools appear.
20
+ - Inform the user: "Found existing Ignite UI Angular project. Proceeding with the Figma workflow."
21
+
22
+ **If no valid project is found:** Present this message and wait for the user’s choice:
23
+
24
+ > “No Ignite UI Angular project found in the current directory. Would you like me to scaffold a new one using the Ignite UI CLI before implementing the Figma design?
25
+ >
26
+ > `npx -y igniteui-cli new` creates a project pre-configured with Ignite UI Angular, a starter theme (prebuilt CSS or Sass), and the Ignite UI CLI and Theming MCP servers configured for your coding assistant. No global install required.
27
+ >
28
+ > Alternatively, point me at an existing project directory.”
29
+
30
+ If the user confirms scaffolding:
31
+
32
+ 1. Ask for a project name. If the user has already shared a Figma URL, suggest a name derived from the Figma file name; otherwise prompt.
33
+
34
+ 2. Choose the project template based on the artboard structure. Because Phase 1 has not run yet, use the lightest signal available:
35
+
36
+ | Signal | Template to use |
37
+ | -------------------------------------------------------------------- | ------------------------------------------------ |
38
+ | User mentions a sidebar, navigation drawer, or multiple routed views | `side-nav` |
39
+ | No strong signal — default | `empty` (routing + home page; easiest to extend) |
40
+
41
+ 3. Create the project:
42
+
43
+ ```bash
44
+ npx -y igniteui-cli new <project-name> --framework=angular --type=igx-ts --template=<empty|side-nav> --assistants=<generic|vscode|cursor|gemini|junie> --agents=<generic|claude|copilot|cursor|…>
45
+ ```
46
+
47
+ `--assistants` picks the MCP config file: `generic` → `.mcp.json` (the default; Claude Code, GitHub Copilot, and others), `vscode` → `.vscode/mcp.json`, `cursor` → `.cursor/mcp.json`, `gemini` → `.gemini/settings.json`, `junie` → `.junie/mcp/mcp.json`. `--agents` picks where the Agent Skills are copied (`generic` → `.agents/skills`, `claude` → `.claude/skills`, `copilot` → `.github/skills`, …). Pass both: without them the CLI asks interactively.
48
+
49
+ This produces a standard Angular workspace fully compatible with `ng` commands, and additionally:
50
+ - Installs and configures `igniteui-angular` with a theme: either a prebuilt theme CSS in the `angular.json` `styles` array, or a starter Sass theme in `styles.scss` (Phase 3a treats both as "no theme")
51
+ - Runs the `ai-config` setup: adds the `igniteui-cli` **and** `igniteui-theming` MCP servers to the chosen assistant's config file, and copies the Agent Skills for the chosen agents
52
+
53
+ 4. `cd <project-name>`.
54
+
55
+ 5. Add the Figma and Playwright entries from [mcp-setup.md](mcp-setup.md) to the same config file the scaffold wrote (the one for `--assistants`).
56
+
57
+ 6. Confirm the project builds:
58
+ ```bash
59
+ npx ng build
60
+ ```
61
+ Do not run `npm start` in the foreground: the dev server never exits. Start it in the background, or ask the user to run it, when Phase 5 needs it.
62
+
63
+ 7. The new servers and the new folder only take effect in a new session. Ask the user to **reopen the editor or agent session in the new project folder**, then stop. Phase 1 continues in that session.