@zendir/ui 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +419 -386
- package/README.md +640 -631
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.js +17 -221
- package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
- package/dist/react/3d/CesiumCaptureSource.js +364 -283
- package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
- package/dist/react/3d/ZenSpace3D.d.ts +2 -3
- package/dist/react/3d/ZenSpace3D.js +1681 -1237
- package/dist/react/3d/ZenSpace3D.js.map +1 -1
- package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DCesium.js +513 -560
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
- package/dist/react/3d/ZenSpace3DShaders.js +61 -66
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
- package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
- package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
- package/dist/react/3d/ZenSpace3DUtils.js +37 -24
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
- package/dist/react/3d/capturePngAnalysis.js +42 -36
- package/dist/react/3d/capturePngAnalysis.js.map +1 -1
- package/dist/react/3d/index.d.ts +3 -3
- package/dist/react/3d/index.js +5 -53
- package/dist/react/3d/threeLoader.d.ts +1 -1
- package/dist/react/3d/threeLoader.js +23 -18
- package/dist/react/3d/threeLoader.js.map +1 -1
- package/dist/react/astro/ClassificationBanner.d.ts +2 -3
- package/dist/react/astro/ClassificationBanner.js +95 -79
- package/dist/react/astro/ClassificationBanner.js.map +1 -1
- package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
- package/dist/react/astro/GlobalStatusBar.js +157 -163
- package/dist/react/astro/GlobalStatusBar.js.map +1 -1
- package/dist/react/astro/MissionClock.d.ts +7 -8
- package/dist/react/astro/MissionClock.js +377 -400
- package/dist/react/astro/MissionClock.js.map +1 -1
- package/dist/react/astro/MonitoringIcon.d.ts +1 -2
- package/dist/react/astro/MonitoringIcon.js +422 -358
- package/dist/react/astro/MonitoringIcon.js.map +1 -1
- package/dist/react/astro/Notification.d.ts +1 -2
- package/dist/react/astro/Notification.js +229 -126
- package/dist/react/astro/Notification.js.map +1 -1
- package/dist/react/astro/Progress.d.ts +0 -1
- package/dist/react/astro/Progress.js +199 -141
- package/dist/react/astro/Progress.js.map +1 -1
- package/dist/react/astro/SimulationControls.d.ts +3 -4
- package/dist/react/astro/SimulationControls.js +596 -650
- package/dist/react/astro/SimulationControls.js.map +1 -1
- package/dist/react/astro/StatusIndicator.d.ts +0 -1
- package/dist/react/astro/StatusIndicator.js +236 -170
- package/dist/react/astro/StatusIndicator.js.map +1 -1
- package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
- package/dist/react/astro/UnifiedTimeline.js +2345 -2392
- package/dist/react/astro/UnifiedTimeline.js.map +1 -1
- package/dist/react/astro/index.d.ts +5 -5
- package/dist/react/astro/index.js +1 -25
- package/dist/react/cards/AccessCard.d.ts +0 -1
- package/dist/react/cards/AccessCard.js +471 -405
- package/dist/react/cards/AccessCard.js.map +1 -1
- package/dist/react/cards/OrbitCard.d.ts +0 -1
- package/dist/react/cards/OrbitCard.js +487 -364
- package/dist/react/cards/OrbitCard.js.map +1 -1
- package/dist/react/cards/SpacecraftCard.d.ts +0 -1
- package/dist/react/cards/SpacecraftCard.js +813 -925
- package/dist/react/cards/SpacecraftCard.js.map +1 -1
- package/dist/react/cards/TelemetryCard.d.ts +0 -1
- package/dist/react/cards/TelemetryCard.js +1055 -732
- package/dist/react/cards/TelemetryCard.js.map +1 -1
- package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
- package/dist/react/cards/TelemetryStreamCard.js +323 -297
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
- package/dist/react/cards/index.d.ts +1 -1
- package/dist/react/cards/index.js +1 -8
- package/dist/react/charts/GroundTrackMap.d.ts +6 -7
- package/dist/react/charts/GroundTrackMap.js +1377 -1256
- package/dist/react/charts/GroundTrackMap.js.map +1 -1
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
- package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
- package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
- package/dist/react/charts/index.d.ts +1 -1
- package/dist/react/charts/index.js +7 -100
- package/dist/react/charts/unified/AstroChart.d.ts +1 -2
- package/dist/react/charts/unified/AstroChart.js +1331 -1411
- package/dist/react/charts/unified/AstroChart.js.map +1 -1
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
- package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
- package/dist/react/charts/unified/domain.d.ts +12 -13
- package/dist/react/charts/unified/domain.js +3999 -3145
- package/dist/react/charts/unified/domain.js.map +1 -1
- package/dist/react/charts/unified/generators.d.ts +3 -4
- package/dist/react/charts/unified/generators.js +561 -498
- package/dist/react/charts/unified/generators.js.map +1 -1
- package/dist/react/charts/unified/index.d.ts +1 -1
- package/dist/react/charts/unified/presets.d.ts +14 -15
- package/dist/react/charts/unified/presets.js +857 -994
- package/dist/react/charts/unified/presets.js.map +1 -1
- package/dist/react/charts/unified/sync.d.ts +2 -3
- package/dist/react/charts/unified/sync.js +229 -195
- package/dist/react/charts/unified/sync.js.map +1 -1
- package/dist/react/charts/unified/theme.d.ts +11 -12
- package/dist/react/charts/unified/theme.js +606 -642
- package/dist/react/charts/unified/theme.js.map +1 -1
- package/dist/react/charts/unified/types.d.ts +32 -33
- package/dist/react/charts/unified/useChartStream.d.ts +1 -2
- package/dist/react/charts/unified/useChartStream.js +203 -216
- package/dist/react/charts/unified/useChartStream.js.map +1 -1
- package/dist/react/chatgpt/AppCard.d.ts +1 -2
- package/dist/react/chatgpt/index.d.ts +7 -7
- package/dist/react/chatgpt/index.js +160 -139
- package/dist/react/chatgpt/index.js.map +1 -1
- package/dist/react/context/CategoryContext.d.ts +0 -1
- package/dist/react/context/CategoryContext.js +78 -29
- package/dist/react/context/CategoryContext.js.map +1 -1
- package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
- package/dist/react/context/DisplaySettingsContext.js +205 -156
- package/dist/react/context/DisplaySettingsContext.js.map +1 -1
- package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
- package/dist/react/context/SpatialSelectionContext.js +36 -7
- package/dist/react/context/SpatialSelectionContext.js.map +1 -1
- package/dist/react/core/data/DataTable.d.ts +3 -4
- package/dist/react/core/data/DataTable.js +473 -440
- package/dist/react/core/data/DataTable.js.map +1 -1
- package/dist/react/core/data/DataValue.d.ts +4 -5
- package/dist/react/core/data/DataValue.js +605 -571
- package/dist/react/core/data/DataValue.js.map +1 -1
- package/dist/react/core/data/propertyConfig.d.ts +1 -2
- package/dist/react/core/data/propertyConfig.js +446 -382
- package/dist/react/core/data/propertyConfig.js.map +1 -1
- package/dist/react/core/display/AstroIcon.d.ts +4 -5
- package/dist/react/core/display/AstroIcon.js +339 -429
- package/dist/react/core/display/AstroIcon.js.map +1 -1
- package/dist/react/core/display/Badge.d.ts +2 -3
- package/dist/react/core/display/Badge.js +131 -131
- package/dist/react/core/display/Badge.js.map +1 -1
- package/dist/react/core/display/CardHeader.d.ts +0 -1
- package/dist/react/core/display/CardHeader.js +398 -311
- package/dist/react/core/display/CardHeader.js.map +1 -1
- package/dist/react/core/display/Container.d.ts +2 -3
- package/dist/react/core/display/Container.js +640 -668
- package/dist/react/core/display/Container.js.map +1 -1
- package/dist/react/core/display/CopyButton.d.ts +1 -2
- package/dist/react/core/display/CopyButton.js +158 -101
- package/dist/react/core/display/CopyButton.js.map +1 -1
- package/dist/react/core/display/GlassCard.d.ts +3 -4
- package/dist/react/core/display/GlassCard.js +416 -369
- package/dist/react/core/display/GlassCard.js.map +1 -1
- package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
- package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
- package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
- package/dist/react/core/display/Icon.d.ts +2 -3
- package/dist/react/core/display/Icon.js +172 -143
- package/dist/react/core/display/Icon.js.map +1 -1
- package/dist/react/core/display/Typography.d.ts +24 -25
- package/dist/react/core/display/Typography.js +360 -178
- package/dist/react/core/display/Typography.js.map +1 -1
- package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
- package/dist/react/core/feedback/ConfirmDialog.js +343 -304
- package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
- package/dist/react/core/feedback/Dialog.d.ts +2 -3
- package/dist/react/core/feedback/Dialog.js +189 -197
- package/dist/react/core/feedback/Dialog.js.map +1 -1
- package/dist/react/core/feedback/Toast.d.ts +2 -3
- package/dist/react/core/feedback/Toast.js +346 -207
- package/dist/react/core/feedback/Toast.js.map +1 -1
- package/dist/react/core/index.d.ts +26 -26
- package/dist/react/core/index.js +7 -119
- package/dist/react/core/inputs/Button.d.ts +2 -3
- package/dist/react/core/inputs/Button.js +281 -304
- package/dist/react/core/inputs/Button.js.map +1 -1
- package/dist/react/core/inputs/Checkbox.d.ts +2 -3
- package/dist/react/core/inputs/Checkbox.js +139 -127
- package/dist/react/core/inputs/Checkbox.js.map +1 -1
- package/dist/react/core/inputs/Input.d.ts +3 -4
- package/dist/react/core/inputs/Input.js +277 -285
- package/dist/react/core/inputs/Input.js.map +1 -1
- package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
- package/dist/react/core/inputs/LimitsBar.js +271 -196
- package/dist/react/core/inputs/LimitsBar.js.map +1 -1
- package/dist/react/core/inputs/NumberInput.d.ts +2 -3
- package/dist/react/core/inputs/NumberInput.js +531 -503
- package/dist/react/core/inputs/NumberInput.js.map +1 -1
- package/dist/react/core/inputs/PinInput.d.ts +2 -3
- package/dist/react/core/inputs/PinInput.js +224 -207
- package/dist/react/core/inputs/PinInput.js.map +1 -1
- package/dist/react/core/inputs/Select.d.ts +1 -2
- package/dist/react/core/inputs/Select.js +298 -299
- package/dist/react/core/inputs/Select.js.map +1 -1
- package/dist/react/core/inputs/Toggle.d.ts +2 -3
- package/dist/react/core/inputs/Toggle.js +142 -148
- package/dist/react/core/inputs/Toggle.js.map +1 -1
- package/dist/react/core/layout/Box.d.ts +3 -4
- package/dist/react/core/layout/Box.js +118 -122
- package/dist/react/core/layout/Box.js.map +1 -1
- package/dist/react/core/layout/Center.d.ts +0 -1
- package/dist/react/core/layout/Center.js +45 -32
- package/dist/react/core/layout/Center.js.map +1 -1
- package/dist/react/core/layout/Divider.d.ts +1 -2
- package/dist/react/core/layout/Divider.js +112 -106
- package/dist/react/core/layout/Divider.js.map +1 -1
- package/dist/react/core/layout/Flex.d.ts +4 -5
- package/dist/react/core/layout/Flex.js +120 -124
- package/dist/react/core/layout/Flex.js.map +1 -1
- package/dist/react/core/layout/Grid.d.ts +5 -6
- package/dist/react/core/layout/Grid.js +131 -138
- package/dist/react/core/layout/Grid.js.map +1 -1
- package/dist/react/core/layout/Spacer.d.ts +0 -1
- package/dist/react/core/layout/Spacer.js +36 -29
- package/dist/react/core/layout/Spacer.js.map +1 -1
- package/dist/react/core/layout/Stack.d.ts +4 -5
- package/dist/react/core/layout/Stack.js +127 -70
- package/dist/react/core/layout/Stack.js.map +1 -1
- package/dist/react/core/layout/responsive.d.ts +1 -2
- package/dist/react/core/layout/responsive.js +25 -19
- package/dist/react/core/layout/responsive.js.map +1 -1
- package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
- package/dist/react/core/layout/useBreakpoint.js +119 -66
- package/dist/react/core/layout/useBreakpoint.js.map +1 -1
- package/dist/react/core/navigation/AppBar.d.ts +1 -2
- package/dist/react/core/navigation/AppBar.js +827 -805
- package/dist/react/core/navigation/AppBar.js.map +1 -1
- package/dist/react/core/navigation/Pagination.d.ts +2 -3
- package/dist/react/core/navigation/Pagination.js +207 -187
- package/dist/react/core/navigation/Pagination.js.map +1 -1
- package/dist/react/core/navigation/SideNav.d.ts +5 -6
- package/dist/react/core/navigation/SideNav.js +855 -629
- package/dist/react/core/navigation/SideNav.js.map +1 -1
- package/dist/react/core/navigation/Tabs.d.ts +0 -1
- package/dist/react/core/navigation/Tabs.js +113 -119
- package/dist/react/core/navigation/Tabs.js.map +1 -1
- package/dist/react/core/overlays/Popover.d.ts +2 -3
- package/dist/react/core/overlays/Popover.js +303 -282
- package/dist/react/core/overlays/Popover.js.map +1 -1
- package/dist/react/core/overlays/SidePanel.d.ts +1 -2
- package/dist/react/core/overlays/SidePanel.js +217 -212
- package/dist/react/core/overlays/SidePanel.js.map +1 -1
- package/dist/react/core/overlays/Tooltip.d.ts +1 -2
- package/dist/react/core/overlays/Tooltip.js +170 -176
- package/dist/react/core/overlays/Tooltip.js.map +1 -1
- package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
- package/dist/react/core/widgets/ActivityPlanner.js +855 -517
- package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
- package/dist/react/core/widgets/Capture.d.ts +2 -3
- package/dist/react/core/widgets/Capture.js +965 -779
- package/dist/react/core/widgets/Capture.js.map +1 -1
- package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
- package/dist/react/core/widgets/ChatPanel.js +1734 -1034
- package/dist/react/core/widgets/ChatPanel.js.map +1 -1
- package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
- package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
- package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
- package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
- package/dist/react/core/widgets/CommandBuilder.js +624 -516
- package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
- package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
- package/dist/react/core/widgets/ConnectionForm.js +528 -492
- package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
- package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
- package/dist/react/core/widgets/FileExplorer.js +617 -505
- package/dist/react/core/widgets/FileExplorer.js.map +1 -1
- package/dist/react/core/widgets/HexViewer.d.ts +2 -3
- package/dist/react/core/widgets/HexViewer.js +1353 -1091
- package/dist/react/core/widgets/HexViewer.js.map +1 -1
- package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
- package/dist/react/core/widgets/ImageFrame.js +230 -193
- package/dist/react/core/widgets/ImageFrame.js.map +1 -1
- package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
- package/dist/react/core/widgets/ImageGallery.js +380 -314
- package/dist/react/core/widgets/ImageGallery.js.map +1 -1
- package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
- package/dist/react/core/widgets/ImagePanel.js +110 -101
- package/dist/react/core/widgets/ImagePanel.js.map +1 -1
- package/dist/react/core/widgets/LogViewer.d.ts +2 -3
- package/dist/react/core/widgets/LogViewer.js +711 -607
- package/dist/react/core/widgets/LogViewer.js.map +1 -1
- package/dist/react/core/widgets/MessageStream.d.ts +3 -4
- package/dist/react/core/widgets/MessageStream.js +514 -444
- package/dist/react/core/widgets/MessageStream.js.map +1 -1
- package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
- package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
- package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
- package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
- package/dist/react/core/widgets/PacketViewer.js +550 -421
- package/dist/react/core/widgets/PacketViewer.js.map +1 -1
- package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
- package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
- package/dist/react/hooks/index.d.ts +5 -5
- package/dist/react/hooks/useAccessWindows.d.ts +0 -1
- package/dist/react/hooks/useCompactMode.d.ts +1 -1
- package/dist/react/hooks/useCompactMode.js +104 -58
- package/dist/react/hooks/useCompactMode.js.map +1 -1
- package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
- package/dist/react/hooks/useSimulationScene.d.ts +1 -2
- package/dist/react/hooks/useSimulationScene.js +481 -374
- package/dist/react/hooks/useSimulationScene.js.map +1 -1
- package/dist/react/index.d.ts +3 -3
- package/dist/react/panels/LayerControlPanel.d.ts +1 -2
- package/dist/react/panels/LayerControlPanel.js +223 -180
- package/dist/react/panels/LayerControlPanel.js.map +1 -1
- package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
- package/dist/react/panels/ObjectInventoryPanel.js +315 -250
- package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
- package/dist/react/panels/index.d.ts +1 -1
- package/dist/react/panels/index.js +1 -6
- package/dist/react/shared/ErrorBoundary.d.ts +1 -2
- package/dist/react/shared/ErrorBoundary.js +170 -139
- package/dist/react/shared/ErrorBoundary.js.map +1 -1
- package/dist/react/shared/Skeleton.d.ts +1 -2
- package/dist/react/shared/Skeleton.js +300 -301
- package/dist/react/shared/Skeleton.js.map +1 -1
- package/dist/react/theme/ThemeProvider.d.ts +2 -321
- package/dist/react/theme/ThemeProvider.js +313 -939
- package/dist/react/theme/ThemeProvider.js.map +1 -1
- package/dist/react/theme/cardAccent.d.ts +1 -2
- package/dist/react/theme/cardAccent.js +196 -126
- package/dist/react/theme/cardAccent.js.map +1 -1
- package/dist/react/theme/config.d.ts +0 -1
- package/dist/react/theme/config.js +47 -25
- package/dist/react/theme/config.js.map +1 -1
- package/dist/react/theme/index.d.ts +2 -2
- package/dist/react/theme/index.js +1 -16
- package/dist/react/theme/types.d.ts +332 -0
- package/dist/react/theme/types.js +39 -0
- package/dist/react/theme/types.js.map +1 -0
- package/dist/react/types.d.ts +8 -8
- package/dist/react/types.js +147 -47
- package/dist/react/types.js.map +1 -1
- package/dist/react/utils/categoryPalette.d.ts +0 -1
- package/dist/react/utils/categoryPalette.js +91 -102
- package/dist/react/utils/categoryPalette.js.map +1 -1
- package/dist/react/utils/index.d.ts +5 -5
- package/dist/react/utils/index.js +457 -371
- package/dist/react/utils/index.js.map +1 -1
- package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
- package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
- package/dist/react/visualizations/NavBallCard.d.ts +0 -1
- package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
- package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
- package/dist/react/visualizations/index.d.ts +3 -3
- package/dist/react.d.ts +2 -1
- package/dist/react.js +17 -221
- package/dist/shaders/atmosphere.frag.js +6 -5
- package/dist/shaders/atmosphere.frag.js.map +1 -1
- package/dist/shaders/atmosphere.vert.js +6 -5
- package/dist/shaders/atmosphere.vert.js.map +1 -1
- package/dist/shaders/stars.frag.js +6 -5
- package/dist/shaders/stars.frag.js.map +1 -1
- package/dist/shaders/stars.vert.js +6 -5
- package/dist/shaders/stars.vert.js.map +1 -1
- package/dist/style.css +26 -3
- package/dist/tokens/core.d.ts +159 -0
- package/dist/tokens/core.js +144 -0
- package/dist/tokens/core.js.map +1 -0
- package/dist/tokens/css-vars.d.ts +213 -2
- package/dist/tokens/css-vars.js +590 -227
- package/dist/tokens/css-vars.js.map +1 -1
- package/dist/tokens/index.d.ts +31 -228
- package/dist/tokens/index.js +281 -366
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/palettes/astro.d.ts +129 -0
- package/dist/tokens/palettes/astro.js +112 -0
- package/dist/tokens/palettes/astro.js.map +1 -0
- package/dist/tokens/palettes/index.d.ts +288 -0
- package/dist/tokens/palettes/index.js +35 -0
- package/dist/tokens/palettes/index.js.map +1 -0
- package/dist/tokens/palettes/tailwind.d.ts +324 -0
- package/dist/tokens/palettes/tailwind.js +201 -0
- package/dist/tokens/palettes/tailwind.js.map +1 -0
- package/dist/tokens/palettes/zendir.d.ts +126 -0
- package/dist/tokens/palettes/zendir.js +92 -0
- package/dist/tokens/palettes/zendir.js.map +1 -0
- package/dist/tokens/themes.d.ts +30 -0
- package/dist/tokens/themes.js +704 -0
- package/dist/tokens/themes.js.map +1 -0
- package/dist/tokens/tokens.css +533 -155
- package/dist/types/index.d.ts +2 -2
- package/package.json +310 -313
- package/dist/index.js.map +0 -1
- package/dist/react/3d/index.js.map +0 -1
- package/dist/react/astro/index.js.map +0 -1
- package/dist/react/cards/index.js.map +0 -1
- package/dist/react/charts/index.js.map +0 -1
- package/dist/react/core/index.js.map +0 -1
- package/dist/react/panels/index.js.map +0 -1
- package/dist/react/theme/astro-tokens.d.ts +0 -153
- package/dist/react/theme/index.js.map +0 -1
- package/dist/react.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorer.js","sources":["../../../../src/react/core/widgets/FileExplorer.tsx"],"sourcesContent":["/**\n * @zendir/ui - FileExplorer Component\n * \n * Hierarchical file browser for mission data management and file operations.\n * Supports tree navigation, file actions (download, delete, upload),\n * search, breadcrumbs, and multiple selection.\n * \n * Features:\n * - Tree view and list view modes\n * - Breadcrumb navigation\n * - File type icons\n * - Search/filter\n * - Multi-select with checkboxes\n * - File actions (open, download, delete, rename)\n * - Upload dropzone\n * - File size and modified date display\n * - Sort by name, size, date\n * \n * @example\n * ```tsx\n * <FileExplorer\n * files={fileTree}\n * onFileOpen={(file) => console.log('Open:', file)}\n * onFileDownload={(file) => console.log('Download:', file)}\n * />\n * ```\n */\n\nimport React, { useState, useCallback, useMemo, memo } from 'react';\nimport { useTheme } from '../../theme';\nimport { AstroIcon, type AstroIconName } from '../display/AstroIcon';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface FileNode {\n /** File/folder name */\n name: string;\n /** Full path */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (for files) */\n size?: number;\n /** Last modified date */\n modified?: string | Date;\n /** MIME type */\n mimeType?: string;\n /** Children (for directories) */\n children?: FileNode[];\n /** Custom icon name */\n icon?: string;\n /** Whether the file is readonly */\n readonly?: boolean;\n}\n\nexport type FileViewMode = 'tree' | 'list';\nexport type FileSortBy = 'name' | 'size' | 'modified';\nexport type FileSortDir = 'asc' | 'desc';\n\nexport interface FileExplorerProps {\n /** Root file tree */\n files: FileNode[];\n /** Height (default: 500) */\n height?: number | string;\n /** Title */\n title?: string;\n /** View mode (default: 'list') */\n viewMode?: FileViewMode;\n /** Show search bar (default: true) */\n showSearch?: boolean;\n /** Show breadcrumbs (default: true) */\n showBreadcrumbs?: boolean;\n /** Show file details (size, date) (default: true) */\n showDetails?: boolean;\n /** Allow multi-select (default: false) */\n multiSelect?: boolean;\n /** Allow upload (default: false) */\n allowUpload?: boolean;\n /** Allow delete (default: false) */\n allowDelete?: boolean;\n /** Called when a file is opened/double-clicked */\n onFileOpen?: (file: FileNode) => void;\n /** Called when download is requested */\n onFileDownload?: (file: FileNode) => void;\n /** Called when delete is requested */\n onFileDelete?: (files: FileNode[]) => void;\n /** Called when files are uploaded */\n onFileUpload?: (files: File[], targetPath: string) => void;\n /** Called when selection changes */\n onSelectionChange?: (files: FileNode[]) => void;\n /** CSS class */\n className?: string;\n /** Show outer container border (default: true). Set false when embedded inside a Container/card. */\n bordered?: boolean;\n /** Custom style overrides for the outer container */\n style?: React.CSSProperties;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction formatFileSize(bytes?: number): string {\n if (bytes === undefined || bytes === null) return '—';\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\n}\n\nfunction formatDate(date?: string | Date): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return String(date);\n return d.toLocaleDateString('en-US', { month: 'short', day: '2-digit', year: 'numeric' }) + ' '\n + d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' });\n}\n\nfunction getFileIconName(file: FileNode): AstroIconName {\n if (file.isDirectory) return 'folder';\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n const iconMap: Record<string, AstroIconName> = {\n rb: 'code', py: 'code', js: 'code', ts: 'code', jsx: 'code', tsx: 'code',\n json: 'insert-drive-file', yaml: 'insert-drive-file', yml: 'insert-drive-file',\n xml: 'insert-drive-file', csv: 'table-chart', txt: 'short-text',\n md: 'description', log: 'insert-drive-file', gz: 'archive', zip: 'archive', tar: 'archive',\n bin: 'storage', dat: 'storage', png: 'image', jpg: 'image', gif: 'image', svg: 'image',\n pdf: 'picture-as-pdf', doc: 'insert-drive-file', xls: 'table-chart', ppt: 'insert-drive-file',\n };\n return iconMap[ext] || 'insert-drive-file';\n}\n\nfunction flattenVisible(\n files: FileNode[],\n expanded: Set<string>,\n depth: number = 0,\n): { file: FileNode; depth: number }[] {\n const result: { file: FileNode; depth: number }[] = [];\n for (const f of files) {\n result.push({ file: f, depth });\n if (f.isDirectory && expanded.has(f.path) && f.children) {\n result.push(...flattenVisible(f.children, expanded, depth + 1));\n }\n }\n return result;\n}\n\nfunction filterFiles(files: FileNode[], query: string): FileNode[] {\n const q = query.toLowerCase();\n return files.reduce<FileNode[]>((acc, f) => {\n if (f.isDirectory && f.children) {\n const filteredChildren = filterFiles(f.children, query);\n if (filteredChildren.length > 0 || f.name.toLowerCase().includes(q)) {\n acc.push({ ...f, children: filteredChildren });\n }\n } else if (f.name.toLowerCase().includes(q)) {\n acc.push(f);\n }\n return acc;\n }, []);\n}\n\nfunction sortFiles(files: FileNode[], sortBy: FileSortBy, sortDir: FileSortDir): FileNode[] {\n const sorted = [...files].sort((a, b) => {\n // Directories first\n if (a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1;\n let cmp = 0;\n if (sortBy === 'name') cmp = a.name.localeCompare(b.name);\n else if (sortBy === 'size') cmp = (a.size ?? 0) - (b.size ?? 0);\n else if (sortBy === 'modified') {\n const da = a.modified ? new Date(a.modified).getTime() : 0;\n const db = b.modified ? new Date(b.modified).getTime() : 0;\n cmp = da - db;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n return sorted.map(f => f.isDirectory && f.children\n ? { ...f, children: sortFiles(f.children, sortBy, sortDir) }\n : f\n );\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const FileExplorer = memo(function FileExplorer({\n files,\n height = 500,\n title,\n viewMode: initialViewMode = 'list',\n showSearch = true,\n showBreadcrumbs = true,\n showDetails = true,\n multiSelect = false,\n allowUpload = false,\n allowDelete = false,\n onFileOpen,\n onFileDownload: _onFileDownload,\n onFileDelete,\n onFileUpload,\n onSelectionChange: _onSelectionChange,\n className = '',\n bordered = true,\n style: styleProp,\n}: FileExplorerProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme =\n theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [currentPath, setCurrentPath] = useState<string[]>([]);\n const [searchQuery, setSearchQuery] = useState('');\n const [sortBy, setSortBy] = useState<FileSortBy>('name');\n const [sortDir, setSortDir] = useState<FileSortDir>('asc');\n const [isDragging, setIsDragging] = useState(false);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(240);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n const processedFiles = useMemo(() => {\n let result = files;\n if (searchQuery.trim()) result = filterFiles(result, searchQuery);\n return sortFiles(result, sortBy, sortDir);\n }, [files, searchQuery, sortBy, sortDir]);\n\n // Navigate to directory by breadcrumb\n const currentFiles = useMemo(() => {\n let current = processedFiles;\n for (const dir of currentPath) {\n const found = current.find(f => f.isDirectory && f.name === dir);\n if (found && found.children) current = found.children;\n else break;\n }\n return current;\n }, [processedFiles, currentPath]);\n\n const visibleItems = useMemo(() => {\n if (initialViewMode === 'tree') return flattenVisible(processedFiles, expanded);\n return currentFiles.map(f => ({ file: f, depth: 0 }));\n }, [processedFiles, expanded, currentFiles, initialViewMode]);\n\n const toggleExpand = useCallback((path: string) => {\n setExpanded(prev => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const toggleSelect = useCallback((path: string) => {\n setSelected(prev => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else {\n if (!multiSelect) next.clear();\n next.add(path);\n }\n return next;\n });\n }, [multiSelect]);\n\n const handleFileClick = useCallback((file: FileNode) => {\n if (file.isDirectory) {\n if (initialViewMode === 'list') {\n setCurrentPath(prev => [...prev, file.name]);\n } else {\n toggleExpand(file.path);\n }\n } else {\n toggleSelect(file.path);\n }\n }, [initialViewMode, toggleExpand, toggleSelect]);\n\n const handleFileDoubleClick = useCallback((file: FileNode) => {\n if (!file.isDirectory) onFileOpen?.(file);\n }, [onFileOpen]);\n\n const navigateTo = useCallback((idx: number) => {\n setCurrentPath(prev => prev.slice(0, idx));\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (!allowUpload || !onFileUpload) return;\n const droppedFiles = Array.from(e.dataTransfer.files);\n if (droppedFiles.length > 0) {\n onFileUpload(droppedFiles, '/' + currentPath.join('/'));\n }\n }, [allowUpload, onFileUpload, currentPath]);\n\n const handleSort = useCallback((col: FileSortBy) => {\n if (sortBy === col) setSortDir(d => d === 'asc' ? 'desc' : 'asc');\n else { setSortBy(col); setSortDir('asc'); }\n }, [sortBy]);\n\n const selectedFiles = useMemo(() =>\n visibleItems.filter(v => selected.has(v.file.path)).map(v => v.file),\n [visibleItems, selected]);\n const rowHeightPx = Number.parseInt(String(tokens.elementSize.sm), 10) || 32;\n const overscanRows = 12;\n const totalRows = visibleItems.length;\n const startRow = Math.max(0, Math.floor(scrollTop / rowHeightPx) - overscanRows);\n const visibleRows = Math.ceil(viewportHeight / rowHeightPx) + overscanRows * 2;\n const endRow = Math.min(totalRows, startRow + visibleRows);\n const virtualVisibleItems = useMemo(\n () => visibleItems.slice(startRow, endRow),\n [visibleItems, startRow, endRow],\n );\n\n React.useEffect(() => {\n const el = listRef.current;\n if (!el) return undefined;\n\n const updateHeight = () => setViewportHeight(Math.max(rowHeightPx * 4, el.clientHeight || 240));\n updateHeight();\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateHeight);\n observer.observe(el);\n return () => observer.disconnect();\n }\n\n window.addEventListener('resize', updateHeight);\n return () => window.removeEventListener('resize', updateHeight);\n }, [rowHeightPx]);\n\n return (\n <div\n className={`file-explorer ${className}`}\n style={{\n height: typeof height === 'number' ? height : undefined,\n background: tokens.colors.background.base,\n ...(bordered ? (tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }) : { border: 'none' }),\n borderRadius: tokens.borderRadius.lg,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n fontFamily: tokens.typography.fontFamily.primary,\n color: tokens.colors.text.primary,\n backdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\n WebkitBackdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\n ...styleProp,\n }}\n >\n {/* Header */}\n <div style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n backdropFilter: 'blur(8px)',\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n }}>\n <span style={{ fontWeight: tokens.typography.fontWeight.medium, fontSize: tokens.typography.fontSize.sm }}>{title || 'File Explorer'}</span>\n <div style={{ display: 'flex', gap: tokens.spacing.sm }}>\n {allowUpload && (\n <button aria-label=\"Upload files\" style={{\n background: tokens.colors.interactive.default,\n color: tokens.colors.text.inverse, border: 'none', borderRadius: tokens.borderRadius.md,\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`, fontSize: tokens.typography.fontSize.xxs, cursor: 'pointer',\n fontWeight: tokens.typography.fontWeight.medium,\n transition: 'opacity 150ms ease',\n }}>\n Upload\n </button>\n )}\n {allowDelete && selectedFiles.length > 0 && (\n <button\n onClick={() => onFileDelete?.(selectedFiles)}\n aria-label={`Delete ${selectedFiles.length} selected files`}\n style={{\n background: `${tokens.colors.status.critical}22`,\n color: tokens.colors.status.critical,\n border: `1px solid ${tokens.colors.status.critical}44`,\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`, fontSize: tokens.typography.fontSize.xxs, cursor: 'pointer',\n fontWeight: tokens.typography.fontWeight.medium,\n transition: 'opacity 150ms ease',\n }}\n >\n Delete ({selectedFiles.length})\n </button>\n )}\n </div>\n </div>\n\n {/* Toolbar: search + breadcrumbs */}\n {(showSearch || showBreadcrumbs) && (\n <div style={{\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n display: 'flex', alignItems: 'center', gap: tokens.spacing.sm,\n background: tokens.colors.background.surface,\n }}>\n {showBreadcrumbs && initialViewMode === 'list' && (\n <nav aria-label=\"File path\" style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, fontSize: tokens.typography.fontSize.xs, flex: 1 }}>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label=\"Navigate to root\"\n onClick={() => navigateTo(0)}\n onKeyDown={e => { if (e.key === 'Enter') navigateTo(0); }}\n style={{ cursor: 'pointer', color: tokens.colors.interactive.default, fontWeight: tokens.typography.fontWeight.medium }}\n >\n /\n </span>\n {currentPath.map((dir, idx) => (\n <React.Fragment key={idx}>\n <span aria-hidden=\"true\" style={{ color: tokens.colors.text.muted }}>/</span>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Navigate to ${dir}`}\n onClick={() => navigateTo(idx + 1)}\n onKeyDown={e => { if (e.key === 'Enter') navigateTo(idx + 1); }}\n style={{\n cursor: 'pointer',\n color: idx === currentPath.length - 1 ? tokens.colors.text.primary : tokens.colors.interactive.default,\n fontWeight: idx === currentPath.length - 1 ? tokens.typography.fontWeight.medium : tokens.typography.fontWeight.normal,\n }}\n >\n {dir}\n </span>\n </React.Fragment>\n ))}\n </nav>\n )}\n {showSearch && (\n <input\n type=\"text\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n placeholder=\"Search files...\"\n aria-label=\"Search files\"\n style={{\n background: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`, fontSize: tokens.typography.fontSize.xs,\n outline: 'none', minWidth: 150,\n transition: 'border-color 150ms ease',\n }}\n />\n )}\n </div>\n )}\n\n {/* Column headers */}\n <div role=\"row\" style={{\n display: 'grid',\n gridTemplateColumns: showDetails ? '1fr auto auto' : '1fr',\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, fontWeight: tokens.typography.fontWeight.medium,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}>\n <span role=\"columnheader\" tabIndex={0} aria-label=\"Sort by name\" onClick={() => handleSort('name')} onKeyDown={e => { if (e.key === 'Enter') handleSort('name'); }} style={{ cursor: 'pointer' }}>\n Name {sortBy === 'name' && (sortDir === 'asc' ? '\\u25B2' : '\\u25BC')}\n </span>\n {showDetails && (\n <>\n <span role=\"columnheader\" tabIndex={0} aria-label=\"Sort by size\" onClick={() => handleSort('size')} onKeyDown={e => { if (e.key === 'Enter') handleSort('size'); }} style={{ cursor: 'pointer', minWidth: 70, textAlign: 'right' }}>\n Size {sortBy === 'size' && (sortDir === 'asc' ? '\\u25B2' : '\\u25BC')}\n </span>\n <span role=\"columnheader\" tabIndex={0} aria-label=\"Sort by modified date\" onClick={() => handleSort('modified')} onKeyDown={e => { if (e.key === 'Enter') handleSort('modified'); }} style={{ cursor: 'pointer', minWidth: 140, textAlign: 'right' }}>\n Modified {sortBy === 'modified' && (sortDir === 'asc' ? '\\u25B2' : '\\u25BC')}\n </span>\n </>\n )}\n </div>\n\n {/* File list */}\n <div\n ref={listRef}\n style={{\n flex: 1, overflow: 'auto', position: 'relative',\n border: isDragging ? `2px dashed ${tokens.colors.interactive.default}` : '2px solid transparent',\n }}\n onScroll={e => setScrollTop(e.currentTarget.scrollTop)}\n onDragOver={allowUpload ? e => { e.preventDefault(); setIsDragging(true); } : undefined}\n onDragLeave={allowUpload ? () => setIsDragging(false) : undefined}\n onDrop={allowUpload ? handleDrop : undefined}\n >\n {isDragging && (\n <div style={{\n position: 'absolute', inset: 0, background: `${tokens.colors.interactive.default}11`,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: tokens.typography.fontSize.sm, color: tokens.colors.interactive.default,\n fontWeight: tokens.typography.fontWeight.medium, zIndex: 10,\n }}>\n Drop files to upload\n </div>\n )}\n {visibleItems.length === 0 ? (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n height: '100%', color: tokens.colors.text.muted, fontSize: tokens.typography.fontSize.sm,\n }}>\n {searchQuery ? 'No matching files' : 'Empty directory'}\n </div>\n ) : (\n <div style={{ height: totalRows * rowHeightPx, position: 'relative' }}>\n <div style={{ position: 'absolute', top: startRow * rowHeightPx, left: 0, right: 0 }}>\n {virtualVisibleItems.map(({ file, depth }) => (\n <div\n role=\"treeitem\"\n tabIndex={0}\n aria-label={`${file.isDirectory ? 'Folder' : 'File'}: ${file.name}`}\n aria-selected={selected.has(file.path)}\n key={file.path}\n onClick={() => handleFileClick(file)}\n onDoubleClick={() => handleFileDoubleClick(file)}\n onKeyDown={e => { if (e.key === 'Enter') handleFileDoubleClick(file); if (e.key === ' ') { e.preventDefault(); handleFileClick(file); } }}\n style={{\n display: 'grid',\n gridTemplateColumns: showDetails ? '1fr auto auto' : '1fr',\n padding: `0 ${tokens.spacing.smd}`,\n paddingLeft: `calc(${tokens.spacing.smd} + ${depth * 20}px)`,\n height: tokens.elementSize.sm,\n alignItems: 'center',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n cursor: 'pointer',\n background: selected.has(file.path) ? `${tokens.colors.interactive.default}15` : 'transparent',\n transition: 'background 150ms ease',\n }}\n onMouseEnter={e => {\n if (!selected.has(file.path)) (e.currentTarget as HTMLDivElement).style.background = tokens.colors.background.surface;\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.background = selected.has(file.path) ? `${tokens.colors.interactive.default}15` : 'transparent';\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm, overflow: 'hidden' }}>\n {multiSelect && (\n <input\n type=\"checkbox\"\n checked={selected.has(file.path)}\n onChange={() => toggleSelect(file.path)}\n onClick={e => e.stopPropagation()}\n aria-label={`Select ${file.name}`}\n style={{ accentColor: tokens.colors.interactive.default }}\n />\n )}\n {initialViewMode === 'tree' && file.isDirectory && (\n <span aria-hidden=\"true\" style={{ fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted, width: 12, textAlign: 'center' }}>\n {expanded.has(file.path) ? '\\u25BC' : '\\u25B6'}\n </span>\n )}\n <span aria-hidden=\"true\" style={{ display: 'inline-flex', alignItems: 'center', fontSize: tokens.typography.fontSize.sm }}>\n <AstroIcon name={getFileIconName(file)} size=\"small\" label=\"\" style={{ fontSize: 'inherit' }} />\n </span>\n <span style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: file.isDirectory ? tokens.typography.fontWeight.medium : tokens.typography.fontWeight.normal,\n color: file.isDirectory ? tokens.colors.interactive.default : tokens.colors.text.primary,\n overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',\n }}>\n {file.name}\n </span>\n </span>\n {showDetails && (\n <>\n <span style={{ fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.muted, textAlign: 'right', minWidth: 70, fontFamily: tokens.typography.fontFamily.mono }}>\n {file.isDirectory ? '—' : formatFileSize(file.size)}\n </span>\n <span style={{ fontSize: tokens.typography.fontSize.xs, color: tokens.colors.text.muted, textAlign: 'right', minWidth: 140, fontFamily: tokens.typography.fontFamily.mono }}>\n {formatDate(file.modified)}\n </span>\n </>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Status bar */}\n <div style={{\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted,\n display: 'flex', justifyContent: 'space-between',\n }}>\n <span>{visibleItems.length} items</span>\n {selected.size > 0 && <span>{selected.size} selected</span>}\n </div>\n </div>\n );\n});\n\nexport default FileExplorer;\n"],"names":["FileExplorer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileExplorer.js","names":[],"sources":["../../../../src/react/core/widgets/FileExplorer.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - FileExplorer Component\r\n *\r\n * Hierarchical file browser for mission data management and file operations.\r\n * Supports tree navigation, file actions (download, delete, upload),\r\n * search, breadcrumbs, and multiple selection.\r\n *\r\n * Features:\r\n * - Tree view and list view modes\r\n * - Breadcrumb navigation\r\n * - File type icons\r\n * - Search/filter\r\n * - Multi-select with checkboxes\r\n * - File actions (open, download, delete, rename)\r\n * - Upload dropzone\r\n * - File size and modified date display\r\n * - Sort by name, size, date\r\n *\r\n * @example\r\n * ```tsx\r\n * <FileExplorer\r\n * files={fileTree}\r\n * onFileOpen={(file) => console.log('Open:', file)}\r\n * onFileDownload={(file) => console.log('Download:', file)}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { useState, useCallback, useMemo, memo } from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport { AstroIcon, type AstroIconName } from \"../display/AstroIcon\";\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport interface FileNode {\r\n /** File/folder name */\r\n name: string;\r\n /** Full path */\r\n path: string;\r\n /** Whether this is a directory */\r\n isDirectory: boolean;\r\n /** File size in bytes (for files) */\r\n size?: number;\r\n /** Last modified date */\r\n modified?: string | Date;\r\n /** MIME type */\r\n mimeType?: string;\r\n /** Children (for directories) */\r\n children?: FileNode[];\r\n /** Custom icon name */\r\n icon?: string;\r\n /** Whether the file is readonly */\r\n readonly?: boolean;\r\n}\r\n\r\nexport type FileViewMode = \"tree\" | \"list\";\r\nexport type FileSortBy = \"name\" | \"size\" | \"modified\";\r\nexport type FileSortDir = \"asc\" | \"desc\";\r\n\r\nexport interface FileExplorerProps {\r\n /** Root file tree */\r\n files: FileNode[];\r\n /** Height (default: 500) */\r\n height?: number | string;\r\n /** Title */\r\n title?: string;\r\n /** View mode (default: 'list') */\r\n viewMode?: FileViewMode;\r\n /** Show search bar (default: true) */\r\n showSearch?: boolean;\r\n /** Show breadcrumbs (default: true) */\r\n showBreadcrumbs?: boolean;\r\n /** Show file details (size, date) (default: true) */\r\n showDetails?: boolean;\r\n /** Allow multi-select (default: false) */\r\n multiSelect?: boolean;\r\n /** Allow upload (default: false) */\r\n allowUpload?: boolean;\r\n /** Allow delete (default: false) */\r\n allowDelete?: boolean;\r\n /** Called when a file is opened/double-clicked */\r\n onFileOpen?: (file: FileNode) => void;\r\n /** Called when download is requested */\r\n onFileDownload?: (file: FileNode) => void;\r\n /** Called when delete is requested */\r\n onFileDelete?: (files: FileNode[]) => void;\r\n /** Called when files are uploaded */\r\n onFileUpload?: (files: File[], targetPath: string) => void;\r\n /** Called when selection changes */\r\n onSelectionChange?: (files: FileNode[]) => void;\r\n /** CSS class */\r\n className?: string;\r\n /** Show outer container border (default: true). Set false when embedded inside a Container/card. */\r\n bordered?: boolean;\r\n /** Custom style overrides for the outer container */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// =============================================================================\r\n// Helpers\r\n// =============================================================================\r\n\r\nfunction formatFileSize(bytes?: number): string {\r\n if (bytes === undefined || bytes === null) return \"—\";\r\n if (bytes === 0) return \"0 B\";\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\r\n return `${(bytes / Math.pow(1024, i)).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\r\n}\r\n\r\nfunction formatDate(date?: string | Date): string {\r\n if (!date) return \"—\";\r\n const d = typeof date === \"string\" ? new Date(date) : date;\r\n if (isNaN(d.getTime())) return String(date);\r\n return (\r\n d.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n }) +\r\n \" \" +\r\n d.toLocaleTimeString(\"en-US\", {\r\n hour12: false,\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n })\r\n );\r\n}\r\n\r\nfunction getFileIconName(file: FileNode): AstroIconName {\r\n if (file.isDirectory) return \"folder\";\r\n const ext = file.name.split(\".\").pop()?.toLowerCase() ?? \"\";\r\n const iconMap: Record<string, AstroIconName> = {\r\n rb: \"code\",\r\n py: \"code\",\r\n js: \"code\",\r\n ts: \"code\",\r\n jsx: \"code\",\r\n tsx: \"code\",\r\n json: \"insert-drive-file\",\r\n yaml: \"insert-drive-file\",\r\n yml: \"insert-drive-file\",\r\n xml: \"insert-drive-file\",\r\n csv: \"table-chart\",\r\n txt: \"short-text\",\r\n md: \"description\",\r\n log: \"insert-drive-file\",\r\n gz: \"archive\",\r\n zip: \"archive\",\r\n tar: \"archive\",\r\n bin: \"storage\",\r\n dat: \"storage\",\r\n png: \"image\",\r\n jpg: \"image\",\r\n gif: \"image\",\r\n svg: \"image\",\r\n pdf: \"picture-as-pdf\",\r\n doc: \"insert-drive-file\",\r\n xls: \"table-chart\",\r\n ppt: \"insert-drive-file\",\r\n };\r\n return iconMap[ext] || \"insert-drive-file\";\r\n}\r\n\r\nfunction flattenVisible(\r\n files: FileNode[],\r\n expanded: Set<string>,\r\n depth: number = 0,\r\n): { file: FileNode; depth: number }[] {\r\n const result: { file: FileNode; depth: number }[] = [];\r\n for (const f of files) {\r\n result.push({ file: f, depth });\r\n if (f.isDirectory && expanded.has(f.path) && f.children) {\r\n result.push(...flattenVisible(f.children, expanded, depth + 1));\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction filterFiles(files: FileNode[], query: string): FileNode[] {\r\n const q = query.toLowerCase();\r\n return files.reduce<FileNode[]>((acc, f) => {\r\n if (f.isDirectory && f.children) {\r\n const filteredChildren = filterFiles(f.children, query);\r\n if (filteredChildren.length > 0 || f.name.toLowerCase().includes(q)) {\r\n acc.push({ ...f, children: filteredChildren });\r\n }\r\n } else if (f.name.toLowerCase().includes(q)) {\r\n acc.push(f);\r\n }\r\n return acc;\r\n }, []);\r\n}\r\n\r\nfunction sortFiles(\r\n files: FileNode[],\r\n sortBy: FileSortBy,\r\n sortDir: FileSortDir,\r\n): FileNode[] {\r\n const sorted = [...files].sort((a, b) => {\r\n // Directories first\r\n if (a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1;\r\n let cmp = 0;\r\n if (sortBy === \"name\") cmp = a.name.localeCompare(b.name);\r\n else if (sortBy === \"size\") cmp = (a.size ?? 0) - (b.size ?? 0);\r\n else if (sortBy === \"modified\") {\r\n const da = a.modified ? new Date(a.modified).getTime() : 0;\r\n const db = b.modified ? new Date(b.modified).getTime() : 0;\r\n cmp = da - db;\r\n }\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return sorted.map((f) =>\r\n f.isDirectory && f.children\r\n ? { ...f, children: sortFiles(f.children, sortBy, sortDir) }\r\n : f,\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// Component\r\n// =============================================================================\r\n\r\nexport const FileExplorer = memo(function FileExplorer({\r\n files,\r\n height = 500,\r\n title,\r\n viewMode: initialViewMode = \"list\",\r\n showSearch = true,\r\n showBreadcrumbs = true,\r\n showDetails = true,\r\n multiSelect = false,\r\n allowUpload = false,\r\n allowDelete = false,\r\n onFileOpen,\r\n onFileDownload: _onFileDownload,\r\n onFileDelete,\r\n onFileUpload,\r\n onSelectionChange: _onSelectionChange,\r\n className = \"\",\r\n bordered = true,\r\n style: styleProp,\r\n}: FileExplorerProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme =\r\n theme === \"transparent\" ||\r\n theme === \"transparent-bold\" ||\r\n theme === \"transparent-minimal\";\r\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\r\n const [selected, setSelected] = useState<Set<string>>(new Set());\r\n const [currentPath, setCurrentPath] = useState<string[]>([]);\r\n const [searchQuery, setSearchQuery] = useState(\"\");\r\n const [sortBy, setSortBy] = useState<FileSortBy>(\"name\");\r\n const [sortDir, setSortDir] = useState<FileSortDir>(\"asc\");\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [scrollTop, setScrollTop] = useState(0);\r\n const [viewportHeight, setViewportHeight] = useState(240);\r\n const listRef = React.useRef<HTMLDivElement>(null);\r\n\r\n const processedFiles = useMemo(() => {\r\n let result = files;\r\n if (searchQuery.trim()) result = filterFiles(result, searchQuery);\r\n return sortFiles(result, sortBy, sortDir);\r\n }, [files, searchQuery, sortBy, sortDir]);\r\n\r\n // Navigate to directory by breadcrumb\r\n const currentFiles = useMemo(() => {\r\n let current = processedFiles;\r\n for (const dir of currentPath) {\r\n const found = current.find((f) => f.isDirectory && f.name === dir);\r\n if (found && found.children) current = found.children;\r\n else break;\r\n }\r\n return current;\r\n }, [processedFiles, currentPath]);\r\n\r\n const visibleItems = useMemo(() => {\r\n if (initialViewMode === \"tree\")\r\n return flattenVisible(processedFiles, expanded);\r\n return currentFiles.map((f) => ({ file: f, depth: 0 }));\r\n }, [processedFiles, expanded, currentFiles, initialViewMode]);\r\n\r\n const toggleExpand = useCallback((path: string) => {\r\n setExpanded((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(path)) next.delete(path);\r\n else next.add(path);\r\n return next;\r\n });\r\n }, []);\r\n\r\n const toggleSelect = useCallback(\r\n (path: string) => {\r\n setSelected((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(path)) next.delete(path);\r\n else {\r\n if (!multiSelect) next.clear();\r\n next.add(path);\r\n }\r\n return next;\r\n });\r\n },\r\n [multiSelect],\r\n );\r\n\r\n const handleFileClick = useCallback(\r\n (file: FileNode) => {\r\n if (file.isDirectory) {\r\n if (initialViewMode === \"list\") {\r\n setCurrentPath((prev) => [...prev, file.name]);\r\n } else {\r\n toggleExpand(file.path);\r\n }\r\n } else {\r\n toggleSelect(file.path);\r\n }\r\n },\r\n [initialViewMode, toggleExpand, toggleSelect],\r\n );\r\n\r\n const handleFileDoubleClick = useCallback(\r\n (file: FileNode) => {\r\n if (!file.isDirectory) onFileOpen?.(file);\r\n },\r\n [onFileOpen],\r\n );\r\n\r\n const navigateTo = useCallback((idx: number) => {\r\n setCurrentPath((prev) => prev.slice(0, idx));\r\n }, []);\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n if (!allowUpload || !onFileUpload) return;\r\n const droppedFiles = Array.from(e.dataTransfer.files);\r\n if (droppedFiles.length > 0) {\r\n onFileUpload(droppedFiles, \"/\" + currentPath.join(\"/\"));\r\n }\r\n },\r\n [allowUpload, onFileUpload, currentPath],\r\n );\r\n\r\n const handleSort = useCallback(\r\n (col: FileSortBy) => {\r\n if (sortBy === col) setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n else {\r\n setSortBy(col);\r\n setSortDir(\"asc\");\r\n }\r\n },\r\n [sortBy],\r\n );\r\n\r\n const selectedFiles = useMemo(\r\n () =>\r\n visibleItems.filter((v) => selected.has(v.file.path)).map((v) => v.file),\r\n [visibleItems, selected],\r\n );\r\n const rowHeightPx = Number.parseInt(String(tokens.elementSize.sm), 10) || 32;\r\n const overscanRows = 12;\r\n const totalRows = visibleItems.length;\r\n const startRow = Math.max(\r\n 0,\r\n Math.floor(scrollTop / rowHeightPx) - overscanRows,\r\n );\r\n const visibleRows =\r\n Math.ceil(viewportHeight / rowHeightPx) + overscanRows * 2;\r\n const endRow = Math.min(totalRows, startRow + visibleRows);\r\n const virtualVisibleItems = useMemo(\r\n () => visibleItems.slice(startRow, endRow),\r\n [visibleItems, startRow, endRow],\r\n );\r\n\r\n React.useEffect(() => {\r\n const el = listRef.current;\r\n if (!el) return undefined;\r\n\r\n const updateHeight = () =>\r\n setViewportHeight(Math.max(rowHeightPx * 4, el.clientHeight || 240));\r\n updateHeight();\r\n\r\n if (typeof ResizeObserver !== \"undefined\") {\r\n const observer = new ResizeObserver(updateHeight);\r\n observer.observe(el);\r\n return () => observer.disconnect();\r\n }\r\n\r\n window.addEventListener(\"resize\", updateHeight);\r\n return () => window.removeEventListener(\"resize\", updateHeight);\r\n }, [rowHeightPx]);\r\n\r\n return (\r\n <div\r\n className={`file-explorer ${className}`}\r\n style={{\r\n height: typeof height === \"number\" ? height : undefined,\r\n background: tokens.colors.background.base,\r\n ...(bordered\r\n ? (tokens.colors.border.cardStyle ?? {\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n })\r\n : { border: \"none\" }),\r\n borderRadius: tokens.borderRadius.lg,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n color: tokens.colors.text.primary,\r\n backdropFilter: isTransparentTheme ? \"blur(10px)\" : undefined,\r\n WebkitBackdropFilter: isTransparentTheme ? \"blur(10px)\" : undefined,\r\n ...styleProp,\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n backdropFilter: \"blur(8px)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n fontSize: tokens.typography.fontSize.sm,\r\n }}\r\n >\r\n {title || \"File Explorer\"}\r\n </span>\r\n <div style={{ display: \"flex\", gap: tokens.spacing.sm }}>\r\n {allowUpload && (\r\n <button\r\n aria-label=\"Upload files\"\r\n style={{\r\n background: tokens.colors.interactive.default,\r\n color: tokens.colors.text.inverse,\r\n border: \"none\",\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n cursor: \"pointer\",\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n transition: \"opacity 150ms ease\",\r\n }}\r\n >\r\n Upload\r\n </button>\r\n )}\r\n {allowDelete && selectedFiles.length > 0 && (\r\n <button\r\n onClick={() => onFileDelete?.(selectedFiles)}\r\n aria-label={`Delete ${selectedFiles.length} selected files`}\r\n style={{\r\n background: `${tokens.colors.status.critical}22`,\r\n color: tokens.colors.status.critical,\r\n border: `1px solid ${tokens.colors.status.critical}44`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n cursor: \"pointer\",\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n transition: \"opacity 150ms ease\",\r\n }}\r\n >\r\n Delete ({selectedFiles.length})\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Toolbar: search + breadcrumbs */}\r\n {(showSearch || showBreadcrumbs) && (\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.sm} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n background: tokens.colors.background.surface,\r\n }}\r\n >\r\n {showBreadcrumbs && initialViewMode === \"list\" && (\r\n <nav\r\n aria-label=\"File path\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n fontSize: tokens.typography.fontSize.xs,\r\n flex: 1,\r\n }}\r\n >\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label=\"Navigate to root\"\r\n onClick={() => navigateTo(0)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") navigateTo(0);\r\n }}\r\n style={{\r\n cursor: \"pointer\",\r\n color: tokens.colors.interactive.default,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n }}\r\n >\r\n /\r\n </span>\r\n {currentPath.map((dir, idx) => (\r\n <React.Fragment key={idx}>\r\n <span\r\n aria-hidden=\"true\"\r\n style={{ color: tokens.colors.text.muted }}\r\n >\r\n /\r\n </span>\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={`Navigate to ${dir}`}\r\n onClick={() => navigateTo(idx + 1)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") navigateTo(idx + 1);\r\n }}\r\n style={{\r\n cursor: \"pointer\",\r\n color:\r\n idx === currentPath.length - 1\r\n ? tokens.colors.text.primary\r\n : tokens.colors.interactive.default,\r\n fontWeight:\r\n idx === currentPath.length - 1\r\n ? tokens.typography.fontWeight.medium\r\n : tokens.typography.fontWeight.normal,\r\n }}\r\n >\r\n {dir}\r\n </span>\r\n </React.Fragment>\r\n ))}\r\n </nav>\r\n )}\r\n {showSearch && (\r\n <input\r\n type=\"text\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n placeholder=\"Search files...\"\r\n aria-label=\"Search files\"\r\n style={{\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n outline: \"none\",\r\n minWidth: 150,\r\n transition: \"border-color 150ms ease\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Column headers */}\r\n <div\r\n role=\"row\"\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: showDetails ? \"1fr auto auto\" : \"1fr\",\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n <span\r\n role=\"columnheader\"\r\n tabIndex={0}\r\n aria-label=\"Sort by name\"\r\n onClick={() => handleSort(\"name\")}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleSort(\"name\");\r\n }}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n Name {sortBy === \"name\" && (sortDir === \"asc\" ? \"\\u25B2\" : \"\\u25BC\")}\r\n </span>\r\n {showDetails && (\r\n <>\r\n <span\r\n role=\"columnheader\"\r\n tabIndex={0}\r\n aria-label=\"Sort by size\"\r\n onClick={() => handleSort(\"size\")}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleSort(\"size\");\r\n }}\r\n style={{ cursor: \"pointer\", minWidth: 70, textAlign: \"right\" }}\r\n >\r\n Size{\" \"}\r\n {sortBy === \"size\" && (sortDir === \"asc\" ? \"\\u25B2\" : \"\\u25BC\")}\r\n </span>\r\n <span\r\n role=\"columnheader\"\r\n tabIndex={0}\r\n aria-label=\"Sort by modified date\"\r\n onClick={() => handleSort(\"modified\")}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleSort(\"modified\");\r\n }}\r\n style={{ cursor: \"pointer\", minWidth: 140, textAlign: \"right\" }}\r\n >\r\n Modified{\" \"}\r\n {sortBy === \"modified\" &&\r\n (sortDir === \"asc\" ? \"\\u25B2\" : \"\\u25BC\")}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* File list */}\r\n <div\r\n ref={listRef}\r\n style={{\r\n flex: 1,\r\n overflow: \"auto\",\r\n position: \"relative\",\r\n border: isDragging\r\n ? `2px dashed ${tokens.colors.interactive.default}`\r\n : \"2px solid transparent\",\r\n }}\r\n onScroll={(e) => setScrollTop(e.currentTarget.scrollTop)}\r\n onDragOver={\r\n allowUpload\r\n ? (e) => {\r\n e.preventDefault();\r\n setIsDragging(true);\r\n }\r\n : undefined\r\n }\r\n onDragLeave={allowUpload ? () => setIsDragging(false) : undefined}\r\n onDrop={allowUpload ? handleDrop : undefined}\r\n >\r\n {isDragging && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n background: `${tokens.colors.interactive.default}11`,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: tokens.typography.fontSize.sm,\r\n color: tokens.colors.interactive.default,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n zIndex: 10,\r\n }}\r\n >\r\n Drop files to upload\r\n </div>\r\n )}\r\n {visibleItems.length === 0 ? (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n height: \"100%\",\r\n color: tokens.colors.text.muted,\r\n fontSize: tokens.typography.fontSize.sm,\r\n }}\r\n >\r\n {searchQuery ? \"No matching files\" : \"Empty directory\"}\r\n </div>\r\n ) : (\r\n <div\r\n style={{ height: totalRows * rowHeightPx, position: \"relative\" }}\r\n >\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: startRow * rowHeightPx,\r\n left: 0,\r\n right: 0,\r\n }}\r\n >\r\n {virtualVisibleItems.map(({ file, depth }) => (\r\n <div\r\n role=\"treeitem\"\r\n tabIndex={0}\r\n aria-label={`${file.isDirectory ? \"Folder\" : \"File\"}: ${file.name}`}\r\n aria-selected={selected.has(file.path)}\r\n key={file.path}\r\n onClick={() => handleFileClick(file)}\r\n onDoubleClick={() => handleFileDoubleClick(file)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleFileDoubleClick(file);\r\n if (e.key === \" \") {\r\n e.preventDefault();\r\n handleFileClick(file);\r\n }\r\n }}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: showDetails ? \"1fr auto auto\" : \"1fr\",\r\n padding: `0 ${tokens.spacing.smd}`,\r\n paddingLeft: `calc(${tokens.spacing.smd} + ${depth * 20}px)`,\r\n height: tokens.elementSize.sm,\r\n alignItems: \"center\",\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n cursor: \"pointer\",\r\n background: selected.has(file.path)\r\n ? `${tokens.colors.interactive.default}15`\r\n : \"transparent\",\r\n transition: \"background 150ms ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!selected.has(file.path))\r\n (e.currentTarget as HTMLDivElement).style.background =\r\n tokens.colors.background.surface;\r\n }}\r\n onMouseLeave={(e) => {\r\n (e.currentTarget as HTMLDivElement).style.background =\r\n selected.has(file.path)\r\n ? `${tokens.colors.interactive.default}15`\r\n : \"transparent\";\r\n }}\r\n >\r\n <span\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {multiSelect && (\r\n <input\r\n type=\"checkbox\"\r\n checked={selected.has(file.path)}\r\n onChange={() => toggleSelect(file.path)}\r\n onClick={(e) => e.stopPropagation()}\r\n aria-label={`Select ${file.name}`}\r\n style={{\r\n accentColor: tokens.colors.interactive.default,\r\n }}\r\n />\r\n )}\r\n {initialViewMode === \"tree\" && file.isDirectory && (\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n width: 12,\r\n textAlign: \"center\",\r\n }}\r\n >\r\n {expanded.has(file.path) ? \"\\u25BC\" : \"\\u25B6\"}\r\n </span>\r\n )}\r\n <span\r\n aria-hidden=\"true\"\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n fontSize: tokens.typography.fontSize.sm,\r\n }}\r\n >\r\n <AstroIcon\r\n name={getFileIconName(file)}\r\n size=\"small\"\r\n label=\"\"\r\n style={{ fontSize: \"inherit\" }}\r\n />\r\n </span>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: file.isDirectory\r\n ? tokens.typography.fontWeight.medium\r\n : tokens.typography.fontWeight.normal,\r\n color: file.isDirectory\r\n ? tokens.colors.interactive.default\r\n : tokens.colors.text.primary,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {file.name}\r\n </span>\r\n </span>\r\n {showDetails && (\r\n <>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: tokens.colors.text.muted,\r\n textAlign: \"right\",\r\n minWidth: 70,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n >\r\n {file.isDirectory ? \"—\" : formatFileSize(file.size)}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n color: tokens.colors.text.muted,\r\n textAlign: \"right\",\r\n minWidth: 140,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n >\r\n {formatDate(file.modified)}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Status bar */}\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.smd}`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <span>{visibleItems.length} items</span>\r\n {selected.size > 0 && <span>{selected.size} selected</span>}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nexport default FileExplorer;\r\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
|
|
3
2
|
export interface HexHighlight {
|
|
4
3
|
/** Start byte offset (inclusive) */
|
|
5
4
|
start: number;
|
|
@@ -74,8 +73,8 @@ export declare const REGION_BORDER_COLORS: {
|
|
|
74
73
|
readonly error: "rgba(255, 56, 56, 0.5)";
|
|
75
74
|
};
|
|
76
75
|
export type ByteGrouping = 1 | 2 | 4 | 8;
|
|
77
|
-
export type OffsetBase =
|
|
78
|
-
export type Endianness =
|
|
76
|
+
export type OffsetBase = "hex" | "decimal";
|
|
77
|
+
export type Endianness = "big" | "little";
|
|
79
78
|
export interface HexViewerProps {
|
|
80
79
|
/** Binary data to display */
|
|
81
80
|
data: Uint8Array | number[];
|