@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.
- package/README.md +47 -50
- package/biome/index.json +74 -0
- package/biome/plugins/no-hex-literal.grit +20 -0
- package/biome/plugins/no-inline-style.grit +13 -0
- package/biome/plugins/no-margin.grit +9 -0
- package/biome/plugins/warn/no-hex-literal.grit +23 -0
- package/biome/plugins/warn/no-inline-style.grit +13 -0
- package/biome/plugins/warn/no-margin.grit +9 -0
- package/dist/a11y/FocusScope.d.ts +44 -0
- package/dist/a11y/FocusScope.js +229 -0
- package/dist/a11y/VisuallyHidden.d.ts +21 -0
- package/dist/a11y/VisuallyHidden.js +30 -0
- package/dist/avatar/Avatar.d.ts +56 -14
- package/dist/avatar/Avatar.js +250 -96
- package/dist/avatar/AvatarGroup.d.ts +43 -0
- package/dist/avatar/AvatarGroup.js +153 -0
- package/dist/backgrounds/GridBackground.d.ts +48 -0
- package/dist/backgrounds/GridBackground.js +146 -0
- package/dist/beacons/Beacon.d.ts +86 -22
- package/dist/beacons/Beacon.js +170 -47
- package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
- package/dist/brand/GalaxyFilamentWordmark.js +39 -0
- package/dist/brand/GalaxyLogomark.d.ts +26 -0
- package/dist/brand/GalaxyLogomark.js +41 -0
- package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
- package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
- package/dist/brand/GalaxyWordmark.d.ts +30 -0
- package/dist/brand/GalaxyWordmark.js +63 -0
- package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
- package/dist/brand/brandMark.d.ts +26 -0
- package/dist/brand/brandMark.js +35 -0
- package/dist/buttons/Button.d.ts +148 -59
- package/dist/buttons/Button.js +437 -227
- package/dist/buttons/ButtonGroup.d.ts +38 -0
- package/dist/buttons/ButtonGroup.js +68 -0
- package/dist/buttons/CopyButton.d.ts +77 -0
- package/dist/buttons/CopyButton.js +65 -0
- package/dist/charts/AreaChart.d.ts +49 -0
- package/dist/charts/AreaChart.js +31 -0
- package/dist/charts/BarChart.d.ts +54 -67
- package/dist/charts/BarChart.js +136 -116
- package/dist/charts/ChartAxis.d.ts +35 -40
- package/dist/charts/ChartAxis.js +114 -90
- package/dist/charts/ChartCategoryTargets.d.ts +12 -26
- package/dist/charts/ChartCategoryTargets.js +32 -20
- package/dist/charts/ChartFrame.d.ts +69 -116
- package/dist/charts/ChartFrame.js +253 -119
- package/dist/charts/ChartGroupProvider.d.ts +30 -41
- package/dist/charts/ChartGroupProvider.js +20 -7
- package/dist/charts/ChartLegend.d.ts +27 -48
- package/dist/charts/ChartLegend.js +206 -125
- package/dist/charts/ChartMarkTargets.d.ts +12 -28
- package/dist/charts/ChartMarkTargets.js +33 -20
- package/dist/charts/ChartPrimitives.d.ts +50 -305
- package/dist/charts/ChartPrimitives.js +65 -413
- package/dist/charts/ChartTooltip.d.ts +20 -26
- package/dist/charts/ChartTooltip.js +77 -40
- package/dist/charts/Heatmap.d.ts +35 -0
- package/dist/charts/Heatmap.js +295 -0
- package/dist/charts/LineChart.d.ts +54 -47
- package/dist/charts/LineChart.js +159 -117
- package/dist/charts/PieChart.d.ts +32 -53
- package/dist/charts/PieChart.js +149 -135
- package/dist/charts/Sparkline.d.ts +107 -0
- package/dist/charts/Sparkline.js +244 -0
- package/dist/charts/StatChart.d.ts +37 -13
- package/dist/charts/StatChart.js +82 -35
- package/dist/charts/barChartGeometry.d.ts +138 -86
- package/dist/charts/barChartGeometry.js +122 -101
- package/dist/charts/barChartLegend.d.ts +14 -18
- package/dist/charts/barChartLegend.js +18 -13
- package/dist/charts/chartFormat.d.ts +12 -18
- package/dist/charts/chartFormat.js +20 -52
- package/dist/charts/chartPalette.d.ts +33 -0
- package/dist/charts/chartPalette.js +68 -0
- package/dist/charts/chartScales.d.ts +41 -108
- package/dist/charts/chartScales.js +62 -128
- package/dist/charts/constants.d.ts +96 -256
- package/dist/charts/constants.js +105 -275
- package/dist/charts/heatmapGeometry.d.ts +95 -0
- package/dist/charts/heatmapGeometry.js +155 -0
- package/dist/charts/lineChartGeometry.d.ts +108 -58
- package/dist/charts/lineChartGeometry.js +120 -78
- package/dist/charts/pieChartGeometry.d.ts +66 -40
- package/dist/charts/pieChartGeometry.js +68 -38
- package/dist/charts/types.d.ts +197 -466
- package/dist/charts/types.js +55 -144
- package/dist/charts/useCartesianChartLayout.d.ts +28 -59
- package/dist/charts/useCartesianChartLayout.js +47 -32
- package/dist/charts/useChartDimensions.d.ts +19 -40
- package/dist/charts/useChartDimensions.js +40 -56
- package/dist/charts/useChartFormatters.d.ts +6 -15
- package/dist/charts/useChartFormatters.js +4 -9
- package/dist/charts/useChartInteraction.d.ts +47 -116
- package/dist/charts/useChartInteraction.js +95 -71
- package/dist/charts/useChartTooltipPosition.d.ts +29 -39
- package/dist/charts/useChartTooltipPosition.js +14 -5
- package/dist/charts/useSeriesColorResolver.d.ts +11 -33
- package/dist/charts/useSeriesColorResolver.js +19 -12
- package/dist/chips/Chip.d.ts +155 -44
- package/dist/chips/Chip.js +329 -155
- package/dist/chips/ChipGroup.d.ts +53 -0
- package/dist/chips/ChipGroup.js +98 -0
- package/dist/drawer/Drawer.d.ts +81 -17
- package/dist/drawer/Drawer.js +370 -65
- package/dist/dropdown/Dropdown.d.ts +80 -63
- package/dist/dropdown/Dropdown.js +127 -129
- package/dist/editor/CodeEditor.d.ts +119 -40
- package/dist/editor/CodeEditor.js +490 -400
- package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
- package/dist/editor/CodeEditorReactWidget.js +28 -21
- package/dist/feedback/Alert.d.ts +49 -0
- package/dist/feedback/Alert.js +172 -0
- package/dist/feedback/EmptyState.d.ts +39 -0
- package/dist/feedback/EmptyState.js +109 -0
- package/dist/feedback/ProgressBar.d.ts +125 -0
- package/dist/feedback/ProgressBar.js +183 -0
- package/dist/feedback/ProgressCircle.d.ts +99 -0
- package/dist/feedback/ProgressCircle.js +187 -0
- package/dist/feedback/Skeleton.d.ts +69 -0
- package/dist/feedback/Skeleton.js +130 -0
- package/dist/feedback/Spinner.d.ts +63 -0
- package/dist/feedback/Spinner.js +141 -0
- package/dist/fonts.css +70 -0
- package/dist/hooks/internal/useIsClient.d.ts +2 -0
- package/dist/hooks/internal/useIsClient.js +14 -0
- package/dist/hooks/useClipboard.d.ts +19 -0
- package/dist/hooks/useClipboard.js +45 -0
- package/dist/hooks/useControlledOpenState.d.ts +21 -0
- package/dist/hooks/useControlledOpenState.js +19 -0
- package/dist/hooks/useControlledState.d.ts +19 -0
- package/dist/hooks/useControlledState.js +22 -0
- package/dist/hooks/useDebouncedValue.d.ts +14 -0
- package/dist/hooks/useDebouncedValue.js +33 -0
- package/dist/hooks/useDisclosure.d.ts +26 -0
- package/dist/hooks/useDisclosure.js +36 -0
- package/dist/hooks/useDismiss.d.ts +23 -27
- package/dist/hooks/useDismiss.js +39 -27
- package/dist/hooks/useElementClientSize.d.ts +10 -10
- package/dist/hooks/useElementClientSize.js +8 -11
- package/dist/hooks/useElementWidth.d.ts +6 -13
- package/dist/hooks/useElementWidth.js +6 -14
- package/dist/hooks/useField.d.ts +47 -0
- package/dist/hooks/useField.js +40 -0
- package/dist/hooks/useHotkey.d.ts +77 -0
- package/dist/hooks/useHotkey.js +246 -0
- package/dist/hooks/useIsMac.d.ts +12 -0
- package/dist/hooks/useIsMac.js +27 -0
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
- package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
- package/dist/hooks/useLocalStorage.d.ts +28 -0
- package/dist/hooks/useLocalStorage.js +145 -0
- package/dist/hooks/useMediaQuery.d.ts +11 -0
- package/dist/hooks/useMediaQuery.js +23 -0
- package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
- package/dist/hooks/usePrefersReducedMotion.js +25 -0
- package/dist/hooks/useResize.d.ts +42 -62
- package/dist/hooks/useResize.js +43 -31
- package/dist/icons/Icon.d.ts +64 -37
- package/dist/icons/Icon.js +96 -37
- package/dist/icons/internal/IconSlot.d.ts +10 -0
- package/dist/icons/internal/IconSlot.js +32 -0
- package/dist/inputs/CheckboxGroup.d.ts +115 -0
- package/dist/inputs/CheckboxGroup.js +183 -0
- package/dist/inputs/CheckboxInput.d.ts +98 -28
- package/dist/inputs/CheckboxInput.js +218 -88
- package/dist/inputs/ColorInput.d.ts +115 -29
- package/dist/inputs/ColorInput.js +748 -326
- package/dist/inputs/CopyInput.d.ts +49 -20
- package/dist/inputs/CopyInput.js +57 -49
- package/dist/inputs/CronInput.d.ts +94 -0
- package/dist/inputs/CronInput.js +618 -0
- package/dist/inputs/DateInput.d.ts +175 -28
- package/dist/inputs/DateInput.js +1109 -451
- package/dist/inputs/DurationInput.d.ts +101 -0
- package/dist/inputs/DurationInput.js +441 -0
- package/dist/inputs/Field.d.ts +75 -0
- package/dist/inputs/Field.js +247 -0
- package/dist/inputs/Fieldset.d.ts +53 -0
- package/dist/inputs/Fieldset.js +149 -0
- package/dist/inputs/FileInput.d.ts +110 -0
- package/dist/inputs/FileInput.js +476 -0
- package/dist/inputs/Input.d.ts +148 -187
- package/dist/inputs/Input.js +339 -259
- package/dist/inputs/KeyValueInput.d.ts +120 -0
- package/dist/inputs/KeyValueInput.js +383 -0
- package/dist/inputs/MultiSelectInput.d.ts +165 -54
- package/dist/inputs/MultiSelectInput.js +175 -559
- package/dist/inputs/NumberInput.d.ts +65 -9
- package/dist/inputs/NumberInput.js +197 -40
- package/dist/inputs/PasswordInput.d.ts +17 -12
- package/dist/inputs/PasswordInput.js +33 -33
- package/dist/inputs/PinInput.d.ts +117 -0
- package/dist/inputs/PinInput.js +364 -0
- package/dist/inputs/RadioGroup.d.ts +115 -0
- package/dist/inputs/RadioGroup.js +179 -0
- package/dist/inputs/RadioInput.d.ts +87 -24
- package/dist/inputs/RadioInput.js +182 -95
- package/dist/inputs/SearchInput.d.ts +66 -0
- package/dist/inputs/SearchInput.js +156 -0
- package/dist/inputs/SelectInput.d.ts +195 -55
- package/dist/inputs/SelectInput.js +1308 -446
- package/dist/inputs/SliderInput.d.ts +150 -30
- package/dist/inputs/SliderInput.js +441 -186
- package/dist/inputs/SwitchInput.d.ts +109 -0
- package/dist/inputs/SwitchInput.js +248 -0
- package/dist/inputs/TagInput.d.ts +117 -0
- package/dist/inputs/TagInput.js +408 -0
- package/dist/inputs/TextAreaInput.d.ts +146 -44
- package/dist/inputs/TextAreaInput.js +292 -198
- package/dist/inputs/TextInput.d.ts +4 -13
- package/dist/inputs/TextInput.js +13 -48
- package/dist/inputs/ToggleInput.d.ts +120 -22
- package/dist/inputs/ToggleInput.js +262 -116
- package/dist/inputs/internal/bareField.d.ts +18 -0
- package/dist/inputs/internal/bareField.js +38 -0
- package/dist/inputs/internal/devWarn.d.ts +7 -0
- package/dist/inputs/internal/devWarn.js +30 -0
- package/dist/inputs/internal/fieldFrame.d.ts +34 -0
- package/dist/inputs/internal/fieldFrame.js +64 -0
- package/dist/inputs/internal/fieldWiring.d.ts +50 -0
- package/dist/inputs/internal/fieldWiring.js +38 -0
- package/dist/inputs/internal/innerButton.d.ts +2 -0
- package/dist/inputs/internal/innerButton.js +24 -0
- package/dist/inputs/internal/ownField.d.ts +45 -0
- package/dist/inputs/internal/ownField.js +58 -0
- package/dist/inputs/internal/predicates.d.ts +9 -0
- package/dist/inputs/internal/predicates.js +11 -0
- package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
- package/dist/inputs/internal/useComboboxPopover.js +92 -0
- package/dist/json/JsonViewer.d.ts +62 -0
- package/dist/json/JsonViewer.js +483 -0
- package/dist/layout/Box.d.ts +87 -0
- package/dist/layout/Box.js +109 -0
- package/dist/layout/Divider.d.ts +25 -0
- package/dist/layout/Divider.js +70 -0
- package/dist/layout/Flex.d.ts +139 -0
- package/dist/layout/Flex.js +165 -0
- package/dist/layout/FlexItem.d.ts +72 -0
- package/dist/layout/FlexItem.js +84 -0
- package/dist/layout/Grid.d.ts +140 -0
- package/dist/layout/Grid.js +178 -0
- package/dist/layout/Portal.d.ts +29 -0
- package/dist/layout/Portal.js +27 -0
- package/dist/layout/ResizablePanels.d.ts +88 -0
- package/dist/layout/ResizablePanels.js +198 -0
- package/dist/layout/ResizeHandle.d.ts +48 -0
- package/dist/layout/ResizeHandle.js +143 -0
- package/dist/layout/ScrollArea.d.ts +30 -0
- package/dist/layout/ScrollArea.js +138 -0
- package/dist/links/Link.d.ts +101 -1
- package/dist/links/Link.js +166 -4
- package/dist/lists/BulletedList.d.ts +25 -7
- package/dist/lists/BulletedList.js +72 -27
- package/dist/lists/DescriptionList.d.ts +91 -0
- package/dist/lists/DescriptionList.js +147 -0
- package/dist/menu/ContextMenu.d.ts +64 -0
- package/dist/menu/ContextMenu.js +34 -0
- package/dist/menu/Menu.d.ts +280 -0
- package/dist/menu/Menu.js +1003 -0
- package/dist/modal/ConfirmDialog.d.ts +55 -0
- package/dist/modal/ConfirmDialog.js +151 -0
- package/dist/modal/Modal.d.ts +64 -14
- package/dist/modal/Modal.js +189 -48
- package/dist/navigation/Breadcrumbs.d.ts +65 -0
- package/dist/navigation/Breadcrumbs.js +243 -0
- package/dist/navigation/CommandPalette.d.ts +83 -0
- package/dist/navigation/CommandPalette.js +509 -0
- package/dist/navigation/Pagination.d.ts +87 -0
- package/dist/navigation/Pagination.js +300 -0
- package/dist/navigation/SidebarNav.d.ts +107 -0
- package/dist/navigation/SidebarNav.js +341 -0
- package/dist/navigation/Stepper.d.ts +52 -0
- package/dist/navigation/Stepper.js +207 -0
- package/dist/navigation/Tabs.d.ts +113 -0
- package/dist/navigation/Tabs.js +543 -0
- package/dist/navigation/Topbar.d.ts +20 -0
- package/dist/navigation/Topbar.js +62 -0
- package/dist/overlay/OverlayProvider.d.ts +28 -32
- package/dist/overlay/OverlayProvider.js +42 -93
- package/dist/overlay/useOverlay.d.ts +88 -12
- package/dist/overlay/useOverlay.js +220 -43
- package/dist/overlays/Popover.d.ts +114 -0
- package/dist/overlays/Popover.js +389 -0
- package/dist/shapes/Circle.d.ts +84 -8
- package/dist/shapes/Circle.js +122 -20
- package/dist/shapes/Square.d.ts +84 -8
- package/dist/shapes/Square.js +123 -20
- package/dist/styles/mixins.d.ts +35 -0
- package/dist/styles/mixins.js +60 -0
- package/dist/styles.css +1 -202
- package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
- package/dist/table/InfiniteSpreadsheet.js +762 -225
- package/dist/table/InfiniteTable.d.ts +116 -14
- package/dist/table/InfiniteTable.js +287 -429
- package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
- package/dist/table/SpreadsheetCellEditor.js +163 -84
- package/dist/table/TableCore.d.ts +252 -0
- package/dist/table/TableCore.js +1077 -0
- package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
- package/dist/table/VirtualizedInfiniteTable.js +280 -219
- package/dist/table/types.d.ts +66 -244
- package/dist/table/types.js +0 -51
- package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
- package/dist/table/useInfiniteScrollSentinel.js +38 -30
- package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
- package/dist/table/useSpreadsheetCellNavigation.js +141 -0
- package/dist/table/useTableColumnLayout.d.ts +90 -25
- package/dist/table/useTableColumnLayout.js +255 -50
- package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
- package/dist/table/useTableKeyboardNavigation.js +95 -71
- package/dist/table/useTableRowSelection.d.ts +24 -25
- package/dist/table/useTableRowSelection.js +57 -84
- package/dist/table/useTableVirtualizer.d.ts +20 -0
- package/dist/table/useTableVirtualizer.js +48 -0
- package/dist/text/Bold.d.ts +5 -6
- package/dist/text/Bold.js +16 -15
- package/dist/text/Code.d.ts +5 -6
- package/dist/text/Code.js +16 -25
- package/dist/text/CodeBlock.d.ts +77 -0
- package/dist/text/CodeBlock.js +373 -0
- package/dist/text/EditableText.d.ts +55 -15
- package/dist/text/EditableText.js +153 -135
- package/dist/text/Ellipsis.d.ts +34 -8
- package/dist/text/Ellipsis.js +55 -23
- package/dist/text/Kbd.d.ts +72 -0
- package/dist/text/Kbd.js +284 -0
- package/dist/text/MarkdownText.d.ts +27 -10
- package/dist/text/MarkdownText.js +317 -300
- package/dist/text/RequiredMarker.d.ts +17 -5
- package/dist/text/RequiredMarker.js +34 -36
- package/dist/text/Selectable.d.ts +5 -6
- package/dist/text/Selectable.js +16 -13
- package/dist/text/Span.d.ts +82 -0
- package/dist/text/Span.js +115 -0
- package/dist/text/Text.d.ts +128 -41
- package/dist/text/Text.js +209 -76
- package/dist/theme/GalaxyProvider.d.ts +75 -0
- package/dist/theme/GalaxyProvider.js +223 -0
- package/dist/theme/ThemeSwitcher.d.ts +52 -0
- package/dist/theme/ThemeSwitcher.js +94 -0
- package/dist/theme/enums.d.ts +118 -0
- package/dist/theme/enums.js +144 -0
- package/dist/theme/tokens/dark.d.ts +2 -0
- package/dist/theme/tokens/dark.js +275 -0
- package/dist/theme/tokens/generate.d.ts +15 -0
- package/dist/theme/tokens/generate.js +47 -0
- package/dist/theme/tokens/light.d.ts +2 -0
- package/dist/theme/tokens/light.js +274 -0
- package/dist/theme/tokens/palette.d.ts +14 -0
- package/dist/theme/tokens/palette.js +153 -0
- package/dist/theme/tokens/scales.d.ts +26 -0
- package/dist/theme/tokens/scales.js +154 -0
- package/dist/theme/tokens/t.d.ts +3 -0
- package/dist/theme/tokens/t.js +25 -0
- package/dist/theme/tokens/types.d.ts +189 -0
- package/dist/theme/tokens/types.js +0 -0
- package/dist/theme/useGalaxyTheme.d.ts +46 -0
- package/dist/theme/useGalaxyTheme.js +36 -0
- package/dist/theme/useInverseScope.d.ts +18 -0
- package/dist/theme/useInverseScope.js +33 -0
- package/dist/three/GalaxyLogomark3D.d.ts +46 -0
- package/dist/three/GalaxyLogomark3D.js +134 -0
- package/dist/three/assets/galaxy-logomark.js +4 -0
- package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
- package/dist/three/galaxyLogomark3DScene.js +165 -0
- package/dist/timeline/Timeline.d.ts +99 -0
- package/dist/timeline/Timeline.js +269 -0
- package/dist/toast/Toast.d.ts +43 -19
- package/dist/toast/Toast.js +130 -89
- package/dist/toast/ToastProvider.d.ts +23 -23
- package/dist/toast/ToastProvider.js +298 -101
- package/dist/toast/ToastViewport.d.ts +12 -0
- package/dist/toast/ToastViewport.js +210 -0
- package/dist/toast/useToast.d.ts +139 -5
- package/dist/toast/useToast.js +15 -13
- package/dist/tokens.css +654 -0
- package/dist/tooltip/Tooltip.d.ts +64 -44
- package/dist/tooltip/Tooltip.js +280 -73
- package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
- package/dist/tooltip/internal/LazyTooltip.js +53 -0
- package/dist/transform/Fade.d.ts +33 -11
- package/dist/transform/Fade.js +71 -19
- package/dist/transform/Flasher.d.ts +25 -0
- package/dist/transform/Flasher.js +39 -0
- package/dist/transform/Rotate.d.ts +24 -12
- package/dist/transform/Rotate.js +36 -22
- package/dist/transform/ScaleFade.d.ts +36 -11
- package/dist/transform/ScaleFade.js +86 -28
- package/dist/transform/internal/CollapseMotion.d.ts +10 -0
- package/dist/transform/internal/CollapseMotion.js +65 -0
- package/dist/tree/Tree.d.ts +85 -0
- package/dist/tree/Tree.js +387 -0
- package/dist/tree/treeRow.d.ts +39 -0
- package/dist/tree/treeRow.js +75 -0
- package/dist/utils/colors.d.ts +46 -13
- package/dist/utils/colors.js +92 -34
- package/dist/utils/css.d.ts +23 -0
- package/dist/utils/css.js +30 -0
- package/dist/utils/format.d.ts +58 -0
- package/dist/utils/format.js +220 -0
- package/dist/vite/index.d.ts +16 -0
- package/dist/vite/index.js +52 -0
- package/dist/widget/Widget.d.ts +164 -48
- package/dist/widget/Widget.js +335 -96
- package/dist/widget/WidgetGroup.d.ts +36 -0
- package/dist/widget/WidgetGroup.js +103 -0
- package/package.json +851 -157
- package/dist/accordion/Accordion.d.ts +0 -54
- package/dist/accordion/Accordion.js +0 -183
- package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
- package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
- package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
- package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
- package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
- package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
- package/dist/assets/models/galaxy-animation.js +0 -136666
- package/dist/assets/models/galaxy-logomark.js +0 -4
- package/dist/avatar/AvatarShimmer.d.ts +0 -30
- package/dist/avatar/AvatarShimmer.js +0 -22
- package/dist/backgrounds/CellGridBackground.d.ts +0 -24
- package/dist/backgrounds/CellGridBackground.js +0 -44
- package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
- package/dist/backgrounds/CrossGridBackground.js +0 -49
- package/dist/backgrounds/DotGridBackground.d.ts +0 -24
- package/dist/backgrounds/DotGridBackground.js +0 -47
- package/dist/badge/Badge.d.ts +0 -42
- package/dist/badge/Badge.js +0 -99
- package/dist/charts/ChartEmptyState.d.ts +0 -17
- package/dist/charts/ChartEmptyState.js +0 -29
- package/dist/charts/ProgressBar.d.ts +0 -29
- package/dist/charts/ProgressBar.js +0 -65
- package/dist/charts/chartTheme.d.ts +0 -18
- package/dist/charts/chartTheme.js +0 -26
- package/dist/containers/FlexItem.d.ts +0 -50
- package/dist/containers/FlexItem.js +0 -91
- package/dist/containers/FlexWrapper.d.ts +0 -96
- package/dist/containers/FlexWrapper.js +0 -143
- package/dist/containers/GridWrapper.d.ts +0 -79
- package/dist/containers/GridWrapper.js +0 -125
- package/dist/containers/Spacing.d.ts +0 -23
- package/dist/containers/Spacing.js +0 -59
- package/dist/containers/Wrapper.d.ts +0 -26
- package/dist/containers/Wrapper.js +0 -54
- package/dist/dividers/HorizontalDivider.d.ts +0 -7
- package/dist/dividers/HorizontalDivider.js +0 -39
- package/dist/dividers/VerticalDivider.d.ts +0 -6
- package/dist/dividers/VerticalDivider.js +0 -21
- package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
- package/dist/icons/GalaxyFilamentWordmark.js +0 -25
- package/dist/icons/GalaxyLogomark.d.ts +0 -13
- package/dist/icons/GalaxyLogomark.js +0 -27
- package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
- package/dist/icons/GalaxyLogomark3D.js +0 -319
- package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
- package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
- package/dist/icons/GalaxyWordmark.d.ts +0 -11
- package/dist/icons/GalaxyWordmark.js +0 -25
- package/dist/inputs/MultiTextInput.d.ts +0 -32
- package/dist/inputs/MultiTextInput.js +0 -180
- package/dist/inputs/SwitcherInput.d.ts +0 -27
- package/dist/inputs/SwitcherInput.js +0 -64
- package/dist/inputs/hooks.d.ts +0 -10
- package/dist/inputs/hooks.js +0 -22
- package/dist/overlay/constants.d.ts +0 -28
- package/dist/overlay/constants.js +0 -37
- package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
- package/dist/resizable/HorizontalResizeHandle.js +0 -38
- package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
- package/dist/resizable/VerticalResizeHandle.js +0 -39
- package/dist/table/SpreadsheetCell.d.ts +0 -21
- package/dist/table/SpreadsheetCell.js +0 -71
- package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
- package/dist/table/SpreadsheetHeaderCell.js +0 -91
- package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
- package/dist/table/SpreadsheetMenuItem.js +0 -33
- package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
- package/dist/table/SpreadsheetPrimitives.js +0 -105
- package/dist/table/SpreadsheetRow.d.ts +0 -33
- package/dist/table/SpreadsheetRow.js +0 -73
- package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
- package/dist/table/SpreadsheetRowActionCell.js +0 -51
- package/dist/table/TableExpandCell.d.ts +0 -11
- package/dist/table/TableExpandCell.js +0 -24
- package/dist/table/TableExpandedRow.d.ts +0 -16
- package/dist/table/TableExpandedRow.js +0 -77
- package/dist/table/TableHeaderCellContent.d.ts +0 -30
- package/dist/table/TableHeaderCellContent.js +0 -48
- package/dist/table/TablePrimitives.d.ts +0 -313
- package/dist/table/TablePrimitives.js +0 -302
- package/dist/table/TableSelectCell.d.ts +0 -18
- package/dist/table/TableSelectCell.js +0 -27
- package/dist/table/TableStatusRow.d.ts +0 -18
- package/dist/table/TableStatusRow.js +0 -50
- package/dist/table/useSpreadsheetEditing.d.ts +0 -13
- package/dist/table/useSpreadsheetEditing.js +0 -41
- package/dist/table/useTableColumnResize.d.ts +0 -38
- package/dist/table/useTableColumnResize.js +0 -155
- package/dist/table/useTableRowExpansion.d.ts +0 -24
- package/dist/table/useTableRowExpansion.js +0 -62
- package/dist/table/utils.d.ts +0 -50
- package/dist/table/utils.js +0 -78
- package/dist/text/HotKeys.d.ts +0 -30
- package/dist/text/HotKeys.js +0 -74
- package/dist/text/Paragraph.d.ts +0 -33
- package/dist/text/Paragraph.js +0 -83
- package/dist/text/TextShimmer.d.ts +0 -14
- package/dist/text/TextShimmer.js +0 -34
- package/dist/theme/GalaxyTheme.d.ts +0 -67
- package/dist/theme/GalaxyTheme.js +0 -119
- package/dist/theme/constants.d.ts +0 -8
- package/dist/theme/constants.js +0 -38
- package/dist/theme/index.d.ts +0 -6
- package/dist/theme/index.js +0 -7
- package/dist/theme/types.d.ts +0 -195
- package/dist/theme/types.js +0 -10
- package/dist/theme/typography.d.ts +0 -2
- package/dist/theme/typography.js +0 -73
- package/dist/theme/variants/dark.d.ts +0 -2
- package/dist/theme/variants/dark.js +0 -125
- package/dist/theme/variants/light.d.ts +0 -2
- package/dist/theme/variants/light.js +0 -125
- package/dist/toast/ToastContainer.d.ts +0 -10
- package/dist/toast/ToastContainer.js +0 -31
- package/dist/toast/ToastWrapper.d.ts +0 -6
- package/dist/toast/ToastWrapper.js +0 -27
- package/dist/transform/Flash.d.ts +0 -7
- package/dist/transform/Flash.js +0 -18
- package/dist/transform/Spin.d.ts +0 -14
- package/dist/transform/Spin.js +0 -25
- package/dist/utils/linaria.d.ts +0 -1
- 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;
|