@zendir/ui 0.5.0 → 0.6.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/CHANGELOG.md +20 -0
- 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 +312 -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 +217 -194
- 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 +419 -41
- 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":"ActivityPlanner.js","sources":["../../../../src/react/core/widgets/ActivityPlanner.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ActivityPlanner Component\r\n * \r\n * Activity scheduling and management panel. Creates, edits, and monitors\r\n * scheduled activities across timelines. Integrates with MissionCalendar\r\n * and Timeline components.\r\n * \r\n * Space Mission Features:\r\n * - Create/edit activities with command or script execution\r\n * - Drag-and-drop reorder within timeline\r\n * - Hazardous activity warnings (Astro UX)\r\n * - Activity lifecycle tracking (created → scheduled → started → completed)\r\n * - Overlap detection within a timeline\r\n * - Metadata recording (operator, environment, notes)\r\n * - Contact window awareness\r\n * - Batch scheduling\r\n * \r\n * @example\r\n * ```tsx\r\n * <ActivityPlanner\r\n * activities={activities}\r\n * timelines={timelines}\r\n * onActivityCreate={(a) => console.log('Create:', a)}\r\n * onActivityUpdate={(a) => console.log('Update:', a)}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback, memo, useRef } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport type { CalendarEvent, CalendarTimeline, ActivityStatus, ActivityType } from './MissionCalendar';\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport interface ActivityFormData {\r\n title: string;\r\n type: ActivityType;\r\n start: string; // ISO string\r\n end: string; // ISO string\r\n timeline: string;\r\n description: string;\r\n command: string;\r\n script: string;\r\n hazardous: boolean;\r\n metadata: Record<string, string>;\r\n}\r\n\r\nexport interface ActivityPlannerProps {\r\n /** Activities to display */\r\n activities: CalendarEvent[];\r\n /** Available timelines */\r\n timelines: CalendarTimeline[];\r\n /** Currently selected date for scheduling */\r\n selectedDate?: Date;\r\n /** Height (default: 500) */\r\n height?: number | string;\r\n /** Title */\r\n title?: string;\r\n /** Read-only mode */\r\n readOnly?: boolean;\r\n /** Show overlap warnings */\r\n showOverlapWarning?: boolean;\r\n /** Called on create */\r\n onActivityCreate?: (activity: Partial<CalendarEvent>) => void;\r\n /** Called on update */\r\n onActivityUpdate?: (id: string, updates: Partial<CalendarEvent>) => void;\r\n /** Called on delete */\r\n onActivityDelete?: (id: string) => void;\r\n /** Called when requesting to view activity in calendar */\r\n onViewInCalendar?: (activity: CalendarEvent) => void;\r\n /** Called when requesting to view in timeline */\r\n onViewInTimeline?: (activity: CalendarEvent) => void;\r\n /** CSS class */\r\n className?: string;\r\n}\r\n\r\n// =============================================================================\r\n// Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Map activity status → Astro UX status color using tokens.\r\n * created/scheduled → standby (cyan)\r\n * started/completed → normal (green)\r\n * paused/stopped/disabled → caution (yellow)\r\n * error/failed/crashed → critical (red)\r\n */\r\nfunction getStatusColor(status?: ActivityStatus, tokens?: ReturnType<typeof useTheme>['tokens']): string {\r\n if (!status || !tokens) return tokens?.colors.text.muted ?? 'currentColor';\r\n switch (status) {\r\n case 'created': case 'scheduled': return tokens.colors.status.standby;\r\n case 'started': case 'completed': return tokens.colors.status.normal;\r\n case 'paused': case 'stopped': case 'disabled': return tokens.colors.status.caution;\r\n case 'error': case 'failed': case 'crashed': return tokens.colors.status.critical;\r\n }\r\n}\r\n\r\n/**\r\n * Return Astro UX status shape + contextual icon.\r\n * The leading character is the Astro status shape for the mapped level:\r\n * standby → ◯ (ring), normal → ● (filled circle),\r\n * caution → ■ (square), critical → ▼ (triangle down)\r\n * Followed by a contextual glyph for the specific activity state.\r\n */\r\nfunction getStatusIcon(status?: ActivityStatus): string {\r\n if (!status) return '◯';\r\n switch (status) {\r\n case 'created': return '◯'; // standby ring\r\n case 'scheduled': return '◯ ◉'; // standby ring + scheduled\r\n case 'started': return '● ▶'; // normal circle + play\r\n case 'completed': return '● ✓'; // normal circle + check\r\n case 'paused': return '■ ⏸'; // caution square + pause\r\n case 'stopped': return '■ ⏹'; // caution square + stop\r\n case 'disabled': return '■ ⊘'; // caution square + disabled\r\n case 'error': case 'failed': case 'crashed': return '▼'; // critical triangle down\r\n }\r\n}\r\n\r\nfunction formatDate(d: Date): string {\r\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\r\n}\r\n\r\nfunction formatTime(d: Date): string {\r\n return d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\r\n}\r\n\r\nfunction checkOverlap(a: CalendarEvent, b: CalendarEvent): boolean {\r\n if (!a.end || !b.end) return false;\r\n if (a.timeline !== b.timeline) return false;\r\n return a.start < b.end && b.start < a.end;\r\n}\r\n\r\n// =============================================================================\r\n// Form Component\r\n// =============================================================================\r\n\r\nconst ActivityForm = memo(function ActivityForm({\r\n timelines, selectedDate, tokens, onSubmit, onCancel,\r\n}: {\r\n timelines: CalendarTimeline[];\r\n selectedDate?: Date;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n onSubmit: (data: ActivityFormData) => void;\r\n onCancel: () => void;\r\n}) {\r\n const now = selectedDate || new Date();\r\n const endDefault = new Date(now.getTime() + 3600000);\r\n\r\n const [form, setForm] = useState<ActivityFormData>({\r\n title: '', type: 'command',\r\n start: now.toISOString().slice(0, 16),\r\n end: endDefault.toISOString().slice(0, 16),\r\n timeline: timelines[0]?.id || '',\r\n description: '', command: '', script: '',\r\n hazardous: false, metadata: {},\r\n });\r\n const [metaKey, setMetaKey] = useState('');\r\n const [metaValue, setMetaValue] = useState('');\r\n\r\n const addMetadata = useCallback(() => {\r\n if (metaKey.trim()) {\r\n setForm(prev => ({ ...prev, metadata: { ...prev.metadata, [metaKey.trim()]: metaValue } }));\r\n setMetaKey('');\r\n setMetaValue('');\r\n }\r\n }, [metaKey, metaValue]);\r\n\r\n const inputStyle: React.CSSProperties = {\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}px ${tokens.spacing.sm}px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n width: '100%',\r\n minHeight: 40,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: 'all 150ms ease',\r\n };\r\n\r\n const labelStyle: React.CSSProperties = {\r\n fontSize: tokens.typography.fontSize.xxs, fontWeight: 500, color: tokens.colors.text.muted,\r\n textTransform: 'uppercase', marginBottom: 3, display: 'block',\r\n };\r\n\r\n return (\r\n <div style={{ padding: 12, display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 120px', gap: 8 }}>\r\n <div>\r\n <label htmlFor=\"activity-title\" style={labelStyle}>Title</label>\r\n <input id=\"activity-title\" aria-label=\"Activity title\" style={inputStyle} value={form.title} onChange={e => setForm(p => ({ ...p, title: e.target.value }))} placeholder=\"Activity name\" />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-type\" style={labelStyle}>Type</label>\r\n <select id=\"activity-type\" aria-label=\"Activity type\" style={inputStyle} value={form.type} onChange={e => setForm(p => ({ ...p, type: e.target.value as ActivityType }))}>\r\n <option value=\"command\">Command</option>\r\n <option value=\"script\">Script</option>\r\n <option value=\"reserve\">Reserve</option>\r\n <option value=\"contact\">Contact</option>\r\n <option value=\"note\">Note</option>\r\n <option value=\"metadata\">Metadata</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\r\n <div>\r\n <label htmlFor=\"activity-start-time\" style={labelStyle}>Start Time</label>\r\n <input id=\"activity-start-time\" aria-label=\"Start time\" type=\"datetime-local\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.start} onChange={e => setForm(p => ({ ...p, start: e.target.value }))} />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-end-time\" style={labelStyle}>End Time</label>\r\n <input id=\"activity-end-time\" aria-label=\"End time\" type=\"datetime-local\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.end} onChange={e => setForm(p => ({ ...p, end: e.target.value }))} />\r\n </div>\r\n </div>\r\n {timelines.length > 0 && (\r\n <div>\r\n <label htmlFor=\"activity-timeline\" style={labelStyle}>Timeline</label>\r\n <select id=\"activity-timeline\" aria-label=\"Timeline\" style={inputStyle} value={form.timeline} onChange={e => setForm(p => ({ ...p, timeline: e.target.value }))}>\r\n {timelines.map(t => <option key={t.id} value={t.id}>{t.name}</option>)}\r\n </select>\r\n </div>\r\n )}\r\n {form.type === 'command' && (\r\n <div>\r\n <label htmlFor=\"activity-command\" style={labelStyle}>Command</label>\r\n <input id=\"activity-command\" aria-label=\"Command\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.command} onChange={e => setForm(p => ({ ...p, command: e.target.value }))} placeholder='cmd(\"TARGET COMMAND\")' />\r\n </div>\r\n )}\r\n {form.type === 'script' && (\r\n <div>\r\n <label htmlFor=\"activity-script\" style={labelStyle}>Script Path</label>\r\n <input id=\"activity-script\" aria-label=\"Script path\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.script} onChange={e => setForm(p => ({ ...p, script: e.target.value }))} placeholder=\"/scripts/ops/collect.rb\" />\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"activity-description\" style={labelStyle}>Description</label>\r\n <textarea id=\"activity-description\" aria-label=\"Description\" style={{ ...inputStyle, minHeight: 48, resize: 'vertical' }} value={form.description} onChange={e => setForm(p => ({ ...p, description: e.target.value }))} placeholder=\"Notes...\" />\r\n </div>\r\n\r\n {/* Metadata KV */}\r\n <div>\r\n <div style={labelStyle}>Metadata</div>\r\n <div style={{ display: 'flex', gap: 4, marginBottom: 4 }}>\r\n <input aria-label=\"Metadata key\" style={{ ...inputStyle, flex: 1 }} value={metaKey} onChange={e => setMetaKey(e.target.value)} placeholder=\"Key\" />\r\n <input aria-label=\"Metadata value\" style={{ ...inputStyle, flex: 1 }} value={metaValue} onChange={e => setMetaValue(e.target.value)} placeholder=\"Value\" />\r\n <button onClick={addMetadata} style={{\r\n background: tokens.colors.interactive.default, color: tokens.colors.text.inverse, border: 'none',\r\n borderRadius: tokens.borderRadius.md, padding: `0 ${tokens.spacing.sm}px`, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}>+</button>\r\n </div>\r\n {Object.keys(form.metadata).length > 0 && (\r\n <div style={{ display: 'flex', gap: 4, flexWrap: 'wrap' }}>\r\n {Object.entries(form.metadata).map(([k, v]) => (\r\n <span key={k} style={{\r\n fontSize: tokens.typography.fontSize.micro, background: tokens.colors.background.surface, padding: `2px 6px`,\r\n borderRadius: tokens.borderRadius.sm, display: 'flex', alignItems: 'center', gap: tokens.spacing.xs,\r\n }}>\r\n {k}: {v}\r\n <button\r\n type=\"button\"\r\n aria-label={`Remove metadata ${k}`}\r\n onClick={() => setForm(p => {\r\n const m = { ...p.metadata };\r\n delete m[k];\r\n return { ...p, metadata: m };\r\n })}\r\n style={{\r\n cursor: 'pointer',\r\n color: tokens.colors.status.critical,\r\n fontWeight: 500,\r\n border: 'none',\r\n background: 'transparent',\r\n padding: 0,\r\n lineHeight: 1,\r\n }}\r\n >\r\n ×\r\n </button>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Hazardous toggle */}\r\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer' }}>\r\n <input aria-label=\"Hazardous activity\" type=\"checkbox\" checked={form.hazardous} onChange={e => setForm(p => ({ ...p, hazardous: e.target.checked }))} />\r\n <span style={{ color: form.hazardous ? tokens.colors.status.critical : tokens.colors.text.secondary }}>\r\n ⚠ Hazardous Activity\r\n </span>\r\n </label>\r\n\r\n {/* Buttons */}\r\n <div style={{ display: 'flex', gap: 6, justifyContent: 'flex-end', marginTop: 4 }}>\r\n <button onClick={onCancel} style={{\r\n background: 'transparent', color: tokens.colors.text.muted,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs}px 14px`, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}>Cancel</button>\r\n <button onClick={() => onSubmit(form)} disabled={!form.title.trim()} style={{\r\n background: tokens.colors.interactive.default, color: tokens.colors.text.inverse,\r\n border: 'none', borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs}px 14px`, fontSize: tokens.typography.fontSize.xs,\r\n cursor: form.title.trim() ? 'pointer' : 'not-allowed', fontWeight: 500, opacity: form.title.trim() ? 1 : 0.5,\r\n transition: 'all 150ms ease',\r\n }}>Create Activity</button>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// =============================================================================\r\n// Main Component\r\n// =============================================================================\r\n\r\nexport const ActivityPlanner = memo(function ActivityPlanner({\r\n activities,\r\n timelines,\r\n selectedDate,\r\n height = 500,\r\n title = 'Activity Planner',\r\n readOnly = false,\r\n showOverlapWarning = true,\r\n onActivityCreate,\r\n onActivityUpdate: _onActivityUpdate,\r\n onActivityDelete,\r\n onViewInCalendar,\r\n onViewInTimeline,\r\n className = '',\r\n}: ActivityPlannerProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme =\r\n theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n const [showForm, setShowForm] = useState(false);\r\n const [filter, setFilter] = useState('');\r\n const [sortBy, setSortBy] = useState<'time' | 'status' | 'timeline'>('time');\r\n const listRef = useRef<HTMLDivElement>(null);\r\n\r\n // Overlap detection\r\n const overlaps = useMemo(() => {\r\n const pairs: [string, string][] = [];\r\n for (let i = 0; i < activities.length; i++) {\r\n for (let j = i + 1; j < activities.length; j++) {\r\n if (checkOverlap(activities[i], activities[j])) {\r\n pairs.push([activities[i].id, activities[j].id]);\r\n }\r\n }\r\n }\r\n return new Set(pairs.flat());\r\n }, [activities]);\r\n\r\n // Sort and filter\r\n const displayActivities = useMemo(() => {\r\n let list = [...activities];\r\n if (filter) {\r\n const lf = filter.toLowerCase();\r\n list = list.filter(a =>\r\n a.title.toLowerCase().includes(lf) ||\r\n a.description?.toLowerCase().includes(lf) ||\r\n a.timeline?.toLowerCase().includes(lf) ||\r\n a.command?.toLowerCase().includes(lf)\r\n );\r\n }\r\n switch (sortBy) {\r\n case 'time': list.sort((a, b) => a.start.getTime() - b.start.getTime()); break;\r\n case 'status': list.sort((a, b) => (a.status || '').localeCompare(b.status || '')); break;\r\n case 'timeline': list.sort((a, b) => (a.timeline || '').localeCompare(b.timeline || '')); break;\r\n }\r\n return list;\r\n }, [activities, filter, sortBy]);\r\n\r\n // Stats\r\n const stats = useMemo(() => ({\r\n total: activities.length,\r\n scheduled: activities.filter(a => a.status === 'scheduled' || a.status === 'created').length,\r\n running: activities.filter(a => a.status === 'started').length,\r\n completed: activities.filter(a => a.status === 'completed').length,\r\n errors: activities.filter(a => a.status === 'error' || a.status === 'failed' || a.status === 'crashed').length,\r\n }), [activities]);\r\n\r\n const handleCreate = useCallback((data: ActivityFormData) => {\r\n onActivityCreate?.({\r\n title: data.title,\r\n type: data.type,\r\n start: new Date(data.start),\r\n end: new Date(data.end),\r\n timeline: data.timeline,\r\n description: data.description,\r\n command: data.command || undefined,\r\n script: data.script || undefined,\r\n metadata: Object.keys(data.metadata).length > 0 ? data.metadata : undefined,\r\n status: 'created',\r\n });\r\n setShowForm(false);\r\n }, [onActivityCreate]);\r\n\r\n const panelPadX = tokens.spacing.md;\r\n const panelPadY = tokens.spacing.sm;\r\n\r\n return (\r\n <div\r\n className={`activity-planner ${className}`}\r\n style={{\r\n height: typeof height === 'number' ? height : undefined,\r\n background: tokens.colors.background.base,\r\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\r\n borderRadius: tokens.borderRadius.lg, overflow: 'hidden',\r\n display: 'flex', flexDirection: 'column',\r\n fontFamily: tokens.typography.fontFamily.primary, color: tokens.colors.text.primary,\r\n backdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\r\n WebkitBackdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\r\n }}\r\n >\r\n {/* Header */}\r\n <div style={{\r\n padding: `${panelPadY}px ${panelPadX}px`,\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', alignItems: 'center', justifyContent: 'space-between',\r\n }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\r\n <span style={{ fontWeight: 500, fontSize: tokens.typography.fontSize.sm }}>{title}</span>\r\n <div style={{ display: 'flex', gap: 10, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted }}>\r\n <span>Scheduled {stats.scheduled}</span>\r\n <span style={{ color: tokens.colors.text.secondary }}>Running {stats.running}</span>\r\n <span style={{ color: tokens.colors.text.secondary }}>Completed {stats.completed}</span>\r\n {stats.errors > 0 && <span style={{ color: tokens.colors.status.critical }}>Errors {stats.errors}</span>}\r\n </div>\r\n </div>\r\n {!readOnly && (\r\n <button\r\n onClick={() => setShowForm(!showForm)}\r\n style={{\r\n background: showForm ? tokens.colors.status.critical + '22' : tokens.colors.interactive.default,\r\n color: showForm ? tokens.colors.status.critical : tokens.colors.text.inverse,\r\n border: 'none', borderRadius: tokens.borderRadius.md, padding: '3px 10px',\r\n fontSize: tokens.typography.fontSize.xs, fontWeight: 500, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n {showForm ? '✕ Cancel' : '+ New Activity'}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Create form */}\r\n {showForm && !readOnly && (\r\n <div style={{ borderBottom: `1px solid ${tokens.colors.border.muted}`, background: tokens.colors.background.surface + '88' }}>\r\n <ActivityForm\r\n timelines={timelines}\r\n selectedDate={selectedDate}\r\n tokens={tokens}\r\n onSubmit={handleCreate}\r\n onCancel={() => setShowForm(false)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Search / Sort */}\r\n <div style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`, display: 'flex', gap: 6, alignItems: 'center',\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n }}>\r\n <input\r\n value={filter}\r\n onChange={e => setFilter(e.target.value)}\r\n aria-label=\"Search activities\"\r\n placeholder=\"Search activities...\"\r\n style={{\r\n flex: 1, background: tokens.colors.background.surface,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: '3px 8px', fontSize: tokens.typography.fontSize.xxs,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: 'all 150ms ease',\r\n }}\r\n />\r\n <select\r\n value={sortBy}\r\n onChange={e => setSortBy(e.target.value as 'time' | 'status' | 'timeline')}\r\n aria-label=\"Sort activities\"\r\n style={{\r\n background: tokens.colors.background.surface,\r\n color: tokens.colors.text.secondary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: '3px 6px', fontSize: tokens.typography.fontSize.xxs,\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n <option value=\"time\">Sort: Time</option>\r\n <option value=\"status\">Sort: Status</option>\r\n <option value=\"timeline\">Sort: Timeline</option>\r\n </select>\r\n </div>\r\n\r\n {/* Activity list */}\r\n <div ref={listRef} style={{ flex: 1, overflow: 'auto', padding: 8 }}>\r\n {displayActivities.length === 0 ? (\r\n <div style={{ textAlign: 'center', color: tokens.colors.text.muted, padding: 40, fontSize: tokens.typography.fontSize.xs }}>\r\n {filter ? 'No matching activities' : 'No activities scheduled'}\r\n </div>\r\n ) : (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\r\n {displayActivities.map(a => {\r\n const color = a.color || getStatusColor(a.status, tokens);\r\n const hasOverlap = overlaps.has(a.id);\r\n return (\r\n <div\r\n key={a.id}\r\n style={{\r\n display: 'grid', gridTemplateColumns: '24px 1fr auto',\r\n alignItems: 'center', gap: tokens.spacing.sm,\r\n padding: '6px 10px',\r\n background: hasOverlap ? `${tokens.colors.status.caution}10` : `${color}08`,\r\n borderLeft: `3px solid ${color}`,\r\n borderRadius: tokens.borderRadius.md, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n border: hasOverlap && showOverlapWarning ? `1px solid ${tokens.colors.status.caution}44` : undefined,\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n {/* Status icon */}\r\n <div style={{ textAlign: 'center' }}>\r\n <span style={{ color, fontSize: tokens.typography.fontSize.sm, fontWeight: 500 }}>{getStatusIcon(a.status)}</span>\r\n </div>\r\n {/* Info */}\r\n <div style={{ overflow: 'hidden' }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 2 }}>\r\n <span style={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {a.title}\r\n </span>\r\n {a.timeline && (\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.micro, background: tokens.colors.background.surface,\r\n padding: `0 ${tokens.spacing.xs}px`, borderRadius: tokens.borderRadius.sm, color: tokens.colors.text.muted,\r\n }}>{a.timeline}</span>\r\n )}\r\n {hasOverlap && showOverlapWarning && (\r\n <span style={{ fontSize: tokens.typography.fontSize.micro, color: tokens.colors.status.caution, fontWeight: 500 }}>⚠ OVERLAP</span>\r\n )}\r\n </div>\r\n <div style={{ fontSize: tokens.typography.fontSize.micro, fontFamily: tokens.typography.fontFamily.mono, color: tokens.colors.text.muted }}>\r\n {formatDate(a.start)} {formatTime(a.start)}\r\n {a.end ? ` → ${formatTime(a.end)}` : ''}\r\n </div>\r\n </div>\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: 4 }}>\r\n {onViewInCalendar && (\r\n <button aria-label={`View ${a.title} in calendar`} onClick={() => onViewInCalendar(a)} style={actionBtnStyle(tokens)} title=\"View in Calendar\">Calendar</button>\r\n )}\r\n {onViewInTimeline && (\r\n <button aria-label={`View ${a.title} in timeline`} onClick={() => onViewInTimeline(a)} style={actionBtnStyle(tokens)} title=\"View in Timeline\">Timeline</button>\r\n )}\r\n {!readOnly && onActivityDelete && (\r\n <button aria-label={`Delete ${a.title}`} onClick={() => onActivityDelete(a.id)} style={{ ...actionBtnStyle(tokens), color: tokens.colors.status.critical }} title=\"Delete\">Delete</button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n fontSize: tokens.typography.fontSize.micro, color: tokens.colors.text.muted,\r\n display: 'flex', justifyContent: 'space-between',\r\n }}>\r\n <span>{displayActivities.length} / {activities.length} activities</span>\r\n {overlaps.size > 0 && showOverlapWarning && (\r\n <span style={{ color: tokens.colors.status.caution }}>⚠ {overlaps.size} overlapping activities</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nfunction actionBtnStyle(tokens: ReturnType<typeof useTheme>['tokens']): React.CSSProperties {\r\n return {\r\n background: 'transparent', border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.sm, padding: `2px ${tokens.spacing.xs}px`, fontSize: tokens.typography.fontSize.xxs, cursor: 'pointer',\r\n lineHeight: 1,\r\n transition: 'all 150ms ease',\r\n };\r\n}\r\n\r\nexport default ActivityPlanner;\r\n"],"names":["ActivityForm","ActivityPlanner"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActivityPlanner.js","names":[],"sources":["../../../../src/react/core/widgets/ActivityPlanner.tsx"],"sourcesContent":["/**\n * @zendir/ui - ActivityPlanner Component\n *\n * Activity scheduling and management panel. Creates, edits, and monitors\n * scheduled activities across timelines. Integrates with MissionCalendar\n * and Timeline components.\n *\n * Space Mission Features:\n * - Create/edit activities with command or script execution\n * - Drag-and-drop reorder within timeline\n * - Hazardous activity warnings (Astro UX)\n * - Activity lifecycle tracking (created → scheduled → started → completed)\n * - Overlap detection within a timeline\n * - Metadata recording (operator, environment, notes)\n * - Contact window awareness\n * - Batch scheduling\n *\n * @example\n * ```tsx\n * <ActivityPlanner\n * activities={activities}\n * timelines={timelines}\n * onActivityCreate={(a) => console.log('Create:', a)}\n * onActivityUpdate={(a) => console.log('Update:', a)}\n * />\n * ```\n */\n\nimport React, { useState, useMemo, useCallback, memo, useRef } from \"react\";\nimport { useTheme } from \"../../theme\";\nimport type {\n CalendarEvent,\n CalendarTimeline,\n ActivityStatus,\n ActivityType,\n} from \"./MissionCalendar\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ActivityFormData {\n title: string;\n type: ActivityType;\n start: string; // ISO string\n end: string; // ISO string\n timeline: string;\n description: string;\n command: string;\n script: string;\n hazardous: boolean;\n metadata: Record<string, string>;\n}\n\nexport interface ActivityPlannerProps {\n /** Activities to display */\n activities: CalendarEvent[];\n /** Available timelines */\n timelines: CalendarTimeline[];\n /** Currently selected date for scheduling */\n selectedDate?: Date;\n /** Height (default: 500) */\n height?: number | string;\n /** Title */\n title?: string;\n /** Read-only mode */\n readOnly?: boolean;\n /** Show overlap warnings */\n showOverlapWarning?: boolean;\n /** Called on create */\n onActivityCreate?: (activity: Partial<CalendarEvent>) => void;\n /** Called on update */\n onActivityUpdate?: (id: string, updates: Partial<CalendarEvent>) => void;\n /** Called on delete */\n onActivityDelete?: (id: string) => void;\n /** Called when requesting to view activity in calendar */\n onViewInCalendar?: (activity: CalendarEvent) => void;\n /** Called when requesting to view in timeline */\n onViewInTimeline?: (activity: CalendarEvent) => void;\n /** CSS class */\n className?: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Map activity status → Astro UX status color using tokens.\n * created/scheduled → standby (cyan)\n * started/completed → normal (green)\n * paused/stopped/disabled → caution (yellow)\n * error/failed/crashed → critical (red)\n */\nfunction getStatusColor(\n status?: ActivityStatus,\n tokens?: ReturnType<typeof useTheme>[\"tokens\"],\n): string {\n if (!status || !tokens) return tokens?.colors.text.muted ?? \"currentColor\";\n switch (status) {\n case \"created\":\n case \"scheduled\":\n return tokens.colors.status.standby;\n case \"started\":\n case \"completed\":\n return tokens.colors.status.normal;\n case \"paused\":\n case \"stopped\":\n case \"disabled\":\n return tokens.colors.status.caution;\n case \"error\":\n case \"failed\":\n case \"crashed\":\n return tokens.colors.status.critical;\n }\n}\n\n/**\n * Return Astro UX status shape + contextual icon.\n * The leading character is the Astro status shape for the mapped level:\n * standby → ◯ (ring), normal → ● (filled circle),\n * caution → ■ (square), critical → ▼ (triangle down)\n * Followed by a contextual glyph for the specific activity state.\n */\nfunction getStatusIcon(status?: ActivityStatus): string {\n if (!status) return \"◯\";\n switch (status) {\n case \"created\":\n return \"◯\"; // standby ring\n case \"scheduled\":\n return \"◯ ◉\"; // standby ring + scheduled\n case \"started\":\n return \"● ▶\"; // normal circle + play\n case \"completed\":\n return \"● ✓\"; // normal circle + check\n case \"paused\":\n return \"■ ⏸\"; // caution square + pause\n case \"stopped\":\n return \"■ ⏹\"; // caution square + stop\n case \"disabled\":\n return \"■ ⊘\"; // caution square + disabled\n case \"error\":\n case \"failed\":\n case \"crashed\":\n return \"▼\"; // critical triangle down\n }\n}\n\nfunction formatDate(d: Date): string {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatTime(d: Date): string {\n return d.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\nfunction checkOverlap(a: CalendarEvent, b: CalendarEvent): boolean {\n if (!a.end || !b.end) return false;\n if (a.timeline !== b.timeline) return false;\n return a.start < b.end && b.start < a.end;\n}\n\n// =============================================================================\n// Form Component\n// =============================================================================\n\nconst ActivityForm = memo(function ActivityForm({\n timelines,\n selectedDate,\n tokens,\n onSubmit,\n onCancel,\n}: {\n timelines: CalendarTimeline[];\n selectedDate?: Date;\n tokens: ReturnType<typeof useTheme>[\"tokens\"];\n onSubmit: (data: ActivityFormData) => void;\n onCancel: () => void;\n}) {\n const now = selectedDate || new Date();\n const endDefault = new Date(now.getTime() + 3600000);\n\n const [form, setForm] = useState<ActivityFormData>({\n title: \"\",\n type: \"command\",\n start: now.toISOString().slice(0, 16),\n end: endDefault.toISOString().slice(0, 16),\n timeline: timelines[0]?.id || \"\",\n description: \"\",\n command: \"\",\n script: \"\",\n hazardous: false,\n metadata: {},\n });\n const [metaKey, setMetaKey] = useState(\"\");\n const [metaValue, setMetaValue] = useState(\"\");\n\n const addMetadata = useCallback(() => {\n if (metaKey.trim()) {\n setForm((prev) => ({\n ...prev,\n metadata: { ...prev.metadata, [metaKey.trim()]: metaValue },\n }));\n setMetaKey(\"\");\n setMetaValue(\"\");\n }\n }, [metaKey, metaValue]);\n\n const inputStyle: React.CSSProperties = {\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,\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\n fontSize: tokens.typography.fontSize.xs,\n width: \"100%\",\n minHeight: 40,\n fontFamily: tokens.typography.fontFamily.primary,\n transition: \"all 150ms ease\",\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: tokens.typography.fontSize.xxs,\n fontWeight: 500,\n color: tokens.colors.text.muted,\n textTransform: \"uppercase\",\n marginBottom: 3,\n display: \"block\",\n };\n\n return (\n <div\n style={{ padding: 12, display: \"flex\", flexDirection: \"column\", gap: 8 }}\n >\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 120px\", gap: 8 }}\n >\n <div>\n <label htmlFor=\"activity-title\" style={labelStyle}>\n Title\n </label>\n <input\n id=\"activity-title\"\n aria-label=\"Activity title\"\n style={inputStyle}\n value={form.title}\n onChange={(e) => setForm((p) => ({ ...p, title: e.target.value }))}\n placeholder=\"Activity name\"\n />\n </div>\n <div>\n <label htmlFor=\"activity-type\" style={labelStyle}>\n Type\n </label>\n <select\n id=\"activity-type\"\n aria-label=\"Activity type\"\n style={inputStyle}\n value={form.type}\n onChange={(e) =>\n setForm((p) => ({ ...p, type: e.target.value as ActivityType }))\n }\n >\n <option value=\"command\">Command</option>\n <option value=\"script\">Script</option>\n <option value=\"reserve\">Reserve</option>\n <option value=\"contact\">Contact</option>\n <option value=\"note\">Note</option>\n <option value=\"metadata\">Metadata</option>\n </select>\n </div>\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n <div>\n <label htmlFor=\"activity-start-time\" style={labelStyle}>\n Start Time\n </label>\n <input\n id=\"activity-start-time\"\n aria-label=\"Start time\"\n type=\"datetime-local\"\n style={{\n ...inputStyle,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n value={form.start}\n onChange={(e) => setForm((p) => ({ ...p, start: e.target.value }))}\n />\n </div>\n <div>\n <label htmlFor=\"activity-end-time\" style={labelStyle}>\n End Time\n </label>\n <input\n id=\"activity-end-time\"\n aria-label=\"End time\"\n type=\"datetime-local\"\n style={{\n ...inputStyle,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n value={form.end}\n onChange={(e) => setForm((p) => ({ ...p, end: e.target.value }))}\n />\n </div>\n </div>\n {timelines.length > 0 && (\n <div>\n <label htmlFor=\"activity-timeline\" style={labelStyle}>\n Timeline\n </label>\n <select\n id=\"activity-timeline\"\n aria-label=\"Timeline\"\n style={inputStyle}\n value={form.timeline}\n onChange={(e) =>\n setForm((p) => ({ ...p, timeline: e.target.value }))\n }\n >\n {timelines.map((t) => (\n <option key={t.id} value={t.id}>\n {t.name}\n </option>\n ))}\n </select>\n </div>\n )}\n {form.type === \"command\" && (\n <div>\n <label htmlFor=\"activity-command\" style={labelStyle}>\n Command\n </label>\n <input\n id=\"activity-command\"\n aria-label=\"Command\"\n style={{\n ...inputStyle,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n value={form.command}\n onChange={(e) =>\n setForm((p) => ({ ...p, command: e.target.value }))\n }\n placeholder='cmd(\"TARGET COMMAND\")'\n />\n </div>\n )}\n {form.type === \"script\" && (\n <div>\n <label htmlFor=\"activity-script\" style={labelStyle}>\n Script Path\n </label>\n <input\n id=\"activity-script\"\n aria-label=\"Script path\"\n style={{\n ...inputStyle,\n fontFamily: tokens.typography.fontFamily.mono,\n }}\n value={form.script}\n onChange={(e) => setForm((p) => ({ ...p, script: e.target.value }))}\n placeholder=\"/scripts/ops/collect.rb\"\n />\n </div>\n )}\n <div>\n <label htmlFor=\"activity-description\" style={labelStyle}>\n Description\n </label>\n <textarea\n id=\"activity-description\"\n aria-label=\"Description\"\n style={{ ...inputStyle, minHeight: 48, resize: \"vertical\" }}\n value={form.description}\n onChange={(e) =>\n setForm((p) => ({ ...p, description: e.target.value }))\n }\n placeholder=\"Notes...\"\n />\n </div>\n\n {/* Metadata KV */}\n <div>\n <div style={labelStyle}>Metadata</div>\n <div style={{ display: \"flex\", gap: 4, marginBottom: 4 }}>\n <input\n aria-label=\"Metadata key\"\n style={{ ...inputStyle, flex: 1 }}\n value={metaKey}\n onChange={(e) => setMetaKey(e.target.value)}\n placeholder=\"Key\"\n />\n <input\n aria-label=\"Metadata value\"\n style={{ ...inputStyle, flex: 1 }}\n value={metaValue}\n onChange={(e) => setMetaValue(e.target.value)}\n placeholder=\"Value\"\n />\n <button\n onClick={addMetadata}\n style={{\n background: tokens.colors.interactive.default,\n color: tokens.colors.text.inverse,\n border: \"none\",\n borderRadius: tokens.borderRadius.md,\n padding: `0 ${tokens.spacing.sm}px`,\n fontSize: tokens.typography.fontSize.xs,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n }}\n >\n +\n </button>\n </div>\n {Object.keys(form.metadata).length > 0 && (\n <div style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" }}>\n {Object.entries(form.metadata).map(([k, v]) => (\n <span\n key={k}\n style={{\n fontSize: tokens.typography.fontSize.micro,\n background: tokens.colors.background.surface,\n padding: `2px 6px`,\n borderRadius: tokens.borderRadius.sm,\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.xs,\n }}\n >\n {k}: {v}\n <button\n type=\"button\"\n aria-label={`Remove metadata ${k}`}\n onClick={() =>\n setForm((p) => {\n const m = { ...p.metadata };\n delete m[k];\n return { ...p, metadata: m };\n })\n }\n style={{\n cursor: \"pointer\",\n color: tokens.colors.status.critical,\n fontWeight: 500,\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Hazardous toggle */}\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: tokens.typography.fontSize.xs,\n cursor: \"pointer\",\n }}\n >\n <input\n aria-label=\"Hazardous activity\"\n type=\"checkbox\"\n checked={form.hazardous}\n onChange={(e) =>\n setForm((p) => ({ ...p, hazardous: e.target.checked }))\n }\n />\n <span\n style={{\n color: form.hazardous\n ? tokens.colors.status.critical\n : tokens.colors.text.secondary,\n }}\n >\n ⚠ Hazardous Activity\n </span>\n </label>\n\n {/* Buttons */}\n <div\n style={{\n display: \"flex\",\n gap: 6,\n justifyContent: \"flex-end\",\n marginTop: 4,\n }}\n >\n <button\n onClick={onCancel}\n style={{\n background: \"transparent\",\n color: tokens.colors.text.muted,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md,\n padding: `${tokens.spacing.xs}px 14px`,\n fontSize: tokens.typography.fontSize.xs,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n }}\n >\n Cancel\n </button>\n <button\n onClick={() => onSubmit(form)}\n disabled={!form.title.trim()}\n style={{\n background: tokens.colors.interactive.default,\n color: tokens.colors.text.inverse,\n border: \"none\",\n borderRadius: tokens.borderRadius.md,\n padding: `${tokens.spacing.xs}px 14px`,\n fontSize: tokens.typography.fontSize.xs,\n cursor: form.title.trim() ? \"pointer\" : \"not-allowed\",\n fontWeight: 500,\n opacity: form.title.trim() ? 1 : 0.5,\n transition: \"all 150ms ease\",\n }}\n >\n Create Activity\n </button>\n </div>\n </div>\n );\n});\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport const ActivityPlanner = memo(function ActivityPlanner({\n activities,\n timelines,\n selectedDate,\n height = 500,\n title = \"Activity Planner\",\n readOnly = false,\n showOverlapWarning = true,\n onActivityCreate,\n onActivityUpdate: _onActivityUpdate,\n onActivityDelete,\n onViewInCalendar,\n onViewInTimeline,\n className = \"\",\n}: ActivityPlannerProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme =\n theme === \"transparent\" ||\n theme === \"transparent-bold\" ||\n theme === \"transparent-minimal\";\n const [showForm, setShowForm] = useState(false);\n const [filter, setFilter] = useState(\"\");\n const [sortBy, setSortBy] = useState<\"time\" | \"status\" | \"timeline\">(\"time\");\n const listRef = useRef<HTMLDivElement>(null);\n\n // Overlap detection\n const overlaps = useMemo(() => {\n const pairs: [string, string][] = [];\n for (let i = 0; i < activities.length; i++) {\n for (let j = i + 1; j < activities.length; j++) {\n if (checkOverlap(activities[i], activities[j])) {\n pairs.push([activities[i].id, activities[j].id]);\n }\n }\n }\n return new Set(pairs.flat());\n }, [activities]);\n\n // Sort and filter\n const displayActivities = useMemo(() => {\n let list = [...activities];\n if (filter) {\n const lf = filter.toLowerCase();\n list = list.filter(\n (a) =>\n a.title.toLowerCase().includes(lf) ||\n a.description?.toLowerCase().includes(lf) ||\n a.timeline?.toLowerCase().includes(lf) ||\n a.command?.toLowerCase().includes(lf),\n );\n }\n switch (sortBy) {\n case \"time\":\n list.sort((a, b) => a.start.getTime() - b.start.getTime());\n break;\n case \"status\":\n list.sort((a, b) => (a.status || \"\").localeCompare(b.status || \"\"));\n break;\n case \"timeline\":\n list.sort((a, b) => (a.timeline || \"\").localeCompare(b.timeline || \"\"));\n break;\n }\n return list;\n }, [activities, filter, sortBy]);\n\n // Stats\n const stats = useMemo(\n () => ({\n total: activities.length,\n scheduled: activities.filter(\n (a) => a.status === \"scheduled\" || a.status === \"created\",\n ).length,\n running: activities.filter((a) => a.status === \"started\").length,\n completed: activities.filter((a) => a.status === \"completed\").length,\n errors: activities.filter(\n (a) =>\n a.status === \"error\" ||\n a.status === \"failed\" ||\n a.status === \"crashed\",\n ).length,\n }),\n [activities],\n );\n\n const handleCreate = useCallback(\n (data: ActivityFormData) => {\n onActivityCreate?.({\n title: data.title,\n type: data.type,\n start: new Date(data.start),\n end: new Date(data.end),\n timeline: data.timeline,\n description: data.description,\n command: data.command || undefined,\n script: data.script || undefined,\n metadata:\n Object.keys(data.metadata).length > 0 ? data.metadata : undefined,\n status: \"created\",\n });\n setShowForm(false);\n },\n [onActivityCreate],\n );\n\n const panelPadX = tokens.spacing.md;\n const panelPadY = tokens.spacing.sm;\n\n return (\n <div\n className={`activity-planner ${className}`}\n style={{\n height: typeof height === \"number\" ? height : undefined,\n background: tokens.colors.background.base,\n ...(tokens.colors.border.cardStyle ?? {\n border: `1px solid ${tokens.colors.border.muted}`,\n }),\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 }}\n >\n {/* Header */}\n <div\n style={{\n padding: `${panelPadY}px ${panelPadX}px`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n backdropFilter: \"blur(8px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: tokens.spacing.sm,\n }}\n >\n <span\n style={{ fontWeight: 500, fontSize: tokens.typography.fontSize.sm }}\n >\n {title}\n </span>\n <div\n style={{\n display: \"flex\",\n gap: 10,\n fontSize: tokens.typography.fontSize.xxs,\n color: tokens.colors.text.muted,\n }}\n >\n <span>Scheduled {stats.scheduled}</span>\n <span style={{ color: tokens.colors.text.secondary }}>\n Running {stats.running}\n </span>\n <span style={{ color: tokens.colors.text.secondary }}>\n Completed {stats.completed}\n </span>\n {stats.errors > 0 && (\n <span style={{ color: tokens.colors.status.critical }}>\n Errors {stats.errors}\n </span>\n )}\n </div>\n </div>\n {!readOnly && (\n <button\n onClick={() => setShowForm(!showForm)}\n style={{\n background: showForm\n ? tokens.colors.status.critical + \"22\"\n : tokens.colors.interactive.default,\n color: showForm\n ? tokens.colors.status.critical\n : tokens.colors.text.inverse,\n border: \"none\",\n borderRadius: tokens.borderRadius.md,\n padding: \"3px 10px\",\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 150ms ease\",\n }}\n >\n {showForm ? \"✕ Cancel\" : \"+ New Activity\"}\n </button>\n )}\n </div>\n\n {/* Create form */}\n {showForm && !readOnly && (\n <div\n style={{\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface + \"88\",\n }}\n >\n <ActivityForm\n timelines={timelines}\n selectedDate={selectedDate}\n tokens={tokens}\n onSubmit={handleCreate}\n onCancel={() => setShowForm(false)}\n />\n </div>\n )}\n\n {/* Search / Sort */}\n <div\n style={{\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\n display: \"flex\",\n gap: 6,\n alignItems: \"center\",\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <input\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n aria-label=\"Search activities\"\n placeholder=\"Search activities...\"\n style={{\n flex: 1,\n background: tokens.colors.background.surface,\n color: tokens.colors.text.primary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md,\n padding: \"3px 8px\",\n fontSize: tokens.typography.fontSize.xxs,\n fontFamily: tokens.typography.fontFamily.primary,\n transition: \"all 150ms ease\",\n }}\n />\n <select\n value={sortBy}\n onChange={(e) =>\n setSortBy(e.target.value as \"time\" | \"status\" | \"timeline\")\n }\n aria-label=\"Sort activities\"\n style={{\n background: tokens.colors.background.surface,\n color: tokens.colors.text.secondary,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.md,\n padding: \"3px 6px\",\n fontSize: tokens.typography.fontSize.xxs,\n transition: \"all 150ms ease\",\n }}\n >\n <option value=\"time\">Sort: Time</option>\n <option value=\"status\">Sort: Status</option>\n <option value=\"timeline\">Sort: Timeline</option>\n </select>\n </div>\n\n {/* Activity list */}\n <div ref={listRef} style={{ flex: 1, overflow: \"auto\", padding: 8 }}>\n {displayActivities.length === 0 ? (\n <div\n style={{\n textAlign: \"center\",\n color: tokens.colors.text.muted,\n padding: 40,\n fontSize: tokens.typography.fontSize.xs,\n }}\n >\n {filter ? \"No matching activities\" : \"No activities scheduled\"}\n </div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {displayActivities.map((a) => {\n const color = a.color || getStatusColor(a.status, tokens);\n const hasOverlap = overlaps.has(a.id);\n return (\n <div\n key={a.id}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"24px 1fr auto\",\n alignItems: \"center\",\n gap: tokens.spacing.sm,\n padding: \"6px 10px\",\n background: hasOverlap\n ? `${tokens.colors.status.caution}10`\n : `${color}08`,\n borderLeft: `3px solid ${color}`,\n borderRadius: tokens.borderRadius.md,\n fontSize: tokens.typography.fontSize.xs,\n cursor: \"pointer\",\n border:\n hasOverlap && showOverlapWarning\n ? `1px solid ${tokens.colors.status.caution}44`\n : undefined,\n transition: \"all 150ms ease\",\n }}\n >\n {/* Status icon */}\n <div style={{ textAlign: \"center\" }}>\n <span\n style={{\n color,\n fontSize: tokens.typography.fontSize.sm,\n fontWeight: 500,\n }}\n >\n {getStatusIcon(a.status)}\n </span>\n </div>\n {/* Info */}\n <div style={{ overflow: \"hidden\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 2,\n }}\n >\n <span\n style={{\n fontWeight: 500,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {a.title}\n </span>\n {a.timeline && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.micro,\n background: tokens.colors.background.surface,\n padding: `0 ${tokens.spacing.xs}px`,\n borderRadius: tokens.borderRadius.sm,\n color: tokens.colors.text.muted,\n }}\n >\n {a.timeline}\n </span>\n )}\n {hasOverlap && showOverlapWarning && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.micro,\n color: tokens.colors.status.caution,\n fontWeight: 500,\n }}\n >\n ⚠ OVERLAP\n </span>\n )}\n </div>\n <div\n style={{\n fontSize: tokens.typography.fontSize.micro,\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.muted,\n }}\n >\n {formatDate(a.start)} {formatTime(a.start)}\n {a.end ? ` → ${formatTime(a.end)}` : \"\"}\n </div>\n </div>\n {/* Actions */}\n <div style={{ display: \"flex\", gap: 4 }}>\n {onViewInCalendar && (\n <button\n aria-label={`View ${a.title} in calendar`}\n onClick={() => onViewInCalendar(a)}\n style={actionBtnStyle(tokens)}\n title=\"View in Calendar\"\n >\n Calendar\n </button>\n )}\n {onViewInTimeline && (\n <button\n aria-label={`View ${a.title} in timeline`}\n onClick={() => onViewInTimeline(a)}\n style={actionBtnStyle(tokens)}\n title=\"View in Timeline\"\n >\n Timeline\n </button>\n )}\n {!readOnly && onActivityDelete && (\n <button\n aria-label={`Delete ${a.title}`}\n onClick={() => onActivityDelete(a.id)}\n style={{\n ...actionBtnStyle(tokens),\n color: tokens.colors.status.critical,\n }}\n title=\"Delete\"\n >\n Delete\n </button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n background: tokens.colors.background.surface,\n fontSize: tokens.typography.fontSize.micro,\n color: tokens.colors.text.muted,\n display: \"flex\",\n justifyContent: \"space-between\",\n }}\n >\n <span>\n {displayActivities.length} / {activities.length} activities\n </span>\n {overlaps.size > 0 && showOverlapWarning && (\n <span style={{ color: tokens.colors.status.caution }}>\n ⚠ {overlaps.size} overlapping activities\n </span>\n )}\n </div>\n </div>\n );\n});\n\nfunction actionBtnStyle(\n tokens: ReturnType<typeof useTheme>[\"tokens\"],\n): React.CSSProperties {\n return {\n background: \"transparent\",\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n padding: `2px ${tokens.spacing.xs}px`,\n fontSize: tokens.typography.fontSize.xxs,\n cursor: \"pointer\",\n lineHeight: 1,\n transition: \"all 150ms ease\",\n };\n}\n\nexport default ActivityPlanner;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
|
|
3
2
|
/** Camera capture arguments */
|
|
4
3
|
export interface CaptureArgs {
|
|
5
4
|
monochromatic: boolean;
|
|
@@ -18,7 +17,7 @@ export interface CaptureArgs {
|
|
|
18
17
|
* - 'png' → lossless, larger file (good for scientific/archival use)
|
|
19
18
|
* - 'jpeg' → lossy, smaller file (~3-5× smaller than PNG at q=0.92)
|
|
20
19
|
*/
|
|
21
|
-
format?:
|
|
20
|
+
format?: "png" | "jpeg";
|
|
22
21
|
/**
|
|
23
22
|
* JPEG quality factor (0–1). Only used when format='jpeg'. Default: 0.92.
|
|
24
23
|
* Ignored for PNG (which is always lossless).
|
|
@@ -27,7 +26,7 @@ export interface CaptureArgs {
|
|
|
27
26
|
}
|
|
28
27
|
/** Incoming capture request */
|
|
29
28
|
export interface CaptureRequest {
|
|
30
|
-
type:
|
|
29
|
+
type: "capture";
|
|
31
30
|
req_id: number;
|
|
32
31
|
args: CaptureArgs;
|
|
33
32
|
}
|