@galaxy-io/dls 1.6.1 → 2.0.1

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 (540) hide show
  1. package/README.md +47 -50
  2. package/biome/index.json +74 -0
  3. package/biome/plugins/no-hex-literal.grit +20 -0
  4. package/biome/plugins/no-inline-style.grit +13 -0
  5. package/biome/plugins/no-margin.grit +9 -0
  6. package/biome/plugins/warn/no-hex-literal.grit +23 -0
  7. package/biome/plugins/warn/no-inline-style.grit +13 -0
  8. package/biome/plugins/warn/no-margin.grit +9 -0
  9. package/dist/a11y/FocusScope.d.ts +44 -0
  10. package/dist/a11y/FocusScope.js +229 -0
  11. package/dist/a11y/VisuallyHidden.d.ts +21 -0
  12. package/dist/a11y/VisuallyHidden.js +30 -0
  13. package/dist/avatar/Avatar.d.ts +56 -14
  14. package/dist/avatar/Avatar.js +250 -96
  15. package/dist/avatar/AvatarGroup.d.ts +43 -0
  16. package/dist/avatar/AvatarGroup.js +153 -0
  17. package/dist/backgrounds/GridBackground.d.ts +48 -0
  18. package/dist/backgrounds/GridBackground.js +146 -0
  19. package/dist/beacons/Beacon.d.ts +86 -22
  20. package/dist/beacons/Beacon.js +170 -47
  21. package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
  22. package/dist/brand/GalaxyFilamentWordmark.js +39 -0
  23. package/dist/brand/GalaxyLogomark.d.ts +26 -0
  24. package/dist/brand/GalaxyLogomark.js +41 -0
  25. package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
  26. package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
  27. package/dist/brand/GalaxyWordmark.d.ts +30 -0
  28. package/dist/brand/GalaxyWordmark.js +63 -0
  29. package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
  30. package/dist/brand/brandMark.d.ts +26 -0
  31. package/dist/brand/brandMark.js +35 -0
  32. package/dist/buttons/Button.d.ts +148 -59
  33. package/dist/buttons/Button.js +437 -227
  34. package/dist/buttons/ButtonGroup.d.ts +38 -0
  35. package/dist/buttons/ButtonGroup.js +68 -0
  36. package/dist/buttons/CopyButton.d.ts +77 -0
  37. package/dist/buttons/CopyButton.js +65 -0
  38. package/dist/charts/AreaChart.d.ts +49 -0
  39. package/dist/charts/AreaChart.js +31 -0
  40. package/dist/charts/BarChart.d.ts +54 -67
  41. package/dist/charts/BarChart.js +160 -124
  42. package/dist/charts/ChartAxis.d.ts +35 -40
  43. package/dist/charts/ChartAxis.js +114 -90
  44. package/dist/charts/ChartCategoryTargets.d.ts +12 -26
  45. package/dist/charts/ChartCategoryTargets.js +33 -20
  46. package/dist/charts/ChartFrame.d.ts +71 -116
  47. package/dist/charts/ChartFrame.js +306 -97
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +37 -48
  51. package/dist/charts/ChartLegend.js +243 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +34 -20
  54. package/dist/charts/ChartPrimitives.d.ts +50 -305
  55. package/dist/charts/ChartPrimitives.js +65 -413
  56. package/dist/charts/ChartTooltip.d.ts +20 -26
  57. package/dist/charts/ChartTooltip.js +77 -40
  58. package/dist/charts/Heatmap.d.ts +35 -0
  59. package/dist/charts/Heatmap.js +307 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +174 -121
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +159 -136
  64. package/dist/charts/Sparkline.d.ts +107 -0
  65. package/dist/charts/Sparkline.js +244 -0
  66. package/dist/charts/StatChart.d.ts +37 -13
  67. package/dist/charts/StatChart.js +82 -35
  68. package/dist/charts/barChartGeometry.d.ts +138 -86
  69. package/dist/charts/barChartGeometry.js +122 -101
  70. package/dist/charts/barChartLegend.d.ts +14 -18
  71. package/dist/charts/barChartLegend.js +18 -13
  72. package/dist/charts/chartFormat.d.ts +12 -18
  73. package/dist/charts/chartFormat.js +20 -52
  74. package/dist/charts/chartPalette.d.ts +33 -0
  75. package/dist/charts/chartPalette.js +68 -0
  76. package/dist/charts/chartScales.d.ts +41 -108
  77. package/dist/charts/chartScales.js +62 -128
  78. package/dist/charts/chartSelection.d.ts +15 -0
  79. package/dist/charts/chartSelection.js +22 -0
  80. package/dist/charts/constants.d.ts +100 -256
  81. package/dist/charts/constants.js +109 -275
  82. package/dist/charts/heatmapGeometry.d.ts +95 -0
  83. package/dist/charts/heatmapGeometry.js +155 -0
  84. package/dist/charts/lineChartGeometry.d.ts +108 -58
  85. package/dist/charts/lineChartGeometry.js +120 -78
  86. package/dist/charts/pieChartGeometry.d.ts +66 -40
  87. package/dist/charts/pieChartGeometry.js +68 -38
  88. package/dist/charts/types.d.ts +206 -466
  89. package/dist/charts/types.js +55 -144
  90. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  91. package/dist/charts/useCartesianChartLayout.js +47 -32
  92. package/dist/charts/useChartDimensions.d.ts +19 -40
  93. package/dist/charts/useChartDimensions.js +40 -56
  94. package/dist/charts/useChartFormatters.d.ts +6 -15
  95. package/dist/charts/useChartFormatters.js +4 -9
  96. package/dist/charts/useChartInteraction.d.ts +69 -116
  97. package/dist/charts/useChartInteraction.js +148 -78
  98. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  99. package/dist/charts/useChartTooltipPosition.js +14 -5
  100. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  101. package/dist/charts/useSeriesColorResolver.js +19 -12
  102. package/dist/chips/Chip.d.ts +155 -44
  103. package/dist/chips/Chip.js +329 -155
  104. package/dist/chips/ChipGroup.d.ts +53 -0
  105. package/dist/chips/ChipGroup.js +98 -0
  106. package/dist/drawer/Drawer.d.ts +83 -17
  107. package/dist/drawer/Drawer.js +399 -65
  108. package/dist/dropdown/Dropdown.d.ts +80 -63
  109. package/dist/dropdown/Dropdown.js +127 -129
  110. package/dist/editor/CodeEditor.d.ts +119 -40
  111. package/dist/editor/CodeEditor.js +490 -400
  112. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  113. package/dist/editor/CodeEditorReactWidget.js +28 -21
  114. package/dist/feedback/Alert.d.ts +49 -0
  115. package/dist/feedback/Alert.js +172 -0
  116. package/dist/feedback/EmptyState.d.ts +39 -0
  117. package/dist/feedback/EmptyState.js +109 -0
  118. package/dist/feedback/ProgressBar.d.ts +125 -0
  119. package/dist/feedback/ProgressBar.js +183 -0
  120. package/dist/feedback/ProgressCircle.d.ts +99 -0
  121. package/dist/feedback/ProgressCircle.js +187 -0
  122. package/dist/feedback/Skeleton.d.ts +69 -0
  123. package/dist/feedback/Skeleton.js +130 -0
  124. package/dist/feedback/Spinner.d.ts +63 -0
  125. package/dist/feedback/Spinner.js +141 -0
  126. package/dist/fonts.css +70 -0
  127. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  128. package/dist/hooks/internal/useIsClient.js +14 -0
  129. package/dist/hooks/useClipboard.d.ts +19 -0
  130. package/dist/hooks/useClipboard.js +45 -0
  131. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  132. package/dist/hooks/useControlledOpenState.js +19 -0
  133. package/dist/hooks/useControlledState.d.ts +19 -0
  134. package/dist/hooks/useControlledState.js +22 -0
  135. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  136. package/dist/hooks/useDebouncedValue.js +33 -0
  137. package/dist/hooks/useDisclosure.d.ts +26 -0
  138. package/dist/hooks/useDisclosure.js +36 -0
  139. package/dist/hooks/useDismiss.d.ts +23 -27
  140. package/dist/hooks/useDismiss.js +39 -27
  141. package/dist/hooks/useElementClientSize.d.ts +10 -10
  142. package/dist/hooks/useElementClientSize.js +8 -11
  143. package/dist/hooks/useElementWidth.d.ts +6 -13
  144. package/dist/hooks/useElementWidth.js +6 -14
  145. package/dist/hooks/useField.d.ts +47 -0
  146. package/dist/hooks/useField.js +40 -0
  147. package/dist/hooks/useHotkey.d.ts +77 -0
  148. package/dist/hooks/useHotkey.js +246 -0
  149. package/dist/hooks/useIsMac.d.ts +12 -0
  150. package/dist/hooks/useIsMac.js +27 -0
  151. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  152. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  153. package/dist/hooks/useLocalStorage.d.ts +28 -0
  154. package/dist/hooks/useLocalStorage.js +145 -0
  155. package/dist/hooks/useMediaQuery.d.ts +11 -0
  156. package/dist/hooks/useMediaQuery.js +23 -0
  157. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  158. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  159. package/dist/hooks/useResize.d.ts +42 -62
  160. package/dist/hooks/useResize.js +43 -31
  161. package/dist/icons/Icon.d.ts +64 -37
  162. package/dist/icons/Icon.js +96 -37
  163. package/dist/icons/internal/IconSlot.d.ts +10 -0
  164. package/dist/icons/internal/IconSlot.js +32 -0
  165. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  166. package/dist/inputs/CheckboxGroup.js +183 -0
  167. package/dist/inputs/CheckboxInput.d.ts +98 -28
  168. package/dist/inputs/CheckboxInput.js +218 -88
  169. package/dist/inputs/ColorInput.d.ts +115 -29
  170. package/dist/inputs/ColorInput.js +748 -326
  171. package/dist/inputs/CopyInput.d.ts +49 -20
  172. package/dist/inputs/CopyInput.js +57 -49
  173. package/dist/inputs/CronInput.d.ts +94 -0
  174. package/dist/inputs/CronInput.js +618 -0
  175. package/dist/inputs/DateInput.d.ts +175 -28
  176. package/dist/inputs/DateInput.js +1109 -451
  177. package/dist/inputs/DurationInput.d.ts +101 -0
  178. package/dist/inputs/DurationInput.js +441 -0
  179. package/dist/inputs/Field.d.ts +75 -0
  180. package/dist/inputs/Field.js +247 -0
  181. package/dist/inputs/Fieldset.d.ts +53 -0
  182. package/dist/inputs/Fieldset.js +149 -0
  183. package/dist/inputs/FileInput.d.ts +110 -0
  184. package/dist/inputs/FileInput.js +476 -0
  185. package/dist/inputs/Input.d.ts +148 -187
  186. package/dist/inputs/Input.js +339 -259
  187. package/dist/inputs/KeyValueInput.d.ts +120 -0
  188. package/dist/inputs/KeyValueInput.js +383 -0
  189. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  190. package/dist/inputs/MultiSelectInput.js +175 -559
  191. package/dist/inputs/NumberInput.d.ts +65 -9
  192. package/dist/inputs/NumberInput.js +197 -40
  193. package/dist/inputs/PasswordInput.d.ts +17 -12
  194. package/dist/inputs/PasswordInput.js +33 -33
  195. package/dist/inputs/PinInput.d.ts +117 -0
  196. package/dist/inputs/PinInput.js +364 -0
  197. package/dist/inputs/RadioGroup.d.ts +115 -0
  198. package/dist/inputs/RadioGroup.js +179 -0
  199. package/dist/inputs/RadioInput.d.ts +87 -24
  200. package/dist/inputs/RadioInput.js +182 -95
  201. package/dist/inputs/SearchInput.d.ts +66 -0
  202. package/dist/inputs/SearchInput.js +156 -0
  203. package/dist/inputs/SelectInput.d.ts +195 -55
  204. package/dist/inputs/SelectInput.js +1308 -446
  205. package/dist/inputs/SliderInput.d.ts +150 -30
  206. package/dist/inputs/SliderInput.js +441 -186
  207. package/dist/inputs/SwitchInput.d.ts +109 -0
  208. package/dist/inputs/SwitchInput.js +248 -0
  209. package/dist/inputs/TagInput.d.ts +117 -0
  210. package/dist/inputs/TagInput.js +408 -0
  211. package/dist/inputs/TextAreaInput.d.ts +146 -44
  212. package/dist/inputs/TextAreaInput.js +298 -198
  213. package/dist/inputs/TextInput.d.ts +4 -13
  214. package/dist/inputs/TextInput.js +13 -48
  215. package/dist/inputs/ToggleInput.d.ts +120 -22
  216. package/dist/inputs/ToggleInput.js +262 -116
  217. package/dist/inputs/internal/bareField.d.ts +18 -0
  218. package/dist/inputs/internal/bareField.js +38 -0
  219. package/dist/inputs/internal/devWarn.d.ts +7 -0
  220. package/dist/inputs/internal/devWarn.js +30 -0
  221. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  222. package/dist/inputs/internal/fieldFrame.js +64 -0
  223. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  224. package/dist/inputs/internal/fieldWiring.js +38 -0
  225. package/dist/inputs/internal/innerButton.d.ts +2 -0
  226. package/dist/inputs/internal/innerButton.js +24 -0
  227. package/dist/inputs/internal/ownField.d.ts +45 -0
  228. package/dist/inputs/internal/ownField.js +58 -0
  229. package/dist/inputs/internal/predicates.d.ts +9 -0
  230. package/dist/inputs/internal/predicates.js +11 -0
  231. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  232. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  233. package/dist/json/JsonViewer.d.ts +62 -0
  234. package/dist/json/JsonViewer.js +483 -0
  235. package/dist/layout/Box.d.ts +87 -0
  236. package/dist/layout/Box.js +109 -0
  237. package/dist/layout/Divider.d.ts +25 -0
  238. package/dist/layout/Divider.js +70 -0
  239. package/dist/layout/Flex.d.ts +139 -0
  240. package/dist/layout/Flex.js +165 -0
  241. package/dist/layout/FlexItem.d.ts +72 -0
  242. package/dist/layout/FlexItem.js +84 -0
  243. package/dist/layout/Grid.d.ts +140 -0
  244. package/dist/layout/Grid.js +178 -0
  245. package/dist/layout/Portal.d.ts +29 -0
  246. package/dist/layout/Portal.js +27 -0
  247. package/dist/layout/ResizablePanels.d.ts +88 -0
  248. package/dist/layout/ResizablePanels.js +198 -0
  249. package/dist/layout/ResizeHandle.d.ts +48 -0
  250. package/dist/layout/ResizeHandle.js +143 -0
  251. package/dist/layout/ScrollArea.d.ts +30 -0
  252. package/dist/layout/ScrollArea.js +138 -0
  253. package/dist/links/Link.d.ts +101 -1
  254. package/dist/links/Link.js +166 -4
  255. package/dist/lists/BulletedList.d.ts +25 -7
  256. package/dist/lists/BulletedList.js +72 -27
  257. package/dist/lists/DescriptionList.d.ts +91 -0
  258. package/dist/lists/DescriptionList.js +147 -0
  259. package/dist/menu/ContextMenu.d.ts +64 -0
  260. package/dist/menu/ContextMenu.js +34 -0
  261. package/dist/menu/Menu.d.ts +280 -0
  262. package/dist/menu/Menu.js +1003 -0
  263. package/dist/modal/ConfirmDialog.d.ts +55 -0
  264. package/dist/modal/ConfirmDialog.js +151 -0
  265. package/dist/modal/Modal.d.ts +64 -14
  266. package/dist/modal/Modal.js +189 -48
  267. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  268. package/dist/navigation/Breadcrumbs.js +243 -0
  269. package/dist/navigation/CommandPalette.d.ts +83 -0
  270. package/dist/navigation/CommandPalette.js +509 -0
  271. package/dist/navigation/Pagination.d.ts +87 -0
  272. package/dist/navigation/Pagination.js +300 -0
  273. package/dist/navigation/SidebarNav.d.ts +107 -0
  274. package/dist/navigation/SidebarNav.js +341 -0
  275. package/dist/navigation/Stepper.d.ts +52 -0
  276. package/dist/navigation/Stepper.js +207 -0
  277. package/dist/navigation/Tabs.d.ts +113 -0
  278. package/dist/navigation/Tabs.js +543 -0
  279. package/dist/navigation/Topbar.d.ts +20 -0
  280. package/dist/navigation/Topbar.js +62 -0
  281. package/dist/overlay/OverlayProvider.d.ts +28 -32
  282. package/dist/overlay/OverlayProvider.js +42 -93
  283. package/dist/overlay/useOverlay.d.ts +88 -12
  284. package/dist/overlay/useOverlay.js +220 -43
  285. package/dist/overlays/Popover.d.ts +114 -0
  286. package/dist/overlays/Popover.js +389 -0
  287. package/dist/shapes/Circle.d.ts +84 -8
  288. package/dist/shapes/Circle.js +122 -20
  289. package/dist/shapes/Square.d.ts +84 -8
  290. package/dist/shapes/Square.js +123 -20
  291. package/dist/styles/mixins.d.ts +35 -0
  292. package/dist/styles/mixins.js +60 -0
  293. package/dist/styles.css +1 -202
  294. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  295. package/dist/table/InfiniteSpreadsheet.js +762 -225
  296. package/dist/table/InfiniteTable.d.ts +116 -14
  297. package/dist/table/InfiniteTable.js +287 -429
  298. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  299. package/dist/table/SpreadsheetCellEditor.js +163 -84
  300. package/dist/table/TableCore.d.ts +252 -0
  301. package/dist/table/TableCore.js +1082 -0
  302. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  303. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  304. package/dist/table/types.d.ts +66 -244
  305. package/dist/table/types.js +0 -51
  306. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  307. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  308. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  309. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  310. package/dist/table/useTableColumnLayout.d.ts +90 -25
  311. package/dist/table/useTableColumnLayout.js +255 -50
  312. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  313. package/dist/table/useTableKeyboardNavigation.js +95 -71
  314. package/dist/table/useTableRowSelection.d.ts +24 -25
  315. package/dist/table/useTableRowSelection.js +57 -84
  316. package/dist/table/useTableVirtualizer.d.ts +20 -0
  317. package/dist/table/useTableVirtualizer.js +48 -0
  318. package/dist/text/Bold.d.ts +5 -6
  319. package/dist/text/Bold.js +16 -15
  320. package/dist/text/Code.d.ts +5 -6
  321. package/dist/text/Code.js +16 -25
  322. package/dist/text/CodeBlock.d.ts +77 -0
  323. package/dist/text/CodeBlock.js +373 -0
  324. package/dist/text/EditableText.d.ts +55 -15
  325. package/dist/text/EditableText.js +153 -135
  326. package/dist/text/Ellipsis.d.ts +34 -8
  327. package/dist/text/Ellipsis.js +55 -23
  328. package/dist/text/Kbd.d.ts +72 -0
  329. package/dist/text/Kbd.js +284 -0
  330. package/dist/text/MarkdownText.d.ts +27 -10
  331. package/dist/text/MarkdownText.js +317 -300
  332. package/dist/text/RequiredMarker.d.ts +17 -5
  333. package/dist/text/RequiredMarker.js +34 -36
  334. package/dist/text/Selectable.d.ts +5 -6
  335. package/dist/text/Selectable.js +16 -13
  336. package/dist/text/Span.d.ts +82 -0
  337. package/dist/text/Span.js +115 -0
  338. package/dist/text/Text.d.ts +128 -41
  339. package/dist/text/Text.js +209 -76
  340. package/dist/theme/GalaxyProvider.d.ts +75 -0
  341. package/dist/theme/GalaxyProvider.js +223 -0
  342. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  343. package/dist/theme/ThemeSwitcher.js +94 -0
  344. package/dist/theme/enums.d.ts +118 -0
  345. package/dist/theme/enums.js +144 -0
  346. package/dist/theme/tokens/dark.d.ts +2 -0
  347. package/dist/theme/tokens/dark.js +275 -0
  348. package/dist/theme/tokens/generate.d.ts +15 -0
  349. package/dist/theme/tokens/generate.js +47 -0
  350. package/dist/theme/tokens/light.d.ts +2 -0
  351. package/dist/theme/tokens/light.js +274 -0
  352. package/dist/theme/tokens/palette.d.ts +14 -0
  353. package/dist/theme/tokens/palette.js +153 -0
  354. package/dist/theme/tokens/scales.d.ts +26 -0
  355. package/dist/theme/tokens/scales.js +154 -0
  356. package/dist/theme/tokens/t.d.ts +3 -0
  357. package/dist/theme/tokens/t.js +25 -0
  358. package/dist/theme/tokens/types.d.ts +189 -0
  359. package/dist/theme/tokens/types.js +0 -0
  360. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  361. package/dist/theme/useGalaxyTheme.js +36 -0
  362. package/dist/theme/useInverseScope.d.ts +18 -0
  363. package/dist/theme/useInverseScope.js +33 -0
  364. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  365. package/dist/three/GalaxyLogomark3D.js +134 -0
  366. package/dist/three/assets/galaxy-logomark.js +4 -0
  367. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  368. package/dist/three/galaxyLogomark3DScene.js +165 -0
  369. package/dist/timeline/Timeline.d.ts +120 -0
  370. package/dist/timeline/Timeline.js +301 -0
  371. package/dist/toast/Toast.d.ts +43 -19
  372. package/dist/toast/Toast.js +130 -89
  373. package/dist/toast/ToastProvider.d.ts +23 -23
  374. package/dist/toast/ToastProvider.js +298 -101
  375. package/dist/toast/ToastViewport.d.ts +12 -0
  376. package/dist/toast/ToastViewport.js +210 -0
  377. package/dist/toast/useToast.d.ts +139 -5
  378. package/dist/toast/useToast.js +15 -13
  379. package/dist/tokens.css +654 -0
  380. package/dist/tooltip/Tooltip.d.ts +64 -44
  381. package/dist/tooltip/Tooltip.js +280 -73
  382. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  383. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  384. package/dist/transform/Fade.d.ts +33 -11
  385. package/dist/transform/Fade.js +71 -19
  386. package/dist/transform/Flasher.d.ts +25 -0
  387. package/dist/transform/Flasher.js +39 -0
  388. package/dist/transform/Rotate.d.ts +24 -12
  389. package/dist/transform/Rotate.js +36 -22
  390. package/dist/transform/ScaleFade.d.ts +36 -11
  391. package/dist/transform/ScaleFade.js +86 -28
  392. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  393. package/dist/transform/internal/CollapseMotion.js +65 -0
  394. package/dist/tree/Tree.d.ts +85 -0
  395. package/dist/tree/Tree.js +387 -0
  396. package/dist/tree/treeRow.d.ts +39 -0
  397. package/dist/tree/treeRow.js +75 -0
  398. package/dist/utils/colors.d.ts +46 -13
  399. package/dist/utils/colors.js +92 -34
  400. package/dist/utils/css.d.ts +23 -0
  401. package/dist/utils/css.js +30 -0
  402. package/dist/utils/format.d.ts +58 -0
  403. package/dist/utils/format.js +220 -0
  404. package/dist/vite/index.d.ts +16 -0
  405. package/dist/vite/index.js +52 -0
  406. package/dist/widget/Widget.d.ts +164 -48
  407. package/dist/widget/Widget.js +335 -96
  408. package/dist/widget/WidgetGroup.d.ts +36 -0
  409. package/dist/widget/WidgetGroup.js +103 -0
  410. package/package.json +855 -157
  411. package/dist/accordion/Accordion.d.ts +0 -54
  412. package/dist/accordion/Accordion.js +0 -183
  413. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  415. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  416. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  417. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  419. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  420. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  421. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  423. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  424. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  425. package/dist/assets/models/galaxy-animation.js +0 -136666
  426. package/dist/assets/models/galaxy-logomark.js +0 -4
  427. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  428. package/dist/avatar/AvatarShimmer.js +0 -22
  429. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  430. package/dist/backgrounds/CellGridBackground.js +0 -44
  431. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  432. package/dist/backgrounds/CrossGridBackground.js +0 -49
  433. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  434. package/dist/backgrounds/DotGridBackground.js +0 -47
  435. package/dist/badge/Badge.d.ts +0 -42
  436. package/dist/badge/Badge.js +0 -99
  437. package/dist/charts/ChartEmptyState.d.ts +0 -17
  438. package/dist/charts/ChartEmptyState.js +0 -29
  439. package/dist/charts/ProgressBar.d.ts +0 -29
  440. package/dist/charts/ProgressBar.js +0 -65
  441. package/dist/charts/chartTheme.d.ts +0 -18
  442. package/dist/charts/chartTheme.js +0 -26
  443. package/dist/containers/FlexItem.d.ts +0 -50
  444. package/dist/containers/FlexItem.js +0 -91
  445. package/dist/containers/FlexWrapper.d.ts +0 -96
  446. package/dist/containers/FlexWrapper.js +0 -143
  447. package/dist/containers/GridWrapper.d.ts +0 -79
  448. package/dist/containers/GridWrapper.js +0 -125
  449. package/dist/containers/Spacing.d.ts +0 -23
  450. package/dist/containers/Spacing.js +0 -59
  451. package/dist/containers/Wrapper.d.ts +0 -26
  452. package/dist/containers/Wrapper.js +0 -54
  453. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  454. package/dist/dividers/HorizontalDivider.js +0 -39
  455. package/dist/dividers/VerticalDivider.d.ts +0 -6
  456. package/dist/dividers/VerticalDivider.js +0 -21
  457. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  458. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  459. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  460. package/dist/icons/GalaxyLogomark.js +0 -27
  461. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  462. package/dist/icons/GalaxyLogomark3D.js +0 -319
  463. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  464. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  465. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  466. package/dist/icons/GalaxyWordmark.js +0 -25
  467. package/dist/inputs/MultiTextInput.d.ts +0 -32
  468. package/dist/inputs/MultiTextInput.js +0 -180
  469. package/dist/inputs/SwitcherInput.d.ts +0 -30
  470. package/dist/inputs/SwitcherInput.js +0 -81
  471. package/dist/inputs/hooks.d.ts +0 -10
  472. package/dist/inputs/hooks.js +0 -22
  473. package/dist/overlay/constants.d.ts +0 -28
  474. package/dist/overlay/constants.js +0 -37
  475. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  476. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  477. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  478. package/dist/resizable/VerticalResizeHandle.js +0 -39
  479. package/dist/table/SpreadsheetCell.d.ts +0 -21
  480. package/dist/table/SpreadsheetCell.js +0 -71
  481. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  482. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  483. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  484. package/dist/table/SpreadsheetMenuItem.js +0 -33
  485. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  486. package/dist/table/SpreadsheetPrimitives.js +0 -105
  487. package/dist/table/SpreadsheetRow.d.ts +0 -33
  488. package/dist/table/SpreadsheetRow.js +0 -73
  489. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  490. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  491. package/dist/table/TableExpandCell.d.ts +0 -11
  492. package/dist/table/TableExpandCell.js +0 -24
  493. package/dist/table/TableExpandedRow.d.ts +0 -16
  494. package/dist/table/TableExpandedRow.js +0 -77
  495. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  496. package/dist/table/TableHeaderCellContent.js +0 -48
  497. package/dist/table/TablePrimitives.d.ts +0 -313
  498. package/dist/table/TablePrimitives.js +0 -302
  499. package/dist/table/TableSelectCell.d.ts +0 -18
  500. package/dist/table/TableSelectCell.js +0 -27
  501. package/dist/table/TableStatusRow.d.ts +0 -18
  502. package/dist/table/TableStatusRow.js +0 -50
  503. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  504. package/dist/table/useSpreadsheetEditing.js +0 -41
  505. package/dist/table/useTableColumnResize.d.ts +0 -38
  506. package/dist/table/useTableColumnResize.js +0 -155
  507. package/dist/table/useTableRowExpansion.d.ts +0 -24
  508. package/dist/table/useTableRowExpansion.js +0 -62
  509. package/dist/table/utils.d.ts +0 -50
  510. package/dist/table/utils.js +0 -78
  511. package/dist/text/HotKeys.d.ts +0 -30
  512. package/dist/text/HotKeys.js +0 -74
  513. package/dist/text/Paragraph.d.ts +0 -33
  514. package/dist/text/Paragraph.js +0 -83
  515. package/dist/text/TextShimmer.d.ts +0 -14
  516. package/dist/text/TextShimmer.js +0 -34
  517. package/dist/theme/GalaxyTheme.d.ts +0 -67
  518. package/dist/theme/GalaxyTheme.js +0 -119
  519. package/dist/theme/constants.d.ts +0 -8
  520. package/dist/theme/constants.js +0 -38
  521. package/dist/theme/index.d.ts +0 -6
  522. package/dist/theme/index.js +0 -7
  523. package/dist/theme/types.d.ts +0 -195
  524. package/dist/theme/types.js +0 -10
  525. package/dist/theme/typography.d.ts +0 -2
  526. package/dist/theme/typography.js +0 -73
  527. package/dist/theme/variants/dark.d.ts +0 -2
  528. package/dist/theme/variants/dark.js +0 -125
  529. package/dist/theme/variants/light.d.ts +0 -2
  530. package/dist/theme/variants/light.js +0 -125
  531. package/dist/toast/ToastContainer.d.ts +0 -10
  532. package/dist/toast/ToastContainer.js +0 -31
  533. package/dist/toast/ToastWrapper.d.ts +0 -6
  534. package/dist/toast/ToastWrapper.js +0 -27
  535. package/dist/transform/Flash.d.ts +0 -7
  536. package/dist/transform/Flash.js +0 -18
  537. package/dist/transform/Spin.d.ts +0 -14
  538. package/dist/transform/Spin.js +0 -25
  539. package/dist/utils/linaria.d.ts +0 -1
  540. package/dist/utils/linaria.js +0 -8
@@ -1,43 +1,55 @@
1
1
  import { useEffect, useRef } from "react";
2
- import { useHotkeys } from "react-hotkeys-hook";
3
2
  //#region src/hooks/useDismiss.ts
3
+ /** Focus in one of these keeps Escape for the field (clearing a search, cancelling an edit). */
4
+ var isEditableTarget = (target) => {
5
+ if (!(target instanceof HTMLElement)) return false;
6
+ const tag = target.tagName;
7
+ return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || target.isContentEditable;
8
+ };
4
9
  /**
5
- * Closes a floating element on Escape or a click outside it. Returns the ref to
6
- * attach to the element you want to keep open.
10
+ * Dismisses an app-built floating element on Escape or on a mousedown outside it. Returns the ref
11
+ * to attach to the element that should stay open. DLS overlays (Popover, Modal, Drawer, Menu,
12
+ * Tooltip, Toast) dismiss themselves through the overlay stack and never need this hook.
13
+ *
14
+ * Every mounted `useDismiss` hears every Escape (its own `document` listener, no shortcut
15
+ * registry), except one an open DLS overlay has already consumed (the overlay stack calls
16
+ * `preventDefault()`; mount order decides which listener runs first). SSR-safe: listeners attach
17
+ * in effects only.
7
18
  *
8
- * Accepts either a bare handler or an options object as the first argument.
19
+ * @example
20
+ * const ref = useDismiss<HTMLDivElement>({ onDismiss: () => onOpenChange(false), isEnabled: isOpen });
21
+ * return <div ref={ref}>…</div>;
9
22
  */
10
- var useDismiss = (handlerOrOptions, options) => {
11
- const isOptionsOnly = typeof handlerOrOptions !== "function";
12
- const handler = isOptionsOnly ? void 0 : handlerOrOptions;
13
- const { excludeRefs, enableEscape = true, enableClickOutside = true, enabled = true, onDismiss } = (isOptionsOnly ? handlerOrOptions : options) || {};
23
+ function useDismiss({ onDismiss, isEnabled = true, shouldCloseOnEscape = true, shouldCloseOnOutsideClick = true, excludeRefs }) {
14
24
  const ref = useRef(null);
15
- const dismissHandler = onDismiss ?? handler;
16
- const handlerRef = useRef(dismissHandler);
25
+ const onDismissRef = useRef(onDismiss);
17
26
  const excludeRefsRef = useRef(excludeRefs);
18
27
  useEffect(() => {
19
- handlerRef.current = dismissHandler;
28
+ onDismissRef.current = onDismiss;
20
29
  excludeRefsRef.current = excludeRefs;
21
- }, [dismissHandler, excludeRefs]);
30
+ }, [onDismiss, excludeRefs]);
22
31
  useEffect(() => {
23
- if (!enabled || !enableClickOutside) return;
24
- const handleClickOutside = (event) => {
32
+ if (!isEnabled || !shouldCloseOnOutsideClick) return;
33
+ const handleMouseDown = (event) => {
25
34
  const target = event.target;
26
- if (ref.current && ref.current.contains(target)) return;
27
- if (excludeRefsRef.current) {
28
- for (const excludeRef of excludeRefsRef.current) if (excludeRef.current && excludeRef.current.contains(target)) return;
29
- }
30
- if (handlerRef.current) handlerRef.current();
35
+ if (ref.current?.contains(target)) return;
36
+ for (const excludeRef of excludeRefsRef.current ?? []) if (excludeRef.current?.contains(target)) return;
37
+ onDismissRef.current?.();
31
38
  };
32
- document.addEventListener("mousedown", handleClickOutside);
33
- return () => {
34
- document.removeEventListener("mousedown", handleClickOutside);
39
+ document.addEventListener("mousedown", handleMouseDown);
40
+ return () => document.removeEventListener("mousedown", handleMouseDown);
41
+ }, [isEnabled, shouldCloseOnOutsideClick]);
42
+ useEffect(() => {
43
+ if (!isEnabled || !shouldCloseOnEscape) return;
44
+ const handleKeyDown = (event) => {
45
+ if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
46
+ if (isEditableTarget(event.target)) return;
47
+ onDismissRef.current?.();
35
48
  };
36
- }, [enabled, enableClickOutside]);
37
- useHotkeys("esc", () => {
38
- if (enabled && handlerRef.current) handlerRef.current();
39
- }, { enabled: enabled && enableEscape }, [enabled, enableEscape]);
49
+ document.addEventListener("keydown", handleKeyDown);
50
+ return () => document.removeEventListener("keydown", handleKeyDown);
51
+ }, [isEnabled, shouldCloseOnEscape]);
40
52
  return ref;
41
- };
53
+ }
42
54
  //#endregion
43
55
  export { useDismiss };
@@ -1,20 +1,20 @@
1
+ import { type RefObject } from "react";
1
2
  /** Measured client size. Both fields are `undefined` before the first measurement. */
2
3
  export interface ElementClientSize {
4
+ /** `clientWidth` in pixels, or `undefined` before the first measurement. */
3
5
  width: number | undefined;
6
+ /** `clientHeight` in pixels, or `undefined` before the first measurement. */
4
7
  height: number | undefined;
5
8
  }
6
9
  /**
7
- * Hook that tracks an element's *client* size — the padding box, excluding
8
- * scrollbars and borders.
10
+ * Tracks an element's *client* size — the padding box, excluding scrollbars and borders.
9
11
  *
10
- * Use this instead of {@link useElementWidth} when the measurement drives
11
- * something that must line up with the scrollport (a sticky overlay, a
12
- * viewport-width panel). `useElementWidth` measures the border box via
13
- * `getBoundingClientRect`, which includes the scrollbar gutter and would make
14
- * such an element overhang.
12
+ * Use this instead of `useElementWidth` when the measurement drives something that must line up
13
+ * with the scrollport (a sticky overlay, a viewport-width panel). `useElementWidth` measures the
14
+ * border box via `getBoundingClientRect`, which includes the scrollbar gutter and would make such
15
+ * an element overhang. SSR-safe: measures in an effect, `undefined` on the server.
15
16
  *
16
17
  * @param ref - A ref to the element to measure
17
- * @returns The current client width/height in pixels, or undefined before the
18
- * first measurement
18
+ * @returns The current client width/height in pixels, or undefined before the first measurement
19
19
  */
20
- export declare const useElementClientSize: (ref: React.RefObject<HTMLElement | null>) => ElementClientSize;
20
+ export declare function useElementClientSize(ref: RefObject<HTMLElement | null>): ElementClientSize;
@@ -1,20 +1,17 @@
1
1
  import { useEffect, useState } from "react";
2
2
  //#region src/hooks/useElementClientSize.ts
3
3
  /**
4
- * Hook that tracks an element's *client* size — the padding box, excluding
5
- * scrollbars and borders.
4
+ * Tracks an element's *client* size — the padding box, excluding scrollbars and borders.
6
5
  *
7
- * Use this instead of {@link useElementWidth} when the measurement drives
8
- * something that must line up with the scrollport (a sticky overlay, a
9
- * viewport-width panel). `useElementWidth` measures the border box via
10
- * `getBoundingClientRect`, which includes the scrollbar gutter and would make
11
- * such an element overhang.
6
+ * Use this instead of `useElementWidth` when the measurement drives something that must line up
7
+ * with the scrollport (a sticky overlay, a viewport-width panel). `useElementWidth` measures the
8
+ * border box via `getBoundingClientRect`, which includes the scrollbar gutter and would make such
9
+ * an element overhang. SSR-safe: measures in an effect, `undefined` on the server.
12
10
  *
13
11
  * @param ref - A ref to the element to measure
14
- * @returns The current client width/height in pixels, or undefined before the
15
- * first measurement
12
+ * @returns The current client width/height in pixels, or undefined before the first measurement
16
13
  */
17
- var useElementClientSize = (ref) => {
14
+ function useElementClientSize(ref) {
18
15
  const [size, setSize] = useState({
19
16
  width: void 0,
20
17
  height: void 0
@@ -38,6 +35,6 @@ var useElementClientSize = (ref) => {
38
35
  return () => observer.disconnect();
39
36
  }, [ref]);
40
37
  return size;
41
- };
38
+ }
42
39
  //#endregion
43
40
  export { useElementClientSize };
@@ -1,6 +1,8 @@
1
+ import { type RefObject } from "react";
1
2
  /**
2
- * Hook that measures and tracks the width of an element using ResizeObserver.
3
- * Returns undefined until the first measurement is complete.
3
+ * Measures and tracks an element's border-box width (`getBoundingClientRect().width`) with a
4
+ * `ResizeObserver`. Returns `undefined` until the first measurement. SSR-safe: measures in an
5
+ * effect, `undefined` on the server.
4
6
  *
5
7
  * @param ref - A ref to the element to measure
6
8
  * @returns The current width of the element in pixels, or undefined if not yet measured
@@ -8,15 +10,6 @@
8
10
  * @example
9
11
  * const containerRef = useRef<HTMLDivElement>(null);
10
12
  * const width = useElementWidth(containerRef);
11
- *
12
- * if (width === undefined) {
13
- * return <div ref={containerRef} />;
14
- * }
15
- *
16
- * return (
17
- * <div ref={containerRef}>
18
- * <Chart width={width} />
19
- * </div>
20
- * );
13
+ * return <div ref={containerRef}>{width === undefined ? null : <Chart width={width} />}</div>;
21
14
  */
22
- export declare const useElementWidth: (ref: React.RefObject<HTMLElement | null>) => number | undefined;
15
+ export declare function useElementWidth(ref: RefObject<HTMLElement | null>): number | undefined;
@@ -1,8 +1,9 @@
1
1
  import { useEffect, useState } from "react";
2
2
  //#region src/hooks/useElementWidth.ts
3
3
  /**
4
- * Hook that measures and tracks the width of an element using ResizeObserver.
5
- * Returns undefined until the first measurement is complete.
4
+ * Measures and tracks an element's border-box width (`getBoundingClientRect().width`) with a
5
+ * `ResizeObserver`. Returns `undefined` until the first measurement. SSR-safe: measures in an
6
+ * effect, `undefined` on the server.
6
7
  *
7
8
  * @param ref - A ref to the element to measure
8
9
  * @returns The current width of the element in pixels, or undefined if not yet measured
@@ -10,18 +11,9 @@ import { useEffect, useState } from "react";
10
11
  * @example
11
12
  * const containerRef = useRef<HTMLDivElement>(null);
12
13
  * const width = useElementWidth(containerRef);
13
- *
14
- * if (width === undefined) {
15
- * return <div ref={containerRef} />;
16
- * }
17
- *
18
- * return (
19
- * <div ref={containerRef}>
20
- * <Chart width={width} />
21
- * </div>
22
- * );
14
+ * return <div ref={containerRef}>{width === undefined ? null : <Chart width={width} />}</div>;
23
15
  */
24
- var useElementWidth = (ref) => {
16
+ function useElementWidth(ref) {
25
17
  const [width, setWidth] = useState(void 0);
26
18
  useEffect(() => {
27
19
  const element = ref.current;
@@ -39,6 +31,6 @@ var useElementWidth = (ref) => {
39
31
  return () => observer.disconnect();
40
32
  }, [ref]);
41
33
  return width;
42
- };
34
+ }
43
35
  //#endregion
44
36
  export { useElementWidth };
@@ -0,0 +1,47 @@
1
+ /** What a Field tells the control inside it. `null` outside a Field. */
2
+ export interface FieldContextValue {
3
+ /** The id the control must carry; the Field label's `htmlFor`. */
4
+ controlId: string;
5
+ /** Id of the visible label, for controls that are not labelable elements (`aria-labelledby`). `undefined` without a `label`. */
6
+ labelId: string | undefined;
7
+ /** Space-separated ids of the description, counter and error currently rendered, for `aria-describedby`. `undefined` when none. */
8
+ describedBy: string | undefined;
9
+ /** The Field's `isRequired`. */
10
+ isRequired: boolean;
11
+ /** `true` when the Field has an `error`. */
12
+ isError: boolean;
13
+ }
14
+ /** The context `Field` provides to its control. Default `null`; `Field` is the only provider. */
15
+ export declare const FieldContext: import("react").Context<FieldContextValue | null>;
16
+ /**
17
+ * The nearest `Field`'s wiring for the control inside it, or `null` outside a Field.
18
+ *
19
+ * The consumer contract, which every DLS input follows and a custom control should too:
20
+ * - set `id = field.controlId` (the Field's id wins over the control's own `id`);
21
+ * - merge `field.describedBy` into `aria-describedby`;
22
+ * - set `aria-invalid` when `field.isError` (or the control's own error);
23
+ * - set `aria-required` (and native `required` where it exists) when `field.isRequired`;
24
+ * - draw the error border when `field.isError`;
25
+ * - a control that is not a labelable element (`role="radiogroup"`, a `div` switch, a listbox
26
+ * trigger) sets `aria-labelledby={field.labelId}`.
27
+ *
28
+ * A control wrapped in a Field must not also receive its own `label`.
29
+ *
30
+ * @returns The Field's control id, label id, `aria-describedby` ids, required and invalid flags
31
+ *
32
+ * @example
33
+ * function MyPicker() {
34
+ * const field = useField();
35
+ * return (
36
+ * <div
37
+ * role="listbox"
38
+ * id={field?.controlId}
39
+ * aria-labelledby={field?.labelId}
40
+ * aria-describedby={field?.describedBy}
41
+ * aria-invalid={field?.isError || undefined}
42
+ * aria-required={field?.isRequired || undefined}
43
+ * />
44
+ * );
45
+ * }
46
+ */
47
+ export declare function useField(): FieldContextValue | null;
@@ -0,0 +1,40 @@
1
+ import { createContext, useContext } from "react";
2
+ //#region src/hooks/useField.ts
3
+ /** The context `Field` provides to its control. Default `null`; `Field` is the only provider. */
4
+ var FieldContext = createContext(null);
5
+ /**
6
+ * The nearest `Field`'s wiring for the control inside it, or `null` outside a Field.
7
+ *
8
+ * The consumer contract, which every DLS input follows and a custom control should too:
9
+ * - set `id = field.controlId` (the Field's id wins over the control's own `id`);
10
+ * - merge `field.describedBy` into `aria-describedby`;
11
+ * - set `aria-invalid` when `field.isError` (or the control's own error);
12
+ * - set `aria-required` (and native `required` where it exists) when `field.isRequired`;
13
+ * - draw the error border when `field.isError`;
14
+ * - a control that is not a labelable element (`role="radiogroup"`, a `div` switch, a listbox
15
+ * trigger) sets `aria-labelledby={field.labelId}`.
16
+ *
17
+ * A control wrapped in a Field must not also receive its own `label`.
18
+ *
19
+ * @returns The Field's control id, label id, `aria-describedby` ids, required and invalid flags
20
+ *
21
+ * @example
22
+ * function MyPicker() {
23
+ * const field = useField();
24
+ * return (
25
+ * <div
26
+ * role="listbox"
27
+ * id={field?.controlId}
28
+ * aria-labelledby={field?.labelId}
29
+ * aria-describedby={field?.describedBy}
30
+ * aria-invalid={field?.isError || undefined}
31
+ * aria-required={field?.isRequired || undefined}
32
+ * />
33
+ * );
34
+ * }
35
+ */
36
+ function useField() {
37
+ return useContext(FieldContext);
38
+ }
39
+ //#endregion
40
+ export { FieldContext, useField };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Keyboard shortcuts. One `keydown` listener on `document` serves every binding; when several
3
+ * bindings match, the innermost `scope` wins, then the most recently registered, and only the
4
+ * winner's handler runs.
5
+ *
6
+ * Key grammar (Kbd adopts it): a combo is tokens joined by `+`, matched case-insensitively.
7
+ * Modifiers are `mod` (⌘ on Mac, Ctrl elsewhere), `ctrl`, `meta` (alias `cmd`), `alt` (alias
8
+ * `option`) and `shift`, and must match exactly. Exactly one key per combo: a single character,
9
+ * or `escape` (`esc`), `enter`, `space`, `tab`, `backspace`, `delete`, `up`, `down`, `left`,
10
+ * `right`, `home`, `end`, `pageup`, `pagedown`, `f1`–`f12`. Letters and digits match on
11
+ * `event.code` (so Option or Shift cannot change them); every other key on `event.key`.
12
+ * Sequences (`g g`) are not supported.
13
+ */
14
+ import { type RefObject } from "react";
15
+ /** Options for `useHotkey`. */
16
+ export interface UseHotkeyOptions {
17
+ /** Whether the binding is registered. Re-enabling registers it again (it becomes the newest). @default true */
18
+ isEnabled?: boolean | undefined;
19
+ /** Only fire while focus is inside this element; a scoped binding beats a global one. */
20
+ scope?: RefObject<HTMLElement | null> | undefined;
21
+ /** Call `event.preventDefault()` when this binding fires (e.g. to stop the browser's ⌘K). @default false */
22
+ shouldPreventDefault?: boolean | undefined;
23
+ /** Do not fire while focus is in an `input`, `textarea`, `select` or `[contenteditable]`. @default false */
24
+ shouldIgnoreInputs?: boolean | undefined;
25
+ }
26
+ /** A parsed combo. `mod` resolves to `meta` or `ctrl` at match time. */
27
+ export interface ParsedHotkey {
28
+ /** ⌘ on Mac, Ctrl elsewhere. */
29
+ mod: boolean;
30
+ /** Control. */
31
+ ctrl: boolean;
32
+ /** ⌘ / Windows key. */
33
+ meta: boolean;
34
+ /** Option / Alt. */
35
+ alt: boolean;
36
+ /** Shift. */
37
+ shift: boolean;
38
+ /** `KeyK` / `Digit1` when `matchOn` is `code`; the lowercased `event.key` otherwise. */
39
+ key: string;
40
+ /** Which `KeyboardEvent` field `key` is compared with. */
41
+ matchOn: "code" | "key";
42
+ }
43
+ /** The `KeyboardEvent` fields the matcher reads. */
44
+ export type HotkeyEventLike = Pick<KeyboardEvent, "key" | "code" | "ctrlKey" | "metaKey" | "altKey" | "shiftKey">;
45
+ /**
46
+ * Parses one combo (`"mod+k"`, `"shift+enter"`, `"escape"`) per the grammar above. Returns
47
+ * `null` when it does not parse: an empty token, an unknown key name, or not exactly one key.
48
+ *
49
+ * @param combo - The combo to parse
50
+ * @returns The parsed combo, or `null`
51
+ */
52
+ export declare function parseHotkey(combo: string): ParsedHotkey | null;
53
+ /**
54
+ * Whether `event` is exactly `hotkey`: the key, and every modifier pressed or not as written.
55
+ *
56
+ * @param hotkey - A combo from `parseHotkey`
57
+ * @param event - The `keydown` event (or its key, code and modifier fields)
58
+ * @param isMac - Whether `mod` means ⌘ (`true`) or Ctrl (`false`)
59
+ * @returns Whether the event matches
60
+ */
61
+ export declare function matchesHotkey(hotkey: ParsedHotkey, event: HotkeyEventLike, isMac: boolean): boolean;
62
+ /**
63
+ * Binds a keyboard shortcut (`"mod+k"`, `"shift+enter"`, `"escape"`; an array means any of them)
64
+ * to `handler`. The binding behind `Button shouldBindHotKey`, `SearchInput hotKey` and
65
+ * `CommandPalette`. When several bindings match, the innermost `scope` wins, then the most
66
+ * recently registered; only the winner runs, and in development a duplicate combo in the same
67
+ * scope warns once. Fires inside text fields unless `shouldIgnoreInputs`. A combo that does not
68
+ * parse warns in development and never fires.
69
+ *
70
+ * @param keys - One combo, or an array of combos any of which fires
71
+ * @param handler - Called with the `keydown` event when this binding wins
72
+ * @param options - `isEnabled` (default `true`), `scope`, `shouldPreventDefault` (default `false`), `shouldIgnoreInputs` (default `false`)
73
+ *
74
+ * @example
75
+ * useHotkey("mod+k", () => setIsOpen(true), { shouldPreventDefault: true });
76
+ */
77
+ export declare function useHotkey(keys: string | string[], handler: (event: KeyboardEvent) => void, options?: UseHotkeyOptions): void;
@@ -0,0 +1,246 @@
1
+ import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect.js";
2
+ import { useIsMac } from "./useIsMac.js";
3
+ import { useEffect, useRef } from "react";
4
+ //#region src/hooks/useHotkey.ts
5
+ /**
6
+ * Keyboard shortcuts. One `keydown` listener on `document` serves every binding; when several
7
+ * bindings match, the innermost `scope` wins, then the most recently registered, and only the
8
+ * winner's handler runs.
9
+ *
10
+ * Key grammar (Kbd adopts it): a combo is tokens joined by `+`, matched case-insensitively.
11
+ * Modifiers are `mod` (⌘ on Mac, Ctrl elsewhere), `ctrl`, `meta` (alias `cmd`), `alt` (alias
12
+ * `option`) and `shift`, and must match exactly. Exactly one key per combo: a single character,
13
+ * or `escape` (`esc`), `enter`, `space`, `tab`, `backspace`, `delete`, `up`, `down`, `left`,
14
+ * `right`, `home`, `end`, `pageup`, `pagedown`, `f1`–`f12`. Letters and digits match on
15
+ * `event.code` (so Option or Shift cannot change them); every other key on `event.key`.
16
+ * Sequences (`g g`) are not supported.
17
+ */
18
+ /** Modifier tokens and their aliases. A `Map`, so `"constructor"` is not a modifier. */
19
+ var MODIFIER_TOKEN_TO_MODIFIER_MAP = new Map([
20
+ ["mod", "mod"],
21
+ ["ctrl", "ctrl"],
22
+ ["meta", "meta"],
23
+ ["cmd", "meta"],
24
+ ["alt", "alt"],
25
+ ["option", "alt"],
26
+ ["shift", "shift"]
27
+ ]);
28
+ /** Named keys → the lowercased `event.key` they match. */
29
+ var KEY_NAME_TO_EVENT_KEY_MAP = new Map([
30
+ ["escape", "escape"],
31
+ ["esc", "escape"],
32
+ ["enter", "enter"],
33
+ ["space", " "],
34
+ ["tab", "tab"],
35
+ ["backspace", "backspace"],
36
+ ["delete", "delete"],
37
+ ["up", "arrowup"],
38
+ ["down", "arrowdown"],
39
+ ["left", "arrowleft"],
40
+ ["right", "arrowright"],
41
+ ["home", "home"],
42
+ ["end", "end"],
43
+ ["pageup", "pageup"],
44
+ ["pagedown", "pagedown"],
45
+ ...Array.from({ length: 12 }, (_, index) => [`f${index + 1}`, `f${index + 1}`])
46
+ ]);
47
+ var LETTER = /^[a-z]$/;
48
+ var DIGIT = /^[0-9]$/;
49
+ /**
50
+ * Parses one combo (`"mod+k"`, `"shift+enter"`, `"escape"`) per the grammar above. Returns
51
+ * `null` when it does not parse: an empty token, an unknown key name, or not exactly one key.
52
+ *
53
+ * @param combo - The combo to parse
54
+ * @returns The parsed combo, or `null`
55
+ */
56
+ function parseHotkey(combo) {
57
+ const parsed = {
58
+ mod: false,
59
+ ctrl: false,
60
+ meta: false,
61
+ alt: false,
62
+ shift: false,
63
+ key: "",
64
+ matchOn: "key"
65
+ };
66
+ let keyCount = 0;
67
+ for (const rawToken of combo.split("+")) {
68
+ const token = rawToken.trim().toLowerCase();
69
+ if (token === "") return null;
70
+ const modifier = MODIFIER_TOKEN_TO_MODIFIER_MAP.get(token);
71
+ if (modifier !== void 0) {
72
+ parsed[modifier] = true;
73
+ continue;
74
+ }
75
+ keyCount += 1;
76
+ const namedKey = KEY_NAME_TO_EVENT_KEY_MAP.get(token);
77
+ if (LETTER.test(token)) {
78
+ parsed.key = `Key${token.toUpperCase()}`;
79
+ parsed.matchOn = "code";
80
+ } else if (DIGIT.test(token)) {
81
+ parsed.key = `Digit${token}`;
82
+ parsed.matchOn = "code";
83
+ } else if (namedKey !== void 0) {
84
+ parsed.key = namedKey;
85
+ parsed.matchOn = "key";
86
+ } else if ([...token].length === 1) {
87
+ parsed.key = token;
88
+ parsed.matchOn = "key";
89
+ } else return null;
90
+ }
91
+ return keyCount === 1 ? parsed : null;
92
+ }
93
+ /**
94
+ * Whether `event` is exactly `hotkey`: the key, and every modifier pressed or not as written.
95
+ *
96
+ * @param hotkey - A combo from `parseHotkey`
97
+ * @param event - The `keydown` event (or its key, code and modifier fields)
98
+ * @param isMac - Whether `mod` means ⌘ (`true`) or Ctrl (`false`)
99
+ * @returns Whether the event matches
100
+ */
101
+ function matchesHotkey(hotkey, event, isMac) {
102
+ return (hotkey.matchOn === "code" ? event.code === hotkey.key : event.key.toLowerCase() === hotkey.key) && event.ctrlKey === (hotkey.ctrl || hotkey.mod && !isMac) && event.metaKey === (hotkey.meta || hotkey.mod && isMac) && event.altKey === hotkey.alt && event.shiftKey === hotkey.shift;
103
+ }
104
+ /** One canonical spelling per combo, for the dev conflict warning (`"Cmd+K"` = `"meta+k"`). */
105
+ var toCanonicalCombo = (hotkey) => [
106
+ hotkey.mod && "mod",
107
+ hotkey.ctrl && "ctrl",
108
+ hotkey.meta && "meta",
109
+ hotkey.alt && "alt",
110
+ hotkey.shift && "shift",
111
+ `${hotkey.matchOn}:${hotkey.key}`
112
+ ].filter(Boolean).join("+");
113
+ function isDevelopment() {
114
+ try {
115
+ return process.env.NODE_ENV !== "production";
116
+ } catch {
117
+ return false;
118
+ }
119
+ }
120
+ /** Created on the first registration, so nothing runs at module scope. */
121
+ var registry;
122
+ var isEditableTarget = (target) => target instanceof HTMLElement && (target.isContentEditable || [
123
+ "INPUT",
124
+ "TEXTAREA",
125
+ "SELECT"
126
+ ].includes(target.tagName));
127
+ /** Whether `a` beats `b`: the innermost scope, then the newest registration. */
128
+ function isHigherPriority(a, b) {
129
+ const scopeA = a.scope?.current ?? null;
130
+ const scopeB = b.scope?.current ?? null;
131
+ if (scopeA !== scopeB) {
132
+ if (scopeB === null) return true;
133
+ if (scopeA === null) return false;
134
+ return scopeB.contains(scopeA);
135
+ }
136
+ return a.order > b.order;
137
+ }
138
+ function handleKeyDown(event) {
139
+ if (registry === void 0) return;
140
+ const target = event.target instanceof Node ? event.target : null;
141
+ let winner;
142
+ for (const binding of registry.bindings) {
143
+ const state = binding.stateRef.current;
144
+ if (state === null) continue;
145
+ if (!binding.hotkeys.some((hotkey) => matchesHotkey(hotkey, event, state.isMac))) continue;
146
+ if (binding.scope !== void 0) {
147
+ const scope = binding.scope.current;
148
+ if (scope === null || target === null || !scope.contains(target)) continue;
149
+ }
150
+ if (state.shouldIgnoreInputs && isEditableTarget(event.target)) continue;
151
+ if (winner === void 0 || isHigherPriority(binding, winner)) winner = binding;
152
+ }
153
+ const state = winner?.stateRef.current;
154
+ if (state === void 0 || state === null) return;
155
+ if (state.shouldPreventDefault) event.preventDefault();
156
+ state.handler(event);
157
+ }
158
+ function register(binding, combos) {
159
+ if (registry === void 0) registry = {
160
+ bindings: /* @__PURE__ */ new Set(),
161
+ nextOrder: 0,
162
+ handleKeyDown
163
+ };
164
+ const current = registry;
165
+ if (current.bindings.size === 0) document.addEventListener("keydown", current.handleKeyDown);
166
+ if (isDevelopment()) {
167
+ const scope = binding.scope?.current ?? null;
168
+ const held = new Set([...current.bindings].filter((other) => (other.scope?.current ?? null) === scope).flatMap((other) => other.hotkeys.map(toCanonicalCombo)));
169
+ const conflicts = combos.filter((_, index) => {
170
+ const hotkey = binding.hotkeys[index];
171
+ return hotkey !== void 0 && held.has(toCanonicalCombo(hotkey));
172
+ });
173
+ if (conflicts.length > 0) console.warn(`[@galaxy-io/dls] useHotkey: "${conflicts.join("\", \"")}" is already bound in the same scope; the most recently registered binding wins.`);
174
+ }
175
+ const entry = {
176
+ ...binding,
177
+ order: current.nextOrder
178
+ };
179
+ current.nextOrder += 1;
180
+ current.bindings.add(entry);
181
+ return () => {
182
+ current.bindings.delete(entry);
183
+ if (current.bindings.size === 0) document.removeEventListener("keydown", current.handleKeyDown);
184
+ };
185
+ }
186
+ /**
187
+ * Binds a keyboard shortcut (`"mod+k"`, `"shift+enter"`, `"escape"`; an array means any of them)
188
+ * to `handler`. The binding behind `Button shouldBindHotKey`, `SearchInput hotKey` and
189
+ * `CommandPalette`. When several bindings match, the innermost `scope` wins, then the most
190
+ * recently registered; only the winner runs, and in development a duplicate combo in the same
191
+ * scope warns once. Fires inside text fields unless `shouldIgnoreInputs`. A combo that does not
192
+ * parse warns in development and never fires.
193
+ *
194
+ * @param keys - One combo, or an array of combos any of which fires
195
+ * @param handler - Called with the `keydown` event when this binding wins
196
+ * @param options - `isEnabled` (default `true`), `scope`, `shouldPreventDefault` (default `false`), `shouldIgnoreInputs` (default `false`)
197
+ *
198
+ * @example
199
+ * useHotkey("mod+k", () => setIsOpen(true), { shouldPreventDefault: true });
200
+ */
201
+ function useHotkey(keys, handler, options) {
202
+ const isEnabled = options?.isEnabled ?? true;
203
+ const scope = options?.scope;
204
+ const isMac = useIsMac();
205
+ const stateRef = useRef({
206
+ handler,
207
+ isMac,
208
+ shouldPreventDefault: options?.shouldPreventDefault ?? false,
209
+ shouldIgnoreInputs: options?.shouldIgnoreInputs ?? false
210
+ });
211
+ useIsomorphicLayoutEffect(() => {
212
+ stateRef.current = {
213
+ handler,
214
+ isMac,
215
+ shouldPreventDefault: options?.shouldPreventDefault ?? false,
216
+ shouldIgnoreInputs: options?.shouldIgnoreInputs ?? false
217
+ };
218
+ });
219
+ const combosKey = (Array.isArray(keys) ? keys : [keys]).join("\n");
220
+ useEffect(() => {
221
+ if (!isEnabled) return;
222
+ const combos = [];
223
+ const hotkeys = [];
224
+ for (const combo of combosKey.split("\n")) {
225
+ const hotkey = parseHotkey(combo);
226
+ if (hotkey === null) {
227
+ if (isDevelopment()) console.warn(`[@galaxy-io/dls] useHotkey: "${combo}" is not a valid combo; it never fires.`);
228
+ continue;
229
+ }
230
+ combos.push(combo);
231
+ hotkeys.push(hotkey);
232
+ }
233
+ if (hotkeys.length === 0) return;
234
+ return register({
235
+ hotkeys,
236
+ scope,
237
+ stateRef
238
+ }, combos);
239
+ }, [
240
+ isEnabled,
241
+ combosKey,
242
+ scope
243
+ ]);
244
+ }
245
+ //#endregion
246
+ export { matchesHotkey, parseHotkey, useHotkey };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Whether the user is on an Apple platform (macOS, iOS, iPadOS), for ⌘ vs Ctrl labels and
3
+ * bindings. Reads `navigator.userAgentData.platform`, falling back to `navigator.platform`.
4
+ * `false` on the server and during hydration; the client re-renders once with the real value.
5
+ *
6
+ * @returns Whether the platform is macOS, iOS or iPadOS
7
+ *
8
+ * @example
9
+ * const isMac = useIsMac();
10
+ * const modLabel = isMac ? "⌘" : "Ctrl";
11
+ */
12
+ export declare function useIsMac(): boolean;