@adres/mgda-ui 0.0.0-stage → 0.0.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 (325) hide show
  1. package/brand-knowledge.json +451 -0
  2. package/knowledge/accordion.md +135 -0
  3. package/knowledge/activity-rings.md +123 -0
  4. package/knowledge/alert.md +184 -0
  5. package/knowledge/answer-actions.md +217 -0
  6. package/knowledge/aspect-ratio.md +82 -0
  7. package/knowledge/avatar.md +158 -0
  8. package/knowledge/badge.md +172 -0
  9. package/knowledge/bar-graph.md +167 -0
  10. package/knowledge/bento-grid.md +115 -0
  11. package/knowledge/blockquote.md +153 -0
  12. package/knowledge/box-list.md +177 -0
  13. package/knowledge/bullet-list.md +128 -0
  14. package/knowledge/button-group.md +179 -0
  15. package/knowledge/button.md +231 -0
  16. package/knowledge/calendar.md +168 -0
  17. package/knowledge/card.md +321 -0
  18. package/knowledge/cards-nav.md +170 -0
  19. package/knowledge/chain-of-thought.md +164 -0
  20. package/knowledge/chat-container.md +135 -0
  21. package/knowledge/chat-message.md +224 -0
  22. package/knowledge/checkbox-card.md +172 -0
  23. package/knowledge/checkbox.md +111 -0
  24. package/knowledge/citations.md +241 -0
  25. package/knowledge/combobox.md +265 -0
  26. package/knowledge/countdown-pill.md +153 -0
  27. package/knowledge/cta.md +118 -0
  28. package/knowledge/data-list.md +173 -0
  29. package/knowledge/data-table.md +220 -0
  30. package/knowledge/dialog.md +249 -0
  31. package/knowledge/drawer.md +236 -0
  32. package/knowledge/dropdown-menu.md +238 -0
  33. package/knowledge/dropzone.md +153 -0
  34. package/knowledge/email-chips-input.md +161 -0
  35. package/knowledge/empty-state.md +106 -0
  36. package/knowledge/entity-header.md +166 -0
  37. package/knowledge/feature-grid.md +120 -0
  38. package/knowledge/feedback-bar.md +127 -0
  39. package/knowledge/footer.md +116 -0
  40. package/knowledge/heading.md +189 -0
  41. package/knowledge/hero.md +361 -0
  42. package/knowledge/input-button.md +187 -0
  43. package/knowledge/input-group.md +185 -0
  44. package/knowledge/input.md +256 -0
  45. package/knowledge/inset.md +177 -0
  46. package/knowledge/kpi-card.md +206 -0
  47. package/knowledge/list-nav.md +181 -0
  48. package/knowledge/logo-cloud.md +102 -0
  49. package/knowledge/media-gallery.md +158 -0
  50. package/knowledge/message-actions.md +175 -0
  51. package/knowledge/nav-sidebar.md +225 -0
  52. package/knowledge/number-stepper.md +159 -0
  53. package/knowledge/page-header.md +109 -0
  54. package/knowledge/pagination.md +225 -0
  55. package/knowledge/popover.md +159 -0
  56. package/knowledge/pricing.md +132 -0
  57. package/knowledge/progress.md +156 -0
  58. package/knowledge/prompt-input.md +337 -0
  59. package/knowledge/prompt-suggestions.md +168 -0
  60. package/knowledge/quota-bar.md +160 -0
  61. package/knowledge/quote.md +116 -0
  62. package/knowledge/radio-card.md +172 -0
  63. package/knowledge/radio-group.md +135 -0
  64. package/knowledge/reasoning.md +142 -0
  65. package/knowledge/search.md +131 -0
  66. package/knowledge/section-nav.md +162 -0
  67. package/knowledge/segmented-control.md +181 -0
  68. package/knowledge/select-button.md +205 -0
  69. package/knowledge/select.md +210 -0
  70. package/knowledge/separator.md +75 -0
  71. package/knowledge/shimmer-text.md +140 -0
  72. package/knowledge/sidebar.md +227 -0
  73. package/knowledge/skeleton.md +142 -0
  74. package/knowledge/slider.md +133 -0
  75. package/knowledge/slideshow.md +159 -0
  76. package/knowledge/source.md +156 -0
  77. package/knowledge/spinner.md +120 -0
  78. package/knowledge/stat-strip.md +128 -0
  79. package/knowledge/stats.md +117 -0
  80. package/knowledge/step-indicator.md +157 -0
  81. package/knowledge/switch.md +88 -0
  82. package/knowledge/table.md +190 -0
  83. package/knowledge/tabs.md +169 -0
  84. package/knowledge/testimonials.md +115 -0
  85. package/knowledge/text-link.md +192 -0
  86. package/knowledge/text.md +194 -0
  87. package/knowledge/thinking-bar.md +115 -0
  88. package/knowledge/thinking-steps.md +140 -0
  89. package/knowledge/toaster.md +127 -0
  90. package/knowledge/toggle.md +113 -0
  91. package/knowledge/tool-call-card.md +241 -0
  92. package/knowledge/tooltip.md +120 -0
  93. package/knowledge/top-nav.md +138 -0
  94. package/knowledge.json +19854 -0
  95. package/package.json +94 -4
  96. package/src/components/accordion.stories.tsx +46 -0
  97. package/src/components/accordion.tsx +74 -0
  98. package/src/components/activity-rings.stories.tsx +73 -0
  99. package/src/components/activity-rings.tsx +121 -0
  100. package/src/components/alert.stories.tsx +43 -0
  101. package/src/components/alert.tsx +132 -0
  102. package/src/components/answer-actions.stories.tsx +54 -0
  103. package/src/components/answer-actions.test.tsx +37 -0
  104. package/src/components/answer-actions.tsx +313 -0
  105. package/src/components/aspect-ratio.stories.tsx +32 -0
  106. package/src/components/aspect-ratio.tsx +5 -0
  107. package/src/components/avatar.stories.tsx +40 -0
  108. package/src/components/avatar.tsx +154 -0
  109. package/src/components/badge.stories.tsx +27 -0
  110. package/src/components/badge.tsx +63 -0
  111. package/src/components/bar-graph.stories.tsx +28 -0
  112. package/src/components/bar-graph.tsx +204 -0
  113. package/src/components/bento-grid.stories.tsx +23 -0
  114. package/src/components/bento-grid.tsx +67 -0
  115. package/src/components/blockquote.stories.tsx +28 -0
  116. package/src/components/blockquote.tsx +88 -0
  117. package/src/components/box-list.stories.tsx +25 -0
  118. package/src/components/box-list.tsx +108 -0
  119. package/src/components/bullet-list.stories.tsx +22 -0
  120. package/src/components/bullet-list.tsx +101 -0
  121. package/src/components/button-group.stories.tsx +31 -0
  122. package/src/components/button-group.tsx +156 -0
  123. package/src/components/button.stories.tsx +66 -0
  124. package/src/components/button.test.ts +17 -0
  125. package/src/components/button.tsx +139 -0
  126. package/src/components/calendar.stories.tsx +25 -0
  127. package/src/components/calendar.tsx +367 -0
  128. package/src/components/card.stories.tsx +44 -0
  129. package/src/components/card.tsx +392 -0
  130. package/src/components/cards-nav.stories.tsx +35 -0
  131. package/src/components/cards-nav.tsx +115 -0
  132. package/src/components/chain-of-thought.stories.tsx +67 -0
  133. package/src/components/chain-of-thought.test.tsx +50 -0
  134. package/src/components/chain-of-thought.tsx +170 -0
  135. package/src/components/chat-container.stories.tsx +47 -0
  136. package/src/components/chat-container.test.tsx +49 -0
  137. package/src/components/chat-container.tsx +222 -0
  138. package/src/components/chat-message.stories.tsx +52 -0
  139. package/src/components/chat-message.test.tsx +36 -0
  140. package/src/components/chat-message.tsx +163 -0
  141. package/src/components/checkbox-card.stories.tsx +27 -0
  142. package/src/components/checkbox-card.tsx +200 -0
  143. package/src/components/checkbox.stories.tsx +26 -0
  144. package/src/components/checkbox.tsx +61 -0
  145. package/src/components/citations.stories.tsx +64 -0
  146. package/src/components/citations.test.tsx +61 -0
  147. package/src/components/citations.tsx +220 -0
  148. package/src/components/combobox.stories.tsx +184 -0
  149. package/src/components/combobox.test.tsx +82 -0
  150. package/src/components/combobox.tsx +407 -0
  151. package/src/components/countdown-pill.stories.tsx +24 -0
  152. package/src/components/countdown-pill.tsx +129 -0
  153. package/src/components/cta.stories.tsx +29 -0
  154. package/src/components/cta.tsx +52 -0
  155. package/src/components/data-list.stories.tsx +50 -0
  156. package/src/components/data-list.test.tsx +35 -0
  157. package/src/components/data-list.tsx +181 -0
  158. package/src/components/data-table.stories.tsx +29 -0
  159. package/src/components/data-table.tsx +200 -0
  160. package/src/components/dialog.stories.tsx +42 -0
  161. package/src/components/dialog.tsx +200 -0
  162. package/src/components/drawer.stories.tsx +48 -0
  163. package/src/components/drawer.tsx +385 -0
  164. package/src/components/dropdown-menu.stories.tsx +41 -0
  165. package/src/components/dropdown-menu.tsx +252 -0
  166. package/src/components/dropzone.stories.tsx +19 -0
  167. package/src/components/dropzone.tsx +250 -0
  168. package/src/components/email-chips-input.stories.tsx +135 -0
  169. package/src/components/email-chips-input.tsx +210 -0
  170. package/src/components/empty-state.stories.tsx +22 -0
  171. package/src/components/empty-state.tsx +35 -0
  172. package/src/components/entity-header.stories.tsx +43 -0
  173. package/src/components/entity-header.test.tsx +35 -0
  174. package/src/components/entity-header.tsx +92 -0
  175. package/src/components/feature-grid.stories.tsx +25 -0
  176. package/src/components/feature-grid.tsx +87 -0
  177. package/src/components/feedback-bar.stories.tsx +25 -0
  178. package/src/components/feedback-bar.test.tsx +24 -0
  179. package/src/components/feedback-bar.tsx +62 -0
  180. package/src/components/footer.stories.tsx +23 -0
  181. package/src/components/footer.tsx +78 -0
  182. package/src/components/heading.stories.tsx +45 -0
  183. package/src/components/heading.test.tsx +22 -0
  184. package/src/components/heading.tsx +77 -0
  185. package/src/components/hero.stories.tsx +38 -0
  186. package/src/components/hero.tsx +498 -0
  187. package/src/components/input-button.stories.tsx +19 -0
  188. package/src/components/input-button.tsx +112 -0
  189. package/src/components/input-group.stories.tsx +38 -0
  190. package/src/components/input-group.tsx +157 -0
  191. package/src/components/input.stories.tsx +31 -0
  192. package/src/components/input.tsx +284 -0
  193. package/src/components/inset.stories.tsx +29 -0
  194. package/src/components/inset.tsx +70 -0
  195. package/src/components/kpi-card.stories.tsx +29 -0
  196. package/src/components/kpi-card.tsx +284 -0
  197. package/src/components/list-nav.stories.tsx +22 -0
  198. package/src/components/list-nav.tsx +145 -0
  199. package/src/components/logo-cloud.stories.tsx +23 -0
  200. package/src/components/logo-cloud.tsx +42 -0
  201. package/src/components/media-gallery.stories.tsx +25 -0
  202. package/src/components/media-gallery.tsx +347 -0
  203. package/src/components/message-actions.stories.tsx +45 -0
  204. package/src/components/message-actions.test.tsx +32 -0
  205. package/src/components/message-actions.tsx +119 -0
  206. package/src/components/nav-sidebar.stories.tsx +58 -0
  207. package/src/components/nav-sidebar.test.tsx +54 -0
  208. package/src/components/nav-sidebar.tsx +462 -0
  209. package/src/components/number-stepper.stories.tsx +19 -0
  210. package/src/components/number-stepper.tsx +158 -0
  211. package/src/components/page-header.stories.tsx +25 -0
  212. package/src/components/page-header.tsx +64 -0
  213. package/src/components/pagination.stories.tsx +110 -0
  214. package/src/components/pagination.test.tsx +46 -0
  215. package/src/components/pagination.tsx +144 -0
  216. package/src/components/popover.stories.tsx +26 -0
  217. package/src/components/popover.tsx +62 -0
  218. package/src/components/pricing.stories.tsx +42 -0
  219. package/src/components/pricing.tsx +130 -0
  220. package/src/components/progress.stories.tsx +22 -0
  221. package/src/components/progress.tsx +189 -0
  222. package/src/components/prompt-input.stories.tsx +62 -0
  223. package/src/components/prompt-input.test.tsx +106 -0
  224. package/src/components/prompt-input.tsx +343 -0
  225. package/src/components/prompt-suggestions.stories.tsx +53 -0
  226. package/src/components/prompt-suggestions.test.tsx +37 -0
  227. package/src/components/prompt-suggestions.tsx +122 -0
  228. package/src/components/quota-bar.stories.tsx +19 -0
  229. package/src/components/quota-bar.tsx +191 -0
  230. package/src/components/quote.stories.tsx +18 -0
  231. package/src/components/quote.tsx +43 -0
  232. package/src/components/radio-card.stories.tsx +27 -0
  233. package/src/components/radio-card.tsx +225 -0
  234. package/src/components/radio-group.stories.tsx +32 -0
  235. package/src/components/radio-group.tsx +68 -0
  236. package/src/components/reasoning.stories.tsx +50 -0
  237. package/src/components/reasoning.test.tsx +48 -0
  238. package/src/components/reasoning.tsx +143 -0
  239. package/src/components/search.stories.tsx +18 -0
  240. package/src/components/search.tsx +133 -0
  241. package/src/components/section-nav.stories.tsx +59 -0
  242. package/src/components/section-nav.test.tsx +36 -0
  243. package/src/components/section-nav.tsx +146 -0
  244. package/src/components/segmented-control.stories.tsx +22 -0
  245. package/src/components/segmented-control.tsx +301 -0
  246. package/src/components/select-button.stories.tsx +27 -0
  247. package/src/components/select-button.tsx +174 -0
  248. package/src/components/select.stories.tsx +27 -0
  249. package/src/components/select.tsx +198 -0
  250. package/src/components/separator.stories.tsx +22 -0
  251. package/src/components/separator.tsx +23 -0
  252. package/src/components/shimmer-text.stories.tsx +23 -0
  253. package/src/components/shimmer-text.test.tsx +35 -0
  254. package/src/components/shimmer-text.tsx +43 -0
  255. package/src/components/sidebar.stories.tsx +25 -0
  256. package/src/components/sidebar.tsx +234 -0
  257. package/src/components/skeleton.stories.tsx +22 -0
  258. package/src/components/skeleton.tsx +96 -0
  259. package/src/components/slider.stories.tsx +20 -0
  260. package/src/components/slider.tsx +176 -0
  261. package/src/components/slideshow.stories.tsx +30 -0
  262. package/src/components/slideshow.tsx +291 -0
  263. package/src/components/source.stories.tsx +32 -0
  264. package/src/components/source.test.tsx +40 -0
  265. package/src/components/source.tsx +161 -0
  266. package/src/components/spinner.stories.tsx +19 -0
  267. package/src/components/spinner.tsx +76 -0
  268. package/src/components/stat-strip.stories.tsx +36 -0
  269. package/src/components/stat-strip.test.tsx +25 -0
  270. package/src/components/stat-strip.tsx +85 -0
  271. package/src/components/stats.stories.tsx +24 -0
  272. package/src/components/stats.tsx +83 -0
  273. package/src/components/step-indicator.stories.tsx +18 -0
  274. package/src/components/step-indicator.test.tsx +18 -0
  275. package/src/components/step-indicator.tsx +286 -0
  276. package/src/components/switch.stories.tsx +26 -0
  277. package/src/components/switch.tsx +32 -0
  278. package/src/components/table.stories.tsx +38 -0
  279. package/src/components/table.tsx +220 -0
  280. package/src/components/tabs.stories.tsx +25 -0
  281. package/src/components/tabs.tsx +276 -0
  282. package/src/components/testimonials.stories.tsx +22 -0
  283. package/src/components/testimonials.tsx +109 -0
  284. package/src/components/text-link.stories.tsx +47 -0
  285. package/src/components/text-link.test.tsx +18 -0
  286. package/src/components/text-link.tsx +88 -0
  287. package/src/components/text.stories.tsx +49 -0
  288. package/src/components/text.tsx +105 -0
  289. package/src/components/thinking-bar.stories.tsx +19 -0
  290. package/src/components/thinking-bar.test.tsx +27 -0
  291. package/src/components/thinking-bar.tsx +64 -0
  292. package/src/components/thinking-steps.stories.tsx +44 -0
  293. package/src/components/thinking-steps.test.tsx +42 -0
  294. package/src/components/thinking-steps.tsx +92 -0
  295. package/src/components/toaster.stories.tsx +80 -0
  296. package/src/components/toaster.tsx +36 -0
  297. package/src/components/toggle.stories.tsx +21 -0
  298. package/src/components/toggle.tsx +103 -0
  299. package/src/components/tool-call-card.stories.tsx +97 -0
  300. package/src/components/tool-call-card.test.tsx +88 -0
  301. package/src/components/tool-call-card.tsx +231 -0
  302. package/src/components/tooltip.stories.tsx +25 -0
  303. package/src/components/tooltip.tsx +43 -0
  304. package/src/components/top-nav.stories.tsx +20 -0
  305. package/src/components/top-nav.tsx +76 -0
  306. package/src/docs/Colors.stories.tsx +192 -0
  307. package/src/docs/GettingStarted.mdx +72 -0
  308. package/src/docs/Mcp.mdx +52 -0
  309. package/src/docs/Typography.stories.tsx +114 -0
  310. package/src/hooks/use-in-view.ts +32 -0
  311. package/src/hooks/use-reduced-motion.ts +26 -0
  312. package/src/index.ts +343 -0
  313. package/src/lib/cn.test.ts +67 -0
  314. package/src/lib/cn.ts +81 -0
  315. package/src/lib/motion.ts +109 -0
  316. package/src/lib/prefix-utilities.test.ts +56 -0
  317. package/src/lib/prefix-utilities.ts +50 -0
  318. package/src/styles/base.css +489 -0
  319. package/src/styles/motion.css +69 -0
  320. package/src/styles/overrides.css +44 -0
  321. package/src/styles/typography.css +173 -0
  322. package/src/theme/theme.css +391 -0
  323. package/src/theme/tokens.ts +29 -0
  324. package/src/theme/types.ts +26 -0
  325. package/README.md +0 -3
@@ -0,0 +1,168 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: prompt-suggestions
6
+ sourceFile: packages/design-system/src/components/prompt-suggestions.tsx
7
+ client: true
8
+ category: web-app-ai
9
+ categoryFromBarrel: web-app-ai
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: StarterPromptItem
14
+ kind: type
15
+ - name: StarterPrompts
16
+ kind: component
17
+ typeText: "ForwardRefExoticComponent<StarterPromptsProps & RefAttributes<HTMLDivElement>>"
18
+ - name: StarterPromptsProps
19
+ kind: type
20
+ - name: SuggestionChips
21
+ kind: component
22
+ typeText: "ForwardRefExoticComponent<SuggestionChipsProps & RefAttributes<HTMLDivElement>>"
23
+ - name: SuggestionChipsProps
24
+ kind: type
25
+ primaryExport: StarterPrompts
26
+ subcomponents:
27
+ - SuggestionChips
28
+ props:
29
+ StarterPrompts:
30
+ - name: label
31
+ type: string
32
+ required: false
33
+ declaredIn: self
34
+ doc: "Accessible name of the group."
35
+ - name: onPick
36
+ type: "(prompt: string) => void"
37
+ required: true
38
+ declaredIn: self
39
+ - name: starters
40
+ type: "StarterPromptItem[]"
41
+ required: true
42
+ declaredIn: self
43
+ SuggestionChips:
44
+ - name: disabled
45
+ type: boolean
46
+ required: false
47
+ declaredIn: self
48
+ doc: "E.g. while the assistant replies."
49
+ - name: insert
50
+ type: boolean
51
+ required: false
52
+ declaredIn: self
53
+ doc: "Chips put the prompt in the composer for editing instead of sending it."
54
+ - name: label
55
+ type: string
56
+ required: false
57
+ declaredIn: self
58
+ doc: "Accessible name of the chip group."
59
+ - name: loading
60
+ type: boolean
61
+ required: false
62
+ declaredIn: self
63
+ doc: "Swaps each chip for a skeleton and marks the group busy."
64
+ - name: onPick
65
+ type: "(prompt: string) => void"
66
+ required: true
67
+ declaredIn: self
68
+ - name: onRefresh
69
+ type: "(() => void)"
70
+ required: false
71
+ declaredIn: self
72
+ doc: "Adds an \"Other suggestions\" button under the row."
73
+ - name: suggestions
74
+ type: "string[]"
75
+ required: true
76
+ declaredIn: self
77
+ - name: wrap
78
+ type: boolean
79
+ required: false
80
+ declaredIn: self
81
+ doc: "Wrap onto several lines instead of one horizontally scrolling row."
82
+ extendsProps:
83
+ - "Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\">"
84
+ variants: {}
85
+ variantSource: none
86
+ compoundVariants: []
87
+ sizeMaps: []
88
+ dataSlots:
89
+ - starter-prompts
90
+ - suggestion-chips
91
+ dependsOn:
92
+ internal:
93
+ - button
94
+ - skeleton
95
+ - text
96
+ lib:
97
+ - cn
98
+ hooks: []
99
+ external:
100
+ - lucide-react
101
+ - react
102
+ contexts: []
103
+ stories:
104
+ - exportName: Default
105
+ id: components-suggestionchips--default
106
+ - exportName: Wrapped
107
+ id: components-suggestionchips--wrapped
108
+ - exportName: Loading
109
+ id: components-suggestionchips--loading
110
+ - exportName: InsertTemplates
111
+ id: components-suggestionchips--insert-templates
112
+ - exportName: Starters
113
+ id: components-suggestionchips--starters
114
+ storybookTitle: Components/SuggestionChips
115
+ docsId: components-suggestionchips--documentation
116
+ argTypeOptions: {}
117
+ resolvedCleanly: true
118
+ contractHash: ac0e5c863c02
119
+ factsHash: "84189d4e0c67"
120
+ # >>> AUTHORED - humans own everything below this line. <<<
121
+ status: beta
122
+ summary: "Prompt suggestions for an assistant: a row of follow-up chips that send or insert a prompt, and an empty-state grid of starter prompts."
123
+ useWhen:
124
+ - "an assistant should offer follow-up questions after an answer"
125
+ - "an empty chat needs a few ways to start, each with a short title and the full prompt"
126
+ - "template prompts should drop into the composer for editing instead of sending"
127
+ useInstead:
128
+ - id: toggle
129
+ when: "the chips filter or select values rather than send a prompt"
130
+ - id: badge
131
+ when: "the chips are static labels, not actions"
132
+ related:
133
+ - chat-message
134
+ - button
135
+ a11y:
136
+ notes:
137
+ - "Each chip is a button whose name is the full prompt; insert-mode chips are named \"Edit prompt: ...\"."
138
+ - "Chip rows are role=\"group\" with a label, and aria-busy while loading; a live region announces loading."
139
+ - "StarterPrompts icons are decorative; the title names the starter."
140
+ radixHandles: false
141
+ pitfalls:
142
+ - "Pass the same suggestions while loading; their count sets how many skeletons show."
143
+ - "Disable the chips while the assistant is replying so a second prompt is not sent mid-answer."
144
+ - "Without wrap the row scrolls horizontally; use wrap when every chip must stay visible."
145
+ canonicalSnippet: |
146
+ import { StarterPrompts, SuggestionChips } from "@adres/mgda-ui"
147
+
148
+ <StarterPrompts starters={starters} onPick={send} />
149
+ <SuggestionChips suggestions={followUps} onPick={send} disabled={replying} onRefresh={nextRound} />
150
+ reviewedAt: 2026-10-06
151
+ reviewedAgainstContractHash: ac0e5c863c02
152
+ ---
153
+
154
+ ## Usage
155
+
156
+ `SuggestionChips` renders prompts as rounded outline buttons, in one
157
+ horizontally scrolling row or wrapped with `wrap`. `onPick` receives the
158
+ prompt. `loading` swaps the chips for skeletons, `disabled` locks them while
159
+ the assistant replies, `onRefresh` adds an "Other suggestions" button under
160
+ the row, and `insert` marks chips as templates to edit in the composer.
161
+
162
+ `StarterPrompts` is the empty-state version: a two-column grid of starters,
163
+ each an optional icon, a short title and the full prompt it sends.
164
+
165
+ ## Anatomy
166
+
167
+ - `StarterPrompts` - empty-state grid of titled starters.
168
+ - `SuggestionChips` - follow-up or template chip row with loading and refresh.
@@ -0,0 +1,160 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: quota-bar
6
+ sourceFile: packages/design-system/src/components/quota-bar.tsx
7
+ client: true
8
+ category: web-app-patterns
9
+ categoryFromBarrel: web-app-patterns
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: QuotaBar
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<QuotaBarProps & RefAttributes<HTMLDivElement>>"
16
+ - name: QuotaBarProps
17
+ kind: type
18
+ - name: QuotaBarShape
19
+ kind: type
20
+ primaryExport: QuotaBar
21
+ subcomponents: []
22
+ props:
23
+ QuotaBar:
24
+ - name: compact
25
+ type: boolean
26
+ required: false
27
+ declaredIn: self
28
+ doc: "Compact mode - uses a smaller bar / ring."
29
+ - name: ctaHref
30
+ type: string
31
+ required: false
32
+ declaredIn: self
33
+ doc: "When the quota is full, the full-state CTA renders as a link to this href. Use this OR `ctaOnClick`, not both."
34
+ - name: ctaLabel
35
+ type: string
36
+ required: false
37
+ declaredIn: self
38
+ doc: "Visible text for the full-state CTA. Defaults to \"Request More\"."
39
+ - name: ctaOnClick
40
+ type: "(() => void)"
41
+ required: false
42
+ declaredIn: self
43
+ doc: "When the quota is full, the full-state CTA renders as a button that fires this callback (use for non-routing actions like opening a Drawer)."
44
+ - name: fullLabel
45
+ type: string
46
+ required: false
47
+ declaredIn: self
48
+ doc: "Replaces the default \"No {unit} remaining\" string in the full state."
49
+ - name: remainingLabel
50
+ type: "((remaining: number) => string)"
51
+ required: false
52
+ declaredIn: self
53
+ doc: "Label shown next to the count when the quota is *not* full. Defaults to `\"{remaining} remaining\"`."
54
+ - name: ringSize
55
+ type: number
56
+ required: false
57
+ declaredIn: self
58
+ doc: "Ring-only: pixel diameter override (passes through to Progress)."
59
+ - name: shape
60
+ type: QuotaBarShape
61
+ required: false
62
+ declaredIn: self
63
+ doc: "Visual shape. `bar` (default) is a horizontal Progress with the caption underneath; `ring` puts a circular Progress on the inline-start side with the caption stacked beside it and the pct% inside the ring."
64
+ - name: strokeWidth
65
+ type: number
66
+ required: false
67
+ declaredIn: self
68
+ doc: "Ring-only: stroke width in pixels."
69
+ - name: total
70
+ type: number
71
+ required: true
72
+ declaredIn: self
73
+ doc: "Maximum allowed. When `used >= total`, the bar renders in the error variant and the \"full\" state is shown."
74
+ - name: unit
75
+ type: string
76
+ required: false
77
+ declaredIn: self
78
+ doc: "Unit label appended after the count - e.g. \"seats\", \"licences\", \"GB\". Used in the \"X / Y {unit} used\" sentence."
79
+ - name: used
80
+ type: number
81
+ required: true
82
+ declaredIn: self
83
+ doc: "Current usage."
84
+ extendsProps:
85
+ - "React.HTMLAttributes<HTMLDivElement>"
86
+ variants:
87
+ shape:
88
+ kind: enum
89
+ options:
90
+ - bar
91
+ - ring
92
+ default: bar
93
+ on: QuotaBar
94
+ variantSource: prop-union
95
+ compoundVariants: []
96
+ sizeMaps: []
97
+ dataSlots: []
98
+ dependsOn:
99
+ internal:
100
+ - progress
101
+ lib:
102
+ - cn
103
+ hooks: []
104
+ external:
105
+ - react
106
+ contexts: []
107
+ stories:
108
+ - exportName: Default
109
+ id: components-quotabar--default
110
+ storybookTitle: Components/QuotaBar
111
+ docsId: components-quotabar--documentation
112
+ argTypeOptions: {}
113
+ resolvedCleanly: true
114
+ contractHash: "0ed32271b362"
115
+ factsHash: "846a55440f72"
116
+ # >>> AUTHORED - humans own everything below this line. <<<
117
+ status: stable
118
+ summary: "A usage-vs-limit indicator: a Progress bar or ring plus a used/total-with-unit caption, with automatic warning and full states and an optional CTA."
119
+ useWhen:
120
+ - "showing usage against a limit with domain-specific wording - seats, licenses, storage, monthly sends - not a generic progress value"
121
+ useInstead:
122
+ - id: progress
123
+ when: "there is no usage/limit framing or CTA needed, just a raw percentage"
124
+ related:
125
+ - progress
126
+ a11y:
127
+ notes:
128
+ - "The centered percentage text inside the ring shape is aria-hidden - Progress underneath already exposes the real value via role=\"progressbar\" and aria-valuenow, so the visible percentage text is not a duplicate accessible announcement."
129
+ - "The full-state CTA renders as a real link (ctaHref) or button (ctaOnClick), never a styled span - it stays keyboard-focusable and operable like any other link or button."
130
+ radixHandles: false
131
+ pitfalls:
132
+ - "The variant and its warning/error coloring are entirely computed from used/total - there is no variant prop to override; a used value that exceeds total is clamped visually by the underlying Progress, but isFull and the caption text still key off the raw used >= total comparison."
133
+ - "Pass ctaHref or ctaOnClick, never both - the component does not validate this itself, so supplying both means ctaOnClick's button rendering wins (checked first) and ctaHref is silently ignored."
134
+ - "The percentage text inside a ring shape is hidden specifically for compact rings with no ringSize override, since the text would not fit - it is not hidden for compact bars, or for a compact ring given an explicit ringSize override."
135
+ - "remainingLabel and fullLabel let you fully localize or rephrase the non-full and full-state text, but the \"{used} / {total} {unit} used\" sentence itself has no override prop - customizing it means composing your own layout with Progress directly instead."
136
+ canonicalSnippet: |
137
+ import { QuotaBar } from "@adres/mgda-ui"
138
+
139
+ <QuotaBar used={8} total={10} unit="seats" ctaHref="/billing/upgrade" />
140
+ reviewedAt: 2026-09-01
141
+ reviewedAgainstContractHash: "0ed32271b362"
142
+ ---
143
+
144
+ ## Usage
145
+
146
+ `QuotaBar` shows usage against a limit with domain-appropriate wording -
147
+ seats, licenses, storage, emails sent this month - built on `Progress`
148
+ underneath plus a "{used} / {total} {unit} used" caption. Reach for
149
+ `Progress` directly instead when there is no usage/limit framing or CTA
150
+ needed, just a raw percentage.
151
+
152
+ The visual state escalates automatically from the `used`/`total` ratio:
153
+ `default` below 90%, `warning` from 90% up to (not including) full, and
154
+ `error` once `used >= total`, which also swaps in the full-state message and
155
+ an optional CTA - pass `ctaHref` or `ctaOnClick`, not both.
156
+
157
+ `shape="bar"` (default) stacks the caption underneath a horizontal Progress;
158
+ `shape="ring"` places a circular Progress beside the caption with the
159
+ percentage rendered inside the ring - hidden only when `compact` and no
160
+ `ringSize` override is given, since the text would not fit at that size.
@@ -0,0 +1,116 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: quote
6
+ sourceFile: packages/design-system/src/components/quote.tsx
7
+ client: true
8
+ category: web-app-core-primitives
9
+ categoryFromBarrel: web-app-core-primitives
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: Quote
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<QuoteProps & RefAttributes<HTMLQuoteElement>>"
16
+ - name: QuoteProps
17
+ kind: type
18
+ - name: quoteVariants
19
+ kind: variants
20
+ typeText: "(props?: (ConfigVariants<{ size: { sm: string; md: string; lg: string; xl: string; }; color: { default: string; muted: string; accent: string; }; }> & ClassProp) | undefined) => string"
21
+ primaryExport: Quote
22
+ subcomponents: []
23
+ props:
24
+ Quote:
25
+ - name: color
26
+ type: "\"accent\" | \"default\" | \"muted\""
27
+ required: false
28
+ declaredIn: self
29
+ variantKey: true
30
+ - name: size
31
+ type: "\"lg\" | \"md\" | \"sm\" | \"xl\""
32
+ required: false
33
+ declaredIn: self
34
+ variantKey: true
35
+ extendsProps:
36
+ - "Omit<React.HTMLAttributes<HTMLQuoteElement>, \"color\">"
37
+ - "VariantProps<typeof quoteVariants>"
38
+ variants:
39
+ size:
40
+ kind: enum
41
+ options:
42
+ - sm
43
+ - md
44
+ - lg
45
+ - xl
46
+ default: md
47
+ on: Quote
48
+ color:
49
+ kind: enum
50
+ options:
51
+ - default
52
+ - muted
53
+ - accent
54
+ default: default
55
+ on: Quote
56
+ variantSource: cva
57
+ compoundVariants: []
58
+ sizeMaps: []
59
+ dataSlots: []
60
+ dependsOn:
61
+ internal: []
62
+ lib:
63
+ - cn
64
+ hooks: []
65
+ external:
66
+ - class-variance-authority
67
+ - react
68
+ contexts: []
69
+ stories:
70
+ - exportName: Default
71
+ id: components-quote--default
72
+ storybookTitle: Components/Quote
73
+ docsId: components-quote--documentation
74
+ argTypeOptions: {}
75
+ resolvedCleanly: true
76
+ contractHash: e61f900e390e
77
+ factsHash: "1a61a7972f80"
78
+ # >>> AUTHORED - humans own everything below this line. <<<
79
+ status: stable
80
+ summary: "A short, inline quotation - renders the native q element, which browsers add quotation marks to automatically."
81
+ useWhen:
82
+ - "quoting a short phrase or sentence inline within surrounding text"
83
+ useInstead:
84
+ - id: blockquote
85
+ when: "the quotation is long enough to stand as its own block, especially with attribution"
86
+ - id: text
87
+ when: "the content is not actually a quotation"
88
+ related:
89
+ - blockquote
90
+ - text
91
+ a11y:
92
+ notes:
93
+ - "Renders the native q element - browsers insert quotation marks automatically via default CSS, so do not add literal quote characters in the children or they will be doubled."
94
+ radixHandles: false
95
+ pitfalls:
96
+ - "Wrapping the children in your own \"...\" characters double-quotes the text, since q already inserts marks via browser default styles."
97
+ - "color's default/muted/accent options are not shared with Blockquote's primary/neutral - the two quote-flavored primitives use different color vocabularies."
98
+ canonicalSnippet: |
99
+ import { Quote } from "@adres/mgda-ui"
100
+
101
+ <p>
102
+ As the saying goes, <Quote>less is more</Quote>.
103
+ </p>
104
+ reviewedAt: 2026-08-31
105
+ reviewedAgainstContractHash: e61f900e390e
106
+ ---
107
+
108
+ ## Usage
109
+
110
+ `Quote` is for a short quotation embedded inline within a sentence - it
111
+ renders the native `<q>` element, so the browser adds quotation marks
112
+ automatically rather than the component inserting literal characters. Do not
113
+ wrap the children in your own quote marks, or they will be doubled.
114
+
115
+ Reach for `Blockquote` instead once the quotation is long enough to stand on
116
+ its own as a block, especially with attribution.
@@ -0,0 +1,172 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: radio-card
6
+ sourceFile: packages/design-system/src/components/radio-card.tsx
7
+ client: true
8
+ category: web-app-form-controls
9
+ categoryFromBarrel: web-app-form-controls
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: RadioCard
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<RadioCardProps & RefAttributes<HTMLButtonElement>>"
16
+ - name: RadioCardDescription
17
+ kind: component
18
+ typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>>"
19
+ - name: RadioCardGroup
20
+ kind: component
21
+ typeText: "ForwardRefExoticComponent<RadioCardGroupProps & RefAttributes<HTMLDivElement>>"
22
+ - name: RadioCardGroupProps
23
+ kind: type
24
+ - name: RadioCardIcon
25
+ kind: component
26
+ typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement>>"
27
+ - name: RadioCardOrientation
28
+ kind: type
29
+ - name: RadioCardProps
30
+ kind: type
31
+ - name: RadioCardSize
32
+ kind: type
33
+ - name: RadioCardTitle
34
+ kind: component
35
+ typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>>"
36
+ primaryExport: RadioCard
37
+ subcomponents:
38
+ - RadioCardDescription
39
+ - RadioCardGroup
40
+ - RadioCardIcon
41
+ - RadioCardTitle
42
+ props:
43
+ RadioCard:
44
+ - name: size
45
+ type: RadioCardSize
46
+ required: false
47
+ declaredIn: self
48
+ variantKey: true
49
+ RadioCardGroup:
50
+ - name: compact
51
+ type: boolean
52
+ required: false
53
+ declaredIn: self
54
+ - name: orientation
55
+ type: RadioCardOrientation
56
+ required: false
57
+ declaredIn: self
58
+ - name: size
59
+ type: RadioCardSize
60
+ required: false
61
+ declaredIn: self
62
+ variantKey: true
63
+ extendsProps:
64
+ - "React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>"
65
+ variants:
66
+ size:
67
+ kind: enum
68
+ options:
69
+ - sm
70
+ - base
71
+ - lg
72
+ - xl
73
+ default: base
74
+ on: RadioCard
75
+ variantSource: cva
76
+ compoundVariants: []
77
+ sizeMaps:
78
+ - COMPACT_LAYOUT
79
+ - INDICATOR_SIZE
80
+ dataSlots:
81
+ - radio-card-icon
82
+ - radio-card-off
83
+ - radio-card-on
84
+ - radio-card-title
85
+ dependsOn:
86
+ internal: []
87
+ lib:
88
+ - cn
89
+ hooks: []
90
+ external:
91
+ - "@radix-ui/react-radio-group"
92
+ - class-variance-authority
93
+ - lucide-react
94
+ - react
95
+ contexts:
96
+ - name: RadioCardGroupContext
97
+ type: RadioCardGroupContext
98
+ default: null
99
+ stories:
100
+ - exportName: Default
101
+ id: components-radiocard--default
102
+ storybookTitle: Components/RadioCard
103
+ docsId: components-radiocard--documentation
104
+ argTypeOptions: {}
105
+ resolvedCleanly: true
106
+ contractHash: "37b2d466668c"
107
+ factsHash: "88b41ad8dceb"
108
+ # >>> AUTHORED - humans own everything below this line. <<<
109
+ status: stable
110
+ summary: "A large clickable card acting as a radio button - a bordered surface with a title/description and a trailing indicator, for single-select option grids."
111
+ useWhen:
112
+ - "presenting mutually-exclusive options as prominent cards rather than plain radio buttons - pricing tiers, plan selection, any single choice worth describing"
113
+ useInstead:
114
+ - id: radio-group
115
+ when: "a compact list of options fits plain radio buttons and labels better than a full card"
116
+ - id: checkbox-card
117
+ when: "more than one option can be selected at once"
118
+ related:
119
+ - radio-group
120
+ - checkbox-card
121
+ a11y:
122
+ notes:
123
+ - "The actual Radix radio item is visually hidden (sr-only) inside a real label, so clicking anywhere on the card selects it, and the accessible name comes from RadioCardTitle/RadioCardDescription's text content."
124
+ - "RadioCardGroup is a real Radix RadioGroup.Root, so it already provides single-select group semantics and roving-tabindex - no extra role or ARIA is needed beyond what is built in."
125
+ keyboard:
126
+ - "Native Radix radio-group keyboard behavior: arrow keys move selection between cards, Tab enters or exits the group once."
127
+ radixHandles: true
128
+ pitfalls:
129
+ - "size options include xl, unlike CheckboxCard which stops at lg - the two sibling card patterns do not share an identical size scale."
130
+ - "RadioCardIcon exists specifically for an optional leading icon and drives its own checked-state color via data-slot - a plain icon element dropped in without RadioCardIcon will not pick up the selected-state tint."
131
+ - "compact mode collapses the cards into a connected strip (shared borders, only the first and last corners rounded), the same pattern CheckboxCard uses - size alone does not change this shape."
132
+ canonicalSnippet: |
133
+ import { RadioCard, RadioCardDescription, RadioCardGroup, RadioCardTitle } from "@adres/mgda-ui"
134
+
135
+ <RadioCardGroup defaultValue="monthly" className="ax:max-w-md">
136
+ <RadioCard value="monthly">
137
+ <RadioCardTitle>Monthly</RadioCardTitle>
138
+ <RadioCardDescription>Pay as you go each month.</RadioCardDescription>
139
+ </RadioCard>
140
+ <RadioCard value="yearly">
141
+ <RadioCardTitle>Yearly</RadioCardTitle>
142
+ <RadioCardDescription>Save 20% with annual billing.</RadioCardDescription>
143
+ </RadioCard>
144
+ </RadioCardGroup>
145
+ reviewedAt: 2026-08-31
146
+ reviewedAgainstContractHash: "37b2d466668c"
147
+ ---
148
+
149
+ ## Usage
150
+
151
+ `RadioCard` turns a radio option into a full clickable card - reach for it
152
+ when mutually-exclusive choices deserve more visual weight than plain radio
153
+ buttons (pricing tiers, plan selection, any single choice worth describing).
154
+ For a multi-select version of the same pattern, use `CheckboxCard` instead.
155
+
156
+ `RadioCardGroup` is a real Radix `RadioGroup.Root`, so `value`,
157
+ `defaultValue`, and `onValueChange` all work exactly as they would on a plain
158
+ `RadioGroup` - the group already provides single-select semantics and
159
+ roving-tabindex keyboard navigation.
160
+
161
+ Set `compact` to collapse the cards into a connected strip with shared
162
+ borders instead of a spaced grid, the same pattern `CheckboxCard` uses.
163
+
164
+ ## Anatomy
165
+
166
+ | Part | Role |
167
+ | --- | --- |
168
+ | `RadioCardGroup` | The Radix RadioGroup root. Owns `size`, `compact`, `orientation`, plus the usual `value`/`onValueChange`. |
169
+ | `RadioCard` | One card. Wraps a visually-hidden Radix radio item in a real `<label>`, so the whole card is the click target. |
170
+ | `RadioCardIcon` | Optional leading icon. Its `data-slot` drives the checked-state color tint. |
171
+ | `RadioCardTitle` | The card's heading. Same checked-state tint mechanism as `RadioCardIcon`. |
172
+ | `RadioCardDescription` | Supporting text below the title. |