@galaxy-io/dls 1.6.1 → 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 -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/README.md
CHANGED
|
@@ -1,81 +1,78 @@
|
|
|
1
1
|
# @galaxy-io/dls
|
|
2
2
|
|
|
3
|
-
Galaxy Design Language System
|
|
3
|
+
The Galaxy Design Language System: the one React component library for Filament, the GX app and every Galaxy React surface. Monochrome, dense, hairline-quiet; precompiled Linaria CSS read through CSS custom properties, so a theme switch never re-renders the app.
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Install
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install @galaxy-io/dls
|
|
11
|
-
# or
|
|
12
10
|
pnpm add @galaxy-io/dls
|
|
13
11
|
```
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
Node ≥ 22, React 18 or 19, ESM. Heavy single-component libraries (charts, tables, the code editor, code highlighting, Markdown, the cron and color inputs, 3D and animated brand marks) are optional peers; [getting-started.md](./docs/getting-started.md#install) lists which subpath needs which.
|
|
16
14
|
|
|
17
|
-
## Quick
|
|
15
|
+
## Quick start
|
|
18
16
|
|
|
19
17
|
```tsx
|
|
20
|
-
//
|
|
18
|
+
// Once, at the app root: component styles, tokens, fonts.
|
|
21
19
|
import "@galaxy-io/dls/styles.css";
|
|
20
|
+
import "@galaxy-io/dls/tokens.css";
|
|
21
|
+
import "@galaxy-io/dls/fonts.css";
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
import {
|
|
23
|
+
import { PlusIcon } from "@phosphor-icons/react";
|
|
24
|
+
import Button, { ButtonVariant } from "@galaxy-io/dls/buttons/Button";
|
|
25
|
+
import Flex, { FlexDirection } from "@galaxy-io/dls/layout/Flex";
|
|
26
|
+
import Text, { TextSize, TextWeight } from "@galaxy-io/dls/text/Text";
|
|
27
|
+
import GalaxyProvider from "@galaxy-io/dls/theme/GalaxyProvider";
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
import Button, { ButtonVariant, ButtonSize } from "@galaxy-io/dls/buttons/Button";
|
|
28
|
-
import Text, { TextVariant, TextSize } from "@galaxy-io/dls/text/Text";
|
|
29
|
-
|
|
30
|
-
function App() {
|
|
29
|
+
export function App() {
|
|
31
30
|
return (
|
|
32
|
-
<
|
|
33
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
</
|
|
31
|
+
<GalaxyProvider>
|
|
32
|
+
<Flex direction={FlexDirection.COLUMN} gap={16} padding={24}>
|
|
33
|
+
<Text as="h1" size={TextSize.HEADING_MD} weight={TextWeight.MEDIUM}>
|
|
34
|
+
Sources
|
|
35
|
+
</Text>
|
|
36
|
+
<Flex gap={8}>
|
|
37
|
+
<Button label="New source" icon={PlusIcon} />
|
|
38
|
+
<Button label="Import" variant={ButtonVariant.SECONDARY} />
|
|
39
|
+
</Flex>
|
|
40
|
+
</Flex>
|
|
41
|
+
</GalaxyProvider>
|
|
43
42
|
);
|
|
44
43
|
}
|
|
45
44
|
```
|
|
46
45
|
|
|
47
|
-
|
|
46
|
+
- Import every component from its own subpath; its enums come from the same module. There is no barrel.
|
|
47
|
+
- `GalaxyProvider` is the one root: theme (System / Dark / Light), the overlay stack and toasts.
|
|
48
|
+
- Style your own code with Linaria and the token accessor `t` (`@galaxy-io/dls/theme/tokens/t`), set up with `galaxyDls()` from `@galaxy-io/dls/vite`. Lint with `"extends": ["@galaxy-io/dls/biome"]`.
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
## Documentation
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
| | |
|
|
53
|
+
|---|---|
|
|
54
|
+
| [Getting started](./docs/getting-started.md) | Install, Vite, stylesheets, provider, SSR |
|
|
55
|
+
| [Theming](./docs/theming.md) | Themes and every token |
|
|
56
|
+
| [Components](./docs/components.md) | Every component, when to use it, examples |
|
|
57
|
+
| [Patterns](./docs/patterns.md) | How Galaxy screens are built |
|
|
58
|
+
| [Accessibility](./docs/accessibility.md) | The floor and the keyboard maps |
|
|
59
|
+
| [Migrating from 1.x](./docs/MIGRATION.md) | The codemod and every change since 1.6.1 |
|
|
60
|
+
| [Contributing](./docs/contributing.md) | Working on this repository ([AGENTS.md](./AGENTS.md) has the rules) |
|
|
61
|
+
| [Storybook](https://storybook.getgalaxy.io) | Every component, prop and state, in both themes |
|
|
54
62
|
|
|
55
|
-
|
|
56
|
-
<GalaxyThemeProvider />
|
|
63
|
+
## Migrating from 1.x
|
|
57
64
|
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
```bash
|
|
66
|
+
npx @galaxy-io/dls-codemod src --report dls-migrate.json
|
|
60
67
|
```
|
|
61
68
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
```tsx
|
|
65
|
-
import { useGalaxyTheme } from "@galaxy-io/dls/theme/GalaxyTheme";
|
|
66
|
-
|
|
67
|
-
function ThemeSwitcher() {
|
|
68
|
-
const { activeTheme, selectedTheme, setTheme } = useGalaxyTheme();
|
|
69
|
-
}
|
|
70
|
-
```
|
|
69
|
+
The codemod rewrites everything mechanical and marks the rest with `@dls-migrate <id>` comments; [docs/MIGRATION.md](./docs/MIGRATION.md) explains every id.
|
|
71
70
|
|
|
72
|
-
##
|
|
71
|
+
## Claude skill
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
[`skills/galaxy-ui`](./skills/galaxy-ui/SKILL.md) teaches Claude to design and build Galaxy UIs with this package: the workflow, the brand rules, the component decision tables, tokens, patterns and complete screen recipes. Its examples are type-checked against this repository (`pnpm skill:check`).
|
|
75
74
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
import Text from "@galaxy-io/dls/text/Text";
|
|
79
|
-
```
|
|
75
|
+
- **Claude Code:** copy the folder into your skills directory: `cp -R skills/galaxy-ui ~/.claude/skills/` (or a project's `.claude/skills/`).
|
|
76
|
+
- **Claude apps:** run `pnpm skill:pack` and upload `dist-skill/galaxy-ui.zip` as a skill (Settings → Capabilities → Skills).
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
Details: [skills/galaxy-ui/README.md](./skills/galaxy-ui/README.md).
|
package/biome/index.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"formatter": {
|
|
3
|
+
"enabled": true,
|
|
4
|
+
"indentStyle": "space",
|
|
5
|
+
"indentWidth": 2,
|
|
6
|
+
"lineWidth": 100
|
|
7
|
+
},
|
|
8
|
+
"javascript": {
|
|
9
|
+
"formatter": {
|
|
10
|
+
"quoteStyle": "double",
|
|
11
|
+
"trailingCommas": "all",
|
|
12
|
+
"semicolons": "always"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"json": {
|
|
16
|
+
"formatter": {
|
|
17
|
+
"trailingCommas": "none"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"linter": {
|
|
21
|
+
"enabled": true,
|
|
22
|
+
"rules": {
|
|
23
|
+
"preset": "recommended",
|
|
24
|
+
"correctness": {
|
|
25
|
+
"noRestrictedElements": {
|
|
26
|
+
"level": "warn",
|
|
27
|
+
"options": {
|
|
28
|
+
"elements": {
|
|
29
|
+
"p": "DLS: render text through `Text as=\"p\"`.",
|
|
30
|
+
"h1": "DLS: render headings through `Text as=\"h1\"`.",
|
|
31
|
+
"h2": "DLS: render headings through `Text as=\"h2\"`.",
|
|
32
|
+
"h3": "DLS: render headings through `Text as=\"h3\"`.",
|
|
33
|
+
"h4": "DLS: render headings through `Text as=\"h4\"`.",
|
|
34
|
+
"h5": "DLS: render headings through `Text as=\"h5\"`.",
|
|
35
|
+
"h6": "DLS: render headings through `Text as=\"h6\"`.",
|
|
36
|
+
"span": "DLS: render inline text through `Span`.",
|
|
37
|
+
"label": "DLS: render labels through `Text as=\"label\"` (or `Field`)."
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"performance": {
|
|
43
|
+
"noBarrelFile": "warn",
|
|
44
|
+
"noReExportAll": "warn"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"plugins": [
|
|
49
|
+
{
|
|
50
|
+
"path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-hex-literal.grit",
|
|
51
|
+
"includes": ["**", "!**/*.test.ts", "!**/*.test.tsx"]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-margin.grit",
|
|
55
|
+
"includes": ["**"]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"path": "./node_modules/@galaxy-io/dls/biome/plugins/warn/no-inline-style.grit",
|
|
59
|
+
"includes": ["**", "!**/*.stories.tsx"]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"overrides": [
|
|
63
|
+
{
|
|
64
|
+
"includes": ["**/*.stories.tsx", "**/*.mdx"],
|
|
65
|
+
"linter": {
|
|
66
|
+
"rules": {
|
|
67
|
+
"correctness": {
|
|
68
|
+
"noRestrictedElements": "off"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// DLS: no hex color literal outside src/theme/tokens/ (Constitution III.5).
|
|
2
|
+
// Scoped in biome.json (`plugins[].includes`); colors come from `t.color.*`.
|
|
3
|
+
language js
|
|
4
|
+
|
|
5
|
+
or {
|
|
6
|
+
JsStringLiteralExpression() as $literal where {
|
|
7
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
8
|
+
},
|
|
9
|
+
JsTemplateChunkElement() as $literal where {
|
|
10
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
11
|
+
},
|
|
12
|
+
JsxString() as $literal where {
|
|
13
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
14
|
+
},
|
|
15
|
+
JsxText() as $literal where {
|
|
16
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
17
|
+
}
|
|
18
|
+
} where {
|
|
19
|
+
register_diagnostic(span=$literal, message="DLS: no hex color literal outside src/theme/tokens/. Use a `t.color.*` token.", severity="error")
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// DLS: no inline `style={{ … }}` except to set CSS custom properties (Constitution IV.1).
|
|
2
|
+
// `style={{ "--gx-x": value, ["--gx-y"]: value, ...style }}` is fine; `style={{ color: … }}`,
|
|
3
|
+
// `style={{ color }}` (shorthand) and `style={{ [key]: … }}` (non-`--` computed key) are not.
|
|
4
|
+
language js
|
|
5
|
+
|
|
6
|
+
JsxAttribute(name=$name, initializer=$value) where {
|
|
7
|
+
$name <: "style",
|
|
8
|
+
$value <: contains or {
|
|
9
|
+
JsPropertyObjectMember(name=$key) as $member where { $key <: not r"(?s)(?:\[\s*)?[\"'`]--.*" },
|
|
10
|
+
JsShorthandPropertyObjectMember() as $member
|
|
11
|
+
},
|
|
12
|
+
register_diagnostic(span=$member, message="DLS: inline style may only set CSS custom properties (`--gx-*`). Style with Linaria.", severity="error")
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// DLS: margins are forbidden (Constitution II.5). Spacing is `gap` and `padding` only.
|
|
2
|
+
// Matches any `margin` / `margin-*` declaration with a non-zero value inside a template
|
|
3
|
+
// (Linaria `css` / `styled`). `margin: 0` (a reset) is allowed.
|
|
4
|
+
language js
|
|
5
|
+
|
|
6
|
+
JsTemplateChunkElement() as $chunk where {
|
|
7
|
+
$chunk <: r"(?s).*(?:^|[^-a-zA-Z])margin(?:-[a-z]+)*\s*:\s*(?:[1-9]|0\.|0\s+[^;\s]|-|[a-zA-Z]|$).*",
|
|
8
|
+
register_diagnostic(span=$chunk, message="DLS: no margins. Use `gap` / `padding` on Flex, Grid or Box.", severity="error")
|
|
9
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// DLS: no hex color literal (Constitution III.5). Colors come from `t.color.*`.
|
|
2
|
+
// Warn copy of biome/plugins/no-hex-literal.grit for the @galaxy-io/dls/biome preset; the pattern
|
|
3
|
+
// must stay identical (scripts/biome-preset.test.ts). Scoped in biome/index.json. An app's own
|
|
4
|
+
// file of hex values (chart seeds, brand assets) opts out with
|
|
5
|
+
// `// biome-ignore-all lint/plugin: <reason>`.
|
|
6
|
+
language js
|
|
7
|
+
|
|
8
|
+
or {
|
|
9
|
+
JsStringLiteralExpression() as $literal where {
|
|
10
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
11
|
+
},
|
|
12
|
+
JsTemplateChunkElement() as $literal where {
|
|
13
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
14
|
+
},
|
|
15
|
+
JsxString() as $literal where {
|
|
16
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
17
|
+
},
|
|
18
|
+
JsxText() as $literal where {
|
|
19
|
+
$literal <: r"(?s).*#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b.*"
|
|
20
|
+
}
|
|
21
|
+
} where {
|
|
22
|
+
register_diagnostic(span=$literal, message="DLS: no hex color literal. Use a `t.color.*` token.", severity="warn")
|
|
23
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// DLS: no inline `style={{ … }}` except to set CSS custom properties (Constitution IV.1).
|
|
2
|
+
// Warn copy of biome/plugins/no-inline-style.grit for the @galaxy-io/dls/biome preset; the pattern
|
|
3
|
+
// must stay identical (scripts/biome-preset.test.ts). Scoped in biome/index.json.
|
|
4
|
+
language js
|
|
5
|
+
|
|
6
|
+
JsxAttribute(name=$name, initializer=$value) where {
|
|
7
|
+
$name <: "style",
|
|
8
|
+
$value <: contains or {
|
|
9
|
+
JsPropertyObjectMember(name=$key) as $member where { $key <: not r"(?s)(?:\[\s*)?[\"'`]--.*" },
|
|
10
|
+
JsShorthandPropertyObjectMember() as $member
|
|
11
|
+
},
|
|
12
|
+
register_diagnostic(span=$member, message="DLS: inline style may only set CSS custom properties (`--gx-*`). Style with Linaria.", severity="warn")
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// DLS: margins are forbidden (Constitution II.5). Spacing is `gap` and `padding` only.
|
|
2
|
+
// Warn copy of biome/plugins/no-margin.grit for the @galaxy-io/dls/biome preset; the pattern must
|
|
3
|
+
// stay identical (scripts/biome-preset.test.ts). `margin: 0` (a reset) is allowed.
|
|
4
|
+
language js
|
|
5
|
+
|
|
6
|
+
JsTemplateChunkElement() as $chunk where {
|
|
7
|
+
$chunk <: r"(?s).*(?:^|[^-a-zA-Z])margin(?:-[a-z]+)*\s*:\s*(?:[1-9]|0\.|0\s+[^;\s]|-|[a-zA-Z]|$).*",
|
|
8
|
+
register_diagnostic(span=$chunk, message="DLS: no margins. Use `gap` / `padding` on Flex, Grid or Box.", severity="warn")
|
|
9
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type AriaAttributes, type CSSProperties, type ReactNode } from "react";
|
|
2
|
+
/** Where focus goes on mount. */
|
|
3
|
+
export declare enum FocusScopeAutoFocus {
|
|
4
|
+
/** The first tabbable element, or the scope itself when there is none. */
|
|
5
|
+
FIRST = "FIRST",
|
|
6
|
+
/** Nowhere: focus stays where it is. */
|
|
7
|
+
NONE = "NONE"
|
|
8
|
+
}
|
|
9
|
+
export interface FocusScopeProps extends AriaAttributes {
|
|
10
|
+
/** The region focus is kept in. */
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Keep focus inside: Tab and Shift+Tab wrap at the edges and focus that leaves is pulled back.
|
|
14
|
+
* Defaults to `true` on purpose (a behavior-primitive exception to Article V's `false` default):
|
|
15
|
+
* a focus trap that does not trap by default would be a footgun.
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
isTrapped?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* On unmount, return focus to the element that had it before the scope mounted. Defaults to
|
|
21
|
+
* `true` on purpose (a behavior-primitive exception to Article V's `false` default).
|
|
22
|
+
* @default true
|
|
23
|
+
*/
|
|
24
|
+
shouldRestoreFocus?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* On mount, focus the first tabbable element (or the scope itself when there is none) unless
|
|
27
|
+
* focus is already inside; `NONE` leaves focus where it is.
|
|
28
|
+
* @default FocusScopeAutoFocus.FIRST
|
|
29
|
+
*/
|
|
30
|
+
autoFocus?: FocusScopeAutoFocus;
|
|
31
|
+
/** Escape was pressed inside the scope. The innermost scope with a handler gets it. */
|
|
32
|
+
onEscape?: () => void;
|
|
33
|
+
/** DOM id of the scope element. */
|
|
34
|
+
id?: string;
|
|
35
|
+
/** Any `data-*` attribute, forwarded to the scope element. */
|
|
36
|
+
[dataAttribute: `data-${string}`]: string | number | boolean | undefined;
|
|
37
|
+
/** Extra class on the scope element. */
|
|
38
|
+
className?: string;
|
|
39
|
+
/** Inline style on the scope element; only for setting CSS custom properties. */
|
|
40
|
+
style?: CSSProperties;
|
|
41
|
+
}
|
|
42
|
+
/** Keeps focus inside its children while mounted. */
|
|
43
|
+
declare const FocusScope: import("react").ForwardRefExoticComponent<FocusScopeProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
44
|
+
export default FocusScope;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import { styled } from "@linaria/react";
|
|
4
|
+
import { createContext, forwardRef, useCallback, useContext, useRef, useState } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/a11y/FocusScope.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Keeps keyboard focus inside a region while it is mounted: moves focus in on mount, wraps Tab and
|
|
9
|
+
* Shift+Tab at the edges, pulls focus back when it escapes, and returns it to where it was on
|
|
10
|
+
* unmount. `Modal`, `Drawer`, `Menu` and `CommandPalette` are built on it.
|
|
11
|
+
*
|
|
12
|
+
* - **Nested scopes, innermost wins.** Only the innermost trapped scope enforces its trap; an outer
|
|
13
|
+
* scope pauses while a scope rendered inside it (in the React tree) is trapped, and resumes when
|
|
14
|
+
* that scope unmounts or stops trapping. Escape goes to the innermost scope with an `onEscape`.
|
|
15
|
+
* - **Portals.** "Inside" follows the React tree, not the DOM: focus in a portal rendered from
|
|
16
|
+
* within the scope (a Menu opened from a Modal) counts as inside, because React focus and key
|
|
17
|
+
* events bubble through portals to the scope.
|
|
18
|
+
*
|
|
19
|
+
* The scope renders one unstyled `div` (plus `FOCUS_RING`, for when it holds focus itself because
|
|
20
|
+
* it has nothing tabbable). SSR-safe: `document` is read only in effects and handlers.
|
|
21
|
+
*/
|
|
22
|
+
/** Where focus goes on mount. */
|
|
23
|
+
var FocusScopeAutoFocus = /* @__PURE__ */ function(FocusScopeAutoFocus) {
|
|
24
|
+
/** The first tabbable element, or the scope itself when there is none. */
|
|
25
|
+
FocusScopeAutoFocus["FIRST"] = "FIRST";
|
|
26
|
+
/** Nowhere: focus stays where it is. */
|
|
27
|
+
FocusScopeAutoFocus["NONE"] = "NONE";
|
|
28
|
+
return FocusScopeAutoFocus;
|
|
29
|
+
}({});
|
|
30
|
+
/**
|
|
31
|
+
* Trapped scopes in the order they started trapping. Module state holds no DOM, so the module
|
|
32
|
+
* stays SSR-safe; it is only read and written from effects and event handlers.
|
|
33
|
+
*/
|
|
34
|
+
var TRAPPED_SCOPES = [];
|
|
35
|
+
/** The enclosing scope, for nesting. Context crosses portals, like the events do. */
|
|
36
|
+
var FocusScopeContext = createContext(null);
|
|
37
|
+
/** Candidates for sequential focus; `tabbableElements` filters them further. */
|
|
38
|
+
var TABBABLE_SELECTOR = [
|
|
39
|
+
"a[href]",
|
|
40
|
+
"area[href]",
|
|
41
|
+
"button:not(:disabled)",
|
|
42
|
+
"input:not(:disabled):not([type=\"hidden\"])",
|
|
43
|
+
"select:not(:disabled)",
|
|
44
|
+
"textarea:not(:disabled)",
|
|
45
|
+
"iframe",
|
|
46
|
+
"audio[controls]",
|
|
47
|
+
"video[controls]",
|
|
48
|
+
"summary",
|
|
49
|
+
"[contenteditable]:not([contenteditable=\"false\"])",
|
|
50
|
+
"[tabindex]"
|
|
51
|
+
].join(",");
|
|
52
|
+
var isAncestor = (ancestor, node) => {
|
|
53
|
+
for (let parent = node.parent; parent !== null; parent = parent.parent) if (parent === ancestor) return true;
|
|
54
|
+
return false;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The scope whose trap is in force: the most recent trapped scope with no trapped scope nested
|
|
58
|
+
* inside it.
|
|
59
|
+
*/
|
|
60
|
+
var activeScope = () => {
|
|
61
|
+
for (let index = TRAPPED_SCOPES.length - 1; index >= 0; index -= 1) {
|
|
62
|
+
const scope = TRAPPED_SCOPES[index];
|
|
63
|
+
if (scope && !TRAPPED_SCOPES.some((other) => other !== scope && isAncestor(scope, other))) return scope;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
};
|
|
67
|
+
var isRendered = (element) => element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden";
|
|
68
|
+
/** A radio is tabbable when it is the checked one of its group, or the group has none checked. */
|
|
69
|
+
var isTabbableRadio = (element, root) => {
|
|
70
|
+
if (!(element instanceof HTMLInputElement) || element.type !== "radio" || element.name === "") return true;
|
|
71
|
+
const group = Array.from(root.querySelectorAll(`input[type="radio"][name="${CSS.escape(element.name)}"]`)).filter((radio) => radio.form === element.form);
|
|
72
|
+
const checked = group.find((radio) => radio.checked);
|
|
73
|
+
return checked ? checked === element : group[0] === element;
|
|
74
|
+
};
|
|
75
|
+
/** The elements under `root` that Tab visits, in Tab order (positive `tabindex` first). */
|
|
76
|
+
var tabbableElements = (root) => {
|
|
77
|
+
const candidates = Array.from(root.querySelectorAll(TABBABLE_SELECTOR)).filter((element) => element.tabIndex >= 0 && element.closest("[inert]") === null && isRendered(element) && isTabbableRadio(element, root));
|
|
78
|
+
return [...candidates.filter((element) => element.tabIndex > 0).sort((a, b) => a.tabIndex - b.tabIndex), ...candidates.filter((element) => element.tabIndex === 0)];
|
|
79
|
+
};
|
|
80
|
+
/** Focus the first (or last) tabbable element under `root`, or `root` itself when there is none. */
|
|
81
|
+
var focusEdge = (root, edge) => {
|
|
82
|
+
const tabbables = tabbableElements(root);
|
|
83
|
+
((edge === "first" ? tabbables[0] : tabbables.at(-1)) ?? root).focus();
|
|
84
|
+
};
|
|
85
|
+
var Root = /*#__PURE__*/ styled("div")({
|
|
86
|
+
name: "Root",
|
|
87
|
+
class: "gx-FocusScope-ry2i33n",
|
|
88
|
+
propsAsIs: false
|
|
89
|
+
});
|
|
90
|
+
/** Keeps focus inside its children while mounted. */
|
|
91
|
+
var FocusScope = forwardRef(function FocusScope({ children, isTrapped = true, shouldRestoreFocus = true, autoFocus = "FIRST", onEscape, id, className, style, ...rest }, ref) {
|
|
92
|
+
const parent = useContext(FocusScopeContext);
|
|
93
|
+
const [scope] = useState(() => ({ parent }));
|
|
94
|
+
/** Focus before the scope mounted, read on the first render (before any child `autoFocus`). */
|
|
95
|
+
const [focusBeforeMount] = useState(() => typeof document === "undefined" ? null : document.activeElement);
|
|
96
|
+
const rootRef = useRef(null);
|
|
97
|
+
/** The last element focused inside the scope, including in portals. */
|
|
98
|
+
const lastFocusedRef = useRef(null);
|
|
99
|
+
/** The last element focused in the scope's own DOM (not a portal): a portal's anchor. */
|
|
100
|
+
const lastFocusedInRootRef = useRef(null);
|
|
101
|
+
/** The last native focus or key event React delivered to the scope (DOM or portal descendant). */
|
|
102
|
+
const insideEventRef = useRef(null);
|
|
103
|
+
const shouldRestoreFocusRef = useRef(shouldRestoreFocus);
|
|
104
|
+
shouldRestoreFocusRef.current = shouldRestoreFocus;
|
|
105
|
+
const autoFocusRef = useRef(autoFocus);
|
|
106
|
+
autoFocusRef.current = autoFocus;
|
|
107
|
+
const setRootRef = useCallback((node) => {
|
|
108
|
+
rootRef.current = node;
|
|
109
|
+
if (typeof ref === "function") ref(node);
|
|
110
|
+
else if (ref) ref.current = node;
|
|
111
|
+
}, [ref]);
|
|
112
|
+
useIsomorphicLayoutEffect(() => {
|
|
113
|
+
const root = rootRef.current;
|
|
114
|
+
if (!isTrapped || root === null) return;
|
|
115
|
+
TRAPPED_SCOPES.push(scope);
|
|
116
|
+
const isActive = () => activeScope() === scope;
|
|
117
|
+
const isInside = (event) => event.target instanceof Node && root.contains(event.target) || insideEventRef.current === event;
|
|
118
|
+
/** Set by a Tab pressed in a portal of this scope, for the focus move that follows it. */
|
|
119
|
+
let portalTab = null;
|
|
120
|
+
let portalTabTimer;
|
|
121
|
+
const onKeyDown = (event) => {
|
|
122
|
+
if (event.key !== "Tab" || event.defaultPrevented || !isActive()) return;
|
|
123
|
+
if (event.altKey || event.ctrlKey || event.metaKey) return;
|
|
124
|
+
const target = event.target;
|
|
125
|
+
if (!(target instanceof Element) || !root.contains(target)) {
|
|
126
|
+
if (isInside(event)) {
|
|
127
|
+
portalTab = event.shiftKey ? "backward" : "forward";
|
|
128
|
+
clearTimeout(portalTabTimer);
|
|
129
|
+
portalTabTimer = setTimeout(() => {
|
|
130
|
+
portalTab = null;
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
focusEdge(root, event.shiftKey ? "last" : "first");
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const tabbables = tabbableElements(root);
|
|
139
|
+
const first = tabbables[0];
|
|
140
|
+
const last = tabbables.at(-1);
|
|
141
|
+
if (first === void 0 || last === void 0) {
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
root.focus();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const index = tabbables.indexOf(target);
|
|
147
|
+
if (index === -1) {
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
(event.shiftKey ? tabbables.findLast((element) => (target.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_PRECEDING) !== 0) ?? last : tabbables.find((element) => (target.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0) ?? first).focus();
|
|
150
|
+
} else if (event.shiftKey && index === 0) {
|
|
151
|
+
event.preventDefault();
|
|
152
|
+
last.focus();
|
|
153
|
+
} else if (!event.shiftKey && index === tabbables.length - 1) {
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
first.focus();
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const onFocusIn = (event) => {
|
|
159
|
+
const direction = portalTab;
|
|
160
|
+
portalTab = null;
|
|
161
|
+
if (!isActive() || isInside(event)) return;
|
|
162
|
+
const anchor = lastFocusedInRootRef.current;
|
|
163
|
+
const hasAnchor = (anchor instanceof HTMLElement || anchor instanceof SVGElement) && root.contains(anchor);
|
|
164
|
+
if (direction !== null && hasAnchor) {
|
|
165
|
+
const next = direction === "forward" ? tabbableElements(root).find((element) => (anchor.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0) : anchor;
|
|
166
|
+
if (next) next.focus();
|
|
167
|
+
else focusEdge(root, "first");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const previous = lastFocusedRef.current;
|
|
171
|
+
if ((previous instanceof HTMLElement || previous instanceof SVGElement) && previous.isConnected) {
|
|
172
|
+
previous.focus();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
focusEdge(root, "first");
|
|
176
|
+
};
|
|
177
|
+
document.addEventListener("keydown", onKeyDown);
|
|
178
|
+
document.addEventListener("focusin", onFocusIn);
|
|
179
|
+
return () => {
|
|
180
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
181
|
+
document.removeEventListener("focusin", onFocusIn);
|
|
182
|
+
clearTimeout(portalTabTimer);
|
|
183
|
+
const index = TRAPPED_SCOPES.lastIndexOf(scope);
|
|
184
|
+
if (index !== -1) TRAPPED_SCOPES.splice(index, 1);
|
|
185
|
+
};
|
|
186
|
+
}, [isTrapped, scope]);
|
|
187
|
+
useIsomorphicLayoutEffect(() => {
|
|
188
|
+
const root = rootRef.current;
|
|
189
|
+
if (root === null) return;
|
|
190
|
+
if (autoFocusRef.current === "FIRST" && !root.contains(document.activeElement)) focusEdge(root, "first");
|
|
191
|
+
return () => {
|
|
192
|
+
if (!shouldRestoreFocusRef.current) return;
|
|
193
|
+
const active = document.activeElement;
|
|
194
|
+
if ((active === null || active === document.body || root.contains(active) || active === lastFocusedRef.current) && (focusBeforeMount instanceof HTMLElement || focusBeforeMount instanceof SVGElement) && focusBeforeMount.isConnected) focusBeforeMount.focus();
|
|
195
|
+
};
|
|
196
|
+
}, [focusBeforeMount]);
|
|
197
|
+
const onFocusCapture = (event) => {
|
|
198
|
+
insideEventRef.current = event.nativeEvent;
|
|
199
|
+
lastFocusedRef.current = event.target;
|
|
200
|
+
if (event.currentTarget.contains(event.target)) lastFocusedInRootRef.current = event.target;
|
|
201
|
+
};
|
|
202
|
+
const onKeyDownCapture = (event) => {
|
|
203
|
+
insideEventRef.current = event.nativeEvent;
|
|
204
|
+
};
|
|
205
|
+
const onKeyDown = (event) => {
|
|
206
|
+
if (event.key !== "Escape" || onEscape === void 0) return;
|
|
207
|
+
if (event.defaultPrevented || event.nativeEvent.isComposing) return;
|
|
208
|
+
event.stopPropagation();
|
|
209
|
+
onEscape();
|
|
210
|
+
};
|
|
211
|
+
return /* @__PURE__ */ jsx(FocusScopeContext.Provider, {
|
|
212
|
+
value: scope,
|
|
213
|
+
children: /* @__PURE__ */ jsx(Root, {
|
|
214
|
+
...rest,
|
|
215
|
+
ref: setRootRef,
|
|
216
|
+
id,
|
|
217
|
+
tabIndex: -1,
|
|
218
|
+
onFocusCapture,
|
|
219
|
+
onKeyDownCapture,
|
|
220
|
+
onKeyDown,
|
|
221
|
+
className,
|
|
222
|
+
style,
|
|
223
|
+
children
|
|
224
|
+
})
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
FocusScope.displayName = "FocusScope";
|
|
228
|
+
//#endregion
|
|
229
|
+
export { FocusScopeAutoFocus, FocusScope as default };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AriaAttributes, type CSSProperties, type ElementType, type ReactNode } from "react";
|
|
2
|
+
export interface VisuallyHiddenProps extends AriaAttributes {
|
|
3
|
+
/** What screen readers announce. */
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
/**
|
|
6
|
+
* Element or component to render (`"div"` for block content, `"label"` for a hidden label).
|
|
7
|
+
* @default "span"
|
|
8
|
+
*/
|
|
9
|
+
as?: ElementType;
|
|
10
|
+
/** DOM id, e.g. the target of an `aria-describedby`. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Any `data-*` attribute, forwarded to the root element. */
|
|
13
|
+
[dataAttribute: `data-${string}`]: string | number | boolean | undefined;
|
|
14
|
+
/** Extra class on the root element. */
|
|
15
|
+
className?: string;
|
|
16
|
+
/** Inline style on the root element; only for setting CSS custom properties. */
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
}
|
|
19
|
+
/** Renders its children for assistive technology only. */
|
|
20
|
+
declare const VisuallyHidden: import("react").ForwardRefExoticComponent<VisuallyHiddenProps & import("react").RefAttributes<HTMLElement>>;
|
|
21
|
+
export default VisuallyHidden;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
import { styled } from "@linaria/react";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/a11y/VisuallyHidden.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Content for screen readers only: removed from the visual layout with the `VISUALLY_HIDDEN`
|
|
8
|
+
* mixin, still in the accessibility tree. Use it for the accessible name of an icon-only control,
|
|
9
|
+
* a live-region announcement, or a heading a sighted user does not need.
|
|
10
|
+
*/
|
|
11
|
+
var Root = /*#__PURE__*/ styled("span")({
|
|
12
|
+
name: "Root",
|
|
13
|
+
class: "gx-VisuallyHidden-r1n9rkuz",
|
|
14
|
+
propsAsIs: false
|
|
15
|
+
});
|
|
16
|
+
/** Renders its children for assistive technology only. */
|
|
17
|
+
var VisuallyHidden = forwardRef(function VisuallyHidden({ children, as = "span", id, className, style, ...rest }, ref) {
|
|
18
|
+
return /* @__PURE__ */ jsx(Root, {
|
|
19
|
+
...rest,
|
|
20
|
+
as,
|
|
21
|
+
ref,
|
|
22
|
+
id,
|
|
23
|
+
className,
|
|
24
|
+
style,
|
|
25
|
+
children
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
VisuallyHidden.displayName = "VisuallyHidden";
|
|
29
|
+
//#endregion
|
|
30
|
+
export { VisuallyHidden as default };
|