@galaxy-io/dls 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) 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 +136 -116
  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 +32 -20
  46. package/dist/charts/ChartFrame.d.ts +69 -116
  47. package/dist/charts/ChartFrame.js +253 -119
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +27 -48
  51. package/dist/charts/ChartLegend.js +206 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +33 -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 +295 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +159 -117
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +149 -135
  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/constants.d.ts +96 -256
  79. package/dist/charts/constants.js +105 -275
  80. package/dist/charts/heatmapGeometry.d.ts +95 -0
  81. package/dist/charts/heatmapGeometry.js +155 -0
  82. package/dist/charts/lineChartGeometry.d.ts +108 -58
  83. package/dist/charts/lineChartGeometry.js +120 -78
  84. package/dist/charts/pieChartGeometry.d.ts +66 -40
  85. package/dist/charts/pieChartGeometry.js +68 -38
  86. package/dist/charts/types.d.ts +197 -466
  87. package/dist/charts/types.js +55 -144
  88. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  89. package/dist/charts/useCartesianChartLayout.js +47 -32
  90. package/dist/charts/useChartDimensions.d.ts +19 -40
  91. package/dist/charts/useChartDimensions.js +40 -56
  92. package/dist/charts/useChartFormatters.d.ts +6 -15
  93. package/dist/charts/useChartFormatters.js +4 -9
  94. package/dist/charts/useChartInteraction.d.ts +47 -116
  95. package/dist/charts/useChartInteraction.js +95 -71
  96. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  97. package/dist/charts/useChartTooltipPosition.js +14 -5
  98. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  99. package/dist/charts/useSeriesColorResolver.js +19 -12
  100. package/dist/chips/Chip.d.ts +155 -44
  101. package/dist/chips/Chip.js +329 -155
  102. package/dist/chips/ChipGroup.d.ts +53 -0
  103. package/dist/chips/ChipGroup.js +98 -0
  104. package/dist/drawer/Drawer.d.ts +81 -17
  105. package/dist/drawer/Drawer.js +370 -65
  106. package/dist/dropdown/Dropdown.d.ts +80 -63
  107. package/dist/dropdown/Dropdown.js +127 -129
  108. package/dist/editor/CodeEditor.d.ts +119 -40
  109. package/dist/editor/CodeEditor.js +490 -400
  110. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  111. package/dist/editor/CodeEditorReactWidget.js +28 -21
  112. package/dist/feedback/Alert.d.ts +49 -0
  113. package/dist/feedback/Alert.js +172 -0
  114. package/dist/feedback/EmptyState.d.ts +39 -0
  115. package/dist/feedback/EmptyState.js +109 -0
  116. package/dist/feedback/ProgressBar.d.ts +125 -0
  117. package/dist/feedback/ProgressBar.js +183 -0
  118. package/dist/feedback/ProgressCircle.d.ts +99 -0
  119. package/dist/feedback/ProgressCircle.js +187 -0
  120. package/dist/feedback/Skeleton.d.ts +69 -0
  121. package/dist/feedback/Skeleton.js +130 -0
  122. package/dist/feedback/Spinner.d.ts +63 -0
  123. package/dist/feedback/Spinner.js +141 -0
  124. package/dist/fonts.css +70 -0
  125. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  126. package/dist/hooks/internal/useIsClient.js +14 -0
  127. package/dist/hooks/useClipboard.d.ts +19 -0
  128. package/dist/hooks/useClipboard.js +45 -0
  129. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  130. package/dist/hooks/useControlledOpenState.js +19 -0
  131. package/dist/hooks/useControlledState.d.ts +19 -0
  132. package/dist/hooks/useControlledState.js +22 -0
  133. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  134. package/dist/hooks/useDebouncedValue.js +33 -0
  135. package/dist/hooks/useDisclosure.d.ts +26 -0
  136. package/dist/hooks/useDisclosure.js +36 -0
  137. package/dist/hooks/useDismiss.d.ts +23 -27
  138. package/dist/hooks/useDismiss.js +39 -27
  139. package/dist/hooks/useElementClientSize.d.ts +10 -10
  140. package/dist/hooks/useElementClientSize.js +8 -11
  141. package/dist/hooks/useElementWidth.d.ts +6 -13
  142. package/dist/hooks/useElementWidth.js +6 -14
  143. package/dist/hooks/useField.d.ts +47 -0
  144. package/dist/hooks/useField.js +40 -0
  145. package/dist/hooks/useHotkey.d.ts +77 -0
  146. package/dist/hooks/useHotkey.js +246 -0
  147. package/dist/hooks/useIsMac.d.ts +12 -0
  148. package/dist/hooks/useIsMac.js +27 -0
  149. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  150. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  151. package/dist/hooks/useLocalStorage.d.ts +28 -0
  152. package/dist/hooks/useLocalStorage.js +145 -0
  153. package/dist/hooks/useMediaQuery.d.ts +11 -0
  154. package/dist/hooks/useMediaQuery.js +23 -0
  155. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  156. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  157. package/dist/hooks/useResize.d.ts +42 -62
  158. package/dist/hooks/useResize.js +43 -31
  159. package/dist/icons/Icon.d.ts +64 -37
  160. package/dist/icons/Icon.js +96 -37
  161. package/dist/icons/internal/IconSlot.d.ts +10 -0
  162. package/dist/icons/internal/IconSlot.js +32 -0
  163. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  164. package/dist/inputs/CheckboxGroup.js +183 -0
  165. package/dist/inputs/CheckboxInput.d.ts +98 -28
  166. package/dist/inputs/CheckboxInput.js +218 -88
  167. package/dist/inputs/ColorInput.d.ts +115 -29
  168. package/dist/inputs/ColorInput.js +748 -326
  169. package/dist/inputs/CopyInput.d.ts +49 -20
  170. package/dist/inputs/CopyInput.js +57 -49
  171. package/dist/inputs/CronInput.d.ts +94 -0
  172. package/dist/inputs/CronInput.js +618 -0
  173. package/dist/inputs/DateInput.d.ts +175 -28
  174. package/dist/inputs/DateInput.js +1109 -451
  175. package/dist/inputs/DurationInput.d.ts +101 -0
  176. package/dist/inputs/DurationInput.js +441 -0
  177. package/dist/inputs/Field.d.ts +75 -0
  178. package/dist/inputs/Field.js +247 -0
  179. package/dist/inputs/Fieldset.d.ts +53 -0
  180. package/dist/inputs/Fieldset.js +149 -0
  181. package/dist/inputs/FileInput.d.ts +110 -0
  182. package/dist/inputs/FileInput.js +476 -0
  183. package/dist/inputs/Input.d.ts +148 -187
  184. package/dist/inputs/Input.js +339 -259
  185. package/dist/inputs/KeyValueInput.d.ts +120 -0
  186. package/dist/inputs/KeyValueInput.js +383 -0
  187. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  188. package/dist/inputs/MultiSelectInput.js +175 -559
  189. package/dist/inputs/NumberInput.d.ts +65 -9
  190. package/dist/inputs/NumberInput.js +197 -40
  191. package/dist/inputs/PasswordInput.d.ts +17 -12
  192. package/dist/inputs/PasswordInput.js +33 -33
  193. package/dist/inputs/PinInput.d.ts +117 -0
  194. package/dist/inputs/PinInput.js +364 -0
  195. package/dist/inputs/RadioGroup.d.ts +115 -0
  196. package/dist/inputs/RadioGroup.js +179 -0
  197. package/dist/inputs/RadioInput.d.ts +87 -24
  198. package/dist/inputs/RadioInput.js +182 -95
  199. package/dist/inputs/SearchInput.d.ts +66 -0
  200. package/dist/inputs/SearchInput.js +156 -0
  201. package/dist/inputs/SelectInput.d.ts +195 -55
  202. package/dist/inputs/SelectInput.js +1308 -446
  203. package/dist/inputs/SliderInput.d.ts +150 -30
  204. package/dist/inputs/SliderInput.js +441 -186
  205. package/dist/inputs/SwitchInput.d.ts +109 -0
  206. package/dist/inputs/SwitchInput.js +248 -0
  207. package/dist/inputs/TagInput.d.ts +117 -0
  208. package/dist/inputs/TagInput.js +408 -0
  209. package/dist/inputs/TextAreaInput.d.ts +146 -44
  210. package/dist/inputs/TextAreaInput.js +292 -198
  211. package/dist/inputs/TextInput.d.ts +4 -13
  212. package/dist/inputs/TextInput.js +13 -48
  213. package/dist/inputs/ToggleInput.d.ts +120 -22
  214. package/dist/inputs/ToggleInput.js +262 -116
  215. package/dist/inputs/internal/bareField.d.ts +18 -0
  216. package/dist/inputs/internal/bareField.js +38 -0
  217. package/dist/inputs/internal/devWarn.d.ts +7 -0
  218. package/dist/inputs/internal/devWarn.js +30 -0
  219. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  220. package/dist/inputs/internal/fieldFrame.js +64 -0
  221. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  222. package/dist/inputs/internal/fieldWiring.js +38 -0
  223. package/dist/inputs/internal/innerButton.d.ts +2 -0
  224. package/dist/inputs/internal/innerButton.js +24 -0
  225. package/dist/inputs/internal/ownField.d.ts +45 -0
  226. package/dist/inputs/internal/ownField.js +58 -0
  227. package/dist/inputs/internal/predicates.d.ts +9 -0
  228. package/dist/inputs/internal/predicates.js +11 -0
  229. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  230. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  231. package/dist/json/JsonViewer.d.ts +62 -0
  232. package/dist/json/JsonViewer.js +483 -0
  233. package/dist/layout/Box.d.ts +87 -0
  234. package/dist/layout/Box.js +109 -0
  235. package/dist/layout/Divider.d.ts +25 -0
  236. package/dist/layout/Divider.js +70 -0
  237. package/dist/layout/Flex.d.ts +139 -0
  238. package/dist/layout/Flex.js +165 -0
  239. package/dist/layout/FlexItem.d.ts +72 -0
  240. package/dist/layout/FlexItem.js +84 -0
  241. package/dist/layout/Grid.d.ts +140 -0
  242. package/dist/layout/Grid.js +178 -0
  243. package/dist/layout/Portal.d.ts +29 -0
  244. package/dist/layout/Portal.js +27 -0
  245. package/dist/layout/ResizablePanels.d.ts +88 -0
  246. package/dist/layout/ResizablePanels.js +198 -0
  247. package/dist/layout/ResizeHandle.d.ts +48 -0
  248. package/dist/layout/ResizeHandle.js +143 -0
  249. package/dist/layout/ScrollArea.d.ts +30 -0
  250. package/dist/layout/ScrollArea.js +138 -0
  251. package/dist/links/Link.d.ts +101 -1
  252. package/dist/links/Link.js +166 -4
  253. package/dist/lists/BulletedList.d.ts +25 -7
  254. package/dist/lists/BulletedList.js +72 -27
  255. package/dist/lists/DescriptionList.d.ts +91 -0
  256. package/dist/lists/DescriptionList.js +147 -0
  257. package/dist/menu/ContextMenu.d.ts +64 -0
  258. package/dist/menu/ContextMenu.js +34 -0
  259. package/dist/menu/Menu.d.ts +280 -0
  260. package/dist/menu/Menu.js +1003 -0
  261. package/dist/modal/ConfirmDialog.d.ts +55 -0
  262. package/dist/modal/ConfirmDialog.js +151 -0
  263. package/dist/modal/Modal.d.ts +64 -14
  264. package/dist/modal/Modal.js +189 -48
  265. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  266. package/dist/navigation/Breadcrumbs.js +243 -0
  267. package/dist/navigation/CommandPalette.d.ts +83 -0
  268. package/dist/navigation/CommandPalette.js +509 -0
  269. package/dist/navigation/Pagination.d.ts +87 -0
  270. package/dist/navigation/Pagination.js +300 -0
  271. package/dist/navigation/SidebarNav.d.ts +107 -0
  272. package/dist/navigation/SidebarNav.js +341 -0
  273. package/dist/navigation/Stepper.d.ts +52 -0
  274. package/dist/navigation/Stepper.js +207 -0
  275. package/dist/navigation/Tabs.d.ts +113 -0
  276. package/dist/navigation/Tabs.js +543 -0
  277. package/dist/navigation/Topbar.d.ts +20 -0
  278. package/dist/navigation/Topbar.js +62 -0
  279. package/dist/overlay/OverlayProvider.d.ts +28 -32
  280. package/dist/overlay/OverlayProvider.js +42 -93
  281. package/dist/overlay/useOverlay.d.ts +88 -12
  282. package/dist/overlay/useOverlay.js +220 -43
  283. package/dist/overlays/Popover.d.ts +114 -0
  284. package/dist/overlays/Popover.js +389 -0
  285. package/dist/shapes/Circle.d.ts +84 -8
  286. package/dist/shapes/Circle.js +122 -20
  287. package/dist/shapes/Square.d.ts +84 -8
  288. package/dist/shapes/Square.js +123 -20
  289. package/dist/styles/mixins.d.ts +35 -0
  290. package/dist/styles/mixins.js +60 -0
  291. package/dist/styles.css +1 -202
  292. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  293. package/dist/table/InfiniteSpreadsheet.js +762 -225
  294. package/dist/table/InfiniteTable.d.ts +116 -14
  295. package/dist/table/InfiniteTable.js +287 -429
  296. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  297. package/dist/table/SpreadsheetCellEditor.js +163 -84
  298. package/dist/table/TableCore.d.ts +252 -0
  299. package/dist/table/TableCore.js +1077 -0
  300. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  301. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  302. package/dist/table/types.d.ts +66 -244
  303. package/dist/table/types.js +0 -51
  304. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  305. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  306. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  307. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  308. package/dist/table/useTableColumnLayout.d.ts +90 -25
  309. package/dist/table/useTableColumnLayout.js +255 -50
  310. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  311. package/dist/table/useTableKeyboardNavigation.js +95 -71
  312. package/dist/table/useTableRowSelection.d.ts +24 -25
  313. package/dist/table/useTableRowSelection.js +57 -84
  314. package/dist/table/useTableVirtualizer.d.ts +20 -0
  315. package/dist/table/useTableVirtualizer.js +48 -0
  316. package/dist/text/Bold.d.ts +5 -6
  317. package/dist/text/Bold.js +16 -15
  318. package/dist/text/Code.d.ts +5 -6
  319. package/dist/text/Code.js +16 -25
  320. package/dist/text/CodeBlock.d.ts +77 -0
  321. package/dist/text/CodeBlock.js +373 -0
  322. package/dist/text/EditableText.d.ts +55 -15
  323. package/dist/text/EditableText.js +153 -135
  324. package/dist/text/Ellipsis.d.ts +34 -8
  325. package/dist/text/Ellipsis.js +55 -23
  326. package/dist/text/Kbd.d.ts +72 -0
  327. package/dist/text/Kbd.js +284 -0
  328. package/dist/text/MarkdownText.d.ts +27 -10
  329. package/dist/text/MarkdownText.js +317 -300
  330. package/dist/text/RequiredMarker.d.ts +17 -5
  331. package/dist/text/RequiredMarker.js +34 -36
  332. package/dist/text/Selectable.d.ts +5 -6
  333. package/dist/text/Selectable.js +16 -13
  334. package/dist/text/Span.d.ts +82 -0
  335. package/dist/text/Span.js +115 -0
  336. package/dist/text/Text.d.ts +128 -41
  337. package/dist/text/Text.js +209 -76
  338. package/dist/theme/GalaxyProvider.d.ts +75 -0
  339. package/dist/theme/GalaxyProvider.js +223 -0
  340. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  341. package/dist/theme/ThemeSwitcher.js +94 -0
  342. package/dist/theme/enums.d.ts +118 -0
  343. package/dist/theme/enums.js +144 -0
  344. package/dist/theme/tokens/dark.d.ts +2 -0
  345. package/dist/theme/tokens/dark.js +275 -0
  346. package/dist/theme/tokens/generate.d.ts +15 -0
  347. package/dist/theme/tokens/generate.js +47 -0
  348. package/dist/theme/tokens/light.d.ts +2 -0
  349. package/dist/theme/tokens/light.js +274 -0
  350. package/dist/theme/tokens/palette.d.ts +14 -0
  351. package/dist/theme/tokens/palette.js +153 -0
  352. package/dist/theme/tokens/scales.d.ts +26 -0
  353. package/dist/theme/tokens/scales.js +154 -0
  354. package/dist/theme/tokens/t.d.ts +3 -0
  355. package/dist/theme/tokens/t.js +25 -0
  356. package/dist/theme/tokens/types.d.ts +189 -0
  357. package/dist/theme/tokens/types.js +0 -0
  358. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  359. package/dist/theme/useGalaxyTheme.js +36 -0
  360. package/dist/theme/useInverseScope.d.ts +18 -0
  361. package/dist/theme/useInverseScope.js +33 -0
  362. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  363. package/dist/three/GalaxyLogomark3D.js +134 -0
  364. package/dist/three/assets/galaxy-logomark.js +4 -0
  365. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  366. package/dist/three/galaxyLogomark3DScene.js +165 -0
  367. package/dist/timeline/Timeline.d.ts +99 -0
  368. package/dist/timeline/Timeline.js +269 -0
  369. package/dist/toast/Toast.d.ts +43 -19
  370. package/dist/toast/Toast.js +130 -89
  371. package/dist/toast/ToastProvider.d.ts +23 -23
  372. package/dist/toast/ToastProvider.js +298 -101
  373. package/dist/toast/ToastViewport.d.ts +12 -0
  374. package/dist/toast/ToastViewport.js +210 -0
  375. package/dist/toast/useToast.d.ts +139 -5
  376. package/dist/toast/useToast.js +15 -13
  377. package/dist/tokens.css +654 -0
  378. package/dist/tooltip/Tooltip.d.ts +64 -44
  379. package/dist/tooltip/Tooltip.js +280 -73
  380. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  381. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  382. package/dist/transform/Fade.d.ts +33 -11
  383. package/dist/transform/Fade.js +71 -19
  384. package/dist/transform/Flasher.d.ts +25 -0
  385. package/dist/transform/Flasher.js +39 -0
  386. package/dist/transform/Rotate.d.ts +24 -12
  387. package/dist/transform/Rotate.js +36 -22
  388. package/dist/transform/ScaleFade.d.ts +36 -11
  389. package/dist/transform/ScaleFade.js +86 -28
  390. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  391. package/dist/transform/internal/CollapseMotion.js +65 -0
  392. package/dist/tree/Tree.d.ts +85 -0
  393. package/dist/tree/Tree.js +387 -0
  394. package/dist/tree/treeRow.d.ts +39 -0
  395. package/dist/tree/treeRow.js +75 -0
  396. package/dist/utils/colors.d.ts +46 -13
  397. package/dist/utils/colors.js +92 -34
  398. package/dist/utils/css.d.ts +23 -0
  399. package/dist/utils/css.js +30 -0
  400. package/dist/utils/format.d.ts +58 -0
  401. package/dist/utils/format.js +220 -0
  402. package/dist/vite/index.d.ts +16 -0
  403. package/dist/vite/index.js +52 -0
  404. package/dist/widget/Widget.d.ts +164 -48
  405. package/dist/widget/Widget.js +335 -96
  406. package/dist/widget/WidgetGroup.d.ts +36 -0
  407. package/dist/widget/WidgetGroup.js +103 -0
  408. package/package.json +851 -157
  409. package/dist/accordion/Accordion.d.ts +0 -54
  410. package/dist/accordion/Accordion.js +0 -183
  411. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  412. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  413. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  415. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  416. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  417. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  419. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  420. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  421. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  423. package/dist/assets/models/galaxy-animation.js +0 -136666
  424. package/dist/assets/models/galaxy-logomark.js +0 -4
  425. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  426. package/dist/avatar/AvatarShimmer.js +0 -22
  427. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  428. package/dist/backgrounds/CellGridBackground.js +0 -44
  429. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  430. package/dist/backgrounds/CrossGridBackground.js +0 -49
  431. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  432. package/dist/backgrounds/DotGridBackground.js +0 -47
  433. package/dist/badge/Badge.d.ts +0 -42
  434. package/dist/badge/Badge.js +0 -99
  435. package/dist/charts/ChartEmptyState.d.ts +0 -17
  436. package/dist/charts/ChartEmptyState.js +0 -29
  437. package/dist/charts/ProgressBar.d.ts +0 -29
  438. package/dist/charts/ProgressBar.js +0 -65
  439. package/dist/charts/chartTheme.d.ts +0 -18
  440. package/dist/charts/chartTheme.js +0 -26
  441. package/dist/containers/FlexItem.d.ts +0 -50
  442. package/dist/containers/FlexItem.js +0 -91
  443. package/dist/containers/FlexWrapper.d.ts +0 -96
  444. package/dist/containers/FlexWrapper.js +0 -143
  445. package/dist/containers/GridWrapper.d.ts +0 -79
  446. package/dist/containers/GridWrapper.js +0 -125
  447. package/dist/containers/Spacing.d.ts +0 -23
  448. package/dist/containers/Spacing.js +0 -59
  449. package/dist/containers/Wrapper.d.ts +0 -26
  450. package/dist/containers/Wrapper.js +0 -54
  451. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  452. package/dist/dividers/HorizontalDivider.js +0 -39
  453. package/dist/dividers/VerticalDivider.d.ts +0 -6
  454. package/dist/dividers/VerticalDivider.js +0 -21
  455. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  456. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  457. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  458. package/dist/icons/GalaxyLogomark.js +0 -27
  459. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  460. package/dist/icons/GalaxyLogomark3D.js +0 -319
  461. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  462. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  463. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  464. package/dist/icons/GalaxyWordmark.js +0 -25
  465. package/dist/inputs/MultiTextInput.d.ts +0 -32
  466. package/dist/inputs/MultiTextInput.js +0 -180
  467. package/dist/inputs/SwitcherInput.d.ts +0 -27
  468. package/dist/inputs/SwitcherInput.js +0 -64
  469. package/dist/inputs/hooks.d.ts +0 -10
  470. package/dist/inputs/hooks.js +0 -22
  471. package/dist/overlay/constants.d.ts +0 -28
  472. package/dist/overlay/constants.js +0 -37
  473. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  474. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  475. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  476. package/dist/resizable/VerticalResizeHandle.js +0 -39
  477. package/dist/table/SpreadsheetCell.d.ts +0 -21
  478. package/dist/table/SpreadsheetCell.js +0 -71
  479. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  480. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  481. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  482. package/dist/table/SpreadsheetMenuItem.js +0 -33
  483. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  484. package/dist/table/SpreadsheetPrimitives.js +0 -105
  485. package/dist/table/SpreadsheetRow.d.ts +0 -33
  486. package/dist/table/SpreadsheetRow.js +0 -73
  487. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  488. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  489. package/dist/table/TableExpandCell.d.ts +0 -11
  490. package/dist/table/TableExpandCell.js +0 -24
  491. package/dist/table/TableExpandedRow.d.ts +0 -16
  492. package/dist/table/TableExpandedRow.js +0 -77
  493. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  494. package/dist/table/TableHeaderCellContent.js +0 -48
  495. package/dist/table/TablePrimitives.d.ts +0 -313
  496. package/dist/table/TablePrimitives.js +0 -302
  497. package/dist/table/TableSelectCell.d.ts +0 -18
  498. package/dist/table/TableSelectCell.js +0 -27
  499. package/dist/table/TableStatusRow.d.ts +0 -18
  500. package/dist/table/TableStatusRow.js +0 -50
  501. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  502. package/dist/table/useSpreadsheetEditing.js +0 -41
  503. package/dist/table/useTableColumnResize.d.ts +0 -38
  504. package/dist/table/useTableColumnResize.js +0 -155
  505. package/dist/table/useTableRowExpansion.d.ts +0 -24
  506. package/dist/table/useTableRowExpansion.js +0 -62
  507. package/dist/table/utils.d.ts +0 -50
  508. package/dist/table/utils.js +0 -78
  509. package/dist/text/HotKeys.d.ts +0 -30
  510. package/dist/text/HotKeys.js +0 -74
  511. package/dist/text/Paragraph.d.ts +0 -33
  512. package/dist/text/Paragraph.js +0 -83
  513. package/dist/text/TextShimmer.d.ts +0 -14
  514. package/dist/text/TextShimmer.js +0 -34
  515. package/dist/theme/GalaxyTheme.d.ts +0 -67
  516. package/dist/theme/GalaxyTheme.js +0 -119
  517. package/dist/theme/constants.d.ts +0 -8
  518. package/dist/theme/constants.js +0 -38
  519. package/dist/theme/index.d.ts +0 -6
  520. package/dist/theme/index.js +0 -7
  521. package/dist/theme/types.d.ts +0 -195
  522. package/dist/theme/types.js +0 -10
  523. package/dist/theme/typography.d.ts +0 -2
  524. package/dist/theme/typography.js +0 -73
  525. package/dist/theme/variants/dark.d.ts +0 -2
  526. package/dist/theme/variants/dark.js +0 -125
  527. package/dist/theme/variants/light.d.ts +0 -2
  528. package/dist/theme/variants/light.js +0 -125
  529. package/dist/toast/ToastContainer.d.ts +0 -10
  530. package/dist/toast/ToastContainer.js +0 -31
  531. package/dist/toast/ToastWrapper.d.ts +0 -6
  532. package/dist/toast/ToastWrapper.js +0 -27
  533. package/dist/transform/Flash.d.ts +0 -7
  534. package/dist/transform/Flash.js +0 -18
  535. package/dist/transform/Spin.d.ts +0 -14
  536. package/dist/transform/Spin.js +0 -25
  537. package/dist/utils/linaria.d.ts +0 -1
  538. package/dist/utils/linaria.js +0 -8
package/README.md CHANGED
@@ -1,81 +1,78 @@
1
1
  # @galaxy-io/dls
2
2
 
3
- Galaxy Design Language System — a React component library with precompiled styles. Zero bundler configuration required.
3
+ The Galaxy Design Language System: the one React component library for Filament, the GX app and every Galaxy React surface. Monochrome, dense, hairline-quiet; precompiled Linaria CSS read through CSS custom properties, so a theme switch never re-renders the app.
4
4
 
5
5
  ![NPM Version](https://img.shields.io/npm/v/%40galaxy-io%2Fdls)
6
6
 
7
- ## Installation
7
+ ## Install
8
8
 
9
9
  ```bash
10
- npm install @galaxy-io/dls
11
- # or
12
10
  pnpm add @galaxy-io/dls
13
11
  ```
14
12
 
15
- **Peer dependencies:** `react` (18 or 19), `react-dom`, `@tanstack/react-query`
13
+ Node ≥ 22, React 18 or 19, ESM. Heavy single-component libraries (charts, tables, the code editor, code highlighting, Markdown, the cron and color inputs, 3D and animated brand marks) are optional peers; [getting-started.md](./docs/getting-started.md#install) lists which subpath needs which.
16
14
 
17
- ## Quick Start
15
+ ## Quick start
18
16
 
19
17
  ```tsx
20
- // 1. Import the stylesheet once at your app root
18
+ // Once, at the app root: component styles, tokens, fonts.
21
19
  import "@galaxy-io/dls/styles.css";
20
+ import "@galaxy-io/dls/tokens.css";
21
+ import "@galaxy-io/dls/fonts.css";
22
22
 
23
- // 2. Wrap your app in the theme provider
24
- import { GalaxyThemeProvider } from "@galaxy-io/dls/theme/GalaxyTheme";
23
+ import { PlusIcon } from "@phosphor-icons/react";
24
+ import Button, { ButtonVariant } from "@galaxy-io/dls/buttons/Button";
25
+ import Flex, { FlexDirection } from "@galaxy-io/dls/layout/Flex";
26
+ import Text, { TextSize, TextWeight } from "@galaxy-io/dls/text/Text";
27
+ import GalaxyProvider from "@galaxy-io/dls/theme/GalaxyProvider";
25
28
 
26
- // 3. Import components by subpath
27
- import Button, { ButtonVariant, ButtonSize } from "@galaxy-io/dls/buttons/Button";
28
- import Text, { TextVariant, TextSize } from "@galaxy-io/dls/text/Text";
29
-
30
- function App() {
29
+ export function App() {
31
30
  return (
32
- <GalaxyThemeProvider>
33
- <Text variant={TextVariant.PRIMARY} size={TextSize.BODY_MD}>
34
- Hello, Galaxy
35
- </Text>
36
- <Button
37
- label="Get Started"
38
- variant={ButtonVariant.PRIMARY}
39
- size={ButtonSize.MEDIUM}
40
- onClick={() => {}}
41
- />
42
- </GalaxyThemeProvider>
31
+ <GalaxyProvider>
32
+ <Flex direction={FlexDirection.COLUMN} gap={16} padding={24}>
33
+ <Text as="h1" size={TextSize.HEADING_MD} weight={TextWeight.MEDIUM}>
34
+ Sources
35
+ </Text>
36
+ <Flex gap={8}>
37
+ <Button label="New source" icon={PlusIcon} />
38
+ <Button label="Import" variant={ButtonVariant.SECONDARY} />
39
+ </Flex>
40
+ </Flex>
41
+ </GalaxyProvider>
43
42
  );
44
43
  }
45
44
  ```
46
45
 
47
- ## Theming
46
+ - Import every component from its own subpath; its enums come from the same module. There is no barrel.
47
+ - `GalaxyProvider` is the one root: theme (System / Dark / Light), the overlay stack and toasts.
48
+ - Style your own code with Linaria and the token accessor `t` (`@galaxy-io/dls/theme/tokens/t`), set up with `galaxyDls()` from `@galaxy-io/dls/vite`. Lint with `"extends": ["@galaxy-io/dls/biome"]`.
48
49
 
49
- The provider respects system preferences by default:
50
+ ## Documentation
50
51
 
51
- ```tsx
52
- import { GalaxyThemeProvider } from "@galaxy-io/dls/theme/GalaxyTheme";
53
- import { GalaxyTheme } from "@galaxy-io/dls/theme/constants";
52
+ | | |
53
+ |---|---|
54
+ | [Getting started](./docs/getting-started.md) | Install, Vite, stylesheets, provider, SSR |
55
+ | [Theming](./docs/theming.md) | Themes and every token |
56
+ | [Components](./docs/components.md) | Every component, when to use it, examples |
57
+ | [Patterns](./docs/patterns.md) | How Galaxy screens are built |
58
+ | [Accessibility](./docs/accessibility.md) | The floor and the keyboard maps |
59
+ | [Migrating from 1.x](./docs/MIGRATION.md) | The codemod and every change since 1.6.1 |
60
+ | [Contributing](./docs/contributing.md) | Working on this repository ([AGENTS.md](./AGENTS.md) has the rules) |
61
+ | [Storybook](https://storybook.getgalaxy.io) | Every component, prop and state, in both themes |
54
62
 
55
- // System preference (default)
56
- <GalaxyThemeProvider />
63
+ ## Migrating from 1.x
57
64
 
58
- // Force a specific theme
59
- <GalaxyThemeProvider initialTheme={GalaxyTheme.DARK} />
65
+ ```bash
66
+ npx @galaxy-io/dls-codemod src --report dls-migrate.json
60
67
  ```
61
68
 
62
- Access theme state in components:
63
-
64
- ```tsx
65
- import { useGalaxyTheme } from "@galaxy-io/dls/theme/GalaxyTheme";
66
-
67
- function ThemeSwitcher() {
68
- const { activeTheme, selectedTheme, setTheme } = useGalaxyTheme();
69
- }
70
- ```
69
+ The codemod rewrites everything mechanical and marks the rest with `@dls-migrate <id>` comments; [docs/MIGRATION.md](./docs/MIGRATION.md) explains every id.
71
70
 
72
- ## Components
71
+ ## Claude skill
73
72
 
74
- Import from subpaths — there is no barrel export:
73
+ [`skills/galaxy-ui`](./skills/galaxy-ui/SKILL.md) teaches Claude to design and build Galaxy UIs with this package: the workflow, the brand rules, the component decision tables, tokens, patterns and complete screen recipes. Its examples are type-checked against this repository (`pnpm skill:check`).
75
74
 
76
- ```tsx
77
- import Button from "@galaxy-io/dls/buttons/Button";
78
- import Text from "@galaxy-io/dls/text/Text";
79
- ```
75
+ - **Claude Code:** copy the folder into your skills directory: `cp -R skills/galaxy-ui ~/.claude/skills/` (or a project's `.claude/skills/`).
76
+ - **Claude apps:** run `pnpm skill:pack` and upload `dist-skill/galaxy-ui.zip` as a skill (Settings → Capabilities → Skills).
80
77
 
81
- To explore all available components, visit [Storybook](https://storybook.getgalaxy.io).
78
+ Details: [skills/galaxy-ui/README.md](./skills/galaxy-ui/README.md).
@@ -0,0 +1,74 @@
1
+ {
2
+ "formatter": {
3
+ "enabled": true,
4
+ "indentStyle": "space",
5
+ "indentWidth": 2,
6
+ "lineWidth": 100
7
+ },
8
+ "javascript": {
9
+ "formatter": {
10
+ "quoteStyle": "double",
11
+ "trailingCommas": "all",
12
+ "semicolons": "always"
13
+ }
14
+ },
15
+ "json": {
16
+ "formatter": {
17
+ "trailingCommas": "none"
18
+ }
19
+ },
20
+ "linter": {
21
+ "enabled": true,
22
+ "rules": {
23
+ "preset": "recommended",
24
+ "correctness": {
25
+ "noRestrictedElements": {
26
+ "level": "warn",
27
+ "options": {
28
+ "elements": {
29
+ "p": "DLS: render text through `Text as=\"p\"`.",
30
+ "h1": "DLS: render headings through `Text as=\"h1\"`.",
31
+ "h2": "DLS: render headings through `Text as=\"h2\"`.",
32
+ "h3": "DLS: render headings through `Text as=\"h3\"`.",
33
+ "h4": "DLS: render headings through `Text as=\"h4\"`.",
34
+ "h5": "DLS: render headings through `Text as=\"h5\"`.",
35
+ "h6": "DLS: render headings through `Text as=\"h6\"`.",
36
+ "span": "DLS: render inline text through `Span`.",
37
+ "label": "DLS: render labels through `Text as=\"label\"` (or `Field`)."
38
+ }
39
+ }
40
+ }
41
+ },
42
+ "performance": {
43
+ "noBarrelFile": "warn",
44
+ "noReExportAll": "warn"
45
+ }
46
+ }
47
+ },
48
+ "plugins": [
49
+ {
50
+ "path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-hex-literal.grit",
51
+ "includes": ["**", "!**/*.test.ts", "!**/*.test.tsx"]
52
+ },
53
+ {
54
+ "path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-margin.grit",
55
+ "includes": ["**"]
56
+ },
57
+ {
58
+ "path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-inline-style.grit",
59
+ "includes": ["**", "!**/*.stories.tsx"]
60
+ }
61
+ ],
62
+ "overrides": [
63
+ {
64
+ "includes": ["**/*.stories.tsx", "**/*.mdx"],
65
+ "linter": {
66
+ "rules": {
67
+ "correctness": {
68
+ "noRestrictedElements": "off"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ]
74
+ }
@@ -0,0 +1,20 @@
1
+ // DLS: no hex color literal outside src/theme/tokens/ (Constitution III.5).
2
+ // Scoped in biome.json (`plugins[].includes`); colors come from `t.color.*`.
3
+ language js
4
+
5
+ or {
6
+ JsStringLiteralExpression() as $literal where {
7
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
8
+ },
9
+ JsTemplateChunkElement() as $literal where {
10
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
11
+ },
12
+ JsxString() as $literal where {
13
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
14
+ },
15
+ JsxText() as $literal where {
16
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
17
+ }
18
+ } where {
19
+ register_diagnostic(span=$literal, message="DLS: no hex color literal outside src/theme/tokens/. Use a `t.color.*` token.", severity="error")
20
+ }
@@ -0,0 +1,13 @@
1
+ // DLS: no inline `style={{ … }}` except to set CSS custom properties (Constitution IV.1).
2
+ // `style={{ "--gx-x": value, ["--gx-y"]: value, ...style }}` is fine; `style={{ color: … }}`,
3
+ // `style={{ color }}` (shorthand) and `style={{ [key]: … }}` (non-`--` computed key) are not.
4
+ language js
5
+
6
+ JsxAttribute(name=$name, initializer=$value) where {
7
+ $name <: "style",
8
+ $value <: contains or {
9
+ JsPropertyObjectMember(name=$key) as $member where { $key <: not r"(?s)(?:\[\s*)?[\"'`]--.*" },
10
+ JsShorthandPropertyObjectMember() as $member
11
+ },
12
+ register_diagnostic(span=$member, message="DLS: inline style may only set CSS custom properties (`--gx-*`). Style with Linaria.", severity="error")
13
+ }
@@ -0,0 +1,9 @@
1
+ // DLS: margins are forbidden (Constitution II.5). Spacing is `gap` and `padding` only.
2
+ // Matches any `margin` / `margin-*` declaration with a non-zero value inside a template
3
+ // (Linaria `css` / `styled`). `margin: 0` (a reset) is allowed.
4
+ language js
5
+
6
+ JsTemplateChunkElement() as $chunk where {
7
+ $chunk <: r"(?s).*(?:^|[^-a-zA-Z])margin(?:-[a-z]+)*\s*:\s*(?:[1-9]|0\.|0\s+[^;\s]|-|[a-zA-Z]|$).*",
8
+ register_diagnostic(span=$chunk, message="DLS: no margins. Use `gap` / `padding` on Flex, Grid or Box.", severity="error")
9
+ }
@@ -0,0 +1,23 @@
1
+ // DLS: no hex color literal (Constitution III.5). Colors come from `t.color.*`.
2
+ // Warn copy of biome/plugins/no-hex-literal.grit for the @galaxy-io/dls/biome preset; the pattern
3
+ // must stay identical (scripts/biome-preset.test.ts). Scoped in biome/index.json. An app's own
4
+ // file of hex values (chart seeds, brand assets) opts out with
5
+ // `// biome-ignore-all lint/plugin: <reason>`.
6
+ language js
7
+
8
+ or {
9
+ JsStringLiteralExpression() as $literal where {
10
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
11
+ },
12
+ JsTemplateChunkElement() as $literal where {
13
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
14
+ },
15
+ JsxString() as $literal where {
16
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
17
+ },
18
+ JsxText() as $literal where {
19
+ $literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
20
+ }
21
+ } where {
22
+ register_diagnostic(span=$literal, message="DLS: no hex color literal. Use a `t.color.*` token.", severity="warn")
23
+ }
@@ -0,0 +1,13 @@
1
+ // DLS: no inline `style={{ … }}` except to set CSS custom properties (Constitution IV.1).
2
+ // Warn copy of biome/plugins/no-inline-style.grit for the @galaxy-io/dls/biome preset; the pattern
3
+ // must stay identical (scripts/biome-preset.test.ts). Scoped in biome/index.json.
4
+ language js
5
+
6
+ JsxAttribute(name=$name, initializer=$value) where {
7
+ $name <: "style",
8
+ $value <: contains or {
9
+ JsPropertyObjectMember(name=$key) as $member where { $key <: not r"(?s)(?:\[\s*)?[\"'`]--.*" },
10
+ JsShorthandPropertyObjectMember() as $member
11
+ },
12
+ register_diagnostic(span=$member, message="DLS: inline style may only set CSS custom properties (`--gx-*`). Style with Linaria.", severity="warn")
13
+ }
@@ -0,0 +1,9 @@
1
+ // DLS: margins are forbidden (Constitution II.5). Spacing is `gap` and `padding` only.
2
+ // Warn copy of biome/plugins/no-margin.grit for the @galaxy-io/dls/biome preset; the pattern must
3
+ // stay identical (scripts/biome-preset.test.ts). `margin: 0` (a reset) is allowed.
4
+ language js
5
+
6
+ JsTemplateChunkElement() as $chunk where {
7
+ $chunk <: r"(?s).*(?:^|[^-a-zA-Z])margin(?:-[a-z]+)*\s*:\s*(?:[1-9]|0\.|0\s+[^;\s]|-|[a-zA-Z]|$).*",
8
+ register_diagnostic(span=$chunk, message="DLS: no margins. Use `gap` / `padding` on Flex, Grid or Box.", severity="warn")
9
+ }
@@ -0,0 +1,44 @@
1
+ import { type AriaAttributes, type CSSProperties, type ReactNode } from "react";
2
+ /** Where focus goes on mount. */
3
+ export declare enum FocusScopeAutoFocus {
4
+ /** The first tabbable element, or the scope itself when there is none. */
5
+ FIRST = "FIRST",
6
+ /** Nowhere: focus stays where it is. */
7
+ NONE = "NONE"
8
+ }
9
+ export interface FocusScopeProps extends AriaAttributes {
10
+ /** The region focus is kept in. */
11
+ children?: ReactNode;
12
+ /**
13
+ * Keep focus inside: Tab and Shift+Tab wrap at the edges and focus that leaves is pulled back.
14
+ * Defaults to `true` on purpose (a behavior-primitive exception to Article V's `false` default):
15
+ * a focus trap that does not trap by default would be a footgun.
16
+ * @default true
17
+ */
18
+ isTrapped?: boolean;
19
+ /**
20
+ * On unmount, return focus to the element that had it before the scope mounted. Defaults to
21
+ * `true` on purpose (a behavior-primitive exception to Article V's `false` default).
22
+ * @default true
23
+ */
24
+ shouldRestoreFocus?: boolean;
25
+ /**
26
+ * On mount, focus the first tabbable element (or the scope itself when there is none) unless
27
+ * focus is already inside; `NONE` leaves focus where it is.
28
+ * @default FocusScopeAutoFocus.FIRST
29
+ */
30
+ autoFocus?: FocusScopeAutoFocus;
31
+ /** Escape was pressed inside the scope. The innermost scope with a handler gets it. */
32
+ onEscape?: () => void;
33
+ /** DOM id of the scope element. */
34
+ id?: string;
35
+ /** Any `data-*` attribute, forwarded to the scope element. */
36
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
37
+ /** Extra class on the scope element. */
38
+ className?: string;
39
+ /** Inline style on the scope element; only for setting CSS custom properties. */
40
+ style?: CSSProperties;
41
+ }
42
+ /** Keeps focus inside its children while mounted. */
43
+ declare const FocusScope: import("react").ForwardRefExoticComponent<FocusScopeProps & import("react").RefAttributes<HTMLDivElement>>;
44
+ export default FocusScope;
@@ -0,0 +1,229 @@
1
+ import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
2
+ /* empty css */
3
+ import { styled } from "@linaria/react";
4
+ import { createContext, forwardRef, useCallback, useContext, useRef, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/a11y/FocusScope.tsx
7
+ /**
8
+ * Keeps keyboard focus inside a region while it is mounted: moves focus in on mount, wraps Tab and
9
+ * Shift+Tab at the edges, pulls focus back when it escapes, and returns it to where it was on
10
+ * unmount. `Modal`, `Drawer`, `Menu` and `CommandPalette` are built on it.
11
+ *
12
+ * - **Nested scopes, innermost wins.** Only the innermost trapped scope enforces its trap; an outer
13
+ * scope pauses while a scope rendered inside it (in the React tree) is trapped, and resumes when
14
+ * that scope unmounts or stops trapping. Escape goes to the innermost scope with an `onEscape`.
15
+ * - **Portals.** "Inside" follows the React tree, not the DOM: focus in a portal rendered from
16
+ * within the scope (a Menu opened from a Modal) counts as inside, because React focus and key
17
+ * events bubble through portals to the scope.
18
+ *
19
+ * The scope renders one unstyled `div` (plus `FOCUS_RING`, for when it holds focus itself because
20
+ * it has nothing tabbable). SSR-safe: `document` is read only in effects and handlers.
21
+ */
22
+ /** Where focus goes on mount. */
23
+ var FocusScopeAutoFocus = /* @__PURE__ */ function(FocusScopeAutoFocus) {
24
+ /** The first tabbable element, or the scope itself when there is none. */
25
+ FocusScopeAutoFocus["FIRST"] = "FIRST";
26
+ /** Nowhere: focus stays where it is. */
27
+ FocusScopeAutoFocus["NONE"] = "NONE";
28
+ return FocusScopeAutoFocus;
29
+ }({});
30
+ /**
31
+ * Trapped scopes in the order they started trapping. Module state holds no DOM, so the module
32
+ * stays SSR-safe; it is only read and written from effects and event handlers.
33
+ */
34
+ var TRAPPED_SCOPES = [];
35
+ /** The enclosing scope, for nesting. Context crosses portals, like the events do. */
36
+ var FocusScopeContext = createContext(null);
37
+ /** Candidates for sequential focus; `tabbableElements` filters them further. */
38
+ var TABBABLE_SELECTOR = [
39
+ "a[href]",
40
+ "area[href]",
41
+ "button:not(:disabled)",
42
+ "input:not(:disabled):not([type=\"hidden\"])",
43
+ "select:not(:disabled)",
44
+ "textarea:not(:disabled)",
45
+ "iframe",
46
+ "audio[controls]",
47
+ "video[controls]",
48
+ "summary",
49
+ "[contenteditable]:not([contenteditable=\"false\"])",
50
+ "[tabindex]"
51
+ ].join(",");
52
+ var isAncestor = (ancestor, node) => {
53
+ for (let parent = node.parent; parent !== null; parent = parent.parent) if (parent === ancestor) return true;
54
+ return false;
55
+ };
56
+ /**
57
+ * The scope whose trap is in force: the most recent trapped scope with no trapped scope nested
58
+ * inside it.
59
+ */
60
+ var activeScope = () => {
61
+ for (let index = TRAPPED_SCOPES.length - 1; index >= 0; index -= 1) {
62
+ const scope = TRAPPED_SCOPES[index];
63
+ if (scope && !TRAPPED_SCOPES.some((other) => other !== scope && isAncestor(scope, other))) return scope;
64
+ }
65
+ return null;
66
+ };
67
+ var isRendered = (element) => element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden";
68
+ /** A radio is tabbable when it is the checked one of its group, or the group has none checked. */
69
+ var isTabbableRadio = (element, root) => {
70
+ if (!(element instanceof HTMLInputElement) || element.type !== "radio" || element.name === "") return true;
71
+ const group = Array.from(root.querySelectorAll(`input[type="radio"][name="${CSS.escape(element.name)}"]`)).filter((radio) => radio.form === element.form);
72
+ const checked = group.find((radio) => radio.checked);
73
+ return checked ? checked === element : group[0] === element;
74
+ };
75
+ /** The elements under `root` that Tab visits, in Tab order (positive `tabindex` first). */
76
+ var tabbableElements = (root) => {
77
+ const candidates = Array.from(root.querySelectorAll(TABBABLE_SELECTOR)).filter((element) => element.tabIndex >= 0 && element.closest("[inert]") === null && isRendered(element) && isTabbableRadio(element, root));
78
+ return [...candidates.filter((element) => element.tabIndex > 0).sort((a, b) => a.tabIndex - b.tabIndex), ...candidates.filter((element) => element.tabIndex === 0)];
79
+ };
80
+ /** Focus the first (or last) tabbable element under `root`, or `root` itself when there is none. */
81
+ var focusEdge = (root, edge) => {
82
+ const tabbables = tabbableElements(root);
83
+ ((edge === "first" ? tabbables[0] : tabbables.at(-1)) ?? root).focus();
84
+ };
85
+ var Root = /*#__PURE__*/ styled("div")({
86
+ name: "Root",
87
+ class: "gx-FocusScope-ry2i33n",
88
+ propsAsIs: false
89
+ });
90
+ /** Keeps focus inside its children while mounted. */
91
+ var FocusScope = forwardRef(function FocusScope({ children, isTrapped = true, shouldRestoreFocus = true, autoFocus = "FIRST", onEscape, id, className, style, ...rest }, ref) {
92
+ const parent = useContext(FocusScopeContext);
93
+ const [scope] = useState(() => ({ parent }));
94
+ /** Focus before the scope mounted, read on the first render (before any child `autoFocus`). */
95
+ const [focusBeforeMount] = useState(() => typeof document === "undefined" ? null : document.activeElement);
96
+ const rootRef = useRef(null);
97
+ /** The last element focused inside the scope, including in portals. */
98
+ const lastFocusedRef = useRef(null);
99
+ /** The last element focused in the scope's own DOM (not a portal): a portal's anchor. */
100
+ const lastFocusedInRootRef = useRef(null);
101
+ /** The last native focus or key event React delivered to the scope (DOM or portal descendant). */
102
+ const insideEventRef = useRef(null);
103
+ const shouldRestoreFocusRef = useRef(shouldRestoreFocus);
104
+ shouldRestoreFocusRef.current = shouldRestoreFocus;
105
+ const autoFocusRef = useRef(autoFocus);
106
+ autoFocusRef.current = autoFocus;
107
+ const setRootRef = useCallback((node) => {
108
+ rootRef.current = node;
109
+ if (typeof ref === "function") ref(node);
110
+ else if (ref) ref.current = node;
111
+ }, [ref]);
112
+ useIsomorphicLayoutEffect(() => {
113
+ const root = rootRef.current;
114
+ if (!isTrapped || root === null) return;
115
+ TRAPPED_SCOPES.push(scope);
116
+ const isActive = () => activeScope() === scope;
117
+ const isInside = (event) => event.target instanceof Node && root.contains(event.target) || insideEventRef.current === event;
118
+ /** Set by a Tab pressed in a portal of this scope, for the focus move that follows it. */
119
+ let portalTab = null;
120
+ let portalTabTimer;
121
+ const onKeyDown = (event) => {
122
+ if (event.key !== "Tab" || event.defaultPrevented || !isActive()) return;
123
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
124
+ const target = event.target;
125
+ if (!(target instanceof Element) || !root.contains(target)) {
126
+ if (isInside(event)) {
127
+ portalTab = event.shiftKey ? "backward" : "forward";
128
+ clearTimeout(portalTabTimer);
129
+ portalTabTimer = setTimeout(() => {
130
+ portalTab = null;
131
+ });
132
+ return;
133
+ }
134
+ event.preventDefault();
135
+ focusEdge(root, event.shiftKey ? "last" : "first");
136
+ return;
137
+ }
138
+ const tabbables = tabbableElements(root);
139
+ const first = tabbables[0];
140
+ const last = tabbables.at(-1);
141
+ if (first === void 0 || last === void 0) {
142
+ event.preventDefault();
143
+ root.focus();
144
+ return;
145
+ }
146
+ const index = tabbables.indexOf(target);
147
+ if (index === -1) {
148
+ event.preventDefault();
149
+ (event.shiftKey ? tabbables.findLast((element) => (target.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING) !== 0) ?? last : tabbables.find((element) => (target.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0) ?? first).focus();
150
+ } else if (event.shiftKey && index === 0) {
151
+ event.preventDefault();
152
+ last.focus();
153
+ } else if (!event.shiftKey && index === tabbables.length - 1) {
154
+ event.preventDefault();
155
+ first.focus();
156
+ }
157
+ };
158
+ const onFocusIn = (event) => {
159
+ const direction = portalTab;
160
+ portalTab = null;
161
+ if (!isActive() || isInside(event)) return;
162
+ const anchor = lastFocusedInRootRef.current;
163
+ const hasAnchor = (anchor instanceof HTMLElement || anchor instanceof SVGElement) && root.contains(anchor);
164
+ if (direction !== null && hasAnchor) {
165
+ const next = direction === "forward" ? tabbableElements(root).find((element) => (anchor.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0) : anchor;
166
+ if (next) next.focus();
167
+ else focusEdge(root, "first");
168
+ return;
169
+ }
170
+ const previous = lastFocusedRef.current;
171
+ if ((previous instanceof HTMLElement || previous instanceof SVGElement) && previous.isConnected) {
172
+ previous.focus();
173
+ return;
174
+ }
175
+ focusEdge(root, "first");
176
+ };
177
+ document.addEventListener("keydown", onKeyDown);
178
+ document.addEventListener("focusin", onFocusIn);
179
+ return () => {
180
+ document.removeEventListener("keydown", onKeyDown);
181
+ document.removeEventListener("focusin", onFocusIn);
182
+ clearTimeout(portalTabTimer);
183
+ const index = TRAPPED_SCOPES.lastIndexOf(scope);
184
+ if (index !== -1) TRAPPED_SCOPES.splice(index, 1);
185
+ };
186
+ }, [isTrapped, scope]);
187
+ useIsomorphicLayoutEffect(() => {
188
+ const root = rootRef.current;
189
+ if (root === null) return;
190
+ if (autoFocusRef.current === "FIRST" && !root.contains(document.activeElement)) focusEdge(root, "first");
191
+ return () => {
192
+ if (!shouldRestoreFocusRef.current) return;
193
+ const active = document.activeElement;
194
+ if ((active === null || active === document.body || root.contains(active) || active === lastFocusedRef.current) && (focusBeforeMount instanceof HTMLElement || focusBeforeMount instanceof SVGElement) && focusBeforeMount.isConnected) focusBeforeMount.focus();
195
+ };
196
+ }, [focusBeforeMount]);
197
+ const onFocusCapture = (event) => {
198
+ insideEventRef.current = event.nativeEvent;
199
+ lastFocusedRef.current = event.target;
200
+ if (event.currentTarget.contains(event.target)) lastFocusedInRootRef.current = event.target;
201
+ };
202
+ const onKeyDownCapture = (event) => {
203
+ insideEventRef.current = event.nativeEvent;
204
+ };
205
+ const onKeyDown = (event) => {
206
+ if (event.key !== "Escape" || onEscape === void 0) return;
207
+ if (event.defaultPrevented || event.nativeEvent.isComposing) return;
208
+ event.stopPropagation();
209
+ onEscape();
210
+ };
211
+ return /* @__PURE__ */ jsx(FocusScopeContext.Provider, {
212
+ value: scope,
213
+ children: /* @__PURE__ */ jsx(Root, {
214
+ ...rest,
215
+ ref: setRootRef,
216
+ id,
217
+ tabIndex: -1,
218
+ onFocusCapture,
219
+ onKeyDownCapture,
220
+ onKeyDown,
221
+ className,
222
+ style,
223
+ children
224
+ })
225
+ });
226
+ });
227
+ FocusScope.displayName = "FocusScope";
228
+ //#endregion
229
+ export { FocusScopeAutoFocus, FocusScope as default };
@@ -0,0 +1,21 @@
1
+ import { type AriaAttributes, type CSSProperties, type ElementType, type ReactNode } from "react";
2
+ export interface VisuallyHiddenProps extends AriaAttributes {
3
+ /** What screen readers announce. */
4
+ children?: ReactNode;
5
+ /**
6
+ * Element or component to render (`"div"` for block content, `"label"` for a hidden label).
7
+ * @default "span"
8
+ */
9
+ as?: ElementType;
10
+ /** DOM id, e.g. the target of an `aria-describedby`. */
11
+ id?: string;
12
+ /** Any `data-*` attribute, forwarded to the root element. */
13
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
14
+ /** Extra class on the root element. */
15
+ className?: string;
16
+ /** Inline style on the root element; only for setting CSS custom properties. */
17
+ style?: CSSProperties;
18
+ }
19
+ /** Renders its children for assistive technology only. */
20
+ declare const VisuallyHidden: import("react").ForwardRefExoticComponent<VisuallyHiddenProps & import("react").RefAttributes<HTMLElement>>;
21
+ export default VisuallyHidden;
@@ -0,0 +1,30 @@
1
+ /* empty css */
2
+ import { styled } from "@linaria/react";
3
+ import { forwardRef } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/a11y/VisuallyHidden.tsx
6
+ /**
7
+ * Content for screen readers only: removed from the visual layout with the `VISUALLY_HIDDEN`
8
+ * mixin, still in the accessibility tree. Use it for the accessible name of an icon-only control,
9
+ * a live-region announcement, or a heading a sighted user does not need.
10
+ */
11
+ var Root = /*#__PURE__*/ styled("span")({
12
+ name: "Root",
13
+ class: "gx-VisuallyHidden-r1n9rkuz",
14
+ propsAsIs: false
15
+ });
16
+ /** Renders its children for assistive technology only. */
17
+ var VisuallyHidden = forwardRef(function VisuallyHidden({ children, as = "span", id, className, style, ...rest }, ref) {
18
+ return /* @__PURE__ */ jsx(Root, {
19
+ ...rest,
20
+ as,
21
+ ref,
22
+ id,
23
+ className,
24
+ style,
25
+ children
26
+ });
27
+ });
28
+ VisuallyHidden.displayName = "VisuallyHidden";
29
+ //#endregion
30
+ export { VisuallyHidden as default };