@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.
- 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 +160 -124
- 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 +33 -20
- package/dist/charts/ChartFrame.d.ts +71 -116
- package/dist/charts/ChartFrame.js +306 -97
- package/dist/charts/ChartGroupProvider.d.ts +30 -41
- package/dist/charts/ChartGroupProvider.js +20 -7
- package/dist/charts/ChartLegend.d.ts +37 -48
- package/dist/charts/ChartLegend.js +243 -125
- package/dist/charts/ChartMarkTargets.d.ts +12 -28
- package/dist/charts/ChartMarkTargets.js +34 -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 +307 -0
- package/dist/charts/LineChart.d.ts +54 -47
- package/dist/charts/LineChart.js +174 -121
- package/dist/charts/PieChart.d.ts +32 -53
- package/dist/charts/PieChart.js +159 -136
- 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/chartSelection.d.ts +15 -0
- package/dist/charts/chartSelection.js +22 -0
- package/dist/charts/constants.d.ts +100 -256
- package/dist/charts/constants.js +109 -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 +206 -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 +69 -116
- package/dist/charts/useChartInteraction.js +148 -78
- 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 +83 -17
- package/dist/drawer/Drawer.js +399 -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 +298 -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 +1082 -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 +120 -0
- package/dist/timeline/Timeline.js +301 -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 +855 -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 -30
- package/dist/inputs/SwitcherInput.js +0 -81
- 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
package/dist/hooks/useDismiss.js
CHANGED
|
@@ -1,43 +1,55 @@
|
|
|
1
1
|
import { useEffect, useRef } from "react";
|
|
2
|
-
import { useHotkeys } from "react-hotkeys-hook";
|
|
3
2
|
//#region src/hooks/useDismiss.ts
|
|
3
|
+
/** Focus in one of these keeps Escape for the field (clearing a search, cancelling an edit). */
|
|
4
|
+
var isEditableTarget = (target) => {
|
|
5
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
6
|
+
const tag = target.tagName;
|
|
7
|
+
return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || target.isContentEditable;
|
|
8
|
+
};
|
|
4
9
|
/**
|
|
5
|
-
*
|
|
6
|
-
* attach to the element
|
|
10
|
+
* Dismisses an app-built floating element on Escape or on a mousedown outside it. Returns the ref
|
|
11
|
+
* to attach to the element that should stay open. DLS overlays (Popover, Modal, Drawer, Menu,
|
|
12
|
+
* Tooltip, Toast) dismiss themselves through the overlay stack and never need this hook.
|
|
13
|
+
*
|
|
14
|
+
* Every mounted `useDismiss` hears every Escape (its own `document` listener, no shortcut
|
|
15
|
+
* registry), except one an open DLS overlay has already consumed (the overlay stack calls
|
|
16
|
+
* `preventDefault()`; mount order decides which listener runs first). SSR-safe: listeners attach
|
|
17
|
+
* in effects only.
|
|
7
18
|
*
|
|
8
|
-
*
|
|
19
|
+
* @example
|
|
20
|
+
* const ref = useDismiss<HTMLDivElement>({ onDismiss: () => onOpenChange(false), isEnabled: isOpen });
|
|
21
|
+
* return <div ref={ref}>…</div>;
|
|
9
22
|
*/
|
|
10
|
-
|
|
11
|
-
const isOptionsOnly = typeof handlerOrOptions !== "function";
|
|
12
|
-
const handler = isOptionsOnly ? void 0 : handlerOrOptions;
|
|
13
|
-
const { excludeRefs, enableEscape = true, enableClickOutside = true, enabled = true, onDismiss } = (isOptionsOnly ? handlerOrOptions : options) || {};
|
|
23
|
+
function useDismiss({ onDismiss, isEnabled = true, shouldCloseOnEscape = true, shouldCloseOnOutsideClick = true, excludeRefs }) {
|
|
14
24
|
const ref = useRef(null);
|
|
15
|
-
const
|
|
16
|
-
const handlerRef = useRef(dismissHandler);
|
|
25
|
+
const onDismissRef = useRef(onDismiss);
|
|
17
26
|
const excludeRefsRef = useRef(excludeRefs);
|
|
18
27
|
useEffect(() => {
|
|
19
|
-
|
|
28
|
+
onDismissRef.current = onDismiss;
|
|
20
29
|
excludeRefsRef.current = excludeRefs;
|
|
21
|
-
}, [
|
|
30
|
+
}, [onDismiss, excludeRefs]);
|
|
22
31
|
useEffect(() => {
|
|
23
|
-
if (!
|
|
24
|
-
const
|
|
32
|
+
if (!isEnabled || !shouldCloseOnOutsideClick) return;
|
|
33
|
+
const handleMouseDown = (event) => {
|
|
25
34
|
const target = event.target;
|
|
26
|
-
if (ref.current
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
if (handlerRef.current) handlerRef.current();
|
|
35
|
+
if (ref.current?.contains(target)) return;
|
|
36
|
+
for (const excludeRef of excludeRefsRef.current ?? []) if (excludeRef.current?.contains(target)) return;
|
|
37
|
+
onDismissRef.current?.();
|
|
31
38
|
};
|
|
32
|
-
document.addEventListener("mousedown",
|
|
33
|
-
return () =>
|
|
34
|
-
|
|
39
|
+
document.addEventListener("mousedown", handleMouseDown);
|
|
40
|
+
return () => document.removeEventListener("mousedown", handleMouseDown);
|
|
41
|
+
}, [isEnabled, shouldCloseOnOutsideClick]);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!isEnabled || !shouldCloseOnEscape) return;
|
|
44
|
+
const handleKeyDown = (event) => {
|
|
45
|
+
if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
|
|
46
|
+
if (isEditableTarget(event.target)) return;
|
|
47
|
+
onDismissRef.current?.();
|
|
35
48
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}, { enabled: enabled && enableEscape }, [enabled, enableEscape]);
|
|
49
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
50
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
51
|
+
}, [isEnabled, shouldCloseOnEscape]);
|
|
40
52
|
return ref;
|
|
41
|
-
}
|
|
53
|
+
}
|
|
42
54
|
//#endregion
|
|
43
55
|
export { useDismiss };
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
1
2
|
/** Measured client size. Both fields are `undefined` before the first measurement. */
|
|
2
3
|
export interface ElementClientSize {
|
|
4
|
+
/** `clientWidth` in pixels, or `undefined` before the first measurement. */
|
|
3
5
|
width: number | undefined;
|
|
6
|
+
/** `clientHeight` in pixels, or `undefined` before the first measurement. */
|
|
4
7
|
height: number | undefined;
|
|
5
8
|
}
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
8
|
-
* scrollbars and borders.
|
|
10
|
+
* Tracks an element's *client* size — the padding box, excluding scrollbars and borders.
|
|
9
11
|
*
|
|
10
|
-
* Use this instead of
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* such an element overhang.
|
|
12
|
+
* Use this instead of `useElementWidth` when the measurement drives something that must line up
|
|
13
|
+
* with the scrollport (a sticky overlay, a viewport-width panel). `useElementWidth` measures the
|
|
14
|
+
* border box via `getBoundingClientRect`, which includes the scrollbar gutter and would make such
|
|
15
|
+
* an element overhang. SSR-safe: measures in an effect, `undefined` on the server.
|
|
15
16
|
*
|
|
16
17
|
* @param ref - A ref to the element to measure
|
|
17
|
-
* @returns The current client width/height in pixels, or undefined before the
|
|
18
|
-
* first measurement
|
|
18
|
+
* @returns The current client width/height in pixels, or undefined before the first measurement
|
|
19
19
|
*/
|
|
20
|
-
export declare
|
|
20
|
+
export declare function useElementClientSize(ref: RefObject<HTMLElement | null>): ElementClientSize;
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
//#region src/hooks/useElementClientSize.ts
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* scrollbars and borders.
|
|
4
|
+
* Tracks an element's *client* size — the padding box, excluding scrollbars and borders.
|
|
6
5
|
*
|
|
7
|
-
* Use this instead of
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* such an element overhang.
|
|
6
|
+
* Use this instead of `useElementWidth` when the measurement drives something that must line up
|
|
7
|
+
* with the scrollport (a sticky overlay, a viewport-width panel). `useElementWidth` measures the
|
|
8
|
+
* border box via `getBoundingClientRect`, which includes the scrollbar gutter and would make such
|
|
9
|
+
* an element overhang. SSR-safe: measures in an effect, `undefined` on the server.
|
|
12
10
|
*
|
|
13
11
|
* @param ref - A ref to the element to measure
|
|
14
|
-
* @returns The current client width/height in pixels, or undefined before the
|
|
15
|
-
* first measurement
|
|
12
|
+
* @returns The current client width/height in pixels, or undefined before the first measurement
|
|
16
13
|
*/
|
|
17
|
-
|
|
14
|
+
function useElementClientSize(ref) {
|
|
18
15
|
const [size, setSize] = useState({
|
|
19
16
|
width: void 0,
|
|
20
17
|
height: void 0
|
|
@@ -38,6 +35,6 @@ var useElementClientSize = (ref) => {
|
|
|
38
35
|
return () => observer.disconnect();
|
|
39
36
|
}, [ref]);
|
|
40
37
|
return size;
|
|
41
|
-
}
|
|
38
|
+
}
|
|
42
39
|
//#endregion
|
|
43
40
|
export { useElementClientSize };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Returns undefined until the first measurement
|
|
3
|
+
* Measures and tracks an element's border-box width (`getBoundingClientRect().width`) with a
|
|
4
|
+
* `ResizeObserver`. Returns `undefined` until the first measurement. SSR-safe: measures in an
|
|
5
|
+
* effect, `undefined` on the server.
|
|
4
6
|
*
|
|
5
7
|
* @param ref - A ref to the element to measure
|
|
6
8
|
* @returns The current width of the element in pixels, or undefined if not yet measured
|
|
@@ -8,15 +10,6 @@
|
|
|
8
10
|
* @example
|
|
9
11
|
* const containerRef = useRef<HTMLDivElement>(null);
|
|
10
12
|
* const width = useElementWidth(containerRef);
|
|
11
|
-
*
|
|
12
|
-
* if (width === undefined) {
|
|
13
|
-
* return <div ref={containerRef} />;
|
|
14
|
-
* }
|
|
15
|
-
*
|
|
16
|
-
* return (
|
|
17
|
-
* <div ref={containerRef}>
|
|
18
|
-
* <Chart width={width} />
|
|
19
|
-
* </div>
|
|
20
|
-
* );
|
|
13
|
+
* return <div ref={containerRef}>{width === undefined ? null : <Chart width={width} />}</div>;
|
|
21
14
|
*/
|
|
22
|
-
export declare
|
|
15
|
+
export declare function useElementWidth(ref: RefObject<HTMLElement | null>): number | undefined;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
//#region src/hooks/useElementWidth.ts
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* Returns undefined until the first measurement
|
|
4
|
+
* Measures and tracks an element's border-box width (`getBoundingClientRect().width`) with a
|
|
5
|
+
* `ResizeObserver`. Returns `undefined` until the first measurement. SSR-safe: measures in an
|
|
6
|
+
* effect, `undefined` on the server.
|
|
6
7
|
*
|
|
7
8
|
* @param ref - A ref to the element to measure
|
|
8
9
|
* @returns The current width of the element in pixels, or undefined if not yet measured
|
|
@@ -10,18 +11,9 @@ import { useEffect, useState } from "react";
|
|
|
10
11
|
* @example
|
|
11
12
|
* const containerRef = useRef<HTMLDivElement>(null);
|
|
12
13
|
* const width = useElementWidth(containerRef);
|
|
13
|
-
*
|
|
14
|
-
* if (width === undefined) {
|
|
15
|
-
* return <div ref={containerRef} />;
|
|
16
|
-
* }
|
|
17
|
-
*
|
|
18
|
-
* return (
|
|
19
|
-
* <div ref={containerRef}>
|
|
20
|
-
* <Chart width={width} />
|
|
21
|
-
* </div>
|
|
22
|
-
* );
|
|
14
|
+
* return <div ref={containerRef}>{width === undefined ? null : <Chart width={width} />}</div>;
|
|
23
15
|
*/
|
|
24
|
-
|
|
16
|
+
function useElementWidth(ref) {
|
|
25
17
|
const [width, setWidth] = useState(void 0);
|
|
26
18
|
useEffect(() => {
|
|
27
19
|
const element = ref.current;
|
|
@@ -39,6 +31,6 @@ var useElementWidth = (ref) => {
|
|
|
39
31
|
return () => observer.disconnect();
|
|
40
32
|
}, [ref]);
|
|
41
33
|
return width;
|
|
42
|
-
}
|
|
34
|
+
}
|
|
43
35
|
//#endregion
|
|
44
36
|
export { useElementWidth };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** What a Field tells the control inside it. `null` outside a Field. */
|
|
2
|
+
export interface FieldContextValue {
|
|
3
|
+
/** The id the control must carry; the Field label's `htmlFor`. */
|
|
4
|
+
controlId: string;
|
|
5
|
+
/** Id of the visible label, for controls that are not labelable elements (`aria-labelledby`). `undefined` without a `label`. */
|
|
6
|
+
labelId: string | undefined;
|
|
7
|
+
/** Space-separated ids of the description, counter and error currently rendered, for `aria-describedby`. `undefined` when none. */
|
|
8
|
+
describedBy: string | undefined;
|
|
9
|
+
/** The Field's `isRequired`. */
|
|
10
|
+
isRequired: boolean;
|
|
11
|
+
/** `true` when the Field has an `error`. */
|
|
12
|
+
isError: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** The context `Field` provides to its control. Default `null`; `Field` is the only provider. */
|
|
15
|
+
export declare const FieldContext: import("react").Context<FieldContextValue | null>;
|
|
16
|
+
/**
|
|
17
|
+
* The nearest `Field`'s wiring for the control inside it, or `null` outside a Field.
|
|
18
|
+
*
|
|
19
|
+
* The consumer contract, which every DLS input follows and a custom control should too:
|
|
20
|
+
* - set `id = field.controlId` (the Field's id wins over the control's own `id`);
|
|
21
|
+
* - merge `field.describedBy` into `aria-describedby`;
|
|
22
|
+
* - set `aria-invalid` when `field.isError` (or the control's own error);
|
|
23
|
+
* - set `aria-required` (and native `required` where it exists) when `field.isRequired`;
|
|
24
|
+
* - draw the error border when `field.isError`;
|
|
25
|
+
* - a control that is not a labelable element (`role="radiogroup"`, a `div` switch, a listbox
|
|
26
|
+
* trigger) sets `aria-labelledby={field.labelId}`.
|
|
27
|
+
*
|
|
28
|
+
* A control wrapped in a Field must not also receive its own `label`.
|
|
29
|
+
*
|
|
30
|
+
* @returns The Field's control id, label id, `aria-describedby` ids, required and invalid flags
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* function MyPicker() {
|
|
34
|
+
* const field = useField();
|
|
35
|
+
* return (
|
|
36
|
+
* <div
|
|
37
|
+
* role="listbox"
|
|
38
|
+
* id={field?.controlId}
|
|
39
|
+
* aria-labelledby={field?.labelId}
|
|
40
|
+
* aria-describedby={field?.describedBy}
|
|
41
|
+
* aria-invalid={field?.isError || undefined}
|
|
42
|
+
* aria-required={field?.isRequired || undefined}
|
|
43
|
+
* />
|
|
44
|
+
* );
|
|
45
|
+
* }
|
|
46
|
+
*/
|
|
47
|
+
export declare function useField(): FieldContextValue | null;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
//#region src/hooks/useField.ts
|
|
3
|
+
/** The context `Field` provides to its control. Default `null`; `Field` is the only provider. */
|
|
4
|
+
var FieldContext = createContext(null);
|
|
5
|
+
/**
|
|
6
|
+
* The nearest `Field`'s wiring for the control inside it, or `null` outside a Field.
|
|
7
|
+
*
|
|
8
|
+
* The consumer contract, which every DLS input follows and a custom control should too:
|
|
9
|
+
* - set `id = field.controlId` (the Field's id wins over the control's own `id`);
|
|
10
|
+
* - merge `field.describedBy` into `aria-describedby`;
|
|
11
|
+
* - set `aria-invalid` when `field.isError` (or the control's own error);
|
|
12
|
+
* - set `aria-required` (and native `required` where it exists) when `field.isRequired`;
|
|
13
|
+
* - draw the error border when `field.isError`;
|
|
14
|
+
* - a control that is not a labelable element (`role="radiogroup"`, a `div` switch, a listbox
|
|
15
|
+
* trigger) sets `aria-labelledby={field.labelId}`.
|
|
16
|
+
*
|
|
17
|
+
* A control wrapped in a Field must not also receive its own `label`.
|
|
18
|
+
*
|
|
19
|
+
* @returns The Field's control id, label id, `aria-describedby` ids, required and invalid flags
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* function MyPicker() {
|
|
23
|
+
* const field = useField();
|
|
24
|
+
* return (
|
|
25
|
+
* <div
|
|
26
|
+
* role="listbox"
|
|
27
|
+
* id={field?.controlId}
|
|
28
|
+
* aria-labelledby={field?.labelId}
|
|
29
|
+
* aria-describedby={field?.describedBy}
|
|
30
|
+
* aria-invalid={field?.isError || undefined}
|
|
31
|
+
* aria-required={field?.isRequired || undefined}
|
|
32
|
+
* />
|
|
33
|
+
* );
|
|
34
|
+
* }
|
|
35
|
+
*/
|
|
36
|
+
function useField() {
|
|
37
|
+
return useContext(FieldContext);
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { FieldContext, useField };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard shortcuts. One `keydown` listener on `document` serves every binding; when several
|
|
3
|
+
* bindings match, the innermost `scope` wins, then the most recently registered, and only the
|
|
4
|
+
* winner's handler runs.
|
|
5
|
+
*
|
|
6
|
+
* Key grammar (Kbd adopts it): a combo is tokens joined by `+`, matched case-insensitively.
|
|
7
|
+
* Modifiers are `mod` (⌘ on Mac, Ctrl elsewhere), `ctrl`, `meta` (alias `cmd`), `alt` (alias
|
|
8
|
+
* `option`) and `shift`, and must match exactly. Exactly one key per combo: a single character,
|
|
9
|
+
* or `escape` (`esc`), `enter`, `space`, `tab`, `backspace`, `delete`, `up`, `down`, `left`,
|
|
10
|
+
* `right`, `home`, `end`, `pageup`, `pagedown`, `f1`–`f12`. Letters and digits match on
|
|
11
|
+
* `event.code` (so Option or Shift cannot change them); every other key on `event.key`.
|
|
12
|
+
* Sequences (`g g`) are not supported.
|
|
13
|
+
*/
|
|
14
|
+
import { type RefObject } from "react";
|
|
15
|
+
/** Options for `useHotkey`. */
|
|
16
|
+
export interface UseHotkeyOptions {
|
|
17
|
+
/** Whether the binding is registered. Re-enabling registers it again (it becomes the newest). @default true */
|
|
18
|
+
isEnabled?: boolean | undefined;
|
|
19
|
+
/** Only fire while focus is inside this element; a scoped binding beats a global one. */
|
|
20
|
+
scope?: RefObject<HTMLElement | null> | undefined;
|
|
21
|
+
/** Call `event.preventDefault()` when this binding fires (e.g. to stop the browser's ⌘K). @default false */
|
|
22
|
+
shouldPreventDefault?: boolean | undefined;
|
|
23
|
+
/** Do not fire while focus is in an `input`, `textarea`, `select` or `[contenteditable]`. @default false */
|
|
24
|
+
shouldIgnoreInputs?: boolean | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** A parsed combo. `mod` resolves to `meta` or `ctrl` at match time. */
|
|
27
|
+
export interface ParsedHotkey {
|
|
28
|
+
/** ⌘ on Mac, Ctrl elsewhere. */
|
|
29
|
+
mod: boolean;
|
|
30
|
+
/** Control. */
|
|
31
|
+
ctrl: boolean;
|
|
32
|
+
/** ⌘ / Windows key. */
|
|
33
|
+
meta: boolean;
|
|
34
|
+
/** Option / Alt. */
|
|
35
|
+
alt: boolean;
|
|
36
|
+
/** Shift. */
|
|
37
|
+
shift: boolean;
|
|
38
|
+
/** `KeyK` / `Digit1` when `matchOn` is `code`; the lowercased `event.key` otherwise. */
|
|
39
|
+
key: string;
|
|
40
|
+
/** Which `KeyboardEvent` field `key` is compared with. */
|
|
41
|
+
matchOn: "code" | "key";
|
|
42
|
+
}
|
|
43
|
+
/** The `KeyboardEvent` fields the matcher reads. */
|
|
44
|
+
export type HotkeyEventLike = Pick<KeyboardEvent, "key" | "code" | "ctrlKey" | "metaKey" | "altKey" | "shiftKey">;
|
|
45
|
+
/**
|
|
46
|
+
* Parses one combo (`"mod+k"`, `"shift+enter"`, `"escape"`) per the grammar above. Returns
|
|
47
|
+
* `null` when it does not parse: an empty token, an unknown key name, or not exactly one key.
|
|
48
|
+
*
|
|
49
|
+
* @param combo - The combo to parse
|
|
50
|
+
* @returns The parsed combo, or `null`
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseHotkey(combo: string): ParsedHotkey | null;
|
|
53
|
+
/**
|
|
54
|
+
* Whether `event` is exactly `hotkey`: the key, and every modifier pressed or not as written.
|
|
55
|
+
*
|
|
56
|
+
* @param hotkey - A combo from `parseHotkey`
|
|
57
|
+
* @param event - The `keydown` event (or its key, code and modifier fields)
|
|
58
|
+
* @param isMac - Whether `mod` means ⌘ (`true`) or Ctrl (`false`)
|
|
59
|
+
* @returns Whether the event matches
|
|
60
|
+
*/
|
|
61
|
+
export declare function matchesHotkey(hotkey: ParsedHotkey, event: HotkeyEventLike, isMac: boolean): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Binds a keyboard shortcut (`"mod+k"`, `"shift+enter"`, `"escape"`; an array means any of them)
|
|
64
|
+
* to `handler`. The binding behind `Button shouldBindHotKey`, `SearchInput hotKey` and
|
|
65
|
+
* `CommandPalette`. When several bindings match, the innermost `scope` wins, then the most
|
|
66
|
+
* recently registered; only the winner runs, and in development a duplicate combo in the same
|
|
67
|
+
* scope warns once. Fires inside text fields unless `shouldIgnoreInputs`. A combo that does not
|
|
68
|
+
* parse warns in development and never fires.
|
|
69
|
+
*
|
|
70
|
+
* @param keys - One combo, or an array of combos any of which fires
|
|
71
|
+
* @param handler - Called with the `keydown` event when this binding wins
|
|
72
|
+
* @param options - `isEnabled` (default `true`), `scope`, `shouldPreventDefault` (default `false`), `shouldIgnoreInputs` (default `false`)
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* useHotkey("mod+k", () => setIsOpen(true), { shouldPreventDefault: true });
|
|
76
|
+
*/
|
|
77
|
+
export declare function useHotkey(keys: string | string[], handler: (event: KeyboardEvent) => void, options?: UseHotkeyOptions): void;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect.js";
|
|
2
|
+
import { useIsMac } from "./useIsMac.js";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
//#region src/hooks/useHotkey.ts
|
|
5
|
+
/**
|
|
6
|
+
* Keyboard shortcuts. One `keydown` listener on `document` serves every binding; when several
|
|
7
|
+
* bindings match, the innermost `scope` wins, then the most recently registered, and only the
|
|
8
|
+
* winner's handler runs.
|
|
9
|
+
*
|
|
10
|
+
* Key grammar (Kbd adopts it): a combo is tokens joined by `+`, matched case-insensitively.
|
|
11
|
+
* Modifiers are `mod` (⌘ on Mac, Ctrl elsewhere), `ctrl`, `meta` (alias `cmd`), `alt` (alias
|
|
12
|
+
* `option`) and `shift`, and must match exactly. Exactly one key per combo: a single character,
|
|
13
|
+
* or `escape` (`esc`), `enter`, `space`, `tab`, `backspace`, `delete`, `up`, `down`, `left`,
|
|
14
|
+
* `right`, `home`, `end`, `pageup`, `pagedown`, `f1`–`f12`. Letters and digits match on
|
|
15
|
+
* `event.code` (so Option or Shift cannot change them); every other key on `event.key`.
|
|
16
|
+
* Sequences (`g g`) are not supported.
|
|
17
|
+
*/
|
|
18
|
+
/** Modifier tokens and their aliases. A `Map`, so `"constructor"` is not a modifier. */
|
|
19
|
+
var MODIFIER_TOKEN_TO_MODIFIER_MAP = new Map([
|
|
20
|
+
["mod", "mod"],
|
|
21
|
+
["ctrl", "ctrl"],
|
|
22
|
+
["meta", "meta"],
|
|
23
|
+
["cmd", "meta"],
|
|
24
|
+
["alt", "alt"],
|
|
25
|
+
["option", "alt"],
|
|
26
|
+
["shift", "shift"]
|
|
27
|
+
]);
|
|
28
|
+
/** Named keys → the lowercased `event.key` they match. */
|
|
29
|
+
var KEY_NAME_TO_EVENT_KEY_MAP = new Map([
|
|
30
|
+
["escape", "escape"],
|
|
31
|
+
["esc", "escape"],
|
|
32
|
+
["enter", "enter"],
|
|
33
|
+
["space", " "],
|
|
34
|
+
["tab", "tab"],
|
|
35
|
+
["backspace", "backspace"],
|
|
36
|
+
["delete", "delete"],
|
|
37
|
+
["up", "arrowup"],
|
|
38
|
+
["down", "arrowdown"],
|
|
39
|
+
["left", "arrowleft"],
|
|
40
|
+
["right", "arrowright"],
|
|
41
|
+
["home", "home"],
|
|
42
|
+
["end", "end"],
|
|
43
|
+
["pageup", "pageup"],
|
|
44
|
+
["pagedown", "pagedown"],
|
|
45
|
+
...Array.from({ length: 12 }, (_, index) => [`f${index + 1}`, `f${index + 1}`])
|
|
46
|
+
]);
|
|
47
|
+
var LETTER = /^[a-z]$/;
|
|
48
|
+
var DIGIT = /^[0-9]$/;
|
|
49
|
+
/**
|
|
50
|
+
* Parses one combo (`"mod+k"`, `"shift+enter"`, `"escape"`) per the grammar above. Returns
|
|
51
|
+
* `null` when it does not parse: an empty token, an unknown key name, or not exactly one key.
|
|
52
|
+
*
|
|
53
|
+
* @param combo - The combo to parse
|
|
54
|
+
* @returns The parsed combo, or `null`
|
|
55
|
+
*/
|
|
56
|
+
function parseHotkey(combo) {
|
|
57
|
+
const parsed = {
|
|
58
|
+
mod: false,
|
|
59
|
+
ctrl: false,
|
|
60
|
+
meta: false,
|
|
61
|
+
alt: false,
|
|
62
|
+
shift: false,
|
|
63
|
+
key: "",
|
|
64
|
+
matchOn: "key"
|
|
65
|
+
};
|
|
66
|
+
let keyCount = 0;
|
|
67
|
+
for (const rawToken of combo.split("+")) {
|
|
68
|
+
const token = rawToken.trim().toLowerCase();
|
|
69
|
+
if (token === "") return null;
|
|
70
|
+
const modifier = MODIFIER_TOKEN_TO_MODIFIER_MAP.get(token);
|
|
71
|
+
if (modifier !== void 0) {
|
|
72
|
+
parsed[modifier] = true;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
keyCount += 1;
|
|
76
|
+
const namedKey = KEY_NAME_TO_EVENT_KEY_MAP.get(token);
|
|
77
|
+
if (LETTER.test(token)) {
|
|
78
|
+
parsed.key = `Key${token.toUpperCase()}`;
|
|
79
|
+
parsed.matchOn = "code";
|
|
80
|
+
} else if (DIGIT.test(token)) {
|
|
81
|
+
parsed.key = `Digit${token}`;
|
|
82
|
+
parsed.matchOn = "code";
|
|
83
|
+
} else if (namedKey !== void 0) {
|
|
84
|
+
parsed.key = namedKey;
|
|
85
|
+
parsed.matchOn = "key";
|
|
86
|
+
} else if ([...token].length === 1) {
|
|
87
|
+
parsed.key = token;
|
|
88
|
+
parsed.matchOn = "key";
|
|
89
|
+
} else return null;
|
|
90
|
+
}
|
|
91
|
+
return keyCount === 1 ? parsed : null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Whether `event` is exactly `hotkey`: the key, and every modifier pressed or not as written.
|
|
95
|
+
*
|
|
96
|
+
* @param hotkey - A combo from `parseHotkey`
|
|
97
|
+
* @param event - The `keydown` event (or its key, code and modifier fields)
|
|
98
|
+
* @param isMac - Whether `mod` means ⌘ (`true`) or Ctrl (`false`)
|
|
99
|
+
* @returns Whether the event matches
|
|
100
|
+
*/
|
|
101
|
+
function matchesHotkey(hotkey, event, isMac) {
|
|
102
|
+
return (hotkey.matchOn === "code" ? event.code === hotkey.key : event.key.toLowerCase() === hotkey.key) && event.ctrlKey === (hotkey.ctrl || hotkey.mod && !isMac) && event.metaKey === (hotkey.meta || hotkey.mod && isMac) && event.altKey === hotkey.alt && event.shiftKey === hotkey.shift;
|
|
103
|
+
}
|
|
104
|
+
/** One canonical spelling per combo, for the dev conflict warning (`"Cmd+K"` = `"meta+k"`). */
|
|
105
|
+
var toCanonicalCombo = (hotkey) => [
|
|
106
|
+
hotkey.mod && "mod",
|
|
107
|
+
hotkey.ctrl && "ctrl",
|
|
108
|
+
hotkey.meta && "meta",
|
|
109
|
+
hotkey.alt && "alt",
|
|
110
|
+
hotkey.shift && "shift",
|
|
111
|
+
`${hotkey.matchOn}:${hotkey.key}`
|
|
112
|
+
].filter(Boolean).join("+");
|
|
113
|
+
function isDevelopment() {
|
|
114
|
+
try {
|
|
115
|
+
return process.env.NODE_ENV !== "production";
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Created on the first registration, so nothing runs at module scope. */
|
|
121
|
+
var registry;
|
|
122
|
+
var isEditableTarget = (target) => target instanceof HTMLElement && (target.isContentEditable || [
|
|
123
|
+
"INPUT",
|
|
124
|
+
"TEXTAREA",
|
|
125
|
+
"SELECT"
|
|
126
|
+
].includes(target.tagName));
|
|
127
|
+
/** Whether `a` beats `b`: the innermost scope, then the newest registration. */
|
|
128
|
+
function isHigherPriority(a, b) {
|
|
129
|
+
const scopeA = a.scope?.current ?? null;
|
|
130
|
+
const scopeB = b.scope?.current ?? null;
|
|
131
|
+
if (scopeA !== scopeB) {
|
|
132
|
+
if (scopeB === null) return true;
|
|
133
|
+
if (scopeA === null) return false;
|
|
134
|
+
return scopeB.contains(scopeA);
|
|
135
|
+
}
|
|
136
|
+
return a.order > b.order;
|
|
137
|
+
}
|
|
138
|
+
function handleKeyDown(event) {
|
|
139
|
+
if (registry === void 0) return;
|
|
140
|
+
const target = event.target instanceof Node ? event.target : null;
|
|
141
|
+
let winner;
|
|
142
|
+
for (const binding of registry.bindings) {
|
|
143
|
+
const state = binding.stateRef.current;
|
|
144
|
+
if (state === null) continue;
|
|
145
|
+
if (!binding.hotkeys.some((hotkey) => matchesHotkey(hotkey, event, state.isMac))) continue;
|
|
146
|
+
if (binding.scope !== void 0) {
|
|
147
|
+
const scope = binding.scope.current;
|
|
148
|
+
if (scope === null || target === null || !scope.contains(target)) continue;
|
|
149
|
+
}
|
|
150
|
+
if (state.shouldIgnoreInputs && isEditableTarget(event.target)) continue;
|
|
151
|
+
if (winner === void 0 || isHigherPriority(binding, winner)) winner = binding;
|
|
152
|
+
}
|
|
153
|
+
const state = winner?.stateRef.current;
|
|
154
|
+
if (state === void 0 || state === null) return;
|
|
155
|
+
if (state.shouldPreventDefault) event.preventDefault();
|
|
156
|
+
state.handler(event);
|
|
157
|
+
}
|
|
158
|
+
function register(binding, combos) {
|
|
159
|
+
if (registry === void 0) registry = {
|
|
160
|
+
bindings: /* @__PURE__ */ new Set(),
|
|
161
|
+
nextOrder: 0,
|
|
162
|
+
handleKeyDown
|
|
163
|
+
};
|
|
164
|
+
const current = registry;
|
|
165
|
+
if (current.bindings.size === 0) document.addEventListener("keydown", current.handleKeyDown);
|
|
166
|
+
if (isDevelopment()) {
|
|
167
|
+
const scope = binding.scope?.current ?? null;
|
|
168
|
+
const held = new Set([...current.bindings].filter((other) => (other.scope?.current ?? null) === scope).flatMap((other) => other.hotkeys.map(toCanonicalCombo)));
|
|
169
|
+
const conflicts = combos.filter((_, index) => {
|
|
170
|
+
const hotkey = binding.hotkeys[index];
|
|
171
|
+
return hotkey !== void 0 && held.has(toCanonicalCombo(hotkey));
|
|
172
|
+
});
|
|
173
|
+
if (conflicts.length > 0) console.warn(`[@galaxy-io/dls] useHotkey: "${conflicts.join("\", \"")}" is already bound in the same scope; the most recently registered binding wins.`);
|
|
174
|
+
}
|
|
175
|
+
const entry = {
|
|
176
|
+
...binding,
|
|
177
|
+
order: current.nextOrder
|
|
178
|
+
};
|
|
179
|
+
current.nextOrder += 1;
|
|
180
|
+
current.bindings.add(entry);
|
|
181
|
+
return () => {
|
|
182
|
+
current.bindings.delete(entry);
|
|
183
|
+
if (current.bindings.size === 0) document.removeEventListener("keydown", current.handleKeyDown);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Binds a keyboard shortcut (`"mod+k"`, `"shift+enter"`, `"escape"`; an array means any of them)
|
|
188
|
+
* to `handler`. The binding behind `Button shouldBindHotKey`, `SearchInput hotKey` and
|
|
189
|
+
* `CommandPalette`. When several bindings match, the innermost `scope` wins, then the most
|
|
190
|
+
* recently registered; only the winner runs, and in development a duplicate combo in the same
|
|
191
|
+
* scope warns once. Fires inside text fields unless `shouldIgnoreInputs`. A combo that does not
|
|
192
|
+
* parse warns in development and never fires.
|
|
193
|
+
*
|
|
194
|
+
* @param keys - One combo, or an array of combos any of which fires
|
|
195
|
+
* @param handler - Called with the `keydown` event when this binding wins
|
|
196
|
+
* @param options - `isEnabled` (default `true`), `scope`, `shouldPreventDefault` (default `false`), `shouldIgnoreInputs` (default `false`)
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* useHotkey("mod+k", () => setIsOpen(true), { shouldPreventDefault: true });
|
|
200
|
+
*/
|
|
201
|
+
function useHotkey(keys, handler, options) {
|
|
202
|
+
const isEnabled = options?.isEnabled ?? true;
|
|
203
|
+
const scope = options?.scope;
|
|
204
|
+
const isMac = useIsMac();
|
|
205
|
+
const stateRef = useRef({
|
|
206
|
+
handler,
|
|
207
|
+
isMac,
|
|
208
|
+
shouldPreventDefault: options?.shouldPreventDefault ?? false,
|
|
209
|
+
shouldIgnoreInputs: options?.shouldIgnoreInputs ?? false
|
|
210
|
+
});
|
|
211
|
+
useIsomorphicLayoutEffect(() => {
|
|
212
|
+
stateRef.current = {
|
|
213
|
+
handler,
|
|
214
|
+
isMac,
|
|
215
|
+
shouldPreventDefault: options?.shouldPreventDefault ?? false,
|
|
216
|
+
shouldIgnoreInputs: options?.shouldIgnoreInputs ?? false
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const combosKey = (Array.isArray(keys) ? keys : [keys]).join("\n");
|
|
220
|
+
useEffect(() => {
|
|
221
|
+
if (!isEnabled) return;
|
|
222
|
+
const combos = [];
|
|
223
|
+
const hotkeys = [];
|
|
224
|
+
for (const combo of combosKey.split("\n")) {
|
|
225
|
+
const hotkey = parseHotkey(combo);
|
|
226
|
+
if (hotkey === null) {
|
|
227
|
+
if (isDevelopment()) console.warn(`[@galaxy-io/dls] useHotkey: "${combo}" is not a valid combo; it never fires.`);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
combos.push(combo);
|
|
231
|
+
hotkeys.push(hotkey);
|
|
232
|
+
}
|
|
233
|
+
if (hotkeys.length === 0) return;
|
|
234
|
+
return register({
|
|
235
|
+
hotkeys,
|
|
236
|
+
scope,
|
|
237
|
+
stateRef
|
|
238
|
+
}, combos);
|
|
239
|
+
}, [
|
|
240
|
+
isEnabled,
|
|
241
|
+
combosKey,
|
|
242
|
+
scope
|
|
243
|
+
]);
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
export { matchesHotkey, parseHotkey, useHotkey };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the user is on an Apple platform (macOS, iOS, iPadOS), for ⌘ vs Ctrl labels and
|
|
3
|
+
* bindings. Reads `navigator.userAgentData.platform`, falling back to `navigator.platform`.
|
|
4
|
+
* `false` on the server and during hydration; the client re-renders once with the real value.
|
|
5
|
+
*
|
|
6
|
+
* @returns Whether the platform is macOS, iOS or iPadOS
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const isMac = useIsMac();
|
|
10
|
+
* const modLabel = isMac ? "⌘" : "Ctrl";
|
|
11
|
+
*/
|
|
12
|
+
export declare function useIsMac(): boolean;
|