@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,23 @@
1
+ {
2
+ "auditTarget": "958:1900",
3
+ "componentSetName": "RadioGroup.Item",
4
+ "totalComponents": 72,
5
+ "totalUnboundNodes": 0,
6
+ "flagged": [],
7
+ "variantAxes": {
8
+ "Color": ["Primary", "Secondary", "Tertiary"],
9
+ "Stop": ["40", "50", "60", "70"],
10
+ "Variant": ["Solid"],
11
+ "Size": ["Sm", "Md", "Lg"],
12
+ "Checked": ["False", "True"]
13
+ },
14
+ "gridLayout": "24 cols × 3 rows (one row per Color, columns = Stop × Size × Checked)",
15
+ "notes": "All fills, strokes, and text bindings are bound to DDS variables. Zero hardcoded values.",
16
+ "variableBindings": {
17
+ "itemControl.fill.checked": "Primitives {color}/{stop} (bound per Color+Stop variant)",
18
+ "itemControl.stroke.unchecked": "Semantic outline/variant",
19
+ "indicator.fill": "Primitives neutral/100 (white)",
20
+ "itemText.fill": "Semantic onSurface"
21
+ },
22
+ "replacedNode": "944:1858"
23
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "auditTarget": "959:2032",
3
+ "componentSetName": "Switch",
4
+ "totalComponents": 96,
5
+ "totalUnboundNodes": 48,
6
+ "variantAxes": {
7
+ "Color": ["Primary", "Secondary", "Tertiary"],
8
+ "Stop": ["40", "50", "60", "70"],
9
+ "Variant": ["Solid"],
10
+ "Size": ["Xs", "Sm", "Md", "Lg"],
11
+ "Toggled": ["False", "True"]
12
+ },
13
+ "gridLayout": "32 cols × 3 rows (one row per Color, columns = Stop × Size × Toggled)",
14
+ "summary": {
15
+ "control [fill] — off-state alpha slot": 48
16
+ },
17
+ "notes": "48 unbound nodes are ALL expected: the off-state (Toggled=False) track fills are alpha-composited from the variable's resolved value at runtime (1 + (raw - 1) * 0.19). This is the ONLY fill category in the system that lacks boundVariables. 3 colors × 4 stops × 4 sizes = 48 off-state instances.",
18
+ "expectedHardcodedFills": {
19
+ "primary/40 off": "#dbe2cf (computed from #3f6900 at 19% over white)",
20
+ "primary/50 off": "#dee8cf (computed from #518500 at 19%)",
21
+ "primary/60 off": "#e2edcf (computed from #64a104 at 19%)",
22
+ "primary/70 off": "#e6f2d7 (computed from #7dbd2a at 19%)",
23
+ "secondary/40 off": "#dfe2db (computed from #54643f at 19%)",
24
+ "secondary/50 off": "#e3e6df (computed from #6c7d56 at 19%)",
25
+ "secondary/60 off": "#e8ebe3 (computed from #85976e at 19%)",
26
+ "secondary/70 off": "#edf0e8 (computed from #a0b187 at 19%)",
27
+ "tertiary/40 off": "#cfe3e2 (computed from #046a66 at 19%)",
28
+ "tertiary/50 off": "#d8e7e7 (computed from #30837f at 19%)",
29
+ "tertiary/60 off": "#ddeceb (computed from #4d9d98 at 19%)",
30
+ "tertiary/70 off": "#e2f2f1 (computed from #69b8b3 at 19%)"
31
+ },
32
+ "variableBindings": {
33
+ "control.fill.on": "Primitives {color}/{stop} (bound per Color+Stop variant)",
34
+ "thumb.fill": "Primitives neutral/100 (white)",
35
+ "label.fill": "Semantic onSurface"
36
+ },
37
+ "replacedNode": "946:1808"
38
+ }
@@ -0,0 +1,98 @@
1
+ # Session Summary — March 29, 2026
2
+ # For next session pickup
3
+
4
+ ---
5
+
6
+ ## What was accomplished this session
7
+
8
+ ### 1. figma-codex.json completed — 35 components
9
+ - Badge.figma.tsx and Card.figma.tsx created with placeholder node-id=0-0
10
+ (no Figma master components exist for these primitives)
11
+ - `pnpm codex:generate` run, verified 35 components
12
+ - StudioControls nodeId fixed from stale 867:1784 → correct 38:8232
13
+ - Accordion intentionally shares 38:8232 (it's a primitive consumed inside composites)
14
+
15
+ ### 2. Variable rebinding on Conversation Prelaunch page (66:2739)
16
+ Two rebind passes executed via `use_figma` scripts:
17
+
18
+ **Pass 1 — Old @discourser/design-system library (103:xxxx)**
19
+ - 15 variables, 32 bindings → all rebound to local Primitives/Semantic
20
+ - Mapping: surfacecontainerhigh → surface/container/high, neutral/90 → neutral/90, etc.
21
+ - Zero 103:xxxx bindings remain
22
+
23
+ **Pass 2 — Mode collection shadcn-named colors**
24
+ - 9 variables, 72 bindings → all rebound to DDS Semantic
25
+ - Mapping:
26
+ - foreground → onSurface
27
+ - muted-foreground → onSurface/variant
28
+ - primary-foreground → onPrimary
29
+ - border → outline/variant
30
+ - custom/bg-input-30 → surface/container
31
+ - muted → surface/container/high
32
+ - shadow/2xs, shadow/md, shadow/xs → shadow
33
+ - Zero Mode color bindings remain
34
+
35
+ ### 3. Design context re-pulled and Kai simulation completed
36
+ - Post-rebind get_design_context saved to:
37
+ docs/figma-mcp-return/prelaunch-post-rebind-design-context.md
38
+ - Kai resolution simulation saved to:
39
+ docs/figma-mcp-return/kai-resolution-simulation.md
40
+ - Estimated Kai fidelity: ~70% clean resolution
41
+
42
+ ### 4. Remaining external bindings audited
43
+ - 653 numeric bindings from Park UI Theme/Spacing/Primitives collections
44
+ - These are spacing (p-0, p-2, p-4), radius (rounded-full), shadow dimensions,
45
+ font sizes, border widths — all resolve to correct pixel values
46
+ - NOT rebound this session — they don't affect semantic meaning
47
+
48
+ ---
49
+
50
+ ## What's NOT done — next session priorities
51
+
52
+ ### HIGH — Would move Kai fidelity from ~70% to ~85%
53
+ 1. Create Figma variables for Accent palette (#b8a9c9, #cfc4db, #6b5a7d)
54
+ and Primary/500 (#c5d24d) — currently hardcoded Figma paint styles
55
+ 2. Rebind #363636 and #2e2e2e text nodes to onSurface or onSurface/variant
56
+ 3. Add missing hex values to Kai's figma-token-resolution.md lookup table
57
+
58
+ ### MEDIUM — Would move to ~90%
59
+ 4. Resolve Inter vs Poppins typography mismatch in Figma
60
+ 5. Replace #e5e7eb border on RightControlPanel with outline/variant
61
+ 6. Explore `add_code_connect_map` to get MCP to return DDS imports
62
+
63
+ ### Still pending from earlier sessions
64
+ 7. Will's corrections to Claude's workflow model
65
+ 8. Notion documentation of session findings
66
+ 9. Extend Figma variables for elevation, typography, spacing, border radius
67
+ 10. Fix figma-codex parsing bug (multi-line function prop truncation on NavigationMenu)
68
+
69
+ ---
70
+
71
+ ## Key files created/modified this session
72
+
73
+ DDS repo:
74
+ - src/components/Badge.figma.tsx — NEW
75
+ - src/components/Card.figma.tsx — NEW
76
+ - src/components/Accordion.figma.tsx — reverted (unchanged from start)
77
+ - dist/figma-codex.json — REGENERATED (35 components)
78
+ - docs/figma-mcp-return/prelaunch-post-rebind-design-context.md — NEW
79
+ - docs/figma-mcp-return/prelaunch-get-design-context.md — NEW (pre-rebind)
80
+ - docs/figma-mcp-return/prelaunch-get-metadata.md — NEW
81
+ - docs/figma-mcp-return/prelaunch-get-metadata.xml — NEW
82
+ - docs/figma-mcp-return/prelaunch-comparison-analysis.md — NEW
83
+ - docs/figma-mcp-return/kai-resolution-simulation.md — NEW
84
+
85
+ Figma file (GaHmFfmvO4loUzuZS4TgEz):
86
+ - Node 66:2739 — all color variable bindings rebound to local collections
87
+
88
+ ---
89
+
90
+ ## Key file paths (unchanged)
91
+
92
+ DDS repo: /Users/willstreeter/WebstormProjects/vibe-coding/shifu-project/Discourser-Design-System/
93
+ Discourser.ai repo: /Users/willstreeter/WebstormProjects/vibe-coding/shifu-project/discourser.ai/
94
+ Figma file key: GaHmFfmvO4loUzuZS4TgEz
95
+ Conversation Prelaunch node: 66:2739
96
+ figma-codex.json: dist/figma-codex.json
97
+ Kai token resolution: discourser.ai/_bmad/bmm/kai/knowledge/figma-token-resolution.md
98
+ Notion parent page: 3304d6019b4281969dafca1c03d29656
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@discourser/design-system",
3
- "version": "0.24.0",
3
+ "version": "0.25.1",
4
4
  "description": "Aesthetic-agnostic design system with Panda CSS and Ark UI",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -213,6 +213,7 @@
213
213
  "verify:build": "pnpm build",
214
214
  "codex:generate": "tsx src/figma-codex/generate.ts",
215
215
  "codex:watch": "tsx --watch src/figma-codex/generate.ts",
216
+ "scaffold:figma-connect": "tsx scripts/scaffold-figma-connect.ts",
216
217
  "figma:connect": "figma connect publish",
217
218
  "figma:connect:dry": "figma connect publish --dry-run",
218
219
  "figma:export": "tsx scripts/export-figma-tokens.ts",
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @dds-tokens
3
+ * recipe: badge
4
+ * variantProps: variant, size, colorPalette
5
+ * figmaPropToRecipeProp:
6
+ * Variant: variant
7
+ * Size: size
8
+ * Color: colorPalette
9
+ */
10
+ import figma from '@figma/code-connect';
11
+ import { Badge } from './Badge';
12
+
13
+ figma.connect(
14
+ Badge,
15
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=930-1972',
16
+ {
17
+ props: {
18
+ variant: figma.enum('Variant', {
19
+ Solid: 'solid',
20
+ Surface: 'surface',
21
+ Subtle: 'subtle',
22
+ Outline: 'outline',
23
+ Rating: 'rating',
24
+ }),
25
+ colorPalette: figma.enum('Color', {
26
+ Primary: 'primary',
27
+ Secondary: 'secondary',
28
+ Tertiary: 'tertiary',
29
+ Neutral: 'neutral',
30
+ Error: 'error',
31
+ }),
32
+ },
33
+ example: ({ variant, colorPalette }) => (
34
+ <Badge variant={variant} colorPalette={colorPalette}>
35
+ Label
36
+ </Badge>
37
+ ),
38
+ },
39
+ );
@@ -0,0 +1,18 @@
1
+ import figma from '@figma/code-connect';
2
+ import { Button } from './Button';
3
+
4
+ figma.connect(
5
+ Button,
6
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-7993',
7
+ {
8
+ props: {
9
+ variant: figma.enum('Type', {
10
+ Default: 'solid',
11
+ Secondary: 'outline',
12
+ Tertiary: 'plain',
13
+ Neutral: 'surface',
14
+ }),
15
+ },
16
+ example: ({ variant }) => <Button variant={variant}>Label</Button>,
17
+ },
18
+ );
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @dds-tokens
3
+ * recipe: card
4
+ * variantProps: variant
5
+ * figmaPropToRecipeProp:
6
+ * Variant: variant
7
+ */
8
+ import figma from '@figma/code-connect';
9
+ import * as Card from './Card';
10
+
11
+ figma.connect(
12
+ Card.Root,
13
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=950-1681',
14
+ {
15
+ props: {
16
+ variant: figma.enum('Variant', {
17
+ Elevated: 'elevated',
18
+ Outline: 'outline',
19
+ Subtle: 'subtle',
20
+ }),
21
+ },
22
+ example: ({ variant }) => (
23
+ <Card.Root variant={variant}>
24
+ <Card.Header>
25
+ <Card.Title>Card Title</Card.Title>
26
+ <Card.Description>Card description</Card.Description>
27
+ </Card.Header>
28
+ <Card.Body>Content goes here</Card.Body>
29
+ <Card.Footer>{/* Footer actions */}</Card.Footer>
30
+ </Card.Root>
31
+ ),
32
+ },
33
+ );
@@ -8,8 +8,10 @@ export type AudienceIconProps = ComponentProps<typeof StyledSvg>;
8
8
 
9
9
  export const AudienceIcon = (props: AudienceIconProps) => (
10
10
  <StyledSvg
11
- viewBox="0 0 40 44"
11
+ viewBox="3.5 9.5 29 25"
12
12
  fill="currentColor"
13
+ stroke="currentColor"
14
+ strokeWidth="0.5"
13
15
  xmlns="http://www.w3.org/2000/svg"
14
16
  width="1em"
15
17
  height="1em"
@@ -8,7 +8,7 @@ export type AudioSpeakerIconProps = ComponentProps<typeof StyledSvg>;
8
8
 
9
9
  export const AudioSpeakerIcon = (props: AudioSpeakerIconProps) => (
10
10
  <StyledSvg
11
- viewBox="0 0 40 28"
11
+ viewBox="-10 -3 50 34"
12
12
  fill="none"
13
13
  xmlns="http://www.w3.org/2000/svg"
14
14
  width="1em"
@@ -18,21 +18,21 @@ export const MicrophoneIcon = (props: MicrophoneIconProps) => (
18
18
  <path
19
19
  d="M20 35.6665V40.6665"
20
20
  stroke="currentColor"
21
- strokeWidth="2"
21
+ strokeWidth="3"
22
22
  strokeLinecap="round"
23
23
  strokeLinejoin="round"
24
24
  />
25
25
  <path
26
26
  d="M31.6666 20.6665V23.9998C31.6666 27.094 30.4374 30.0615 28.2495 32.2494C26.0616 34.4373 23.0941 35.6665 19.9999 35.6665C16.9057 35.6665 13.9383 34.4373 11.7503 32.2494C9.56242 30.0615 8.33325 27.094 8.33325 23.9998V20.6665"
27
27
  stroke="currentColor"
28
- strokeWidth="2"
28
+ strokeWidth="3"
29
29
  strokeLinecap="round"
30
30
  strokeLinejoin="round"
31
31
  />
32
32
  <path
33
33
  d="M25 12.3335C25 9.57207 22.7614 7.3335 20 7.3335C17.2386 7.3335 15 9.57207 15 12.3335V24.0002C15 26.7616 17.2386 29.0002 20 29.0002C22.7614 29.0002 25 26.7616 25 24.0002V12.3335Z"
34
34
  stroke="currentColor"
35
- strokeWidth="2"
35
+ strokeWidth="3"
36
36
  strokeLinecap="round"
37
37
  strokeLinejoin="round"
38
38
  />
@@ -18,23 +18,23 @@ export const RecordIcon = (props: RecordIconProps) => (
18
18
  <path
19
19
  d="M27.0624 19.4998C27.0624 21.5134 25.4301 23.1457 23.4166 23.1457C21.4031 23.1457 19.7708 21.5134 19.7708 19.4998C19.7708 17.4863 21.4031 15.854 23.4166 15.854C25.4301 15.854 27.0624 17.4863 27.0624 19.4998Z"
20
20
  stroke="currentColor"
21
- strokeWidth="2"
21
+ strokeWidth="3"
22
22
  />
23
23
  <path
24
24
  d="M15.3959 19.4998C15.3959 21.5134 13.7636 23.1457 11.7501 23.1457C9.73655 23.1457 8.10425 21.5134 8.10425 19.4998C8.10425 17.4863 9.73655 15.854 11.7501 15.854C13.7636 15.854 15.3959 17.4863 15.3959 19.4998Z"
25
25
  stroke="currentColor"
26
- strokeWidth="2"
26
+ strokeWidth="3"
27
27
  />
28
28
  <path
29
29
  d="M11.75 23.1455H23.4167"
30
30
  stroke="currentColor"
31
- strokeWidth="2"
31
+ strokeWidth="3"
32
32
  strokeLinecap="round"
33
33
  />
34
34
  <path
35
35
  d="M32.1667 19.4998C32.1667 26.3744 32.1667 29.8119 30.0309 31.9474C27.8954 34.0832 24.4579 34.0832 17.5833 34.0832C10.7087 34.0832 7.27136 34.0832 5.13569 31.9474C3 29.8119 3 26.3744 3 19.4998C3 12.6252 3 9.18786 5.13569 7.05219C7.27136 4.9165 10.7087 4.9165 17.5833 4.9165C24.4579 4.9165 27.8954 4.9165 30.0309 7.05219C31.4511 8.47223 31.9269 10.4677 32.0863 13.6665"
36
36
  stroke="currentColor"
37
- strokeWidth="2"
37
+ strokeWidth="3"
38
38
  strokeLinecap="round"
39
39
  />
40
40
  </StyledSvg>
@@ -18,7 +18,7 @@ export const TimerIcon = (props: TimerIconProps) => (
18
18
  <path
19
19
  d="M6.27333 12C4.83741 14.1451 4 16.7248 4 19.5C4 26.9559 10.0442 33 17.5 33C24.9559 33 31 26.9559 31 19.5C31 12.0442 24.9559 6 17.5 6V10.5M17.5 19.5L11.5 13.5"
20
20
  stroke="currentColor"
21
- strokeWidth="2"
21
+ strokeWidth="3"
22
22
  strokeLinecap="round"
23
23
  strokeLinejoin="round"
24
24
  />
@@ -0,0 +1,17 @@
1
+ import figma from '@figma/code-connect';
2
+ import { Input } from './Input';
3
+
4
+ figma.connect(
5
+ Input,
6
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-8909',
7
+ {
8
+ props: {
9
+ type: figma.enum('Type', {
10
+ Text: 'text',
11
+ File: 'file',
12
+ Password: 'password',
13
+ }),
14
+ },
15
+ example: ({ type }) => <Input type={type} placeholder="Enter value" />,
16
+ },
17
+ );
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @dds-tokens
3
+ * recipe: radioGroup
4
+ * variantProps: variant, size
5
+ * figmaPropToRecipeProp:
6
+ * Checked: checked
7
+ * State: state
8
+ */
9
+ import figma from '@figma/code-connect';
10
+ import * as RadioGroup from './RadioGroup';
11
+
12
+ // Original designer-built component — .Radio Group Radio Toggle (38:8893)
13
+ // Variants: Checked(False/True) × State(Default/Focus/Disabled)
14
+ // This is the component used in production Discourser.AI page designs.
15
+ //
16
+ // Anatomy:
17
+ // <RadioGroup.Root value={string} onValueChange={fn}>
18
+ // <RadioGroup.Item value="x">
19
+ // <RadioGroup.ItemControl />
20
+ // <RadioGroup.ItemText>Label</RadioGroup.ItemText>
21
+ // </RadioGroup.Item>
22
+ // </RadioGroup.Root>
23
+ //
24
+ // Key props on Root:
25
+ // value — controlled selected value (string)
26
+ // defaultValue — uncontrolled initial value (string)
27
+ // onValueChange — callback ({ value }: { value: string }) => void
28
+ // disabled — boolean, disables all items
29
+ // orientation — 'horizontal' | 'vertical' (default: 'vertical')
30
+ //
31
+ // Key props on Item:
32
+ // value — required unique string for this option
33
+ // disabled — boolean, disables this item only
34
+ figma.connect(
35
+ RadioGroup.Root,
36
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-8893',
37
+ {
38
+ props: {
39
+ checked: figma.enum('Checked', {
40
+ False: false,
41
+ True: true,
42
+ }),
43
+ },
44
+ example: ({ checked: _checked }) => (
45
+ <RadioGroup.Root defaultValue="option-1">
46
+ <RadioGroup.Item value="option-1">
47
+ <RadioGroup.ItemControl />
48
+ <RadioGroup.ItemText>Option 1</RadioGroup.ItemText>
49
+ </RadioGroup.Item>
50
+ <RadioGroup.Item value="option-2">
51
+ <RadioGroup.ItemControl />
52
+ <RadioGroup.ItemText>Option 2</RadioGroup.ItemText>
53
+ </RadioGroup.Item>
54
+ <RadioGroup.Item value="option-3">
55
+ <RadioGroup.ItemControl />
56
+ <RadioGroup.ItemText>Option 3</RadioGroup.ItemText>
57
+ </RadioGroup.Item>
58
+ </RadioGroup.Root>
59
+ ),
60
+ },
61
+ );
@@ -0,0 +1,17 @@
1
+ import figma from '@figma/code-connect';
2
+ import { SettingsPopover } from './SettingsPopover';
3
+
4
+ figma.connect(
5
+ SettingsPopover,
6
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=810-5398',
7
+ {
8
+ example: () => (
9
+ <SettingsPopover
10
+ userName={'value'}
11
+ userTier={'value'}
12
+ userEmail={'value'}
13
+ actions={[]}
14
+ />
15
+ ),
16
+ },
17
+ );
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @dds-tokens
3
+ * recipe: slider
4
+ * variantProps: orientation, size, variant
5
+ * figmaPropToRecipeProp:
6
+ * Orientation: orientation
7
+ * Size: size
8
+ */
9
+ import figma from '@figma/code-connect';
10
+ import * as Slider from './Slider';
11
+
12
+ // Original designer-built component — Discourser AI Slider (38:7988)
13
+ // This is the component used in production Discourser.AI page designs.
14
+ //
15
+ // Import as namespace: import * as Slider from '@discourser/design-system/Slider'
16
+ //
17
+ // Anatomy:
18
+ // <Slider.Root defaultValue={[number]} min={number} max={number} step={number}>
19
+ // <Slider.Label>Label text</Slider.Label>
20
+ // <Slider.Control>
21
+ // <Slider.Track>
22
+ // <Slider.Range />
23
+ // </Slider.Track>
24
+ // <Slider.Thumbs /> ← convenience component, renders one Thumb per value
25
+ // </Slider.Control>
26
+ // <Slider.ValueText /> ← optional, displays current value
27
+ // </Slider.Root>
28
+ //
29
+ // Key props on Root:
30
+ // defaultValue — uncontrolled initial value array, e.g. [50]
31
+ // value — controlled value array, e.g. [50]
32
+ // onValueChange — callback ({ value }: { value: number[] }) => void
33
+ // min — number (default: 0)
34
+ // max — number (default: 100)
35
+ // step — number (default: 1)
36
+ // orientation — 'horizontal' | 'vertical' (default: 'horizontal')
37
+ // disabled — boolean
38
+ // colorPalette — 'primary' | 'secondary' | 'tertiary' | 'neutral' | 'error'
39
+ //
40
+ // Convenience components:
41
+ // <Slider.Thumbs /> — renders one Thumb per value entry (use instead of
42
+ // manually mapping Slider.Thumb with index props)
43
+ // <Slider.Marks marks={[0, 25, 50, 75, 100]} /> — renders a MarkerGroup
44
+ figma.connect(
45
+ Slider.Root,
46
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-7988',
47
+ {
48
+ props: {
49
+ orientation: figma.enum('Orientation', {
50
+ Horizontal: 'horizontal',
51
+ Vertical: 'vertical',
52
+ }),
53
+ },
54
+ example: ({ orientation }) => (
55
+ <Slider.Root defaultValue={[50]} orientation={orientation}>
56
+ <Slider.Label>Volume</Slider.Label>
57
+ <Slider.Control>
58
+ <Slider.Track>
59
+ <Slider.Range />
60
+ </Slider.Track>
61
+ <Slider.Thumbs />
62
+ </Slider.Control>
63
+ </Slider.Root>
64
+ ),
65
+ },
66
+ );
@@ -0,0 +1,19 @@
1
+ import figma from '@figma/code-connect';
2
+ import { Stepper } from './Stepper';
3
+
4
+ figma.connect(
5
+ Stepper,
6
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-8520',
7
+ {
8
+ example: () => (
9
+ <Stepper
10
+ steps={[
11
+ { value: 'step1', title: 'Step 1' },
12
+ { value: 'step2', title: 'Step 2' },
13
+ { value: 'step3', title: 'Step 3' },
14
+ ]}
15
+ defaultStep={0}
16
+ />
17
+ ),
18
+ },
19
+ );
@@ -0,0 +1,25 @@
1
+ import figma from '@figma/code-connect';
2
+ import { StudioControls } from './index';
3
+
4
+ figma.connect(
5
+ StudioControls,
6
+ 'https://www.figma.com/design/GaHmFfmvO4loUzuZS4TgEz/Discourser.AI--V1?node-id=38-8232',
7
+ {
8
+ props: {
9
+ scenarioName: figma.string('Scenario Name'),
10
+ scenarioFocus: figma.string('Scenario Focus'),
11
+ scenarioLevel: figma.enum('Level', {
12
+ Beginner: 'beginner',
13
+ Intermediate: 'intermediate',
14
+ Advanced: 'advanced',
15
+ }),
16
+ },
17
+ example: ({ scenarioName, scenarioFocus, scenarioLevel }) => (
18
+ <StudioControls
19
+ scenarioName={scenarioName}
20
+ scenarioFocus={scenarioFocus}
21
+ scenarioLevel={scenarioLevel}
22
+ />
23
+ ),
24
+ },
25
+ );