@usefragments/ui 1.6.0 → 2.0.0

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 (685) hide show
  1. package/README.md +54 -66
  2. package/dist/assets/fragments-wordmark.cjs +2 -2
  3. package/dist/assets/fragments-wordmark.d.ts.map +1 -1
  4. package/dist/assets/fragments-wordmark.js +2 -2
  5. package/dist/assets/nav-glyph.cjs +139 -0
  6. package/dist/assets/nav-glyph.d.ts +28 -0
  7. package/dist/assets/nav-glyph.d.ts.map +1 -0
  8. package/dist/assets/nav-glyph.js +139 -0
  9. package/dist/assets/nav-glyph.module.scss.cjs +71 -0
  10. package/dist/assets/nav-glyph.module.scss.js +71 -0
  11. package/dist/assets/ui.css +6885 -6308
  12. package/dist/blocks/components/StatsCard.d.ts +1 -1
  13. package/dist/blocks/components/StatsCard.d.ts.map +1 -1
  14. package/dist/chart.cjs +24 -6
  15. package/dist/chart.js +24 -6
  16. package/dist/codeblock.cjs +76 -43
  17. package/dist/codeblock.js +71 -38
  18. package/dist/colorpicker.cjs +4 -1
  19. package/dist/colorpicker.js +4 -1
  20. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  21. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  22. package/dist/components/Alert/Alert.module.scss.cjs +23 -20
  23. package/dist/components/Alert/Alert.module.scss.js +23 -20
  24. package/dist/components/Alert/index.cjs +20 -8
  25. package/dist/components/Alert/index.d.ts +17 -11
  26. package/dist/components/Alert/index.d.ts.map +1 -1
  27. package/dist/components/Alert/index.js +20 -8
  28. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  29. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  30. package/dist/components/AppShell/index.cjs +2 -2
  31. package/dist/components/AppShell/index.js +2 -2
  32. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  33. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  34. package/dist/components/Badge/Badge.module.scss.cjs +33 -31
  35. package/dist/components/Badge/Badge.module.scss.js +33 -31
  36. package/dist/components/Badge/index.cjs +13 -3
  37. package/dist/components/Badge/index.d.ts +18 -13
  38. package/dist/components/Badge/index.d.ts.map +1 -1
  39. package/dist/components/Badge/index.js +13 -3
  40. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  41. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  42. package/dist/components/Box/Box.module.scss.cjs +152 -152
  43. package/dist/components/Box/Box.module.scss.js +152 -152
  44. package/dist/components/Box/index.cjs +64 -75
  45. package/dist/components/Box/index.d.ts +16 -16
  46. package/dist/components/Box/index.d.ts.map +1 -1
  47. package/dist/components/Box/index.js +64 -75
  48. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +11 -8
  49. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
  50. package/dist/components/Breadcrumbs/index.cjs +1 -1
  51. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  52. package/dist/components/Breadcrumbs/index.js +1 -1
  53. package/dist/components/Button/Button.module.scss.cjs +36 -27
  54. package/dist/components/Button/Button.module.scss.js +36 -27
  55. package/dist/components/Button/index.cjs +20 -4
  56. package/dist/components/Button/index.d.ts +18 -10
  57. package/dist/components/Button/index.d.ts.map +1 -1
  58. package/dist/components/Button/index.js +20 -4
  59. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
  60. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
  61. package/dist/components/Card/Card.module.scss.cjs +31 -26
  62. package/dist/components/Card/Card.module.scss.js +32 -27
  63. package/dist/components/Card/index.cjs +16 -3
  64. package/dist/components/Card/index.d.ts +23 -15
  65. package/dist/components/Card/index.d.ts.map +1 -1
  66. package/dist/components/Card/index.js +16 -3
  67. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  68. package/dist/components/Chart/Chart.module.scss.js +15 -15
  69. package/dist/components/Chart/index.d.ts.map +1 -1
  70. package/dist/components/Checkbox/Checkbox.module.scss.cjs +11 -11
  71. package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
  72. package/dist/components/Checkbox/index.cjs +4 -4
  73. package/dist/components/Checkbox/index.d.ts +4 -6
  74. package/dist/components/Checkbox/index.d.ts.map +1 -1
  75. package/dist/components/Checkbox/index.js +4 -4
  76. package/dist/components/Chip/Chip.module.scss.cjs +19 -19
  77. package/dist/components/Chip/Chip.module.scss.js +19 -19
  78. package/dist/components/Chip/index.cjs +3 -3
  79. package/dist/components/Chip/index.d.ts +8 -3
  80. package/dist/components/Chip/index.d.ts.map +1 -1
  81. package/dist/components/Chip/index.js +3 -3
  82. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
  83. package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
  84. package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
  85. package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
  86. package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
  87. package/dist/components/CodeBlock/css-variables-theme.js +98 -0
  88. package/dist/components/CodeBlock/index.d.ts +20 -5
  89. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  90. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  91. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  92. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  93. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  94. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  95. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  96. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  97. package/dist/components/Combobox/index.cjs +26 -6
  98. package/dist/components/Combobox/index.d.ts.map +1 -1
  99. package/dist/components/Combobox/index.js +26 -6
  100. package/dist/components/Command/Command.module.scss.cjs +14 -11
  101. package/dist/components/Command/Command.module.scss.js +14 -11
  102. package/dist/components/Command/index.cjs +28 -16
  103. package/dist/components/Command/index.d.ts +8 -3
  104. package/dist/components/Command/index.d.ts.map +1 -1
  105. package/dist/components/Command/index.js +28 -16
  106. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  107. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  108. package/dist/components/ConversationList/index.cjs +2 -2
  109. package/dist/components/ConversationList/index.js +2 -2
  110. package/dist/components/DataTable/DataTable.icons.cjs +6 -33
  111. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
  112. package/dist/components/DataTable/DataTable.icons.js +6 -33
  113. package/dist/components/DataTable/DataTable.module.scss.cjs +31 -28
  114. package/dist/components/DataTable/DataTable.module.scss.js +31 -28
  115. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
  116. package/dist/components/DataTable/index.d.ts.map +1 -1
  117. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  118. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  119. package/dist/components/DatePicker/index.d.ts.map +1 -1
  120. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  121. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  122. package/dist/components/Dialog/index.cjs +13 -16
  123. package/dist/components/Dialog/index.d.ts +11 -10
  124. package/dist/components/Dialog/index.d.ts.map +1 -1
  125. package/dist/components/Dialog/index.js +13 -16
  126. package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
  127. package/dist/components/Drawer/Drawer.module.scss.js +40 -40
  128. package/dist/components/Drawer/index.cjs +2 -2
  129. package/dist/components/Drawer/index.d.ts +5 -4
  130. package/dist/components/Drawer/index.d.ts.map +1 -1
  131. package/dist/components/Drawer/index.js +2 -2
  132. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  133. package/dist/components/Editor/Editor.module.scss.js +17 -17
  134. package/dist/components/Editor/index.d.ts +10 -10
  135. package/dist/components/Editor/index.d.ts.map +1 -1
  136. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
  137. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
  138. package/dist/components/EmptyState/index.cjs +13 -6
  139. package/dist/components/EmptyState/index.d.ts +13 -5
  140. package/dist/components/EmptyState/index.d.ts.map +1 -1
  141. package/dist/components/EmptyState/index.js +13 -6
  142. package/dist/components/Field/Field.module.scss.cjs +5 -5
  143. package/dist/components/Field/Field.module.scss.js +5 -5
  144. package/dist/components/Field/index.cjs +9 -1
  145. package/dist/components/Field/index.d.ts.map +1 -1
  146. package/dist/components/Field/index.js +9 -1
  147. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  148. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  149. package/dist/components/Grid/Grid.module.scss.cjs +54 -54
  150. package/dist/components/Grid/Grid.module.scss.js +54 -54
  151. package/dist/components/Grid/index.cjs +1 -1
  152. package/dist/components/Grid/index.js +1 -1
  153. package/dist/components/Header/Header.module.scss.cjs +33 -33
  154. package/dist/components/Header/Header.module.scss.js +33 -33
  155. package/dist/components/Header/index.cjs +17 -38
  156. package/dist/components/Header/index.d.ts +15 -11
  157. package/dist/components/Header/index.d.ts.map +1 -1
  158. package/dist/components/Header/index.js +17 -38
  159. package/dist/components/Icon/Icon.module.scss.cjs +30 -33
  160. package/dist/components/Icon/Icon.module.scss.js +30 -33
  161. package/dist/components/Icon/index.cjs +15 -14
  162. package/dist/components/Icon/index.d.ts +23 -12
  163. package/dist/components/Icon/index.d.ts.map +1 -1
  164. package/dist/components/Icon/index.js +15 -14
  165. package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
  166. package/dist/components/IconButton/IconButton.module.scss.js +12 -12
  167. package/dist/components/IconButton/index.cjs +2 -1
  168. package/dist/components/IconButton/index.d.ts +4 -4
  169. package/dist/components/IconButton/index.d.ts.map +1 -1
  170. package/dist/components/IconButton/index.js +2 -1
  171. package/dist/components/Image/Image.module.scss.cjs +27 -27
  172. package/dist/components/Image/Image.module.scss.js +27 -27
  173. package/dist/components/Input/Input.module.scss.cjs +15 -21
  174. package/dist/components/Input/Input.module.scss.js +15 -21
  175. package/dist/components/Input/index.cjs +2 -14
  176. package/dist/components/Input/index.d.ts +0 -2
  177. package/dist/components/Input/index.d.ts.map +1 -1
  178. package/dist/components/Input/index.js +2 -14
  179. package/dist/components/Link/Link.module.scss.cjs +26 -14
  180. package/dist/components/Link/Link.module.scss.js +26 -14
  181. package/dist/components/Link/index.cjs +13 -2
  182. package/dist/components/Link/index.d.ts +11 -4
  183. package/dist/components/Link/index.d.ts.map +1 -1
  184. package/dist/components/Link/index.js +13 -2
  185. package/dist/components/List/List.module.scss.cjs +23 -19
  186. package/dist/components/List/List.module.scss.js +23 -19
  187. package/dist/components/List/index.cjs +7 -7
  188. package/dist/components/List/index.d.ts +10 -7
  189. package/dist/components/List/index.d.ts.map +1 -1
  190. package/dist/components/List/index.js +7 -7
  191. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  192. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  193. package/dist/components/Loading/Loading.module.scss.cjs +34 -34
  194. package/dist/components/Loading/Loading.module.scss.js +34 -34
  195. package/dist/components/Loading/index.cjs +5 -5
  196. package/dist/components/Loading/index.d.ts +8 -7
  197. package/dist/components/Loading/index.d.ts.map +1 -1
  198. package/dist/components/Loading/index.js +5 -5
  199. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  200. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  201. package/dist/components/Markdown/index.d.ts +2 -2
  202. package/dist/components/Markdown/index.d.ts.map +1 -1
  203. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  204. package/dist/components/Menu/Menu.module.scss.js +14 -14
  205. package/dist/components/Message/Message.module.scss.cjs +20 -20
  206. package/dist/components/Message/Message.module.scss.js +20 -20
  207. package/dist/components/Message/index.cjs +1 -1
  208. package/dist/components/Message/index.d.ts +1 -1
  209. package/dist/components/Message/index.js +1 -1
  210. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
  211. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
  212. package/dist/components/NavigationMenu/index.cjs +32 -15
  213. package/dist/components/NavigationMenu/index.d.ts +12 -6
  214. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  215. package/dist/components/NavigationMenu/index.js +32 -15
  216. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  217. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  218. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  219. package/dist/components/Popover/Popover.module.scss.js +10 -10
  220. package/dist/components/Progress/Progress.module.scss.cjs +28 -25
  221. package/dist/components/Progress/Progress.module.scss.js +28 -25
  222. package/dist/components/Progress/index.cjs +21 -12
  223. package/dist/components/Progress/index.d.ts +10 -6
  224. package/dist/components/Progress/index.d.ts.map +1 -1
  225. package/dist/components/Progress/index.js +21 -12
  226. package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
  227. package/dist/components/Prompt/Prompt.module.scss.js +30 -30
  228. package/dist/components/Prompt/index.cjs +7 -7
  229. package/dist/components/Prompt/index.d.ts +11 -9
  230. package/dist/components/Prompt/index.d.ts.map +1 -1
  231. package/dist/components/Prompt/index.js +7 -7
  232. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
  233. package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
  234. package/dist/components/RadioGroup/index.cjs +10 -5
  235. package/dist/components/RadioGroup/index.d.ts +11 -7
  236. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  237. package/dist/components/RadioGroup/index.js +10 -5
  238. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  239. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  240. package/dist/components/ScrollArea/index.d.ts +4 -4
  241. package/dist/components/ScrollArea/index.d.ts.map +1 -1
  242. package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
  243. package/dist/components/Select/Select.module.scss.cjs +21 -21
  244. package/dist/components/Select/Select.module.scss.js +21 -21
  245. package/dist/components/Select/index.cjs +26 -20
  246. package/dist/components/Select/index.d.ts +5 -5
  247. package/dist/components/Select/index.d.ts.map +1 -1
  248. package/dist/components/Select/index.js +26 -20
  249. package/dist/components/Separator/Separator.module.scss.cjs +25 -19
  250. package/dist/components/Separator/Separator.module.scss.js +25 -19
  251. package/dist/components/Separator/index.cjs +10 -8
  252. package/dist/components/Separator/index.d.ts +4 -2
  253. package/dist/components/Separator/index.d.ts.map +1 -1
  254. package/dist/components/Separator/index.js +10 -8
  255. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  256. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  257. package/dist/components/Sidebar/index.cjs +15 -38
  258. package/dist/components/Sidebar/index.d.ts +19 -19
  259. package/dist/components/Sidebar/index.d.ts.map +1 -1
  260. package/dist/components/Sidebar/index.js +15 -38
  261. package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
  262. package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
  263. package/dist/components/Skeleton/index.cjs +7 -7
  264. package/dist/components/Skeleton/index.d.ts +8 -7
  265. package/dist/components/Skeleton/index.d.ts.map +1 -1
  266. package/dist/components/Skeleton/index.js +7 -7
  267. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  268. package/dist/components/Slider/Slider.module.scss.js +12 -12
  269. package/dist/components/Stack/Stack.module.scss.cjs +25 -25
  270. package/dist/components/Stack/Stack.module.scss.js +25 -25
  271. package/dist/components/Stack/index.cjs +1 -1
  272. package/dist/components/Stack/index.js +1 -1
  273. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  274. package/dist/components/Switch/Switch.module.scss.js +9 -9
  275. package/dist/components/Table/Table.module.scss.cjs +19 -19
  276. package/dist/components/Table/Table.module.scss.js +19 -19
  277. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  278. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  279. package/dist/components/TableOfContents/index.cjs +14 -10
  280. package/dist/components/TableOfContents/index.d.ts +5 -3
  281. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  282. package/dist/components/TableOfContents/index.js +14 -10
  283. package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
  284. package/dist/components/Tabs/Tabs.module.scss.js +18 -18
  285. package/dist/components/Tabs/index.cjs +30 -11
  286. package/dist/components/Tabs/index.d.ts +8 -6
  287. package/dist/components/Tabs/index.d.ts.map +1 -1
  288. package/dist/components/Tabs/index.js +30 -11
  289. package/dist/components/Text/Text.module.scss.cjs +109 -97
  290. package/dist/components/Text/Text.module.scss.js +109 -97
  291. package/dist/components/Text/index.cjs +45 -41
  292. package/dist/components/Text/index.d.ts +24 -19
  293. package/dist/components/Text/index.d.ts.map +1 -1
  294. package/dist/components/Text/index.js +45 -41
  295. package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
  296. package/dist/components/Textarea/Textarea.module.scss.js +22 -28
  297. package/dist/components/Textarea/index.cjs +3 -10
  298. package/dist/components/Textarea/index.d.ts +0 -2
  299. package/dist/components/Textarea/index.d.ts.map +1 -1
  300. package/dist/components/Textarea/index.js +3 -10
  301. package/dist/components/Theme/index.cjs +22 -5
  302. package/dist/components/Theme/index.d.ts +6 -12
  303. package/dist/components/Theme/index.d.ts.map +1 -1
  304. package/dist/components/Theme/index.js +22 -5
  305. package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
  306. package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
  307. package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
  308. package/dist/components/ThemeToggle/ThemeButton.js +34 -0
  309. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -6
  310. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -6
  311. package/dist/components/ThemeToggle/icons.cjs +48 -0
  312. package/dist/components/ThemeToggle/icons.d.ts +10 -0
  313. package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
  314. package/dist/components/ThemeToggle/icons.js +48 -0
  315. package/dist/components/ThemeToggle/index.cjs +6 -50
  316. package/dist/components/ThemeToggle/index.d.ts +5 -3
  317. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  318. package/dist/components/ThemeToggle/index.js +3 -47
  319. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
  320. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
  321. package/dist/components/ThinkingIndicator/index.cjs +7 -8
  322. package/dist/components/ThinkingIndicator/index.d.ts +6 -5
  323. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
  324. package/dist/components/ThinkingIndicator/index.js +7 -8
  325. package/dist/components/Toast/Toast.module.scss.cjs +28 -29
  326. package/dist/components/Toast/Toast.module.scss.js +29 -30
  327. package/dist/components/Toast/index.cjs +28 -30
  328. package/dist/components/Toast/index.d.ts +9 -8
  329. package/dist/components/Toast/index.d.ts.map +1 -1
  330. package/dist/components/Toast/index.js +28 -30
  331. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
  332. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
  333. package/dist/components/ToggleGroup/index.cjs +4 -5
  334. package/dist/components/ToggleGroup/index.d.ts +7 -6
  335. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  336. package/dist/components/ToggleGroup/index.js +4 -5
  337. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  338. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  339. package/dist/components/Tooltip/index.cjs +24 -40
  340. package/dist/components/Tooltip/index.d.ts +4 -4
  341. package/dist/components/Tooltip/index.d.ts.map +1 -1
  342. package/dist/components/Tooltip/index.js +24 -40
  343. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +1 -1
  344. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
  345. package/dist/components/VisuallyHidden/index.d.ts +2 -2
  346. package/dist/data-table-virtual.cjs +3 -2
  347. package/dist/data-table-virtual.js +3 -2
  348. package/dist/data-table.cjs +3 -2
  349. package/dist/data-table.js +3 -2
  350. package/dist/datepicker.cjs +26 -13
  351. package/dist/datepicker.js +26 -13
  352. package/dist/editor.cjs +68 -28
  353. package/dist/editor.js +68 -28
  354. package/dist/index.cjs +6 -2
  355. package/dist/index.d.ts +9 -9
  356. package/dist/index.d.ts.map +1 -1
  357. package/dist/index.js +8 -4
  358. package/dist/markdown.cjs +21 -29
  359. package/dist/markdown.js +21 -29
  360. package/dist/measurements/generated.cjs +46 -94
  361. package/dist/measurements/generated.d.ts +44 -92
  362. package/dist/measurements/generated.d.ts.map +1 -1
  363. package/dist/measurements/generated.js +46 -94
  364. package/dist/measurements/index.d.ts +1 -1
  365. package/dist/measurements/index.d.ts.map +1 -1
  366. package/dist/utils/a11y.cjs +5 -2
  367. package/dist/utils/a11y.d.ts +5 -5
  368. package/dist/utils/a11y.d.ts.map +1 -1
  369. package/dist/utils/a11y.js +5 -2
  370. package/dist/utils/canonical-stamp.cjs +2 -8
  371. package/dist/utils/canonical-stamp.d.ts.map +1 -1
  372. package/dist/utils/canonical-stamp.js +1 -7
  373. package/dist/utils/css-warning.cjs +1 -1
  374. package/dist/utils/css-warning.js +1 -1
  375. package/dist/utils/env.cjs +17 -0
  376. package/dist/utils/env.d.ts +3 -0
  377. package/dist/utils/env.d.ts.map +1 -0
  378. package/dist/utils/env.js +17 -0
  379. package/dist/utils/keyboard-shortcuts.cjs +3 -10
  380. package/dist/utils/keyboard-shortcuts.d.ts +4 -4
  381. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
  382. package/dist/utils/keyboard-shortcuts.js +3 -10
  383. package/dist/utils/seed-derivation.cjs +10 -7
  384. package/dist/utils/seed-derivation.d.ts +1 -3
  385. package/dist/utils/seed-derivation.d.ts.map +1 -1
  386. package/dist/utils/seed-derivation.js +10 -7
  387. package/dist/utils/theme-presets.cjs +5 -10
  388. package/dist/utils/theme-presets.d.ts +1 -2
  389. package/dist/utils/theme-presets.d.ts.map +1 -1
  390. package/dist/utils/theme-presets.js +5 -10
  391. package/fragments.json +1 -1
  392. package/package.json +9 -10
  393. package/src/assets/fragments-logo.tsx +2 -2
  394. package/src/assets/fragments-wordmark.tsx +4 -2
  395. package/src/assets/nav-glyph.module.scss +166 -0
  396. package/src/assets/nav-glyph.tsx +188 -0
  397. package/src/components/Accordion/Accordion.contract.json +24 -48
  398. package/src/components/Accordion/Accordion.module.scss +5 -3
  399. package/src/components/Alert/Alert.contract.json +49 -65
  400. package/src/components/Alert/Alert.module.scss +57 -47
  401. package/src/components/Alert/index.tsx +72 -39
  402. package/src/components/AppShell/AppShell.contract.json +34 -51
  403. package/src/components/AppShell/AppShell.module.scss +99 -54
  404. package/src/components/AppShell/index.tsx +2 -2
  405. package/src/components/Avatar/Avatar.contract.json +31 -48
  406. package/src/components/Avatar/Avatar.module.scss +4 -2
  407. package/src/components/Badge/Badge.contract.json +86 -55
  408. package/src/components/Badge/Badge.module.scss +80 -48
  409. package/src/components/Badge/index.tsx +34 -17
  410. package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
  411. package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
  412. package/src/components/Box/Box.contract.json +40 -148
  413. package/src/components/Box/Box.module.scss +7 -6
  414. package/src/components/Box/index.tsx +92 -99
  415. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
  416. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +27 -12
  417. package/src/components/Breadcrumbs/index.tsx +5 -1
  418. package/src/components/Button/Button.module.scss +261 -185
  419. package/src/components/Button/index.tsx +41 -28
  420. package/src/components/ButtonGroup/ButtonGroup.contract.json +34 -49
  421. package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
  422. package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
  423. package/src/components/Card/Card.module.scss +97 -76
  424. package/src/components/Card/index.tsx +44 -20
  425. package/src/components/Chart/Chart.contract.json +21 -29
  426. package/src/components/Chart/Chart.module.scss +6 -5
  427. package/src/components/Chart/index.tsx +36 -6
  428. package/src/components/Checkbox/Checkbox.contract.json +28 -27
  429. package/src/components/Checkbox/Checkbox.module.scss +47 -54
  430. package/src/components/Checkbox/index.tsx +10 -10
  431. package/src/components/Chip/Chip.contract.json +38 -45
  432. package/src/components/Chip/Chip.module.scss +24 -23
  433. package/src/components/Chip/index.tsx +12 -7
  434. package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
  435. package/src/components/CodeBlock/CodeBlock.module.scss +75 -73
  436. package/src/components/CodeBlock/css-variables-theme.ts +102 -0
  437. package/src/components/CodeBlock/index.tsx +114 -51
  438. package/src/components/Collapsible/Collapsible.contract.json +21 -36
  439. package/src/components/Collapsible/Collapsible.module.scss +1 -7
  440. package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
  441. package/src/components/ColorPicker/ColorPicker.module.scss +34 -24
  442. package/src/components/ColorPicker/index.tsx +6 -1
  443. package/src/components/Combobox/Combobox.contract.json +36 -37
  444. package/src/components/Combobox/Combobox.module.scss +16 -19
  445. package/src/components/Combobox/index.tsx +41 -6
  446. package/src/components/Command/Command.contract.json +28 -44
  447. package/src/components/Command/Command.module.scss +19 -21
  448. package/src/components/Command/index.tsx +64 -47
  449. package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
  450. package/src/components/ConversationList/ConversationList.contract.json +27 -32
  451. package/src/components/ConversationList/ConversationList.module.scss +2 -3
  452. package/src/components/ConversationList/index.tsx +2 -2
  453. package/src/components/DataTable/DataTable.icons.tsx +4 -21
  454. package/src/components/DataTable/DataTable.module.scss +24 -17
  455. package/src/components/DataTable/DataTable.virtual.tsx +3 -2
  456. package/src/components/DataTable/index.tsx +9 -8
  457. package/src/components/DatePicker/DatePicker.contract.json +27 -28
  458. package/src/components/DatePicker/DatePicker.module.scss +41 -44
  459. package/src/components/DatePicker/index.tsx +23 -9
  460. package/src/components/Dialog/Dialog.module.scss +26 -32
  461. package/src/components/Dialog/index.tsx +51 -39
  462. package/src/components/Drawer/Drawer.contract.json +28 -42
  463. package/src/components/Drawer/Drawer.module.scss +123 -64
  464. package/src/components/Drawer/index.tsx +7 -5
  465. package/src/components/Editor/Editor.contract.json +32 -49
  466. package/src/components/Editor/Editor.module.scss +60 -25
  467. package/src/components/Editor/index.tsx +240 -179
  468. package/src/components/EmptyState/EmptyState.contract.json +33 -45
  469. package/src/components/EmptyState/EmptyState.module.scss +37 -21
  470. package/src/components/EmptyState/index.tsx +56 -23
  471. package/src/components/Field/Field.contract.json +28 -46
  472. package/src/components/Field/Field.module.scss +2 -1
  473. package/src/components/Field/index.tsx +5 -1
  474. package/src/components/Fieldset/Fieldset.contract.json +21 -38
  475. package/src/components/Fieldset/Fieldset.module.scss +15 -7
  476. package/src/components/Form/Form.contract.json +23 -23
  477. package/src/components/Grid/Grid.contract.json +28 -64
  478. package/src/components/Grid/Grid.module.scss +2 -2
  479. package/src/components/Grid/index.tsx +10 -10
  480. package/src/components/Header/Header.contract.json +31 -67
  481. package/src/components/Header/Header.module.scss +57 -54
  482. package/src/components/Header/index.tsx +134 -122
  483. package/src/components/Icon/Icon.contract.json +37 -81
  484. package/src/components/Icon/Icon.module.scss +13 -12
  485. package/src/components/Icon/index.tsx +31 -31
  486. package/src/components/IconButton/IconButton.contract.json +37 -21
  487. package/src/components/IconButton/IconButton.module.scss +19 -11
  488. package/src/components/IconButton/index.tsx +6 -5
  489. package/src/components/Image/Image.contract.json +23 -56
  490. package/src/components/Input/Input.contract.json +25 -44
  491. package/src/components/Input/Input.module.scss +6 -55
  492. package/src/components/Input/index.tsx +2 -18
  493. package/src/components/Link/Link.contract.json +46 -58
  494. package/src/components/Link/Link.module.scss +41 -10
  495. package/src/components/Link/index.tsx +27 -6
  496. package/src/components/List/List.contract.json +33 -62
  497. package/src/components/List/List.module.scss +10 -5
  498. package/src/components/List/index.tsx +17 -13
  499. package/src/components/Listbox/Listbox.contract.json +21 -37
  500. package/src/components/Listbox/Listbox.module.scss +14 -20
  501. package/src/components/Loading/Loading.contract.json +41 -65
  502. package/src/components/Loading/Loading.module.scss +37 -31
  503. package/src/components/Loading/index.tsx +15 -14
  504. package/src/components/Main/Main.contract.json +17 -9
  505. package/src/components/Markdown/Markdown.contract.json +22 -43
  506. package/src/components/Markdown/Markdown.module.scss +45 -6
  507. package/src/components/Markdown/index.tsx +48 -49
  508. package/src/components/Menu/Menu.contract.json +30 -46
  509. package/src/components/Menu/Menu.module.scss +32 -16
  510. package/src/components/Message/Message.contract.json +31 -54
  511. package/src/components/Message/Message.module.scss +18 -9
  512. package/src/components/Message/index.tsx +2 -2
  513. package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
  514. package/src/components/NavigationMenu/NavigationMenu.module.scss +66 -66
  515. package/src/components/NavigationMenu/index.tsx +105 -81
  516. package/src/components/Pagination/Pagination.contract.json +22 -40
  517. package/src/components/Pagination/Pagination.module.scss +9 -16
  518. package/src/components/Popover/Popover.contract.json +28 -50
  519. package/src/components/Popover/Popover.module.scss +30 -28
  520. package/src/components/Progress/Progress.contract.json +39 -35
  521. package/src/components/Progress/Progress.module.scss +16 -10
  522. package/src/components/Progress/index.tsx +34 -16
  523. package/src/components/Prompt/Prompt.contract.json +40 -56
  524. package/src/components/Prompt/Prompt.module.scss +49 -48
  525. package/src/components/Prompt/index.tsx +17 -15
  526. package/src/components/RadioGroup/RadioGroup.contract.json +29 -28
  527. package/src/components/RadioGroup/RadioGroup.module.scss +50 -45
  528. package/src/components/RadioGroup/index.tsx +23 -10
  529. package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
  530. package/src/components/ScrollArea/ScrollArea.module.scss +45 -48
  531. package/src/components/ScrollArea/index.tsx +16 -16
  532. package/src/components/ScrollArea/scroll-state.ts +24 -24
  533. package/src/components/Select/Select.module.scss +20 -19
  534. package/src/components/Select/index.tsx +26 -24
  535. package/src/components/Separator/Separator.contract.json +29 -53
  536. package/src/components/Separator/Separator.module.scss +24 -40
  537. package/src/components/Separator/index.tsx +16 -11
  538. package/src/components/Sidebar/Sidebar.contract.json +35 -67
  539. package/src/components/Sidebar/Sidebar.module.scss +94 -88
  540. package/src/components/Sidebar/index.tsx +167 -167
  541. package/src/components/Skeleton/Skeleton.contract.json +34 -60
  542. package/src/components/Skeleton/Skeleton.module.scss +50 -26
  543. package/src/components/Skeleton/index.tsx +16 -15
  544. package/src/components/Slider/Slider.contract.json +27 -39
  545. package/src/components/Slider/Slider.module.scss +9 -22
  546. package/src/components/Stack/Stack.contract.json +30 -57
  547. package/src/components/Stack/Stack.module.scss +26 -24
  548. package/src/components/Stack/index.tsx +3 -3
  549. package/src/components/Switch/Switch.contract.json +33 -46
  550. package/src/components/Switch/Switch.module.scss +106 -59
  551. package/src/components/Table/Table.contract.json +28 -46
  552. package/src/components/Table/Table.module.scss +24 -16
  553. package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
  554. package/src/components/TableOfContents/TableOfContents.module.scss +17 -13
  555. package/src/components/TableOfContents/index.tsx +27 -10
  556. package/src/components/Tabs/Tabs.contract.json +35 -56
  557. package/src/components/Tabs/Tabs.module.scss +27 -31
  558. package/src/components/Tabs/index.tsx +30 -15
  559. package/src/components/Text/Text.contract.json +52 -72
  560. package/src/components/Text/Text.module.scss +34 -18
  561. package/src/components/Text/index.tsx +123 -83
  562. package/src/components/Textarea/Textarea.contract.json +24 -55
  563. package/src/components/Textarea/Textarea.module.scss +22 -52
  564. package/src/components/Textarea/index.tsx +3 -14
  565. package/src/components/Theme/Theme.contract.json +35 -53
  566. package/src/components/Theme/index.tsx +41 -13
  567. package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
  568. package/src/components/ThemeToggle/ThemeToggle.module.scss +20 -27
  569. package/src/components/ThemeToggle/icons.tsx +46 -0
  570. package/src/components/ThemeToggle/index.tsx +9 -55
  571. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +34 -50
  572. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
  573. package/src/components/ThinkingIndicator/index.tsx +12 -14
  574. package/src/components/Toast/Toast.contract.json +55 -49
  575. package/src/components/Toast/Toast.module.scss +50 -105
  576. package/src/components/Toast/index.tsx +39 -34
  577. package/src/components/ToggleGroup/ToggleGroup.contract.json +39 -40
  578. package/src/components/ToggleGroup/ToggleGroup.module.scss +30 -27
  579. package/src/components/ToggleGroup/index.tsx +11 -11
  580. package/src/components/Tooltip/Tooltip.contract.json +31 -52
  581. package/src/components/Tooltip/Tooltip.module.scss +16 -10
  582. package/src/components/Tooltip/index.tsx +19 -24
  583. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
  584. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
  585. package/src/components/VisuallyHidden/index.tsx +5 -5
  586. package/src/index.ts +16 -12
  587. package/src/measurements/MeasurementTargets.module.scss +6 -7
  588. package/src/measurements/generated.ts +46 -97
  589. package/src/measurements/index.ts +0 -1
  590. package/src/measurements/measurements.json +44 -116
  591. package/src/recipes/_action.scss +4 -4
  592. package/src/recipes/_boolean-range.scss +12 -16
  593. package/src/recipes/_feedback.scss +17 -16
  594. package/src/recipes/_field.scss +28 -16
  595. package/src/recipes/_layout.scss +14 -7
  596. package/src/recipes/_navigation.scss +84 -29
  597. package/src/recipes/_overlay.scss +143 -43
  598. package/src/recipes/_popup.scss +54 -34
  599. package/src/recipes/_prose.scss +48 -28
  600. package/src/recipes/_representation.scss +10 -9
  601. package/src/recipes/_segmented.scss +1 -1
  602. package/src/recipes/_table-chrome.scss +42 -17
  603. package/src/recipes/_target.scss +2 -4
  604. package/src/recipes/_typography.scss +10 -0
  605. package/src/scss.d.ts +1 -1
  606. package/src/styles/globals.scss +31 -25
  607. package/src/tokens/_component-properties.scss +19 -1
  608. package/src/tokens/_computed.scss +32 -49
  609. package/src/tokens/_derive.scss +112 -210
  610. package/src/tokens/_measurements.catalog.generated.css +62 -44
  611. package/src/tokens/_measurements.generated.scss +119 -249
  612. package/src/tokens/_mixins.scss +49 -48
  613. package/src/tokens/_palettes.scss +39 -167
  614. package/src/tokens/_property-registrations.scss +9 -0
  615. package/src/tokens/_seeds.scss +20 -31
  616. package/src/tokens/_variables.scss +251 -94
  617. package/src/utils/a11y.tsx +69 -69
  618. package/src/utils/aria.ts +3 -3
  619. package/src/utils/canonical-stamp.ts +2 -12
  620. package/src/utils/css-warning.ts +7 -7
  621. package/src/utils/env.ts +25 -0
  622. package/src/utils/keyboard-shortcuts.ts +131 -126
  623. package/src/utils/seed-derivation.ts +11 -14
  624. package/src/utils/theme-presets.ts +5 -12
  625. package/dist/blocks/AccountSettings.block.d.ts +0 -3
  626. package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
  627. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
  628. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
  629. package/dist/blocks/BlogEditor.block.d.ts +0 -3
  630. package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
  631. package/dist/blocks/ChatInterface.block.d.ts +0 -3
  632. package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
  633. package/dist/blocks/ChatMessages.block.d.ts +0 -3
  634. package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
  635. package/dist/blocks/CheckoutForm.block.d.ts +0 -3
  636. package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
  637. package/dist/blocks/CommandPalette.block.d.ts +0 -3
  638. package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
  639. package/dist/blocks/ContactForm.block.d.ts +0 -3
  640. package/dist/blocks/ContactForm.block.d.ts.map +0 -1
  641. package/dist/blocks/DashboardPage.block.d.ts +0 -3
  642. package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
  643. package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
  644. package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
  645. package/dist/blocks/DataTable.block.d.ts +0 -3
  646. package/dist/blocks/DataTable.block.d.ts.map +0 -1
  647. package/dist/blocks/EmptyState.block.d.ts +0 -3
  648. package/dist/blocks/EmptyState.block.d.ts.map +0 -1
  649. package/dist/blocks/FAQSection.block.d.ts +0 -3
  650. package/dist/blocks/FAQSection.block.d.ts.map +0 -1
  651. package/dist/blocks/FeatureGrid.block.d.ts +0 -3
  652. package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
  653. package/dist/blocks/HeroSection.block.d.ts +0 -3
  654. package/dist/blocks/HeroSection.block.d.ts.map +0 -1
  655. package/dist/blocks/NavigationHeader.block.d.ts +0 -3
  656. package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
  657. package/dist/blocks/PaginatedTable.block.d.ts +0 -3
  658. package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
  659. package/dist/blocks/PricingComparison.block.d.ts +0 -3
  660. package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
  661. package/dist/blocks/ProductCard.block.d.ts +0 -3
  662. package/dist/blocks/ProductCard.block.d.ts.map +0 -1
  663. package/dist/blocks/RegistrationForm.block.d.ts +0 -3
  664. package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
  665. package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
  666. package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
  667. package/dist/blocks/SettingsPanel.block.d.ts +0 -3
  668. package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
  669. package/dist/blocks/ShoppingCart.block.d.ts +0 -3
  670. package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
  671. package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
  672. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
  673. package/dist/blocks/TableSkeleton.block.d.ts +0 -3
  674. package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
  675. package/dist/blocks/ThinkingStates.block.d.ts +0 -3
  676. package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
  677. package/dist/components/Toggle/index.d.ts +0 -3
  678. package/dist/components/Toggle/index.d.ts.map +0 -1
  679. package/src/components/Button/Button.contract.json +0 -218
  680. package/src/components/Card/Card.contract.json +0 -175
  681. package/src/components/DataTable/DataTable.contract.json +0 -302
  682. package/src/components/Dialog/Dialog.contract.json +0 -159
  683. package/src/components/Select/Select.contract.json +0 -259
  684. package/src/components/Toggle/index.ts +0 -7
  685. package/src/tokens/_density.scss +0 -85
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Image",
4
- "description": "Responsive image component with aspect ratio control, loading states, and error fallbacks. Handles image display with consistent styling.",
4
+ "description": "Renders a picture at a fixed shape with a built-in fallback when loading fails.",
5
5
  "category": "display",
6
- "tags": [
7
- "image",
8
- "media",
9
- "photo",
10
- "picture",
11
- "visual"
12
- ],
6
+ "tags": ["image", "media", "photo", "picture", "visual"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Image/index.tsx",
15
9
  "exportName": "Image",
@@ -44,25 +38,14 @@
44
38
  "description": "Aspect ratio of the image container",
45
39
  "default": "auto",
46
40
  "required": false,
47
- "values": [
48
- "1:1",
49
- "4:3",
50
- "16:9",
51
- "21:9",
52
- "auto"
53
- ]
41
+ "values": ["1:1", "4:3", "16:9", "21:9", "auto"]
54
42
  },
55
43
  "objectFit": {
56
44
  "type": "enum",
57
45
  "description": "How the image fits within its container",
58
46
  "default": "cover",
59
47
  "required": false,
60
- "values": [
61
- "cover",
62
- "contain",
63
- "fill",
64
- "none"
65
- ]
48
+ "values": ["cover", "contain", "fill", "none"]
66
49
  },
67
50
  "width": {
68
51
  "type": "union",
@@ -79,13 +62,7 @@
79
62
  "description": "Border radius",
80
63
  "default": "none",
81
64
  "required": false,
82
- "values": [
83
- "none",
84
- "sm",
85
- "md",
86
- "lg",
87
- "full"
88
- ]
65
+ "values": ["none", "sm", "md", "lg", "full"]
89
66
  },
90
67
  "fallback": {
91
68
  "type": "node",
@@ -120,50 +97,45 @@
120
97
  },
121
98
  "usage": {
122
99
  "when": [
123
- "Displaying product images in cards or grids",
124
- "Hero images with specific aspect ratios",
125
- "User-uploaded content that may fail to load",
126
- "Thumbnails in lists or galleries"
100
+ "Product shots, thumbnails, and hero art",
101
+ "Uploads you do not control and cannot trust to load"
127
102
  ],
128
103
  "whenNot": [
129
- "User avatars (use Avatar component)",
130
- "Icons or symbols (use Icon component)",
131
- "Background images (use CSS background-image)",
132
- "SVG illustrations (use inline SVG or Image component)"
104
+ "A person (use Avatar)",
105
+ "A symbol (use Icon)",
106
+ "Pure decoration behind content (use a CSS background)"
133
107
  ],
134
108
  "guidelines": [
135
- "Always provide meaningful alt text for accessibility",
136
- "Use appropriate aspect ratios for consistent layouts",
137
- "Provide fallback content for failed loads",
138
- "Use objectFit=\"contain\" for logos to preserve aspect ratio",
139
- "Use imgProps / onImageLoad / onImageError when you need lower-level img control"
109
+ "Set aspectRatio so a grid holds its shape before the file arrives",
110
+ "objectFit=\"contain\" for logos, \"cover\" for photography",
111
+ "Always give fallback something to say",
112
+ "imgProps, onImageLoad, and onImageError expose the raw img when you need it"
140
113
  ],
141
114
  "accessibility": [
142
- "Alt text is required and must describe the image content",
143
- "Decorative images should have empty alt=\"\"",
144
- "Avoid text in images; if necessary, describe the text in alt",
145
- "Ensure sufficient contrast between image and surrounding content"
115
+ "alt is required describe what the picture shows",
116
+ "Decoration takes alt=\"\"",
117
+ "Words baked into an image must be repeated in alt"
146
118
  ]
147
119
  },
148
120
  "examples": [
149
121
  {
150
122
  "name": "Default",
151
- "description": "Basic image display",
123
+ "description": "src plus alt — the shape follows the file.",
152
124
  "code": "<Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=400&h=300&fit=crop\"\n alt=\"Code on a screen\"\n width={300}\n/>"
153
125
  },
154
126
  {
155
127
  "name": "Aspect Ratios",
156
- "description": "Different aspect ratio options",
128
+ "description": "Lock the frame so a grid stays even whatever the file is.",
157
129
  "code": "<div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap' }}>\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=200&h=200&fit=crop\"\n alt=\"Square image\"\n aspectRatio=\"1:1\"\n width={100}\n />\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=200&h=150&fit=crop\"\n alt=\"4:3 image\"\n aspectRatio=\"4:3\"\n width={120}\n />\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=320&h=180&fit=crop\"\n alt=\"16:9 image\"\n aspectRatio=\"16:9\"\n width={160}\n />\n</div>"
158
130
  },
159
131
  {
160
132
  "name": "Rounded Corners",
161
- "description": "Border radius options",
133
+ "description": "Rounding softens the frame; match it to the surface it sits on.",
162
134
  "code": "<div style={{ display: 'flex', gap: '16px', alignItems: 'center' }}>\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=100&h=100&fit=crop\"\n alt=\"No rounding\"\n rounded=\"none\"\n width={80}\n height={80}\n />\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=100&h=100&fit=crop\"\n alt=\"Medium rounding\"\n rounded=\"md\"\n width={80}\n height={80}\n />\n <Image\n src=\"https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=100&h=100&fit=crop\"\n alt=\"Full rounding\"\n rounded=\"full\"\n width={80}\n height={80}\n />\n</div>"
163
135
  },
164
136
  {
165
137
  "name": "With Fallback",
166
- "description": "Fallback content for loading/error states",
138
+ "description": "A dead URL shows this instead of a broken-image glyph.",
167
139
  "code": "<Image\n src=\"https://invalid-url.example/image.jpg\"\n alt=\"Image that will fail\"\n width={200}\n height={150}\n rounded=\"md\"\n fallback={\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', background: 'var(--fui-color-surface-secondary)' }}>\n <span style={{ color: 'var(--fui-color-text-tertiary)' }}>No image</span>\n </div>\n }\n/>"
168
140
  }
169
141
  ],
@@ -189,16 +161,11 @@
189
161
  "fallback: ReactNode - loading/error content",
190
162
  "imgProps/onImageLoad/onImageError - low-level img customization and events"
191
163
  ],
192
- "a11yRules": [
193
- "A11Y_IMG_ALT",
194
- "A11Y_IMG_DECORATIVE"
195
- ]
164
+ "a11yRules": ["A11Y_IMG_ALT", "A11Y_IMG_DECORATIVE"]
196
165
  },
197
166
  "ai": {
198
167
  "compositionPattern": "compound",
199
- "subComponents": [
200
- "Root"
201
- ]
168
+ "subComponents": ["Root"]
202
169
  },
203
170
  "provenance": {
204
171
  "source": "migrated",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Input",
4
- "description": "Text input field for single-line user data entry",
5
- "category": "forms",
4
+ "description": "Collects a single line of user-entered text.",
5
+ "category": "inputs",
6
6
  "tags": ["form", "input", "text"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/Input/index.tsx",
@@ -15,7 +15,6 @@
15
15
  "size: sm|md|lg (default: md)",
16
16
  "disabled: boolean (default: false)",
17
17
  "error: boolean (default: false)",
18
- "success: boolean (default: false)",
19
18
  "label: string",
20
19
  "required: boolean (default: false)",
21
20
  "helperText: string",
@@ -78,12 +77,6 @@
78
77
  "default": "false",
79
78
  "required": false
80
79
  },
81
- "success": {
82
- "type": "boolean",
83
- "description": "Whether to show success/validated styling",
84
- "default": "false",
85
- "required": false
86
- },
87
80
  "label": {
88
81
  "type": "string",
89
82
  "description": "Label text displayed above input",
@@ -181,10 +174,9 @@
181
174
  },
182
175
  "usage": {
183
176
  "when": [
184
- "Collecting single-line text data from users",
185
- "Email, password, phone number, or URL input",
177
+ "Single-line answers: name, email, password, phone, URL",
186
178
  "Search fields",
187
- "Short form fields (name, title, etc.)"
179
+ "Short free-form values a list cannot cover"
188
180
  ],
189
181
  "whenNot": [
190
182
  "Multi-line text (use Textarea)",
@@ -193,83 +185,73 @@
193
185
  "Date/time input (use DatePicker)"
194
186
  ],
195
187
  "guidelines": [
196
- "Always provide a label for accessibility",
197
- "Use appropriate input type for data validation",
198
- "Show validation errors with error prop and helperText",
199
- "Use placeholder for format hints, not labels",
200
- "Use the shortcut prop for embedded keyboard hints instead of custom kbd markup around inputs",
201
- "Shortcut hints are display-only by default; set shortcutBehavior=\"focus-input\" to opt into global hotkey focusing"
188
+ "Give every field a label",
189
+ "Match type to the data — it drives validation and mobile keyboards",
190
+ "Placeholder shows format; it never replaces the label",
191
+ "Pair error with helperText so the reason is announced",
192
+ "Use the shortcut prop for kbd hints instead of custom markup",
193
+ "shortcut is display-only; shortcutBehavior=\"focus-input\" adds the global hotkey"
202
194
  ],
203
195
  "accessibility": [
204
- "Labels must be associated with inputs",
205
- "Error messages should be announced to screen readers",
206
- "Required fields should be indicated"
196
+ "Label is programmatically tied to the input",
197
+ "Error text is announced to screen readers",
198
+ "Required fields are marked"
207
199
  ]
208
200
  },
209
201
  "examples": [
210
202
  {
211
203
  "name": "Default",
212
- "description": "Basic text input",
204
+ "description": "Label plus a placeholder that hints the format.",
213
205
  "code": "<Input label=\"Name\" placeholder=\"Enter your name\" />"
214
206
  },
215
207
  {
216
208
  "name": "With Value",
217
- "description": "Input with pre-filled value",
209
+ "description": "Starts with a value already in the field.",
218
210
  "code": "<Input label=\"Email\" type=\"email\" value=\"user@example.com\" />"
219
211
  },
220
212
  {
221
213
  "name": "With Helper",
222
- "description": "Input with helper text",
214
+ "description": "Supporting text sits under the field.",
223
215
  "code": "<Input\n label=\"Password\"\n type=\"password\"\n placeholder=\"Create a password\"\n helperText=\"Must be at least 8 characters\"\n/>"
224
216
  },
225
217
  {
226
218
  "name": "Error State",
227
- "description": "Input showing validation error",
219
+ "description": "Red border, and helperText becomes the reason.",
228
220
  "code": "<Input\n label=\"Email\"\n type=\"email\"\n value=\"invalid-email\"\n error\n helperText=\"Please enter a valid email address\"\n/>"
229
221
  },
230
222
  {
231
223
  "name": "Disabled",
232
- "description": "Non-interactive input",
233
- "code": "<Input label=\"Username\" value=\"readonly-user\" disabled />"
224
+ "description": "Dimmed, unfocusable, still shows its value.",
225
+ "code": "<Input label=\"Username\" value=\"ada.lovelace\" disabled />"
234
226
  },
235
227
  {
236
228
  "name": "Required",
237
- "description": "Required field with asterisk indicator",
229
+ "description": "Asterisk marks the field as mandatory.",
238
230
  "code": "<Input\n label=\"Email\"\n type=\"email\"\n placeholder=\"user@example.com\"\n required\n/>"
239
231
  },
240
232
  {
241
233
  "name": "Sizes",
242
- "description": "Available size variants",
234
+ "description": "Three heights: sm, md, lg.",
243
235
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px', maxWidth: '300px' }}>\n <Input label=\"Small\" size=\"sm\" placeholder=\"Small input\" />\n <Input label=\"Medium\" size=\"md\" placeholder=\"Medium input\" />\n <Input label=\"Large\" size=\"lg\" placeholder=\"Large input\" />\n</div>"
244
236
  },
245
237
  {
246
238
  "name": "Bare Input (Field Composition)",
247
- "description": "Disable the built-in wrapper for custom Field composition",
239
+ "description": "Drops the built-in label wrapper so Field owns the layout.",
248
240
  "code": "<Input\n withFieldWrapper={false}\n aria-label=\"Search\"\n placeholder=\"Search...\"\n rootProps={{ 'data-demo': 'bare-input-wrapper' }}\n/>"
249
241
  },
250
- {
251
- "name": "Shortcut Focus Hotkey",
252
- "description": "Display shortcut hint and opt into focus behavior",
253
- "code": "<Input\n label=\"Command Palette\"\n placeholder=\"Search commands\"\n shortcut=\"⌘K\"\n shortcutBehavior=\"focus-input\"\n/>"
254
- },
255
242
  {
256
243
  "name": "Search With Shortcut",
257
- "description": "Search input with a leading icon and embedded kbd hint",
244
+ "description": "Leading icon and a ⌘K hint that focuses the field.",
258
245
  "code": "<Input\n aria-label=\"Search findings\"\n placeholder=\"Search findings...\"\n shortcut=\"⌘K\"\n shortcutBehavior=\"focus-input\"\n startAdornment={<MagnifyingGlass aria-hidden=\"true\" />}\n withFieldWrapper={false}\n/>"
259
246
  },
260
- {
261
- "name": "Success State",
262
- "description": "Input showing validated/success styling",
263
- "code": "<Input\n label=\"Email\"\n type=\"email\"\n value=\"user@example.com\"\n success\n helperText=\"Email verified\"\n/>"
264
- },
265
247
  {
266
248
  "name": "With Start Adornment",
267
- "description": "Input with icon or prefix before the text",
249
+ "description": "Prefix sits inside the field, before the text.",
268
250
  "code": "<Input\n label=\"Price\"\n placeholder=\"0.00\"\n startAdornment={<span>$</span>}\n/>"
269
251
  },
270
252
  {
271
253
  "name": "With End Adornment",
272
- "description": "Input with icon or suffix after the text",
254
+ "description": "Suffix sits inside the field, after the text.",
273
255
  "code": "<Input\n label=\"Weight\"\n placeholder=\"0\"\n endAdornment={<span>kg</span>}\n/>"
274
256
  }
275
257
  ],
@@ -299,7 +281,6 @@
299
281
  "disabled: boolean - disables interaction",
300
282
  "required: boolean - required field indicator",
301
283
  "error: boolean - shows error styling",
302
- "success: boolean - shows success/validated styling",
303
284
  "startAdornment: ReactNode - content before the input (icon or prefix)",
304
285
  "endAdornment: ReactNode - content after the input (icon or suffix)",
305
286
  "shortcut: string - visual kbd hint inside the input; do not hand-roll extra kbd markup",
@@ -40,6 +40,8 @@
40
40
  &:focus-visible {
41
41
  @include field.focus-state;
42
42
  }
43
+
44
+ @include high-contrast-outline;
43
45
  }
44
46
 
45
47
  // Size variants — shared control-size + field-padding path
@@ -63,18 +65,7 @@
63
65
  @include field.invalid-state;
64
66
 
65
67
  &:focus-visible {
66
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
67
- @include focus-ring-error;
68
- }
69
- }
70
-
71
- // Success state — green border for validated fields (DoorDash/Stocksy pattern)
72
- .success {
73
- border-color: var(--fui-color-success-text, $fui-color-success-text);
74
-
75
- &:focus-visible {
76
- border-color: var(--fui-color-success-text, $fui-color-success-text);
77
- @include focus-ring-success;
68
+ @include field.invalid-focus-state;
78
69
  }
79
70
  }
80
71
 
@@ -83,12 +74,6 @@
83
74
  color: var(--fui-color-danger-text, $fui-color-danger-text);
84
75
  }
85
76
 
86
- // Auto-detect success state via :has() — applies success color to helper
87
- .wrapper[data-success] .helper,
88
- .helperSuccess {
89
- color: var(--fui-color-success-text, $fui-color-success-text);
90
- }
91
-
92
77
  // ============================================
93
78
  // Input with adornments or shortcut indicator
94
79
  // ============================================
@@ -149,18 +134,7 @@
149
134
  @include field.invalid-state;
150
135
 
151
136
  &:focus-within {
152
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
153
- @include focus-ring-error;
154
- }
155
- }
156
-
157
- // Success state on adornment container
158
- &:has(.success) {
159
- border-color: var(--fui-color-success-text, $fui-color-success-text);
160
-
161
- &:focus-within {
162
- border-color: var(--fui-color-success-text, $fui-color-success-text);
163
- @include focus-ring-success;
137
+ @include field.invalid-focus-state;
164
138
  }
165
139
  }
166
140
  }
@@ -200,7 +174,8 @@
200
174
  font-variant-numeric: tabular-nums;
201
175
  color: var(--fui-kbd-color, var(--fui-text-tertiary, #{$fui-text-tertiary}));
202
176
  background: var(--fui-kbd-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
203
- border: var(--fui-stroke-hairline, 1px) solid var(--fui-kbd-border, var(--fui-border, #{$fui-border}));
177
+ border: var(--fui-stroke-hairline, 1px) solid
178
+ var(--fui-kbd-border, var(--fui-border, #{$fui-border}));
204
179
  border-radius: var(--fui-kbd-radius, var(--fui-radius-sm, #{$fui-radius-sm}));
205
180
  box-shadow: var(--fui-kbd-shadow, none);
206
181
  pointer-events: none;
@@ -208,30 +183,6 @@
208
183
  user-select: none;
209
184
  }
210
185
 
211
- // ============================================
212
- // Accessibility: High Contrast Mode
213
- // ============================================
214
-
215
- @media (prefers-contrast: more) {
216
- .input {
217
- border-width: 2px;
218
- border-color: var(--fui-text-primary, $fui-text-primary);
219
-
220
- &:focus-visible {
221
- border-color: var(--fui-color-accent, $fui-color-accent);
222
- }
223
- }
224
-
225
- .error,
226
- .input[aria-invalid] {
227
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
228
- }
229
-
230
- .success {
231
- border-color: var(--fui-color-success-text, $fui-color-success-text);
232
- }
233
- }
234
-
235
186
  // ============================================
236
187
  // Accessibility: Reduced Motion
237
188
  // ============================================
@@ -30,8 +30,6 @@ export interface InputProps extends Omit<
30
30
  disabled?: boolean;
31
31
  /** Show error styling */
32
32
  error?: boolean;
33
- /** Show success styling */
34
- success?: boolean;
35
33
  /** Visible label text */
36
34
  label?: string;
37
35
  /** Whether the field is required */
@@ -105,7 +103,6 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
105
103
  size: sizeProp,
106
104
  disabled = false,
107
105
  error = false,
108
- success = false,
109
106
  required = false,
110
107
  label,
111
108
  helperText,
@@ -174,23 +171,11 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
174
171
 
175
172
  const hasAdornment = !!(startAdornment || endAdornment);
176
173
 
177
- const inputClasses = [
178
- styles.input,
179
- styles[size],
180
- error && styles.error,
181
- success && styles.success,
182
- inputClassName,
183
- ]
174
+ const inputClasses = [styles.input, styles[size], error && styles.error, inputClassName]
184
175
  .filter(Boolean)
185
176
  .join(" ");
186
177
 
187
- const helperClasses = [
188
- styles.helper,
189
- error && styles.helperError,
190
- success && styles.helperSuccess,
191
- ]
192
- .filter(Boolean)
193
- .join(" ");
178
+ const helperClasses = [styles.helper, error && styles.helperError].filter(Boolean).join(" ");
194
179
 
195
180
  const wrapperClasses = [styles.wrapper, className].filter(Boolean).join(" ");
196
181
  const labelClasses = styles.label;
@@ -275,7 +260,6 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
275
260
  {...rootProps}
276
261
  disabled={disabled}
277
262
  invalid={error}
278
- data-success={success || undefined}
279
263
  className={[wrapperClasses, rootProps?.className].filter(Boolean).join(" ")}
280
264
  style={{ ...(rootProps?.style ?? {}), ...(style ?? {}) }}
281
265
  >
@@ -1,22 +1,17 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Link",
4
- "description": "Styled anchor element for navigation. Supports internal and external links with consistent visual treatment.",
4
+ "description": "Navigates somewhere else, inline or in chrome, with real link semantics.",
5
5
  "category": "navigation",
6
- "tags": [
7
- "link",
8
- "anchor",
9
- "navigation",
10
- "href",
11
- "url"
12
- ],
6
+ "tags": ["link", "anchor", "navigation", "href", "url"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Link/index.tsx",
15
9
  "exportName": "Link",
16
10
  "propsSummary": [
17
11
  "children: node (required)",
18
- "variant: default|subtle|muted (default: default)",
19
- "underline: always|hover|none (default: hover)",
12
+ "tone: accent|neutral (default: accent)",
13
+ "color: primary|secondary|tertiary",
14
+ "underline: always|hover|none|dotted (default: hover)",
20
15
  "external: boolean (default: false)",
21
16
  "asChild: boolean (default: false)",
22
17
  "className: string",
@@ -30,27 +25,25 @@
30
25
  "description": "Link text content",
31
26
  "required": true
32
27
  },
33
- "variant": {
28
+ "tone": {
29
+ "type": "enum",
30
+ "description": "Colour. accent is the link ink; neutral reads as body text until hovered",
31
+ "default": "accent",
32
+ "required": false,
33
+ "values": ["accent", "neutral"]
34
+ },
35
+ "color": {
34
36
  "type": "enum",
35
- "description": "Visual style variant",
36
- "default": "default",
37
+ "description": "Text-hierarchy colour for a neutral link (Text color axis); tertiary is the quietest link",
37
38
  "required": false,
38
- "values": [
39
- "default",
40
- "subtle",
41
- "muted"
42
- ]
39
+ "values": ["primary", "secondary", "tertiary"]
43
40
  },
44
41
  "underline": {
45
42
  "type": "enum",
46
43
  "description": "Underline behavior",
47
44
  "default": "hover",
48
45
  "required": false,
49
- "values": [
50
- "always",
51
- "hover",
52
- "none"
53
- ]
46
+ "values": ["always", "hover", "none", "dotted"]
54
47
  },
55
48
  "external": {
56
49
  "type": "boolean",
@@ -87,56 +80,55 @@
87
80
  },
88
81
  "usage": {
89
82
  "when": [
90
- "Inline text links within paragraphs",
91
- "Navigation links in footers or sidebars",
92
- "\"Forgot password?\" or \"Sign up\" links in forms",
93
- "External links to documentation or resources"
83
+ "Inline links inside body text",
84
+ "Footer and sidebar navigation",
85
+ "\"Forgot password?\" and \"Sign up\" in forms",
86
+ "Pointing out to docs or external resources"
94
87
  ],
95
88
  "whenNot": [
96
- "Primary call-to-action (use Button instead)",
97
- "Navigation tabs (use Tabs component)",
98
- "Menu items in dropdowns (use Menu component)",
99
- "Cards that link to detail pages should still use real link semantics (Link or anchor inside Card)"
89
+ "A main call to action use Button",
90
+ "Switching views in place — use Tabs",
91
+ "Dropdown items use Menu"
100
92
  ],
101
93
  "guidelines": [
102
- "Link text should describe the destination, not \"click here\"",
103
- "Use external prop for links that open in new tabs",
104
- "Use subtle variant for secondary/contextual links",
105
- "Ensure links are distinguishable from regular text",
106
- "When using asChild, Link composes event handlers with the child instead of overwriting them"
94
+ "Name the destination; never \"click here\"",
95
+ "external sets target and rel add your own \"opens in a new tab\" cue",
96
+ "tone=\"neutral\" for secondary links; add color=\"tertiary\" for metadata and footers",
97
+ "Links must stay distinguishable from surrounding text",
98
+ "asChild composes handlers with the child rather than replacing them"
107
99
  ],
108
100
  "accessibility": [
109
- "Link text must be descriptive of the destination",
110
- "External links should indicate they open in new window",
111
- "Links must have visible focus indicators",
112
- "Avoid using links that look like buttons without button semantics"
101
+ "The link text alone should make sense out of context",
102
+ "Say when a link opens a new window",
103
+ "Focus ring must stay visible",
104
+ "A link that looks like a button still needs link semantics"
113
105
  ]
114
106
  },
115
107
  "examples": [
116
108
  {
117
109
  "name": "Default",
118
- "description": "Standard link with hover underline",
110
+ "description": "Accent text that underlines on hover.",
119
111
  "code": "<Link href=\"#\">Learn more about our services</Link>"
120
112
  },
121
113
  {
122
- "name": "Variants",
123
- "description": "Visual style options",
124
- "code": "<div style={{ display: 'flex', gap: '16px', alignItems: 'center' }}>\n <Link href=\"#\" variant=\"default\">Default</Link>\n <Link href=\"#\" variant=\"subtle\">Subtle</Link>\n <Link href=\"#\" variant=\"muted\">Muted</Link>\n</div>"
114
+ "name": "Tones",
115
+ "description": "Accent, then neutral, then the quietest neutral.",
116
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"md\" align=\"center\" wrap>\n <Link href=\"#\" tone=\"accent\">Accent</Link>\n <Link href=\"#\" tone=\"neutral\">Neutral</Link>\n <Link href=\"#\" tone=\"neutral\" color=\"tertiary\">Tertiary</Link>\n</Stack>"
125
117
  },
126
118
  {
127
119
  "name": "Underline Styles",
128
- "description": "Different underline behaviors",
129
- "code": "<div style={{ display: 'flex', gap: '16px', alignItems: 'center' }}>\n <Link href=\"#\" underline=\"always\">Always underlined</Link>\n <Link href=\"#\" underline=\"hover\">Underline on hover</Link>\n <Link href=\"#\" underline=\"none\">No underline</Link>\n</div>"
120
+ "description": "Four rules for when the line shows.",
121
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"md\" align=\"center\" wrap>\n <Link href=\"#\" underline=\"always\">Always underlined</Link>\n <Link href=\"#\" underline=\"hover\">Underline on hover</Link>\n <Link href=\"#\" underline=\"dotted\">Dotted underline</Link>\n <Link href=\"#\" underline=\"none\">No underline</Link>\n</Stack>"
130
122
  },
131
123
  {
132
124
  "name": "External Link",
133
- "description": "Link that opens in new tab",
125
+ "description": "Sets target and rel; you still supply the visible cue.",
134
126
  "code": "<Link href=\"https://example.com\" external>\n View documentation ↗\n</Link>"
135
127
  },
136
128
  {
137
129
  "name": "As Child (Polymorphic)",
138
- "description": "Renders as a custom element while applying Link styles and composing handlers. Useful with Next.js Link for client-side navigation.",
139
- "code": "<Link asChild variant=\"subtle\" onClick={() => {}}>\n <button type=\"button\" onClick={() => alert('Navigated!')}>\n Polymorphic link as button\n </button>\n</Link>"
130
+ "description": "Paints Link styling onto a router link and keeps both click handlers.",
131
+ "code": "<Link asChild tone=\"neutral\" onClick={() => {}}>\n <a href=\"#pricing\" onClick={() => {}}>\n Client-side navigation\n </a>\n</Link>"
140
132
  }
141
133
  ],
142
134
  "relations": [
@@ -155,21 +147,17 @@
155
147
  "propsSummary": [
156
148
  "children: ReactNode - link text (required)",
157
149
  "href: string - destination URL",
158
- "variant: default|subtle|muted - visual style",
159
- "underline: always|hover|none - underline behavior",
150
+ "tone: accent|neutral - colour",
151
+ "color: primary|secondary|tertiary - hierarchy colour on a neutral link",
152
+ "underline: always|hover|none|dotted - underline behavior",
160
153
  "external: boolean - opens in new tab",
161
154
  "asChild: boolean - polymorphic child rendering with merged styles and composed event handlers"
162
155
  ],
163
- "a11yRules": [
164
- "A11Y_LINK_TEXT",
165
- "A11Y_LINK_FOCUS"
166
- ]
156
+ "a11yRules": ["A11Y_LINK_TEXT", "A11Y_LINK_FOCUS"]
167
157
  },
168
158
  "ai": {
169
159
  "compositionPattern": "compound",
170
- "subComponents": [
171
- "Root"
172
- ]
160
+ "subComponents": ["Root"]
173
161
  },
174
162
  "provenance": {
175
163
  "source": "migrated",