@discourser/design-system 0.24.0 → 0.25.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 (105) hide show
  1. package/dist/{chunk-KIJKNZ73.cjs → chunk-QNCZYFUJ.cjs} +46 -11
  2. package/dist/chunk-QNCZYFUJ.cjs.map +1 -0
  3. package/dist/{chunk-VOH2QELR.cjs → chunk-TBLDQATQ.cjs} +377 -12
  4. package/dist/chunk-TBLDQATQ.cjs.map +1 -0
  5. package/dist/{chunk-VN2QX6S7.js → chunk-UHSL4N44.js} +378 -14
  6. package/dist/chunk-UHSL4N44.js.map +1 -0
  7. package/dist/{chunk-HN2IHIMR.js → chunk-ZPECW4N2.js} +46 -11
  8. package/dist/chunk-ZPECW4N2.js.map +1 -0
  9. package/dist/components/Badge.figma.d.ts +2 -0
  10. package/dist/components/Badge.figma.d.ts.map +1 -0
  11. package/dist/components/Button.figma.d.ts +2 -0
  12. package/dist/components/Button.figma.d.ts.map +1 -0
  13. package/dist/components/Card.figma.d.ts +2 -0
  14. package/dist/components/Card.figma.d.ts.map +1 -0
  15. package/dist/components/Icons/AudienceIcon.d.ts.map +1 -1
  16. package/dist/components/Input.figma.d.ts +2 -0
  17. package/dist/components/Input.figma.d.ts.map +1 -0
  18. package/dist/components/RadioGroup.figma.d.ts +2 -0
  19. package/dist/components/RadioGroup.figma.d.ts.map +1 -0
  20. package/dist/components/SettingsPopover/SettingsPopover.figma.d.ts +2 -0
  21. package/dist/components/SettingsPopover/SettingsPopover.figma.d.ts.map +1 -0
  22. package/dist/components/Slider.figma.d.ts +2 -0
  23. package/dist/components/Slider.figma.d.ts.map +1 -0
  24. package/dist/components/Stepper/Stepper.figma.d.ts +2 -0
  25. package/dist/components/Stepper/Stepper.figma.d.ts.map +1 -0
  26. package/dist/components/StudioControls/StudioControls.d.ts +3 -0
  27. package/dist/components/StudioControls/StudioControls.d.ts.map +1 -0
  28. package/dist/components/StudioControls/StudioControls.figma.d.ts +2 -0
  29. package/dist/components/StudioControls/StudioControls.figma.d.ts.map +1 -0
  30. package/dist/components/StudioControls/index.d.ts +3 -0
  31. package/dist/components/StudioControls/index.d.ts.map +1 -0
  32. package/dist/components/StudioControls/types.d.ts +17 -0
  33. package/dist/components/StudioControls/types.d.ts.map +1 -0
  34. package/dist/components/Switch.figma.d.ts +2 -0
  35. package/dist/components/Switch.figma.d.ts.map +1 -0
  36. package/dist/components/index.cjs +78 -74
  37. package/dist/components/index.d.ts +1 -0
  38. package/dist/components/index.d.ts.map +1 -1
  39. package/dist/components/index.js +1 -1
  40. package/dist/figma-codex/parser.d.ts +2 -0
  41. package/dist/figma-codex/parser.d.ts.map +1 -1
  42. package/dist/figma-codex/resolver.d.ts.map +1 -1
  43. package/dist/figma-codex/schema.d.ts +7 -0
  44. package/dist/figma-codex/schema.d.ts.map +1 -1
  45. package/dist/figma-codex.json +420 -2
  46. package/dist/index.cjs +82 -78
  47. package/dist/index.js +2 -2
  48. package/dist/preset/index.cjs +2 -2
  49. package/dist/preset/index.js +1 -1
  50. package/dist/preset/recipes/badge.d.ts.map +1 -1
  51. package/dist/preset/recipes/index.d.ts +1 -0
  52. package/dist/preset/recipes/index.d.ts.map +1 -1
  53. package/dist/preset/recipes/studio-controls.d.ts +2 -0
  54. package/dist/preset/recipes/studio-controls.d.ts.map +1 -0
  55. package/dist/preset/recipes/switch.d.ts.map +1 -1
  56. package/docs/figma-mcp-return/card-audit.json +31 -0
  57. package/docs/figma-mcp-return/conversation-prelaunch-audit.json +51 -0
  58. package/docs/figma-mcp-return/conversation_lobby-design-context.md +359 -0
  59. package/docs/figma-mcp-return/conversation_lobby-metadata.xml +1 -0
  60. package/docs/figma-mcp-return/discourser-accordion-audit.json +264 -0
  61. package/docs/figma-mcp-return/discourser-accordion-design-context-v2.tsx +350 -0
  62. package/docs/figma-mcp-return/discourser-accordion-design-context.tsx +130 -0
  63. package/docs/figma-mcp-return/discourser-accordion-metadata-v2.xml +1 -0
  64. package/docs/figma-mcp-return/discourser-accordion-metadata.xml +1 -0
  65. package/docs/figma-mcp-return/kai-resolution-simulation.md +181 -0
  66. package/docs/figma-mcp-return/prelaunch-comparison-analysis.md +126 -0
  67. package/docs/figma-mcp-return/prelaunch-get-design-context.md +982 -0
  68. package/docs/figma-mcp-return/prelaunch-get-metadata.md +7 -0
  69. package/docs/figma-mcp-return/prelaunch-get-metadata.xml +3 -0
  70. package/docs/figma-mcp-return/prelaunch-post-component-update.md +791 -0
  71. package/docs/figma-mcp-return/prelaunch-post-rebind-design-context.md +969 -0
  72. package/docs/figma-mcp-return/radio-group-audit.json +23 -0
  73. package/docs/figma-mcp-return/switch-audit.json +38 -0
  74. package/docs/session-summary-2026-03-29.md +98 -0
  75. package/package.json +2 -1
  76. package/src/components/Badge.figma.tsx +39 -0
  77. package/src/components/Button.figma.tsx +18 -0
  78. package/src/components/Card.figma.tsx +33 -0
  79. package/src/components/Icons/AudienceIcon.tsx +3 -1
  80. package/src/components/Icons/AudioSpeakerIcon.tsx +1 -1
  81. package/src/components/Icons/MicrophoneIcon.tsx +3 -3
  82. package/src/components/Icons/RecordIcon.tsx +4 -4
  83. package/src/components/Icons/TimerIcon.tsx +1 -1
  84. package/src/components/Input.figma.tsx +17 -0
  85. package/src/components/RadioGroup.figma.tsx +61 -0
  86. package/src/components/SettingsPopover/SettingsPopover.figma.tsx +17 -0
  87. package/src/components/Slider.figma.tsx +66 -0
  88. package/src/components/Stepper/Stepper.figma.tsx +19 -0
  89. package/src/components/StudioControls/StudioControls.figma.tsx +25 -0
  90. package/src/components/StudioControls/StudioControls.tsx +381 -0
  91. package/src/components/StudioControls/index.ts +2 -0
  92. package/src/components/StudioControls/types.ts +17 -0
  93. package/src/components/Switch.figma.tsx +49 -0
  94. package/src/components/index.ts +5 -0
  95. package/src/figma-codex/parser.ts +55 -0
  96. package/src/figma-codex/resolver.ts +1 -0
  97. package/src/figma-codex/schema.ts +9 -0
  98. package/src/preset/recipes/badge.ts +41 -7
  99. package/src/preset/recipes/index.ts +1 -0
  100. package/src/preset/recipes/studio-controls.ts +252 -0
  101. package/src/preset/recipes/switch.ts +5 -4
  102. package/dist/chunk-HN2IHIMR.js.map +0 -1
  103. package/dist/chunk-KIJKNZ73.cjs.map +0 -1
  104. package/dist/chunk-VN2QX6S7.js.map +0 -1
  105. package/dist/chunk-VOH2QELR.cjs.map +0 -1
@@ -0,0 +1,181 @@
1
+ # Kai Resolution Simulation — Conversation Prelaunch (66:2739)
2
+ ## Post-Rebind Analysis: What Kai Can and Cannot Resolve
3
+
4
+ ---
5
+
6
+ ## 1. Component Resolution (via figma-codex.json)
7
+
8
+ Kai cross-references `data-name` attributes against figma-codex component names.
9
+
10
+ ### ✅ RESOLVES to DDS component
11
+ | data-name in MCP output | figma-codex match | DDS import |
12
+ |---|---|---|
13
+ | `DiscourserLogo` | DiscourserLogo (node 491:4933) | `import { DiscourserLogo } from '@discourser/design-system/Icons/DiscourserLogo'` |
14
+ | `Navigation Menu` | NavigationMenu (node 38:8485) | `import * as NavigationMenu from '@discourser/design-system/NavigationMenu'` |
15
+ | `StudioControlsMenu` | StudioControls (node 38:8232) | `import { StudioControls } from '@discourser/design-system/StudioControls'` |
16
+ | `Breadcrumb` | Breadcrumb (node 38:7978) | `import * as Breadcrumb from '@discourser/design-system/Breadcrumb'` |
17
+ | `Discourser Button` | Button (node 38:7993) | `import { Button } from '@discourser/design-system/Button'` |
18
+ | `Badge` | Badge (node 0:0 placeholder) | `import { Badge } from '@discourser/design-system/Badge'` |
19
+ | `Slider` / `.Slider Item` | Slider (node 38:7988) | `import * as Slider from '@discourser/design-system/Slider'` |
20
+ | `Radio Group` / `.Radio Group Item` | RadioGroup (node 38:8757) | `import * as RadioGroup from '@discourser/design-system/RadioGroup'` |
21
+ | `Discourser AI Switch Toggle` / `Switch` | Switch (node 38:8121) | `import * as Switch from '@discourser/design-system/Switch'` |
22
+
23
+ ### ⚠️ PARTIAL — Recognized but needs interpretation
24
+ | data-name | What Kai sees | Gap |
25
+ |---|---|---|
26
+ | `SettingsPopover` (via `PopOver` component) | SettingsPopover exists in codex (node 810:5398) | MCP splits it into PopOver + Logout sub-components — Kai needs to reassemble |
27
+ | `Discourse Accordion Item (Info Panel)` etc. | Accordion exists in codex (node 38:8232) | These are domain-specific panels, not generic Accordion — Kai uses StudioControls instead |
28
+ | `LoggedInAvatar` | Not in codex | Kai would need to fall back to Storybook MCP for Avatar component |
29
+
30
+ ### ❌ NOT in codex — falls back to Storybook MCP or raw code
31
+ | data-name | What it is | Resolution path |
32
+ |---|---|---|
33
+ | `ListItem` / `Expandable List Item` | NavigationMenu internal parts | Covered by NavigationMenu composite — not separate |
34
+ | `icon-Front` / `icon-Back` / Lucide Icons | Icon components | DDS has icon .figma.tsx files but these are Figma's Lucide instances |
35
+ | `Heading 2` | Georgia Bold 24px header | Raw text styling — no DDS heading component for this |
36
+ | `Clock` | Custom timer display | App-specific, not a DDS component |
37
+ | `Instructions Container` | Content card | Could use Card component — Kai needs to infer |
38
+
39
+ ---
40
+
41
+ ## 2. Color Token Resolution
42
+
43
+ ### ✅ Variables that resolve directly via figma-token-resolution.md
44
+
45
+ | var() in MCP output | Token resolution path | DDS Panda CSS |
46
+ |---|---|---|
47
+ | `var(--neutral/99,#fdfcf5)` | Primitive → neutral/99 | `bg="neutral.99"` or `token('colors.surface')` |
48
+ | `var(--neutral/90,#e3e3db)` | Primitive → neutral/90 | `token('colors.surface.container.high')` |
49
+ | `var(--neutral/30,#464742)` | Primitive → neutral/30 | `token('colors.onSurface.variant')` |
50
+ | `var(--neutral/20,#30312c)` | Primitive → neutral/20 | `token('colors.onSurface')` approx |
51
+ | `var(--neutral/40,#5e5f59)` | Primitive → neutral/40 | Muted text |
52
+ | `var(--neutral/80,#c7c7c0)` | Primitive → outline/variant border | `token('colors.outline.variant')` |
53
+ | `var(--neutral/0,black)` | Primitive → black | Stage background |
54
+ | `var(--secondary/50,#6c7d56)` | Primitive → secondary | `token('colors.secondary')` |
55
+ | `var(--secondary/80,#bbcda1)` | Primitive → secondary/container | `token('colors.secondary.container')` |
56
+ | `var(--primary/80,#97d945)` | Primitive → inverse/primary | `token('colors.inverse.primary')` |
57
+ | `var(--primary/99,#f9ffe9)` | Primitive → near-white tint | `token('colors.primary.palette.99')` |
58
+ | `var(--primary/10,#102000)` | Primitive → dark green | Clock background |
59
+ | `var(--primary/60,#64a104)` | Primitive → accent | RadioGroup selected border |
60
+ | `var(--neutralvariant/95,#eff2e3)` | Primitive → light tint | `token('colors.surface.container.low')` |
61
+ | `var(--neutralvariant/10,#191d14)` | Primitive → dark text | Section header text |
62
+ | `var(--neutralvariant/80,#c5c8ba)` | Primitive → outline/variant | SettingsPopover border |
63
+ | `var(--surface,#f9faef)` | **Semantic** → surface | `token('colors.surface')` ✨ |
64
+ | `var(--surface/container,#eeefe3)` | **Semantic** → surface/container | `token('colors.surface.container')` ✨ |
65
+ | `var(--surface/container/high,#e8e9de)` | **Semantic** → surface/container/high | `token('colors.surface.container.high')` ✨ |
66
+ | `var(--shadow,black)` | **Semantic** → shadow | `token('colors.shadow')` ✨ |
67
+
68
+ The ✨ items are the ones we **fixed this session** — previously these were shadcn-named (`foreground`, `border`, etc.) or old-library (`surfacecontainerhigh`).
69
+
70
+ ### ✅ Spacing/Shape variables that resolve
71
+ | var() in MCP output | DDS token |
72
+ |---|---|
73
+ | `var(--spacing/xl,32px)` | `p="xl"` |
74
+ | `var(--spacing/xxl,48px)` | `p="xxl"` |
75
+ | `var(--spacing/md,16px)` | `p="md"` |
76
+ | `var(--radii/small,8px)` | `borderRadius="small"` |
77
+ | `var(--radii/medium,12px)` | `borderRadius="medium"` |
78
+ | `var(--radii/large,16px)` | `borderRadius="large"` |
79
+ | `var(--border/thin,1px)` | `borderWidth="thin"` |
80
+
81
+ ### ⚠️ Hardcoded hex that Kai CAN resolve via hex lookup
82
+ | Hex | figma-token-resolution.md match | DDS token |
83
+ |---|---|---|
84
+ | `#1b1c18` | onSurface | `token('colors.onSurface')` |
85
+ | `#30312c` | neutral/20 → onSurface approx | `token('colors.onSurface')` |
86
+ | `#363636` | Black/Neutral/30%/600 style | **NOT in DDS** — closest `onSurface` |
87
+ | `#2e2e2e` | Black/Neutral/30%/700 style | **NOT in DDS** — closest `onSurface` |
88
+ | `#464742` | neutral/30 | `token('colors.onSurface.variant')` |
89
+ | `#6c7d56` | secondary/50 | `token('colors.secondary')` |
90
+ | `#97d945` | primary/80 | `token('colors.inverse.primary')` |
91
+ | `#e3e3db` | neutral/90 | `token('colors.surface.container.high')` |
92
+ | `#eeefe3` | surfacecontainer | `token('colors.surface.container')` |
93
+ | `#e8e9de` | surfacecontainerhigh | `token('colors.surface.container.high')` |
94
+ | `#fdfcf5` | neutral/99 | near-white surface |
95
+ | `#f9faef` | surface | `token('colors.surface')` |
96
+ | `#f2f1e9` | neutral/95 | `token('colors.surface.container.low')` |
97
+ | `#eff2e3` | neutralvariant/95 | `token('colors.surface.container.low')` |
98
+ | `#f9ffe9` | primary/99 | near-white primary tint |
99
+ | `#bbcda1` | secondary/80 | `token('colors.secondary.container')` |
100
+ | `#abaca5` | neutral/70 | border color |
101
+
102
+ ### ❌ Hardcoded hex Kai CANNOT resolve — NOT in token resolution tables
103
+ | Hex | Where used | Problem |
104
+ |---|---|---|
105
+ | `#363636` | Text throughout (accordion triggers, nav) | Local style "Black/Neutral/30%/600" — not a DDS variable |
106
+ | `#2e2e2e` | Bullet text | Local style "Black/Neutral/30%/700" — not a DDS variable |
107
+ | `#4a5565` | Scenario Settings subtext | Unknown — possibly from old design |
108
+ | `#c5d24d` | Primary/500 — Switch on, Badge bg accent | Local Figma style, NOT variable-bound |
109
+ | `rgba(192,209,92,0.4)` | Primary/Beginner/40% — Badge, Switch off | Local style with opacity |
110
+ | `#b8a9c9` | Accent/500 — Slider thumb | Local Figma style |
111
+ | `#cfc4db` | Accent/400 — Slider thumb border | Local Figma style |
112
+ | `#6b7a1f` | Primary/700 — Slider range fill | Local Figma style |
113
+ | `#e0dcd5` | Gray/Neutral/30%/500 — Slider track | Local Figma style |
114
+ | `#f5f1eb` | Stone/60%/500 — Accordion borders | Local Figma style |
115
+ | `#faf8f5` | Stone/60%/400 — Stage bg | Local Figma style |
116
+ | `#fffdfa` | Info Panel bg | Unknown |
117
+ | `#e5e7eb` | RightControlPanel border | Likely Tailwind gray-200 default — from old library |
118
+ | `#91918b` | neutral/60 text | In var() but not in hex table |
119
+
120
+ ---
121
+
122
+ ## 3. Typography Resolution
123
+
124
+ | Figma style detected | Font | Size/Weight | Kai resolution |
125
+ |---|---|---|---|
126
+ | `headlineMedium` | Fraunces 28px/400 | ✅ `textStyle="headlineMedium"` |
127
+ | `bodyLarge` / `bodyLargeReg` / `bodyLargeSemiBold` | Poppins 18px/400-600 | ✅ `textStyle="bodyLarge"` |
128
+ | `bodyMedium` | Poppins 14px/400 | ✅ `textStyle="bodyMedium"` |
129
+ | Georgia Bold 24px | `Dsktp/Georgia/H4/SemiB/24` | ❌ Not in DDS typography scale — "Studio Controls" header |
130
+ | Inter Regular 18px | Nav labels | ❌ Inter not in DDS typography — Figma uses Inter, DDS uses Poppins |
131
+ | Inter Medium 20px | Accordion triggers | ❌ Inter not in DDS typography |
132
+ | Inter Medium 16px | Nav sub-items | ❌ Inter not in DDS typography |
133
+
134
+ **Key gap:** The nav and accordion use Inter font, but DDS typography is Poppins for body/UI. This is a design-code mismatch Kai would flag.
135
+
136
+ ---
137
+
138
+ ## 4. Summary: Kai's Fidelity Estimate
139
+
140
+ ### What resolves cleanly: ~70%
141
+ - Page structure (3-column layout) — fully understood
142
+ - 9 DDS components identified via codex
143
+ - 20+ color variables resolve through Primitive/Semantic tables
144
+ - Spacing, radius, border tokens all resolve
145
+ - Core typography (headlineMedium, bodyLarge, bodyMedium) resolves
146
+
147
+ ### What requires inference or workaround: ~15%
148
+ - 14 hardcoded hex values need hex lookup table (most DO match)
149
+ - Typography font mismatch (Inter in Figma vs Poppins in DDS)
150
+ - SettingsPopover needs reassembly from sub-components
151
+ - Instructions Container should map to Card but isn't explicitly named
152
+
153
+ ### What Kai can't resolve: ~15%
154
+ - `#363636` / `#2e2e2e` text colors — not in any DDS token table
155
+ - `#c5d24d` Primary/500 and Accent palette — local Figma styles, no variables
156
+ - `#e5e7eb` border — leftover Tailwind default
157
+ - `#4a5565` subtext — unknown origin
158
+ - Georgia Bold 24px — not in DDS type scale
159
+ - `#fffdfa` panel bg — not in any table
160
+
161
+ ---
162
+
163
+ ## 5. Recommended Next Actions (priority order)
164
+
165
+ ### HIGH — Would move fidelity from ~70% to ~85%
166
+ 1. **Create Figma variables for the Accent palette** (`#b8a9c9`, `#cfc4db`, `#6b5a7d`, `#8d7ea3`) and Primary/500 (`#c5d24d`). These are used on sliders, switches, and badges but have no variable bindings.
167
+
168
+ 2. **Replace `#363636` and `#2e2e2e` with `onSurface` or `onSurface/variant`** on text nodes. These are local styles that should be variable-bound.
169
+
170
+ 3. **Add `#363636`, `#2e2e2e`, and `#4a5565` to Kai's hex lookup table** as interim measure while Figma bindings are fixed.
171
+
172
+ ### MEDIUM — Would move to ~90%
173
+ 4. **Resolve the Inter vs Poppins typography mismatch** — decide whether nav/accordion should use Poppins (DDS standard) or if Inter is intentional for these contexts.
174
+
175
+ 5. **Replace `#e5e7eb` border** on RightControlPanel with `outline/variant` variable.
176
+
177
+ 6. **Create `#fffdfa` → near-white token** or map to existing `neutral/99`.
178
+
179
+ ### LOW — Polish
180
+ 7. Update Figma component descriptions to point to DDS Storybook instead of shadcn docs.
181
+ 8. Explore `add_code_connect_map` to get MCP to return DDS imports directly.
@@ -0,0 +1,126 @@
1
+ # Design Context Comparison: Node 66:2739 (Conversation Prelaunch)
2
+
3
+ **Before:** `conversation_lobby-design-context.md` (remote MCP, ~March 27)
4
+ **After:** `prelaunch-get-design-context.md` (desktop MCP, March 29, post-codex update)
5
+
6
+ ---
7
+
8
+ ## Key Difference: Desktop MCP Returns Much Richer Data
9
+
10
+ The desktop MCP (localhost:3845) returns significantly more detail than the remote MCP:
11
+
12
+ ### Variable References — MAJOR IMPROVEMENT
13
+
14
+ The desktop MCP output uses CSS custom property syntax with fallback values, revealing
15
+ the actual Figma variable bindings. Examples from the after pull:
16
+
17
+ - `var(--surfacecontainerhigh,#e8e9de)` — variable bound with hex fallback
18
+ - `var(--neutral\/90,#e3e3db)` — Primitive collection
19
+ - `var(--neutral\/99,#fdfcf5)` — Primitive collection
20
+ - `var(--neutral\/0,black)` — Primitive collection
21
+ - `var(--secondary\/50,#6c7d56)` — Primitive collection
22
+ - `var(--secondary\/80,#bbcda1)` — Primitive collection
23
+ - `var(--primary\/80,#97d945)` — Primitive collection
24
+ - `var(--primary\/99,#f9ffe9)` — Primitive collection
25
+ - `var(--primary\/10,#102000)` — Primitive collection
26
+ - `var(--primary\/60,#64a104)` — Primitive collection (RadioGroup border)
27
+ - `var(--neutral\/20,#30312c)` — Primitive collection
28
+ - `var(--neutral\/40,#5e5f59)` — Primitive collection
29
+ - `var(--neutral\/95,#f2f1e9)` — Primitive collection
30
+ - `var(--neutral\/70,#abaca5)` — Primitive collection
31
+ - `var(--neutral\/80,#c7c7c0)` — Primitive collection
32
+ - `var(--neutral\/30,#464742)` — Primitive collection
33
+ - `var(--neutralvariant\/95,#eff2e3)` — Primitive collection
34
+ - `var(--neutralvariant\/10,#191d14)` — Primitive collection
35
+ - `var(--surfacecontainer,#eeefe3)` — Semantic collection
36
+ - `var(--surface,#f9faef)` — Semantic collection
37
+
38
+ **Spacing & Shape variables also visible:**
39
+ - `var(--spacing\/xl,32px)` → px padding
40
+ - `var(--spacing\/xxl,48px)` → py padding
41
+ - `var(--spacing\/md,16px)` → Clock padding
42
+ - `var(--p-0,0px)`, `var(--p-1,4px)`, `var(--p-2,8px)`, `var(--p-4,16px)`
43
+ - `var(--radii\/small,8px)`, `var(--radii\/medium,12px)`, `var(--radii\/large,16px)`
44
+ - `var(--radius\/rounded-full,9999px)`
45
+ - `var(--border\/thin,1px)`
46
+
47
+ **Typography variables:**
48
+ - `var(--typography\/family\/body,'Poppins:SemiBold',sans-serif)`
49
+ - `var(--typography\/size\/xl,18px)`
50
+ - `var(--font\/family\/font-sans,'Inter:Medium',sans-serif)`
51
+ - `var(--font\/weight\/font-medium,500)`
52
+
53
+ **Shadow variables:**
54
+ - `var(--shadow\/2xs,rgba(26,26,26,0.05))`
55
+ - `var(--shadow\/md,rgba(26,26,26,0.05))` with multi-layer structure
56
+
57
+ The before pull (remote MCP) showed only hex values — no variable references at all.
58
+
59
+ ### Hardcoded Hex Values (Still Dirty)
60
+
61
+ These appear as raw hex without variable bindings:
62
+ - `#c5d24d` — Primary/500 (Switch on state, Badge bg)
63
+ - `rgba(192,209,92,0.4)` — Primary/Beginner/40% (Badge bg, Switch off state)
64
+ - `#b8a9c9` — Accent/500 (Slider thumb)
65
+ - `#cfc4db` — Accent/400 (Slider thumb border)
66
+ - `#6b7a1f` — Primary/700 (Slider range fill)
67
+ - `#e0dcd5` — Gray/Neutral/30%/500 (Slider track)
68
+ - `#f5f1eb` — Stone/60%/500 (Accordion borders)
69
+ - `#fffdfa` — Info Panel bg
70
+ - `#363636` — Black/Neutral/30%/600 (text)
71
+ - `#2e2e2e` — Black/Neutral/30%/700 (text)
72
+ - `#4a5565` — (Scenario Settings subtext)
73
+ - `#e5e7eb` — (RightControlPanel border — likely from old external library)
74
+ - `#faf8f5` — Stone/60%/400 (Stage bg)
75
+
76
+ ### Node IDs and Data Attributes — NEW
77
+
78
+ The desktop MCP includes `data-node-id` and `data-name` attributes on every element.
79
+ This is gold for Kai — it can trace any element back to its Figma source node.
80
+
81
+ ### Component Structure Identified
82
+
83
+ Components detected with their Figma variant info:
84
+ - `SettingsPopover` — property1: "Default" | "Open-Popover"
85
+ - `DiscourserAiSwitchToggle` — state: "Default" | "Disabled" | "Focus", toggled: boolean
86
+ - `PopOver` — standalone
87
+ - `Logout` — standalone
88
+
89
+ ### Code Connect — Still Not Active
90
+
91
+ No `<CodeConnectSnippet>` wrappers in output. The desktop MCP doesn't read
92
+ figma-codex.json either. Components are identified by name but code is generated
93
+ from scratch rather than using DDS imports.
94
+
95
+ ---
96
+
97
+ ## What This Means for Kai
98
+
99
+ The desktop MCP data is dramatically better than the remote MCP for Kai's pipeline:
100
+
101
+ 1. **Variable names are visible** — Kai can now map `var(--secondary/50)` directly
102
+ to DDS tokens using figma-token-resolution.md
103
+
104
+ 2. **Spacing/radius/border tokens are exposed** — These weren't available before.
105
+ Kai can now use `spacing.xl`, `radii.large` etc.
106
+
107
+ 3. **Node IDs on every element** — Kai can cross-reference against figma-codex.json
108
+ to identify which elements are DDS components
109
+
110
+ 4. **Component variant props are typed** — SettingsPopover and Switch show their
111
+ Figma variant properties, which map to DDS component props
112
+
113
+ ## Remaining Gaps
114
+
115
+ 1. **Swap Library still needed** — `#e5e7eb` borders and other hex values suggest
116
+ old external library bindings are still present in nested instances
117
+
118
+ 2. **No Code Connect** — Would need `add_code_connect_map` or Code Connect UI
119
+ to get the MCP to return DDS imports directly
120
+
121
+ 3. **Accent colors hardcoded** — `#b8a9c9` (slider thumb), `#cfc4db` (slider border)
122
+ are not variable-bound in Figma
123
+
124
+ 4. **Badge uses inline hex** — `rgba(192,209,92,0.4)` instead of a variable binding
125
+
126
+ 5. **Component doc links still point to shadcn** — Not DDS Storybook