@usefragments/ui 1.6.0 → 1.7.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 (457) hide show
  1. package/README.md +4 -4
  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/ui.css +4720 -4159
  6. package/dist/chart.cjs +24 -6
  7. package/dist/chart.js +24 -6
  8. package/dist/codeblock.cjs +55 -29
  9. package/dist/codeblock.js +55 -29
  10. package/dist/colorpicker.cjs +3 -1
  11. package/dist/colorpicker.js +3 -1
  12. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  13. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  14. package/dist/components/Alert/Alert.module.scss.cjs +15 -12
  15. package/dist/components/Alert/Alert.module.scss.js +15 -12
  16. package/dist/components/Alert/index.cjs +7 -1
  17. package/dist/components/Alert/index.d.ts +12 -6
  18. package/dist/components/Alert/index.d.ts.map +1 -1
  19. package/dist/components/Alert/index.js +7 -1
  20. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  21. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  22. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  23. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  24. package/dist/components/Badge/Badge.module.scss.cjs +19 -19
  25. package/dist/components/Badge/Badge.module.scss.js +19 -19
  26. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  27. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  28. package/dist/components/Box/Box.module.scss.cjs +152 -152
  29. package/dist/components/Box/Box.module.scss.js +152 -152
  30. package/dist/components/Box/index.cjs +64 -75
  31. package/dist/components/Box/index.d.ts +16 -16
  32. package/dist/components/Box/index.d.ts.map +1 -1
  33. package/dist/components/Box/index.js +64 -75
  34. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
  35. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
  36. package/dist/components/Button/Button.module.scss.cjs +14 -14
  37. package/dist/components/Button/Button.module.scss.js +14 -14
  38. package/dist/components/Card/Card.module.scss.cjs +29 -17
  39. package/dist/components/Card/Card.module.scss.js +30 -18
  40. package/dist/components/Card/index.cjs +8 -0
  41. package/dist/components/Card/index.d.ts +12 -2
  42. package/dist/components/Card/index.d.ts.map +1 -1
  43. package/dist/components/Card/index.js +8 -0
  44. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  45. package/dist/components/Chart/Chart.module.scss.js +15 -15
  46. package/dist/components/Chart/index.d.ts.map +1 -1
  47. package/dist/components/Checkbox/Checkbox.module.scss.cjs +9 -9
  48. package/dist/components/Checkbox/Checkbox.module.scss.js +9 -9
  49. package/dist/components/Checkbox/index.cjs +2 -2
  50. package/dist/components/Checkbox/index.d.ts.map +1 -1
  51. package/dist/components/Checkbox/index.js +2 -2
  52. package/dist/components/Chip/Chip.module.scss.cjs +15 -15
  53. package/dist/components/Chip/Chip.module.scss.js +15 -15
  54. package/dist/components/Chip/index.cjs +2 -1
  55. package/dist/components/Chip/index.d.ts.map +1 -1
  56. package/dist/components/Chip/index.js +2 -1
  57. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
  58. package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
  59. package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
  60. package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
  61. package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
  62. package/dist/components/CodeBlock/css-variables-theme.js +98 -0
  63. package/dist/components/CodeBlock/index.d.ts +17 -3
  64. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  65. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  66. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  67. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  68. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  69. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  70. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  71. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  72. package/dist/components/Combobox/index.cjs +17 -1
  73. package/dist/components/Combobox/index.d.ts.map +1 -1
  74. package/dist/components/Combobox/index.js +17 -1
  75. package/dist/components/Command/Command.module.scss.cjs +11 -11
  76. package/dist/components/Command/Command.module.scss.js +11 -11
  77. package/dist/components/Command/index.cjs +26 -15
  78. package/dist/components/Command/index.d.ts +2 -2
  79. package/dist/components/Command/index.d.ts.map +1 -1
  80. package/dist/components/Command/index.js +26 -15
  81. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  82. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  83. package/dist/components/DataTable/DataTable.icons.cjs +6 -33
  84. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
  85. package/dist/components/DataTable/DataTable.icons.js +6 -33
  86. package/dist/components/DataTable/DataTable.module.scss.cjs +27 -27
  87. package/dist/components/DataTable/DataTable.module.scss.js +27 -27
  88. package/dist/components/DataTable/index.d.ts.map +1 -1
  89. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  90. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  91. package/dist/components/DatePicker/index.d.ts.map +1 -1
  92. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  93. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  94. package/dist/components/Dialog/index.cjs +11 -14
  95. package/dist/components/Dialog/index.d.ts +7 -7
  96. package/dist/components/Dialog/index.d.ts.map +1 -1
  97. package/dist/components/Dialog/index.js +11 -14
  98. package/dist/components/Drawer/Drawer.module.scss.cjs +29 -29
  99. package/dist/components/Drawer/Drawer.module.scss.js +29 -29
  100. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  101. package/dist/components/Editor/Editor.module.scss.js +17 -17
  102. package/dist/components/Editor/index.d.ts +10 -10
  103. package/dist/components/Editor/index.d.ts.map +1 -1
  104. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
  105. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
  106. package/dist/components/EmptyState/index.cjs +8 -6
  107. package/dist/components/EmptyState/index.d.ts +9 -4
  108. package/dist/components/EmptyState/index.d.ts.map +1 -1
  109. package/dist/components/EmptyState/index.js +8 -6
  110. package/dist/components/Field/Field.module.scss.cjs +5 -5
  111. package/dist/components/Field/Field.module.scss.js +5 -5
  112. package/dist/components/Field/index.cjs +9 -1
  113. package/dist/components/Field/index.d.ts.map +1 -1
  114. package/dist/components/Field/index.js +9 -1
  115. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  116. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  117. package/dist/components/Grid/index.cjs +1 -1
  118. package/dist/components/Grid/index.js +1 -1
  119. package/dist/components/Header/Header.module.scss.cjs +33 -33
  120. package/dist/components/Header/Header.module.scss.js +33 -33
  121. package/dist/components/Header/index.cjs +17 -38
  122. package/dist/components/Header/index.d.ts +15 -11
  123. package/dist/components/Header/index.d.ts.map +1 -1
  124. package/dist/components/Header/index.js +17 -38
  125. package/dist/components/Icon/Icon.module.scss.cjs +15 -15
  126. package/dist/components/Icon/Icon.module.scss.js +15 -15
  127. package/dist/components/IconButton/IconButton.module.scss.cjs +8 -8
  128. package/dist/components/IconButton/IconButton.module.scss.js +8 -8
  129. package/dist/components/IconButton/index.cjs +2 -1
  130. package/dist/components/IconButton/index.d.ts.map +1 -1
  131. package/dist/components/IconButton/index.js +2 -1
  132. package/dist/components/Image/Image.module.scss.cjs +27 -27
  133. package/dist/components/Image/Image.module.scss.js +27 -27
  134. package/dist/components/Input/Input.module.scss.cjs +17 -17
  135. package/dist/components/Input/Input.module.scss.js +17 -17
  136. package/dist/components/Link/Link.module.scss.cjs +14 -10
  137. package/dist/components/Link/Link.module.scss.js +14 -10
  138. package/dist/components/Link/index.d.ts +1 -1
  139. package/dist/components/Link/index.d.ts.map +1 -1
  140. package/dist/components/List/List.module.scss.cjs +19 -19
  141. package/dist/components/List/List.module.scss.js +19 -19
  142. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  143. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  144. package/dist/components/Loading/Loading.module.scss.cjs +34 -34
  145. package/dist/components/Loading/Loading.module.scss.js +34 -34
  146. package/dist/components/Loading/index.cjs +1 -1
  147. package/dist/components/Loading/index.js +1 -1
  148. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  149. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  150. package/dist/components/Markdown/index.d.ts +2 -2
  151. package/dist/components/Markdown/index.d.ts.map +1 -1
  152. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  153. package/dist/components/Menu/Menu.module.scss.js +14 -14
  154. package/dist/components/Message/Message.module.scss.cjs +18 -18
  155. package/dist/components/Message/Message.module.scss.js +18 -18
  156. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
  157. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
  158. package/dist/components/NavigationMenu/index.cjs +32 -15
  159. package/dist/components/NavigationMenu/index.d.ts +12 -6
  160. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  161. package/dist/components/NavigationMenu/index.js +32 -15
  162. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  163. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  164. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  165. package/dist/components/Popover/Popover.module.scss.js +10 -10
  166. package/dist/components/Progress/Progress.module.scss.cjs +25 -25
  167. package/dist/components/Progress/Progress.module.scss.js +25 -25
  168. package/dist/components/Prompt/Prompt.module.scss.cjs +28 -28
  169. package/dist/components/Prompt/Prompt.module.scss.js +28 -28
  170. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +15 -15
  171. package/dist/components/RadioGroup/RadioGroup.module.scss.js +15 -15
  172. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  173. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  174. package/dist/components/ScrollArea/index.d.ts +4 -4
  175. package/dist/components/ScrollArea/index.d.ts.map +1 -1
  176. package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
  177. package/dist/components/Select/Select.module.scss.cjs +21 -21
  178. package/dist/components/Select/Select.module.scss.js +21 -21
  179. package/dist/components/Separator/Separator.module.scss.cjs +11 -11
  180. package/dist/components/Separator/Separator.module.scss.js +11 -11
  181. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  182. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  183. package/dist/components/Sidebar/index.cjs +12 -35
  184. package/dist/components/Sidebar/index.d.ts +19 -19
  185. package/dist/components/Sidebar/index.d.ts.map +1 -1
  186. package/dist/components/Sidebar/index.js +12 -35
  187. package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
  188. package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
  189. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  190. package/dist/components/Slider/Slider.module.scss.js +12 -12
  191. package/dist/components/Stack/Stack.module.scss.cjs +25 -25
  192. package/dist/components/Stack/Stack.module.scss.js +25 -25
  193. package/dist/components/Stack/index.cjs +1 -1
  194. package/dist/components/Stack/index.js +1 -1
  195. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  196. package/dist/components/Switch/Switch.module.scss.js +9 -9
  197. package/dist/components/Table/Table.module.scss.cjs +19 -19
  198. package/dist/components/Table/Table.module.scss.js +19 -19
  199. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  200. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  201. package/dist/components/TableOfContents/index.cjs +13 -9
  202. package/dist/components/TableOfContents/index.d.ts +5 -3
  203. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  204. package/dist/components/TableOfContents/index.js +13 -9
  205. package/dist/components/Tabs/Tabs.module.scss.cjs +12 -12
  206. package/dist/components/Tabs/Tabs.module.scss.js +12 -12
  207. package/dist/components/Tabs/index.cjs +26 -6
  208. package/dist/components/Tabs/index.d.ts.map +1 -1
  209. package/dist/components/Tabs/index.js +26 -6
  210. package/dist/components/Text/Text.module.scss.cjs +87 -75
  211. package/dist/components/Text/Text.module.scss.js +87 -75
  212. package/dist/components/Text/index.cjs +49 -41
  213. package/dist/components/Text/index.d.ts +12 -11
  214. package/dist/components/Text/index.d.ts.map +1 -1
  215. package/dist/components/Text/index.js +49 -41
  216. package/dist/components/Textarea/Textarea.module.scss.cjs +24 -24
  217. package/dist/components/Textarea/Textarea.module.scss.js +24 -24
  218. package/dist/components/Theme/index.cjs +2 -1
  219. package/dist/components/Theme/index.d.ts.map +1 -1
  220. package/dist/components/Theme/index.js +2 -1
  221. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +9 -6
  222. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +9 -6
  223. package/dist/components/ThemeToggle/index.cjs +31 -6
  224. package/dist/components/ThemeToggle/index.d.ts +7 -2
  225. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  226. package/dist/components/ThemeToggle/index.js +32 -7
  227. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +13 -13
  228. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +13 -13
  229. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  230. package/dist/components/Toast/Toast.module.scss.js +20 -20
  231. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  232. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  233. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  234. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  235. package/dist/components/Tooltip/index.cjs +24 -40
  236. package/dist/components/Tooltip/index.d.ts +4 -4
  237. package/dist/components/Tooltip/index.d.ts.map +1 -1
  238. package/dist/components/Tooltip/index.js +24 -40
  239. package/dist/components/VisuallyHidden/index.d.ts +2 -2
  240. package/dist/data-table.cjs +2 -1
  241. package/dist/data-table.js +2 -1
  242. package/dist/datepicker.cjs +3 -2
  243. package/dist/datepicker.js +3 -2
  244. package/dist/editor.cjs +68 -28
  245. package/dist/editor.js +68 -28
  246. package/dist/index.cjs +1 -1
  247. package/dist/index.d.ts +1 -1
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +2 -2
  250. package/dist/markdown.cjs +21 -29
  251. package/dist/markdown.js +21 -29
  252. package/dist/measurements/generated.cjs +9 -1
  253. package/dist/measurements/generated.d.ts +7 -0
  254. package/dist/measurements/generated.d.ts.map +1 -1
  255. package/dist/measurements/generated.js +9 -1
  256. package/dist/utils/a11y.cjs +5 -2
  257. package/dist/utils/a11y.d.ts +5 -5
  258. package/dist/utils/a11y.d.ts.map +1 -1
  259. package/dist/utils/a11y.js +5 -2
  260. package/dist/utils/canonical-stamp.cjs +2 -8
  261. package/dist/utils/canonical-stamp.d.ts.map +1 -1
  262. package/dist/utils/canonical-stamp.js +1 -7
  263. package/dist/utils/css-warning.cjs +1 -1
  264. package/dist/utils/css-warning.js +1 -1
  265. package/dist/utils/env.cjs +17 -0
  266. package/dist/utils/env.d.ts +3 -0
  267. package/dist/utils/env.d.ts.map +1 -0
  268. package/dist/utils/env.js +17 -0
  269. package/dist/utils/keyboard-shortcuts.cjs +3 -10
  270. package/dist/utils/keyboard-shortcuts.d.ts +4 -4
  271. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
  272. package/dist/utils/keyboard-shortcuts.js +3 -10
  273. package/dist/utils/seed-derivation.cjs +10 -6
  274. package/dist/utils/seed-derivation.d.ts.map +1 -1
  275. package/dist/utils/seed-derivation.js +10 -6
  276. package/fragments.json +1 -1
  277. package/package.json +6 -4
  278. package/src/assets/fragments-logo.tsx +2 -2
  279. package/src/assets/fragments-wordmark.tsx +4 -2
  280. package/src/components/Accordion/Accordion.contract.json +24 -48
  281. package/src/components/Alert/Alert.contract.json +37 -53
  282. package/src/components/Alert/Alert.module.scss +24 -0
  283. package/src/components/Alert/index.tsx +55 -29
  284. package/src/components/AppShell/AppShell.contract.json +34 -51
  285. package/src/components/AppShell/AppShell.module.scss +53 -40
  286. package/src/components/Avatar/Avatar.contract.json +31 -48
  287. package/src/components/Avatar/Avatar.module.scss +4 -1
  288. package/src/components/Badge/Badge.contract.json +37 -42
  289. package/src/components/Badge/Badge.module.scss +9 -2
  290. package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
  291. package/src/components/Box/Box.contract.json +40 -148
  292. package/src/components/Box/index.tsx +92 -99
  293. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
  294. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +12 -7
  295. package/src/components/Button/Button.module.scss +8 -7
  296. package/src/components/ButtonGroup/ButtonGroup.contract.json +32 -47
  297. package/src/components/Card/Card.module.scss +82 -1
  298. package/src/components/Card/index.tsx +21 -2
  299. package/src/components/Chart/Chart.contract.json +21 -29
  300. package/src/components/Chart/index.tsx +36 -6
  301. package/src/components/Checkbox/Checkbox.contract.json +24 -24
  302. package/src/components/Checkbox/Checkbox.module.scss +32 -23
  303. package/src/components/Checkbox/index.tsx +4 -2
  304. package/src/components/Chip/Chip.contract.json +33 -40
  305. package/src/components/Chip/Chip.module.scss +2 -2
  306. package/src/components/Chip/index.tsx +2 -1
  307. package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
  308. package/src/components/CodeBlock/CodeBlock.module.scss +40 -15
  309. package/src/components/CodeBlock/css-variables-theme.ts +102 -0
  310. package/src/components/CodeBlock/index.tsx +91 -35
  311. package/src/components/Collapsible/Collapsible.contract.json +21 -36
  312. package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
  313. package/src/components/ColorPicker/ColorPicker.module.scss +15 -12
  314. package/src/components/ColorPicker/index.tsx +5 -1
  315. package/src/components/Combobox/Combobox.contract.json +36 -37
  316. package/src/components/Combobox/Combobox.module.scss +1 -1
  317. package/src/components/Combobox/index.tsx +31 -5
  318. package/src/components/Command/Command.contract.json +21 -43
  319. package/src/components/Command/index.tsx +58 -47
  320. package/src/components/ConversationList/ConversationList.contract.json +27 -32
  321. package/src/components/DataTable/DataTable.icons.tsx +4 -21
  322. package/src/components/DataTable/DataTable.module.scss +12 -8
  323. package/src/components/DataTable/index.tsx +8 -7
  324. package/src/components/DatePicker/DatePicker.contract.json +27 -28
  325. package/src/components/DatePicker/DatePicker.module.scss +12 -5
  326. package/src/components/DatePicker/index.tsx +5 -2
  327. package/src/components/Dialog/Dialog.module.scss +3 -3
  328. package/src/components/Dialog/index.tsx +47 -37
  329. package/src/components/Drawer/Drawer.contract.json +22 -36
  330. package/src/components/Editor/Editor.contract.json +31 -48
  331. package/src/components/Editor/Editor.module.scss +36 -14
  332. package/src/components/Editor/index.tsx +240 -179
  333. package/src/components/EmptyState/EmptyState.contract.json +31 -43
  334. package/src/components/EmptyState/EmptyState.module.scss +8 -0
  335. package/src/components/EmptyState/index.tsx +48 -23
  336. package/src/components/Field/Field.contract.json +28 -46
  337. package/src/components/Field/index.tsx +5 -1
  338. package/src/components/Fieldset/Fieldset.contract.json +21 -38
  339. package/src/components/Fieldset/Fieldset.module.scss +10 -3
  340. package/src/components/Form/Form.contract.json +20 -20
  341. package/src/components/Grid/Grid.contract.json +28 -64
  342. package/src/components/Grid/index.tsx +10 -10
  343. package/src/components/Header/Header.contract.json +31 -67
  344. package/src/components/Header/Header.module.scss +36 -21
  345. package/src/components/Header/index.tsx +134 -122
  346. package/src/components/Icon/Icon.contract.json +22 -62
  347. package/src/components/IconButton/IconButton.contract.json +34 -18
  348. package/src/components/IconButton/IconButton.module.scss +6 -7
  349. package/src/components/IconButton/index.tsx +2 -1
  350. package/src/components/Image/Image.contract.json +23 -56
  351. package/src/components/Input/Input.contract.json +26 -32
  352. package/src/components/Input/Input.module.scss +3 -2
  353. package/src/components/Link/Link.contract.json +32 -52
  354. package/src/components/Link/Link.module.scss +23 -6
  355. package/src/components/Link/index.tsx +1 -1
  356. package/src/components/List/List.contract.json +23 -52
  357. package/src/components/List/List.module.scss +1 -1
  358. package/src/components/Listbox/Listbox.contract.json +21 -37
  359. package/src/components/Loading/Loading.contract.json +37 -61
  360. package/src/components/Loading/Loading.module.scss +10 -7
  361. package/src/components/Loading/index.tsx +2 -2
  362. package/src/components/Main/Main.contract.json +17 -9
  363. package/src/components/Markdown/Markdown.contract.json +22 -43
  364. package/src/components/Markdown/Markdown.module.scss +43 -5
  365. package/src/components/Markdown/index.tsx +48 -49
  366. package/src/components/Menu/Menu.contract.json +25 -41
  367. package/src/components/Menu/Menu.module.scss +23 -8
  368. package/src/components/Message/Message.contract.json +29 -52
  369. package/src/components/Message/Message.module.scss +12 -5
  370. package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
  371. package/src/components/NavigationMenu/NavigationMenu.module.scss +64 -19
  372. package/src/components/NavigationMenu/index.tsx +105 -81
  373. package/src/components/Pagination/Pagination.contract.json +22 -40
  374. package/src/components/Pagination/Pagination.module.scss +2 -2
  375. package/src/components/Popover/Popover.contract.json +24 -46
  376. package/src/components/Popover/Popover.module.scss +6 -5
  377. package/src/components/Progress/Progress.contract.json +32 -28
  378. package/src/components/Progress/Progress.module.scss +3 -2
  379. package/src/components/Prompt/Prompt.contract.json +31 -47
  380. package/src/components/Prompt/Prompt.module.scss +13 -5
  381. package/src/components/RadioGroup/RadioGroup.contract.json +23 -24
  382. package/src/components/RadioGroup/RadioGroup.module.scss +13 -14
  383. package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
  384. package/src/components/ScrollArea/ScrollArea.module.scss +15 -15
  385. package/src/components/ScrollArea/index.tsx +16 -16
  386. package/src/components/ScrollArea/scroll-state.ts +24 -24
  387. package/src/components/Select/Select.module.scss +2 -2
  388. package/src/components/Separator/Separator.contract.json +24 -48
  389. package/src/components/Sidebar/Sidebar.contract.json +35 -67
  390. package/src/components/Sidebar/Sidebar.module.scss +22 -13
  391. package/src/components/Sidebar/index.tsx +164 -164
  392. package/src/components/Skeleton/Skeleton.contract.json +28 -54
  393. package/src/components/Skeleton/Skeleton.module.scss +27 -10
  394. package/src/components/Slider/Slider.contract.json +27 -39
  395. package/src/components/Slider/Slider.module.scss +3 -3
  396. package/src/components/Stack/Stack.contract.json +29 -56
  397. package/src/components/Stack/Stack.module.scss +13 -12
  398. package/src/components/Stack/index.tsx +3 -3
  399. package/src/components/Switch/Switch.contract.json +33 -46
  400. package/src/components/Switch/Switch.module.scss +64 -26
  401. package/src/components/Table/Table.contract.json +28 -46
  402. package/src/components/Table/Table.module.scss +15 -3
  403. package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
  404. package/src/components/TableOfContents/TableOfContents.module.scss +15 -5
  405. package/src/components/TableOfContents/index.tsx +26 -9
  406. package/src/components/Tabs/Tabs.contract.json +24 -45
  407. package/src/components/Tabs/Tabs.module.scss +1 -1
  408. package/src/components/Tabs/index.tsx +15 -3
  409. package/src/components/Text/Text.contract.json +30 -72
  410. package/src/components/Text/Text.module.scss +21 -4
  411. package/src/components/Text/index.tsx +113 -75
  412. package/src/components/Textarea/Textarea.contract.json +25 -43
  413. package/src/components/Textarea/Textarea.module.scss +2 -4
  414. package/src/components/Theme/Theme.contract.json +32 -51
  415. package/src/components/Theme/index.tsx +2 -1
  416. package/src/components/ThemeToggle/ThemeToggle.module.scss +23 -7
  417. package/src/components/ThemeToggle/index.tsx +43 -7
  418. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +23 -40
  419. package/src/components/Toast/Toast.contract.json +30 -40
  420. package/src/components/Toast/Toast.module.scss +1 -1
  421. package/src/components/ToggleGroup/ToggleGroup.contract.json +29 -30
  422. package/src/components/ToggleGroup/ToggleGroup.module.scss +38 -5
  423. package/src/components/Tooltip/Tooltip.contract.json +31 -52
  424. package/src/components/Tooltip/index.tsx +19 -24
  425. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
  426. package/src/components/VisuallyHidden/index.tsx +5 -5
  427. package/src/index.ts +2 -2
  428. package/src/measurements/generated.ts +9 -2
  429. package/src/measurements/measurements.json +7 -0
  430. package/src/recipes/_boolean-range.scss +3 -11
  431. package/src/recipes/_field.scss +5 -1
  432. package/src/recipes/_layout.scss +14 -7
  433. package/src/recipes/_popup.scss +12 -2
  434. package/src/recipes/_prose.scss +13 -5
  435. package/src/recipes/_table-chrome.scss +16 -2
  436. package/src/scss.d.ts +1 -1
  437. package/src/styles/globals.scss +20 -19
  438. package/src/tokens/_computed.scss +5 -16
  439. package/src/tokens/_derive.scss +112 -210
  440. package/src/tokens/_measurements.catalog.generated.css +6 -1
  441. package/src/tokens/_measurements.generated.scss +14 -1
  442. package/src/tokens/_mixins.scss +7 -8
  443. package/src/tokens/_palettes.scss +39 -167
  444. package/src/tokens/_seeds.scss +20 -20
  445. package/src/tokens/_variables.scss +183 -38
  446. package/src/utils/a11y.tsx +69 -69
  447. package/src/utils/aria.ts +3 -3
  448. package/src/utils/canonical-stamp.ts +2 -12
  449. package/src/utils/css-warning.ts +7 -7
  450. package/src/utils/env.ts +25 -0
  451. package/src/utils/keyboard-shortcuts.ts +131 -126
  452. package/src/utils/seed-derivation.ts +10 -6
  453. package/src/components/Button/Button.contract.json +0 -218
  454. package/src/components/Card/Card.contract.json +0 -175
  455. package/src/components/DataTable/DataTable.contract.json +0 -302
  456. package/src/components/Dialog/Dialog.contract.json +0 -159
  457. package/src/components/Select/Select.contract.json +0 -259
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "ConversationList",
4
- "description": "Scrollable message container with auto-scroll and history loading",
4
+ "description": "Stacks chat messages in a scroller that follows new arrivals.",
5
5
  "category": "ai",
6
- "tags": [
7
- "conversation",
8
- "chat",
9
- "messages",
10
- "scroll",
11
- "ai",
12
- "list"
13
- ],
6
+ "tags": ["conversation", "chat", "messages", "scroll", "ai", "list"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/ConversationList/index.tsx",
16
9
  "exportName": "ConversationList",
@@ -73,24 +66,24 @@
73
66
  },
74
67
  "usage": {
75
68
  "when": [
76
- "Building a chat interface with multiple messages",
77
- "Need auto-scroll behavior when new messages arrive",
78
- "Require infinite scroll for loading message history",
79
- "Want date separators between message groups"
69
+ "Chat interfaces holding many messages",
70
+ "Transcripts that should follow new arrivals",
71
+ "Paging back through older message history",
72
+ "Runs of messages grouped day by day"
80
73
  ],
81
74
  "whenNot": [
82
- "Simple list of items without chat context (use List)",
83
- "Single message display (use Message directly)",
84
- "Non-scrolling message layout"
75
+ "Plain item lists with no chat context (use List)",
76
+ "A single message (use Message directly)",
77
+ "Layouts that never scroll"
85
78
  ],
86
79
  "guidelines": [
87
- "Use autoScroll=\"smart\" for best UX (only auto-scrolls when near bottom)",
88
- "Set showAvatars={false} for avatarless transcripts; messages remove their outer inline inset automatically",
89
- "Conversation chrome uses neutral surfaces and the body foreground; reserve brand accent for actions or semantic state",
90
- "Implement onScrollTop for loading older messages",
91
- "ConversationList composes your onScroll handler with internal auto-scroll/history logic",
92
- "Provide an emptyState for new conversations",
93
- "Use DateSeparator between messages from different days"
80
+ "autoScroll=\"smart\" follows only when the reader is already near the bottom",
81
+ "showAvatars={false} drops the avatar gutter and the inset that goes with it",
82
+ "Chrome stays on neutral surfaces; reserve accent for actions and semantic state",
83
+ "Implement onScrollTop to page in older messages",
84
+ "Your onScroll handler composes with the internal auto-scroll and history logic",
85
+ "Give new conversations an emptyState",
86
+ "Put a DateSeparator between messages from different days"
94
87
  ],
95
88
  "accessibility": [
96
89
  "Uses proper ARIA roles for separators",
@@ -102,28 +95,33 @@
102
95
  "examples": [
103
96
  {
104
97
  "name": "Basic",
105
- "description": "Simple conversation with messages",
98
+ "description": "Three turns stacked in reading order.",
106
99
  "code": "<ConversationList>\n <Message role=\"user\">\n <Message.Content>Hello!</Message.Content>\n </Message>\n <Message role=\"assistant\">\n <Message.Content>Hi there! How can I help you today?</Message.Content>\n </Message>\n <Message role=\"user\">\n <Message.Content>Can you explain React hooks?</Message.Content>\n </Message>\n</ConversationList>"
107
100
  },
108
101
  {
109
102
  "name": "With Date Separators",
110
- "description": "Messages grouped by date",
103
+ "description": "A labelled rule marks where one day ends.",
111
104
  "code": "<ConversationList>\n <ConversationList.DateSeparator date={new Date(Date.now() - 86400000)} />\n <Message role=\"user\">\n <Message.Content>A message from yesterday</Message.Content>\n </Message>\n <ConversationList.DateSeparator date={new Date()} />\n <Message role=\"assistant\">\n <Message.Content>And a message from today!</Message.Content>\n </Message>\n</ConversationList>"
112
105
  },
113
106
  {
114
107
  "name": "Without Avatars",
115
- "description": "Compact transcript without message or typing-indicator avatars",
108
+ "description": "Turns sit flush when nothing needs an avatar gutter.",
116
109
  "code": "<ConversationList showAvatars={false}>\n <Message role=\"user\">\n <Message.Content>Hello!</Message.Content>\n </Message>\n <Message role=\"assistant\">\n <Message.Content>How can I help?</Message.Content>\n </Message>\n</ConversationList>"
117
110
  },
118
111
  {
119
112
  "name": "With Typing Indicator",
120
- "description": "Shows assistant is typing",
113
+ "description": "Animated dots hold the reply's place before it lands.",
121
114
  "code": "<ConversationList>\n <Message role=\"user\">\n <Message.Content>What is TypeScript?</Message.Content>\n </Message>\n <ConversationList.TypingIndicator name=\"Assistant\" />\n</ConversationList>"
122
115
  },
123
116
  {
124
117
  "name": "Loading History",
125
- "description": "Loading older messages",
118
+ "description": "A spinner pins to the top while older turns load.",
126
119
  "code": "<ConversationList loadingHistory>\n <Message role=\"user\">\n <Message.Content>This is the latest message</Message.Content>\n </Message>\n</ConversationList>"
120
+ },
121
+ {
122
+ "name": "Empty",
123
+ "description": "A fresh conversation shows its placeholder instead of blank space.",
124
+ "code": "<ConversationList\n emptyState={\n <EmptyState>\n <EmptyState.Title>No messages yet</EmptyState.Title>\n <EmptyState.Description>\n Ask a question to get started.\n </EmptyState.Description>\n </EmptyState>\n }\n/>"
127
125
  }
128
126
  ],
129
127
  "relations": [
@@ -152,10 +150,7 @@
152
150
  "loadingHistory: boolean - show history loading spinner",
153
151
  "emptyState: ReactNode - empty conversation content"
154
152
  ],
155
- "a11yRules": [
156
- "A11Y_ARIA_ROLES",
157
- "A11Y_MOTION_PREFERENCE"
158
- ]
153
+ "a11yRules": ["A11Y_ARIA_ROLES", "A11Y_MOTION_PREFERENCE"]
159
154
  },
160
155
  "provenance": {
161
156
  "source": "migrated",
@@ -5,9 +5,7 @@ import styles from "./DataTable.module.scss";
5
5
  export function ExpandIcon({ expanded }: { expanded: boolean }) {
6
6
  return (
7
7
  <svg
8
- className={[styles.expandIcon, expanded && styles.expandIconOpen]
9
- .filter(Boolean)
10
- .join(" ")}
8
+ className={[styles.expandIcon, expanded && styles.expandIconOpen].filter(Boolean).join(" ")}
11
9
  viewBox="0 0 12 12"
12
10
  fill="none"
13
11
  xmlns="http://www.w3.org/2000/svg"
@@ -28,12 +26,7 @@ export function ExpandIcon({ expanded }: { expanded: boolean }) {
28
26
  // (--fui-icon-xs) in CSS so all sort glyphs share the icon ladder.
29
27
  export function SortIcon() {
30
28
  return (
31
- <svg
32
- viewBox="0 0 12 12"
33
- fill="none"
34
- xmlns="http://www.w3.org/2000/svg"
35
- aria-hidden="true"
36
- >
29
+ <svg viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
37
30
  <path d="M6 2L8.5 5H3.5L6 2Z" fill="currentColor" opacity="0.3" />
38
31
  <path d="M6 10L3.5 7H8.5L6 10Z" fill="currentColor" opacity="0.3" />
39
32
  </svg>
@@ -42,12 +35,7 @@ export function SortIcon() {
42
35
 
43
36
  export function SortAscIcon() {
44
37
  return (
45
- <svg
46
- viewBox="0 0 12 12"
47
- fill="none"
48
- xmlns="http://www.w3.org/2000/svg"
49
- aria-hidden="true"
50
- >
38
+ <svg viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
51
39
  <path d="M6 2L8.5 5H3.5L6 2Z" fill="currentColor" />
52
40
  </svg>
53
41
  );
@@ -55,12 +43,7 @@ export function SortAscIcon() {
55
43
 
56
44
  export function SortDescIcon() {
57
45
  return (
58
- <svg
59
- viewBox="0 0 12 12"
60
- fill="none"
61
- xmlns="http://www.w3.org/2000/svg"
62
- aria-hidden="true"
63
- >
46
+ <svg viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
64
47
  <path d="M6 10L3.5 7H8.5L6 10Z" fill="currentColor" />
65
48
  </svg>
66
49
  );
@@ -66,7 +66,7 @@
66
66
  .sortButton {
67
67
  display: flex;
68
68
  align-items: center;
69
- gap: var(--fui-raw-space-4);
69
+ gap: var(--fui-raw-space-4, 4px);
70
70
  }
71
71
 
72
72
  .sortButton {
@@ -176,8 +176,11 @@
176
176
  }
177
177
 
178
178
  .bordered {
179
- overflow: hidden;
180
- border: var(--fui-table-divider-size, var(--fui-stroke-hairline)) solid
179
+ /* Keep the rounded corners clipping the table, but never trap the
180
+ horizontal scroll the wrapper needs for wide tables. */
181
+ overflow-x: auto;
182
+ overflow-y: hidden;
183
+ border: var(--fui-table-divider-size, var(--fui-stroke-hairline, $fui-stroke-hairline)) solid
181
184
  var(--fui-table-border, var(--fui-border, #{$fui-border}));
182
185
  border-radius: var(--fui-radius-md, $fui-radius-md);
183
186
  background: var(--fui-data-table-bg, var(--fui-bg-primary, #{$fui-bg-primary}));
@@ -215,7 +218,7 @@
215
218
 
216
219
  .skeletonBar {
217
220
  display: block;
218
- block-size: var(--fui-raw-space-10);
221
+ block-size: var(--fui-raw-space-10, 10px);
219
222
  border-radius: var(--fui-radius-sm, $fui-radius-sm);
220
223
  background: linear-gradient(
221
224
  90deg,
@@ -224,7 +227,8 @@
224
227
  color-mix(in srgb, currentColor 8%, transparent) 75%
225
228
  );
226
229
  background-size: 200% 100%;
227
- animation: dataTableShimmer 1.4s ease-in-out infinite;
230
+ animation: dataTableShimmer var(--fui-duration-shimmer, $fui-duration-shimmer) ease-in-out
231
+ infinite;
228
232
  }
229
233
 
230
234
  @keyframes dataTableShimmer {
@@ -246,7 +250,7 @@
246
250
  .expandCell {
247
251
  display: inline-flex;
248
252
  align-items: center;
249
- gap: var(--fui-raw-space-4);
253
+ gap: var(--fui-raw-space-4, 4px);
250
254
  }
251
255
 
252
256
  .expandButton {
@@ -286,8 +290,8 @@
286
290
  display: flex;
287
291
  align-items: center;
288
292
  justify-content: center;
289
- padding-block: var(--fui-raw-space-48);
290
- padding-inline: var(--fui-raw-space-24);
293
+ padding-block: var(--fui-raw-space-48, 48px);
294
+ padding-inline: var(--fui-raw-space-24, 24px);
291
295
  }
292
296
 
293
297
  .emptyMessage {
@@ -6,6 +6,7 @@ import styles from "./DataTable.module.scss";
6
6
  import { Checkbox } from "../Checkbox";
7
7
  import { ExpandIcon, SortAscIcon, SortDescIcon, SortIcon } from "./DataTable.icons";
8
8
  import { DataTableSkeletonRows, useArrowKeyRowNav } from "./DataTable.support";
9
+ import { isDevelopmentBuild } from "../../utils/env";
9
10
 
10
11
  // ============================================
11
12
  // Dependency (@tanstack/react-table) — lazy import()
@@ -36,7 +37,7 @@ function loadReactTable(): Promise<void> {
36
37
  _reactTable = (await import("@tanstack/react-table")) as unknown as ReactTableModule;
37
38
  } catch {
38
39
  _reactTableFailed = true;
39
- if (process.env.NODE_ENV === "development") {
40
+ if (isDevelopmentBuild()) {
40
41
  console.warn(
41
42
  "[@usefragments/ui] DataTable: @tanstack/react-table is not installed. " +
42
43
  "Rendering a static table without sorting, selection, or expansion. " +
@@ -469,9 +470,9 @@ function DataTableLive<T>({
469
470
  <DataTableSkeletonRows
470
471
  rowCount={skeletonRows}
471
472
  columnCount={columns.length}
472
- rowClassName={styles.row}
473
- cellClassName={styles.td}
474
- barClassName={styles.skeletonBar}
473
+ rowClassName={styles.row ?? ""}
474
+ cellClassName={styles.td ?? ""}
475
+ barClassName={styles.skeletonBar ?? ""}
475
476
  />
476
477
  ) : (
477
478
  table.getRowModel().rows.map((row: any) => {
@@ -711,9 +712,9 @@ function DataTableStatic<T>({
711
712
  <DataTableSkeletonRows
712
713
  rowCount={skeletonRows}
713
714
  columnCount={columnCount}
714
- rowClassName={styles.row}
715
- cellClassName={styles.td}
716
- barClassName={styles.skeletonBar}
715
+ rowClassName={styles.row ?? ""}
716
+ cellClassName={styles.td ?? ""}
717
+ barClassName={styles.skeletonBar ?? ""}
717
718
  />
718
719
  ) : isEmpty ? (
719
720
  <tr className={styles.row}>
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "DatePicker",
4
- "description": "Date picker with calendar dropdown for selecting single dates or date ranges. Built on react-day-picker with seed-based theming.",
5
- "category": "forms",
4
+ "description": "Selects a date or date range from a calendar.",
5
+ "category": "inputs",
6
6
  "tags": ["date", "picker", "calendar", "range", "form", "input"],
7
7
  "status": "stable",
8
8
  "dependencies": [
@@ -165,75 +165,74 @@
165
165
  },
166
166
  "usage": {
167
167
  "when": [
168
- "Selecting a single date from a calendar",
169
- "Selecting a date range (start/end)",
170
- "Date inputs in forms",
171
- "Filtering by date or date range"
168
+ "A date the user picks off a calendar",
169
+ "A start and end date together",
170
+ "Filtering by date"
172
171
  ],
173
172
  "whenNot": [
174
- "Time-only input - use a dedicated TimePicker",
175
- "Selecting from a small set of known dates - use Select",
176
- "Free-form date entry - use Input with date masking"
173
+ "Time on its own (use a dedicated TimePicker)",
174
+ "A handful of known dates (use Select)",
175
+ "Typed date entry (use Input with a date mask)"
177
176
  ],
178
177
  "guidelines": [
179
- "Use range mode with numberOfMonths={2} for date range selection",
180
- "Use size=\"sm\" in dense toolbars so DatePicker aligns with Input, Select, Combobox, Button, and IconButton",
181
- "Add presets for common ranges (Today, Last 7 days, Last 30 days)",
182
- "Use disabledDates to prevent selecting past dates or unavailable dates",
183
- "Provide a meaningful placeholder",
184
- "DatePicker.Trigger forwards button props and defaults to type=\"button\" (safe inside forms)"
178
+ "Pair range mode with numberOfMonths={2} so both ends are visible",
179
+ "size=\"sm\" lines the trigger up with other dense toolbar controls",
180
+ "Offer presets for the common ranges: Today, Last 7 days, Last 30 days",
181
+ "disabledDates blocks past or unavailable days before the user tries",
182
+ "Placeholder names the date, not the action",
183
+ "DatePicker.Trigger defaults to type=\"button\", so it is safe inside a form"
185
184
  ],
186
185
  "accessibility": [
187
- "Full keyboard navigation within the calendar grid",
188
- "Arrow keys navigate between days",
186
+ "The calendar grid is fully keyboard navigable",
187
+ "Arrow keys move between days",
189
188
  "Escape closes the calendar",
190
- "Focus returns to trigger on close"
189
+ "Focus returns to the trigger on close"
191
190
  ]
192
191
  },
193
192
  "examples": [
194
193
  {
195
194
  "name": "Default",
196
- "description": "Single date picker with default settings",
195
+ "description": "Trigger opens one month; today is outlined.",
197
196
  "code": "<StatefulDatePicker placeholder=\"Pick a date\">\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
198
197
  },
199
198
  {
200
199
  "name": "Small Trigger",
201
- "description": "Dense toolbar date picker aligned to other small controls",
200
+ "description": "Matches the height of other sm toolbar controls.",
202
201
  "code": "<StatefulDatePicker size=\"sm\" placeholder=\"Last scanned\">\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
203
202
  },
204
203
  {
205
204
  "name": "Date Range",
206
- "description": "Range mode with dual months",
205
+ "description": "Two months side by side so both ends of the range are visible.",
207
206
  "code": "<StatefulRangePicker placeholder=\"Select date range\" numberOfMonths={2}>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulRangePicker>"
208
207
  },
209
208
  {
210
209
  "name": "Multi-Month",
211
- "description": "Single date with 3 months visible",
210
+ "description": "Three months at once, for dates far from today.",
212
211
  "code": "<StatefulDatePicker placeholder=\"Pick a date\" numberOfMonths={3}>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
213
212
  },
214
213
  {
215
214
  "name": "Disabled Dates",
216
- "description": "Past dates disabled",
215
+ "description": "Everything before today is greyed out and unclickable.",
217
216
  "code": "<StatefulDatePicker\n placeholder=\"Select a future date\"\n disabledDates={{ before: new Date() }}\n>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
218
217
  },
219
218
  {
220
219
  "name": "With Presets",
221
- "description": "Range picker with sidebar preset buttons",
220
+ "description": "Shortcut buttons beside the calendar skip the common ranges.",
222
221
  "code": "<StatefulRangePicker placeholder=\"Select date range\" numberOfMonths={2}>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <div style={{ display: 'flex', gap: '1rem' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', minWidth: '8rem' }}>\n <DatePicker.Preset range={{ from: today, to: today }}>Today</DatePicker.Preset>\n <DatePicker.Preset range={{ from: subDays(today, 7), to: today }}>Last 7 days</DatePicker.Preset>\n <DatePicker.Preset range={{ from: subDays(today, 30), to: today }}>Last 30 days</DatePicker.Preset>\n <DatePicker.Preset range={{ from: subDays(today, 90), to: today }}>Last 90 days</DatePicker.Preset>\n </div>\n <DatePicker.Calendar />\n </div>\n </DatePicker.Content>\n</StatefulRangePicker>"
223
222
  },
224
223
  {
225
224
  "name": "With Label and Helper Text",
226
- "description": "Date picker with built-in label and helper text",
227
- "code": "<StatefulDatePicker placeholder=\"Pick a date\">\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
225
+ "description": "Label above the trigger, supporting text below it.",
226
+ "code": "<StatefulDatePicker\n label=\"Renewal date\"\n placeholder=\"Pick a date\"\n helperText=\"Billing restarts on this day each month.\"\n>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
228
227
  },
229
228
  {
230
229
  "name": "Error State",
231
- "description": "Validation error with message",
230
+ "description": "Red border on the trigger, and the reason below it.",
232
231
  "code": "<DatePicker\n label=\"Start Date\"\n placeholder=\"Pick a date\"\n error=\"Please select a start date\"\n>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</DatePicker>"
233
232
  },
234
233
  {
235
234
  "name": "Disabled",
236
- "description": "Disabled date picker",
235
+ "description": "Dimmed; the calendar will not open.",
237
236
  "code": "<StatefulDatePicker placeholder=\"Pick a date\" disabled>\n <DatePicker.Trigger />\n <DatePicker.Content>\n <DatePicker.Calendar />\n </DatePicker.Content>\n</StatefulDatePicker>"
238
237
  }
239
238
  ],
@@ -43,6 +43,12 @@
43
43
  &[data-popup-open] {
44
44
  border-color: var(--fui-field-border-focus, $fui-color-accent);
45
45
  }
46
+
47
+ // Error border, matching Input. Set from the wrapper's data-invalid so the
48
+ // control reads as failed, not just the message beneath it.
49
+ .wrapper[data-invalid] & {
50
+ border-color: var(--fui-color-danger-text, $fui-color-danger-text);
51
+ }
46
52
  }
47
53
 
48
54
  .triggerSm {
@@ -276,7 +282,8 @@
276
282
  // ============================================
277
283
 
278
284
  .today > .dayButton {
279
- box-shadow: inset 0 0 0 1px var(--fui-field-border, $fui-border-strong);
285
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, 1px)
286
+ var(--fui-field-border, $fui-border-strong);
280
287
  background-color: color-mix(in srgb, var(--fui-bg-hover, $fui-bg-hover) 55%, transparent);
281
288
  }
282
289
 
@@ -318,7 +325,7 @@
318
325
  &::before {
319
326
  content: "";
320
327
  position: absolute;
321
- inset: 2px 0;
328
+ inset: var(--fui-raw-space-2, 2px) 0;
322
329
  background-color: color-mix(
323
330
  in srgb,
324
331
  var(--fui-color-accent, $fui-color-accent) 10%,
@@ -339,7 +346,7 @@
339
346
  &::before {
340
347
  content: "";
341
348
  position: absolute;
342
- inset: 2px 0 2px 50%;
349
+ inset: var(--fui-raw-space-2, 2px) 0 var(--fui-raw-space-2, 2px) 50%;
343
350
  background-color: color-mix(
344
351
  in srgb,
345
352
  var(--fui-color-accent, $fui-color-accent) 10%,
@@ -369,7 +376,7 @@
369
376
  &::before {
370
377
  content: "";
371
378
  position: absolute;
372
- inset: 2px 50% 2px 0;
379
+ inset: var(--fui-raw-space-2, 2px) 50% var(--fui-raw-space-2, 2px) 0;
373
380
  background-color: color-mix(
374
381
  in srgb,
375
382
  var(--fui-color-accent, $fui-color-accent) 10%,
@@ -419,7 +426,7 @@
419
426
 
420
427
  @media (prefers-contrast: more) {
421
428
  .trigger {
422
- border-width: 2px;
429
+ border-width: var(--fui-stroke-default, 2px);
423
430
  border-color: var(--fui-text-primary, $fui-text-primary);
424
431
 
425
432
  &[data-popup-open] {
@@ -6,6 +6,7 @@ import { useFormFieldIds, type FormFieldProps } from "../../utils/aria";
6
6
  import { POPUP_OFFSET_PX } from "../../recipes/popup";
7
7
  import { useResolvedControlSize } from "../ComponentDefaults";
8
8
  import styles from "./DatePicker.module.scss";
9
+ import { isDevelopmentBuild } from "../../utils/env";
9
10
 
10
11
  // ============================================
11
12
  // Types (self-owned — no external dependency for types)
@@ -249,7 +250,7 @@ function loadDayPickerDeps(): Promise<void> {
249
250
  _DayFlag = rdp.DayFlag as unknown as RdpEnum;
250
251
  } catch {
251
252
  _rdpFailed = true;
252
- if (process.env.NODE_ENV === "development") {
253
+ if (isDevelopmentBuild()) {
253
254
  console.warn(
254
255
  "[@usefragments/ui] DatePicker: react-day-picker is not installed. " +
255
256
  "Install it with: npm install react-day-picker"
@@ -476,7 +477,9 @@ const DatePickerRoot = React.forwardRef<HTMLDivElement, DatePickerProps>(functio
476
477
 
477
478
  return (
478
479
  <DatePickerContext.Provider value={contextValue}>
479
- <div ref={ref} className={wrapperClasses}>
480
+ {/* data-invalid lets the trigger pick up the error border; without it only
481
+ the message turns red and the control still looks valid. */}
482
+ <div ref={ref} className={wrapperClasses} data-invalid={hasError || undefined}>
480
483
  {label && (
481
484
  <span id={labelId} className={styles.label}>
482
485
  {label}
@@ -42,7 +42,7 @@
42
42
  inline-size: 100%;
43
43
  max-inline-size: overlay.dialog-max("md");
44
44
  opacity: 0;
45
- transform: scale(0.95) translateY(-$fui-anim-offset-md);
45
+ transform: scale(0.95) translateY(calc(-1 * var(--fui-anim-offset-md, #{$fui-anim-offset-md})));
46
46
  transition:
47
47
  opacity var(--fui-transition-normal, $fui-transition-normal),
48
48
  transform var(--fui-transition-normal, $fui-transition-normal);
@@ -54,12 +54,12 @@
54
54
 
55
55
  &[data-starting-style] {
56
56
  opacity: 0;
57
- transform: scale(0.95) translateY(-$fui-anim-offset-md);
57
+ transform: scale(0.95) translateY(calc(-1 * var(--fui-anim-offset-md, #{$fui-anim-offset-md})));
58
58
  }
59
59
 
60
60
  &[data-ending-style] {
61
61
  opacity: 0;
62
- transform: scale(0.95) translateY($fui-anim-offset-md);
62
+ transform: scale(0.95) translateY(var(--fui-anim-offset-md, #{$fui-anim-offset-md}));
63
63
  }
64
64
  }
65
65