@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,350 @@
1
+ /**
2
+ * Figma MCP — get_design_context result
3
+ * Node: 38:8232 "Discourser Accordion"
4
+ * File: GaHmFfmvO4loUzuZS4TgEz (Discourser.AI--V1)
5
+ * Fetched: 2026-03-27
6
+ *
7
+ * Raw reference output from figma-remote MCP.
8
+ * Do NOT ship this file — it is a design-to-token mapping artifact.
9
+ * Asset URLs expire after 7 days.
10
+ *
11
+ * ── Design tokens observed ──────────────────────────────────────────────────
12
+ * Primary/700 #6B7A1F → primary.7 / slider range fill
13
+ * Primary/500 #C5D24D → switch (toggled-on bg)
14
+ * Primary/Beginner/40% #C0D15C → badge bg (rgba 40%) → inversePrimary
15
+ * Black/Neutral/600 #363636 → onSurface
16
+ * Black/Neutral/700 #2E2E2E → onSurface.strong
17
+ * Stone/60%/500 #F5F1EB → surface.container / divider
18
+ * Accent/500 #B8A9C9 → slider thumb bg → tertiary.7-ish
19
+ * Accent/400 #CFC4DB → slider thumb border → tertiary.6
20
+ * Gray/Neutral/500 #E0DCD5 → slider track bg → surface.container.high
21
+ * Neutral/99 #FDFCF5 → root bg → neutral.1
22
+ * Secondary/50 #6C7D56 → "Beginner" button bg → secondary.7
23
+ * ────────────────────────────────────────────────────────────────────────────
24
+ *
25
+ * ── Sections in this frame ───────────────────────────────────────────────────
26
+ * 1. Scenario Settings (38:8233) — info panel, scenario metadata, 4 setting badges, Beginner button
27
+ * 2. Audio Output (38:8234) — header + horizontal slider (volume)
28
+ * 3. Microphone Output (38:8235) — header + EQ waveform image + horizontal slider (mic gain)
29
+ * 4. A/V Recording (855:5501 + 38:8236) — radio group: "Record just audio" | "Record video & audio"
30
+ * 5. Display timer (38:8237) — label text + switch toggle (off state)
31
+ * 6. Hide Interviewers (38:8238) — label text + switch toggle (on state / #C5D24D)
32
+ * ────────────────────────────────────────────────────────────────────────────
33
+ */
34
+
35
+ // ── Asset URLs (expire 7 days from fetch) ────────────────────────────────────
36
+ const imgSwitch = "https://www.figma.com/api/mcp/asset/0ad2e446-bd71-4fa0-a52b-728a7b7c7702"; // switch thumb off
37
+ const imgSwitch1 = "https://www.figma.com/api/mcp/asset/926a02cc-5061-4a9f-8244-a9c2e9da45ae"; // switch thumb on
38
+ const imgVector = "https://www.figma.com/api/mcp/asset/6f36a7cc-ee48-428b-a5aa-ba978ee56447"; // settings icon path 1
39
+ const imgVector1 = "https://www.figma.com/api/mcp/asset/7e70f9ac-f7ec-418c-8f7c-aaf946b63a5e"; // settings icon path 2
40
+ const imgVector2 = "https://www.figma.com/api/mcp/asset/169703cd-faa9-4938-a391-8978c3c3a979"; // settings icon path 3
41
+ const imgVector3 = "https://www.figma.com/api/mcp/asset/685d0bb2-782e-4db2-9aba-cb1f45729a70"; // settings icon path 4
42
+ const imgVector4 = "https://www.figma.com/api/mcp/asset/41f6f9f5-8cea-4dd0-a457-8a9de226ca74"; // chevron-down
43
+ const imgVector5 = "https://www.figma.com/api/mcp/asset/ee0ad121-06c4-4cc5-9e8a-2165e35ba545"; // expand icon
44
+ const imgIcon = "https://www.figma.com/api/mcp/asset/cea740af-b24e-479b-be68-7f710c43a752"; // audio output icon
45
+ const imgVector6 = "https://www.figma.com/api/mcp/asset/18b02bed-7a3e-46f0-a8bf-cece9cc7ddfb"; // stretch-horizontal (slider handle)
46
+ const imgIcon1 = "https://www.figma.com/api/mcp/asset/0ded2560-8390-4614-8c6c-317acf0624a7"; // microphone icon
47
+ const imgOutPutEq = "https://www.figma.com/api/mcp/asset/1ad57072-a794-4e83-91e8-64b75aa5e01d"; // EQ waveform
48
+ const imgSvgRepoIconCarrier = "https://www.figma.com/api/mcp/asset/115171e8-478c-4fd4-b430-b0d7d4a30e8b"; // record icon
49
+ const imgSvgRepoIconCarrier1 = "https://www.figma.com/api/mcp/asset/82ce3d19-76f5-4167-a246-93578a7fe913"; // timer icon
50
+ const imgSwitch2 = "https://www.figma.com/api/mcp/asset/34a69f9a-b025-4d5c-9c8b-4d7c71a639e7"; // switch thumb (display timer, off)
51
+ const imgSvgRepoIconCarrier2 = "https://www.figma.com/api/mcp/asset/6f9e3426-69be-48b5-bec5-c7a98d37f351"; // screen-view icon
52
+
53
+ // ── Raw generated code (Tailwind/React — reference only, adapt to DDS) ───────
54
+
55
+ type DiscourserAiSwitchToggleProps = {
56
+ className?: string;
57
+ state?: "Default";
58
+ toggled?: boolean;
59
+ };
60
+
61
+ function DiscourserAiSwitchToggle({ className, state = "Default", toggled = false }: DiscourserAiSwitchToggleProps) {
62
+ const isToggledAndDefault = toggled && state === "Default";
63
+ return (
64
+ <div
65
+ className={
66
+ className ||
67
+ `content-stretch flex h-[var(--height/h-5,20px)] items-center p-[var(--p-0\\,5,2px)] relative rounded-[var(--radius/rounded-full,9999px)] shadow-[...] w-[var(--width/w-9,36px)] ${
68
+ isToggledAndDefault ? "bg-[#c5d24d] justify-end" : "bg-[rgba(192,209,92,0.4)]"
69
+ }`
70
+ }
71
+ id={isToggledAndDefault ? "node-38_8126" : "node-38_8122"}
72
+ >
73
+ <div className="relative shrink-0 size-[16px]" data-name="Switch" id={isToggledAndDefault ? "node-38_8127" : "node-38_8123"}>
74
+ <div className="absolute inset-[-6.25%_-12.5%_-18.75%_-12.5%]">
75
+ <img alt="" className="block max-w-none size-full" src={isToggledAndDefault ? imgSwitch1 : imgSwitch} />
76
+ </div>
77
+ </div>
78
+ </div>
79
+ );
80
+ }
81
+
82
+ export default function DiscourserAccordion({ className }: { className?: string }) {
83
+ return (
84
+ <div
85
+ className={className || "bg-[var(--neutral\\/99,#fdfcf5)] content-stretch cursor-pointer flex flex-col h-[1695px] items-start relative w-[350px]"}
86
+ data-name="Discourser Accordion"
87
+ data-node-id="38:8232"
88
+ >
89
+ {/* ── Section 1: Scenario Settings ──────────────────────────────────── */}
90
+ <button
91
+ className="border-[#f5f1eb] border-b border-solid content-stretch flex flex-col gap-[var(--p-0,0px)] items-center justify-center relative shrink-0 w-full"
92
+ data-name="Discourse Accordion Item (Info Panel)"
93
+ data-node-id="38:8233"
94
+ >
95
+ {/* AccordionTrigger */}
96
+ <div className="content-stretch flex gap-[var(--p-4,16px)] items-center justify-center px-[20px] py-[var(--p-4,16px)] relative shrink-0 w-full" data-node-id="I38:8233;38:8141">
97
+ {/* icon- Configure Settings (40×40 multi-vector) */}
98
+ <div className="overflow-clip relative shrink-0 size-[40px]" data-node-id="I38:8233;38:8142">
99
+ <div className="absolute bottom-3/4 left-[33.33%] right-[33.33%] top-[8.33%]"><div className="absolute inset-[-18.75%_-9.38%]"><img alt="" className="block max-w-none size-full" src={imgVector} /></div></div>
100
+ <div className="absolute inset-[16.67%_16.67%_8.33%_16.67%]"><div className="absolute inset-[-3.33%_-3.75%]"><img alt="" className="block max-w-none size-full" src={imgVector1} /></div></div>
101
+ <div className="absolute bottom-[54.17%] left-1/2 right-[33.33%] top-[45.83%]"><div className="absolute inset-[-1px_-15%]"><img alt="" className="block max-w-none size-full" src={imgVector2} /></div></div>
102
+ <div className="absolute bottom-[33.33%] left-1/2 right-[33.33%] top-[66.67%]"><div className="absolute inset-[-1px_-15%]"><img alt="" className="block max-w-none size-full" src={imgVector2} /></div></div>
103
+ <div className="absolute inset-[45.83%_66.62%_54.17%_33.33%]"><div className="absolute inset-[-1px_-5999.86%]"><img alt="" className="block max-w-none size-full" src={imgVector3} /></div></div>
104
+ <div className="absolute inset-[66.67%_66.62%_33.33%_33.33%]"><div className="absolute inset-[-1px_-5999.86%]"><img alt="" className="block max-w-none size-full" src={imgVector3} /></div></div>
105
+ </div>
106
+ <p className="flex-[1_0_0] font-medium leading-normal not-italic overflow-hidden relative text-[#363636] text-[20px] text-ellipsis text-left whitespace-nowrap">Scenario Settings</p>
107
+ <div className="overflow-clip relative shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
108
+ </div>
109
+
110
+ {/* panel- Information Slot Contents */}
111
+ <div className="bg-[#fffdfa] border border-[#e5e7eb] border-solid flex flex-col gap-[26px] items-start p-[20px] rounded-[6px]" data-node-id="I38:8233;38:8145">
112
+ {/* Scenario type: name + focus */}
113
+ <div className="flex flex-col gap-[8px] items-start" data-node-id="I38:8233;38:8145;38:8208">
114
+ <p className="font-medium text-[#363636] text-[20px]">UX Interview Practice</p>
115
+ <p className="font-normal text-[#4a5565] text-[0px]">
116
+ <span className="font-medium text-[#2e2e2e] text-[18px]">Focus</span>
117
+ <span className="text-[#363636] text-[18px]">: Technical Communication</span>
118
+ </p>
119
+ </div>
120
+
121
+ {/* Scenario Settings heading + badge grid */}
122
+ <div className="flex flex-col gap-[16px]" data-node-id="I38:8233;38:8145;38:8213">
123
+ <p className="font-medium text-[#363636] text-[20px]">Scenario Settings</p>
124
+ {/* Interviewer Settings — stone bg, 4 rows of label + badge */}
125
+ <div className="bg-[#f5f1eb] flex flex-col items-center justify-center px-[20px] py-[10px] rounded-[8px]" data-node-id="I38:8233;38:8145;38:8216">
126
+ <div className="flex flex-col gap-[10px] items-start" data-node-id="I38:8233;38:8145;38:8217">
127
+ {[
128
+ { label: "Conversation Flow:", nodeId: "I38:8233;38:8145;38:8218" },
129
+ { label: "Question Complexity:", nodeId: "I38:8233;38:8145;38:8221" },
130
+ { label: "Response Pacing:", nodeId: "I38:8233;38:8145;38:8224" },
131
+ { label: "Interview Tone:", nodeId: "I38:8233;38:8145;38:8227" },
132
+ ].map(({ label, nodeId }) => (
133
+ <div key={nodeId} className="flex gap-[2px] items-center w-full" data-node-id={nodeId}>
134
+ <p className="flex-1 font-medium text-[#363636] text-[16px]">{label} </p>
135
+ {/* Badge: bg rgba(192,209,92,0.4) ≈ inversePrimary @40% */}
136
+ <div className="bg-[rgba(192,209,92,0.4)] flex gap-[4px] items-center justify-center overflow-clip px-[10px] py-[4px] rounded-[8px]">
137
+ <p className="font-normal text-[#2e2e2e] text-[14px]">Beginner</p>
138
+ </div>
139
+ </div>
140
+ ))}
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ {/* Control bar — "Beginner" button */}
146
+ <div className="flex items-center justify-end w-full" data-node-id="I38:8233;38:8145;38:8230">
147
+ {/* bg secondary/50 ≈ secondary.7 */}
148
+ <div className="bg-[#6c7d56] flex gap-[8px] items-end justify-end px-[16px] py-[8px] rounded-[8px] shadow-sm" data-node-id="I38:8233;38:8145;38:8231">
149
+ <div className="overflow-clip shrink-0 size-[20px]">
150
+ <div className="absolute inset-[12.5%]"><div className="absolute inset-[-4.43%]"><img alt="" className="block max-w-none size-full" src={imgVector5} /></div></div>
151
+ </div>
152
+ <p className="font-medium text-[18px] text-white">Beginner</p>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </button>
157
+
158
+ {/* ── Section 2: Audio Output ────────────────────────────────────────── */}
159
+ <button
160
+ className="border-[#f5f1eb] border-b border-solid flex flex-col gap-0 items-start shrink-0 w-full"
161
+ data-name="Discourse Accordion Item ( Audio Output Panel)"
162
+ data-node-id="38:8234"
163
+ >
164
+ <div className="flex gap-[16px] items-center justify-center px-[20px] py-[16px] w-full" data-node-id="I38:8234;38:8153">
165
+ {/* icon- Audio Output — flipped speaker */}
166
+ <div className="-scale-y-100 rotate-180 flex items-center justify-center shrink-0">
167
+ <img alt="" className="size-[35px]" src={imgIcon} />
168
+ </div>
169
+ <p className="flex-1 font-medium text-[#363636] text-[20px]">Audio Output</p>
170
+ <div className="overflow-clip shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
171
+ </div>
172
+ {/* panel- Audio Output controls — horizontal slider */}
173
+ <div className="flex flex-col items-center py-[20px] w-[350px]" data-node-id="I38:8234;38:8157">
174
+ <div className="flex flex-col h-[66px] items-center justify-between px-[20px] py-[40px] w-[334px]" data-node-id="I38:8234;38:8157;38:8308">
175
+ <div className="flex flex-col items-start w-full" data-node-id="I38:8234;38:8157;38:8309">
176
+ <div className="h-[6px] relative w-[314px]" data-node-id="I38:8234;38:8157;38:8310">
177
+ {/* track: bg #E0DCD5 (surface.container.high) */}
178
+ <div className="absolute bg-[#e0dcd5] flex h-6px items-center left-[5px] rounded-full top-0 w-[290px]" data-node-id="I38:8234;38:8157;38:8311">
179
+ {/* range fill: bg #6B7A1F (primary.7) at ~69% */}
180
+ <div className="bg-[#6b7a1f] h-[6px] rounded-full w-[201px]" />
181
+ {/* thumb: bg #B8A9C9 (accent/500 ≈ tertiary), border #CFC4DB */}
182
+ <div className="absolute h-[35px] left-[183px] top-[-14.5px] w-[34px]">
183
+ <div className="-translate-x-1/2 absolute bg-[#b8a9c9] border-2 border-[#cfc4db] h-[35px] left-1/2 rounded-full shadow-md top-0 w-[34px]" />
184
+ <div className="absolute h-[19px] left-[8px] overflow-clip top-[8px] w-[18px]">
185
+ <div className="absolute inset-[16.67%_8.33%]"><div className="absolute inset-[-3.95%_-3.33%]"><img alt="" className="block max-w-none size-full" src={imgVector6} /></div></div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </button>
194
+
195
+ {/* ── Section 3: Microphone Output ──────────────────────────────────── */}
196
+ <button
197
+ className="border-[#f5f1eb] border-b border-solid flex flex-col gap-0 h-[245px] items-start shrink-0 w-full"
198
+ data-name="Discourse Accordion Item ( EQ & Slider container"
199
+ data-node-id="38:8235"
200
+ >
201
+ <div className="flex gap-[16px] items-center justify-center px-[20px] py-[16px] w-full" data-node-id="I38:8235;38:8165">
202
+ <div className="flex flex-col items-start pt-[4px] shrink-0 size-[40px]">
203
+ <img alt="" className="absolute size-full" src={imgIcon1} />
204
+ </div>
205
+ <p className="flex-1 font-medium text-[#363636] text-[20px]">Microphone Output</p>
206
+ <div className="overflow-clip shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
207
+ </div>
208
+ {/* panel- Eq & Slide container */}
209
+ <div className="flex flex-col gap-[37px] items-center py-[20px] w-full" data-node-id="I38:8235;38:8169">
210
+ {/* EQ waveform image */}
211
+ <div className="h-[24px] relative w-[289px]" data-node-id="I38:8235;38:8169;38:8315">
212
+ <div className="absolute inset-[-7.73%_-0.8%_-7.71%_-0.64%]"><img alt="" className="block max-w-none size-full" src={imgOutPutEq} /></div>
213
+ </div>
214
+ {/* Mic gain slider — identical structure to Audio Output slider */}
215
+ <div className="flex flex-col h-[48px] items-center justify-center w-[305px]" data-node-id="I38:8235;38:8169;38:8317">
216
+ <div className="flex flex-col items-start w-full">
217
+ <div className="h-[6px] relative w-[314px]">
218
+ <div className="absolute bg-[#e0dcd5] flex h-[6px] items-center left-[5px] rounded-full top-0 w-[290px]">
219
+ <div className="bg-[#6b7a1f] h-[6px] rounded-full w-[201px]" />
220
+ <div className="absolute h-[35px] left-[183px] top-[-14.5px] w-[34px]">
221
+ <div className="-translate-x-1/2 absolute bg-[#b8a9c9] border-2 border-[#cfc4db] h-[35px] left-1/2 rounded-full shadow-md top-0 w-[34px]" />
222
+ <div className="absolute h-[19px] left-[8px] overflow-clip top-[8px] w-[18px]">
223
+ <div className="absolute inset-[16.67%_8.33%]"><div className="absolute inset-[-3.95%_-3.33%]"><img alt="" className="block max-w-none size-full" src={imgVector6} /></div></div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ </button>
232
+
233
+ {/* ── Section 4a: A/V Recording (855:5501 — radio unselected) ──────── */}
234
+ <button
235
+ className="border-[#f5f1eb] border-b border-solid flex flex-col gap-0 items-center justify-center shrink-0 w-full"
236
+ data-name="Discourse Accordion Item ( A/V Record )"
237
+ data-node-id="855:5501"
238
+ >
239
+ <div className="flex gap-[16px] items-center justify-center px-[20px] py-[16px] w-full" data-node-id="I855:5501;38:8177">
240
+ <div className="flex flex-col h-[40px] items-center justify-center p-[3px] shrink-0">
241
+ <div className="relative shrink-0 size-[29.167px]"><div className="absolute inset-[-3.43%]"><img alt="" className="block max-w-none size-full" src={imgSvgRepoIconCarrier} /></div></div>
242
+ </div>
243
+ <p className="flex-1 font-medium text-[#363636] text-[20px]">A/V Recording</p>
244
+ <div className="overflow-clip shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
245
+ </div>
246
+ <div className="flex flex-col items-center p-[20px] w-full" data-node-id="I855:5501;38:8181">
247
+ <div className="cursor-pointer flex flex-col gap-[12px] items-start w-[280px]" data-node-id="I855:5501;38:8181;38:8324">
248
+ {/* Radio item 1 — unselected: border #64A104 (primary.7) */}
249
+ <div className="flex gap-[8px] items-start w-full" role="button" tabIndex={0}>
250
+ <div className="flex flex-1 flex-col gap-[6px] items-start pt-px">
251
+ <p className="font-normal leading-[30px] text-[#363636] text-[18px] w-full">Record just audio</p>
252
+ </div>
253
+ <div className="relative shadow-xs shrink-0 size-[16px]">
254
+ {/* unselected: outline only, border primary.7 */}
255
+ <div className="absolute border-[3px] border-[#64a104] left-0 rounded-full size-[16px] top-0" />
256
+ </div>
257
+ </div>
258
+ {/* Radio item 2 — selected: bg #C5D24D, border #B8A9C9 (accent) */}
259
+ <div className="flex gap-[8px] items-start w-full" role="button" tabIndex={0}>
260
+ <div className="flex flex-1 flex-col gap-[6px] items-start pt-px">
261
+ <p className="font-normal leading-[30px] text-[#363636] text-[18px] w-full">Record video & audio</p>
262
+ </div>
263
+ <div className="relative shadow-xs shrink-0 size-[16px]">
264
+ {/* selected: filled primary green */}
265
+ <div className="absolute bg-[#c5d24d] border border-[#b8a9c9] left-0 rounded-full size-[16px] top-0" />
266
+ </div>
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </button>
271
+
272
+ {/* ── Section 5: Display Timer ──────────────────────────────────────── */}
273
+ <button
274
+ className="border-[#f5f1eb] border-b border-solid flex flex-col gap-0 items-start shrink-0 w-full"
275
+ data-name="Discourse Accordion Item ( Show Timer )"
276
+ data-node-id="38:8237"
277
+ >
278
+ <div className="flex gap-[16px] items-center justify-center px-[20px] py-[16px] w-full" data-node-id="I38:8237;38:8190">
279
+ <div className="flex flex-col items-center justify-center overflow-clip p-[5px] shrink-0 size-[40px]">
280
+ <div className="relative shrink-0 size-[27px]"><div className="absolute inset-[-4.63%]"><img alt="" className="block max-w-none size-full" src={imgSvgRepoIconCarrier1} /></div></div>
281
+ </div>
282
+ <p className="flex-1 font-medium text-[#363636] text-[20px]">Display timer</p>
283
+ <div className="overflow-clip shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
284
+ </div>
285
+ {/* panel — description text + switch (OFF = rgba(192,209,92,0.4)) */}
286
+ <div className="flex gap-[10px] h-[128px] items-center justify-center p-[20px] w-full" data-node-id="I38:8237;38:8194">
287
+ <p className="font-normal leading-[30px] text-[#363636] text-[18px] whitespace-pre-wrap w-[260.713px]">
288
+ {`Hide timer to create more \nrealistic interview`}
289
+ </p>
290
+ {/* switch off: bg rgba(192,209,92,0.4) */}
291
+ <div className="bg-[rgba(192,209,92,0.4)] flex h-[20px] items-center p-[2px] rounded-full shadow-2xs w-[36px]">
292
+ <div className="relative shrink-0 size-[16px]">
293
+ <div className="absolute inset-[-6.25%_-12.5%_-18.75%_-12.5%]"><img alt="" className="block max-w-none size-full" src={imgSwitch2} /></div>
294
+ </div>
295
+ </div>
296
+ </div>
297
+ </button>
298
+
299
+ {/* ── Section 6: Hide Interviewers ──────────────────────────────────── */}
300
+ <button
301
+ className="border-[#f5f1eb] border-b border-solid flex flex-col gap-0 items-center justify-center shrink-0 w-full"
302
+ data-name="Discourse Accordion Item ( Hide Interview )"
303
+ data-node-id="38:8238"
304
+ >
305
+ <div className="flex gap-[16px] items-center justify-center px-[20px] py-[16px] w-full" data-node-id="I38:8238;38:8202">
306
+ <div className="flex flex-col items-center justify-center overflow-clip p-px shrink-0 size-[40px]">
307
+ <div className="relative shrink-0 size-[24.891px]"><img alt="" className="absolute size-full" src={imgSvgRepoIconCarrier2} /></div>
308
+ </div>
309
+ <p className="flex-1 font-medium text-[#363636] text-[20px]">Hide Interviewers</p>
310
+ <div className="overflow-clip shrink-0 size-[24px]"><div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]"><div className="absolute inset-[-20.83%_-10.42%]"><img alt="" className="block max-w-none size-full" src={imgVector4} /></div></div></div>
311
+ </div>
312
+ {/* panel — description text + switch (ON = #C5D24D) */}
313
+ <div className="flex gap-[10px] items-center justify-center py-[20px]" data-node-id="I38:8238;38:8206">
314
+ <p className="font-normal leading-[30px] text-[#363636] text-[18px] whitespace-pre-wrap w-[244.007px]">
315
+ {`Switch to off to hide video of interviewers if it is too \ndistracting`}
316
+ </p>
317
+ {/* switch on: bg #C5D24D, thumb right-aligned */}
318
+ <DiscourserAiSwitchToggle
319
+ className="bg-[#c5d24d] flex h-[20px] items-center justify-end p-[2px] rounded-full shadow-2xs w-[36px]"
320
+ toggled
321
+ />
322
+ </div>
323
+ </button>
324
+ </div>
325
+ );
326
+ }
327
+
328
+ /**
329
+ * ── DDS Token Mapping Notes ───────────────────────────────────────────────────
330
+ *
331
+ * For the v2 implementation, map Figma values → DDS semantic tokens:
332
+ *
333
+ * Figma hex / var DDS token Where used
334
+ * ─────────────────────────────────────────────────────────────────────────────
335
+ * #FDFCF5 (neutral/99) neutral.1 root bg
336
+ * #F5F1EB (stone/60%/500) surface.container section divider, info bg
337
+ * #FFFDFA neutral.1 / surface info card bg
338
+ * #E5E7EB outline.variant info card border
339
+ * #363636 (black/600) onSurface body text
340
+ * #2E2E2E (black/700) onSurface (strong) bold labels
341
+ * #4A5565 onSurface.variant subtitle text
342
+ * rgba(192,209,92,0.4) inversePrimary (40%) badge bg, switch-off bg
343
+ * #C5D24D (primary/500) primary.5 switch-on bg
344
+ * #6B7A1F (primary/700) primary.7 slider range fill
345
+ * #6C7D56 (secondary/50) secondary.7 "Beginner" button bg
346
+ * #E0DCD5 (gray/neutral/500) surface.container.high slider track bg
347
+ * #B8A9C9 (accent/500) tertiary.5 / accent slider thumb bg
348
+ * #CFC4DB (accent/400) tertiary.4 slider thumb border
349
+ * #64A104 (primary/60%) primary.7 (@ 60%) radio unselected border
350
+ */
@@ -0,0 +1,130 @@
1
+ // Figma Design Context — Discourser Accordion (node-id: 38:8232)
2
+ // File: GaHmFfmvO4loUzuZS4TgEz / Discourser.AI--V1
3
+ // Fetched: 2026-03-27
4
+ //
5
+ // Design tokens referenced:
6
+ // Primary/700: #6B7A1F
7
+ // Primary/500: #C5D24D
8
+ // Primary/400/60%: #C0D15C
9
+ // Primary/Beginner/40%: #C0D15C
10
+ // Black/Neutral/30%/600: #363636
11
+ // Black/Neutral/30%/700: #2E2E2E
12
+ // Stone/60%/500: #F5F1EB
13
+ // Gray/Neutral/30%/500: #E0DCD5
14
+ // Accent/300: #E5DFEC
15
+ // Accent/400: #CFC4DB
16
+ // Accent/500: #B8A9C9
17
+ // Accent/600: #8D7EA3
18
+ // Accent/700: #6B5A7D
19
+ //
20
+ // Typography:
21
+ // Dsktp/Inter/BodyP/Medium/20: Inter Medium 500 20px lh:100%
22
+ // Dsktp/Inter/Button/Regular/18: Inter Regular 400 18px lh:30
23
+ // Dsktp/Inter/Button/Medium/18px: Inter Medium 500 18px lh:100%
24
+ // Dsktp/Inter/Link/Medium/16: Inter Medium 500 16px lh:100%
25
+ // Dsktp/Mobile/Inter/Button/Regular/14: Inter Regular 400 14px lh:100%
26
+ //
27
+ // Sections:
28
+ // 1. Scenario Settings (info panel)
29
+ // 2. Audio Output (volume slider)
30
+ // 3. Microphone Output (EQ + gain slider)
31
+ // 4. A/V Recording (radio group: audio only | video+audio)
32
+ // 5. Display timer (toggle)
33
+ // 6. Hide Interviewers (toggle)
34
+ //
35
+ // Component docs:
36
+ // Accordion: https://ui.shadcn.com/docs/components/accordion
37
+ // Badge: https://ui.shadcn.com/docs/components/badge
38
+ // Radio Group: https://ui.shadcn.com/docs/components/radio-group
39
+
40
+ const imgSwitch = "https://www.figma.com/api/mcp/asset/6af50d67-6c4e-4ee1-85de-66baf8535487";
41
+ const imgSwitch1 = "https://www.figma.com/api/mcp/asset/46a551ce-7a48-4a03-a0d4-f50f4f554e9b";
42
+ const imgVector = "https://www.figma.com/api/mcp/asset/50458ebc-f32a-49e0-b0e5-03b5393f077b";
43
+ const imgVector1 = "https://www.figma.com/api/mcp/asset/7860a7d6-3665-40f1-b70e-fa293a24026d";
44
+ const imgVector2 = "https://www.figma.com/api/mcp/asset/7507174d-be1a-495b-a903-f958dee54c6c";
45
+ const imgVector3 = "https://www.figma.com/api/mcp/asset/ad2a2392-acc7-4a68-9907-0040ff4cd8e2";
46
+ const imgVector4 = "https://www.figma.com/api/mcp/asset/303639f5-6952-4f6e-b8a0-3177b95521ce";
47
+ const imgVector5 = "https://www.figma.com/api/mcp/asset/318eb54a-c998-4829-a27a-402d6d14bf30";
48
+ const imgIcon = "https://www.figma.com/api/mcp/asset/bde5d849-f0ec-4724-b933-f021166312ce";
49
+ const imgVector6 = "https://www.figma.com/api/mcp/asset/acd8d2f6-fdc0-4787-add4-3813f3c103cf";
50
+ const imgIcon1 = "https://www.figma.com/api/mcp/asset/90a59a80-c14a-4e37-947c-39eaa07704c5";
51
+ const imgOutPutEq = "https://www.figma.com/api/mcp/asset/c36c3468-c437-4a01-b736-5b51a7cbd53e";
52
+ const imgSvgRepoIconCarrier = "https://www.figma.com/api/mcp/asset/93a52f90-1a70-4807-a4e3-330e0762a41a";
53
+ const imgSvgRepoIconCarrier1 = "https://www.figma.com/api/mcp/asset/6933376f-762e-4f71-82dd-d2b0c77050ca";
54
+ const imgSwitch2 = "https://www.figma.com/api/mcp/asset/892c4606-49a2-4682-b3f8-7581c129d2e8";
55
+ const imgSvgRepoIconCarrier2 = "https://www.figma.com/api/mcp/asset/d4547c2b-03e6-41d0-b72b-21d1494b878c";
56
+ type DiscourserAiSwitchToggleProps = {
57
+ className?: string;
58
+ state?: "Default";
59
+ toggled?: boolean;
60
+ };
61
+
62
+ function DiscourserAiSwitchToggle({ className, state = "Default", toggled = false }: DiscourserAiSwitchToggleProps) {
63
+ const isToggledAndDefault = toggled && state === "Default";
64
+ return (
65
+ <div className={className || `content-stretch flex h-[var(--height/h-5,20px)] items-center p-[var(--p-0\\,5,2px)] relative rounded-[var(--radius/rounded-full,9999px)] shadow-[var(--shadow/2xs/layer-1/x,0px)_var(--shadow/2xs/layer-1/y,1px)_var(--shadow/2xs/layer-1/blur,2px)_0px_var(--shadow/2xs,rgba(26,26,26,0.05))] w-[var(--width/w-9,36px)] `}${isToggledAndDefault ? "bg-[#c5d24d] justify-end" : "bg-[rgba(192,209,92,0.4)]"}`} id={isToggledAndDefault ? "node-38_8126" : "node-38_8122"}>
66
+ <div className="relative shrink-0 size-[16px]" data-name="Switch" id={isToggledAndDefault ? "node-38_8127" : "node-38_8123"}>
67
+ <div className="absolute inset-[-6.25%_-12.5%_-18.75%_-12.5%]">
68
+ <img alt="" className="block max-w-none size-full" src={isToggledAndDefault ? imgSwitch1 : imgSwitch} />
69
+ </div>
70
+ </div>
71
+ </div>
72
+ );
73
+ }
74
+
75
+ export default function DiscourserAccordion({ className }: { className?: string }) {
76
+ return (
77
+ <div className={className || "content-stretch cursor-pointer flex flex-col h-[1695px] items-start relative w-[350px]"} data-name="Discourser Accordion" data-node-id="38:8232">
78
+ <button className="border-[#f5f1eb] border-b border-solid content-stretch flex flex-col gap-[var(--p-0,0px)] items-center justify-center relative shrink-0 w-full" data-name="Discourse Accordion Item (Info Panel)" data-node-id="38:8233">
79
+ <div className="content-stretch flex gap-[var(--p-4,16px)] items-center justify-center px-[20px] py-[var(--p-4,16px)] relative shrink-0 w-full" data-name="AccordionTrigger" data-node-id="I38:8233;38:8141">
80
+ <div className="overflow-clip relative shrink-0 size-[40px]" data-name="icon- Configure Settings" data-node-id="I38:8233;38:8142">
81
+ <div className="absolute bottom-3/4 left-[33.33%] right-[33.33%] top-[8.33%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9805">
82
+ <div className="absolute inset-[-18.75%_-9.38%]">
83
+ <img alt="" className="block max-w-none size-full" src={imgVector} />
84
+ </div>
85
+ </div>
86
+ <div className="absolute inset-[16.67%_16.67%_8.33%_16.67%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9806">
87
+ <div className="absolute inset-[-3.33%_-3.75%]">
88
+ <img alt="" className="block max-w-none size-full" src={imgVector1} />
89
+ </div>
90
+ </div>
91
+ <div className="absolute bottom-[54.17%] left-1/2 right-[33.33%] top-[45.83%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9807">
92
+ <div className="absolute inset-[-1px_-15%]">
93
+ <img alt="" className="block max-w-none size-full" src={imgVector2} />
94
+ </div>
95
+ </div>
96
+ <div className="absolute bottom-[33.33%] left-1/2 right-[33.33%] top-[66.67%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9808">
97
+ <div className="absolute inset-[-1px_-15%]">
98
+ <img alt="" className="block max-w-none size-full" src={imgVector2} />
99
+ </div>
100
+ </div>
101
+ <div className="absolute inset-[45.83%_66.62%_54.17%_33.33%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9809">
102
+ <div className="absolute inset-[-1px_-5999.86%]">
103
+ <img alt="" className="block max-w-none size-full" src={imgVector3} />
104
+ </div>
105
+ </div>
106
+ <div className="absolute inset-[66.67%_66.62%_33.33%_33.33%]" data-name="Vector" data-node-id="I38:8233;38:8142;38:9810">
107
+ <div className="absolute inset-[-1px_-5999.86%]">
108
+ <img alt="" className="block max-w-none size-full" src={imgVector3} />
109
+ </div>
110
+ </div>
111
+ </div>
112
+ <p className="flex-[1_0_0] font-[family-name:var(--font/family/font-sans,'Inter:Medium',sans-serif)] font-[var(--font/weight/font-medium,500)] leading-[normal] min-h-px min-w-px not-italic overflow-hidden relative text-[#363636] text-[20px] text-ellipsis text-left whitespace-nowrap" data-node-id="I38:8233;38:8143">
113
+ Scenario Settings
114
+ </p>
115
+ <div className="overflow-clip relative shrink-0 size-[24px]" data-name="Lucide Icons / chevron-down" data-node-id="I38:8233;38:8144">
116
+ <div className="absolute bottom-[37.5%] left-1/4 right-1/4 top-[37.5%]" data-name="Vector" data-node-id="I38:8233;38:8144;2706:13883">
117
+ <div className="absolute inset-[-20.83%_-10.42%]">
118
+ <img alt="" className="block max-w-none size-full" src={imgVector4} />
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ <div className="bg-[#fffdfa] border border-[#e5e7eb] border-solid content-stretch flex flex-col gap-[26px] items-start p-[20px] relative rounded-[6px] shrink-0" data-name="panel- Information Slot Contents" data-node-id="I38:8233;38:8145">
124
+ {/* ... panel contents ... */}
125
+ </div>
126
+ </button>
127
+ {/* ... remaining accordion items ... */}
128
+ </div>
129
+ );
130
+ }
@@ -0,0 +1 @@
1
+ <symbol id="38:8232" name="Discourser Accordion" x="5653" y="2125.1240234375" width="350" height="1695" />
@@ -0,0 +1 @@
1
+ <symbol id="38:8232" name="Discourser Accordion" x="5653" y="2125.1240234375" width="350" height="1695" />