@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
@@ -0,0 +1,101 @@
1
+ import { type AriaAttributes, type CSSProperties } from "react";
2
+ /** Canonical rungs; DurationInput supports all five (the Input rung table). */
3
+ export declare enum DurationInputSize {
4
+ /** 20px field, caption text. */
5
+ X_SMALL = "X_SMALL",
6
+ /** 24px field, body_sm text. */
7
+ SMALL = "SMALL",
8
+ /** 32px field, body_md text. The default. */
9
+ MEDIUM = "MEDIUM",
10
+ /** 36px field, body_lg text. */
11
+ LARGE = "LARGE",
12
+ /** 40px field, body_lg text. */
13
+ X_LARGE = "X_LARGE"
14
+ }
15
+ /** Resting fill of the field (Constitution V-A surface set; the InputVariant members). */
16
+ export declare enum DurationInputVariant {
17
+ /** `background.base` fill. */
18
+ BASE = "BASE",
19
+ /** `background.primary` fill. The default. */
20
+ PRIMARY = "PRIMARY",
21
+ /** `background.secondary` fill. */
22
+ SECONDARY = "SECONDARY",
23
+ /** `background.tertiary` fill. */
24
+ TERTIARY = "TERTIARY"
25
+ }
26
+ export interface DurationInputProps extends AriaAttributes {
27
+ /** Controlled duration in milliseconds. `null` is an empty field. Pass it with `onChange`. */
28
+ value?: number | null;
29
+ /**
30
+ * Initial duration while uncontrolled.
31
+ * @default null
32
+ */
33
+ defaultValue?: number | null;
34
+ /** Called when an edit is committed (focus leaves the field, Enter, or an arrow step), with whole seconds in milliseconds, clamped to `min` / `max`, and only if it changed. `null` when every segment is empty. */
35
+ onChange?: (value: number | null) => void;
36
+ /**
37
+ * Shortest allowed duration, in milliseconds. Commits and steps clamp to it. Never below `0`.
38
+ * @default 0
39
+ */
40
+ min?: number;
41
+ /** Longest allowed duration, in milliseconds. Commits and steps clamp to it. */
42
+ max?: number;
43
+ /**
44
+ * Control rung: 20 / 24 / 32 / 36 / 40px tall.
45
+ * @default DurationInputSize.MEDIUM
46
+ */
47
+ size?: DurationInputSize;
48
+ /**
49
+ * Resting fill, from the surface set. Ignored with `isGhost`.
50
+ * @default DurationInputVariant.PRIMARY
51
+ */
52
+ variant?: DurationInputVariant;
53
+ /**
54
+ * Ghost field: no fill and no hairline at rest; the frame appears on hover and focus (1.x
55
+ * `TRANSPARENT`). For durations set into a toolbar or a table cell.
56
+ * @default false
57
+ */
58
+ isGhost?: boolean;
59
+ /** Label above the field, rendered through `Field`. For a description or a horizontal layout, wrap the input in `Field` instead. */
60
+ label?: string;
61
+ /** Message from the app, shown under the field through `Field`. Also turns the border red and sets `aria-invalid` on each segment. */
62
+ error?: string;
63
+ /**
64
+ * Error border and `aria-invalid` without a message. `error` implies it.
65
+ * @default false
66
+ */
67
+ isError?: boolean;
68
+ /**
69
+ * No segment is focusable or editable. Shows the disabled look.
70
+ * @default false
71
+ */
72
+ isDisabled?: boolean;
73
+ /**
74
+ * Segments are focusable and selectable but cannot change; no stepping.
75
+ * @default false
76
+ */
77
+ isReadOnly?: boolean;
78
+ /**
79
+ * Required marker on the `label` (via `Field`) and `aria-required` on each segment. No validation.
80
+ * @default false
81
+ */
82
+ isRequired?: boolean;
83
+ /**
84
+ * Stretch the frame to the parent's width; the segments stay at the start.
85
+ * @default false
86
+ */
87
+ fillWidth?: boolean;
88
+ /** Accessible name of the group when there is no visible label (no `label` and no wrapping `Field`). */
89
+ ariaLabel?: string;
90
+ /** DOM id of the hours segment, so a `Field` label focuses it. A wrapping `Field`'s id wins. */
91
+ id?: string;
92
+ /** Any `data-*` attribute, forwarded to the group element. */
93
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
94
+ /** Extra class on the root: the `Field` wrapper when DurationInput renders one, otherwise the frame. */
95
+ className?: string;
96
+ /** Inline style on the root; only for setting CSS custom properties. */
97
+ style?: CSSProperties;
98
+ }
99
+ /** A length of time in hours, minutes and seconds; the value is milliseconds. */
100
+ declare const DurationInput: import("react").ForwardRefExoticComponent<DurationInputProps & import("react").RefAttributes<HTMLDivElement>>;
101
+ export default DurationInput;
@@ -0,0 +1,441 @@
1
+ import Text, { TextSize, TextVariant } from "../text/Text.js";
2
+ import { useControlledState } from "../hooks/useControlledState.js";
3
+ import { useDevWarning } from "./internal/devWarn.js";
4
+ import { useFieldWiring } from "./internal/fieldWiring.js";
5
+ import Field, { FieldSize } from "./Field.js";
6
+ import { rootStyle, useOwnField } from "./internal/ownField.js";
7
+ /* empty css */
8
+ import { styled } from "@linaria/react";
9
+ import { forwardRef, useRef, useState } from "react";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { cx } from "@linaria/core";
12
+ import { useMergeRefs } from "@floating-ui/react";
13
+ //#region src/inputs/DurationInput.tsx
14
+ /**
15
+ * The form control for a length of time (a timeout, a retention window, a sync interval): one
16
+ * field with three numeric segments, hours, minutes and seconds, each followed by its unit
17
+ * ("1 h 30 m 0 s"), like a native time field. Each segment is a `spinbutton`: type into it, or
18
+ * step it with the arrow keys (stepping past 59 carries into the next unit).
19
+ *
20
+ * The value is a number of milliseconds (`number | null`), reported when the edit is committed
21
+ * (focus leaves the field, Enter, or a step) and normalized (`90 m` becomes `1 h 30 m`), clamped
22
+ * to `min` / `max`. DurationInput never validates (`error` comes from the app) and shows neither
23
+ * days nor milliseconds. New in 2.0 (1.x apps used a `NumberInput` with a unit suffix).
24
+ */
25
+ /** Canonical rungs; DurationInput supports all five (the Input rung table). */
26
+ var DurationInputSize = /* @__PURE__ */ function(DurationInputSize) {
27
+ /** 20px field, caption text. */
28
+ DurationInputSize["X_SMALL"] = "X_SMALL";
29
+ /** 24px field, body_sm text. */
30
+ DurationInputSize["SMALL"] = "SMALL";
31
+ /** 32px field, body_md text. The default. */
32
+ DurationInputSize["MEDIUM"] = "MEDIUM";
33
+ /** 36px field, body_lg text. */
34
+ DurationInputSize["LARGE"] = "LARGE";
35
+ /** 40px field, body_lg text. */
36
+ DurationInputSize["X_LARGE"] = "X_LARGE";
37
+ return DurationInputSize;
38
+ }({});
39
+ /** Resting fill of the field (Constitution V-A surface set; the InputVariant members). */
40
+ var DurationInputVariant = /* @__PURE__ */ function(DurationInputVariant) {
41
+ /** `background.base` fill. */
42
+ DurationInputVariant["BASE"] = "BASE";
43
+ /** `background.primary` fill. The default. */
44
+ DurationInputVariant["PRIMARY"] = "PRIMARY";
45
+ /** `background.secondary` fill. */
46
+ DurationInputVariant["SECONDARY"] = "SECONDARY";
47
+ /** `background.tertiary` fill. */
48
+ DurationInputVariant["TERTIARY"] = "TERTIARY";
49
+ return DurationInputVariant;
50
+ }({});
51
+ /** The three units, largest first. */
52
+ var DURATION_SEGMENTS = [
53
+ {
54
+ ms: 36e5,
55
+ unit: "h",
56
+ name: "Hours",
57
+ singular: "hour",
58
+ plural: "hours",
59
+ maxLength: 4
60
+ },
61
+ {
62
+ ms: 6e4,
63
+ unit: "m",
64
+ name: "Minutes",
65
+ singular: "minute",
66
+ plural: "minutes",
67
+ maxLength: 2
68
+ },
69
+ {
70
+ ms: 1e3,
71
+ unit: "s",
72
+ name: "Seconds",
73
+ singular: "second",
74
+ plural: "seconds",
75
+ maxLength: 2
76
+ }
77
+ ];
78
+ var SEGMENT_INDEXES = [
79
+ 0,
80
+ 1,
81
+ 2
82
+ ];
83
+ /** Splits milliseconds into whole hours, minutes (0–59) and seconds (0–59); `null` is all empty. */
84
+ function split(value) {
85
+ if (value === null || !Number.isFinite(value)) return [
86
+ "",
87
+ "",
88
+ ""
89
+ ];
90
+ const seconds = Math.floor(Math.max(0, value) / 1e3);
91
+ return [
92
+ String(Math.floor(seconds / 3600)),
93
+ String(Math.floor(seconds % 3600 / 60)),
94
+ String(seconds % 60)
95
+ ];
96
+ }
97
+ /** The drafts' total in milliseconds; every segment empty is `null`. */
98
+ function total(drafts) {
99
+ if (drafts.every((draft) => draft === "")) return null;
100
+ return drafts.reduce((sum, draft, index) => sum + (draft === "" ? 0 : Number(draft)) * DURATION_SEGMENTS[index].ms, 0);
101
+ }
102
+ /** True when two draft sets show the same thing. */
103
+ function isSameDrafts(a, b) {
104
+ return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
105
+ }
106
+ /** The visual box. Focus is drawn here as `FIELD_FOCUS` (`border.focused` at 1px inside) while a segment has focus. */
107
+ var Frame = /*#__PURE__*/ styled("div")({
108
+ name: "Frame",
109
+ class: "gx-DurationInput-Frame-f8uo2tx",
110
+ propsAsIs: false
111
+ });
112
+ /** One number and its unit, 2px apart. */
113
+ var Segment = /*#__PURE__*/ styled("span")({
114
+ name: "Segment",
115
+ class: "gx-DurationInput-Segment-s1o0yt82",
116
+ propsAsIs: false
117
+ });
118
+ /** The unit letter; not selectable. */
119
+ var Unit = /*#__PURE__*/ styled("span")({
120
+ name: "Unit",
121
+ class: "gx-DurationInput-Unit-ud4u3t1",
122
+ propsAsIs: false
123
+ });
124
+ /** A segment's `<input>`: no chrome of its own; as wide as its digits (at least two). */
125
+ var SegmentInput = /*#__PURE__*/ styled("input")({
126
+ name: "SegmentInput",
127
+ class: "gx-DurationInput-SegmentInput-s1bd1xmt",
128
+ propsAsIs: false
129
+ });
130
+ /** Rest look per variant: fill and hairline color. */
131
+ var DURATION_INPUT_VARIANT_TO_CSS_MAP = {
132
+ ["BASE"]: "gx-DurationInput-BASE-buxhc7z",
133
+ ["PRIMARY"]: "gx-DurationInput-PRIMARY-pstsbv2",
134
+ ["SECONDARY"]: "gx-DurationInput-SECONDARY-s1b09kps",
135
+ ["TERTIARY"]: "gx-DurationInput-TERTIARY-tmzngkt"
136
+ };
137
+ /** `isGhost`: no fill and no hairline at rest. Declared after the variant map, which it replaces. */
138
+ var GHOST_CSS = "gx-DurationInput-GHOST_CSS-guqgngu";
139
+ /**
140
+ * Hover on an editable field: `border.hovered` (stronger than `border.primary` in both themes,
141
+ * Constitution III.6).
142
+ */
143
+ var DURATION_INPUT_VARIANT_TO_HOVER_CSS_MAP = {
144
+ ["BASE"]: "gx-DurationInput-BASE-b1myver4",
145
+ ["PRIMARY"]: "gx-DurationInput-PRIMARY-p1rczld6",
146
+ ["SECONDARY"]: "gx-DurationInput-SECONDARY-s89p30c",
147
+ ["TERTIARY"]: "gx-DurationInput-TERTIARY-tztmk6y"
148
+ };
149
+ /** Hover on an editable ghost field: the frame appears, `border.hovered` with no fill. */
150
+ var GHOST_HOVER_CSS = "gx-DurationInput-GHOST_HOVER_CSS-g62uime";
151
+ /** Height, horizontal padding and the gap between segments per rung (Constitution III-A.4). */
152
+ var DURATION_INPUT_SIZE_TO_CSS_MAP = {
153
+ ["X_SMALL"]: "gx-DurationInput-X_SMALL-x6ryfhj",
154
+ ["SMALL"]: "gx-DurationInput-SMALL-s1o5x9ig",
155
+ ["MEDIUM"]: "gx-DurationInput-MEDIUM-m7cvvc6",
156
+ ["LARGE"]: "gx-DurationInput-LARGE-lsbk442",
157
+ ["X_LARGE"]: "gx-DurationInput-X_LARGE-xe3nwhm"
158
+ };
159
+ /** The segment's type at the rung's text step; its height is the line height (whole pixels). */
160
+ var DURATION_INPUT_SIZE_TO_FONT_CSS_MAP = {
161
+ ["X_SMALL"]: "gx-DurationInput-X_SMALL-xdfukzq",
162
+ ["SMALL"]: "gx-DurationInput-SMALL-s1yweir4",
163
+ ["MEDIUM"]: "gx-DurationInput-MEDIUM-ma156iy",
164
+ ["LARGE"]: "gx-DurationInput-LARGE-l53elg5",
165
+ ["X_LARGE"]: "gx-DurationInput-X_LARGE-x1atqgs0"
166
+ };
167
+ /** The unit's text step: the rung's control text. */
168
+ var DURATION_INPUT_SIZE_TO_TEXT_SIZE_MAP = {
169
+ ["X_SMALL"]: TextSize.CAPTION,
170
+ ["SMALL"]: TextSize.BODY_SM,
171
+ ["MEDIUM"]: TextSize.BODY_MD,
172
+ ["LARGE"]: TextSize.BODY_LG,
173
+ ["X_LARGE"]: TextSize.BODY_LG
174
+ };
175
+ /** The `Field` a DurationInput renders for its own `label` / `error` uses the same rung. */
176
+ var DURATION_INPUT_SIZE_TO_FIELD_SIZE_MAP = {
177
+ ["X_SMALL"]: FieldSize.X_SMALL,
178
+ ["SMALL"]: FieldSize.SMALL,
179
+ ["MEDIUM"]: FieldSize.MEDIUM,
180
+ ["LARGE"]: FieldSize.LARGE,
181
+ ["X_LARGE"]: FieldSize.X_LARGE
182
+ };
183
+ /** Error border at rest, on hover and with focus (the 1px inset focus line is red too). */
184
+ var ERROR_CSS = "gx-DurationInput-ERROR_CSS-e6b5wkm";
185
+ /**
186
+ * Disabled: the variant's resting fill and hairline are kept (`border.disabled` is not used on
187
+ * frames); the field reads as disabled through `text.disabled` and the cursor.
188
+ */
189
+ var DISABLED_CSS = "gx-DurationInput-DISABLED_CSS-d1j9h77i";
190
+ /** Stretch to the parent's width (frame, and the `Field` wrapper when there is one). */
191
+ var FILL_WIDTH_CSS = "gx-DurationInput-FILL_WIDTH_CSS-f4chal5";
192
+ /** The frame and its three segments, wired to the nearest Field (the input's own or the app's). */
193
+ function DurationFrame({ durationProps, forwardedRef, isRoot }) {
194
+ const { value, defaultValue = null, onChange, min = 0, max, size = "MEDIUM", variant = "PRIMARY", isGhost = false, label: _label, error, isError = false, isDisabled = false, isReadOnly = false, isRequired = false, fillWidth = false, ariaLabel, id, "aria-describedby": ariaDescribedBy, className, style, ...rest } = durationProps;
195
+ const { field, controlId, describedBy, isInvalid, isRequired: isRequiredState, hasName } = useFieldWiring({
196
+ id,
197
+ ariaLabel,
198
+ ariaLabelAttribute: rest["aria-label"],
199
+ ariaLabelledBy: rest["aria-labelledby"],
200
+ ariaDescribedBy,
201
+ error,
202
+ isError,
203
+ isRequired
204
+ });
205
+ const segmentIds = [
206
+ controlId,
207
+ `${controlId}-minutes`,
208
+ `${controlId}-seconds`
209
+ ];
210
+ const frameRef = useRef(null);
211
+ const mergedRef = useMergeRefs([frameRef, forwardedRef]);
212
+ const inputRefs = useRef([
213
+ null,
214
+ null,
215
+ null
216
+ ]);
217
+ const segmentRefs = useRef([
218
+ null,
219
+ null,
220
+ null
221
+ ]);
222
+ const [current, setValue] = useControlledState({
223
+ value,
224
+ defaultValue,
225
+ onChange
226
+ });
227
+ const [drafts, setDrafts] = useState(() => split(current));
228
+ const hasFocusRef = useRef(false);
229
+ const [lastValue, setLastValue] = useState(current);
230
+ if (lastValue !== current) {
231
+ setLastValue(current);
232
+ if (!(hasFocusRef.current && !isSameDrafts(drafts, split(lastValue)))) setDrafts(split(current));
233
+ }
234
+ const isEditable = !isDisabled && !isReadOnly;
235
+ const lowest = Math.max(min, 0);
236
+ const clamp = (ms) => {
237
+ const raised = Math.max(ms, lowest);
238
+ return max === void 0 ? raised : Math.min(raised, Math.max(max, lowest));
239
+ };
240
+ /** Reports `next` (clamped) if it changed and shows it normalized. */
241
+ const commitTotal = (next) => {
242
+ const committed = next === null ? null : clamp(next);
243
+ if (committed !== current) setValue(committed);
244
+ setDrafts(split(committed));
245
+ };
246
+ /** Commits the drafts when they differ from the value (an untouched value is never rewritten). */
247
+ const commit = () => {
248
+ if (!isEditable || isSameDrafts(drafts, split(current))) return;
249
+ commitTotal(total(drafts));
250
+ };
251
+ const focusSegment = (index) => {
252
+ const input = inputRefs.current[index];
253
+ if (input === null || input === void 0) return;
254
+ input.focus();
255
+ };
256
+ const step = (index, direction, times) => {
257
+ if (!isEditable) return;
258
+ commitTotal((total(drafts) ?? 0) + direction * times * DURATION_SEGMENTS[index].ms);
259
+ };
260
+ const handleChange = (index) => (event) => {
261
+ if (!isEditable) return;
262
+ const digits = event.target.value.replace(/\D/g, "").slice(0, DURATION_SEGMENTS[index].maxLength);
263
+ const next = [...drafts];
264
+ next[index] = digits;
265
+ setDrafts(next);
266
+ const native = event.nativeEvent;
267
+ if (index === 1 && digits.length === 2 && native.inputType?.startsWith("insert")) focusSegment(2);
268
+ };
269
+ const handleKeyDown = (index) => (event) => {
270
+ if (event.nativeEvent.isComposing) return;
271
+ const input = event.currentTarget;
272
+ const { key } = event;
273
+ const caretStart = input.selectionStart ?? 0;
274
+ const caretEnd = input.selectionEnd ?? 0;
275
+ switch (key) {
276
+ case "ArrowUp":
277
+ case "ArrowDown":
278
+ event.preventDefault();
279
+ step(index, key === "ArrowUp" ? 1 : -1, 1);
280
+ return;
281
+ case "PageUp":
282
+ case "PageDown":
283
+ event.preventDefault();
284
+ step(index, key === "PageUp" ? 1 : -1, 10);
285
+ return;
286
+ case "ArrowRight":
287
+ if (index < 2 && caretStart === caretEnd && caretEnd === input.value.length) {
288
+ event.preventDefault();
289
+ focusSegment(index + 1);
290
+ }
291
+ return;
292
+ case "ArrowLeft":
293
+ if (index > 0 && caretStart === caretEnd && caretStart === 0) {
294
+ event.preventDefault();
295
+ focusSegment(index - 1);
296
+ }
297
+ return;
298
+ case "Backspace":
299
+ if (index > 0 && input.value === "") {
300
+ event.preventDefault();
301
+ focusSegment(index - 1);
302
+ }
303
+ return;
304
+ case "Enter":
305
+ commit();
306
+ return;
307
+ default: break;
308
+ }
309
+ if ((key === ":" || key === " " || DURATION_SEGMENTS.some((segment) => segment.unit === key.toLowerCase())) && !event.metaKey && !event.ctrlKey && !event.altKey) {
310
+ event.preventDefault();
311
+ if (index < 2) focusSegment(index + 1);
312
+ }
313
+ };
314
+ const handleFocus = (event) => {
315
+ hasFocusRef.current = true;
316
+ event.currentTarget.select();
317
+ };
318
+ /** Focus leaving the frame commits the edit. */
319
+ const handleBlur = (event) => {
320
+ const next = event.relatedTarget;
321
+ if (next !== null && frameRef.current?.contains(next)) return;
322
+ hasFocusRef.current = false;
323
+ commit();
324
+ };
325
+ /** A press on a unit focuses its segment; elsewhere in the frame, the nearest segment. */
326
+ const handleFrameMouseDown = (event) => {
327
+ const target = event.target;
328
+ if (inputRefs.current.some((input) => input !== null && input === target)) return;
329
+ if (isDisabled) return;
330
+ event.preventDefault();
331
+ const owner = segmentRefs.current.findIndex((segment) => segment?.contains(target) === true);
332
+ if (owner !== -1) {
333
+ focusSegment(owner);
334
+ return;
335
+ }
336
+ let nearest = 2;
337
+ let distance = Number.POSITIVE_INFINITY;
338
+ inputRefs.current.forEach((input, index) => {
339
+ if (input === null) return;
340
+ const box = input.getBoundingClientRect();
341
+ const delta = event.clientX < box.left ? box.left - event.clientX : event.clientX > box.right ? event.clientX - box.right : 0;
342
+ if (delta < distance) {
343
+ distance = delta;
344
+ nearest = index;
345
+ }
346
+ });
347
+ focusSegment(nearest);
348
+ };
349
+ useDevWarning(!hasName, "[@galaxy-io/dls] DurationInput has no accessible name. Pass `label`, wrap it in a labelled `Field`, or set `ariaLabel`.");
350
+ const maxHours = max === void 0 ? void 0 : Math.floor(Math.max(max, lowest) / 36e5);
351
+ const textSize = DURATION_INPUT_SIZE_TO_TEXT_SIZE_MAP[size];
352
+ return /* @__PURE__ */ jsx(Frame, {
353
+ ref: mergedRef,
354
+ role: "group",
355
+ "aria-labelledby": field?.labelId,
356
+ "aria-label": ariaLabel,
357
+ "aria-describedby": describedBy,
358
+ onMouseDown: handleFrameMouseDown,
359
+ onBlur: handleBlur,
360
+ ...rest,
361
+ className: cx(isGhost ? GHOST_CSS : DURATION_INPUT_VARIANT_TO_CSS_MAP[variant], DURATION_INPUT_SIZE_TO_CSS_MAP[size], isEditable && !isInvalid && (isGhost ? GHOST_HOVER_CSS : DURATION_INPUT_VARIANT_TO_HOVER_CSS_MAP[variant]), isInvalid && !isDisabled && ERROR_CSS, isDisabled && DISABLED_CSS, fillWidth && FILL_WIDTH_CSS, isRoot ? className : void 0),
362
+ ...rootStyle(isRoot, style),
363
+ children: SEGMENT_INDEXES.map((index) => {
364
+ const segment = DURATION_SEGMENTS[index];
365
+ const draft = drafts[index];
366
+ const number = draft === "" ? void 0 : Number(draft);
367
+ return /* @__PURE__ */ jsxs(Segment, {
368
+ ref: (element) => {
369
+ segmentRefs.current[index] = element;
370
+ },
371
+ children: [/* @__PURE__ */ jsx(SegmentInput, {
372
+ ref: (element) => {
373
+ inputRefs.current[index] = element;
374
+ },
375
+ id: segmentIds[index],
376
+ type: "text",
377
+ role: "spinbutton",
378
+ inputMode: "numeric",
379
+ autoComplete: "off",
380
+ autoCorrect: "off",
381
+ spellCheck: false,
382
+ maxLength: segment.maxLength,
383
+ placeholder: "0",
384
+ value: draft,
385
+ disabled: isDisabled,
386
+ readOnly: isReadOnly,
387
+ "aria-label": segment.name,
388
+ "aria-valuenow": number,
389
+ "aria-valuetext": number === void 0 ? void 0 : `${number} ${number === 1 ? segment.singular : segment.plural}`,
390
+ "aria-valuemin": 0,
391
+ "aria-valuemax": index === 0 ? maxHours : 59,
392
+ "aria-invalid": isInvalid ? true : void 0,
393
+ "aria-required": isRequiredState ? true : void 0,
394
+ onChange: handleChange(index),
395
+ onKeyDown: handleKeyDown(index),
396
+ onFocus: handleFocus,
397
+ className: DURATION_INPUT_SIZE_TO_FONT_CSS_MAP[size],
398
+ style: { "--gx-duration-input-chars": Math.max(2, draft.length) }
399
+ }), /* @__PURE__ */ jsx(Unit, { children: /* @__PURE__ */ jsx(Text, {
400
+ as: "span",
401
+ size: textSize,
402
+ variant: isDisabled ? TextVariant.DISABLED : TextVariant.TERTIARY,
403
+ "aria-hidden": true,
404
+ children: segment.unit
405
+ }) })]
406
+ }, segment.unit);
407
+ })
408
+ });
409
+ }
410
+ /** A length of time in hours, minutes and seconds; the value is milliseconds. */
411
+ var DurationInput = forwardRef(function DurationInput(props, ref) {
412
+ const { label, error, isRequired = false, size = "MEDIUM", fillWidth = false } = props;
413
+ const { id, className, style } = props;
414
+ const ownField = useOwnField({
415
+ componentName: "DurationInput",
416
+ label,
417
+ error,
418
+ isRequired,
419
+ size: DURATION_INPUT_SIZE_TO_FIELD_SIZE_MAP[size],
420
+ id,
421
+ className,
422
+ style,
423
+ rootClassName: fillWidth && FILL_WIDTH_CSS
424
+ });
425
+ if (ownField !== null) return /* @__PURE__ */ jsx(Field, {
426
+ ...ownField,
427
+ children: /* @__PURE__ */ jsx(DurationFrame, {
428
+ durationProps: props,
429
+ forwardedRef: ref,
430
+ isRoot: false
431
+ })
432
+ });
433
+ return /* @__PURE__ */ jsx(DurationFrame, {
434
+ durationProps: props,
435
+ forwardedRef: ref,
436
+ isRoot: true
437
+ });
438
+ });
439
+ DurationInput.displayName = "DurationInput";
440
+ //#endregion
441
+ export { DurationInputSize, DurationInputVariant, DurationInput as default };
@@ -0,0 +1,75 @@
1
+ import { type AriaAttributes, type CSSProperties, type ReactNode } from "react";
2
+ import { Orientation } from "../theme/enums.js";
3
+ /** Rung of the control the Field frames (Constitution III-A.4). Use the control's own size. */
4
+ export declare enum FieldSize {
5
+ /** 20px control: caption label, caption help. */
6
+ X_SMALL = "X_SMALL",
7
+ /** 24px control: body_sm label, caption help. */
8
+ SMALL = "SMALL",
9
+ /** 32px control: body_md label, body_sm help. The default; matches 1.x. */
10
+ MEDIUM = "MEDIUM",
11
+ /** 36px control: body_lg label, body_sm help. */
12
+ LARGE = "LARGE",
13
+ /** 40px control: body_lg label, body_md help. */
14
+ X_LARGE = "X_LARGE"
15
+ }
16
+ export interface FieldProps extends AriaAttributes {
17
+ /** The control. A DLS input, or any control wired with `useField()` or the Field's `id`. */
18
+ children?: ReactNode;
19
+ /** Visible name of the control. Omit only when the control renders its own label. */
20
+ label?: string;
21
+ /** Help copy under the label. Text and inline `Link`s only. */
22
+ description?: ReactNode;
23
+ /** Message under the control. Also marks the control invalid (`aria-invalid`, error border). */
24
+ error?: string;
25
+ /**
26
+ * Shows the red asterisk and marks the control `aria-required`.
27
+ * @default false
28
+ */
29
+ isRequired?: boolean;
30
+ /**
31
+ * Shows "(optional)" after the label. Ignored when `isRequired`.
32
+ * @default false
33
+ */
34
+ isOptional?: boolean;
35
+ /** Hint behind an info icon beside the label, shown in a `Tooltip`. */
36
+ labelTooltip?: string | ReactNode;
37
+ /** Right end of the label row: a `Link` ("Forgot password?") or a small `Button`. */
38
+ actions?: ReactNode;
39
+ /** Shows a `count / maxLength` counter under the control. Display only; Field never blocks input. */
40
+ maxLength?: number;
41
+ /**
42
+ * Current length for the counter. Read only when `maxLength` is set.
43
+ * @default 0
44
+ */
45
+ count?: number;
46
+ /**
47
+ * `VERTICAL` stacks label over control; `HORIZONTAL` puts the label in a left column.
48
+ * @default Orientation.VERTICAL
49
+ */
50
+ orientation?: Orientation;
51
+ /**
52
+ * The control's rung. Sets the label and help type steps and aligns a horizontal label with the control.
53
+ * @default FieldSize.MEDIUM
54
+ */
55
+ size?: FieldSize;
56
+ /**
57
+ * Stretch to the parent's width.
58
+ * @default false
59
+ */
60
+ fillWidth?: boolean;
61
+ /**
62
+ * The control's id. The label's `htmlFor` points here; all other part ids derive from it.
63
+ * @default useId()
64
+ */
65
+ id?: string;
66
+ /** Any `data-*` attribute, forwarded to the root `<div>`. */
67
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
68
+ /** Extra class on the root `<div>`. */
69
+ className?: string;
70
+ /** Inline style on the root `<div>`; only for setting CSS custom properties. */
71
+ style?: CSSProperties;
72
+ }
73
+ /** Label, description, error and counter around one control, wired to it for assistive tech. */
74
+ declare const Field: import("react").ForwardRefExoticComponent<FieldProps & import("react").RefAttributes<HTMLDivElement>>;
75
+ export default Field;