@galaxy-io/dls 1.6.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -50
- package/biome/index.json +74 -0
- package/biome/plugins/no-hex-literal.grit +20 -0
- package/biome/plugins/no-inline-style.grit +13 -0
- package/biome/plugins/no-margin.grit +9 -0
- package/biome/plugins/warn/no-hex-literal.grit +23 -0
- package/biome/plugins/warn/no-inline-style.grit +13 -0
- package/biome/plugins/warn/no-margin.grit +9 -0
- package/dist/a11y/FocusScope.d.ts +44 -0
- package/dist/a11y/FocusScope.js +229 -0
- package/dist/a11y/VisuallyHidden.d.ts +21 -0
- package/dist/a11y/VisuallyHidden.js +30 -0
- package/dist/avatar/Avatar.d.ts +56 -14
- package/dist/avatar/Avatar.js +250 -96
- package/dist/avatar/AvatarGroup.d.ts +43 -0
- package/dist/avatar/AvatarGroup.js +153 -0
- package/dist/backgrounds/GridBackground.d.ts +48 -0
- package/dist/backgrounds/GridBackground.js +146 -0
- package/dist/beacons/Beacon.d.ts +86 -22
- package/dist/beacons/Beacon.js +170 -47
- package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
- package/dist/brand/GalaxyFilamentWordmark.js +39 -0
- package/dist/brand/GalaxyLogomark.d.ts +26 -0
- package/dist/brand/GalaxyLogomark.js +41 -0
- package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
- package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
- package/dist/brand/GalaxyWordmark.d.ts +30 -0
- package/dist/brand/GalaxyWordmark.js +63 -0
- package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
- package/dist/brand/brandMark.d.ts +26 -0
- package/dist/brand/brandMark.js +35 -0
- package/dist/buttons/Button.d.ts +148 -59
- package/dist/buttons/Button.js +437 -227
- package/dist/buttons/ButtonGroup.d.ts +38 -0
- package/dist/buttons/ButtonGroup.js +68 -0
- package/dist/buttons/CopyButton.d.ts +77 -0
- package/dist/buttons/CopyButton.js +65 -0
- package/dist/charts/AreaChart.d.ts +49 -0
- package/dist/charts/AreaChart.js +31 -0
- package/dist/charts/BarChart.d.ts +54 -67
- package/dist/charts/BarChart.js +136 -116
- package/dist/charts/ChartAxis.d.ts +35 -40
- package/dist/charts/ChartAxis.js +114 -90
- package/dist/charts/ChartCategoryTargets.d.ts +12 -26
- package/dist/charts/ChartCategoryTargets.js +32 -20
- package/dist/charts/ChartFrame.d.ts +69 -116
- package/dist/charts/ChartFrame.js +253 -119
- package/dist/charts/ChartGroupProvider.d.ts +30 -41
- package/dist/charts/ChartGroupProvider.js +20 -7
- package/dist/charts/ChartLegend.d.ts +27 -48
- package/dist/charts/ChartLegend.js +206 -125
- package/dist/charts/ChartMarkTargets.d.ts +12 -28
- package/dist/charts/ChartMarkTargets.js +33 -20
- package/dist/charts/ChartPrimitives.d.ts +50 -305
- package/dist/charts/ChartPrimitives.js +65 -413
- package/dist/charts/ChartTooltip.d.ts +20 -26
- package/dist/charts/ChartTooltip.js +77 -40
- package/dist/charts/Heatmap.d.ts +35 -0
- package/dist/charts/Heatmap.js +295 -0
- package/dist/charts/LineChart.d.ts +54 -47
- package/dist/charts/LineChart.js +159 -117
- package/dist/charts/PieChart.d.ts +32 -53
- package/dist/charts/PieChart.js +149 -135
- package/dist/charts/Sparkline.d.ts +107 -0
- package/dist/charts/Sparkline.js +244 -0
- package/dist/charts/StatChart.d.ts +37 -13
- package/dist/charts/StatChart.js +82 -35
- package/dist/charts/barChartGeometry.d.ts +138 -86
- package/dist/charts/barChartGeometry.js +122 -101
- package/dist/charts/barChartLegend.d.ts +14 -18
- package/dist/charts/barChartLegend.js +18 -13
- package/dist/charts/chartFormat.d.ts +12 -18
- package/dist/charts/chartFormat.js +20 -52
- package/dist/charts/chartPalette.d.ts +33 -0
- package/dist/charts/chartPalette.js +68 -0
- package/dist/charts/chartScales.d.ts +41 -108
- package/dist/charts/chartScales.js +62 -128
- package/dist/charts/constants.d.ts +96 -256
- package/dist/charts/constants.js +105 -275
- package/dist/charts/heatmapGeometry.d.ts +95 -0
- package/dist/charts/heatmapGeometry.js +155 -0
- package/dist/charts/lineChartGeometry.d.ts +108 -58
- package/dist/charts/lineChartGeometry.js +120 -78
- package/dist/charts/pieChartGeometry.d.ts +66 -40
- package/dist/charts/pieChartGeometry.js +68 -38
- package/dist/charts/types.d.ts +197 -466
- package/dist/charts/types.js +55 -144
- package/dist/charts/useCartesianChartLayout.d.ts +28 -59
- package/dist/charts/useCartesianChartLayout.js +47 -32
- package/dist/charts/useChartDimensions.d.ts +19 -40
- package/dist/charts/useChartDimensions.js +40 -56
- package/dist/charts/useChartFormatters.d.ts +6 -15
- package/dist/charts/useChartFormatters.js +4 -9
- package/dist/charts/useChartInteraction.d.ts +47 -116
- package/dist/charts/useChartInteraction.js +95 -71
- package/dist/charts/useChartTooltipPosition.d.ts +29 -39
- package/dist/charts/useChartTooltipPosition.js +14 -5
- package/dist/charts/useSeriesColorResolver.d.ts +11 -33
- package/dist/charts/useSeriesColorResolver.js +19 -12
- package/dist/chips/Chip.d.ts +155 -44
- package/dist/chips/Chip.js +329 -155
- package/dist/chips/ChipGroup.d.ts +53 -0
- package/dist/chips/ChipGroup.js +98 -0
- package/dist/drawer/Drawer.d.ts +81 -17
- package/dist/drawer/Drawer.js +370 -65
- package/dist/dropdown/Dropdown.d.ts +80 -63
- package/dist/dropdown/Dropdown.js +127 -129
- package/dist/editor/CodeEditor.d.ts +119 -40
- package/dist/editor/CodeEditor.js +490 -400
- package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
- package/dist/editor/CodeEditorReactWidget.js +28 -21
- package/dist/feedback/Alert.d.ts +49 -0
- package/dist/feedback/Alert.js +172 -0
- package/dist/feedback/EmptyState.d.ts +39 -0
- package/dist/feedback/EmptyState.js +109 -0
- package/dist/feedback/ProgressBar.d.ts +125 -0
- package/dist/feedback/ProgressBar.js +183 -0
- package/dist/feedback/ProgressCircle.d.ts +99 -0
- package/dist/feedback/ProgressCircle.js +187 -0
- package/dist/feedback/Skeleton.d.ts +69 -0
- package/dist/feedback/Skeleton.js +130 -0
- package/dist/feedback/Spinner.d.ts +63 -0
- package/dist/feedback/Spinner.js +141 -0
- package/dist/fonts.css +70 -0
- package/dist/hooks/internal/useIsClient.d.ts +2 -0
- package/dist/hooks/internal/useIsClient.js +14 -0
- package/dist/hooks/useClipboard.d.ts +19 -0
- package/dist/hooks/useClipboard.js +45 -0
- package/dist/hooks/useControlledOpenState.d.ts +21 -0
- package/dist/hooks/useControlledOpenState.js +19 -0
- package/dist/hooks/useControlledState.d.ts +19 -0
- package/dist/hooks/useControlledState.js +22 -0
- package/dist/hooks/useDebouncedValue.d.ts +14 -0
- package/dist/hooks/useDebouncedValue.js +33 -0
- package/dist/hooks/useDisclosure.d.ts +26 -0
- package/dist/hooks/useDisclosure.js +36 -0
- package/dist/hooks/useDismiss.d.ts +23 -27
- package/dist/hooks/useDismiss.js +39 -27
- package/dist/hooks/useElementClientSize.d.ts +10 -10
- package/dist/hooks/useElementClientSize.js +8 -11
- package/dist/hooks/useElementWidth.d.ts +6 -13
- package/dist/hooks/useElementWidth.js +6 -14
- package/dist/hooks/useField.d.ts +47 -0
- package/dist/hooks/useField.js +40 -0
- package/dist/hooks/useHotkey.d.ts +77 -0
- package/dist/hooks/useHotkey.js +246 -0
- package/dist/hooks/useIsMac.d.ts +12 -0
- package/dist/hooks/useIsMac.js +27 -0
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
- package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
- package/dist/hooks/useLocalStorage.d.ts +28 -0
- package/dist/hooks/useLocalStorage.js +145 -0
- package/dist/hooks/useMediaQuery.d.ts +11 -0
- package/dist/hooks/useMediaQuery.js +23 -0
- package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
- package/dist/hooks/usePrefersReducedMotion.js +25 -0
- package/dist/hooks/useResize.d.ts +42 -62
- package/dist/hooks/useResize.js +43 -31
- package/dist/icons/Icon.d.ts +64 -37
- package/dist/icons/Icon.js +96 -37
- package/dist/icons/internal/IconSlot.d.ts +10 -0
- package/dist/icons/internal/IconSlot.js +32 -0
- package/dist/inputs/CheckboxGroup.d.ts +115 -0
- package/dist/inputs/CheckboxGroup.js +183 -0
- package/dist/inputs/CheckboxInput.d.ts +98 -28
- package/dist/inputs/CheckboxInput.js +218 -88
- package/dist/inputs/ColorInput.d.ts +115 -29
- package/dist/inputs/ColorInput.js +748 -326
- package/dist/inputs/CopyInput.d.ts +49 -20
- package/dist/inputs/CopyInput.js +57 -49
- package/dist/inputs/CronInput.d.ts +94 -0
- package/dist/inputs/CronInput.js +618 -0
- package/dist/inputs/DateInput.d.ts +175 -28
- package/dist/inputs/DateInput.js +1109 -451
- package/dist/inputs/DurationInput.d.ts +101 -0
- package/dist/inputs/DurationInput.js +441 -0
- package/dist/inputs/Field.d.ts +75 -0
- package/dist/inputs/Field.js +247 -0
- package/dist/inputs/Fieldset.d.ts +53 -0
- package/dist/inputs/Fieldset.js +149 -0
- package/dist/inputs/FileInput.d.ts +110 -0
- package/dist/inputs/FileInput.js +476 -0
- package/dist/inputs/Input.d.ts +148 -187
- package/dist/inputs/Input.js +339 -259
- package/dist/inputs/KeyValueInput.d.ts +120 -0
- package/dist/inputs/KeyValueInput.js +383 -0
- package/dist/inputs/MultiSelectInput.d.ts +165 -54
- package/dist/inputs/MultiSelectInput.js +175 -559
- package/dist/inputs/NumberInput.d.ts +65 -9
- package/dist/inputs/NumberInput.js +197 -40
- package/dist/inputs/PasswordInput.d.ts +17 -12
- package/dist/inputs/PasswordInput.js +33 -33
- package/dist/inputs/PinInput.d.ts +117 -0
- package/dist/inputs/PinInput.js +364 -0
- package/dist/inputs/RadioGroup.d.ts +115 -0
- package/dist/inputs/RadioGroup.js +179 -0
- package/dist/inputs/RadioInput.d.ts +87 -24
- package/dist/inputs/RadioInput.js +182 -95
- package/dist/inputs/SearchInput.d.ts +66 -0
- package/dist/inputs/SearchInput.js +156 -0
- package/dist/inputs/SelectInput.d.ts +195 -55
- package/dist/inputs/SelectInput.js +1308 -446
- package/dist/inputs/SliderInput.d.ts +150 -30
- package/dist/inputs/SliderInput.js +441 -186
- package/dist/inputs/SwitchInput.d.ts +109 -0
- package/dist/inputs/SwitchInput.js +248 -0
- package/dist/inputs/TagInput.d.ts +117 -0
- package/dist/inputs/TagInput.js +408 -0
- package/dist/inputs/TextAreaInput.d.ts +146 -44
- package/dist/inputs/TextAreaInput.js +292 -198
- package/dist/inputs/TextInput.d.ts +4 -13
- package/dist/inputs/TextInput.js +13 -48
- package/dist/inputs/ToggleInput.d.ts +120 -22
- package/dist/inputs/ToggleInput.js +262 -116
- package/dist/inputs/internal/bareField.d.ts +18 -0
- package/dist/inputs/internal/bareField.js +38 -0
- package/dist/inputs/internal/devWarn.d.ts +7 -0
- package/dist/inputs/internal/devWarn.js +30 -0
- package/dist/inputs/internal/fieldFrame.d.ts +34 -0
- package/dist/inputs/internal/fieldFrame.js +64 -0
- package/dist/inputs/internal/fieldWiring.d.ts +50 -0
- package/dist/inputs/internal/fieldWiring.js +38 -0
- package/dist/inputs/internal/innerButton.d.ts +2 -0
- package/dist/inputs/internal/innerButton.js +24 -0
- package/dist/inputs/internal/ownField.d.ts +45 -0
- package/dist/inputs/internal/ownField.js +58 -0
- package/dist/inputs/internal/predicates.d.ts +9 -0
- package/dist/inputs/internal/predicates.js +11 -0
- package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
- package/dist/inputs/internal/useComboboxPopover.js +92 -0
- package/dist/json/JsonViewer.d.ts +62 -0
- package/dist/json/JsonViewer.js +483 -0
- package/dist/layout/Box.d.ts +87 -0
- package/dist/layout/Box.js +109 -0
- package/dist/layout/Divider.d.ts +25 -0
- package/dist/layout/Divider.js +70 -0
- package/dist/layout/Flex.d.ts +139 -0
- package/dist/layout/Flex.js +165 -0
- package/dist/layout/FlexItem.d.ts +72 -0
- package/dist/layout/FlexItem.js +84 -0
- package/dist/layout/Grid.d.ts +140 -0
- package/dist/layout/Grid.js +178 -0
- package/dist/layout/Portal.d.ts +29 -0
- package/dist/layout/Portal.js +27 -0
- package/dist/layout/ResizablePanels.d.ts +88 -0
- package/dist/layout/ResizablePanels.js +198 -0
- package/dist/layout/ResizeHandle.d.ts +48 -0
- package/dist/layout/ResizeHandle.js +143 -0
- package/dist/layout/ScrollArea.d.ts +30 -0
- package/dist/layout/ScrollArea.js +138 -0
- package/dist/links/Link.d.ts +101 -1
- package/dist/links/Link.js +166 -4
- package/dist/lists/BulletedList.d.ts +25 -7
- package/dist/lists/BulletedList.js +72 -27
- package/dist/lists/DescriptionList.d.ts +91 -0
- package/dist/lists/DescriptionList.js +147 -0
- package/dist/menu/ContextMenu.d.ts +64 -0
- package/dist/menu/ContextMenu.js +34 -0
- package/dist/menu/Menu.d.ts +280 -0
- package/dist/menu/Menu.js +1003 -0
- package/dist/modal/ConfirmDialog.d.ts +55 -0
- package/dist/modal/ConfirmDialog.js +151 -0
- package/dist/modal/Modal.d.ts +64 -14
- package/dist/modal/Modal.js +189 -48
- package/dist/navigation/Breadcrumbs.d.ts +65 -0
- package/dist/navigation/Breadcrumbs.js +243 -0
- package/dist/navigation/CommandPalette.d.ts +83 -0
- package/dist/navigation/CommandPalette.js +509 -0
- package/dist/navigation/Pagination.d.ts +87 -0
- package/dist/navigation/Pagination.js +300 -0
- package/dist/navigation/SidebarNav.d.ts +107 -0
- package/dist/navigation/SidebarNav.js +341 -0
- package/dist/navigation/Stepper.d.ts +52 -0
- package/dist/navigation/Stepper.js +207 -0
- package/dist/navigation/Tabs.d.ts +113 -0
- package/dist/navigation/Tabs.js +543 -0
- package/dist/navigation/Topbar.d.ts +20 -0
- package/dist/navigation/Topbar.js +62 -0
- package/dist/overlay/OverlayProvider.d.ts +28 -32
- package/dist/overlay/OverlayProvider.js +42 -93
- package/dist/overlay/useOverlay.d.ts +88 -12
- package/dist/overlay/useOverlay.js +220 -43
- package/dist/overlays/Popover.d.ts +114 -0
- package/dist/overlays/Popover.js +389 -0
- package/dist/shapes/Circle.d.ts +84 -8
- package/dist/shapes/Circle.js +122 -20
- package/dist/shapes/Square.d.ts +84 -8
- package/dist/shapes/Square.js +123 -20
- package/dist/styles/mixins.d.ts +35 -0
- package/dist/styles/mixins.js +60 -0
- package/dist/styles.css +1 -202
- package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
- package/dist/table/InfiniteSpreadsheet.js +762 -225
- package/dist/table/InfiniteTable.d.ts +116 -14
- package/dist/table/InfiniteTable.js +287 -429
- package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
- package/dist/table/SpreadsheetCellEditor.js +163 -84
- package/dist/table/TableCore.d.ts +252 -0
- package/dist/table/TableCore.js +1077 -0
- package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
- package/dist/table/VirtualizedInfiniteTable.js +280 -219
- package/dist/table/types.d.ts +66 -244
- package/dist/table/types.js +0 -51
- package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
- package/dist/table/useInfiniteScrollSentinel.js +38 -30
- package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
- package/dist/table/useSpreadsheetCellNavigation.js +141 -0
- package/dist/table/useTableColumnLayout.d.ts +90 -25
- package/dist/table/useTableColumnLayout.js +255 -50
- package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
- package/dist/table/useTableKeyboardNavigation.js +95 -71
- package/dist/table/useTableRowSelection.d.ts +24 -25
- package/dist/table/useTableRowSelection.js +57 -84
- package/dist/table/useTableVirtualizer.d.ts +20 -0
- package/dist/table/useTableVirtualizer.js +48 -0
- package/dist/text/Bold.d.ts +5 -6
- package/dist/text/Bold.js +16 -15
- package/dist/text/Code.d.ts +5 -6
- package/dist/text/Code.js +16 -25
- package/dist/text/CodeBlock.d.ts +77 -0
- package/dist/text/CodeBlock.js +373 -0
- package/dist/text/EditableText.d.ts +55 -15
- package/dist/text/EditableText.js +153 -135
- package/dist/text/Ellipsis.d.ts +34 -8
- package/dist/text/Ellipsis.js +55 -23
- package/dist/text/Kbd.d.ts +72 -0
- package/dist/text/Kbd.js +284 -0
- package/dist/text/MarkdownText.d.ts +27 -10
- package/dist/text/MarkdownText.js +317 -300
- package/dist/text/RequiredMarker.d.ts +17 -5
- package/dist/text/RequiredMarker.js +34 -36
- package/dist/text/Selectable.d.ts +5 -6
- package/dist/text/Selectable.js +16 -13
- package/dist/text/Span.d.ts +82 -0
- package/dist/text/Span.js +115 -0
- package/dist/text/Text.d.ts +128 -41
- package/dist/text/Text.js +209 -76
- package/dist/theme/GalaxyProvider.d.ts +75 -0
- package/dist/theme/GalaxyProvider.js +223 -0
- package/dist/theme/ThemeSwitcher.d.ts +52 -0
- package/dist/theme/ThemeSwitcher.js +94 -0
- package/dist/theme/enums.d.ts +118 -0
- package/dist/theme/enums.js +144 -0
- package/dist/theme/tokens/dark.d.ts +2 -0
- package/dist/theme/tokens/dark.js +275 -0
- package/dist/theme/tokens/generate.d.ts +15 -0
- package/dist/theme/tokens/generate.js +47 -0
- package/dist/theme/tokens/light.d.ts +2 -0
- package/dist/theme/tokens/light.js +274 -0
- package/dist/theme/tokens/palette.d.ts +14 -0
- package/dist/theme/tokens/palette.js +153 -0
- package/dist/theme/tokens/scales.d.ts +26 -0
- package/dist/theme/tokens/scales.js +154 -0
- package/dist/theme/tokens/t.d.ts +3 -0
- package/dist/theme/tokens/t.js +25 -0
- package/dist/theme/tokens/types.d.ts +189 -0
- package/dist/theme/tokens/types.js +0 -0
- package/dist/theme/useGalaxyTheme.d.ts +46 -0
- package/dist/theme/useGalaxyTheme.js +36 -0
- package/dist/theme/useInverseScope.d.ts +18 -0
- package/dist/theme/useInverseScope.js +33 -0
- package/dist/three/GalaxyLogomark3D.d.ts +46 -0
- package/dist/three/GalaxyLogomark3D.js +134 -0
- package/dist/three/assets/galaxy-logomark.js +4 -0
- package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
- package/dist/three/galaxyLogomark3DScene.js +165 -0
- package/dist/timeline/Timeline.d.ts +99 -0
- package/dist/timeline/Timeline.js +269 -0
- package/dist/toast/Toast.d.ts +43 -19
- package/dist/toast/Toast.js +130 -89
- package/dist/toast/ToastProvider.d.ts +23 -23
- package/dist/toast/ToastProvider.js +298 -101
- package/dist/toast/ToastViewport.d.ts +12 -0
- package/dist/toast/ToastViewport.js +210 -0
- package/dist/toast/useToast.d.ts +139 -5
- package/dist/toast/useToast.js +15 -13
- package/dist/tokens.css +654 -0
- package/dist/tooltip/Tooltip.d.ts +64 -44
- package/dist/tooltip/Tooltip.js +280 -73
- package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
- package/dist/tooltip/internal/LazyTooltip.js +53 -0
- package/dist/transform/Fade.d.ts +33 -11
- package/dist/transform/Fade.js +71 -19
- package/dist/transform/Flasher.d.ts +25 -0
- package/dist/transform/Flasher.js +39 -0
- package/dist/transform/Rotate.d.ts +24 -12
- package/dist/transform/Rotate.js +36 -22
- package/dist/transform/ScaleFade.d.ts +36 -11
- package/dist/transform/ScaleFade.js +86 -28
- package/dist/transform/internal/CollapseMotion.d.ts +10 -0
- package/dist/transform/internal/CollapseMotion.js +65 -0
- package/dist/tree/Tree.d.ts +85 -0
- package/dist/tree/Tree.js +387 -0
- package/dist/tree/treeRow.d.ts +39 -0
- package/dist/tree/treeRow.js +75 -0
- package/dist/utils/colors.d.ts +46 -13
- package/dist/utils/colors.js +92 -34
- package/dist/utils/css.d.ts +23 -0
- package/dist/utils/css.js +30 -0
- package/dist/utils/format.d.ts +58 -0
- package/dist/utils/format.js +220 -0
- package/dist/vite/index.d.ts +16 -0
- package/dist/vite/index.js +52 -0
- package/dist/widget/Widget.d.ts +164 -48
- package/dist/widget/Widget.js +335 -96
- package/dist/widget/WidgetGroup.d.ts +36 -0
- package/dist/widget/WidgetGroup.js +103 -0
- package/package.json +851 -157
- package/dist/accordion/Accordion.d.ts +0 -54
- package/dist/accordion/Accordion.js +0 -183
- package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
- package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
- package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
- package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
- package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
- package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
- package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
- package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
- package/dist/assets/models/galaxy-animation.js +0 -136666
- package/dist/assets/models/galaxy-logomark.js +0 -4
- package/dist/avatar/AvatarShimmer.d.ts +0 -30
- package/dist/avatar/AvatarShimmer.js +0 -22
- package/dist/backgrounds/CellGridBackground.d.ts +0 -24
- package/dist/backgrounds/CellGridBackground.js +0 -44
- package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
- package/dist/backgrounds/CrossGridBackground.js +0 -49
- package/dist/backgrounds/DotGridBackground.d.ts +0 -24
- package/dist/backgrounds/DotGridBackground.js +0 -47
- package/dist/badge/Badge.d.ts +0 -42
- package/dist/badge/Badge.js +0 -99
- package/dist/charts/ChartEmptyState.d.ts +0 -17
- package/dist/charts/ChartEmptyState.js +0 -29
- package/dist/charts/ProgressBar.d.ts +0 -29
- package/dist/charts/ProgressBar.js +0 -65
- package/dist/charts/chartTheme.d.ts +0 -18
- package/dist/charts/chartTheme.js +0 -26
- package/dist/containers/FlexItem.d.ts +0 -50
- package/dist/containers/FlexItem.js +0 -91
- package/dist/containers/FlexWrapper.d.ts +0 -96
- package/dist/containers/FlexWrapper.js +0 -143
- package/dist/containers/GridWrapper.d.ts +0 -79
- package/dist/containers/GridWrapper.js +0 -125
- package/dist/containers/Spacing.d.ts +0 -23
- package/dist/containers/Spacing.js +0 -59
- package/dist/containers/Wrapper.d.ts +0 -26
- package/dist/containers/Wrapper.js +0 -54
- package/dist/dividers/HorizontalDivider.d.ts +0 -7
- package/dist/dividers/HorizontalDivider.js +0 -39
- package/dist/dividers/VerticalDivider.d.ts +0 -6
- package/dist/dividers/VerticalDivider.js +0 -21
- package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
- package/dist/icons/GalaxyFilamentWordmark.js +0 -25
- package/dist/icons/GalaxyLogomark.d.ts +0 -13
- package/dist/icons/GalaxyLogomark.js +0 -27
- package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
- package/dist/icons/GalaxyLogomark3D.js +0 -319
- package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
- package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
- package/dist/icons/GalaxyWordmark.d.ts +0 -11
- package/dist/icons/GalaxyWordmark.js +0 -25
- package/dist/inputs/MultiTextInput.d.ts +0 -32
- package/dist/inputs/MultiTextInput.js +0 -180
- package/dist/inputs/SwitcherInput.d.ts +0 -27
- package/dist/inputs/SwitcherInput.js +0 -64
- package/dist/inputs/hooks.d.ts +0 -10
- package/dist/inputs/hooks.js +0 -22
- package/dist/overlay/constants.d.ts +0 -28
- package/dist/overlay/constants.js +0 -37
- package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
- package/dist/resizable/HorizontalResizeHandle.js +0 -38
- package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
- package/dist/resizable/VerticalResizeHandle.js +0 -39
- package/dist/table/SpreadsheetCell.d.ts +0 -21
- package/dist/table/SpreadsheetCell.js +0 -71
- package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
- package/dist/table/SpreadsheetHeaderCell.js +0 -91
- package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
- package/dist/table/SpreadsheetMenuItem.js +0 -33
- package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
- package/dist/table/SpreadsheetPrimitives.js +0 -105
- package/dist/table/SpreadsheetRow.d.ts +0 -33
- package/dist/table/SpreadsheetRow.js +0 -73
- package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
- package/dist/table/SpreadsheetRowActionCell.js +0 -51
- package/dist/table/TableExpandCell.d.ts +0 -11
- package/dist/table/TableExpandCell.js +0 -24
- package/dist/table/TableExpandedRow.d.ts +0 -16
- package/dist/table/TableExpandedRow.js +0 -77
- package/dist/table/TableHeaderCellContent.d.ts +0 -30
- package/dist/table/TableHeaderCellContent.js +0 -48
- package/dist/table/TablePrimitives.d.ts +0 -313
- package/dist/table/TablePrimitives.js +0 -302
- package/dist/table/TableSelectCell.d.ts +0 -18
- package/dist/table/TableSelectCell.js +0 -27
- package/dist/table/TableStatusRow.d.ts +0 -18
- package/dist/table/TableStatusRow.js +0 -50
- package/dist/table/useSpreadsheetEditing.d.ts +0 -13
- package/dist/table/useSpreadsheetEditing.js +0 -41
- package/dist/table/useTableColumnResize.d.ts +0 -38
- package/dist/table/useTableColumnResize.js +0 -155
- package/dist/table/useTableRowExpansion.d.ts +0 -24
- package/dist/table/useTableRowExpansion.js +0 -62
- package/dist/table/utils.d.ts +0 -50
- package/dist/table/utils.js +0 -78
- package/dist/text/HotKeys.d.ts +0 -30
- package/dist/text/HotKeys.js +0 -74
- package/dist/text/Paragraph.d.ts +0 -33
- package/dist/text/Paragraph.js +0 -83
- package/dist/text/TextShimmer.d.ts +0 -14
- package/dist/text/TextShimmer.js +0 -34
- package/dist/theme/GalaxyTheme.d.ts +0 -67
- package/dist/theme/GalaxyTheme.js +0 -119
- package/dist/theme/constants.d.ts +0 -8
- package/dist/theme/constants.js +0 -38
- package/dist/theme/index.d.ts +0 -6
- package/dist/theme/index.js +0 -7
- package/dist/theme/types.d.ts +0 -195
- package/dist/theme/types.js +0 -10
- package/dist/theme/typography.d.ts +0 -2
- package/dist/theme/typography.js +0 -73
- package/dist/theme/variants/dark.d.ts +0 -2
- package/dist/theme/variants/dark.js +0 -125
- package/dist/theme/variants/light.d.ts +0 -2
- package/dist/theme/variants/light.js +0 -125
- package/dist/toast/ToastContainer.d.ts +0 -10
- package/dist/toast/ToastContainer.js +0 -31
- package/dist/toast/ToastWrapper.d.ts +0 -6
- package/dist/toast/ToastWrapper.js +0 -27
- package/dist/transform/Flash.d.ts +0 -7
- package/dist/transform/Flash.js +0 -18
- package/dist/transform/Spin.d.ts +0 -14
- package/dist/transform/Spin.js +0 -25
- package/dist/utils/linaria.d.ts +0 -1
- package/dist/utils/linaria.js +0 -8
|
@@ -1,126 +1,178 @@
|
|
|
1
|
-
import { buildValueScale } from "./chartScales";
|
|
2
|
-
import { BarChartNormalization, BarCorners } from "./types";
|
|
3
|
-
import type { BarChartGroupDatum, ChartPalette } from "./types";
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
2
|
+
* @internal Bar chart geometry (BarChart; `layoutBars` is reused by Sparkline). Flattens the
|
|
3
|
+
* group → bar → component hierarchy into a flat array of rectangles plus one hit band per group,
|
|
4
|
+
* so the component body is a `.map()` with no nested loops or running accumulators.
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Pure: no React, no theme access. Colors arrive through a resolver callback so this module never
|
|
7
|
+
* has to know how the palette maps to tokens. Values equal to a scale step come from `SPACE` /
|
|
8
|
+
* `RADIUS` (through `constants.ts`); widths, ratios and thresholds are geometry, not spacing.
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
import type { Hex } from "../theme/tokens/types.js";
|
|
11
|
+
import type { ChartSeriesColor } from "./chartPalette.js";
|
|
12
|
+
import type { ChartPalette } from "./types.js";
|
|
13
|
+
/** @internal Ceiling on one bar's width: past it the width stops carrying information (1.x). */
|
|
14
|
+
export declare const MAX_BAR_WIDTH = 44;
|
|
15
|
+
/** @internal Which pair of a rectangle's corners carries the radius. */
|
|
16
|
+
export declare enum BarCorners {
|
|
17
|
+
/** Cap for a bar growing up from the baseline. */
|
|
18
|
+
TOP = "TOP",
|
|
19
|
+
/** Cap for a bar growing down from the baseline. */
|
|
20
|
+
BOTTOM = "BOTTOM",
|
|
21
|
+
/** Interior stack segment: square on both ends. */
|
|
22
|
+
NONE = "NONE"
|
|
23
|
+
}
|
|
24
|
+
/** @internal How bar values are scaled before drawing (BarChart's `BarChartNormalization`, structurally). */
|
|
25
|
+
export type BarGeometryNormalization = "NONE" | "PERCENT";
|
|
26
|
+
/** @internal One stacked segment (BarChart's `BarChartComponentDatum`, structurally). */
|
|
27
|
+
export interface BarGeometryComponent<TComponentKey extends string> {
|
|
28
|
+
/** Segment key. */
|
|
29
|
+
key: TComponentKey;
|
|
30
|
+
/** Segment label. */
|
|
31
|
+
label: string;
|
|
32
|
+
/** Segment value. */
|
|
33
|
+
value: number;
|
|
34
|
+
/** Palette slot override. */
|
|
35
|
+
color?: ChartPalette | undefined;
|
|
36
|
+
/** Raw color override. */
|
|
37
|
+
hex?: Hex | undefined;
|
|
38
|
+
}
|
|
39
|
+
/** @internal One bar (BarChart's `BarChartBarDatum`, structurally). */
|
|
40
|
+
export interface BarGeometryBar<TMetric extends string, TComponentKey extends string> {
|
|
41
|
+
/** Series key. */
|
|
42
|
+
metric: TMetric;
|
|
43
|
+
/** Segments, stacked in array order outward from the baseline. */
|
|
44
|
+
components: BarGeometryComponent<TComponentKey>[];
|
|
45
|
+
}
|
|
46
|
+
/** @internal One category (BarChart's `BarChartGroupDatum`, structurally). */
|
|
47
|
+
export interface BarGeometryGroup<TMetric extends string, TComponentKey extends string> {
|
|
48
|
+
/** Raw category label. */
|
|
49
|
+
label: string;
|
|
50
|
+
/** Bars, left to right. */
|
|
51
|
+
bars: BarGeometryBar<TMetric, TComponentKey>[];
|
|
52
|
+
}
|
|
53
|
+
/** @internal Whole-pixel spacing of one category: every bar the same width, every gap the same. */
|
|
54
|
+
export interface BarSlotLayout {
|
|
55
|
+
/** Px between neighbouring bars in the group. */
|
|
56
|
+
barGap: number;
|
|
57
|
+
/** Px width of each bar (≥ 1). */
|
|
58
|
+
barWidth: number;
|
|
59
|
+
/** Px from the band's left edge to the first bar (centers the group in its band). */
|
|
60
|
+
offset: number;
|
|
61
|
+
}
|
|
11
62
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
63
|
+
* @internal Lays `barCount` bars into a category band `step` px wide. Both gaps are proportional,
|
|
64
|
+
* so a narrow chart keeps its bars instead of its air: the category gap is `CATEGORY_GAP_RATIO` of
|
|
65
|
+
* the band, the in-group gap `BAR_GAP_RATIO` of a bar slot, each rounded and clamped to its floor
|
|
66
|
+
* and ceiling. Bar widths and gaps are whole pixels: bars round to the nearest pixel (unless that
|
|
67
|
+
* would push the category gap under its floor) and the remainder joins the category gap. When even the floors do not fit, the gaps give way before a bar drops below 1px.
|
|
16
68
|
*/
|
|
17
|
-
export declare function
|
|
69
|
+
export declare function layoutBarSlot(step: number, barCount: number): BarSlotLayout;
|
|
18
70
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
|
|
23
|
-
|
|
71
|
+
* @internal `count` bars laid across `width` with `gap` between them, each 80% of its slot (capped
|
|
72
|
+
* at `MAX_BAR_WIDTH`) and centered in it: Sparkline's bar mark, in its stretched `0 0 100 100`
|
|
73
|
+
* viewBox, where pixels are unknown (so no whole-pixel snapping).
|
|
74
|
+
*/
|
|
75
|
+
export declare function layoutBars(count: number, width: number, gap: number): {
|
|
76
|
+
x: number;
|
|
77
|
+
width: number;
|
|
78
|
+
}[];
|
|
79
|
+
/**
|
|
80
|
+
* @internal A rectangle with one pair of corners rounded. The radius is clamped to half the height
|
|
81
|
+
* as well as half the width, so a very short bar renders as a symmetric cap.
|
|
24
82
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
83
|
+
export declare function roundedRectPath(x: number, y: number, width: number, height: number, radius: number, corners: BarCorners): string;
|
|
84
|
+
/** @internal Signed extent of every bar's stacked total; `[0, 1]` when percent-normalized. */
|
|
85
|
+
export declare function getBarValueDomain(groups: BarGeometryGroup<string, string>[], normalization: BarGeometryNormalization): [number, number];
|
|
86
|
+
/** @internal `true` when any bar holds more than one component (the color and legend grammar). */
|
|
87
|
+
export declare function isBarChartStacked(groups: BarGeometryGroup<string, string>[]): boolean;
|
|
88
|
+
/** @internal One rendered rectangle. */
|
|
89
|
+
export interface BarChartRect<TMetric extends string, TComponentKey extends string> {
|
|
90
|
+
/** React key: `${groupIndex}:${barIndex}:${componentKey}` (labels may repeat; indices do not). */
|
|
32
91
|
id: string;
|
|
92
|
+
/** Category index. */
|
|
33
93
|
groupIndex: number;
|
|
94
|
+
/** Bar index within the group. */
|
|
95
|
+
barIndex: number;
|
|
96
|
+
/** The bar's metric. */
|
|
34
97
|
metric: TMetric;
|
|
98
|
+
/** The segment's key. */
|
|
35
99
|
componentKey: TComponentKey;
|
|
36
|
-
/** The
|
|
100
|
+
/** The segment's label. */
|
|
37
101
|
label: string;
|
|
38
102
|
/** The raw value, before any normalization. */
|
|
39
103
|
value: number;
|
|
104
|
+
/** Left edge, plot coordinates. */
|
|
40
105
|
x: number;
|
|
106
|
+
/** Top edge, plot coordinates. */
|
|
41
107
|
y: number;
|
|
108
|
+
/** Width. */
|
|
42
109
|
width: number;
|
|
110
|
+
/** Height. */
|
|
43
111
|
height: number;
|
|
44
|
-
/** Resolved
|
|
45
|
-
color:
|
|
46
|
-
/**
|
|
112
|
+
/** Resolved color. */
|
|
113
|
+
color: ChartSeriesColor;
|
|
114
|
+
/** Which corners are rounded (interior stack segments: none). */
|
|
47
115
|
corners: BarCorners;
|
|
48
|
-
/** Corner radius
|
|
116
|
+
/** Corner radius: smaller for narrow bars. */
|
|
49
117
|
radius: number;
|
|
50
118
|
}
|
|
51
|
-
/**
|
|
52
|
-
* A category's invisible hit target and tooltip anchor.
|
|
53
|
-
*
|
|
54
|
-
* Hit testing happens per group rather than per rectangle: a two-pixel bar is
|
|
55
|
-
* then exactly as hoverable as a two-hundred-pixel one, and moving the pointer
|
|
56
|
-
* between segments inside one group fires nothing, so the tooltip stays put
|
|
57
|
-
* instead of jumping between segment tops.
|
|
58
|
-
*/
|
|
119
|
+
/** @internal A category's hit band and tooltip anchor; bands tile the plot edge to edge. */
|
|
59
120
|
export interface BarChartGroupBand {
|
|
121
|
+
/** Category index. */
|
|
60
122
|
groupIndex: number;
|
|
123
|
+
/** Raw label. */
|
|
61
124
|
label: string;
|
|
62
|
-
/**
|
|
125
|
+
/** Left edge. */
|
|
63
126
|
x: number;
|
|
127
|
+
/** Top edge (0). */
|
|
64
128
|
y: number;
|
|
129
|
+
/** Band width: the category step, snapped to whole pixels. */
|
|
65
130
|
width: number;
|
|
131
|
+
/** Band height (the plot height). */
|
|
66
132
|
height: number;
|
|
67
|
-
/** Group
|
|
133
|
+
/** Group center. */
|
|
68
134
|
anchorX: number;
|
|
135
|
+
/** Top of the group's tallest bar. */
|
|
69
136
|
anchorY: number;
|
|
70
137
|
}
|
|
71
|
-
|
|
138
|
+
/** @internal The finished geometry. */
|
|
139
|
+
export interface BarChartGeometry<TMetric extends string, TComponentKey extends string> {
|
|
72
140
|
/** Every rendered rectangle, in draw order. */
|
|
73
141
|
rects: BarChartRect<TMetric, TComponentKey>[];
|
|
74
|
-
/** One
|
|
142
|
+
/** One band per group. */
|
|
75
143
|
bands: BarChartGroupBand[];
|
|
76
|
-
/**
|
|
77
|
-
valueScale:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
groups: BarChartGroupDatum<TMetric, TComponentKey>[];
|
|
81
|
-
plotWidth: number;
|
|
82
|
-
plotHeight: number;
|
|
83
|
-
normalization: BarChartNormalization;
|
|
84
|
-
/**
|
|
85
|
-
* Whether the chart as a whole is stacked.
|
|
86
|
-
*
|
|
87
|
-
* Chart-wide, not per bar, because it decides the *colour rule* and the legend
|
|
88
|
-
* lists one domain for the whole chart. Deriving it per bar would colour a
|
|
89
|
-
* single-component bar by metric while the legend named components.
|
|
90
|
-
*/
|
|
91
|
-
isStacked: boolean;
|
|
92
|
-
/**
|
|
93
|
-
* The final value domain, already overridden, zeroed and niced.
|
|
94
|
-
*
|
|
95
|
-
* Resolved by the caller rather than here, because the left gutter is sized
|
|
96
|
-
* from the tick labels and therefore needs the domain before the plot — and
|
|
97
|
-
* hence this builder — exists.
|
|
98
|
-
*/
|
|
99
|
-
domain: [number, number];
|
|
100
|
-
/**
|
|
101
|
-
* Maps one segment to a concrete color.
|
|
102
|
-
*
|
|
103
|
-
* The geometry deliberately does not decide the rule — it only reports what
|
|
104
|
-
* it knows about the segment. Whether a stack is coloured by component or a
|
|
105
|
-
* group by metric is a presentation question, and it needs the `series`
|
|
106
|
-
* record to answer, which this module has no business importing.
|
|
107
|
-
*/
|
|
108
|
-
resolveColor: (args: ResolveBarColorArgs<TMetric>) => string;
|
|
109
|
-
/**
|
|
110
|
-
* Minimum rendered length for a stack segment, in px. `0` disables it.
|
|
111
|
-
*
|
|
112
|
-
* See the prop of the same name on `BarChart` for what it costs.
|
|
113
|
-
*/
|
|
114
|
-
minSegmentLength: number;
|
|
144
|
+
/** Value → y, shared with the axis. */
|
|
145
|
+
valueScale: (value: number) => number;
|
|
146
|
+
/** Exact category step (band widths are this, snapped to whole pixels). */
|
|
147
|
+
step: number;
|
|
115
148
|
}
|
|
149
|
+
/** @internal What the color resolver is told about a segment. */
|
|
116
150
|
export interface ResolveBarColorArgs<TMetric extends string> {
|
|
151
|
+
/** The bar's metric. */
|
|
117
152
|
metric: TMetric;
|
|
118
153
|
/** Index of the component within its bar. */
|
|
119
154
|
componentIndex: number;
|
|
120
|
-
/**
|
|
121
|
-
|
|
122
|
-
/** The
|
|
123
|
-
|
|
155
|
+
/** The segment's palette override. */
|
|
156
|
+
explicit?: ChartPalette | undefined;
|
|
157
|
+
/** The segment's raw color override. */
|
|
158
|
+
hex?: Hex | undefined;
|
|
159
|
+
}
|
|
160
|
+
/** @internal Inputs of `buildBarChartGeometry`. */
|
|
161
|
+
export interface BuildBarChartGeometryArgs<TMetric extends string, TComponentKey extends string> {
|
|
162
|
+
/** Categories. */
|
|
163
|
+
groups: BarGeometryGroup<TMetric, TComponentKey>[];
|
|
164
|
+
/** Plot width. */
|
|
165
|
+
plotWidth: number;
|
|
166
|
+
/** Plot height. */
|
|
167
|
+
plotHeight: number;
|
|
168
|
+
/** Raw or percent. */
|
|
169
|
+
normalization: BarGeometryNormalization;
|
|
170
|
+
/** The resolved value domain (overridden, zeroed, niced). */
|
|
171
|
+
domain: [number, number];
|
|
172
|
+
/** Maps one segment to its color (the chart decides the grammar). */
|
|
173
|
+
resolveColor: (args: ResolveBarColorArgs<TMetric>) => ChartSeriesColor;
|
|
174
|
+
/** Minimum rendered length of a stack segment, px; 0 disables. */
|
|
175
|
+
minSegmentLength: number;
|
|
124
176
|
}
|
|
125
|
-
|
|
126
|
-
export {}
|
|
177
|
+
/** @internal Builds a bar chart's rectangles and bands. */
|
|
178
|
+
export declare function buildBarChartGeometry<TMetric extends string, TComponentKey extends string>({ groups, plotWidth, plotHeight, normalization, domain, resolveColor, minSegmentLength, }: BuildBarChartGeometryArgs<TMetric, TComponentKey>): BarChartGeometry<TMetric, TComponentKey>;
|
|
@@ -1,44 +1,76 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { buildValueScale, sanitizeValue } from "./chartScales.js";
|
|
1
|
+
import { BAR_GAP_RATIO, BAR_RADIUS, BAR_RADIUS_NARROW, CATEGORY_GAP_RATIO, MAX_BAR_GAP, MAX_CATEGORY_GAP, MIN_BAR_LENGTH, MIN_CATEGORY_GAP, STACK_SEGMENT_GAP } from "./constants.js";
|
|
2
|
+
import { buildValueScale, clamp, sanitizeValue } from "./chartScales.js";
|
|
4
3
|
//#region src/charts/barChartGeometry.ts
|
|
4
|
+
/** @internal Ceiling on one bar's width: past it the width stops carrying information (1.x). */
|
|
5
|
+
var MAX_BAR_WIDTH = 44;
|
|
6
|
+
/** Share of its slot a Sparkline bar fills; the rest is air (1.x). Sparkline only. */
|
|
7
|
+
var SPARKLINE_BAR_WIDTH_RATIO = .8;
|
|
8
|
+
/** Ceiling on a Sparkline gap, as a share of a slot, so a long series keeps its bars (1.x). */
|
|
9
|
+
var SPARKLINE_MAX_GAP_SHARE = .3;
|
|
10
|
+
/** @internal Which pair of a rectangle's corners carries the radius. */
|
|
11
|
+
var BarCorners = /* @__PURE__ */ function(BarCorners) {
|
|
12
|
+
/** Cap for a bar growing up from the baseline. */
|
|
13
|
+
BarCorners["TOP"] = "TOP";
|
|
14
|
+
/** Cap for a bar growing down from the baseline. */
|
|
15
|
+
BarCorners["BOTTOM"] = "BOTTOM";
|
|
16
|
+
/** Interior stack segment: square on both ends. */
|
|
17
|
+
BarCorners["NONE"] = "NONE";
|
|
18
|
+
return BarCorners;
|
|
19
|
+
}({});
|
|
5
20
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
21
|
+
* @internal Lays `barCount` bars into a category band `step` px wide. Both gaps are proportional,
|
|
22
|
+
* so a narrow chart keeps its bars instead of its air: the category gap is `CATEGORY_GAP_RATIO` of
|
|
23
|
+
* the band, the in-group gap `BAR_GAP_RATIO` of a bar slot, each rounded and clamped to its floor
|
|
24
|
+
* and ceiling. Bar widths and gaps are whole pixels: bars round to the nearest pixel (unless that
|
|
25
|
+
* would push the category gap under its floor) and the remainder joins the category gap. When even the floors do not fit, the gaps give way before a bar drops below 1px.
|
|
10
26
|
*/
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
function layoutBarSlot(step, barCount) {
|
|
28
|
+
const count = Math.max(1, barCount);
|
|
29
|
+
let categoryGap = clamp(Math.round(step * CATEGORY_GAP_RATIO), MIN_CATEGORY_GAP, MAX_CATEGORY_GAP);
|
|
30
|
+
if (step - categoryGap < count) categoryGap = Math.max(0, Math.floor(step - count));
|
|
31
|
+
const available = step - categoryGap;
|
|
32
|
+
let barGap = count > 1 ? clamp(Math.round(available / count * BAR_GAP_RATIO), 1, MAX_BAR_GAP) : 0;
|
|
33
|
+
if (count > 1 && available - (count - 1) * barGap < count) barGap = Math.max(0, Math.floor((available - count) / (count - 1)));
|
|
34
|
+
const exact = (available - (count - 1) * barGap) / count;
|
|
35
|
+
const rounded = Math.round(exact);
|
|
36
|
+
const barWidth = clamp(step - (count * rounded + (count - 1) * barGap) >= Math.min(MIN_CATEGORY_GAP, categoryGap) ? rounded : Math.floor(exact), 1, 44);
|
|
37
|
+
const barsWidth = count * barWidth + (count - 1) * barGap;
|
|
20
38
|
return {
|
|
21
|
-
|
|
22
|
-
|
|
39
|
+
barGap,
|
|
40
|
+
barWidth,
|
|
41
|
+
offset: (step - barsWidth) / 2
|
|
23
42
|
};
|
|
24
43
|
}
|
|
25
44
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
45
|
+
* @internal `count` bars laid across `width` with `gap` between them, each 80% of its slot (capped
|
|
46
|
+
* at `MAX_BAR_WIDTH`) and centered in it: Sparkline's bar mark, in its stretched `0 0 100 100`
|
|
47
|
+
* viewBox, where pixels are unknown (so no whole-pixel snapping).
|
|
48
|
+
*/
|
|
49
|
+
function layoutBars(count, width, gap) {
|
|
50
|
+
if (count <= 0 || width <= 0) return [];
|
|
51
|
+
const effectiveGap = Math.min(gap, width / count * SPARKLINE_MAX_GAP_SHARE);
|
|
52
|
+
const slot = (width - (count - 1) * effectiveGap) / count;
|
|
53
|
+
const barWidth = Math.max(1, Math.min(slot * SPARKLINE_BAR_WIDTH_RATIO, 44));
|
|
54
|
+
return Array.from({ length: count }, (_, index) => ({
|
|
55
|
+
x: index * (slot + effectiveGap) + (slot - barWidth) / 2,
|
|
56
|
+
width: barWidth
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @internal A rectangle with one pair of corners rounded. The radius is clamped to half the height
|
|
61
|
+
* as well as half the width, so a very short bar renders as a symmetric cap.
|
|
30
62
|
*/
|
|
31
63
|
function roundedRectPath(x, y, width, height, radius, corners) {
|
|
32
|
-
const r = corners ===
|
|
64
|
+
const r = corners === "NONE" ? 0 : Math.max(0, Math.min(radius, width / 2, height / 2));
|
|
33
65
|
if (r === 0) return `M${x},${y} h${width} v${height} h${-width} z`;
|
|
34
|
-
if (corners ===
|
|
66
|
+
if (corners === "TOP") return [
|
|
35
67
|
`M${x},${y + r}`,
|
|
36
68
|
`a${r},${r} 0 0 1 ${r},${-r}`,
|
|
37
69
|
`h${width - 2 * r}`,
|
|
38
70
|
`a${r},${r} 0 0 1 ${r},${r}`,
|
|
39
71
|
`v${height - r}`,
|
|
40
72
|
`h${-width}`,
|
|
41
|
-
|
|
73
|
+
"z"
|
|
42
74
|
].join(" ");
|
|
43
75
|
return [
|
|
44
76
|
`M${x},${y}`,
|
|
@@ -47,16 +79,13 @@ function roundedRectPath(x, y, width, height, radius, corners) {
|
|
|
47
79
|
`a${r},${r} 0 0 1 ${-r},${r}`,
|
|
48
80
|
`h${-(width - 2 * r)}`,
|
|
49
81
|
`a${r},${r} 0 0 1 ${-r},${-r}`,
|
|
50
|
-
|
|
82
|
+
"z"
|
|
51
83
|
].join(" ");
|
|
52
84
|
}
|
|
53
85
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* lets a bar mixing both stack upward and downward from the baseline without
|
|
58
|
-
* any special-casing downstream — and is also why percent normalization is a
|
|
59
|
-
* one-line division rather than a second code path.
|
|
86
|
+
* One bar's components as stacked `[from, to]` intervals. Positive and negative values accumulate
|
|
87
|
+
* on separate cursors, so a bar mixing both stacks up and down from the baseline; percent
|
|
88
|
+
* normalization is then one division.
|
|
60
89
|
*/
|
|
61
90
|
function stackComponents(values, normalization) {
|
|
62
91
|
let positiveCursor = 0;
|
|
@@ -79,7 +108,7 @@ function stackComponents(values, normalization) {
|
|
|
79
108
|
to
|
|
80
109
|
};
|
|
81
110
|
});
|
|
82
|
-
if (normalization !==
|
|
111
|
+
if (normalization !== "PERCENT") return intervals;
|
|
83
112
|
const magnitude = positiveCursor - negativeCursor;
|
|
84
113
|
if (magnitude === 0) return intervals;
|
|
85
114
|
return intervals.map((interval) => ({
|
|
@@ -88,14 +117,9 @@ function stackComponents(values, normalization) {
|
|
|
88
117
|
to: interval.to / magnitude
|
|
89
118
|
}));
|
|
90
119
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Signed value domain across every group.
|
|
93
|
-
*
|
|
94
|
-
* Percent-normalized charts always span 0–1, so the axis is stable no matter
|
|
95
|
-
* what the underlying totals are.
|
|
96
|
-
*/
|
|
120
|
+
/** @internal Signed extent of every bar's stacked total; `[0, 1]` when percent-normalized. */
|
|
97
121
|
function getBarValueDomain(groups, normalization) {
|
|
98
|
-
if (normalization ===
|
|
122
|
+
if (normalization === "PERCENT") return [0, 1];
|
|
99
123
|
let min = 0;
|
|
100
124
|
let max = 0;
|
|
101
125
|
for (const group of groups) for (const bar of group.bars) {
|
|
@@ -106,59 +130,51 @@ function getBarValueDomain(groups, normalization) {
|
|
|
106
130
|
if (value >= 0) positive += value;
|
|
107
131
|
else negative += value;
|
|
108
132
|
}
|
|
109
|
-
|
|
110
|
-
|
|
133
|
+
max = Math.max(max, positive);
|
|
134
|
+
min = Math.min(min, negative);
|
|
111
135
|
}
|
|
112
136
|
return [min, max];
|
|
113
137
|
}
|
|
138
|
+
/** @internal `true` when any bar holds more than one component (the color and legend grammar). */
|
|
139
|
+
function isBarChartStacked(groups) {
|
|
140
|
+
return groups.some((group) => group.bars.some((bar) => bar.components.length > 1));
|
|
141
|
+
}
|
|
114
142
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* Returns `null` when nothing needs doing, and — deliberately — also when the
|
|
120
|
-
* bill cannot be paid: if the surplus across the whole side is smaller than the
|
|
121
|
-
* total deficit, every segment would end up pinned at its minimum and the bar
|
|
122
|
-
* would no longer be a picture of its data. A stack that crowded is telling the
|
|
123
|
-
* caller to drop the minimum or fold the tail into an "Other" component, and
|
|
124
|
-
* silently redrawing it as a ladder of equal blocks would hide that.
|
|
143
|
+
* Grows every under-sized segment of one stack side to its minimum, paid for by the segments with
|
|
144
|
+
* room to spare, in proportion to their slack. Returns `null` when nothing needs doing, and also
|
|
145
|
+
* when the bill cannot be paid (every segment would be pinned at the minimum and the bar would no
|
|
146
|
+
* longer describe its data).
|
|
125
147
|
*/
|
|
126
148
|
function distributeMinSegmentLengths(lengths, minima) {
|
|
127
149
|
const result = [...lengths];
|
|
128
150
|
let deficit = 0;
|
|
129
151
|
let surplus = 0;
|
|
130
152
|
lengths.forEach((length, index) => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
153
|
+
const minimum = minima[index] ?? 0;
|
|
154
|
+
if (length < minimum) {
|
|
155
|
+
deficit += minimum - length;
|
|
156
|
+
result[index] = minimum;
|
|
157
|
+
} else surplus += length - minimum;
|
|
135
158
|
});
|
|
136
159
|
if (deficit === 0 || surplus < deficit) return null;
|
|
137
160
|
const donors = result.map((length, index) => ({
|
|
138
161
|
index,
|
|
139
|
-
slack: length - minima[index]
|
|
162
|
+
slack: length - (minima[index] ?? 0)
|
|
140
163
|
})).filter((donor) => donor.slack > 0).sort((a, b) => b.slack - a.slack);
|
|
141
164
|
let remainingSlack = surplus;
|
|
142
165
|
for (const donor of donors) {
|
|
143
166
|
if (deficit <= 0) break;
|
|
144
167
|
const share = Math.min(donor.slack, Math.ceil(donor.slack / remainingSlack * deficit));
|
|
145
|
-
result[donor.index]
|
|
168
|
+
result[donor.index] = (result[donor.index] ?? 0) - share;
|
|
146
169
|
remainingSlack -= donor.slack;
|
|
147
170
|
deficit -= share;
|
|
148
171
|
}
|
|
149
172
|
return result;
|
|
150
173
|
}
|
|
151
174
|
/**
|
|
152
|
-
* Snapped pixel spans for one bar's segments
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* The enforcement re-lays the affected side of the stack *cumulatively* from the
|
|
156
|
-
* baseline outward, rather than nudging each segment's own edges. That is the
|
|
157
|
-
* only way to grow a sliver without breaking the invariant the rounding above
|
|
158
|
-
* exists to protect: each segment starts exactly where the previous one ended,
|
|
159
|
-
* so there is still one shared edge per seam and no overlap. And because the
|
|
160
|
-
* redistribution is zero-sum, the side's total extent is unchanged — the cap
|
|
161
|
-
* still lands on the same axis value it did before.
|
|
175
|
+
* Snapped pixel spans for one bar's segments with `minSegmentLength` enforced. Enforcement re-lays
|
|
176
|
+
* the affected side cumulatively from the baseline outward, so each segment still starts where the
|
|
177
|
+
* previous one ended and the side's total extent is unchanged.
|
|
162
178
|
*/
|
|
163
179
|
function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
|
|
164
180
|
const extents = intervals.map(({ from, to }) => ({
|
|
@@ -171,14 +187,19 @@ function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
|
|
|
171
187
|
interval,
|
|
172
188
|
index
|
|
173
189
|
})).filter(({ interval }) => Math.sign(interval.value) === sign).map(({ index }) => index);
|
|
174
|
-
|
|
175
|
-
|
|
190
|
+
const firstIndex = indices[0];
|
|
191
|
+
if (firstIndex === void 0) return;
|
|
192
|
+
const adjusted = distributeMinSegmentLengths(indices.map((index) => {
|
|
193
|
+
const extent = extents[index];
|
|
194
|
+
return extent ? Math.abs(extent.fromY - extent.toY) : 0;
|
|
195
|
+
}), indices.map((_, position) => position === 0 ? minSegmentLength : minSegmentLength + STACK_SEGMENT_GAP));
|
|
176
196
|
if (!adjusted) return;
|
|
177
197
|
const direction = sign > 0 ? -1 : 1;
|
|
178
|
-
const first = extents[
|
|
198
|
+
const first = extents[firstIndex];
|
|
199
|
+
if (!first) return;
|
|
179
200
|
let cursor = sign > 0 ? first.fromY : first.toY;
|
|
180
201
|
indices.forEach((index, position) => {
|
|
181
|
-
const next = cursor + direction * adjusted[position];
|
|
202
|
+
const next = cursor + direction * (adjusted[position] ?? 0);
|
|
182
203
|
extents[index] = {
|
|
183
204
|
fromY: cursor,
|
|
184
205
|
toY: next
|
|
@@ -190,32 +211,29 @@ function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
|
|
|
190
211
|
adjustSide(-1);
|
|
191
212
|
return extents;
|
|
192
213
|
}
|
|
193
|
-
|
|
194
|
-
|
|
214
|
+
/** @internal Builds a bar chart's rectangles and bands. */
|
|
215
|
+
function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, domain, resolveColor, minSegmentLength }) {
|
|
216
|
+
const scale = buildValueScale(domain, [plotHeight, 0]);
|
|
217
|
+
const valueScale = (value) => scale(value);
|
|
195
218
|
const baselineY = valueScale(0);
|
|
196
219
|
const rects = [];
|
|
197
220
|
const bands = [];
|
|
198
221
|
if (groups.length === 0 || plotWidth <= 0 || plotHeight <= 0) return {
|
|
199
222
|
rects,
|
|
200
223
|
bands,
|
|
201
|
-
valueScale
|
|
224
|
+
valueScale,
|
|
225
|
+
step: 0
|
|
202
226
|
};
|
|
203
|
-
const { groupGap, barGap } = getBarSpacing(plotWidth, groups.reduce((sum, group) => sum + group.bars.length, 0));
|
|
204
227
|
const step = plotWidth / groups.length;
|
|
205
|
-
const effectiveGroupGap = Math.min(groupGap, step * MAX_GAP_SHARE);
|
|
206
|
-
const groupWidth = Math.max(1, step - effectiveGroupGap);
|
|
207
228
|
groups.forEach((group, groupIndex) => {
|
|
208
|
-
const bandX = groupIndex * step;
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
const
|
|
212
|
-
const
|
|
213
|
-
const barWidth = Math.max(1, Math.min(slotWidth * BAR_WIDTH_RATIO, 44));
|
|
214
|
-
const radius = barWidth < 40 ? 2 : 4;
|
|
215
|
-
const barsStartX = groupX + (groupWidth - (barCount * barWidth + (barCount - 1) * effectiveBarGap)) / 2;
|
|
229
|
+
const bandX = Math.round(groupIndex * step);
|
|
230
|
+
const bandWidth = Math.round((groupIndex + 1) * step) - bandX;
|
|
231
|
+
const { barGap, barWidth, offset } = layoutBarSlot(step, Math.max(1, group.bars.length));
|
|
232
|
+
const radius = barWidth < 40 ? BAR_RADIUS_NARROW : BAR_RADIUS;
|
|
233
|
+
const barsStartX = Math.round(groupIndex * step + offset);
|
|
216
234
|
let groupTopY = baselineY;
|
|
217
235
|
group.bars.forEach((bar, barIndex) => {
|
|
218
|
-
const barX = barsStartX + barIndex * (barWidth +
|
|
236
|
+
const barX = barsStartX + barIndex * (barWidth + barGap);
|
|
219
237
|
const values = bar.components.map((component) => sanitizeValue(component.value));
|
|
220
238
|
const intervals = stackComponents(values, normalization);
|
|
221
239
|
const isStackedBar = bar.components.length > 1;
|
|
@@ -235,20 +253,22 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
|
|
|
235
253
|
}
|
|
236
254
|
});
|
|
237
255
|
bar.components.forEach((component, componentIndex) => {
|
|
238
|
-
const
|
|
239
|
-
|
|
256
|
+
const interval = intervals[componentIndex];
|
|
257
|
+
const extent = extents[componentIndex];
|
|
258
|
+
if (!interval || !extent || interval.value === 0) return;
|
|
259
|
+
const { value } = interval;
|
|
240
260
|
const isNegative = value < 0;
|
|
241
261
|
const isCap = componentIndex === (isNegative ? lastNegative : lastPositive);
|
|
242
|
-
const
|
|
243
|
-
const
|
|
244
|
-
const
|
|
245
|
-
const
|
|
246
|
-
const height = Math.max(isStackedBar ? 0 : 2, rawHeight - shave);
|
|
262
|
+
const topY = Math.min(extent.fromY, extent.toY);
|
|
263
|
+
const rawHeight = Math.abs(extent.fromY - extent.toY);
|
|
264
|
+
const shave = componentIndex === (isNegative ? firstNegative : firstPositive) ? 0 : STACK_SEGMENT_GAP;
|
|
265
|
+
const height = Math.max(isStackedBar ? 0 : MIN_BAR_LENGTH, rawHeight - shave);
|
|
247
266
|
const y = isNegative ? topY + shave : topY;
|
|
248
267
|
if (!isNegative && y < groupTopY) groupTopY = y;
|
|
249
268
|
rects.push({
|
|
250
269
|
id: `${groupIndex}:${barIndex}:${component.key}`,
|
|
251
270
|
groupIndex,
|
|
271
|
+
barIndex,
|
|
252
272
|
metric: bar.metric,
|
|
253
273
|
componentKey: component.key,
|
|
254
274
|
label: component.label,
|
|
@@ -260,10 +280,10 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
|
|
|
260
280
|
color: resolveColor({
|
|
261
281
|
metric: bar.metric,
|
|
262
282
|
componentIndex,
|
|
263
|
-
|
|
264
|
-
|
|
283
|
+
explicit: component.color,
|
|
284
|
+
hex: component.hex
|
|
265
285
|
}),
|
|
266
|
-
corners: isCap ? isNegative ?
|
|
286
|
+
corners: isCap ? isNegative ? "BOTTOM" : "TOP" : "NONE",
|
|
267
287
|
radius
|
|
268
288
|
});
|
|
269
289
|
});
|
|
@@ -273,17 +293,18 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
|
|
|
273
293
|
label: group.label,
|
|
274
294
|
x: bandX,
|
|
275
295
|
y: 0,
|
|
276
|
-
width:
|
|
296
|
+
width: bandWidth,
|
|
277
297
|
height: plotHeight,
|
|
278
|
-
anchorX:
|
|
298
|
+
anchorX: groupIndex * step + step / 2,
|
|
279
299
|
anchorY: groupTopY
|
|
280
300
|
});
|
|
281
301
|
});
|
|
282
302
|
return {
|
|
283
303
|
rects,
|
|
284
304
|
bands,
|
|
285
|
-
valueScale
|
|
305
|
+
valueScale,
|
|
306
|
+
step
|
|
286
307
|
};
|
|
287
308
|
}
|
|
288
309
|
//#endregion
|
|
289
|
-
export { buildBarChartGeometry, getBarValueDomain, roundedRectPath };
|
|
310
|
+
export { BarCorners, MAX_BAR_WIDTH, buildBarChartGeometry, getBarValueDomain, isBarChartStacked, layoutBarSlot, layoutBars, roundedRectPath };
|