sparkdesign 0.4.8 → 0.4.10

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 (71) hide show
  1. package/AGENT_COMPONENT_LIBRARY_QUICKREF.md +117 -0
  2. package/AI_README.md +7 -2
  3. package/README.md +4 -1
  4. package/cli/registry/AGENTS.md +1 -1
  5. package/cli/registry/agent-manifest.json +4040 -67
  6. package/cli/registry/basic/accordion.tsx +79 -0
  7. package/cli/registry/basic/badge.tsx +49 -0
  8. package/cli/registry/basic/button.tsx +19 -14
  9. package/cli/registry/basic/calendar.tsx +16 -16
  10. package/cli/registry/basic/collapsible-card.tsx +10 -1
  11. package/cli/registry/basic/combobox.tsx +11 -2
  12. package/cli/registry/basic/date-picker.tsx +3 -2
  13. package/cli/registry/basic/ellipsis-text.tsx +151 -0
  14. package/cli/registry/basic/form.tsx +186 -0
  15. package/cli/registry/basic/icon-button.tsx +12 -4
  16. package/cli/registry/basic/popover.tsx +19 -2
  17. package/cli/registry/basic/rating.tsx +161 -0
  18. package/cli/registry/basic/sidebar.tsx +665 -0
  19. package/cli/registry/basic/sonner.tsx +10 -10
  20. package/cli/registry/basic/stepper.tsx +163 -0
  21. package/cli/registry/basic/timeline.tsx +129 -0
  22. package/cli/registry/chat/chat-input/compound.tsx +1 -0
  23. package/cli/registry/chat/permission-card.tsx +1 -1
  24. package/cli/registry/chat/user-question/compound.tsx +2 -0
  25. package/cli/registry/meta.json +171 -13
  26. package/dist/registry/basic/accordion.d.ts +15 -0
  27. package/dist/registry/basic/badge.d.ts +23 -0
  28. package/dist/registry/basic/calendar.d.ts +1 -1
  29. package/dist/registry/basic/combobox.d.ts +2 -1
  30. package/dist/registry/basic/date-picker.d.ts +2 -2
  31. package/dist/registry/basic/ellipsis-text.d.ts +45 -0
  32. package/dist/registry/basic/form.d.ts +23 -0
  33. package/dist/registry/basic/icon-button.d.ts +15 -2
  34. package/dist/registry/basic/item.d.ts +1 -1
  35. package/dist/registry/basic/popover.d.ts +2 -0
  36. package/dist/registry/basic/rating.d.ts +31 -0
  37. package/dist/registry/basic/sidebar.d.ts +72 -0
  38. package/dist/registry/basic/stepper.d.ts +36 -0
  39. package/dist/registry/basic/tag.d.ts +1 -1
  40. package/dist/registry/basic/timeline.d.ts +34 -0
  41. package/dist/spark-design.cjs.js +27 -30
  42. package/dist/spark-design.es.js +6398 -5130
  43. package/dist/sparkdesign.css +1 -1
  44. package/dist/src/components/basic/Accordion/index.d.ts +13 -0
  45. package/dist/src/components/basic/Badge/index.d.ts +13 -0
  46. package/dist/src/components/basic/EllipsisText/index.d.ts +4 -36
  47. package/dist/src/components/basic/Form/index.d.ts +12 -0
  48. package/dist/src/components/basic/Rating/index.d.ts +13 -0
  49. package/dist/src/components/basic/Sidebar/index.d.ts +13 -0
  50. package/dist/src/components/basic/Stepper/index.d.ts +13 -0
  51. package/dist/src/components/basic/Timeline/index.d.ts +13 -0
  52. package/dist/src/components/index.d.ts +12 -4
  53. package/docs/agent/component-selection.md +104 -4
  54. package/docs/agent/prompt-recipes.md +167 -0
  55. package/docs/guides/agent-usage.md +213 -0
  56. package/docs/guides/system-operating-model.md +148 -0
  57. package/package.json +20 -3
  58. package/registry/agent-manifest.json +4040 -67
  59. package/cli/registry/basic/sheet.tsx +0 -18
  60. package/cli/registry/chat/user-question/UserQuestionCard.tsx +0 -198
  61. package/cli/registry/chat/user-question/UserQuestionFooter.tsx +0 -66
  62. package/cli/registry/chat/user-question/UserQuestionHeader.tsx +0 -64
  63. package/cli/registry/chat/user-question/useUserQuestionState.ts +0 -165
  64. package/dist/registry/basic/sheet.d.ts +0 -13
  65. package/dist/registry/chat/user-question/UserQuestionCard.d.ts +0 -36
  66. package/dist/registry/chat/user-question/UserQuestionFooter.d.ts +0 -24
  67. package/dist/registry/chat/user-question/UserQuestionHeader.d.ts +0 -26
  68. package/dist/registry/chat/user-question/useUserQuestionState.d.ts +0 -26
  69. package/dist/src/components/basic/CollapsibleSection/index.d.ts +0 -43
  70. package/dist/src/components/basic/Sheet/index.d.ts +0 -13
  71. package/dist/src/components/chat/Response/StreamingMarkdownBlock.d.ts +0 -12
@@ -0,0 +1,163 @@
1
+ import * as React from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+
4
+ import { cn } from '@/lib/utils'
5
+
6
+ type StepStatus = 'complete' | 'current' | 'upcoming' | 'error'
7
+
8
+ const stepperVariants = cva('group/stepper flex w-full', {
9
+ variants: {
10
+ orientation: {
11
+ horizontal: 'items-start',
12
+ vertical: 'flex-col',
13
+ },
14
+ },
15
+ defaultVariants: {
16
+ orientation: 'horizontal',
17
+ },
18
+ })
19
+
20
+ export interface StepperProps
21
+ extends React.OlHTMLAttributes<HTMLOListElement>,
22
+ VariantProps<typeof stepperVariants> {}
23
+
24
+ export interface StepperItemProps extends React.LiHTMLAttributes<HTMLLIElement> {
25
+ status?: StepStatus
26
+ }
27
+
28
+ export type StepperIndicatorProps = React.HTMLAttributes<HTMLSpanElement>
29
+ export type StepperContentProps = React.HTMLAttributes<HTMLDivElement>
30
+ export type StepperTitleProps = React.HTMLAttributes<HTMLDivElement>
31
+ export type StepperDescriptionProps = React.HTMLAttributes<HTMLDivElement>
32
+ export type StepperSeparatorProps = React.HTMLAttributes<HTMLSpanElement>
33
+
34
+ function CheckIcon() {
35
+ return (
36
+ <svg aria-hidden="true" viewBox="0 0 16 16" className="size-3.5">
37
+ <path
38
+ fill="currentColor"
39
+ d="M6.2 11.3 2.9 8l1-1 2.3 2.3 5-5 1 1-6 6z"
40
+ />
41
+ </svg>
42
+ )
43
+ }
44
+
45
+ function Stepper({
46
+ className,
47
+ orientation = 'horizontal',
48
+ ...props
49
+ }: StepperProps) {
50
+ return (
51
+ <ol
52
+ data-slot="stepper"
53
+ data-orientation={orientation}
54
+ className={cn(stepperVariants({ orientation }), className)}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ function StepperItem({
61
+ className,
62
+ status = 'upcoming',
63
+ ...props
64
+ }: StepperItemProps) {
65
+ return (
66
+ <li
67
+ data-slot="stepper-item"
68
+ data-status={status}
69
+ className={cn(
70
+ 'group/stepper-item relative flex min-w-0 flex-1 gap-3',
71
+ 'group-data-[orientation=horizontal]/stepper:flex-col group-data-[orientation=horizontal]/stepper:items-center group-data-[orientation=horizontal]/stepper:gap-2 group-data-[orientation=horizontal]/stepper:text-center',
72
+ 'data-[status=current]:text-text data-[status=upcoming]:text-text-tertiary',
73
+ 'data-[status=complete]:text-text data-[status=error]:text-error',
74
+ className
75
+ )}
76
+ {...props}
77
+ />
78
+ )
79
+ }
80
+
81
+ function StepperIndicator({ className, children, ...props }: StepperIndicatorProps) {
82
+ return (
83
+ <span
84
+ data-slot="stepper-indicator"
85
+ className={cn(
86
+ 'z-10 flex size-7 shrink-0 items-center justify-center rounded-full border text-xs font-semibold transition-colors',
87
+ 'border-border-tertiary bg-bg-container text-text-tertiary',
88
+ 'group-data-[status=complete]/stepper-item:border-primary group-data-[status=complete]/stepper-item:bg-primary group-data-[status=complete]/stepper-item:text-text-on-primary',
89
+ 'group-data-[status=current]/stepper-item:border-primary group-data-[status=current]/stepper-item:text-primary',
90
+ 'group-data-[status=error]/stepper-item:border-error group-data-[status=error]/stepper-item:bg-error-bg group-data-[status=error]/stepper-item:text-error',
91
+ className
92
+ )}
93
+ {...props}
94
+ >
95
+ <span className="group-data-[status=complete]/stepper-item:hidden">
96
+ {children}
97
+ </span>
98
+ <span className="hidden group-data-[status=complete]/stepper-item:inline-flex">
99
+ <CheckIcon />
100
+ </span>
101
+ </span>
102
+ )
103
+ }
104
+
105
+ function StepperContent({ className, ...props }: StepperContentProps) {
106
+ return (
107
+ <div
108
+ data-slot="stepper-content"
109
+ className={cn(
110
+ 'min-w-0 flex-1 pb-6 group-data-[orientation=horizontal]/stepper:pb-0',
111
+ className
112
+ )}
113
+ {...props}
114
+ />
115
+ )
116
+ }
117
+
118
+ function StepperTitle({ className, ...props }: StepperTitleProps) {
119
+ return (
120
+ <div
121
+ data-slot="stepper-title"
122
+ className={cn('text-sm font-medium leading-5 text-current', className)}
123
+ {...props}
124
+ />
125
+ )
126
+ }
127
+
128
+ function StepperDescription({ className, ...props }: StepperDescriptionProps) {
129
+ return (
130
+ <div
131
+ data-slot="stepper-description"
132
+ className={cn('mt-1 text-sm leading-5 text-text-tertiary', className)}
133
+ {...props}
134
+ />
135
+ )
136
+ }
137
+
138
+ function StepperSeparator({ className, ...props }: StepperSeparatorProps) {
139
+ return (
140
+ <span
141
+ aria-hidden="true"
142
+ data-slot="stepper-separator"
143
+ className={cn(
144
+ 'absolute left-3.5 top-7 h-[calc(100%-1.75rem)] w-px -translate-x-1/2 bg-border-tertiary',
145
+ 'group-data-[orientation=horizontal]/stepper:left-[calc(50%+1rem)] group-data-[orientation=horizontal]/stepper:right-[calc(-50%+1rem)] group-data-[orientation=horizontal]/stepper:top-3.5 group-data-[orientation=horizontal]/stepper:h-px group-data-[orientation=horizontal]/stepper:w-auto group-data-[orientation=horizontal]/stepper:translate-x-0',
146
+ 'group-data-[status=complete]/stepper-item:bg-primary',
147
+ className
148
+ )}
149
+ {...props}
150
+ />
151
+ )
152
+ }
153
+
154
+ export {
155
+ Stepper,
156
+ StepperItem,
157
+ StepperIndicator,
158
+ StepperContent,
159
+ StepperTitle,
160
+ StepperDescription,
161
+ StepperSeparator,
162
+ }
163
+ export type { StepStatus }
@@ -0,0 +1,129 @@
1
+ import * as React from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+
4
+ import { cn } from '@/lib/utils'
5
+
6
+ const timelineMarkerVariants = cva(
7
+ 'mt-1.5 flex size-2.5 shrink-0 rounded-full ring-4 ring-bg-base',
8
+ {
9
+ variants: {
10
+ tone: {
11
+ default: 'bg-border',
12
+ primary: 'bg-primary',
13
+ success: 'bg-success',
14
+ warning: 'bg-warning',
15
+ error: 'bg-error',
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ tone: 'default',
20
+ },
21
+ }
22
+ )
23
+
24
+ export type TimelineProps = React.OlHTMLAttributes<HTMLOListElement>
25
+ export type TimelineItemProps = React.LiHTMLAttributes<HTMLLIElement>
26
+ export type TimelineContentProps = React.HTMLAttributes<HTMLDivElement>
27
+ export type TimelineTitleProps = React.HTMLAttributes<HTMLDivElement>
28
+ export type TimelineDescriptionProps = React.HTMLAttributes<HTMLDivElement>
29
+ export type TimelineTimeProps = React.TimeHTMLAttributes<HTMLTimeElement>
30
+ export type TimelineConnectorProps = React.HTMLAttributes<HTMLSpanElement>
31
+ export interface TimelineMarkerProps
32
+ extends React.HTMLAttributes<HTMLSpanElement>,
33
+ VariantProps<typeof timelineMarkerVariants> {}
34
+
35
+ function Timeline({ className, ...props }: TimelineProps) {
36
+ return (
37
+ <ol
38
+ data-slot="timeline"
39
+ className={cn('flex flex-col', className)}
40
+ {...props}
41
+ />
42
+ )
43
+ }
44
+
45
+ function TimelineItem({ className, ...props }: TimelineItemProps) {
46
+ return (
47
+ <li
48
+ data-slot="timeline-item"
49
+ className={cn('group/timeline-item relative grid grid-cols-[auto_minmax(0,1fr)] gap-3 pb-6 last:pb-0', className)}
50
+ {...props}
51
+ />
52
+ )
53
+ }
54
+
55
+ function TimelineMarker({ className, tone, ...props }: TimelineMarkerProps) {
56
+ return (
57
+ <span
58
+ data-slot="timeline-marker"
59
+ className={cn(timelineMarkerVariants({ tone }), className)}
60
+ {...props}
61
+ />
62
+ )
63
+ }
64
+
65
+ function TimelineConnector({ className, ...props }: TimelineConnectorProps) {
66
+ return (
67
+ <span
68
+ aria-hidden="true"
69
+ data-slot="timeline-connector"
70
+ className={cn(
71
+ 'absolute left-1.5 top-5 h-[calc(100%-1.25rem)] w-px bg-border-tertiary group-last/timeline-item:hidden',
72
+ className
73
+ )}
74
+ {...props}
75
+ />
76
+ )
77
+ }
78
+
79
+ function TimelineContent({ className, ...props }: TimelineContentProps) {
80
+ return (
81
+ <div
82
+ data-slot="timeline-content"
83
+ className={cn('min-w-0', className)}
84
+ {...props}
85
+ />
86
+ )
87
+ }
88
+
89
+ function TimelineTitle({ className, ...props }: TimelineTitleProps) {
90
+ return (
91
+ <div
92
+ data-slot="timeline-title"
93
+ className={cn('text-sm font-medium leading-5 text-text', className)}
94
+ {...props}
95
+ />
96
+ )
97
+ }
98
+
99
+ function TimelineDescription({ className, ...props }: TimelineDescriptionProps) {
100
+ return (
101
+ <div
102
+ data-slot="timeline-description"
103
+ className={cn('mt-1 text-sm leading-6 text-text-tertiary', className)}
104
+ {...props}
105
+ />
106
+ )
107
+ }
108
+
109
+ function TimelineTime({ className, ...props }: TimelineTimeProps) {
110
+ return (
111
+ <time
112
+ data-slot="timeline-time"
113
+ className={cn('mt-1 block text-xs leading-5 text-text-quaternary', className)}
114
+ {...props}
115
+ />
116
+ )
117
+ }
118
+
119
+ export {
120
+ Timeline,
121
+ TimelineItem,
122
+ TimelineMarker,
123
+ TimelineConnector,
124
+ TimelineContent,
125
+ TimelineTitle,
126
+ TimelineDescription,
127
+ TimelineTime,
128
+ timelineMarkerVariants,
129
+ }
@@ -208,6 +208,7 @@ export function ChatInputMoreButton() {
208
208
  icon={ctx.addLargeIcon ?? <MoreLine className="h-5 w-5" />}
209
209
  onClick={ctx.onMoreButtonClick}
210
210
  disabled={ctx.disabled}
211
+ aria-label="More actions"
211
212
  />
212
213
  )
213
214
  }
@@ -103,7 +103,7 @@ export const PermissionCard = forwardRef<HTMLDivElement, PermissionCardProps>(
103
103
  <p className="mb-2 ml-6 text-xs leading-xs text-text-tertiary">
104
104
  {isLoadingIntent ? (
105
105
  <span className="inline-flex items-center gap-1.5">
106
- <div className="inline-block h-3 w-3 animate-spin rounded-full border-2 border-text-tertiary border-t-transparent" />
106
+ <span className="inline-block h-3 w-3 animate-spin rounded-full border-2 border-text-tertiary border-t-transparent" />
107
107
  <span>{displayDescription}</span>
108
108
  </span>
109
109
  ) : (
@@ -39,6 +39,7 @@ export function UserQuestionHeader({ className }: UserQuestionHeaderProps) {
39
39
  onClick={ctx.handlePrevious}
40
40
  disabled={ctx.currentQuestionIndex === 0}
41
41
  icon={ctx.arrowUpSIcon}
42
+ aria-label="Previous question"
42
43
  />
43
44
  <span className="text-xs leading-xs text-text-tertiary px-1">
44
45
  {ctx.currentQuestionIndex + 1} / {ctx.questions.length}
@@ -49,6 +50,7 @@ export function UserQuestionHeader({ className }: UserQuestionHeaderProps) {
49
50
  onClick={ctx.handleNext}
50
51
  disabled={ctx.currentQuestionIndex === ctx.questions.length - 1}
51
52
  icon={ctx.arrowDownSIcon}
53
+ aria-label="Next question"
52
54
  />
53
55
  </div>
54
56
  )}
@@ -1,4 +1,17 @@
1
1
  {
2
+ "accordion": {
3
+ "files": [
4
+ "basic/accordion.tsx",
5
+ "basic/icons-inline.tsx"
6
+ ],
7
+ "dependencies": [
8
+ "@radix-ui/react-accordion"
9
+ ],
10
+ "peerDependencies": [
11
+ "react",
12
+ "react-dom"
13
+ ]
14
+ },
2
15
  "alert": {
3
16
  "files": [
4
17
  "basic/alert.tsx"
@@ -69,6 +82,19 @@
69
82
  "react-dom"
70
83
  ]
71
84
  },
85
+ "badge": {
86
+ "files": [
87
+ "basic/badge.tsx"
88
+ ],
89
+ "dependencies": [
90
+ "@radix-ui/react-slot",
91
+ "class-variance-authority"
92
+ ],
93
+ "peerDependencies": [
94
+ "react",
95
+ "react-dom"
96
+ ]
97
+ },
72
98
  "breadcrumb": {
73
99
  "files": [
74
100
  "basic/breadcrumb.tsx",
@@ -456,6 +482,22 @@
456
482
  "react-dom"
457
483
  ]
458
484
  },
485
+ "ellipsis-text": {
486
+ "files": [
487
+ "basic/ellipsis-text.tsx",
488
+ "basic/tooltip.tsx",
489
+ "basic/theme-from-document.ts"
490
+ ],
491
+ "dependencies": [
492
+ "@radix-ui/react-tooltip",
493
+ "clsx",
494
+ "framer-motion"
495
+ ],
496
+ "peerDependencies": [
497
+ "react",
498
+ "react-dom"
499
+ ]
500
+ },
459
501
  "empty": {
460
502
  "files": [
461
503
  "basic/empty.tsx"
@@ -542,6 +584,21 @@
542
584
  "react-dom"
543
585
  ]
544
586
  },
587
+ "form": {
588
+ "files": [
589
+ "basic/form.tsx",
590
+ "basic/label.tsx"
591
+ ],
592
+ "dependencies": [
593
+ "@radix-ui/react-label",
594
+ "@radix-ui/react-slot",
595
+ "react-hook-form"
596
+ ],
597
+ "peerDependencies": [
598
+ "react",
599
+ "react-dom"
600
+ ]
601
+ },
545
602
  "generated-images-grid": {
546
603
  "files": [
547
604
  "chat/generated-images-grid.tsx"
@@ -911,6 +968,18 @@
911
968
  "react-dom"
912
969
  ]
913
970
  },
971
+ "rating": {
972
+ "files": [
973
+ "basic/rating.tsx"
974
+ ],
975
+ "dependencies": [
976
+ "class-variance-authority"
977
+ ],
978
+ "peerDependencies": [
979
+ "react",
980
+ "react-dom"
981
+ ]
982
+ },
914
983
  "reasoning-step": {
915
984
  "files": [
916
985
  "chat/reasoning-step/index.tsx",
@@ -1052,32 +1121,43 @@
1052
1121
  "react-dom"
1053
1122
  ]
1054
1123
  },
1055
- "sheet": {
1124
+ "shimmering-text": {
1056
1125
  "files": [
1057
- "basic/sheet.tsx",
1058
- "basic/drawer.tsx",
1059
- "basic/icons-inline.tsx",
1060
- "basic/theme-from-document.ts"
1126
+ "basic/shimmering-text.tsx",
1127
+ "lib/utils.ts"
1061
1128
  ],
1062
1129
  "dependencies": [
1063
- "@radix-ui/react-dialog",
1064
- "class-variance-authority",
1065
- "framer-motion"
1130
+ "clsx",
1131
+ "framer-motion",
1132
+ "tailwind-merge"
1066
1133
  ],
1067
1134
  "peerDependencies": [
1068
1135
  "react",
1069
1136
  "react-dom"
1070
1137
  ]
1071
1138
  },
1072
- "shimmering-text": {
1139
+ "sidebar": {
1073
1140
  "files": [
1074
- "basic/shimmering-text.tsx",
1075
- "lib/utils.ts"
1141
+ "basic/sidebar.tsx",
1142
+ "basic/button.tsx",
1143
+ "basic/spinner.tsx",
1144
+ "basic/icons-inline.tsx",
1145
+ "basic/input.tsx",
1146
+ "basic/separator.tsx",
1147
+ "basic/drawer.tsx",
1148
+ "basic/theme-from-document.ts",
1149
+ "basic/skeleton.tsx",
1150
+ "basic/tooltip.tsx"
1076
1151
  ],
1077
1152
  "dependencies": [
1078
- "clsx",
1153
+ "@radix-ui/react-dialog",
1154
+ "@radix-ui/react-separator",
1155
+ "@radix-ui/react-slot",
1156
+ "@radix-ui/react-tooltip",
1157
+ "class-variance-authority",
1079
1158
  "framer-motion",
1080
- "tailwind-merge"
1159
+ "lucide-react",
1160
+ "radix-ui"
1081
1161
  ],
1082
1162
  "peerDependencies": [
1083
1163
  "react",
@@ -1138,6 +1218,18 @@
1138
1218
  "react-dom"
1139
1219
  ]
1140
1220
  },
1221
+ "stepper": {
1222
+ "files": [
1223
+ "basic/stepper.tsx"
1224
+ ],
1225
+ "dependencies": [
1226
+ "class-variance-authority"
1227
+ ],
1228
+ "peerDependencies": [
1229
+ "react",
1230
+ "react-dom"
1231
+ ]
1232
+ },
1141
1233
  "streaming-markdown-block": {
1142
1234
  "files": [
1143
1235
  "chat/streaming-markdown-block.tsx",
@@ -1260,6 +1352,31 @@
1260
1352
  "react-dom"
1261
1353
  ]
1262
1354
  },
1355
+ "timeline": {
1356
+ "files": [
1357
+ "basic/timeline.tsx"
1358
+ ],
1359
+ "dependencies": [
1360
+ "class-variance-authority"
1361
+ ],
1362
+ "peerDependencies": [
1363
+ "react",
1364
+ "react-dom"
1365
+ ]
1366
+ },
1367
+ "toast": {
1368
+ "files": [
1369
+ "basic/sonner.tsx",
1370
+ "basic/theme-from-document.ts"
1371
+ ],
1372
+ "dependencies": [
1373
+ "sonner"
1374
+ ],
1375
+ "peerDependencies": [
1376
+ "react",
1377
+ "react-dom"
1378
+ ]
1379
+ },
1263
1380
  "toggle": {
1264
1381
  "files": [
1265
1382
  "basic/toggle.tsx"
@@ -1274,6 +1391,20 @@
1274
1391
  "react-dom"
1275
1392
  ]
1276
1393
  },
1394
+ "toggle-group": {
1395
+ "files": [
1396
+ "basic/toggle.tsx"
1397
+ ],
1398
+ "dependencies": [
1399
+ "@radix-ui/react-toggle",
1400
+ "@radix-ui/react-toggle-group",
1401
+ "class-variance-authority"
1402
+ ],
1403
+ "peerDependencies": [
1404
+ "react",
1405
+ "react-dom"
1406
+ ]
1407
+ },
1277
1408
  "tool-invocation-card": {
1278
1409
  "files": [
1279
1410
  "chat/tool-invocation-card.tsx",
@@ -1331,5 +1462,32 @@
1331
1462
  "react",
1332
1463
  "react-dom"
1333
1464
  ]
1465
+ },
1466
+ "user-question-part": {
1467
+ "files": [
1468
+ "chat/user-question/index.tsx",
1469
+ "chat/user-question/context.tsx",
1470
+ "basic/icons-inline.tsx",
1471
+ "chat/user-question/types.ts",
1472
+ "chat/user-question/compound.tsx",
1473
+ "lib/utils.ts",
1474
+ "basic/icon-button.tsx",
1475
+ "basic/button.tsx",
1476
+ "basic/spinner.tsx",
1477
+ "basic/option-list.tsx",
1478
+ "basic/scrollbar.tsx",
1479
+ "chat/user-question/useUserQuestionKeyboard.ts"
1480
+ ],
1481
+ "dependencies": [
1482
+ "class-variance-authority",
1483
+ "clsx",
1484
+ "framer-motion",
1485
+ "radix-ui",
1486
+ "tailwind-merge"
1487
+ ],
1488
+ "peerDependencies": [
1489
+ "react",
1490
+ "react-dom"
1491
+ ]
1334
1492
  }
1335
1493
  }
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
+ declare const Accordion: React.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & React.RefAttributes<HTMLDivElement>>;
4
+ declare const AccordionItem: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
+ declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
6
+ chevronIcon?: React.ReactNode;
7
+ } & React.RefAttributes<HTMLButtonElement>>;
8
+ declare const AccordionContent: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
+ export type AccordionProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>;
10
+ export type AccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>;
11
+ export type AccordionTriggerProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> & {
12
+ chevronIcon?: React.ReactNode;
13
+ };
14
+ export type AccordionContentProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>;
15
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * [WHO]: Badge component for compact labels and statuses.
3
+ * [FROM]: React, @radix-ui/react-slot, class-variance-authority, registry/lib/utils.
4
+ * [TO]: sparkdesign package consumers; Showcase; CLI registry copies.
5
+ * [HERE]: registry/basic/badge.tsx — tokenized status/category badge primitive.
6
+ *
7
+ * [PROTOCOL]:
8
+ * 1. Keep this P3 header in sync when the public contract changes.
9
+ * 2. Update module AGENTS.md (P2) and root AGENTS.md (P1) when boundaries change.
10
+ * 3. Follow design tokens and explicit type exports.
11
+ */
12
+ import * as React from "react";
13
+ import { type VariantProps } from "class-variance-authority";
14
+ declare const badgeVariants: (props?: ({
15
+ variant?: "default" | "secondary" | "outline" | "destructive" | null | undefined;
16
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
17
+ declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
18
+ asChild?: boolean;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ export type BadgeProps = React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
21
+ asChild?: boolean;
22
+ };
23
+ export { Badge, badgeVariants };
@@ -2,7 +2,7 @@
2
2
  * [WHO]: Calendar and CalendarDayButton date grid primitives.
3
3
  * [FROM]: React, react-day-picker, registry/basic/button, registry/lib/utils.
4
4
  * [TO]: sparkdesign package consumers; Showcase; CLI registry copies.
5
- * [HERE]: registry/basic/calendar.tsx — tokenized shadcn-derived calendar primitive.
5
+ * [HERE]: registry/basic/calendar.tsx — tokenized shadcn-compatible Calendar primitive.
6
6
  *
7
7
  * [PROTOCOL]:
8
8
  * 1. Keep this P3 header in sync when the public contract changes.
@@ -18,6 +18,7 @@ export interface ComboboxOption {
18
18
  }
19
19
  export interface ComboboxProps {
20
20
  options: ComboboxOption[];
21
+ size?: 'default' | 'compact';
21
22
  value?: string;
22
23
  defaultValue?: string;
23
24
  onValueChange?: (value: string) => void;
@@ -33,5 +34,5 @@ export interface ComboboxProps {
33
34
  name?: string;
34
35
  'aria-label'?: string;
35
36
  }
36
- declare function Combobox({ options, value, defaultValue, onValueChange, placeholder, searchPlaceholder, emptyText, disabled, className, contentClassName, triggerClassName, align, id, name, 'aria-label': ariaLabel, }: ComboboxProps): import("react/jsx-runtime").JSX.Element;
37
+ declare function Combobox({ options, value, defaultValue, onValueChange, placeholder, searchPlaceholder, emptyText, size, disabled, className, contentClassName, triggerClassName, align, id, name, 'aria-label': ariaLabel, }: ComboboxProps): import("react/jsx-runtime").JSX.Element;
37
38
  export { Combobox };
@@ -1,8 +1,8 @@
1
1
  /**
2
- * [WHO]: DatePicker Popover + Calendar composition matching shadcn parity.
2
+ * [WHO]: DatePicker composes a Spark trigger with the shared Calendar in a Popover.
3
3
  * [FROM]: React, date-fns, registry/basic/button, registry/basic/calendar, registry/basic/popover, registry/lib/utils.
4
4
  * [TO]: sparkdesign package consumers; output of CLI `add date-picker` when registered.
5
- * [HERE]: registry/basic/date-picker.tsx — Spark Design source; tokenized shadcn-compatible date picker.
5
+ * [HERE]: registry/basic/date-picker.tsx — Spark Design date picker source.
6
6
  *
7
7
  * [PROTOCOL]:
8
8
  * 1. Render a Button trigger that surfaces the selected date using project typography/tokens.