@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
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import Text, { TextSize, TextVariant } from "../text/Text.js";
|
|
2
|
+
import { useControlledState } from "../hooks/useControlledState.js";
|
|
3
|
+
import Icon, { IconVariant } from "../icons/Icon.js";
|
|
4
|
+
import Button, { ButtonSize, ButtonVariant } from "../buttons/Button.js";
|
|
5
|
+
import { formatBytes } from "../utils/format.js";
|
|
6
|
+
import { useDevWarning } from "./internal/devWarn.js";
|
|
7
|
+
import { useFieldWiring } from "./internal/fieldWiring.js";
|
|
8
|
+
import Field, { FieldSize } from "./Field.js";
|
|
9
|
+
import { rootStyle, useOwnField } from "./internal/ownField.js";
|
|
10
|
+
/* empty css */
|
|
11
|
+
import { styled } from "@linaria/react";
|
|
12
|
+
import { forwardRef, useEffect, useRef, useState } from "react";
|
|
13
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { cx } from "@linaria/core";
|
|
15
|
+
import { FileIcon, UploadSimpleIcon, XIcon } from "@phosphor-icons/react";
|
|
16
|
+
//#region src/inputs/FileInput.tsx
|
|
17
|
+
/**
|
|
18
|
+
* The form control for choosing local files to hand to the app: a CSV to import, documents for a
|
|
19
|
+
* knowledge source, a service-account key. A drop zone accepts files dragged onto it and a
|
|
20
|
+
* "Choose files" button opens the system picker; under it, the chosen files are listed with their
|
|
21
|
+
* name, size and a remove button. The value is the list of `File` objects, with `value` /
|
|
22
|
+
* `defaultValue` / `onChange`. `accept` filters the picker and drops alike; files it did not take
|
|
23
|
+
* (wrong type, extras in single mode, folders) go to `onReject`. `renderFileActions` replaces a
|
|
24
|
+
* row's remove button with the app's content, such as upload progress.
|
|
25
|
+
*
|
|
26
|
+
* Built on native drag-and-drop (no `react-dropzone`). It never uploads, reads or validates files:
|
|
27
|
+
* uploading, size limits and messages are the app's. A standalone FileInput with `label` or
|
|
28
|
+
* `error` renders a `Field` around itself. No 1.x DLS equivalent (the GX app's `react-dropzone`
|
|
29
|
+
* dropzone).
|
|
30
|
+
*
|
|
31
|
+
* SSR: ids come from `useId`; drag state lives in event handlers; nothing touches `window`,
|
|
32
|
+
* `document` or `DataTransfer` at module scope or during render.
|
|
33
|
+
*/
|
|
34
|
+
/** Canonical rungs; FileInput exposes three. Sets the button, the file rows, and the zone's padding and text. */
|
|
35
|
+
var FileInputSize = /* @__PURE__ */ function(FileInputSize) {
|
|
36
|
+
/** 24px button and rows, body_sm text, 16px zone padding. */
|
|
37
|
+
FileInputSize["SMALL"] = "SMALL";
|
|
38
|
+
/** 32px button and rows, body_md text, 24px zone padding. The default. */
|
|
39
|
+
FileInputSize["MEDIUM"] = "MEDIUM";
|
|
40
|
+
/** 36px button and rows, body_lg text, 32px zone padding. */
|
|
41
|
+
FileInputSize["LARGE"] = "LARGE";
|
|
42
|
+
return FileInputSize;
|
|
43
|
+
}({});
|
|
44
|
+
/** Resting fill of the drop zone (Constitution V-A surface set; the 1.x `InputVariant` members). */
|
|
45
|
+
var FileInputVariant = /* @__PURE__ */ function(FileInputVariant) {
|
|
46
|
+
/** `background.base` fill. */
|
|
47
|
+
FileInputVariant["BASE"] = "BASE";
|
|
48
|
+
/** `background.primary` fill. The default. */
|
|
49
|
+
FileInputVariant["PRIMARY"] = "PRIMARY";
|
|
50
|
+
/** `background.secondary` fill. */
|
|
51
|
+
FileInputVariant["SECONDARY"] = "SECONDARY";
|
|
52
|
+
/** `background.tertiary` fill. */
|
|
53
|
+
FileInputVariant["TERTIARY"] = "TERTIARY";
|
|
54
|
+
return FileInputVariant;
|
|
55
|
+
}({});
|
|
56
|
+
/** The control's width without `fillWidth` (the SelectInput panel maximum). */
|
|
57
|
+
/** The group: the hidden native input, the zone, the file list and the live region. */
|
|
58
|
+
var Group = /*#__PURE__*/ styled("div")({
|
|
59
|
+
name: "Group",
|
|
60
|
+
class: "gx-FileInput-Group-g1ytda4s",
|
|
61
|
+
propsAsIs: false
|
|
62
|
+
});
|
|
63
|
+
/** The native picker: never seen, focused or announced; the "Choose files" button clicks it. */
|
|
64
|
+
var NativeInput = /*#__PURE__*/ styled("input")({
|
|
65
|
+
name: "NativeInput",
|
|
66
|
+
class: "gx-FileInput-NativeInput-n1u9x4rm",
|
|
67
|
+
propsAsIs: false
|
|
68
|
+
});
|
|
69
|
+
/** The drop zone: a dashed hairline around the icon, the text and the button. Not focusable. */
|
|
70
|
+
var Zone = /*#__PURE__*/ styled("div")({
|
|
71
|
+
name: "Zone",
|
|
72
|
+
class: "gx-FileInput-Zone-z12oqump",
|
|
73
|
+
propsAsIs: false
|
|
74
|
+
});
|
|
75
|
+
/** The chosen files, in a hairline box. `role="list"` keeps list semantics without bullets. */
|
|
76
|
+
var FileList = /*#__PURE__*/ styled("ul")({
|
|
77
|
+
name: "FileList",
|
|
78
|
+
class: "gx-FileInput-FileList-fdf24zr",
|
|
79
|
+
propsAsIs: false
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* One file: icon, name, size and actions, at the rung's control height. The hairline between rows
|
|
83
|
+
* is drawn by `::before` over the row's top edge, so it takes no height from the row and the icon
|
|
84
|
+
* and buttons stay centered on whole pixels.
|
|
85
|
+
*/
|
|
86
|
+
var FileRow = /*#__PURE__*/ styled("li")({
|
|
87
|
+
name: "FileRow",
|
|
88
|
+
class: "gx-FileInput-FileRow-f19fvk9w",
|
|
89
|
+
propsAsIs: false
|
|
90
|
+
});
|
|
91
|
+
/** The file name's slot: it takes the rest of the row and truncates. */
|
|
92
|
+
var FileName = /*#__PURE__*/ styled("span")({
|
|
93
|
+
name: "FileName",
|
|
94
|
+
class: "gx-FileInput-FileName-fufhquj",
|
|
95
|
+
propsAsIs: false
|
|
96
|
+
});
|
|
97
|
+
/** The size and the actions never shrink. */
|
|
98
|
+
var NoShrink = /*#__PURE__*/ styled("span")({
|
|
99
|
+
name: "NoShrink",
|
|
100
|
+
class: "gx-FileInput-NoShrink-nepfpz5",
|
|
101
|
+
propsAsIs: false
|
|
102
|
+
});
|
|
103
|
+
/** The polite live region for added, removed and rejected files (`VisuallyHidden` takes no `role`). */
|
|
104
|
+
var StatusRegion = /*#__PURE__*/ styled("span")({
|
|
105
|
+
name: "StatusRegion",
|
|
106
|
+
class: "gx-FileInput-StatusRegion-sy7l04l",
|
|
107
|
+
propsAsIs: false
|
|
108
|
+
});
|
|
109
|
+
/** Zone padding and gap, file-row height and insets per rung (the canonical rung table). */
|
|
110
|
+
var FILE_INPUT_SIZE_TO_CSS_MAP = {
|
|
111
|
+
["SMALL"]: "gx-FileInput-SMALL-s1hrapll",
|
|
112
|
+
["MEDIUM"]: "gx-FileInput-MEDIUM-m3wsxhs",
|
|
113
|
+
["LARGE"]: "gx-FileInput-LARGE-l1fx5o6"
|
|
114
|
+
};
|
|
115
|
+
/** The zone's rest look: the Input fills, with a dashed `border.primary` hairline on every variant. */
|
|
116
|
+
var FILE_INPUT_VARIANT_TO_CSS_MAP = {
|
|
117
|
+
["BASE"]: "gx-FileInput-BASE-b1qlrgtm",
|
|
118
|
+
["PRIMARY"]: "gx-FileInput-PRIMARY-p1onua8y",
|
|
119
|
+
["SECONDARY"]: "gx-FileInput-SECONDARY-s18e5m84",
|
|
120
|
+
["TERTIARY"]: "gx-FileInput-TERTIARY-t1arbxdm"
|
|
121
|
+
};
|
|
122
|
+
/** `isGhost`: no fill and no dashed hairline at rest. Declared after the variant map, which it replaces. */
|
|
123
|
+
var GHOST_CSS = "gx-FileInput-GHOST_CSS-g1xwgmj8";
|
|
124
|
+
/** Hover on an editable zone (2026-10-03 field-frame resolution): `border.hovered`. */
|
|
125
|
+
var ZONE_HOVER_CSS = "gx-FileInput-ZONE_HOVER_CSS-z1nts58e";
|
|
126
|
+
/** An editable ghost zone while its button has focus: the dashed frame appears, `border.hovered`. */
|
|
127
|
+
var GHOST_FOCUS_CSS = "gx-FileInput-GHOST_FOCUS_CSS-g1mfv4vb";
|
|
128
|
+
/** Files dragged over an editable zone: `border.focused` and the neutral interaction fill. */
|
|
129
|
+
var DRAG_ACTIVE_CSS = "gx-FileInput-DRAG_ACTIVE_CSS-d5bpp2p";
|
|
130
|
+
/** Error border at rest and on hover (not while drag-active, so the drop target still reads). */
|
|
131
|
+
var ERROR_CSS = "gx-FileInput-ERROR_CSS-esgy3bm";
|
|
132
|
+
/**
|
|
133
|
+
* Disabled: the variant's resting fill and dashed hairline are kept (`border.disabled` is not used
|
|
134
|
+
* on frames); the zone reads as disabled through its text, icon, button and the cursor.
|
|
135
|
+
*/
|
|
136
|
+
var DISABLED_CSS = "gx-FileInput-DISABLED_CSS-d194c16g";
|
|
137
|
+
/** Stretch to the parent's width (the group, and the `Field` wrapper when there is one). */
|
|
138
|
+
var FILL_WIDTH_CSS = "gx-FileInput-FILL_WIDTH_CSS-f1l5ttml";
|
|
139
|
+
/** Zone and file-row text per rung. */
|
|
140
|
+
var FILE_INPUT_SIZE_TO_TEXT_SIZE_MAP = {
|
|
141
|
+
["SMALL"]: TextSize.BODY_SM,
|
|
142
|
+
["MEDIUM"]: TextSize.BODY_MD,
|
|
143
|
+
["LARGE"]: TextSize.BODY_LG
|
|
144
|
+
};
|
|
145
|
+
/** The zone's upload icon per rung. */
|
|
146
|
+
var FILE_INPUT_SIZE_TO_ICON_PX_MAP = {
|
|
147
|
+
["SMALL"]: 16,
|
|
148
|
+
["MEDIUM"]: 20,
|
|
149
|
+
["LARGE"]: 24
|
|
150
|
+
};
|
|
151
|
+
/** A file row's icon per rung: the rung icon, one step below III-A.4 (Mitch, 2026-10-04). */
|
|
152
|
+
var FILE_INPUT_SIZE_TO_ROW_ICON_PX_MAP = {
|
|
153
|
+
["SMALL"]: 12,
|
|
154
|
+
["MEDIUM"]: 14,
|
|
155
|
+
["LARGE"]: 14
|
|
156
|
+
};
|
|
157
|
+
/** The "Choose files" button's rung (identity). */
|
|
158
|
+
var FILE_INPUT_SIZE_TO_BUTTON_SIZE_MAP = {
|
|
159
|
+
["SMALL"]: ButtonSize.SMALL,
|
|
160
|
+
["MEDIUM"]: ButtonSize.MEDIUM,
|
|
161
|
+
["LARGE"]: ButtonSize.LARGE
|
|
162
|
+
};
|
|
163
|
+
/** A row's remove button: Input's in-field button rung, centered in the row by the end inset. */
|
|
164
|
+
var FILE_INPUT_SIZE_TO_REMOVE_BUTTON_SIZE_MAP = {
|
|
165
|
+
["SMALL"]: ButtonSize.X_SMALL,
|
|
166
|
+
["MEDIUM"]: ButtonSize.X_SMALL,
|
|
167
|
+
["LARGE"]: ButtonSize.SMALL
|
|
168
|
+
};
|
|
169
|
+
/** The `Field` a FileInput renders for its own `label` / `error` uses the same rung. */
|
|
170
|
+
var FILE_INPUT_SIZE_TO_FIELD_SIZE_MAP = {
|
|
171
|
+
["SMALL"]: FieldSize.SMALL,
|
|
172
|
+
["MEDIUM"]: FieldSize.MEDIUM,
|
|
173
|
+
["LARGE"]: FieldSize.LARGE
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Whether `file` matches the native `accept` string: `.ext` by name (case-insensitive), `type/*`
|
|
177
|
+
* by MIME prefix, anything else by exact MIME type. An unset or empty `accept` matches every file.
|
|
178
|
+
*/
|
|
179
|
+
function matchesAccept(file, accept) {
|
|
180
|
+
if (accept === void 0) return true;
|
|
181
|
+
const tokens = accept.split(",").map((token) => token.trim().toLowerCase()).filter((token) => token !== "");
|
|
182
|
+
if (tokens.length === 0) return true;
|
|
183
|
+
const name = file.name.toLowerCase();
|
|
184
|
+
const type = file.type.toLowerCase();
|
|
185
|
+
return tokens.some((token) => {
|
|
186
|
+
if (token.startsWith(".")) return name.endsWith(token);
|
|
187
|
+
if (token.endsWith("/*")) return type.startsWith(token.slice(0, -1));
|
|
188
|
+
return type === token;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Two `File`s are the same choice when name, size and modification time match. */
|
|
192
|
+
function fileKey(file) {
|
|
193
|
+
return `${file.name}\u0000${file.size}\u0000${file.lastModified}`;
|
|
194
|
+
}
|
|
195
|
+
/** The files a drop carries, with folders split out (where `webkitGetAsEntry` exists). */
|
|
196
|
+
function readDrop(transfer) {
|
|
197
|
+
const files = [];
|
|
198
|
+
const folders = [];
|
|
199
|
+
const items = Array.from(transfer.items ?? []);
|
|
200
|
+
if (items.length === 0) return {
|
|
201
|
+
files: Array.from(transfer.files),
|
|
202
|
+
folders
|
|
203
|
+
};
|
|
204
|
+
for (const item of items) {
|
|
205
|
+
if (item.kind !== "file") continue;
|
|
206
|
+
const file = item.getAsFile();
|
|
207
|
+
if (file === null) continue;
|
|
208
|
+
if ((typeof item.webkitGetAsEntry === "function" ? item.webkitGetAsEntry() : null)?.isDirectory === true) folders.push(file);
|
|
209
|
+
else files.push(file);
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
files,
|
|
213
|
+
folders
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/** The group, the zone and the file list, wired to the nearest Field (the input's own or the app's). */
|
|
217
|
+
function FileGroup({ fileProps, forwardedRef, isRoot }) {
|
|
218
|
+
const { value, defaultValue = [], onChange, onReject, accept, isMultiple = false, renderFileActions, size = "MEDIUM", variant = "PRIMARY", isGhost = false, label: _label, placeholder, error, isError = false, isDisabled = false, isReadOnly = false, isRequired = false, fillWidth = false, ariaLabel, id, "aria-describedby": ariaDescribedBy, className, style, ...rest } = fileProps;
|
|
219
|
+
const { field, controlId: groupId, describedBy: buttonDescribedBy, isInvalid, hasName } = useFieldWiring({
|
|
220
|
+
id,
|
|
221
|
+
ariaLabel,
|
|
222
|
+
ariaLabelAttribute: rest["aria-label"],
|
|
223
|
+
ariaLabelledBy: rest["aria-labelledby"],
|
|
224
|
+
ariaDescribedBy,
|
|
225
|
+
error,
|
|
226
|
+
isError,
|
|
227
|
+
isRequired
|
|
228
|
+
});
|
|
229
|
+
const [files, setFiles] = useControlledState({
|
|
230
|
+
value,
|
|
231
|
+
defaultValue,
|
|
232
|
+
onChange
|
|
233
|
+
});
|
|
234
|
+
const filesRef = useRef(files);
|
|
235
|
+
filesRef.current = files;
|
|
236
|
+
const [announcement, setAnnouncement] = useState("");
|
|
237
|
+
const [isDragActive, setIsDragActive] = useState(false);
|
|
238
|
+
const dragDepthRef = useRef(0);
|
|
239
|
+
const nativeRef = useRef(null);
|
|
240
|
+
const chooseRef = useRef(null);
|
|
241
|
+
const removeRefs = useRef([]);
|
|
242
|
+
const pendingFocusRef = useRef(null);
|
|
243
|
+
const canEdit = !isDisabled && !isReadOnly;
|
|
244
|
+
const textSize = FILE_INPUT_SIZE_TO_TEXT_SIZE_MAP[size];
|
|
245
|
+
const zoneText = placeholder ?? (isMultiple ? "Drop files here" : "Drop a file here");
|
|
246
|
+
/** Sets the live region; a repeat of the same message is made distinct so it is read again. */
|
|
247
|
+
const announce = (message) => {
|
|
248
|
+
setAnnouncement((previous) => previous === message ? `${message} ` : message);
|
|
249
|
+
};
|
|
250
|
+
/** Sorts incoming files into accepted and rejected, updates the list and reports both once. */
|
|
251
|
+
const addFiles = (incoming, folders = []) => {
|
|
252
|
+
if (!canEdit) return;
|
|
253
|
+
const current = filesRef.current;
|
|
254
|
+
const seen = new Set(current.map(fileKey));
|
|
255
|
+
const rejected = [...folders];
|
|
256
|
+
const accepted = [];
|
|
257
|
+
for (const file of incoming) {
|
|
258
|
+
if (!matchesAccept(file, accept)) {
|
|
259
|
+
rejected.push(file);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const key = fileKey(file);
|
|
263
|
+
if (seen.has(key)) continue;
|
|
264
|
+
seen.add(key);
|
|
265
|
+
if (!isMultiple && accepted.length > 0) {
|
|
266
|
+
rejected.push(file);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
accepted.push(file);
|
|
270
|
+
}
|
|
271
|
+
const messages = [];
|
|
272
|
+
if (accepted.length > 0) {
|
|
273
|
+
const next = isMultiple ? [...current, ...accepted] : accepted;
|
|
274
|
+
filesRef.current = next;
|
|
275
|
+
setFiles(next);
|
|
276
|
+
messages.push(accepted.length === 1 ? `${accepted[0]?.name} added` : `${accepted.length} files added`);
|
|
277
|
+
}
|
|
278
|
+
if (rejected.length > 0) {
|
|
279
|
+
onReject?.(rejected);
|
|
280
|
+
messages.push(rejected.length === 1 ? "1 file not added" : `${rejected.length} files not added`);
|
|
281
|
+
}
|
|
282
|
+
if (messages.length > 0) announce(messages.join(". "));
|
|
283
|
+
};
|
|
284
|
+
const remove = (index) => {
|
|
285
|
+
if (!canEdit) return;
|
|
286
|
+
const current = filesRef.current;
|
|
287
|
+
const file = current[index];
|
|
288
|
+
if (file === void 0) return;
|
|
289
|
+
const next = current.filter((_, position) => position !== index);
|
|
290
|
+
pendingFocusRef.current = index < next.length ? {
|
|
291
|
+
kind: "remove",
|
|
292
|
+
index
|
|
293
|
+
} : index > 0 ? {
|
|
294
|
+
kind: "remove",
|
|
295
|
+
index: index - 1
|
|
296
|
+
} : { kind: "choose" };
|
|
297
|
+
filesRef.current = next;
|
|
298
|
+
setFiles(next);
|
|
299
|
+
announce(`${file.name} removed`);
|
|
300
|
+
};
|
|
301
|
+
const openPicker = () => {
|
|
302
|
+
if (!canEdit) return;
|
|
303
|
+
nativeRef.current?.click();
|
|
304
|
+
};
|
|
305
|
+
const handleNativeChange = (event) => {
|
|
306
|
+
const chosen = Array.from(event.target.files ?? []);
|
|
307
|
+
event.target.value = "";
|
|
308
|
+
addFiles(chosen);
|
|
309
|
+
};
|
|
310
|
+
/** A press anywhere on the zone opens the picker; the button opens it itself. */
|
|
311
|
+
const handleZoneClick = (event) => {
|
|
312
|
+
if (event.target.closest("button") !== null) return;
|
|
313
|
+
openPicker();
|
|
314
|
+
};
|
|
315
|
+
const carriesFiles = (event) => Array.from(event.dataTransfer.types).includes("Files");
|
|
316
|
+
const handleDragEnter = (event) => {
|
|
317
|
+
if (!canEdit || !carriesFiles(event)) return;
|
|
318
|
+
event.preventDefault();
|
|
319
|
+
dragDepthRef.current += 1;
|
|
320
|
+
setIsDragActive(true);
|
|
321
|
+
};
|
|
322
|
+
const handleDragLeave = (event) => {
|
|
323
|
+
if (!canEdit || !carriesFiles(event)) return;
|
|
324
|
+
dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);
|
|
325
|
+
if (dragDepthRef.current === 0) setIsDragActive(false);
|
|
326
|
+
};
|
|
327
|
+
const handleDragOver = (event) => {
|
|
328
|
+
if (!canEdit) return;
|
|
329
|
+
event.preventDefault();
|
|
330
|
+
event.dataTransfer.dropEffect = "copy";
|
|
331
|
+
};
|
|
332
|
+
const handleDrop = (event) => {
|
|
333
|
+
if (!canEdit) return;
|
|
334
|
+
event.preventDefault();
|
|
335
|
+
dragDepthRef.current = 0;
|
|
336
|
+
setIsDragActive(false);
|
|
337
|
+
const { files: dropped, folders } = readDrop(event.dataTransfer);
|
|
338
|
+
addFiles(dropped, folders);
|
|
339
|
+
};
|
|
340
|
+
useEffect(() => {
|
|
341
|
+
const target = pendingFocusRef.current;
|
|
342
|
+
if (target === null) return;
|
|
343
|
+
pendingFocusRef.current = null;
|
|
344
|
+
((target.kind === "choose" ? chooseRef.current : removeRefs.current[target.index]) ?? chooseRef.current)?.focus();
|
|
345
|
+
});
|
|
346
|
+
useDevWarning(!hasName, "[@galaxy-io/dls] FileInput has no accessible name. Pass `label`, wrap it in a labelled `Field`, or set `ariaLabel`.");
|
|
347
|
+
const isDropTarget = isDragActive && canEdit;
|
|
348
|
+
const rowIconPx = FILE_INPUT_SIZE_TO_ROW_ICON_PX_MAP[size];
|
|
349
|
+
const rowTextVariant = isDisabled ? TextVariant.DISABLED : TextVariant.PRIMARY;
|
|
350
|
+
const rowMetaVariant = isDisabled ? TextVariant.DISABLED : TextVariant.TERTIARY;
|
|
351
|
+
const rowIconVariant = isDisabled ? IconVariant.DISABLED : IconVariant.SECONDARY;
|
|
352
|
+
return /* @__PURE__ */ jsxs(Group, {
|
|
353
|
+
...field?.labelId === void 0 ? {} : { "aria-labelledby": field.labelId },
|
|
354
|
+
...rest,
|
|
355
|
+
ref: forwardedRef,
|
|
356
|
+
id: groupId,
|
|
357
|
+
role: "group",
|
|
358
|
+
"aria-label": ariaLabel ?? rest["aria-label"],
|
|
359
|
+
className: cx(FILE_INPUT_SIZE_TO_CSS_MAP[size], fillWidth && FILL_WIDTH_CSS, isRoot ? className : void 0),
|
|
360
|
+
...rootStyle(isRoot, style),
|
|
361
|
+
children: [
|
|
362
|
+
/* @__PURE__ */ jsx(NativeInput, {
|
|
363
|
+
ref: nativeRef,
|
|
364
|
+
type: "file",
|
|
365
|
+
tabIndex: -1,
|
|
366
|
+
"aria-hidden": true,
|
|
367
|
+
...accept === void 0 ? {} : { accept },
|
|
368
|
+
multiple: isMultiple,
|
|
369
|
+
disabled: isDisabled,
|
|
370
|
+
onChange: handleNativeChange
|
|
371
|
+
}),
|
|
372
|
+
!isReadOnly && /* @__PURE__ */ jsxs(Zone, {
|
|
373
|
+
onClick: handleZoneClick,
|
|
374
|
+
onDragEnter: handleDragEnter,
|
|
375
|
+
onDragLeave: handleDragLeave,
|
|
376
|
+
onDragOver: handleDragOver,
|
|
377
|
+
onDrop: handleDrop,
|
|
378
|
+
className: cx(isGhost ? GHOST_CSS : FILE_INPUT_VARIANT_TO_CSS_MAP[variant], canEdit && !isInvalid && ZONE_HOVER_CSS, isGhost && canEdit && !isInvalid && GHOST_FOCUS_CSS, isInvalid && !isDisabled && !isDropTarget && ERROR_CSS, isDropTarget && DRAG_ACTIVE_CSS, isDisabled && DISABLED_CSS),
|
|
379
|
+
children: [
|
|
380
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
381
|
+
component: UploadSimpleIcon,
|
|
382
|
+
size: FILE_INPUT_SIZE_TO_ICON_PX_MAP[size],
|
|
383
|
+
variant: isDisabled ? IconVariant.DISABLED : IconVariant.SECONDARY
|
|
384
|
+
}),
|
|
385
|
+
/* @__PURE__ */ jsx(Text, {
|
|
386
|
+
as: "span",
|
|
387
|
+
size: textSize,
|
|
388
|
+
variant: isDisabled ? TextVariant.DISABLED : TextVariant.SECONDARY,
|
|
389
|
+
children: zoneText
|
|
390
|
+
}),
|
|
391
|
+
/* @__PURE__ */ jsx(Button, {
|
|
392
|
+
ref: chooseRef,
|
|
393
|
+
variant: ButtonVariant.SECONDARY,
|
|
394
|
+
size: FILE_INPUT_SIZE_TO_BUTTON_SIZE_MAP[size],
|
|
395
|
+
label: isMultiple ? "Choose files" : "Choose file",
|
|
396
|
+
isDisabled,
|
|
397
|
+
onClick: openPicker,
|
|
398
|
+
...buttonDescribedBy === void 0 ? {} : { "aria-describedby": buttonDescribedBy }
|
|
399
|
+
})
|
|
400
|
+
]
|
|
401
|
+
}),
|
|
402
|
+
files.length > 0 && /* @__PURE__ */ jsx(FileList, {
|
|
403
|
+
role: "list",
|
|
404
|
+
children: files.map((file, index) => /* @__PURE__ */ jsxs(FileRow, { children: [
|
|
405
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
406
|
+
component: FileIcon,
|
|
407
|
+
size: rowIconPx,
|
|
408
|
+
variant: rowIconVariant
|
|
409
|
+
}),
|
|
410
|
+
/* @__PURE__ */ jsx(FileName, { children: /* @__PURE__ */ jsx(Text, {
|
|
411
|
+
as: "span",
|
|
412
|
+
size: textSize,
|
|
413
|
+
variant: rowTextVariant,
|
|
414
|
+
lineClamp: 1,
|
|
415
|
+
shouldTooltipOnOverflow: true,
|
|
416
|
+
children: file.name
|
|
417
|
+
}) }),
|
|
418
|
+
/* @__PURE__ */ jsx(NoShrink, { children: /* @__PURE__ */ jsx(Text, {
|
|
419
|
+
as: "span",
|
|
420
|
+
size: textSize,
|
|
421
|
+
variant: rowMetaVariant,
|
|
422
|
+
isTabular: true,
|
|
423
|
+
children: formatBytes(file.size)
|
|
424
|
+
}) }),
|
|
425
|
+
renderFileActions !== void 0 ? /* @__PURE__ */ jsx(NoShrink, { children: renderFileActions(file, index) }) : !isReadOnly && /* @__PURE__ */ jsx(NoShrink, { children: /* @__PURE__ */ jsx(Button, {
|
|
426
|
+
ref: (element) => {
|
|
427
|
+
removeRefs.current[index] = element;
|
|
428
|
+
},
|
|
429
|
+
variant: ButtonVariant.TERTIARY,
|
|
430
|
+
size: FILE_INPUT_SIZE_TO_REMOVE_BUTTON_SIZE_MAP[size],
|
|
431
|
+
icon: XIcon,
|
|
432
|
+
ariaLabel: `Remove ${file.name}`,
|
|
433
|
+
isDisabled,
|
|
434
|
+
onClick: () => remove(index)
|
|
435
|
+
}) })
|
|
436
|
+
] }, fileKey(file)))
|
|
437
|
+
}),
|
|
438
|
+
/* @__PURE__ */ jsx(StatusRegion, {
|
|
439
|
+
role: "status",
|
|
440
|
+
"aria-live": "polite",
|
|
441
|
+
children: announcement
|
|
442
|
+
})
|
|
443
|
+
]
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
/** A drop zone and a "Choose files" button over a hidden native file input, with the chosen files listed. */
|
|
447
|
+
var FileInput = forwardRef(function FileInput(props, ref) {
|
|
448
|
+
const { label, error, isRequired = false, size = "MEDIUM", fillWidth = false, id, className, style } = props;
|
|
449
|
+
const ownField = useOwnField({
|
|
450
|
+
componentName: "FileInput",
|
|
451
|
+
label,
|
|
452
|
+
error,
|
|
453
|
+
isRequired,
|
|
454
|
+
size: FILE_INPUT_SIZE_TO_FIELD_SIZE_MAP[size],
|
|
455
|
+
id,
|
|
456
|
+
className,
|
|
457
|
+
style,
|
|
458
|
+
rootClassName: fillWidth && FILL_WIDTH_CSS
|
|
459
|
+
});
|
|
460
|
+
if (ownField !== null) return /* @__PURE__ */ jsx(Field, {
|
|
461
|
+
...ownField,
|
|
462
|
+
children: /* @__PURE__ */ jsx(FileGroup, {
|
|
463
|
+
fileProps: props,
|
|
464
|
+
forwardedRef: ref,
|
|
465
|
+
isRoot: false
|
|
466
|
+
})
|
|
467
|
+
});
|
|
468
|
+
return /* @__PURE__ */ jsx(FileGroup, {
|
|
469
|
+
fileProps: props,
|
|
470
|
+
forwardedRef: ref,
|
|
471
|
+
isRoot: true
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
FileInput.displayName = "FileInput";
|
|
475
|
+
//#endregion
|
|
476
|
+
export { FileInputSize, FileInputVariant, FileInput as default };
|