@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,3 +1,5 @@
1
+ import { isProductionBuild } from "./env";
2
+
1
3
  export type FragmentsCanonicalStampProps = {
2
4
  "data-fc-canonical"?: string;
3
5
  "data-fc-slot"?: string;
@@ -33,15 +35,3 @@ export function fragmentsCanonicalStampProps(
33
35
  "data-fc-contract": `source:@usefragments/ui#${component}`,
34
36
  };
35
37
  }
36
-
37
- function isProductionBuild(): boolean {
38
- try {
39
- // Bundlers statically replace this member expression, so production builds
40
- // collapse to `"production" === "production"` and the stamp drops out. When
41
- // `process` is genuinely absent (unbundled browser), the reference throws
42
- // and we treat it as non-production (emit).
43
- return process.env.NODE_ENV === "production";
44
- } catch {
45
- return false;
46
- }
47
- }
@@ -5,24 +5,24 @@
5
5
  let hasChecked = false;
6
6
 
7
7
  export function checkCssLoaded(): void {
8
- if (hasChecked || typeof window === 'undefined') return;
8
+ if (hasChecked || typeof window === "undefined") return;
9
9
  hasChecked = true;
10
10
 
11
11
  // Defer check to after styles have loaded
12
12
  requestAnimationFrame(() => {
13
13
  const root = document.documentElement;
14
- const value = getComputedStyle(root).getPropertyValue('--fui-text-primary').trim();
14
+ const value = getComputedStyle(root).getPropertyValue("--fui-text-primary").trim();
15
15
 
16
16
  if (!value) {
17
17
  console.warn(
18
- '[Fragments UI] Component styles not loaded. Components will render unstyled.\n\n' +
19
- 'Add this import to your app entry point (e.g., main.tsx, layout.tsx):\n\n' +
18
+ "[Fragments UI] Component styles not loaded. Components will render unstyled.\n\n" +
19
+ "Add this import to your app entry point (e.g., main.tsx, layout.tsx):\n\n" +
20
20
  " import '@usefragments/ui/styles';\n\n" +
21
- 'Next.js users also need:\n\n' +
21
+ "Next.js users also need:\n\n" +
22
22
  " // next.config.ts\n" +
23
23
  " transpilePackages: ['@usefragments/ui']\n\n" +
24
- 'Or run: npx @usefragments/cli setup\n\n' +
25
- 'Docs: https://usefragments.com/getting-started'
24
+ "Or run: npx @usefragments/cli setup\n\n" +
25
+ "Docs: https://usefragments.com/components/install"
26
26
  );
27
27
  }
28
28
  });
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Build-mode guards for dev-only warnings.
3
+ *
4
+ * Bundlers replace the `process.env.NODE_ENV` member expression statically, so production
5
+ * builds fold these to constants and the guarded code drops out. The local declaration keeps
6
+ * source-registry installs compiling in apps without Node types; when `process` is genuinely
7
+ * absent at runtime (unbundled browser), the reference throws and we treat it as development.
8
+ */
9
+ declare const process: { env: { NODE_ENV?: string } };
10
+
11
+ function nodeEnv(): string | undefined {
12
+ try {
13
+ return process.env.NODE_ENV;
14
+ } catch {
15
+ return undefined;
16
+ }
17
+ }
18
+
19
+ export function isProductionBuild(): boolean {
20
+ return nodeEnv() === "production";
21
+ }
22
+
23
+ export function isDevelopmentBuild(): boolean {
24
+ return nodeEnv() === "development";
25
+ }
@@ -1,4 +1,4 @@
1
- 'use client';
1
+ "use client";
2
2
 
3
3
  // ============================================
4
4
  // Keyboard Shortcuts Registry
@@ -20,7 +20,7 @@
20
20
  // configureShortcuts({ SIDEBAR_TOGGLE: null }) // disable
21
21
  //
22
22
 
23
- import { useEffect, useRef, type RefObject } from 'react';
23
+ import { useEffect, useRef, type RefObject } from "react";
24
24
 
25
25
  // ============================================
26
26
  // Types
@@ -46,7 +46,7 @@ export interface KeyboardShortcut {
46
46
  * - 'global': Listens on document (e.g., sidebar toggle)
47
47
  * - 'component': Only active when component is focused/mounted
48
48
  */
49
- scope: 'global' | 'component';
49
+ scope: "global" | "component";
50
50
  }
51
51
 
52
52
  // ============================================
@@ -56,176 +56,176 @@ export interface KeyboardShortcut {
56
56
  export const KEYBOARD_SHORTCUTS = {
57
57
  // ----- Sidebar -----
58
58
  SIDEBAR_TOGGLE: {
59
- key: 'b',
59
+ key: "b",
60
60
  meta: true,
61
- label: 'Ctrl+B',
62
- component: 'Sidebar',
63
- description: 'Toggle sidebar collapse/expand',
64
- scope: 'global',
61
+ label: "Ctrl+B",
62
+ component: "Sidebar",
63
+ description: "Toggle sidebar collapse/expand",
64
+ scope: "global",
65
65
  },
66
66
  SIDEBAR_CLOSE_MOBILE: {
67
- key: 'Escape',
68
- label: 'Escape',
69
- component: 'Sidebar',
70
- description: 'Close mobile sidebar drawer',
71
- scope: 'global',
67
+ key: "Escape",
68
+ label: "Escape",
69
+ component: "Sidebar",
70
+ description: "Close mobile sidebar drawer",
71
+ scope: "global",
72
72
  },
73
73
 
74
74
  // ----- Editor (TipTap handles these natively, metadata for display) -----
75
75
  EDITOR_BOLD: {
76
- key: 'b',
76
+ key: "b",
77
77
  meta: true,
78
- label: 'Ctrl+B',
79
- component: 'Editor',
80
- description: 'Toggle bold formatting',
81
- scope: 'component',
78
+ label: "Ctrl+B",
79
+ component: "Editor",
80
+ description: "Toggle bold formatting",
81
+ scope: "component",
82
82
  },
83
83
  EDITOR_ITALIC: {
84
- key: 'i',
84
+ key: "i",
85
85
  meta: true,
86
- label: 'Ctrl+I',
87
- component: 'Editor',
88
- description: 'Toggle italic formatting',
89
- scope: 'component',
86
+ label: "Ctrl+I",
87
+ component: "Editor",
88
+ description: "Toggle italic formatting",
89
+ scope: "component",
90
90
  },
91
91
  EDITOR_STRIKETHROUGH: {
92
- key: 's',
92
+ key: "s",
93
93
  meta: true,
94
94
  shift: true,
95
- label: 'Ctrl+Shift+S',
96
- component: 'Editor',
97
- description: 'Toggle strikethrough formatting',
98
- scope: 'component',
95
+ label: "Ctrl+Shift+S",
96
+ component: "Editor",
97
+ description: "Toggle strikethrough formatting",
98
+ scope: "component",
99
99
  },
100
100
  EDITOR_LINK: {
101
- key: 'k',
101
+ key: "k",
102
102
  meta: true,
103
- label: 'Ctrl+K',
104
- component: 'Editor',
105
- description: 'Insert or edit link',
106
- scope: 'component',
103
+ label: "Ctrl+K",
104
+ component: "Editor",
105
+ description: "Insert or edit link",
106
+ scope: "component",
107
107
  },
108
108
  EDITOR_CODE: {
109
- key: 'e',
109
+ key: "e",
110
110
  meta: true,
111
- label: 'Ctrl+E',
112
- component: 'Editor',
113
- description: 'Toggle inline code',
114
- scope: 'component',
111
+ label: "Ctrl+E",
112
+ component: "Editor",
113
+ description: "Toggle inline code",
114
+ scope: "component",
115
115
  },
116
116
  EDITOR_BULLET_LIST: {
117
- key: '8',
117
+ key: "8",
118
118
  meta: true,
119
119
  shift: true,
120
- label: 'Ctrl+Shift+8',
121
- component: 'Editor',
122
- description: 'Toggle bullet list',
123
- scope: 'component',
120
+ label: "Ctrl+Shift+8",
121
+ component: "Editor",
122
+ description: "Toggle bullet list",
123
+ scope: "component",
124
124
  },
125
125
  EDITOR_ORDERED_LIST: {
126
- key: '7',
126
+ key: "7",
127
127
  meta: true,
128
128
  shift: true,
129
- label: 'Ctrl+Shift+7',
130
- component: 'Editor',
131
- description: 'Toggle ordered list',
132
- scope: 'component',
129
+ label: "Ctrl+Shift+7",
130
+ component: "Editor",
131
+ description: "Toggle ordered list",
132
+ scope: "component",
133
133
  },
134
134
  EDITOR_HEADING1: {
135
- key: '1',
135
+ key: "1",
136
136
  meta: true,
137
137
  alt: true,
138
- label: 'Ctrl+Alt+1',
139
- component: 'Editor',
140
- description: 'Toggle heading level 1',
141
- scope: 'component',
138
+ label: "Ctrl+Alt+1",
139
+ component: "Editor",
140
+ description: "Toggle heading level 1",
141
+ scope: "component",
142
142
  },
143
143
  EDITOR_HEADING2: {
144
- key: '2',
144
+ key: "2",
145
145
  meta: true,
146
146
  alt: true,
147
- label: 'Ctrl+Alt+2',
148
- component: 'Editor',
149
- description: 'Toggle heading level 2',
150
- scope: 'component',
147
+ label: "Ctrl+Alt+2",
148
+ component: "Editor",
149
+ description: "Toggle heading level 2",
150
+ scope: "component",
151
151
  },
152
152
  EDITOR_HEADING3: {
153
- key: '3',
153
+ key: "3",
154
154
  meta: true,
155
155
  alt: true,
156
- label: 'Ctrl+Alt+3',
157
- component: 'Editor',
158
- description: 'Toggle heading level 3',
159
- scope: 'component',
156
+ label: "Ctrl+Alt+3",
157
+ component: "Editor",
158
+ description: "Toggle heading level 3",
159
+ scope: "component",
160
160
  },
161
161
  EDITOR_BLOCKQUOTE: {
162
- key: 'b',
162
+ key: "b",
163
163
  meta: true,
164
164
  shift: true,
165
- label: 'Ctrl+Shift+B',
166
- component: 'Editor',
167
- description: 'Toggle blockquote',
168
- scope: 'component',
165
+ label: "Ctrl+Shift+B",
166
+ component: "Editor",
167
+ description: "Toggle blockquote",
168
+ scope: "component",
169
169
  },
170
170
  EDITOR_UNDO: {
171
- key: 'z',
171
+ key: "z",
172
172
  meta: true,
173
- label: 'Ctrl+Z',
174
- component: 'Editor',
175
- description: 'Undo last action',
176
- scope: 'component',
173
+ label: "Ctrl+Z",
174
+ component: "Editor",
175
+ description: "Undo last action",
176
+ scope: "component",
177
177
  },
178
178
  EDITOR_REDO: {
179
- key: 'z',
179
+ key: "z",
180
180
  meta: true,
181
181
  shift: true,
182
- label: 'Ctrl+Shift+Z',
183
- component: 'Editor',
184
- description: 'Redo last undone action',
185
- scope: 'component',
182
+ label: "Ctrl+Shift+Z",
183
+ component: "Editor",
184
+ description: "Redo last undone action",
185
+ scope: "component",
186
186
  },
187
187
 
188
188
  // ----- Prompt -----
189
189
  PROMPT_SUBMIT: {
190
- key: 'Enter',
191
- label: 'Enter',
192
- component: 'Prompt',
193
- description: 'Submit prompt (when submitOnEnter is true)',
194
- scope: 'component',
190
+ key: "Enter",
191
+ label: "Enter",
192
+ component: "Prompt",
193
+ description: "Submit prompt (when submitOnEnter is true)",
194
+ scope: "component",
195
195
  },
196
196
 
197
197
  // ----- NavigationMenu -----
198
198
  NAV_TOGGLE: {
199
- key: 'Enter',
200
- label: 'Enter',
201
- component: 'NavigationMenu',
202
- description: 'Toggle menu item open/closed',
203
- scope: 'component',
199
+ key: "Enter",
200
+ label: "Enter",
201
+ component: "NavigationMenu",
202
+ description: "Toggle menu item open/closed",
203
+ scope: "component",
204
204
  },
205
205
  NAV_CLOSE: {
206
- key: 'Escape',
207
- label: 'Escape',
208
- component: 'NavigationMenu',
209
- description: 'Close menu and return focus to trigger',
210
- scope: 'component',
206
+ key: "Escape",
207
+ label: "Escape",
208
+ component: "NavigationMenu",
209
+ description: "Close menu and return focus to trigger",
210
+ scope: "component",
211
211
  },
212
212
 
213
213
  // ----- Command -----
214
214
  COMMAND_SELECT: {
215
- key: 'Enter',
216
- label: 'Enter',
217
- component: 'Command',
218
- description: 'Select active command item',
219
- scope: 'component',
215
+ key: "Enter",
216
+ label: "Enter",
217
+ component: "Command",
218
+ description: "Select active command item",
219
+ scope: "component",
220
220
  },
221
221
 
222
222
  // ----- Collapsible -----
223
223
  COLLAPSIBLE_TOGGLE: {
224
- key: 'Enter',
225
- label: 'Enter',
226
- component: 'Collapsible',
227
- description: 'Toggle collapsible open/closed',
228
- scope: 'component',
224
+ key: "Enter",
225
+ label: "Enter",
226
+ component: "Collapsible",
227
+ description: "Toggle collapsible open/closed",
228
+ scope: "component",
229
229
  },
230
230
  } as const satisfies Record<string, KeyboardShortcut>;
231
231
 
@@ -268,17 +268,17 @@ export function matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut
268
268
  * Returns "⌘B" on Mac, "Ctrl+B" elsewhere.
269
269
  */
270
270
  export function getShortcutLabel(shortcut: KeyboardShortcut): string {
271
- if (typeof navigator === 'undefined') return shortcut.label;
271
+ if (typeof navigator === "undefined") return shortcut.label;
272
272
 
273
- const isMac = navigator.platform?.includes('Mac') || navigator.userAgent?.includes('Mac');
273
+ const isMac = navigator.platform?.includes("Mac") || navigator.userAgent?.includes("Mac");
274
274
  if (!isMac) return shortcut.label;
275
275
 
276
276
  const parts: string[] = [];
277
- if (shortcut.meta) parts.push('');
278
- if (shortcut.shift) parts.push('');
279
- if (shortcut.alt) parts.push('');
277
+ if (shortcut.meta) parts.push("");
278
+ if (shortcut.shift) parts.push("");
279
+ if (shortcut.alt) parts.push("");
280
280
  parts.push(shortcut.key.toUpperCase());
281
- return parts.join('');
281
+ return parts.join("");
282
282
  }
283
283
 
284
284
  /**
@@ -303,7 +303,10 @@ export function findConflicts(name: ShortcutName): KeyboardShortcut[] {
303
303
  /**
304
304
  * Get all registered shortcuts, optionally filtered by component or scope.
305
305
  */
306
- export function getShortcuts(filter?: { component?: string; scope?: 'global' | 'component' }): KeyboardShortcut[] {
306
+ export function getShortcuts(filter?: {
307
+ component?: string;
308
+ scope?: "global" | "component";
309
+ }): KeyboardShortcut[] {
307
310
  return (Object.values(KEYBOARD_SHORTCUTS) as KeyboardShortcut[]).filter((shortcut) => {
308
311
  if (filter?.component && shortcut.component !== filter.component) return false;
309
312
  if (filter?.scope && shortcut.scope !== filter.scope) return false;
@@ -316,25 +319,23 @@ export function getShortcuts(filter?: { component?: string; scope?: 'global' | '
316
319
  // ============================================
317
320
 
318
321
  /** Text-like input types where typing shortcuts should not fire global handlers */
319
- const TEXT_INPUT_TYPES = new Set([
320
- 'text', 'search', 'url', 'tel', 'email', 'password', 'number',
321
- ]);
322
+ const TEXT_INPUT_TYPES = new Set(["text", "search", "url", "tel", "email", "password", "number"]);
322
323
 
323
324
  /**
324
325
  * Check if an element is an editable area (input, textarea, contenteditable, role="textbox").
325
326
  * Global shortcuts should skip firing when the user is typing in one of these.
326
327
  */
327
328
  export function isEditableElement(element: Element | null): boolean {
328
- if (!element || !('tagName' in element)) return false;
329
+ if (!element || !("tagName" in element)) return false;
329
330
 
330
331
  const tag = element.tagName;
331
332
 
332
333
  // <textarea>
333
- if (tag === 'TEXTAREA') return true;
334
+ if (tag === "TEXTAREA") return true;
334
335
 
335
336
  // <input> with text-like type
336
- if (tag === 'INPUT') {
337
- const type = (element as HTMLInputElement).type?.toLowerCase() || 'text';
337
+ if (tag === "INPUT") {
338
+ const type = (element as HTMLInputElement).type?.toLowerCase() || "text";
338
339
  return TEXT_INPUT_TYPES.has(type);
339
340
  }
340
341
 
@@ -343,10 +344,11 @@ export function isEditableElement(element: Element | null): boolean {
343
344
  if (htmlEl.isContentEditable) return true;
344
345
  // Fallback: check attribute directly (isContentEditable can be unreliable for detached elements)
345
346
  const ceAttr = htmlEl.contentEditable;
346
- if (ceAttr === 'true' || ceAttr === '') return true;
347
+ if (ceAttr === "true" || ceAttr === "") return true;
347
348
 
348
349
  // role="textbox" (TipTap uses this)
349
- if (typeof element.getAttribute === 'function' && element.getAttribute('role') === 'textbox') return true;
350
+ if (typeof element.getAttribute === "function" && element.getAttribute("role") === "textbox")
351
+ return true;
350
352
 
351
353
  // Check ancestors for contenteditable (e.g., a <p> inside a [contenteditable] div)
352
354
  // Walk up manually because jsdom's closest doesn't reliably match property-set contentEditable
@@ -354,7 +356,7 @@ export function isEditableElement(element: Element | null): boolean {
354
356
  while (ancestor) {
355
357
  if ((ancestor as HTMLElement).isContentEditable) return true;
356
358
  const ancestorCe = (ancestor as HTMLElement).contentEditable;
357
- if (ancestorCe === 'true' || ancestorCe === '') return true;
359
+ if (ancestorCe === "true" || ancestorCe === "") return true;
358
360
  ancestor = ancestor.parentElement;
359
361
  }
360
362
 
@@ -390,7 +392,10 @@ const shortcutOverrides = new Map<ShortcutName, Partial<KeyboardShortcut> | null
390
392
  export function configureShortcuts(
391
393
  overrides: Partial<Record<ShortcutName, Partial<KeyboardShortcut> | null>>
392
394
  ): void {
393
- for (const [name, value] of Object.entries(overrides) as [ShortcutName, Partial<KeyboardShortcut> | null][]) {
395
+ for (const [name, value] of Object.entries(overrides) as [
396
+ ShortcutName,
397
+ Partial<KeyboardShortcut> | null,
398
+ ][]) {
394
399
  if (!(name in KEYBOARD_SHORTCUTS)) continue;
395
400
  if (value === undefined) continue;
396
401
  shortcutOverrides.set(name, value);
@@ -440,7 +445,7 @@ export interface UseKeyboardShortcutOptions {
440
445
  * - 'component': listens on `ref` element only
441
446
  * If omitted, uses the scope from the shortcut definition.
442
447
  */
443
- scope?: 'global' | 'component';
448
+ scope?: "global" | "component";
444
449
  /** Required when scope is 'component' — the element to attach the listener to */
445
450
  ref?: RefObject<Element | null>;
446
451
  }
@@ -487,16 +492,16 @@ export function useKeyboardShortcut({
487
492
  if (!matchesShortcut(e, resolved)) return;
488
493
 
489
494
  // Global shortcuts skip editable elements
490
- if (effectiveScope === 'global' && isEditableElement(e.target as Element)) return;
495
+ if (effectiveScope === "global" && isEditableElement(e.target as Element)) return;
491
496
 
492
497
  e.preventDefault();
493
498
  handlerRef.current();
494
499
  };
495
500
 
496
- const target = effectiveScope === 'component' ? ref?.current : document;
501
+ const target = effectiveScope === "component" ? ref?.current : document;
497
502
  if (!target) return;
498
503
 
499
- target.addEventListener('keydown', handleKeyDown as EventListener);
500
- return () => target.removeEventListener('keydown', handleKeyDown as EventListener);
504
+ target.addEventListener("keydown", handleKeyDown as EventListener);
505
+ return () => target.removeEventListener("keydown", handleKeyDown as EventListener);
501
506
  }, [name, enabled, scopeOverride, ref]);
502
507
  }
@@ -245,10 +245,14 @@ function hexToRgb(hex: string): { r: number; g: number; b: number } {
245
245
  if (!result) {
246
246
  throw new Error(`Invalid hex color: ${hex}`);
247
247
  }
248
+ const [, red, green, blue] = result;
249
+ if (!red || !green || !blue) {
250
+ throw new Error(`Invalid hex color: ${hex}`);
251
+ }
248
252
  return {
249
- r: parseInt(result[1], 16),
250
- g: parseInt(result[2], 16),
251
- b: parseInt(result[3], 16),
253
+ r: parseInt(red, 16),
254
+ g: parseInt(green, 16),
255
+ b: parseInt(blue, 16),
252
256
  };
253
257
  }
254
258
 
@@ -409,12 +413,12 @@ function interpolateShade(palette: PaletteShades, level: number): string {
409
413
  }
410
414
 
411
415
  // Find surrounding levels
412
- let lower = levels[0];
413
- let upper = levels[levels.length - 1];
416
+ let lower = 50;
417
+ let upper = 950;
414
418
 
415
419
  for (const l of levels) {
416
420
  if (l < level) lower = l;
417
- if (l > level && upper === levels[levels.length - 1]) upper = l;
421
+ if (l > level && upper === 950) upper = l;
418
422
  }
419
423
 
420
424
  const lowerColor = palette[lower as keyof PaletteShades];