@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,14 +1,19 @@
1
- @use '../../tokens/variables' as *;
2
- @use '../../tokens/mixins' as *;
3
- @use '../../recipes/action';
4
- @use '../../recipes/field';
5
- @use '../../recipes/popup';
6
-
7
- // Local component tokens
1
+ @use "../../tokens/variables" as *;
2
+ @use "../../tokens/mixins" as *;
3
+ @use "../../recipes/action";
4
+ @use "../../recipes/field";
5
+ @use "../../recipes/popup";
6
+
7
+ // Local component tokens.
8
+ //
9
+ // The raw pixel values in this file (200px here, and the 80px/120px hex-input
10
+ // min-widths below) are deliberate, not missed tokens: react-colorful lays the
11
+ // saturation/hue canvas out in fixed pixels, and the hex field has to stay wide
12
+ // enough for a full "#rrggbb" string. Spacing tokens do not map onto either
13
+ // constraint, so these stay literal.
8
14
  $fui-colorpicker-size: 200px !default; // react-colorful saturation/hue square
9
15
  $fui-colorpicker-hue-height: $fui-target-size-min !default;
10
16
  $fui-colorpicker-pointer-size: $fui-target-size-min !default;
11
- $fui-colorpicker-pointer-border: 2px !default;
12
17
 
13
18
  .wrapper {
14
19
  @include field.wrapper;
@@ -44,7 +49,6 @@ $fui-colorpicker-pointer-border: 2px !default;
44
49
  min-width: 80px;
45
50
  flex: 0 0 auto;
46
51
  }
47
-
48
52
  }
49
53
 
50
54
  .sizeMd {
@@ -75,7 +79,6 @@ $fui-colorpicker-pointer-border: 2px !default;
75
79
  .hexInput {
76
80
  min-width: 120px;
77
81
  }
78
-
79
82
  }
80
83
 
81
84
  .inputWrapper {
@@ -89,7 +92,27 @@ $fui-colorpicker-pointer-border: 2px !default;
89
92
  @include field.shell;
90
93
 
91
94
  flex-shrink: 0;
95
+
96
+ &:focus-visible,
97
+ &[data-popup-open] {
98
+ @include field.focus-state;
99
+ }
100
+
101
+ .wrapper[data-invalid] & {
102
+ @include field.invalid-state;
103
+
104
+ // Focused while invalid keeps the danger edge and takes the danger ring,
105
+ // the same pairing Input and Textarea render. Without it the ring stays
106
+ // accent-coloured and the control reads half-valid at the moment the user
107
+ // is actually in it.
108
+ &:focus-visible,
109
+ &[data-popup-open] {
110
+ @include field.invalid-focus-state;
111
+ }
112
+ }
113
+
92
114
  // Disabled state (opacity + pointer-events) comes from @include interactive-base.
115
+ @include high-contrast-outline;
93
116
  }
94
117
 
95
118
  // Hex input wrapper (using Input component)
@@ -112,8 +135,6 @@ $fui-colorpicker-pointer-border: 2px !default;
112
135
  .popup {
113
136
  @include popup.container;
114
137
 
115
- border-radius: var(--fui-radius-lg, $fui-radius-lg);
116
-
117
138
  // react-colorful styling overrides
118
139
  :global(.react-colorful) {
119
140
  width: var(--fui-colorpicker-size, #{$fui-colorpicker-size});
@@ -133,22 +154,11 @@ $fui-colorpicker-pointer-border: 2px !default;
133
154
  :global(.react-colorful__pointer) {
134
155
  width: var(--fui-colorpicker-pointer-size, #{$fui-colorpicker-pointer-size});
135
156
  height: var(--fui-colorpicker-pointer-size, #{$fui-colorpicker-pointer-size});
136
- border: $fui-colorpicker-pointer-border solid var(--fui-text-inverse, $fui-text-inverse);
157
+ border: var(--fui-stroke-default, 2px) solid var(--fui-text-inverse, $fui-text-inverse);
137
158
  box-shadow: var(--fui-shadow-md, $fui-shadow-md);
138
159
  }
139
160
  }
140
161
 
141
- // ============================================
142
- // Accessibility: High Contrast Mode
143
- // ============================================
144
-
145
- @media (prefers-contrast: more) {
146
- .swatch {
147
- border-width: 2px;
148
- border-color: var(--fui-text-primary, $fui-text-primary);
149
- }
150
- }
151
-
152
162
  // ============================================
153
163
  // Accessibility: Reduced Motion
154
164
  // ============================================
@@ -25,7 +25,7 @@ function loadColorfulDeps(): Promise<void> {
25
25
  _HexColorPicker = rc.HexColorPicker;
26
26
  } catch {
27
27
  _colorfulFailed = true;
28
- if (process.env.NODE_ENV === "development") {
28
+ if (isDevelopmentBuild()) {
29
29
  console.warn(
30
30
  "[@usefragments/ui] ColorPicker: react-colorful is not installed. " +
31
31
  "Install it with: npm install react-colorful"
@@ -55,6 +55,7 @@ import { Field } from "@base-ui/react/field";
55
55
  import { useResolvedControlSize } from "../ComponentDefaults";
56
56
  import { Input } from "../Input";
57
57
  import styles from "./ColorPicker.module.scss";
58
+ import { isDevelopmentBuild } from "../../utils/env";
58
59
 
59
60
  export interface ColorPickerProps extends Omit<
60
61
  React.HTMLAttributes<HTMLDivElement>,
@@ -166,6 +167,7 @@ const ColorPickerRoot = React.forwardRef<HTMLDivElement, ColorPickerProps>(funct
166
167
  className={styles.swatch}
167
168
  style={{ backgroundColor: displayValue }}
168
169
  disabled={disabled}
170
+ aria-invalid={error || undefined}
169
171
  aria-label={label ? `Edit ${label} color` : "Edit color"}
170
172
  />
171
173
  <BasePopover.Portal>
@@ -192,6 +194,9 @@ const ColorPickerRoot = React.forwardRef<HTMLDivElement, ColorPickerProps>(funct
192
194
  onChange={handleInputChange}
193
195
  onBlur={handleInputBlur}
194
196
  disabled={disabled}
197
+ // Without this the hex field keeps its neutral border while the
198
+ // helper text turns red, so the error reads as a stray message.
199
+ error={error}
195
200
  size={size}
196
201
  className={styles.hexInput}
197
202
  inputClassName={styles.hexInputField}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Combobox",
4
- "description": "Searchable select input that filters a dropdown list of options as you type. Supports single and multiple selection with chips.",
5
- "category": "forms",
4
+ "description": "Filters a list of options as the user types.",
5
+ "category": "inputs",
6
6
  "tags": ["combobox", "autocomplete", "search", "select", "typeahead", "form", "multiselect"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/Combobox/index.tsx",
@@ -133,86 +133,85 @@
133
133
  },
134
134
  "usage": {
135
135
  "when": [
136
- "Users need to search/filter through many options",
137
- "Large option lists where scrolling is impractical",
138
- "When users might know what they are looking for",
139
- "Autocomplete or typeahead functionality",
140
- "Multiple selections from a searchable list"
136
+ "Lists too long to scan by eye",
137
+ "The user roughly knows the value they want",
138
+ "Autocomplete or typeahead",
139
+ "Multi-select from a searchable list"
141
140
  ],
142
141
  "whenNot": [
143
- "Few options (under 5) - use Select or RadioGroup",
144
- "Free-form text with no predefined options - use Input",
145
- "Non-searchable single selection - use Select",
146
- "Actions, not selection - use Menu"
142
+ "Under five options (use Select or RadioGroup)",
143
+ "Free-form text with no known options (use Input)",
144
+ "Short list nobody needs to search (use Select)",
145
+ "Actions rather than values (use Menu)"
147
146
  ],
148
147
  "guidelines": [
149
- "Include a placeholder that explains what to search for",
150
- "Use label prop for accessible field labeling",
151
- "Use helperText for guidance and error for validation messages",
152
- "Provide an empty state message when no results match",
153
- "Group related options with Combobox.Group for large lists",
154
- "Static items may be composed through fragments and groups; filtering preserves wrapper composition",
155
- "Keep option text concise and searchable",
156
- "Use multiple prop for multi-select with chip display"
148
+ "Placeholder names what is searchable",
149
+ "Set label so the field is announced",
150
+ "helperText for guidance, error for the failure reason",
151
+ "Override the built-in \"No results found\" with Combobox.Empty when you have better wording",
152
+ "Group related options with Combobox.Group in long lists",
153
+ "Filtering keeps wrapper composition, so groups and fragments survive",
154
+ "Keep option text short and searchable",
155
+ "multiple turns selections into removable chips"
157
156
  ],
158
157
  "accessibility": [
159
- "Full keyboard navigation support (arrow keys, enter, escape)",
160
- "Type-ahead filtering within options",
161
- "Proper ARIA combobox roles and attributes",
162
- "Screen reader announcements for filtered results",
163
- "Chip removal via keyboard in multi-select mode"
158
+ "Arrow keys, Enter, and Escape all work",
159
+ "Typing filters the list in place",
160
+ "Correct ARIA combobox roles and attributes",
161
+ "Filtered result counts are announced",
162
+ "Chips can be removed from the keyboard"
164
163
  ]
165
164
  },
166
165
  "examples": [
167
166
  {
168
167
  "name": "Default",
169
- "description": "Basic searchable select",
168
+ "description": "Type to narrow the list; unmatched queries show a no-results row.",
170
169
  "code": "<StatefulCombobox placeholder=\"Select a fruit\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"apple\">Apple</Combobox.Item>\n <Combobox.Item value=\"banana\">Banana</Combobox.Item>\n <Combobox.Item value=\"orange\">Orange</Combobox.Item>\n <Combobox.Item value=\"grape\">Grape</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
171
170
  },
172
171
  {
173
172
  "name": "Multiple Selection",
174
- "description": "Multi-select with chips",
173
+ "description": "Each pick becomes a removable chip in the field.",
175
174
  "code": "<StatefulCombobox multiple placeholder=\"Select fruits...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"apple\">Apple</Combobox.Item>\n <Combobox.Item value=\"banana\">Banana</Combobox.Item>\n <Combobox.Item value=\"orange\">Orange</Combobox.Item>\n <Combobox.Item value=\"grape\">Grape</Combobox.Item>\n <Combobox.Item value=\"mango\">Mango</Combobox.Item>\n <Combobox.Item value=\"kiwi\">Kiwi</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
176
175
  },
177
176
  {
178
177
  "name": "With Label and Helper Text",
179
- "description": "Combobox with built-in label and helper text",
178
+ "description": "Helper text tells the user the field is searchable.",
180
179
  "code": "<StatefulCombobox\n label=\"Assignee\"\n placeholder=\"Search assignees...\"\n helperText=\"Type to filter the list of available assignees.\"\n>\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No matches</Combobox.Empty>\n <Combobox.Item value=\"alice\">Alice Johnson</Combobox.Item>\n <Combobox.Item value=\"bob\">Bob Chen</Combobox.Item>\n <Combobox.Item value=\"carol\">Carol Smith</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
181
180
  },
182
181
  {
183
182
  "name": "Error State",
184
- "description": "Validation error with message",
185
- "code": "<Combobox\n label=\"Reviewer\"\n placeholder=\"Search reviewers...\"\n error=\"Please select a reviewer\"\n disabled\n>\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n </Combobox.Content>\n</Combobox>"
183
+ "description": "Red border, and the message replaces helper text.",
184
+ "code": "<Combobox\n label=\"Reviewer\"\n placeholder=\"Search reviewers...\"\n error=\"Please select a reviewer\"\n>\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n </Combobox.Content>\n</Combobox>"
186
185
  },
187
186
  {
188
187
  "name": "With Groups",
189
- "description": "Options organized into groups",
188
+ "description": "Headed sections stay intact while filtering.",
190
189
  "code": "<StatefulCombobox placeholder=\"Search countries...\">\n <Combobox.Input />\n <Combobox.Content>\n <>\n <Combobox.Group>\n <Combobox.GroupLabel>North America</Combobox.GroupLabel>\n <Combobox.Item value=\"us\">United States</Combobox.Item>\n <Combobox.Item value=\"ca\">Canada</Combobox.Item>\n <Combobox.Item value=\"mx\">Mexico</Combobox.Item>\n </Combobox.Group>\n <Combobox.Group>\n <Combobox.GroupLabel>Europe</Combobox.GroupLabel>\n <Combobox.Item value=\"uk\">United Kingdom</Combobox.Item>\n <Combobox.Item value=\"de\">Germany</Combobox.Item>\n <Combobox.Item value=\"fr\">France</Combobox.Item>\n </Combobox.Group>\n <Combobox.Empty>No matching country</Combobox.Empty>\n </>\n </Combobox.Content>\n</StatefulCombobox>"
191
190
  },
192
191
  {
193
192
  "name": "With Empty State",
194
- "description": "Shows message when no results match",
195
- "code": "<StatefulCombobox placeholder=\"Search programming languages...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"js\">JavaScript</Combobox.Item>\n <Combobox.Item value=\"ts\">TypeScript</Combobox.Item>\n <Combobox.Item value=\"py\">Python</Combobox.Item>\n <Combobox.Item value=\"rs\">Rust</Combobox.Item>\n <Combobox.Item value=\"go\">Go</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
193
+ "description": "Combobox.Empty replaces the default no-results wording.",
194
+ "code": "<StatefulCombobox placeholder=\"Filter languages...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No language matches that search</Combobox.Empty>\n <Combobox.Item value=\"js\">JavaScript</Combobox.Item>\n <Combobox.Item value=\"ts\">TypeScript</Combobox.Item>\n <Combobox.Item value=\"py\">Python</Combobox.Item>\n <Combobox.Item value=\"rs\">Rust</Combobox.Item>\n <Combobox.Item value=\"go\">Go</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
196
195
  },
197
196
  {
198
197
  "name": "Scrollable List",
199
- "description": "Long list with scroll hint shows 4 items with half-peek of the 5th",
198
+ "description": "Caps at four rows and half-shows the fifth as a scroll hint.",
200
199
  "code": "<StatefulCombobox placeholder=\"Search languages...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"js\">JavaScript</Combobox.Item>\n <Combobox.Item value=\"ts\">TypeScript</Combobox.Item>\n <Combobox.Item value=\"py\">Python</Combobox.Item>\n <Combobox.Item value=\"rs\">Rust</Combobox.Item>\n <Combobox.Item value=\"go\">Go</Combobox.Item>\n <Combobox.Item value=\"rb\">Ruby</Combobox.Item>\n <Combobox.Item value=\"java\">Java</Combobox.Item>\n <Combobox.Item value=\"swift\">Swift</Combobox.Item>\n <Combobox.Item value=\"kt\">Kotlin</Combobox.Item>\n <Combobox.Item value=\"cpp\">C++</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
201
200
  },
202
201
  {
203
202
  "name": "Custom Max Visible Items",
204
- "description": "Show 6 items before scrolling with half-peek scroll hint",
203
+ "description": "maxVisibleItems raises the cap to six rows.",
205
204
  "code": "<StatefulCombobox placeholder=\"Search cities...\">\n <Combobox.Input />\n <Combobox.Content maxVisibleItems={6}>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"nyc\">New York</Combobox.Item>\n <Combobox.Item value=\"lon\">London</Combobox.Item>\n <Combobox.Item value=\"tok\">Tokyo</Combobox.Item>\n <Combobox.Item value=\"par\">Paris</Combobox.Item>\n <Combobox.Item value=\"syd\">Sydney</Combobox.Item>\n <Combobox.Item value=\"ber\">Berlin</Combobox.Item>\n <Combobox.Item value=\"tor\">Toronto</Combobox.Item>\n <Combobox.Item value=\"sin\">Singapore</Combobox.Item>\n <Combobox.Item value=\"dub\">Dubai</Combobox.Item>\n <Combobox.Item value=\"sao\">São Paulo</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
206
205
  },
207
206
  {
208
207
  "name": "Disabled",
209
- "description": "Disabled combobox",
208
+ "description": "Dimmed and unfocusable.",
210
209
  "code": "<Combobox disabled placeholder=\"Search...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"1\">Option 1</Combobox.Item>\n </Combobox.Content>\n</Combobox>"
211
210
  },
212
211
  {
213
212
  "name": "Explicit Trigger",
214
- "description": "Hide the built-in input trigger when rendering a separate Combobox.Trigger",
215
- "code": "<StatefulCombobox placeholder=\"Search assignees...\">\n <Combobox.Input showTrigger={false} />\n <Combobox.Trigger aria-label=\"Open assignee list\" />\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n <Combobox.Item value=\"bob\">Bob</Combobox.Item>\n <Combobox.Item value=\"carol\">Carol</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
213
+ "description": "showTrigger={false} hands the open control to your own Combobox.Trigger.",
214
+ "code": "<StatefulCombobox placeholder=\"Search assignees...\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <Combobox.Input showTrigger={false} />\n <Combobox.Trigger aria-label=\"Open assignee list\" />\n </div>\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n <Combobox.Item value=\"bob\">Bob</Combobox.Item>\n <Combobox.Item value=\"carol\">Carol</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
216
215
  }
217
216
  ],
218
217
  "relations": [
@@ -1,5 +1,6 @@
1
1
  @use "../../tokens/variables" as *;
2
2
  @use "../../tokens/mixins" as *;
3
+ @use "../../tokens/measurements.generated" as measurements;
3
4
  @use "../../recipes/action";
4
5
  @use "../../recipes/field";
5
6
  @use "../../recipes/layout";
@@ -44,9 +45,20 @@
44
45
  }
45
46
 
46
47
  &:has([data-disabled]) {
47
- background-color: var(--fui-field-bg-disabled, $fui-bg-tertiary);
48
- color: var(--fui-text-tertiary, $fui-text-tertiary);
48
+ @include field.disabled-state;
49
49
  }
50
+
51
+ .wrapper[data-invalid] & {
52
+ @include field.invalid-state;
53
+
54
+ // Focused while invalid keeps the danger edge and takes the danger ring,
55
+ // the same pairing Input and Textarea render.
56
+ &:focus-within {
57
+ @include field.invalid-focus-state;
58
+ }
59
+ }
60
+
61
+ @include high-contrast-outline;
50
62
  }
51
63
 
52
64
  // Size variants for input wrapper — override --_field-h.
@@ -67,7 +79,7 @@
67
79
  flex: 1;
68
80
  min-width: layout.measure("inline-floor");
69
81
  min-block-size: 0;
70
- padding: 0;
82
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
71
83
  background: transparent;
72
84
  border: none;
73
85
  border-radius: var(--fui-radius-sm, $fui-radius-sm);
@@ -183,7 +195,7 @@
183
195
 
184
196
  // Positioner — z-index must exceed Dialog positioner (51)
185
197
  .positioner {
186
- z-index: 52;
198
+ z-index: var(--fui-overlay-layer-anchored, #{$fui-overlay-layer-anchored});
187
199
  outline: none;
188
200
  }
189
201
 
@@ -279,21 +291,6 @@
279
291
  @include popup.group-label;
280
292
  }
281
293
 
282
- // ============================================
283
- // Accessibility: High Contrast Mode
284
- // ============================================
285
-
286
- @media (prefers-contrast: more) {
287
- .inputWrapper {
288
- border-width: 2px;
289
- border-color: var(--fui-text-primary, $fui-text-primary);
290
-
291
- &:focus-within {
292
- border-color: var(--fui-color-accent, $fui-color-accent);
293
- }
294
- }
295
- }
296
-
297
294
  // ============================================
298
295
  // Accessibility: Reduced Motion
299
296
  // ============================================
@@ -4,10 +4,7 @@ import * as React from "react";
4
4
  import { Combobox as BaseCombobox } from "@base-ui/react/combobox";
5
5
  import { useResolvedControlSize } from "../ComponentDefaults";
6
6
  import { mergeAriaIds, useFormFieldIds, type FormFieldProps } from "../../utils/aria";
7
- import {
8
- POPUP_OFFSET_PX,
9
- resolvePopupViewportRows,
10
- } from "../../recipes/popup";
7
+ import { POPUP_OFFSET_PX, resolvePopupViewportRows } from "../../recipes/popup";
11
8
  import styles from "./Combobox.module.scss";
12
9
 
13
10
  // ============================================
@@ -181,6 +178,9 @@ interface ComboboxContextValue {
181
178
  size: "sm" | "md" | "lg";
182
179
  // Id applied to Combobox.Input so a native <label htmlFor> can target it.
183
180
  inputId?: string;
181
+ /** Mirrors the wrapper's `data-invalid` onto the input as `aria-invalid`, so
182
+ * assistive tech hears the state the danger edge is painting. */
183
+ invalid?: boolean;
184
184
  }
185
185
 
186
186
  const EMPTY_STATIC_LABELS = new Map<string, string>();
@@ -293,6 +293,27 @@ function filterStaticChildren(
293
293
  };
294
294
  }
295
295
 
296
+ /**
297
+ * True when the consumer already supplied a `Combobox.Empty` slot anywhere in
298
+ * the content. Used to decide whether the built-in "no results" fallback is
299
+ * needed — without it an unmatched query renders an empty, collapsed popup.
300
+ */
301
+ function containsEmptySlot(node: React.ReactNode): boolean {
302
+ let found = false;
303
+ React.Children.forEach(node, (child) => {
304
+ if (found || !React.isValidElement(child)) return;
305
+ if (child.type === ComboboxEmpty) {
306
+ found = true;
307
+ return;
308
+ }
309
+ const props = child.props as { children?: React.ReactNode };
310
+ if (props.children !== undefined && containsEmptySlot(props.children)) {
311
+ found = true;
312
+ }
313
+ });
314
+ return found;
315
+ }
316
+
296
317
  // ============================================
297
318
  // Components
298
319
  // ============================================
@@ -404,6 +425,7 @@ const ComboboxRoot = React.forwardRef<HTMLDivElement, ComboboxProps>(function Co
404
425
  registerTrigger,
405
426
  size,
406
427
  inputId,
428
+ invalid: hasError,
407
429
  }),
408
430
  [
409
431
  placeholder,
@@ -416,14 +438,17 @@ const ComboboxRoot = React.forwardRef<HTMLDivElement, ComboboxProps>(function Co
416
438
  registerTrigger,
417
439
  size,
418
440
  inputId,
441
+ hasError,
419
442
  ]
420
443
  );
421
444
 
422
445
  const wrapperClasses = [styles.wrapper, className].filter(Boolean).join(" ");
423
446
  const helperClasses = [styles.helper, hasError && styles.helperError].filter(Boolean).join(" ");
424
447
 
448
+ // data-invalid lets the shell pick up the error border, the same hook Select,
449
+ // DatePicker and RadioGroup use; without it `error` renders only the message.
425
450
  const wrapperContent = (inner: React.ReactNode) => (
426
- <div ref={ref} className={wrapperClasses}>
451
+ <div ref={ref} className={wrapperClasses} data-invalid={hasError || undefined}>
427
452
  {inner}
428
453
  {helperText && (
429
454
  <span id={helperId} className={helperClasses}>
@@ -572,6 +597,7 @@ function ComboboxInput({
572
597
  placeholder={context.selectedValues.length === 0 ? inputPlaceholder : undefined}
573
598
  id={inputId}
574
599
  className={classes}
600
+ aria-invalid={context.invalid || undefined}
575
601
  />
576
602
  {renderTrigger && (
577
603
  <BaseCombobox.Trigger className={styles.trigger}>
@@ -589,6 +615,7 @@ function ComboboxInput({
589
615
  placeholder={inputPlaceholder}
590
616
  id={inputId}
591
617
  className={classes}
618
+ aria-invalid={context.invalid || undefined}
592
619
  />
593
620
  {renderTrigger && (
594
621
  <BaseCombobox.Trigger className={styles.trigger}>
@@ -631,6 +658,14 @@ function ComboboxContent({
631
658
  () => filterStaticChildren(children, visibleValues),
632
659
  [children, visibleValues]
633
660
  );
661
+ // No matches and no author-supplied empty slot would leave a bare, collapsed
662
+ // popup, so fall back to a readable "no results" row.
663
+ const popupChildren =
664
+ filteredContent.visibleItemCount === 0 && !containsEmptySlot(children) ? (
665
+ <ComboboxEmpty>No results found</ComboboxEmpty>
666
+ ) : (
667
+ filteredContent.children
668
+ );
634
669
 
635
670
  const popupStyle =
636
671
  maxVisibleItems != null
@@ -650,7 +685,7 @@ function ComboboxContent({
650
685
  >
651
686
  <BaseCombobox.Popup {...htmlProps} className={popupClasses} style={popupStyle}>
652
687
  <ComboboxFilteredItemIndexContext.Provider value={filteredItemIndices}>
653
- {filteredContent.children}
688
+ {popupChildren}
654
689
  </ComboboxFilteredItemIndexContext.Provider>
655
690
  </BaseCombobox.Popup>
656
691
  </BaseCombobox.Positioner>
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Command",
4
- "description": "A searchable command palette for quick actions. Combines an input with a filterable, keyboard-navigable list of actions.",
4
+ "description": "Filters a list of actions as the user types.",
5
5
  "category": "navigation",
6
- "tags": [
7
- "command",
8
- "palette",
9
- "search",
10
- "spotlight",
11
- "quick-actions",
12
- "cmdk"
13
- ],
6
+ "tags": ["command", "palette", "search", "spotlight", "quick-actions", "cmdk"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/Command/index.tsx",
16
9
  "exportName": "Command",
@@ -54,27 +47,32 @@
54
47
  "description": "Whether to loop keyboard navigation",
55
48
  "default": "true",
56
49
  "required": false
50
+ },
51
+ "hosted": {
52
+ "type": "boolean",
53
+ "description": "The Command sits inside another surface (a Popover, a Dialog) that draws the frame, so it draws none of its own",
54
+ "default": "false",
55
+ "required": false
57
56
  }
58
57
  },
59
58
  "usage": {
60
59
  "when": [
61
- "Quick-access command palettes (Ctrl+K)",
62
- "Searchable action menus",
63
- "Inline command lists with filtering",
64
- "Application-wide search interfaces"
60
+ "A keyboard shortcut that jumps anywhere",
61
+ "Action lists too long to scan",
62
+ "Inline lists that need filtering",
63
+ "Search across everything the app can do"
65
64
  ],
66
65
  "whenNot": [
67
- "Simple dropdown menus (use Menu)",
68
- "Form field selection (use Select or Combobox)",
69
- "Static navigation (use Sidebar or Tabs)",
70
- "Search with complex result types (build custom)"
66
+ "A handful of actions (use Menu)",
67
+ "Picking a value for a form (use Select or Combobox)",
68
+ "Fixed navigation (use Sidebar or Tabs)"
71
69
  ],
72
70
  "guidelines": [
73
- "Compose inside Dialog for modal command palette usage",
74
- "Use Command.Group to organize items by category",
75
- "Provide Command.Empty for no-results feedback",
76
- "Use keywords prop for items that should match on aliases",
77
- "Keep item labels short and action-oriented"
71
+ "Wrap in Dialog for the summon-anywhere palette",
72
+ "Group by category once the list gets long",
73
+ "Always supply Command.Empty",
74
+ "Add keywords so aliases and synonyms match",
75
+ "Label rows with a verb"
78
76
  ],
79
77
  "accessibility": [
80
78
  "Uses combobox + listbox ARIA pattern",
@@ -86,22 +84,22 @@
86
84
  "examples": [
87
85
  {
88
86
  "name": "Default",
89
- "description": "Inline command list with search",
87
+ "description": "Search field over a flat list.",
90
88
  "code": "<div style={{ maxWidth: '400px', width: '100%' }}>\n <Command>\n <Command.Input placeholder=\"Type a command...\" />\n <Command.List>\n <Command.Item onItemSelect={() => {}}>Open File</Command.Item>\n <Command.Item onItemSelect={() => {}}>Save Document</Command.Item>\n <Command.Item onItemSelect={() => {}}>Print</Command.Item>\n <Command.Empty>No results found.</Command.Empty>\n </Command.List>\n </Command>\n</div>"
91
89
  },
92
90
  {
93
91
  "name": "Dialog Command Palette",
94
- "description": "Command palette inside a Dialog",
95
- "code": "<Dialog>\n <Dialog.Trigger asChild>\n <Button variant=\"secondary\">Open Command Palette</Button>\n </Dialog.Trigger>\n <Dialog.Content size=\"sm\">\n <Command>\n <Command.Input placeholder=\"Search commands...\" />\n <Command.List>\n <Command.Group heading=\"Actions\">\n <Command.Item onItemSelect={() => {}}>New File</Command.Item>\n <Command.Item onItemSelect={() => {}}>Open Recent</Command.Item>\n </Command.Group>\n <Command.Separator />\n <Command.Group heading=\"Settings\">\n <Command.Item onItemSelect={() => {}}>Preferences</Command.Item>\n <Command.Item onItemSelect={() => {}}>Keyboard Shortcuts</Command.Item>\n </Command.Group>\n <Command.Empty>No results found.</Command.Empty>\n </Command.List>\n </Command>\n </Dialog.Content>\n</Dialog>"
92
+ "description": "The same list summoned over the page.",
93
+ "code": "<Dialog>\n <Dialog.Trigger asChild>\n <Button variant=\"soft\">Open Command Palette</Button>\n </Dialog.Trigger>\n <Dialog.Content width=\"sm\">\n <Command>\n <Command.Input placeholder=\"Search commands...\" />\n <Command.List>\n <Command.Group heading=\"Actions\">\n <Command.Item onItemSelect={() => {}}>New File</Command.Item>\n <Command.Item onItemSelect={() => {}}>Open Recent</Command.Item>\n </Command.Group>\n <Command.Separator />\n <Command.Group heading=\"Settings\">\n <Command.Item onItemSelect={() => {}}>Preferences</Command.Item>\n <Command.Item onItemSelect={() => {}}>Keyboard Shortcuts</Command.Item>\n </Command.Group>\n <Command.Empty>No results found.</Command.Empty>\n </Command.List>\n </Command>\n </Dialog.Content>\n</Dialog>"
96
94
  },
97
95
  {
98
96
  "name": "With Groups",
99
- "description": "Organized by category groups",
97
+ "description": "Category labels survive filtering.",
100
98
  "code": "<div style={{ maxWidth: '400px', width: '100%' }}>\n <Command>\n <Command.Input placeholder=\"Search...\" />\n <Command.List>\n <Command.Group heading=\"Suggestions\">\n <Command.Item onItemSelect={() => {}}>Calendar</Command.Item>\n <Command.Item onItemSelect={() => {}}>Calculator</Command.Item>\n </Command.Group>\n <Command.Separator />\n <Command.Group heading=\"Settings\">\n <Command.Item onItemSelect={() => {}}>Profile</Command.Item>\n <Command.Item onItemSelect={() => {}}>Billing</Command.Item>\n <Command.Item disabled onItemSelect={() => {}}>\n Team (coming soon)\n </Command.Item>\n </Command.Group>\n <Command.Empty>No results found.</Command.Empty>\n </Command.List>\n </Command>\n</div>"
101
99
  },
102
100
  {
103
101
  "name": "With Icons",
104
- "description": "Items with leading icons",
102
+ "description": "Leading glyphs speed up scanning.",
105
103
  "code": "<div style={{ maxWidth: '400px', width: '100%' }}>\n <Command>\n <Command.Input placeholder=\"What do you need?\" />\n <Command.List>\n <Command.Item onItemSelect={() => {}}>\n <span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>+</span> New Document\n </Command.Item>\n <Command.Item onItemSelect={() => {}}>\n <span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>{'>'}</span> Open Folder\n </Command.Item>\n <Command.Item onItemSelect={() => {}}>\n <span style={{ marginRight: '0.5rem', fontSize: '1rem' }}>?</span> Search\n </Command.Item>\n <Command.Empty>No results found.</Command.Empty>\n </Command.List>\n </Command>\n</div>"
106
104
  }
107
105
  ],
@@ -132,26 +130,12 @@
132
130
  "Command.Item keywords: string[] - extra filter terms",
133
131
  "Command.Item onItemSelect: (value, event) => void - selection handler"
134
132
  ],
135
- "a11yRules": [
136
- "A11Y_COMBOBOX_ROLE",
137
- "A11Y_LISTBOX_ROLE",
138
- "A11Y_ACTIVE_DESCENDANT"
139
- ]
133
+ "a11yRules": ["A11Y_COMBOBOX_ROLE", "A11Y_LISTBOX_ROLE", "A11Y_ACTIVE_DESCENDANT"]
140
134
  },
141
135
  "ai": {
142
136
  "compositionPattern": "compound",
143
- "subComponents": [
144
- "Input",
145
- "List",
146
- "Item",
147
- "Group",
148
- "Empty",
149
- "Separator"
150
- ],
151
- "requiredChildren": [
152
- "Input",
153
- "List"
154
- ],
137
+ "subComponents": ["Input", "List", "Item", "Group", "Empty", "Separator"],
138
+ "requiredChildren": ["Input", "List"],
155
139
  "commonPatterns": [
156
140
  "<Dialog><Dialog.Trigger><Button>Open Palette</Button></Dialog.Trigger><Dialog.Content size=\"sm\"><Command><Command.Input placeholder=\"Search...\" /><Command.List><Command.Group heading=\"Actions\"><Command.Item onItemSelect={() => {}}>Action 1</Command.Item></Command.Group><Command.Empty>No results.</Command.Empty></Command.List></Command></Dialog.Content></Dialog>"
157
141
  ]