@adres/mgda-ui 0.0.0-stage → 0.0.2

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,115 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: testimonials
6
+ sourceFile: packages/design-system/src/components/testimonials.tsx
7
+ client: true
8
+ category: marketing
9
+ categoryFromBarrel: marketing
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: Testimonial
14
+ kind: type
15
+ - name: Testimonials
16
+ kind: component
17
+ typeText: "({ className, eyebrow, title, items, columns, ...props }: TestimonialsProps) => Element"
18
+ - name: TestimonialsProps
19
+ kind: type
20
+ primaryExport: Testimonials
21
+ subcomponents: []
22
+ props:
23
+ Testimonials:
24
+ - name: columns
25
+ type: "2 | 3"
26
+ required: false
27
+ declaredIn: self
28
+ - name: eyebrow
29
+ type: ReactNode
30
+ required: false
31
+ declaredIn: self
32
+ - name: items
33
+ type: "Testimonial[]"
34
+ required: true
35
+ declaredIn: self
36
+ - name: title
37
+ type: ReactNode
38
+ required: false
39
+ declaredIn: self
40
+ extendsProps:
41
+ - "Omit<React.HTMLAttributes<HTMLElement>, \"title\">"
42
+ variants: {}
43
+ variantSource: none
44
+ compoundVariants: []
45
+ sizeMaps: []
46
+ dataSlots: []
47
+ dependsOn:
48
+ internal:
49
+ - card
50
+ lib:
51
+ - cn
52
+ - motion
53
+ hooks:
54
+ - use-reduced-motion
55
+ external:
56
+ - lucide-react
57
+ - motion/react
58
+ - react
59
+ contexts: []
60
+ stories:
61
+ - exportName: Default
62
+ id: components-testimonials--default
63
+ storybookTitle: Components/Testimonials
64
+ docsId: components-testimonials--documentation
65
+ argTypeOptions: {}
66
+ resolvedCleanly: true
67
+ contractHash: "5bfb9becebf2"
68
+ factsHash: "960d8c79406f"
69
+ # >>> AUTHORED - humans own everything below this line. <<<
70
+ status: stable
71
+ summary: "A grid of customer testimonial cards - quote, avatar or initial, name, role and company, and an optional star rating - with scroll-triggered stagger animation."
72
+ useWhen:
73
+ - "showcasing customer quotes as social proof on a marketing page"
74
+ useInstead:
75
+ - id: logo-cloud
76
+ when: "the social proof is company or brand logos, not attributed quotes"
77
+ related:
78
+ - logo-cloud
79
+ a11y:
80
+ notes:
81
+ - "Each card is a real figure/blockquote/figcaption - the quote, attribution, and card grouping all carry correct semantic structure without extra ARIA."
82
+ - "The star rating renders as plain decorative star icons with no accessible text equivalent, e.g. \"4 out of 5 stars\" - if the rating value itself needs to be announced to assistive tech, that is currently missing and would need to be added at the call site."
83
+ radixHandles: false
84
+ pitfalls:
85
+ - "avatar is optional - when omitted, the component falls back to a colored circle showing the first letter of name, not a placeholder image. Keep name meaningful even when no avatar is supplied, since it drives that fallback."
86
+ - "rating is on a 1-5 scale rendered as 5 stars total - passing a value outside that range still renders exactly 5 stars, just all filled or all unfilled depending on the comparison, since there is no clamping or validation."
87
+ - "role and company are joined with a middot only when at least one is present - passing just one of the two omits the separator entirely rather than leaving a dangling one."
88
+ - "columns only accepts 2 or 3 - there is no single-column or 4-plus option, unlike FeatureGrid's wider 2/3/4 range."
89
+ canonicalSnippet: |
90
+ import { Testimonials } from "@adres/mgda-ui"
91
+
92
+ const quotes = [
93
+ { quote: "This tool transformed our workflow.", name: "Jane Cooper", role: "CTO", company: "Acme", rating: 5 },
94
+ { quote: "Setup took minutes, not weeks.", name: "Alex Kim", role: "Founder", company: "Globex" },
95
+ ]
96
+
97
+ <Testimonials items={quotes} columns={2} />
98
+ reviewedAt: 2026-09-01
99
+ reviewedAgainstContractHash: "5bfb9becebf2"
100
+ ---
101
+
102
+ ## Usage
103
+
104
+ `Testimonials` showcases customer quotes as social proof on a marketing
105
+ page - a grid of cards, each with a quote, attribution (avatar or initial
106
+ fallback, name, role and company), and an optional star rating. Reach for
107
+ `LogoCloud` instead when the social proof is company or brand logos rather
108
+ than attributed quotes.
109
+
110
+ `avatar` is optional; omitting it falls back to a colored circle showing the
111
+ first letter of `name`, so keep `name` meaningful even without a photo.
112
+ `role` and `company` are joined with a middot only when at least one is
113
+ present - passing just one omits the separator rather than leaving a
114
+ dangling one. `columns` only accepts `2` or `3`, a narrower range than
115
+ `FeatureGrid`'s.
@@ -0,0 +1,192 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: text-link
6
+ sourceFile: packages/design-system/src/components/text-link.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: TextLink
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<TextLinkProps & RefAttributes<HTMLAnchorElement>>"
16
+ - name: TextLinkColor
17
+ kind: type
18
+ - name: TextLinkProps
19
+ kind: type
20
+ - name: TextLinkSize
21
+ kind: type
22
+ - name: TextLinkUnderline
23
+ kind: type
24
+ - name: textLinkVariants
25
+ kind: variants
26
+ typeText: "TVReturnType<{ color: { primary: \"ax:text-primary-foreground\"; default: \"ax:text-foreground\"; muted: \"ax:text-muted-foreground ax:hover:text-foreground\"; }; underline: { hover: \"ax:no-underline ax:hover:underline\"; alway...[truncated]"
27
+ primaryExport: TextLink
28
+ subcomponents: []
29
+ props:
30
+ TextLink:
31
+ - name: asChild
32
+ type: boolean
33
+ required: false
34
+ declaredIn: self
35
+ doc: "Render the child instead of an `<a>`, e.g. a framework router link."
36
+ - name: color
37
+ type: "\"default\" | \"muted\" | \"primary\""
38
+ required: false
39
+ declaredIn: self
40
+ variantKey: true
41
+ - name: external
42
+ type: boolean
43
+ required: false
44
+ declaredIn: self
45
+ doc: "Opens in a new tab with `rel=\"noopener noreferrer\"` and announces that to screen readers."
46
+ - name: size
47
+ type: "\"1\" | \"2\" | \"3\" | \"4\" | \"5\""
48
+ required: false
49
+ declaredIn: self
50
+ variantKey: true
51
+ - name: underline
52
+ type: "\"always\" | \"hover\" | \"none\""
53
+ required: false
54
+ declaredIn: self
55
+ variantKey: true
56
+ - name: weight
57
+ type: "\"medium\" | \"regular\""
58
+ required: false
59
+ declaredIn: self
60
+ variantKey: true
61
+ extendsProps:
62
+ - "Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"color\">"
63
+ - "VariantProps<typeof textLinkVariants>"
64
+ variants:
65
+ color:
66
+ kind: enum
67
+ options:
68
+ - primary
69
+ - default
70
+ - muted
71
+ default: primary
72
+ on: TextLink
73
+ underline:
74
+ kind: enum
75
+ options:
76
+ - hover
77
+ - always
78
+ - none
79
+ default: hover
80
+ on: TextLink
81
+ size:
82
+ kind: enum
83
+ options:
84
+ - "1"
85
+ - "2"
86
+ - "3"
87
+ - "4"
88
+ - "5"
89
+ default: null
90
+ on: TextLink
91
+ weight:
92
+ kind: enum
93
+ options:
94
+ - regular
95
+ - medium
96
+ default: medium
97
+ on: TextLink
98
+ variantSource: tv
99
+ compoundVariants: []
100
+ sizeMaps: []
101
+ dataSlots:
102
+ - text-link
103
+ dependsOn:
104
+ internal: []
105
+ lib:
106
+ - cn
107
+ hooks: []
108
+ external:
109
+ - "@radix-ui/react-slot"
110
+ - react
111
+ - tailwind-variants
112
+ contexts: []
113
+ stories:
114
+ - exportName: Default
115
+ id: components-textlink--default
116
+ - exportName: InSentence
117
+ id: components-textlink--in-sentence
118
+ - exportName: Colors
119
+ id: components-textlink--colors
120
+ - exportName: External
121
+ id: components-textlink--external
122
+ storybookTitle: Components/TextLink
123
+ docsId: components-textlink--documentation
124
+ argTypeOptions:
125
+ color:
126
+ - primary
127
+ - default
128
+ - muted
129
+ underline:
130
+ - hover
131
+ - always
132
+ - none
133
+ weight:
134
+ - regular
135
+ - medium
136
+ resolvedCleanly: true
137
+ contractHash: "371061b97da3"
138
+ factsHash: "1143f8a3c08f"
139
+ # >>> AUTHORED - humans own everything below this line. <<<
140
+ status: stable
141
+ summary: "Inline text link with no box: inherits the surrounding text size, with primary, default or muted colour and a hover, always or no underline."
142
+ useWhen:
143
+ - "a link sits inside a sentence or label, such as 'Don't have an account? Create one'"
144
+ - "a standalone small link such as 'Forgot password?' beside a field label"
145
+ - "a link opens an external page in a new tab, via external"
146
+ useInstead:
147
+ - id: button
148
+ when: "the control should look like a button"
149
+ related:
150
+ - text
151
+ - button
152
+ a11y:
153
+ notes:
154
+ - "external adds target=_blank, rel=noopener noreferrer and a screen-reader-only '(opens in a new tab)' hint on a plain anchor."
155
+ - "With asChild the child owns its own content, so the external hint is not injected; add it to the child yourself."
156
+ - "The focus-visible ring is part of the base classes. Do not remove it through className."
157
+ radixHandles: false
158
+ pitfalls:
159
+ - "size is omitted by default so the link inherits the surrounding text size. Set it only when the link stands alone."
160
+ - "With a framework router, pass the router link as the child via asChild; do not nest an anchor inside TextLink."
161
+ - "For an action that should look like a link (Retry, Undo), pass a <button type=\"button\"> through asChild so it keeps button semantics."
162
+ canonicalSnippet: |
163
+ import { TextLink, Text } from "@adres/mgda-ui"
164
+
165
+ <Text as="p" size="2" color="muted">
166
+ Don't have an account? <TextLink href="/sign-up">Create one</TextLink>
167
+ </Text>
168
+ reviewedAt: 2026-10-05
169
+ reviewedAgainstContractHash: "371061b97da3"
170
+ ---
171
+
172
+ ## Usage
173
+
174
+ `TextLink` is the only link style in the system; `Button` has no `link`
175
+ variant. It carries no height or padding, so it sits inside a sentence without
176
+ shifting the line, and inherits the surrounding size unless `size` is set.
177
+ For a link-looking action, give it a `<button type="button">` through
178
+ `asChild` so the control keeps button semantics.
179
+
180
+ With Next.js, compose the router link through `asChild`:
181
+
182
+ ```tsx
183
+ import NextLink from "next/link"
184
+
185
+ <TextLink asChild>
186
+ <NextLink href="/sign-up">Create one</NextLink>
187
+ </TextLink>
188
+ ```
189
+
190
+ The default colour is `primary`, which uses the readable `primary-foreground`
191
+ token. `muted` suits secondary links like "Forgot password?" and darkens on
192
+ hover.
@@ -0,0 +1,194 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: text
6
+ sourceFile: packages/design-system/src/components/text.tsx
7
+ client: false
8
+ category: web-app-core-primitives
9
+ categoryFromBarrel: web-app-core-primitives
10
+ barrelExported: true
11
+ importPath: "@adres/mgda-ui"
12
+ exports:
13
+ - name: Text
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<TextProps & RefAttributes<HTMLElement>>"
16
+ - name: TextAlign
17
+ kind: type
18
+ - name: TextAs
19
+ kind: type
20
+ - name: TextColor
21
+ kind: type
22
+ - name: TextProps
23
+ kind: type
24
+ - name: TextSize
25
+ kind: type
26
+ - name: TextWeight
27
+ kind: type
28
+ - name: TextWrap
29
+ kind: type
30
+ primaryExport: Text
31
+ subcomponents: []
32
+ props:
33
+ Text:
34
+ - name: align
35
+ type: "\"center\" | \"left\" | \"right\""
36
+ required: false
37
+ declaredIn: self
38
+ variantKey: true
39
+ - name: as
40
+ type: TextAs
41
+ required: false
42
+ declaredIn: self
43
+ - name: color
44
+ type: "\"accent\" | \"default\" | \"destructive\" | \"muted\" | \"primary\" | \"strong\" | \"success\" | \"warning\""
45
+ required: false
46
+ declaredIn: self
47
+ variantKey: true
48
+ - name: size
49
+ type: "\"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\""
50
+ required: false
51
+ declaredIn: self
52
+ variantKey: true
53
+ - name: truncate
54
+ type: boolean
55
+ required: false
56
+ declaredIn: self
57
+ - name: weight
58
+ type: "\"bold\" | \"light\" | \"medium\" | \"regular\""
59
+ required: false
60
+ declaredIn: self
61
+ variantKey: true
62
+ - name: wrap
63
+ type: TextWrap
64
+ required: false
65
+ declaredIn: self
66
+ extendsProps:
67
+ - "Omit<React.HTMLAttributes<HTMLElement>, \"color\">"
68
+ - "VariantProps<typeof textVariants>"
69
+ variants:
70
+ size:
71
+ kind: enum
72
+ options:
73
+ - "1"
74
+ - "2"
75
+ - "3"
76
+ - "4"
77
+ - "5"
78
+ - "6"
79
+ - "7"
80
+ - "8"
81
+ - "9"
82
+ default: "3"
83
+ on: Text
84
+ weight:
85
+ kind: enum
86
+ options:
87
+ - light
88
+ - regular
89
+ - medium
90
+ - bold
91
+ default: regular
92
+ on: Text
93
+ align:
94
+ kind: enum
95
+ options:
96
+ - left
97
+ - center
98
+ - right
99
+ default: null
100
+ on: Text
101
+ color:
102
+ kind: enum
103
+ options:
104
+ - default
105
+ - muted
106
+ - strong
107
+ - primary
108
+ - accent
109
+ - success
110
+ - warning
111
+ - destructive
112
+ default: default
113
+ on: Text
114
+ variantSource: cva
115
+ compoundVariants: []
116
+ sizeMaps:
117
+ - WRAP_CLASS
118
+ dataSlots: []
119
+ dependsOn:
120
+ internal: []
121
+ lib:
122
+ - cn
123
+ hooks: []
124
+ external:
125
+ - class-variance-authority
126
+ - react
127
+ contexts: []
128
+ stories:
129
+ - exportName: Default
130
+ id: components-text--default
131
+ - exportName: Muted
132
+ id: components-text--muted
133
+ - exportName: Scale
134
+ id: components-text--scale
135
+ storybookTitle: Components/Text
136
+ docsId: components-text--documentation
137
+ argTypeOptions: {}
138
+ resolvedCleanly: true
139
+ contractHash: "0cfc9a417441"
140
+ factsHash: e8cc808f5db3
141
+ # >>> AUTHORED - humans own everything below this line. <<<
142
+ status: stable
143
+ summary: "The generic polymorphic text primitive - size, weight, color, and alignment as props, rendered as any inline or block tag via as."
144
+ useWhen:
145
+ - "a piece of text needs size, weight, color, or alignment set through props instead of raw Tailwind classes"
146
+ - "the same text styling needs to render as a different HTML tag depending on context, via as"
147
+ useInstead:
148
+ - id: heading
149
+ when: "the text is a heading; Text cannot render h1-h6"
150
+ - id: text-link
151
+ when: "the text is a link"
152
+ - id: blockquote
153
+ when: "the content is specifically a longer quotation, not general text"
154
+ - id: quote
155
+ when: "the content is a short inline quotation"
156
+ related:
157
+ - heading
158
+ - text-link
159
+ - blockquote
160
+ - quote
161
+ a11y:
162
+ notes:
163
+ - "as picks the rendered tag but not its semantics beyond that tag's native meaning - as=\"label\" renders a real <label>, but Text does not wire htmlFor/id association the way Input's Field does; that association is still the caller's job."
164
+ radixHandles: false
165
+ pitfalls:
166
+ - "size is a numeric string scale (\"1\" through \"9\"), unrelated to Button/Input's sm/md/lg scale or Card's padding scale - there is no shared size vocabulary across these primitives."
167
+ - "size maps to the t-* typography utilities in typography.css (1->t-body-xs, 2->t-body-sm, 3->t-body-md, 4->t-body-lg, 5->t-body-xl, 6->t-h1, 7->t-display-sm, 8->t-display-md, 9->t-display-xl), so it inherits the canonical scale's line-height, weight, and tracking rather than raw text-* utilities. Prefer raw t-* classes with semantic HTML for new hand-authored UI; reach for the size prop only when the polymorphic prop API is actually needed."
168
+ canonicalSnippet: |
169
+ import { Text } from "@adres/mgda-ui"
170
+
171
+ <Text as="p" size="4" weight="medium" color="muted">
172
+ Track progress across your team.
173
+ </Text>
174
+ reviewedAt: 2026-08-31
175
+ reviewedAgainstContractHash: "0cfc9a417441"
176
+ ---
177
+
178
+ ## Usage
179
+
180
+ `Text` is the generic, polymorphic text primitive - reach for it any time text
181
+ needs `size`/`weight`/`color`/`align` set through props rather than raw
182
+ Tailwind classes, or needs to render as a different tag (`as="p"`, `"span"`,
183
+ `"label"`, `"strong"`, `"em"`, `"div"`) depending on where it's used. It has no
184
+ semantic meaning of its own beyond whatever tag `as` renders - reach for
185
+ `Blockquote` or `Quote` instead when the content is actually a quotation.
186
+
187
+ `size` is a numeric string scale (`"1"` through `"9"`, default `"3"`), not the
188
+ `sm`/`md`/`lg` scale used elsewhere in the system - it has its own vocabulary,
189
+ independent of `Button`, `Input`, or `Card`. Each numeric size maps to a `t-*`
190
+ utility class from `typography.css` (the canonical typography scale), so
191
+ `Text` and hand-authored markup using `t-*` classes directly stay visually in
192
+ sync, including brand-specific `t-*` overrides. For new hand-authored UI,
193
+ prefer raw `t-*` classes plus semantic HTML unless the prop-driven API is
194
+ needed.
@@ -0,0 +1,115 @@
1
+ ---
2
+ # >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
3
+ derived:
4
+ schemaVersion: 1
5
+ id: thinking-bar
6
+ sourceFile: packages/design-system/src/components/thinking-bar.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: ThinkingBar
14
+ kind: component
15
+ typeText: "ForwardRefExoticComponent<ThinkingBarProps & RefAttributes<HTMLDivElement>>"
16
+ - name: ThinkingBarProps
17
+ kind: type
18
+ primaryExport: ThinkingBar
19
+ subcomponents: []
20
+ props:
21
+ ThinkingBar:
22
+ - name: onClick
23
+ type: "(() => void)"
24
+ required: false
25
+ declaredIn: self
26
+ doc: "Makes the label a button with a chevron, e.g. to open the reasoning."
27
+ - name: onStop
28
+ type: "(() => void)"
29
+ required: false
30
+ declaredIn: self
31
+ doc: "Adds a stop action on the right, e.g. to answer without more thinking."
32
+ - name: stopLabel
33
+ type: string
34
+ required: false
35
+ declaredIn: self
36
+ - name: text
37
+ type: string
38
+ required: false
39
+ declaredIn: self
40
+ doc: "The status, present tense."
41
+ extendsProps:
42
+ - "Omit<React.HTMLAttributes<HTMLDivElement>, \"onClick\">"
43
+ variants: {}
44
+ variantSource: none
45
+ compoundVariants: []
46
+ sizeMaps: []
47
+ dataSlots:
48
+ - thinking-bar
49
+ dependsOn:
50
+ internal:
51
+ - shimmer-text
52
+ lib:
53
+ - cn
54
+ hooks: []
55
+ external:
56
+ - lucide-react
57
+ - react
58
+ contexts: []
59
+ stories:
60
+ - exportName: Default
61
+ id: components-thinkingbar--default
62
+ - exportName: WithActions
63
+ id: components-thinkingbar--with-actions
64
+ storybookTitle: Components/ThinkingBar
65
+ docsId: components-thinkingbar--documentation
66
+ argTypeOptions: {}
67
+ resolvedCleanly: true
68
+ contractHash: "4d1a4990330b"
69
+ factsHash: c52823a95ecd
70
+ # >>> AUTHORED - humans own everything below this line. <<<
71
+ status: beta
72
+ summary: "One line that says the assistant is thinking: a shimmering status, an optional button to see more, and an optional action to stop and answer now."
73
+ useWhen:
74
+ - "an assistant is thinking before it answers and one status line is enough"
75
+ - "people should be able to skip the thinking and get an answer now"
76
+ useInstead:
77
+ - id: thinking-steps
78
+ when: "people should see the named steps the assistant is working through"
79
+ - id: reasoning
80
+ when: "the model's reasoning text should be readable as it streams"
81
+ related:
82
+ - shimmer-text
83
+ - reasoning
84
+ - thinking-steps
85
+ a11y:
86
+ notes:
87
+ - "Without onClick the status is plain text; with it, the label is a button and the chevron is aria-hidden."
88
+ - "The stop action is a real button named by stopLabel."
89
+ - "The bar is not a live region; announce thinking and done in a separate polite live region if needed."
90
+ radixHandles: false
91
+ pitfalls:
92
+ - "Remove the bar once the answer starts; it is only for the thinking phase."
93
+ - "Word text in the present tense, such as \"Thinking\" or \"Searching listings\"."
94
+ - "Pass onStop only when stopping really returns an answer; otherwise leave it out."
95
+ canonicalSnippet: |
96
+ import { ThinkingBar } from "@adres/mgda-ui"
97
+
98
+ {thinking && (
99
+ <ThinkingBar text="Thinking" onClick={openReasoning} onStop={answerNow} />
100
+ )}
101
+ reviewedAt: 2026-10-06
102
+ reviewedAgainstContractHash: "4d1a4990330b"
103
+ ---
104
+
105
+ ## Usage
106
+
107
+ `ThinkingBar` sits where the answer will appear while the assistant thinks.
108
+ `text` is the shimmering status ("Thinking" by default). Pass `onClick` to
109
+ make the status a button with a chevron, for example to open the reasoning,
110
+ and `onStop` to add a dotted-underline action on the right, "Answer now" by
111
+ default or `stopLabel`.
112
+
113
+ ## Anatomy
114
+
115
+ - `ThinkingBar` - shimmering status (or status button with chevron) and an optional stop action.