@zendir/ui 0.1.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 +19 -0
- package/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/react/3d/EarthViewer.d.ts +46 -0
- package/dist/react/3d/EarthViewer.js +836 -0
- package/dist/react/3d/EarthViewer.js.map +1 -0
- package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
- package/dist/react/3d/SolarSystemViewer.js +372 -0
- package/dist/react/3d/SolarSystemViewer.js.map +1 -0
- package/dist/react/3d/ZenSpace3D.d.ts +16 -0
- package/dist/react/3d/ZenSpace3D.js +1253 -0
- package/dist/react/3d/ZenSpace3D.js.map +1 -0
- package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
- package/dist/react/3d/ZenSpace3DCesium.js +186 -0
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
- package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
- package/dist/react/3d/ZenSpace3DShaders.js +94 -0
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
- package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
- package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
- package/dist/react/3d/ZenSpace3DUtils.js +213 -0
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
- package/dist/react/3d/index.d.ts +23 -0
- package/dist/react/3d/threeLoader.d.ts +22 -0
- package/dist/react/3d/threeLoader.js +18 -0
- package/dist/react/3d/threeLoader.js.map +1 -0
- package/dist/react/astro/ClassificationBanner.d.ts +25 -0
- package/dist/react/astro/ClassificationBanner.js +83 -0
- package/dist/react/astro/ClassificationBanner.js.map +1 -0
- package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
- package/dist/react/astro/GlobalStatusBar.js +165 -0
- package/dist/react/astro/GlobalStatusBar.js.map +1 -0
- package/dist/react/astro/MissionClock.d.ts +169 -0
- package/dist/react/astro/MissionClock.js +411 -0
- package/dist/react/astro/MissionClock.js.map +1 -0
- package/dist/react/astro/MonitoringIcon.d.ts +60 -0
- package/dist/react/astro/MonitoringIcon.js +369 -0
- package/dist/react/astro/MonitoringIcon.js.map +1 -0
- package/dist/react/astro/Notification.d.ts +42 -0
- package/dist/react/astro/Notification.js +156 -0
- package/dist/react/astro/Notification.js.map +1 -0
- package/dist/react/astro/Progress.d.ts +39 -0
- package/dist/react/astro/Progress.js +149 -0
- package/dist/react/astro/Progress.js.map +1 -0
- package/dist/react/astro/SimulationControls.d.ts +136 -0
- package/dist/react/astro/SimulationControls.js +668 -0
- package/dist/react/astro/SimulationControls.js.map +1 -0
- package/dist/react/astro/StatusIndicator.d.ts +34 -0
- package/dist/react/astro/StatusIndicator.js +189 -0
- package/dist/react/astro/StatusIndicator.js.map +1 -0
- package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
- package/dist/react/astro/UnifiedTimeline.js +1768 -0
- package/dist/react/astro/UnifiedTimeline.js.map +1 -0
- package/dist/react/astro/index.d.ts +63 -0
- package/dist/react/cards/AccessCard.d.ts +37 -0
- package/dist/react/cards/AccessCard.js +410 -0
- package/dist/react/cards/AccessCard.js.map +1 -0
- package/dist/react/cards/OrbitCard.d.ts +31 -0
- package/dist/react/cards/OrbitCard.js +372 -0
- package/dist/react/cards/OrbitCard.js.map +1 -0
- package/dist/react/cards/SpacecraftCard.d.ts +54 -0
- package/dist/react/cards/SpacecraftCard.js +941 -0
- package/dist/react/cards/SpacecraftCard.js.map +1 -0
- package/dist/react/cards/TelemetryCard.d.ts +40 -0
- package/dist/react/cards/TelemetryCard.js +742 -0
- package/dist/react/cards/TelemetryCard.js.map +1 -0
- package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
- package/dist/react/cards/TelemetryStreamCard.js +309 -0
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
- package/dist/react/cards/index.d.ts +13 -0
- package/dist/react/charts/GroundTrackMap.d.ts +112 -0
- package/dist/react/charts/GroundTrackMap.js +1123 -0
- package/dist/react/charts/GroundTrackMap.js.map +1 -0
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
- package/dist/react/charts/index.d.ts +10 -0
- package/dist/react/charts/unified/AstroChart.d.ts +24 -0
- package/dist/react/charts/unified/AstroChart.js +1405 -0
- package/dist/react/charts/unified/AstroChart.js.map +1 -0
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
- package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
- package/dist/react/charts/unified/domain.d.ts +845 -0
- package/dist/react/charts/unified/domain.js +3168 -0
- package/dist/react/charts/unified/domain.js.map +1 -0
- package/dist/react/charts/unified/generators.d.ts +276 -0
- package/dist/react/charts/unified/generators.js +518 -0
- package/dist/react/charts/unified/generators.js.map +1 -0
- package/dist/react/charts/unified/index.d.ts +55 -0
- package/dist/react/charts/unified/presets.d.ts +290 -0
- package/dist/react/charts/unified/presets.js +999 -0
- package/dist/react/charts/unified/presets.js.map +1 -0
- package/dist/react/charts/unified/sync.d.ts +69 -0
- package/dist/react/charts/unified/sync.js +219 -0
- package/dist/react/charts/unified/sync.js.map +1 -0
- package/dist/react/charts/unified/theme.d.ts +447 -0
- package/dist/react/charts/unified/theme.js +562 -0
- package/dist/react/charts/unified/theme.js.map +1 -0
- package/dist/react/charts/unified/types.d.ts +826 -0
- package/dist/react/charts/unified/useChartStream.d.ts +58 -0
- package/dist/react/charts/unified/useChartStream.js +226 -0
- package/dist/react/charts/unified/useChartStream.js.map +1 -0
- package/dist/react/chatgpt/AppCard.d.ts +59 -0
- package/dist/react/chatgpt/AppCard.js +306 -0
- package/dist/react/chatgpt/AppCard.js.map +1 -0
- package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
- package/dist/react/chatgpt/index.d.ts +167 -0
- package/dist/react/chatgpt/index.js +166 -0
- package/dist/react/chatgpt/index.js.map +1 -0
- package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
- package/dist/react/context/DisplaySettingsContext.js +169 -0
- package/dist/react/context/DisplaySettingsContext.js.map +1 -0
- package/dist/react/context/index.d.ts +5 -0
- package/dist/react/core/ActivityPlanner.d.ts +45 -0
- package/dist/react/core/ActivityPlanner.js +532 -0
- package/dist/react/core/ActivityPlanner.js.map +1 -0
- package/dist/react/core/AppBar.d.ts +71 -0
- package/dist/react/core/AppBar.js +817 -0
- package/dist/react/core/AppBar.js.map +1 -0
- package/dist/react/core/AstroIcon.d.ts +84 -0
- package/dist/react/core/AstroIcon.js +1243 -0
- package/dist/react/core/AstroIcon.js.map +1 -0
- package/dist/react/core/Badge.d.ts +27 -0
- package/dist/react/core/Badge.js +134 -0
- package/dist/react/core/Badge.js.map +1 -0
- package/dist/react/core/Button.d.ts +26 -0
- package/dist/react/core/Button.js +306 -0
- package/dist/react/core/Button.js.map +1 -0
- package/dist/react/core/CardHeader.d.ts +34 -0
- package/dist/react/core/CardHeader.js +316 -0
- package/dist/react/core/CardHeader.js.map +1 -0
- package/dist/react/core/ChatPanel.d.ts +627 -0
- package/dist/react/core/ChatPanel.js +1144 -0
- package/dist/react/core/ChatPanel.js.map +1 -0
- package/dist/react/core/Checkbox.d.ts +26 -0
- package/dist/react/core/Checkbox.js +130 -0
- package/dist/react/core/Checkbox.js.map +1 -0
- package/dist/react/core/ColorPickerPanel.d.ts +25 -0
- package/dist/react/core/ColorPickerPanel.js +293 -0
- package/dist/react/core/ColorPickerPanel.js.map +1 -0
- package/dist/react/core/CommandBuilder.d.ts +74 -0
- package/dist/react/core/CommandBuilder.js +518 -0
- package/dist/react/core/CommandBuilder.js.map +1 -0
- package/dist/react/core/ConfirmDialog.d.ts +45 -0
- package/dist/react/core/ConfirmDialog.js +315 -0
- package/dist/react/core/ConfirmDialog.js.map +1 -0
- package/dist/react/core/ConnectionForm.d.ts +57 -0
- package/dist/react/core/ConnectionForm.js +496 -0
- package/dist/react/core/ConnectionForm.js.map +1 -0
- package/dist/react/core/Container.d.ts +51 -0
- package/dist/react/core/Container.js +670 -0
- package/dist/react/core/Container.js.map +1 -0
- package/dist/react/core/CopyButton.d.ts +39 -0
- package/dist/react/core/CopyButton.js +105 -0
- package/dist/react/core/CopyButton.js.map +1 -0
- package/dist/react/core/DataTable.d.ts +113 -0
- package/dist/react/core/DataTable.js +446 -0
- package/dist/react/core/DataTable.js.map +1 -0
- package/dist/react/core/DataValue.d.ts +64 -0
- package/dist/react/core/DataValue.js +545 -0
- package/dist/react/core/DataValue.js.map +1 -0
- package/dist/react/core/Dialog.d.ts +32 -0
- package/dist/react/core/Dialog.js +201 -0
- package/dist/react/core/Dialog.js.map +1 -0
- package/dist/react/core/FileExplorer.d.ts +65 -0
- package/dist/react/core/FileExplorer.js +520 -0
- package/dist/react/core/FileExplorer.js.map +1 -0
- package/dist/react/core/GlassCard.d.ts +129 -0
- package/dist/react/core/GlassCard.js +375 -0
- package/dist/react/core/GlassCard.js.map +1 -0
- package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
- package/dist/react/core/HeaderIconWithStatus.js +157 -0
- package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
- package/dist/react/core/HexViewer.d.ts +143 -0
- package/dist/react/core/HexViewer.js +1106 -0
- package/dist/react/core/HexViewer.js.map +1 -0
- package/dist/react/core/Icon.d.ts +32 -0
- package/dist/react/core/Icon.js +142 -0
- package/dist/react/core/Icon.js.map +1 -0
- package/dist/react/core/ImageGallery.d.ts +41 -0
- package/dist/react/core/ImageGallery.js +320 -0
- package/dist/react/core/ImageGallery.js.map +1 -0
- package/dist/react/core/Input.d.ts +38 -0
- package/dist/react/core/Input.js +288 -0
- package/dist/react/core/Input.js.map +1 -0
- package/dist/react/core/LimitsBar.d.ts +51 -0
- package/dist/react/core/LimitsBar.js +200 -0
- package/dist/react/core/LimitsBar.js.map +1 -0
- package/dist/react/core/LogViewer.d.ts +61 -0
- package/dist/react/core/LogViewer.js +599 -0
- package/dist/react/core/LogViewer.js.map +1 -0
- package/dist/react/core/MessageStream.d.ts +58 -0
- package/dist/react/core/MessageStream.js +455 -0
- package/dist/react/core/MessageStream.js.map +1 -0
- package/dist/react/core/MissionCalendar.d.ts +81 -0
- package/dist/react/core/MissionCalendar.js +1049 -0
- package/dist/react/core/MissionCalendar.js.map +1 -0
- package/dist/react/core/NumberInput.d.ts +85 -0
- package/dist/react/core/NumberInput.js +507 -0
- package/dist/react/core/NumberInput.js.map +1 -0
- package/dist/react/core/PacketViewer.d.ts +73 -0
- package/dist/react/core/PacketViewer.js +431 -0
- package/dist/react/core/PacketViewer.js.map +1 -0
- package/dist/react/core/Pagination.d.ts +30 -0
- package/dist/react/core/Pagination.js +190 -0
- package/dist/react/core/Pagination.js.map +1 -0
- package/dist/react/core/PinInput.d.ts +41 -0
- package/dist/react/core/PinInput.js +210 -0
- package/dist/react/core/PinInput.js.map +1 -0
- package/dist/react/core/Popover.d.ts +55 -0
- package/dist/react/core/Popover.js +288 -0
- package/dist/react/core/Popover.js.map +1 -0
- package/dist/react/core/Select.d.ts +42 -0
- package/dist/react/core/Select.js +303 -0
- package/dist/react/core/Select.js.map +1 -0
- package/dist/react/core/SideNav.d.ts +103 -0
- package/dist/react/core/SideNav.js +551 -0
- package/dist/react/core/SideNav.js.map +1 -0
- package/dist/react/core/SidePanel.d.ts +33 -0
- package/dist/react/core/SidePanel.js +199 -0
- package/dist/react/core/SidePanel.js.map +1 -0
- package/dist/react/core/Tabs.d.ts +47 -0
- package/dist/react/core/Tabs.js +129 -0
- package/dist/react/core/Tabs.js.map +1 -0
- package/dist/react/core/Toast.d.ts +56 -0
- package/dist/react/core/Toast.js +229 -0
- package/dist/react/core/Toast.js.map +1 -0
- package/dist/react/core/Toggle.d.ts +22 -0
- package/dist/react/core/Toggle.js +151 -0
- package/dist/react/core/Toggle.js.map +1 -0
- package/dist/react/core/Tooltip.d.ts +19 -0
- package/dist/react/core/Tooltip.js +179 -0
- package/dist/react/core/Tooltip.js.map +1 -0
- package/dist/react/core/Typography.d.ts +127 -0
- package/dist/react/core/Typography.js +187 -0
- package/dist/react/core/Typography.js.map +1 -0
- package/dist/react/core/index.d.ts +108 -0
- package/dist/react/core/layout/Box.d.ts +77 -0
- package/dist/react/core/layout/Box.js +126 -0
- package/dist/react/core/layout/Box.js.map +1 -0
- package/dist/react/core/layout/Center.d.ts +20 -0
- package/dist/react/core/layout/Center.js +34 -0
- package/dist/react/core/layout/Center.js.map +1 -0
- package/dist/react/core/layout/Divider.d.ts +16 -0
- package/dist/react/core/layout/Divider.js +108 -0
- package/dist/react/core/layout/Divider.js.map +1 -0
- package/dist/react/core/layout/Flex.d.ts +30 -0
- package/dist/react/core/layout/Flex.js +128 -0
- package/dist/react/core/layout/Flex.js.map +1 -0
- package/dist/react/core/layout/Grid.d.ts +36 -0
- package/dist/react/core/layout/Grid.js +142 -0
- package/dist/react/core/layout/Grid.js.map +1 -0
- package/dist/react/core/layout/Spacer.d.ts +8 -0
- package/dist/react/core/layout/Spacer.js +31 -0
- package/dist/react/core/layout/Spacer.js.map +1 -0
- package/dist/react/core/layout/Stack.d.ts +54 -0
- package/dist/react/core/layout/Stack.js +74 -0
- package/dist/react/core/layout/Stack.js.map +1 -0
- package/dist/react/core/layout/index.d.ts +38 -0
- package/dist/react/core/layout/responsive.d.ts +23 -0
- package/dist/react/core/layout/responsive.js +26 -0
- package/dist/react/core/layout/responsive.js.map +1 -0
- package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
- package/dist/react/core/layout/useBreakpoint.js +73 -0
- package/dist/react/core/layout/useBreakpoint.js.map +1 -0
- package/dist/react/core/propertyConfig.d.ts +443 -0
- package/dist/react/core/propertyConfig.js +399 -0
- package/dist/react/core/propertyConfig.js.map +1 -0
- package/dist/react/hooks/index.d.ts +21 -0
- package/dist/react/hooks/useAccessWindows.d.ts +66 -0
- package/dist/react/hooks/useCompactMode.d.ts +82 -0
- package/dist/react/hooks/useCompactMode.js +62 -0
- package/dist/react/hooks/useCompactMode.js.map +1 -0
- package/dist/react/hooks/useLiveSelection.d.ts +57 -0
- package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
- package/dist/react/hooks/useSimulationTime.d.ts +61 -0
- package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
- package/dist/react/hooks/useSpacecraftPosition.js +89 -0
- package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
- package/dist/react/hooks/useTelemetry.d.ts +55 -0
- package/dist/react/hooks/useTelemetry.js +73 -0
- package/dist/react/hooks/useTelemetry.js.map +1 -0
- package/dist/react/hooks/useZendirSession.d.ts +109 -0
- package/dist/react/hooks/useZendirSession.js +148 -0
- package/dist/react/hooks/useZendirSession.js.map +1 -0
- package/dist/react/index.d.ts +74 -0
- package/dist/react/shared/ErrorBoundary.d.ts +63 -0
- package/dist/react/shared/ErrorBoundary.js +142 -0
- package/dist/react/shared/ErrorBoundary.js.map +1 -0
- package/dist/react/shared/Skeleton.d.ts +110 -0
- package/dist/react/shared/Skeleton.js +324 -0
- package/dist/react/shared/Skeleton.js.map +1 -0
- package/dist/react/shared/index.d.ts +12 -0
- package/dist/react/theme/ThemeProvider.d.ts +385 -0
- package/dist/react/theme/ThemeProvider.js +1096 -0
- package/dist/react/theme/ThemeProvider.js.map +1 -0
- package/dist/react/theme/astro-tokens.d.ts +153 -0
- package/dist/react/theme/cardAccent.d.ts +75 -0
- package/dist/react/theme/cardAccent.js +137 -0
- package/dist/react/theme/cardAccent.js.map +1 -0
- package/dist/react/theme/config.d.ts +39 -0
- package/dist/react/theme/index.d.ts +9 -0
- package/dist/react/types.d.ts +360 -0
- package/dist/react/types.js +58 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/utils/index.d.ts +247 -0
- package/dist/react/utils/index.js +423 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
- package/dist/react/visualizations/EclipseTimerCard.js +250 -0
- package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
- package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
- package/dist/react/visualizations/LinkBudgetCard.js +444 -0
- package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
- package/dist/react/visualizations/NavBallCard.d.ts +17 -0
- package/dist/react/visualizations/NavBallCard.js +243 -0
- package/dist/react/visualizations/NavBallCard.js.map +1 -0
- package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
- package/dist/react/visualizations/PropulsionCard.js +298 -0
- package/dist/react/visualizations/PropulsionCard.js.map +1 -0
- package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
- package/dist/react/visualizations/SensorFootprintCard.js +326 -0
- package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
- package/dist/react/visualizations/index.d.ts +17 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +421 -0
- package/dist/react.js.map +1 -0
- package/dist/shaders/atmosphere.frag.js +5 -0
- package/dist/shaders/atmosphere.frag.js.map +1 -0
- package/dist/shaders/atmosphere.vert.js +5 -0
- package/dist/shaders/atmosphere.vert.js.map +1 -0
- package/dist/shaders/stars.frag.js +5 -0
- package/dist/shaders/stars.frag.js.map +1 -0
- package/dist/shaders/stars.vert.js +5 -0
- package/dist/shaders/stars.vert.js.map +1 -0
- package/dist/style.css +143 -0
- package/dist/tokens/index.d.ts +296 -0
- package/dist/tokens/index.js +263 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/tokens.css +155 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +220 -0
- package/sdk-stub.js +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnifiedTimeline.js","sources":["../../../src/react/astro/UnifiedTimeline.tsx"],"sourcesContent":["/**\n * @zendir/ui - UnifiedTimeline Component\n * \n * Enterprise-grade unified timeline with seamless view switching between\n * Gantt chart view and Event list view.\n * \n * Design Philosophy (Apple/Google inspired):\n * - Single component, multiple views\n * - Smooth transitions between views\n * - Consistent data model\n * - Flexible for teams and single user\n * \n * @example\n * ```tsx\n * <UnifiedTimeline\n * title=\"Mission Timeline\"\n * events={events}\n * tracks={tracks}\n * defaultView=\"list\"\n * />\n * ```\n */\n\nimport React, { memo, useState, useMemo, useCallback, useRef } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, safeAccentText } from '../utils';\nimport { Icon } from '../core/Icon';\nimport { Badge } from '../core/Badge';\nimport { Tooltip } from '../core/Tooltip';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TimelineViewMode = 'list' | 'chart' | 'scatter';\n\nexport interface TimelineEvent {\n /** Unique identifier */\n id: string;\n /** Event title */\n title: string;\n /** Start time */\n start: Date;\n /** End time (optional for point events) */\n end?: Date;\n /** Track/category this event belongs to */\n track?: string;\n /** Status for coloring */\n status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';\n /** Badge text */\n badge?: string;\n /** Badge variant - uses AstroUXDS status terms */\n badgeVariant?: 'default' | 'primary' | 'normal' | 'caution' | 'serious' | 'critical';\n /** Subtitle/description */\n subtitle?: string;\n /** Additional timestamps to display in list view */\n timestamps?: {\n label: string;\n value: string;\n status?: 'normal' | 'standby' | 'caution' | 'serious' | 'critical' | 'off';\n }[];\n /** Arguments/metadata */\n arguments?: Record<string, string | number | boolean>;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\nexport interface TimelineTrackDef {\n /** Track identifier */\n id: string;\n /** Display label */\n label: string;\n /** Track height in pixels */\n height?: number;\n}\n\nexport type TimeFormat = 'relative' | 'absolute' | 'utc';\n\nexport interface TimelineFilter {\n /** Filter by track IDs */\n tracks?: string[];\n /** Filter by status */\n status?: TimelineEvent['status'][];\n /** Search query */\n search?: string;\n}\n\nexport interface UnifiedTimelineProps {\n /** Timeline title */\n title?: string;\n /** Events to display */\n events: TimelineEvent[];\n /** Track definitions for chart view */\n tracks?: TimelineTrackDef[];\n /** Start time for chart view (auto-calculated if not provided) */\n start?: Date;\n /** End time for chart view (auto-calculated if not provided) */\n end?: Date;\n /** Default view mode */\n defaultView?: TimelineViewMode;\n /** Controlled view mode */\n viewMode?: TimelineViewMode;\n /** View mode change handler */\n onViewModeChange?: (mode: TimelineViewMode) => void;\n /** Event click handler */\n onEventClick?: (event: TimelineEvent) => void;\n /** Show view toggle */\n showViewToggle?: boolean;\n /** Max height for scrollable container */\n maxHeight?: string | number;\n /** Track height for chart view */\n trackHeight?: number;\n /** Custom className */\n className?: string;\n /** Time format for axis labels */\n timeFormat?: TimeFormat;\n /** Enable zoom controls */\n zoomable?: boolean;\n /** Initial zoom level (1 = 100%) */\n initialZoom?: number;\n /** Show filter controls */\n showFilters?: boolean;\n /** Controlled filter state */\n filter?: TimelineFilter;\n /** Filter change handler */\n onFilterChange?: (filter: TimelineFilter) => void;\n /** Show event count badge */\n showCount?: boolean;\n /** Loading state */\n loading?: boolean;\n /** Reference time for relative format (defaults to start of range) */\n referenceTime?: Date;\n \n // === Playhead Options (Astro UX) ===\n /** Show playhead indicator at current time */\n showPlayhead?: boolean;\n /** Custom playhead time (for simulation mode) */\n playheadTime?: Date;\n /** Callback when playhead time changes (for interactive playhead) */\n onPlayheadChange?: (time: Date) => void;\n \n // === Day Markers (Astro UX) ===\n /** Show day markers at midnight */\n showDayMarkers?: boolean;\n}\n\n// ============================================================================\n// Event List Item (for list view)\n// ============================================================================\n\n/** Astro UX status shapes per official spec: filled circle (normal), ring (standby), small circle (off), square (caution), diamond (serious), triangle (critical) */\nfunction TimelineStatusMarker({\n status,\n fillColor,\n size = 12,\n}: {\n status?: TimelineEvent['status'];\n fillColor: string;\n size?: number;\n}): React.ReactElement {\n const effectiveStatus = status ?? 'normal';\n const glow = `${fillColor}60`;\n\n switch (effectiveStatus) {\n case 'off':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <circle cx=\"6\" cy=\"6\" r=\"3\" fill={fillColor} />\n </svg>\n );\n case 'standby':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <circle cx=\"6\" cy=\"6\" r=\"3.5\" fill=\"none\" stroke={fillColor} strokeWidth=\"2\" />\n </svg>\n );\n case 'normal':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={fillColor} />\n </svg>\n );\n case 'caution':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={fillColor} />\n </svg>\n );\n case 'serious':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <polygon points=\"6,1 11,6 6,11 1,6\" fill={fillColor} />\n </svg>\n );\n case 'critical':\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <polygon points=\"6,11 1,2 11,2\" fill={fillColor} />\n </svg>\n );\n default: // normal\n return (\n <svg viewBox=\"0 0 12 12\" width={size} height={size} style={{ flexShrink: 0, filter: `drop-shadow(0 0 4px ${glow})` }}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={fillColor} />\n </svg>\n );\n }\n}\n\ninterface EventListItemProps {\n event: TimelineEvent;\n isLast: boolean;\n onEventClick?: (event: TimelineEvent) => void;\n}\n\nconst EventListItem = memo(function EventListItem({\n event,\n isLast,\n onEventClick,\n}: EventListItemProps) {\n const { tokens } = useTheme();\n const [expanded, setExpanded] = useState(false);\n const [hovered, setHovered] = useState(false);\n \n const hasArguments = event.arguments && Object.keys(event.arguments).length > 0;\n const argumentCount = hasArguments ? Object.keys(event.arguments!).length : 0;\n \n // Generate timestamps from start/end if not provided\n const timestamps = event.timestamps || [\n { label: 'Time', value: event.start.toLocaleString(), status: event.status as any },\n ];\n\n // Single source of truth: badgeVariant overrides status so badge and marker always match\n const displayStatus: TimelineEvent['status'] =\n event.badgeVariant && event.badgeVariant !== 'default' && event.badgeVariant !== 'primary'\n ? event.badgeVariant\n : (event.status ?? 'normal');\n const markerColor = tokens.colors.status[displayStatus];\n\n return (\n <div style={{ display: 'flex', gap: '16px' }}>\n {/* Timeline indicator - Astro UX status shape (circle/square/diamond/triangle) */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: '20px',\n flexShrink: 0,\n }}\n >\n <div style={{ marginTop: '8px' }}>\n <TimelineStatusMarker status={displayStatus} fillColor={markerColor} size={12} />\n </div>\n {!isLast && (\n <div\n style={{\n width: '2px',\n flex: 1,\n backgroundColor: `${tokens.colors.accent.primary}30`,\n marginTop: '4px',\n }}\n />\n )}\n </div>\n \n {/* Event card */}\n <div\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={() => onEventClick?.(event)}\n style={{\n flex: 1,\n marginBottom: '16px',\n padding: '16px 20px',\n backgroundColor: tokens.colors.background.surface,\n border: `1px solid ${hovered ? tokens.colors.accent.primary : tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.lg,\n cursor: onEventClick ? 'pointer' : 'default',\n transition: 'all 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: hovered \n ? `0 4px 20px ${tokens.colors.accent.primary}15, 0 0 0 1px ${tokens.colors.accent.primary}20` \n : 'none',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: timestamps.length ? '12px' : 0,\n }}\n >\n <h4\n style={{\n margin: 0,\n fontSize: '0.875rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tokens.colors.text.primary,\n letterSpacing: '0.02em',\n textTransform: 'uppercase',\n }}\n >\n {event.title}\n </h4>\n {event.badge && (\n <Badge\n variant={displayStatus === 'caution' || displayStatus === 'serious' ? 'filled' : 'outline'}\n size=\"small\"\n status={\n displayStatus === 'critical' ? 'critical' :\n displayStatus === 'serious' ? 'serious' :\n displayStatus === 'caution' ? 'caution' :\n displayStatus === 'normal' ? 'normal' :\n undefined\n }\n >\n {event.badge}\n </Badge>\n )}\n </div>\n \n {/* Subtitle */}\n {event.subtitle && (\n <p\n style={{\n margin: '0 0 12px 0',\n fontSize: '0.8125rem',\n color: tokens.colors.text.secondary,\n }}\n >\n {event.subtitle}\n </p>\n )}\n \n {/* Timestamps */}\n {timestamps.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n {timestamps.map((ts, index) => (\n <div\n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: '0.8125rem',\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n color: tokens.colors.text.secondary,\n }}\n >\n <TimelineStatusMarker\n status={ts.status ?? 'normal'}\n fillColor={ts.status\n ? tokens.colors.status[ts.status as keyof typeof tokens.colors.status]\n : tokens.colors.accent.primary}\n size={6}\n />\n {ts.label}\n </span>\n <span\n style={{\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.primary,\n fontWeight: 500,\n }}\n >\n {ts.value}\n </span>\n </div>\n ))}\n </div>\n )}\n \n {/* Arguments toggle */}\n {hasArguments && (\n <>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n marginTop: '12px',\n padding: 0,\n background: 'none',\n border: 'none',\n color: tokens.colors.text.secondary,\n fontSize: '0.75rem',\n cursor: 'pointer',\n transition: 'color 150ms ease',\n }}\n onMouseEnter={(e) => e.currentTarget.style.color = tokens.colors.accent.primary}\n onMouseLeave={(e) => e.currentTarget.style.color = tokens.colors.text.secondary}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n style={{\n transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 150ms ease',\n }}\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n {expanded ? 'Hide' : 'Show'} Arguments ({argumentCount})\n </button>\n \n {expanded && (\n <div\n style={{\n marginTop: '12px',\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n paddingTop: '12px',\n animation: 'zendir-expand 200ms ease-out',\n }}\n >\n <style>\n {`@keyframes zendir-expand { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } }`}\n </style>\n {Object.entries(event.arguments!).map(([key, value]) => (\n <div\n key={key}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n marginBottom: '4px',\n backgroundColor: tokens.colors.background.elevated,\n borderRadius: tokens.borderRadius.md,\n fontSize: '0.8125rem',\n }}\n >\n <span style={{ color: tokens.colors.text.secondary }}>{key}</span>\n <span\n style={{\n fontFamily: tokens.typography.fontFamily.mono,\n color: typeof value === 'boolean'\n ? value ? tokens.colors.status.normal : tokens.colors.text.tertiary\n : tokens.colors.text.primary,\n fontWeight: 500,\n }}\n >\n {String(value)}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n});\n\n// ============================================================================\n// Chart View (Gantt-style) - Matches original Timeline design\n// ============================================================================\n\ninterface ChartViewProps {\n events: TimelineEvent[];\n tracks: TimelineTrackDef[];\n start: Date;\n end: Date;\n trackHeight: number;\n onEventClick?: (event: TimelineEvent) => void;\n zoom: number;\n showPlayhead?: boolean;\n playheadTime?: Date;\n onPlayheadChange?: (time: Date) => void;\n showDayMarkers?: boolean;\n}\n\nconst ChartView = memo(function ChartView({\n events,\n tracks,\n start,\n end,\n trackHeight,\n onEventClick,\n zoom,\n showPlayhead = true,\n playheadTime,\n onPlayheadChange: _onPlayheadChange,\n showDayMarkers = true,\n}: ChartViewProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [hoveredEvent, setHoveredEvent] = useState<string | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n \n const totalDuration = end.getTime() - start.getTime();\n const trackLabelWidth = 130;\n \n // Generate time labels (adjust based on zoom)\n const timeLabels = useMemo(() => {\n const labels: { time: Date; percent: number }[] = [];\n // More labels when zoomed in, fewer when zoomed out\n const baseLabelCount = 6;\n const labelCount = Math.round(baseLabelCount * zoom);\n \n for (let i = 0; i <= labelCount; i++) {\n const percent = (i / labelCount) * 100;\n const time = new Date(start.getTime() + (totalDuration * percent / 100));\n labels.push({ time, percent });\n }\n return labels;\n }, [start, totalDuration, zoom]);\n \n // Group events by track with overlap detection\n const eventsByTrack = useMemo(() => {\n const grouped: Record<string, TimelineEvent[]> = {};\n tracks.forEach(track => {\n grouped[track.id] = events.filter(e => e.track === track.id);\n });\n // Add unassigned events to first track\n const unassigned = events.filter(e => !e.track);\n if (unassigned.length > 0 && tracks.length > 0) {\n grouped[tracks[0].id] = [...(grouped[tracks[0].id] || []), ...unassigned];\n }\n return grouped;\n }, [events, tracks]);\n \n // Detect overlapping events and calculate stacking\n const eventOverlaps = useMemo(() => {\n const overlaps: Record<string, { stackIndex: number; overlapCount: number; overlappingIds: string[] }> = {};\n \n Object.entries(eventsByTrack).forEach(([_trackId, trackEvents]) => {\n // Sort events by start time\n const sorted = [...trackEvents].sort((a, b) => a.start.getTime() - b.start.getTime());\n \n sorted.forEach((event) => {\n const eventStart = event.start.getTime();\n const eventEnd = (event.end || new Date(eventStart + 300000)).getTime();\n \n // Find all overlapping events\n const overlapping = sorted.filter(other => {\n if (other.id === event.id) return false;\n const otherStart = other.start.getTime();\n const otherEnd = (other.end || new Date(otherStart + 300000)).getTime();\n return eventStart < otherEnd && eventEnd > otherStart;\n });\n \n // Calculate stack index (position in vertical stack)\n let stackIndex = 0;\n if (overlapping.length > 0) {\n const usedIndices = overlapping\n .filter(o => overlaps[o.id] !== undefined)\n .map(o => overlaps[o.id].stackIndex);\n while (usedIndices.includes(stackIndex)) {\n stackIndex++;\n }\n }\n \n overlaps[event.id] = {\n stackIndex,\n overlapCount: overlapping.length,\n overlappingIds: overlapping.map(o => o.id),\n };\n });\n });\n \n return overlaps;\n }, [eventsByTrack]);\n \n // Generate day markers at midnight\n const dayMarkers = useMemo(() => {\n const markers: { time: Date; percent: number }[] = [];\n const current = new Date(start);\n \n // Move to midnight of the first day\n current.setUTCHours(0, 0, 0, 0);\n if (current.getTime() < start.getTime()) {\n current.setUTCDate(current.getUTCDate() + 1);\n }\n \n while (current.getTime() <= end.getTime()) {\n const percent = ((current.getTime() - start.getTime()) / totalDuration) * 100;\n if (percent >= 0 && percent <= 100) {\n markers.push({ time: new Date(current), percent });\n }\n current.setUTCDate(current.getUTCDate() + 1);\n }\n \n return markers;\n }, [start, end, totalDuration]);\n \n // Format helpers\n const formatTime = (date: Date, showSeconds = false) => {\n const options: Intl.DateTimeFormatOptions = { \n hour: '2-digit', \n minute: '2-digit',\n ...(showSeconds && { second: '2-digit' }),\n };\n return date.toLocaleTimeString([], options);\n };\n \n const formatDuration = (ms: number) => {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}h ${minutes}m`;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n };\n \n const formatUTC = (date: Date) => {\n return date.toISOString().replace('T', ' ').substring(0, 19) + ' UTC';\n };\n \n const getEventPosition = (event: TimelineEvent) => {\n const eventStart = event.start.getTime();\n const eventEnd = (event.end || new Date(eventStart + 300000)).getTime(); // 5min default\n const leftPercent = ((eventStart - start.getTime()) / totalDuration) * 100;\n const widthPercent = ((eventEnd - eventStart) / totalDuration) * 100;\n return { \n left: `${Math.max(0, Math.min(100, leftPercent))}%`, \n width: `${Math.max(2, Math.min(100 - leftPercent, widthPercent))}%` \n };\n };\n \n const getStatusColor = (status?: string) => {\n if (!status) return tokens.colors.accent.primary;\n return tokens.colors.status[status as keyof typeof tokens.colors.status] || tokens.colors.accent.primary;\n };\n \n const getStatusLabel = (status?: string) => {\n const labels: Record<string, string> = {\n normal: 'Normal',\n standby: 'Standby',\n caution: 'Caution',\n serious: 'Serious',\n critical: 'Critical',\n off: 'Off',\n };\n return labels[status || ''] || 'Unknown';\n };\n \n // Current time playhead (use provided time or current time)\n const currentPlayheadTime = playheadTime || new Date();\n const now = currentPlayheadTime.getTime();\n const playheadPercent = showPlayhead && now >= start.getTime() && now <= end.getTime()\n ? ((now - start.getTime()) / totalDuration) * 100\n : null;\n \n // Get hovered event details\n const hoveredEventData = hoveredEvent \n ? events.find(e => e.id === hoveredEvent)\n : null;\n \n return (\n <div style={{ position: 'relative' }}>\n {/* Scrollable chart area with sticky track labels */}\n <div\n ref={scrollContainerRef}\n className=\"zendir-timeline-scroll\"\n style={{\n overflowX: 'auto',\n overflowY: 'hidden',\n position: 'relative',\n }}\n >\n <div\n style={{\n width: `${zoom * 100}%`,\n minWidth: '100%',\n position: 'relative',\n }}\n >\n {/* Time axis */}\n <div\n style={{\n display: 'flex',\n height: 32,\n borderBottom: `1px solid ${tokens.colors.accent.primary}20`,\n position: 'sticky',\n top: 0,\n zIndex: 20,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n }}\n >\n {/* Sticky header corner */}\n <div \n style={{ \n width: trackLabelWidth, \n flexShrink: 0,\n position: 'sticky',\n left: 0,\n zIndex: 25,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n borderRight: `1px solid ${tokens.colors.border.muted}30`,\n display: 'flex',\n alignItems: 'center',\n paddingLeft: 12,\n fontSize: '0.625rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n letterSpacing: '0.08em',\n }} \n >\n Tracks\n </div>\n \n {/* Time labels container */}\n <div style={{ flex: 1, position: 'relative' }}>\n {/* Day markers */}\n {showDayMarkers && dayMarkers.map((marker, index) => (\n <div\n key={`day-${index}`}\n style={{\n position: 'absolute',\n left: `${marker.percent}%`,\n top: 0,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n zIndex: 5,\n }}\n >\n <span\n style={{\n fontSize: '0.5rem',\n color: tokens.colors.status.caution,\n fontFamily: tokens.typography.fontFamily.mono,\n whiteSpace: 'nowrap',\n backgroundColor: `${tokens.colors.status.caution}20`,\n padding: '1px 4px',\n borderRadius: 2,\n marginTop: 2,\n }}\n >\n {marker.time.toLocaleDateString([], { month: 'short', day: 'numeric' })}\n </span>\n </div>\n ))}\n \n {/* Time labels */}\n {timeLabels.map((label, index) => (\n <span\n key={index}\n style={{\n position: 'absolute',\n left: `${label.percent}%`,\n transform: 'translateX(-50%)',\n top: 8,\n fontSize: '0.6875rem',\n color: tokens.colors.text.tertiary,\n fontFamily: tokens.typography.fontFamily.mono,\n whiteSpace: 'nowrap',\n }}\n >\n {formatTime(label.time)}\n </span>\n ))}\n </div>\n </div>\n \n {/* Tracks */}\n {tracks.map((track) => (\n <div\n key={track.id}\n aria-label={track.label}\n style={{\n display: 'flex',\n height: track.height || trackHeight,\n borderBottom: `1px solid ${tokens.colors.accent.primary}10`,\n }}\n >\n {/* Track label - STICKY on horizontal scroll */}\n <div\n style={{\n width: trackLabelWidth,\n flexShrink: 0,\n position: 'sticky',\n left: 0,\n zIndex: 15,\n display: 'flex',\n alignItems: 'center',\n paddingLeft: 12,\n fontSize: '0.6875rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tokens.colors.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n borderRight: `1px solid ${tokens.colors.border.muted}30`,\n boxShadow: '2px 0 8px rgba(0,0,0,0.15)',\n }}\n >\n {track.label}\n </div>\n \n {/* Track events container - separate from label */}\n <div\n style={{\n flex: 1,\n position: 'relative',\n height: '100%',\n }}\n >\n {/* Day marker vertical lines */}\n {showDayMarkers && dayMarkers.map((marker, index) => (\n <div\n key={`day-line-${index}`}\n style={{\n position: 'absolute',\n left: `${marker.percent}%`,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundColor: `${tokens.colors.status.caution}25`,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n />\n ))}\n \n {(eventsByTrack[track.id] || []).map((event) => {\n const { left, width } = getEventPosition(event);\n const color = getStatusColor(event.status);\n const isHovered = hoveredEvent === event.id;\n const overlap = eventOverlaps[event.id];\n const hasOverlap = overlap && overlap.overlapCount > 0;\n \n // Stack events vertically when they overlap\n const cardHeight = hasOverlap ? 28 : 36;\n const stackOffset = overlap ? overlap.stackIndex * 30 : 0;\n const baseTop = ((track.height || trackHeight) - cardHeight) / 2;\n \n return (\n <button\n key={event.id}\n type=\"button\"\n onClick={() => onEventClick?.(event)}\n onMouseEnter={(e) => {\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onMouseLeave={() => {\n setHoveredEvent(null);\n setTooltipPos(null);\n }}\n className=\"zendir-timeline-region\"\n style={{\n position: 'absolute',\n left,\n width,\n minWidth: 50,\n height: cardHeight,\n top: Math.min(baseTop + stackOffset, (track.height || trackHeight) - cardHeight - 4),\n backgroundColor: 'rgba(11, 26, 40, 0.95)',\n border: `1px solid ${isHovered ? color : `${tokens.colors.accent.primary}30`}`,\n borderRadius: '4px',\n cursor: onEventClick ? 'pointer' : 'default',\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n zIndex: isHovered ? 100 : 1,\n boxShadow: isHovered \n ? `0 8px 24px rgba(0, 0, 0, 0.5), 0 0 0 1px ${color}60` \n : '0 2px 6px rgba(0, 0, 0, 0.25)',\n transition: 'all 150ms cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isHovered ? 'translateY(-3px) scale(1.02)' : 'none',\n }}\n >\n {/* Status indicator bar */}\n <div\n style={{\n width: 4,\n height: '100%',\n backgroundColor: color,\n flexShrink: 0,\n borderRadius: '2px 0 0 2px',\n }}\n />\n \n {/* Content */}\n <div\n style={{\n flex: 1,\n padding: '4px 8px',\n overflow: 'hidden',\n minWidth: 0,\n }}\n >\n {/* Label */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <span\n style={{\n fontSize: '0.6875rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: '#fff',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {event.title}\n </span>\n </div>\n \n {/* Subtitle / Time range */}\n {event.subtitle && !hasOverlap && (\n <div\n style={{\n fontSize: '0.5625rem',\n color: 'rgba(255, 255, 255, 0.5)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n marginTop: 1,\n }}\n >\n {event.subtitle}\n </div>\n )}\n </div>\n \n {/* Overlap indicator badge */}\n {hasOverlap && overlap.stackIndex === 0 && (\n <div\n style={{\n position: 'absolute',\n top: -6,\n right: -6,\n minWidth: 18,\n height: 18,\n backgroundColor: tokens.colors.status.caution,\n borderRadius: 9,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '0.625rem',\n fontWeight: 700,\n color: '#000',\n boxShadow: '0 2px 6px rgba(0, 0, 0, 0.3)',\n zIndex: 10,\n }}\n title={`${overlap.overlapCount + 1} overlapping events`}\n >\n +{overlap.overlapCount}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n ))}\n \n {/* Current time playhead */}\n {playheadPercent !== null && (\n <div\n style={{\n position: 'absolute',\n top: 28,\n bottom: 0,\n left: `calc(${trackLabelWidth}px + ${playheadPercent}% * (100% - ${trackLabelWidth}px) / 100)`,\n width: 2,\n backgroundColor: tokens.colors.accent.primary,\n boxShadow: `0 0 12px ${tokens.colors.accent.primary}`,\n zIndex: 20,\n pointerEvents: 'none',\n }}\n >\n {/* Playhead arrow indicator */}\n <div\n style={{\n position: 'absolute',\n top: -6,\n left: -5,\n width: 12,\n height: 12,\n backgroundColor: tokens.colors.accent.primary,\n borderRadius: 2,\n transform: 'rotate(45deg)',\n boxShadow: `0 0 8px ${tokens.colors.accent.primary}`,\n }}\n />\n \n {/* Playhead time label */}\n <div\n style={{\n position: 'absolute',\n top: -22,\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: tokens.colors.accent.primary,\n color: tokens.colors.background.base,\n fontSize: '0.5625rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n fontFamily: tokens.typography.fontFamily.mono,\n padding: '2px 6px',\n borderRadius: 3,\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n }}\n >\n {formatTime(currentPlayheadTime, true)}\n </div>\n </div>\n )}\n </div>\n </div>\n \n {/* Rich Hover Tooltip */}\n {hoveredEventData && tooltipPos && (\n <div\n style={{\n position: 'fixed',\n left: tooltipPos.x,\n top: tooltipPos.y,\n transform: 'translate(-50%, -100%)',\n zIndex: 1000,\n pointerEvents: 'none',\n animation: 'zendir-tooltip-appear 150ms ease',\n }}\n >\n <div\n style={{\n backgroundColor: 'rgba(15, 23, 42, 0.98)',\n border: `1px solid ${getStatusColor(hoveredEventData.status)}50`,\n borderRadius: tokens.borderRadius.md,\n padding: '12px 16px',\n minWidth: 220,\n maxWidth: 320,\n boxShadow: `0 12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px ${getStatusColor(hoveredEventData.status)}30`,\n backdropFilter: 'blur(12px)',\n }}\n >\n {/* Header with status — Astro UX shape */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>\n <TimelineStatusMarker\n status={hoveredEventData.status}\n fillColor={getStatusColor(hoveredEventData.status)}\n size={10}\n />\n <span\n style={{\n fontSize: '0.75rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: getStatusColor(hoveredEventData.status),\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {getStatusLabel(hoveredEventData.status)}\n </span>\n {hoveredEventData.badge && (\n <span\n style={{\n marginLeft: 'auto',\n fontSize: '0.625rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n padding: '2px 6px',\n borderRadius: tokens.borderRadius.sm,\n backgroundColor: `${getStatusColor(hoveredEventData.status)}20`,\n color: getStatusColor(hoveredEventData.status),\n }}\n >\n {hoveredEventData.badge}\n </span>\n )}\n </div>\n \n {/* Title */}\n <div\n style={{\n fontSize: '0.875rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: '#fff',\n marginBottom: 4,\n }}\n >\n {hoveredEventData.title}\n </div>\n \n {/* Subtitle */}\n {hoveredEventData.subtitle && (\n <div\n style={{\n fontSize: '0.75rem',\n color: 'rgba(255, 255, 255, 0.6)',\n marginBottom: 12,\n }}\n >\n {hoveredEventData.subtitle}\n </div>\n )}\n \n {/* Time details */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: '6px 12px',\n fontSize: '0.6875rem',\n borderTop: `1px solid ${tokens.colors.border.muted}30`,\n paddingTop: 10,\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>Start:</span>\n <span style={{ color: tokens.colors.text.primary, fontFamily: tokens.typography.fontFamily.mono }}>\n {formatTime(hoveredEventData.start, true)}\n </span>\n \n {hoveredEventData.end && (\n <>\n <span style={{ color: tokens.colors.text.tertiary }}>End:</span>\n <span style={{ color: tokens.colors.text.primary, fontFamily: tokens.typography.fontFamily.mono }}>\n {formatTime(hoveredEventData.end, true)}\n </span>\n \n <span style={{ color: tokens.colors.text.tertiary }}>Duration:</span>\n <span style={{ color: tokens.colors.accent.secondary, fontWeight: 500 }}>\n {formatDuration(hoveredEventData.end.getTime() - hoveredEventData.start.getTime())}\n </span>\n </>\n )}\n \n <span style={{ color: tokens.colors.text.tertiary }}>UTC:</span>\n <span style={{ color: tokens.colors.text.secondary, fontFamily: tokens.typography.fontFamily.mono, fontSize: '0.625rem' }}>\n {formatUTC(hoveredEventData.start)}\n </span>\n </div>\n \n {/* Click hint */}\n {onEventClick && (\n <div\n style={{\n marginTop: 10,\n paddingTop: 8,\n borderTop: `1px solid ${tokens.colors.border.muted}20`,\n fontSize: '0.625rem',\n color: tokens.colors.text.tertiary,\n textAlign: 'center',\n }}\n >\n Click for details\n </div>\n )}\n </div>\n \n {/* Arrow */}\n <div\n style={{\n position: 'absolute',\n bottom: -6,\n left: '50%',\n transform: 'translateX(-50%) rotate(45deg)',\n width: 12,\n height: 12,\n backgroundColor: 'rgba(15, 23, 42, 0.98)',\n borderRight: `1px solid ${getStatusColor(hoveredEventData.status)}50`,\n borderBottom: `1px solid ${getStatusColor(hoveredEventData.status)}50`,\n }}\n />\n </div>\n )}\n \n {/* Styles */}\n <style>{`\n .zendir-timeline-region:hover {\n z-index: 100 !important;\n }\n .zendir-timeline-region:focus {\n outline: 2px solid ${tokens.colors.accent.primary};\n outline-offset: 2px;\n }\n .zendir-timeline-scroll::-webkit-scrollbar {\n height: 8px;\n }\n .zendir-timeline-scroll::-webkit-scrollbar-track {\n background: ${tokens.colors.background.elevated};\n border-radius: 4px;\n }\n .zendir-timeline-scroll::-webkit-scrollbar-thumb {\n background: ${tokens.colors.accent.primary}40;\n border-radius: 4px;\n }\n .zendir-timeline-scroll::-webkit-scrollbar-thumb:hover {\n background: ${tokens.colors.accent.primary}60;\n }\n @keyframes zendir-tooltip-appear {\n from {\n opacity: 0;\n transform: translate(-50%, -100%) translateY(8px);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -100%) translateY(0);\n }\n }\n `}</style>\n </div>\n );\n});\n\n// ============================================================================\n// Scatter View (Dot timeline - like reference image)\n// ============================================================================\n\ninterface ScatterViewProps {\n events: TimelineEvent[];\n tracks: TimelineTrackDef[];\n start: Date;\n end: Date;\n trackHeight: number;\n onEventClick?: (event: TimelineEvent) => void;\n timeFormat?: TimeFormat;\n referenceTime?: Date;\n zoom?: number;\n}\n\nconst ScatterView = memo(function ScatterView({\n events,\n tracks,\n start,\n end,\n trackHeight,\n onEventClick,\n timeFormat = 'relative',\n referenceTime,\n zoom = 1,\n}: ScatterViewProps) {\n const { tokens } = useTheme();\n const [hoveredEvent, setHoveredEvent] = useState<string | null>(null);\n const [tooltipPosition, setTooltipPosition] = useState<{ x: number; y: number } | null>(null);\n \n const totalDuration = end.getTime() - start.getTime();\n const trackLabelWidth = 140;\n const refTime = referenceTime || start;\n \n // Format time based on format setting\n const formatTimeLabel = useCallback((date: Date) => {\n if (timeFormat === 'relative') {\n const diff = date.getTime() - refTime.getTime();\n const totalSeconds = Math.floor(Math.abs(diff) / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n }\n return `${minutes}m ${seconds}s`;\n } else if (timeFormat === 'utc') {\n return date.toISOString().slice(11, 19) + ' UTC';\n }\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }, [timeFormat, refTime]);\n \n // Generate time labels (tied to zoom like Chart view)\n const timeLabels = useMemo(() => {\n const labels: { time: Date; percent: number }[] = [];\n const baseLabelCount = 8;\n const labelCount = Math.round(baseLabelCount * zoom);\n \n for (let i = 0; i <= labelCount; i++) {\n const percent = (i / labelCount) * 100;\n const time = new Date(start.getTime() + (totalDuration * percent / 100));\n labels.push({ time, percent });\n }\n return labels;\n }, [start, totalDuration, zoom]);\n \n // Group events by track\n const eventsByTrack = useMemo(() => {\n const grouped: Record<string, TimelineEvent[]> = {};\n tracks.forEach(track => {\n grouped[track.id] = events.filter(e => e.track === track.id);\n });\n const unassigned = events.filter(e => !e.track);\n if (unassigned.length > 0 && tracks.length > 0) {\n grouped[tracks[0].id] = [...(grouped[tracks[0].id] || []), ...unassigned];\n }\n return grouped;\n }, [events, tracks]);\n \n const getEventPosition = (event: TimelineEvent) => {\n const eventTime = event.start.getTime();\n return ((eventTime - start.getTime()) / totalDuration) * 100;\n };\n \n const getStatusColor = (status?: string) => {\n if (!status) return tokens.colors.accent.primary;\n return tokens.colors.status[status as keyof typeof tokens.colors.status] || tokens.colors.accent.primary;\n };\n \n const hoveredEventData = events.find(e => e.id === hoveredEvent);\n \n return (\n <div style={{ position: 'relative' }}>\n <div\n style={{\n width: `${zoom * 100}%`,\n minWidth: '100%',\n position: 'relative',\n }}\n >\n {/* Time axis */}\n <div\n style={{\n position: 'relative',\n height: 32,\n marginLeft: trackLabelWidth,\n borderBottom: `1px solid ${tokens.colors.accent.primary}15`,\n }}\n >\n {timeLabels.map((label, index) => (\n <span\n key={index}\n style={{\n position: 'absolute',\n left: `${label.percent}%`,\n transform: 'translateX(-50%)',\n top: 8,\n fontSize: '0.6875rem',\n color: tokens.colors.text.tertiary,\n fontFamily: tokens.typography.fontFamily.mono,\n whiteSpace: 'nowrap',\n fontWeight: 500,\n }}\n >\n {formatTimeLabel(label.time)}\n </span>\n ))}\n </div>\n \n {/* Tracks */}\n {tracks.map((track, trackIndex) => (\n <div\n key={track.id}\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: track.height || trackHeight,\n borderBottom: trackIndex < tracks.length - 1 \n ? `1px solid ${tokens.colors.border.muted}20` \n : 'none',\n }}\n >\n {/* Track label */}\n <div\n style={{\n width: trackLabelWidth,\n flexShrink: 0,\n padding: '0 16px',\n fontSize: '0.8125rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tokens.colors.text.primary,\n }}\n >\n {track.label}\n </div>\n \n {/* Track line */}\n <div\n style={{\n flex: 1,\n position: 'relative',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {/* Horizontal guide line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: 1,\n backgroundColor: tokens.colors.border.muted,\n opacity: 0.3,\n }}\n />\n \n {/* Event dots — Astro UX status shapes */}\n {(eventsByTrack[track.id] || []).map((event) => {\n const leftPercent = getEventPosition(event);\n const color = getStatusColor(event.status);\n const isHovered = hoveredEvent === event.id;\n const dotSize = isHovered ? 16 : 12;\n const effectiveStatus = event.status ?? 'normal';\n \n return (\n <button\n key={event.id}\n type=\"button\"\n onClick={() => onEventClick?.(event)}\n onMouseEnter={(e) => {\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => {\n setHoveredEvent(null);\n setTooltipPosition(null);\n }}\n style={{\n position: 'absolute',\n left: `${leftPercent}%`,\n transform: 'translateX(-50%)',\n width: dotSize,\n height: dotSize,\n padding: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 200ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n zIndex: isHovered ? 20 : 1,\n lineHeight: 0,\n }}\n aria-label={event.title}\n >\n <TimelineStatusMarker status={effectiveStatus} fillColor={color} size={dotSize} />\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n \n {/* Floating tooltip */}\n {hoveredEventData && tooltipPosition && (\n <div\n className=\"zendir-scatter-tooltip\"\n style={{\n position: 'fixed',\n left: tooltipPosition.x,\n top: tooltipPosition.y - 12,\n transform: 'translate(-50%, -100%)',\n backgroundColor: 'rgba(11, 26, 40, 0.98)',\n border: `1px solid ${tokens.colors.accent.primary}40`,\n borderRadius: tokens.borderRadius.lg,\n padding: '12px 16px',\n minWidth: 200,\n maxWidth: 320,\n zIndex: 1000,\n boxShadow: `0 12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px ${tokens.colors.accent.primary}20`,\n backdropFilter: 'blur(12px)',\n animation: 'zendir-tooltip-in 150ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n }}\n >\n {/* Arrow */}\n <div\n style={{\n position: 'absolute',\n bottom: -6,\n left: '50%',\n transform: 'translateX(-50%) rotate(45deg)',\n width: 12,\n height: 12,\n backgroundColor: 'rgba(11, 26, 40, 0.98)',\n borderRight: `1px solid ${tokens.colors.accent.primary}40`,\n borderBottom: `1px solid ${tokens.colors.accent.primary}40`,\n }}\n />\n \n {/* Status header — Astro UX shape */}\n {hoveredEventData.status && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }}>\n <TimelineStatusMarker\n status={hoveredEventData.status}\n fillColor={getStatusColor(hoveredEventData.status)}\n size={10}\n />\n <span\n style={{\n fontSize: '0.75rem',\n fontWeight: 500,\n color: getStatusColor(hoveredEventData.status),\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {hoveredEventData.status}\n </span>\n {hoveredEventData.badge && (\n <span\n style={{\n marginLeft: 'auto',\n fontSize: '0.625rem',\n fontWeight: 500,\n padding: '2px 6px',\n borderRadius: tokens.borderRadius.sm,\n backgroundColor: `${getStatusColor(hoveredEventData.status)}20`,\n color: getStatusColor(hoveredEventData.status),\n }}\n >\n {hoveredEventData.badge}\n </span>\n )}\n </div>\n )}\n\n {/* Title */}\n <div\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#fff',\n marginBottom: 8,\n }}\n >\n {hoveredEventData.title}\n </div>\n \n {/* Details */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: '0.75rem',\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>Time:</span>\n <span style={{ color: tokens.colors.text.secondary, fontFamily: tokens.typography.fontFamily.mono }}>\n {formatTimeLabel(hoveredEventData.start)}\n </span>\n </div>\n \n {hoveredEventData.badge && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: '0.75rem',\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>Trigger:</span>\n <span style={{ color: safeAccentText(tokens.colors.accent.primary), fontWeight: 500 }}>\n {hoveredEventData.badge}\n </span>\n </div>\n )}\n \n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: '0.75rem',\n }}\n >\n <span style={{ color: tokens.colors.text.tertiary }}>UTC:</span>\n <span style={{ color: tokens.colors.text.secondary, fontFamily: tokens.typography.fontFamily.mono }}>\n {hoveredEventData.start.toISOString().replace('T', ' ').slice(0, 19)}\n </span>\n </div>\n \n {hoveredEventData.subtitle && (\n <div\n style={{\n marginTop: 4,\n paddingTop: 8,\n borderTop: `1px solid ${tokens.colors.border.muted}`,\n fontSize: '0.75rem',\n color: tokens.colors.text.secondary,\n }}\n >\n {hoveredEventData.subtitle}\n </div>\n )}\n </div>\n </div>\n )}\n \n {/* Styles */}\n <style>{`\n @keyframes zendir-tooltip-in {\n from {\n opacity: 0;\n transform: translate(-50%, -100%) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -100%) scale(1);\n }\n }\n .zendir-scatter-tooltip::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, transparent 50%);\n pointer-events: none;\n }\n `}</style>\n </div>\n );\n});\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport const UnifiedTimeline = memo(function UnifiedTimeline({\n title = 'Timeline',\n events,\n tracks = [],\n start: propStart,\n end: propEnd,\n defaultView = 'chart',\n viewMode: controlledViewMode,\n onViewModeChange,\n onEventClick,\n showViewToggle = true,\n maxHeight,\n trackHeight = 56,\n className = '',\n timeFormat = 'absolute',\n zoomable = false,\n initialZoom = 1,\n showFilters: _showFilters = false,\n filter: _filter,\n onFilterChange: _onFilterChange,\n showCount: _showCount = true,\n loading = false,\n referenceTime,\n showPlayhead = true,\n playheadTime,\n onPlayheadChange: _onPlayheadChangeTimeline,\n showDayMarkers = true,\n}: UnifiedTimelineProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [internalViewMode, setInternalViewMode] = useState<TimelineViewMode>(defaultView);\n const [zoom, setZoom] = useState(initialZoom);\n const [_internalFilter, _setInternalFilter] = useState<TimelineFilter>({});\n \n const viewMode = controlledViewMode ?? internalViewMode;\n \n const handleViewModeChange = useCallback((mode: TimelineViewMode) => {\n setInternalViewMode(mode);\n onViewModeChange?.(mode);\n }, [onViewModeChange]);\n \n // Auto-calculate time range if not provided\n const { start, end } = useMemo(() => {\n if (propStart && propEnd) {\n return { start: propStart, end: propEnd };\n }\n \n if (events.length === 0) {\n const now = new Date();\n return {\n start: new Date(now.getTime() - 3600000),\n end: new Date(now.getTime() + 3600000),\n };\n }\n \n let minTime = events[0].start.getTime();\n let maxTime = events[0].start.getTime();\n \n events.forEach(event => {\n minTime = Math.min(minTime, event.start.getTime());\n maxTime = Math.max(maxTime, (event.end || event.start).getTime());\n });\n \n // Add 10% padding\n const duration = maxTime - minTime;\n const padding = duration * 0.1;\n \n return {\n start: new Date(minTime - padding),\n end: new Date(maxTime + padding),\n };\n }, [events, propStart, propEnd]);\n \n // Auto-generate tracks from events if not provided\n const effectiveTracks = useMemo(() => {\n if (tracks.length > 0) return tracks;\n \n const trackSet = new Set<string>();\n events.forEach(event => {\n if (event.track) trackSet.add(event.track);\n });\n \n if (trackSet.size === 0) {\n return [{ id: 'default', label: 'Events', height: trackHeight }];\n }\n \n return Array.from(trackSet).map(id => ({\n id,\n label: id,\n height: trackHeight,\n }));\n }, [events, tracks, trackHeight]);\n \n // Sort events by start time (newest first for list view)\n const sortedEvents = useMemo(() => {\n return [...events].sort((a, b) => b.start.getTime() - a.start.getTime());\n }, [events]);\n \n return (\n <div\n className={classNames('zendir-unified-timeline', className)}\n style={{\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.lg,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 20px',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: '1rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tokens.colors.text.primary,\n }}\n >\n {title} ({events.length})\n </h3>\n \n {/* Right side controls */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n {/* Zoom controls - chart and scatter share zoom; list has no time axis */}\n {zoomable && (viewMode === 'chart' || viewMode === 'scatter') && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n paddingRight: 12,\n borderRight: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <Tooltip content=\"Zoom out\">\n <button\n type=\"button\"\n aria-label=\"Zoom out\"\n onClick={() => setZoom(Math.max(zoom - 0.5, 1))}\n disabled={zoom <= 1}\n style={{\n width: 28,\n height: 28,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: zoom <= 1 ? 'transparent' : tokens.colors.background.elevated,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n color: zoom <= 1 ? tokens.colors.text.tertiary : tokens.colors.text.primary,\n cursor: zoom <= 1 ? 'not-allowed' : 'pointer',\n fontSize: '1rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n opacity: zoom <= 1 ? 0.5 : 1,\n }}\n >\n −\n </button>\n </Tooltip>\n <span\n style={{\n minWidth: 40,\n textAlign: 'center',\n fontSize: '0.75rem',\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.secondary,\n }}\n >\n {Math.round(zoom * 100)}%\n </span>\n <Tooltip content=\"Zoom in\">\n <button\n type=\"button\"\n aria-label=\"Zoom in\"\n onClick={() => setZoom(Math.min(zoom + 0.5, 4))}\n disabled={zoom >= 4}\n style={{\n width: 28,\n height: 28,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: zoom >= 4 ? 'transparent' : tokens.colors.background.elevated,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n color: zoom >= 4 ? tokens.colors.text.tertiary : tokens.colors.text.primary,\n cursor: zoom >= 4 ? 'not-allowed' : 'pointer',\n fontSize: '1rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n opacity: zoom >= 4 ? 0.5 : 1,\n }}\n >\n +\n </button>\n </Tooltip>\n <Tooltip content=\"Reset zoom\">\n <button\n type=\"button\"\n aria-label=\"Reset zoom\"\n onClick={() => setZoom(1)}\n style={{\n height: 28,\n padding: '0 10px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: tokens.colors.background.elevated,\n border: `1px solid ${tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n color: tokens.colors.text.secondary,\n cursor: 'pointer',\n fontSize: '0.6875rem',\n fontWeight: 500,\n }}\n >\n FIT\n </button>\n </Tooltip>\n </div>\n )}\n \n {/* View toggle */}\n {showViewToggle && (\n <div \n style={{ \n display: 'flex', \n gap: '2px',\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.elevated,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n padding: '4px',\n borderRadius: tokens.borderRadius.lg,\n }}\n >\n {(['chart', 'list', 'scatter'] as TimelineViewMode[]).map((mode) => {\n const isActive = viewMode === mode;\n const icons: Record<TimelineViewMode, 'list' | 'timeline' | 'chart'> = {\n chart: 'chart',\n list: 'list',\n scatter: 'timeline',\n };\n const labels: Record<TimelineViewMode, string> = {\n chart: 'Gantt Chart',\n list: 'List View',\n scatter: 'Scatter View',\n };\n \n return (\n <Tooltip key={mode} content={labels[mode]}>\n <button\n type=\"button\"\n aria-label={labels[mode]}\n onClick={() => handleViewModeChange(mode)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n backgroundColor: isActive ? tokens.colors.accent.primary : 'transparent',\n border: 'none',\n borderRadius: tokens.borderRadius.md,\n color: isActive ? '#ffffff' : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'all 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isActive ? 'scale(1)' : 'scale(0.95)',\n boxShadow: isActive ? `0 2px 8px ${tokens.colors.accent.primary}40` : 'none',\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.backgroundColor = `${tokens.colors.accent.primary}20`;\n e.currentTarget.style.transform = 'scale(1)';\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.transform = 'scale(0.95)';\n }\n }}\n >\n <Icon name={icons[mode]} size={16} />\n </button>\n </Tooltip>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Loading State */}\n {loading && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: `${tokens.colors.background.overlay}80`,\n backdropFilter: 'blur(4px)',\n zIndex: 100,\n }}\n >\n <div\n style={{\n width: 40,\n height: 40,\n border: `3px solid ${tokens.colors.border.muted}`,\n borderTopColor: tokens.colors.accent.primary,\n borderRadius: '50%',\n animation: 'zendir-spin 1s linear infinite',\n }}\n />\n </div>\n )}\n \n {/* Content */}\n <div\n style={{\n padding: viewMode === 'list' ? '16px 20px' : '16px',\n maxHeight: maxHeight,\n overflowY: maxHeight ? 'auto' : undefined,\n overflowX: viewMode !== 'list' ? 'auto' : undefined,\n }}\n >\n {events.length === 0 ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 0',\n color: tokens.colors.text.tertiary,\n gap: '12px',\n }}\n >\n <Icon name=\"clock\" size={32} />\n <span style={{ fontSize: '0.875rem' }}>No events to display</span>\n </div>\n ) : viewMode === 'list' ? (\n // List View\n sortedEvents.map((event, index) => (\n <EventListItem\n key={event.id}\n event={event}\n isLast={index === sortedEvents.length - 1}\n onEventClick={onEventClick}\n />\n ))\n ) : viewMode === 'scatter' ? (\n // Scatter View (Dots on timeline) - uses same zoom as chart\n <ScatterView\n events={events}\n tracks={effectiveTracks}\n start={start}\n end={end}\n trackHeight={trackHeight}\n onEventClick={onEventClick}\n timeFormat={timeFormat}\n referenceTime={referenceTime || start}\n zoom={zoom}\n />\n ) : (\n // Chart View (Gantt)\n <ChartView\n events={events}\n tracks={effectiveTracks}\n start={start}\n end={end}\n trackHeight={trackHeight}\n onEventClick={onEventClick}\n zoom={zoom}\n showPlayhead={showPlayhead}\n playheadTime={playheadTime}\n onPlayheadChange={_onPlayheadChangeTimeline}\n showDayMarkers={showDayMarkers}\n />\n )}\n </div>\n \n {/* Global Styles */}\n <style>{`\n @keyframes zendir-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n});\n\nexport default UnifiedTimeline;\n"],"names":["EventListItem","ChartView","ScatterView","UnifiedTimeline"],"mappings":";;;;;;;AAuJA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAIuB;AACrB,QAAM,kBAAkB,UAAU;AAClC,QAAM,OAAO,GAAG,SAAS;AAEzB,UAAQ,iBAAA;AAAA,IACN,KAAK;AACH,aACE,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,UAAA,CAAW,GAC/C;AAAA,IAEJ,KAAK;AACH,aACE,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,QAAO,QAAQ,WAAW,aAAY,KAAI,GAC/E;AAAA,IAEJ,KAAK;AACH,aACE,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,UAAA,CAAW,GAC/C;AAAA,IAEJ,KAAK;AACH,aACE,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,MAAM,WAAW,GAC5D;AAAA,IAEJ,KAAK;AACH,aACE,oBAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,aAAQ,QAAO,qBAAoB,MAAM,UAAA,CAAW,EAAA,CACvD;AAAA,IAEJ,KAAK;AACH,aACE,oBAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,aAAQ,QAAO,iBAAgB,MAAM,UAAA,CAAW,EAAA,CACnD;AAAA,IAEJ;AACE,aACE,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,OAAO,EAAE,YAAY,GAAG,QAAQ,uBAAuB,IAAI,IAAA,GAC7G,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,UAAA,CAAW,GAC/C;AAAA,EAAA;AAGR;AAQA,MAAM,gBAAgB,KAAK,SAASA,eAAc;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,EAAE,OAAA,IAAW,SAAA;AACnB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,eAAe,MAAM,aAAa,OAAO,KAAK,MAAM,SAAS,EAAE,SAAS;AAC9E,QAAM,gBAAgB,eAAe,OAAO,KAAK,MAAM,SAAU,EAAE,SAAS;AAG5E,QAAM,aAAa,MAAM,cAAc;AAAA,IACrC,EAAE,OAAO,QAAQ,OAAO,MAAM,MAAM,eAAA,GAAkB,QAAQ,MAAM,OAAA;AAAA,EAAc;AAIpF,QAAM,gBACJ,MAAM,gBAAgB,MAAM,iBAAiB,aAAa,MAAM,iBAAiB,YAC7E,MAAM,eACL,MAAM,UAAU;AACvB,QAAM,cAAc,OAAO,OAAO,OAAO,aAAa;AAEtD,SACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,UAElC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,YAAY;AAAA,QAAA;AAAA,QAGd,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,OAAO,EAAE,WAAW,SACvB,UAAA,oBAAC,sBAAA,EAAqB,QAAQ,eAAe,WAAW,aAAa,MAAM,IAAI,GACjF;AAAA,UACC,CAAC,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,MAAM;AAAA,gBACN,iBAAiB,GAAG,OAAO,OAAO,OAAO,OAAO;AAAA,gBAChD,WAAW;AAAA,cAAA;AAAA,YACb;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAKJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAc,MAAM,WAAW,IAAI;AAAA,QACnC,cAAc,MAAM,WAAW,KAAK;AAAA,QACpC,SAAS,MAAM,6CAAe;AAAA,QAC9B,OAAO;AAAA,UACL,MAAM;AAAA,UACN,cAAc;AAAA,UACd,SAAS;AAAA,UACT,iBAAiB,OAAO,OAAO,WAAW;AAAA,UAC1C,QAAQ,aAAa,UAAU,OAAO,OAAO,OAAO,UAAU,OAAO,OAAO,OAAO,KAAK;AAAA,UACxF,cAAc,OAAO,aAAa;AAAA,UAClC,QAAQ,eAAe,YAAY;AAAA,UACnC,YAAY;AAAA,UACZ,WAAW,UACP,cAAc,OAAO,OAAO,OAAO,OAAO,iBAAiB,OAAO,OAAO,OAAO,OAAO,OACvF;AAAA,QAAA;AAAA,QAIN,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,cAAc,WAAW,SAAS,SAAS;AAAA,cAAA;AAAA,cAG7C,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,YAAY;AAAA;AAAA,sBACZ,OAAO,OAAO,OAAO,KAAK;AAAA,sBAC1B,eAAe;AAAA,sBACf,eAAe;AAAA,oBAAA;AAAA,oBAGhB,UAAA,MAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAER,MAAM,SACL;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,kBAAkB,aAAa,kBAAkB,YAAY,WAAW;AAAA,oBACjF,MAAK;AAAA,oBACL,QACE,kBAAkB,aAAa,aAC/B,kBAAkB,YAAY,YAC9B,kBAAkB,YAAY,YAC9B,kBAAkB,WAAW,WAC7B;AAAA,oBAGD,UAAA,MAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACT;AAAA,YAAA;AAAA,UAAA;AAAA,UAKH,MAAM,YACL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,OAAO,OAAO,OAAO,KAAK;AAAA,cAAA;AAAA,cAG3B,UAAA,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAKV,WAAW,SAAS,yBAClB,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAA,GAC1D,qBAAW,IAAI,CAAC,IAAI,UACnB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,UAAU;AAAA,cAAA;AAAA,cAGZ,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,OAAO,OAAO,OAAO,KAAK;AAAA,oBAAA;AAAA,oBAG5B,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,QAAQ,GAAG,UAAU;AAAA,0BACrB,WAAW,GAAG,SACV,OAAO,OAAO,OAAO,GAAG,MAA2C,IACnE,OAAO,OAAO,OAAO;AAAA,0BACzB,MAAM;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEP,GAAG;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,YAAY,OAAO,WAAW,WAAW;AAAA,sBACzC,OAAO,OAAO,OAAO,KAAK;AAAA,sBAC1B,YAAY;AAAA,oBAAA;AAAA,oBAGb,UAAA,GAAG;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACN;AAAA,YAAA;AAAA,YAjCK;AAAA,UAAA,CAmCR,GACH;AAAA,UAID,gBACC,qBAAA,UAAA,EACE,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAA;AACF,8BAAY,CAAC,QAAQ;AAAA,gBACvB;AAAA,gBACA,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,OAAO,OAAO,OAAO,KAAK;AAAA,kBAC1B,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,YAAY;AAAA,gBAAA;AAAA,gBAEd,cAAc,CAAC,MAAM,EAAE,cAAc,MAAM,QAAQ,OAAO,OAAO,OAAO;AAAA,gBACxE,cAAc,CAAC,MAAM,EAAE,cAAc,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA,gBAEtE,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,OAAO;AAAA,wBACL,WAAW,WAAW,kBAAkB;AAAA,wBACxC,YAAY;AAAA,sBAAA;AAAA,sBAGd,UAAA,oBAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEzB,WAAW,SAAS;AAAA,kBAAO;AAAA,kBAAa;AAAA,kBAAc;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGxD,YACC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,WAAW;AAAA,kBACX,WAAW,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,kBAClD,YAAY;AAAA,kBACZ,WAAW;AAAA,gBAAA;AAAA,gBAGb,UAAA;AAAA,kBAAA,oBAAC,WACE,UAAA,8HAAA,CACH;AAAA,kBACC,OAAO,QAAQ,MAAM,SAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAChD;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,iBAAiB,OAAO,OAAO,WAAW;AAAA,wBAC1C,cAAc,OAAO,aAAa;AAAA,wBAClC,UAAU;AAAA,sBAAA;AAAA,sBAGZ,UAAA;AAAA,wBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,UAAA,GAAc,UAAA,IAAA,CAAI;AAAA,wBAC3D;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,OAAO;AAAA,8BACL,YAAY,OAAO,WAAW,WAAW;AAAA,8BACzC,OAAO,OAAO,UAAU,YACpB,QAAQ,OAAO,OAAO,OAAO,SAAS,OAAO,OAAO,KAAK,WACzD,OAAO,OAAO,KAAK;AAAA,8BACvB,YAAY;AAAA,4BAAA;AAAA,4BAGb,iBAAO,KAAK;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBACf;AAAA,oBAAA;AAAA,oBAvBK;AAAA,kBAAA,CAyBR;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ,GACF;AAEJ,CAAC;AAoBD,MAAM,YAAY,KAAK,SAASC,WAAU;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AACnB,GAAmB;AACjB,QAAM,EAAE,QAAQ,MAAA,IAAU,SAAA;AAC1B,QAAM,qBAAqB,UAAU,iBAAiB,UAAU,sBAAsB,UAAU;AAChG,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAI,SAA0C,IAAI;AAClF,QAAM,qBAAqB,OAAuB,IAAI;AAEtD,QAAM,gBAAgB,IAAI,QAAA,IAAY,MAAM,QAAA;AAC5C,QAAM,kBAAkB;AAGxB,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,SAA4C,CAAA;AAElD,UAAM,iBAAiB;AACvB,UAAM,aAAa,KAAK,MAAM,iBAAiB,IAAI;AAEnD,aAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,YAAM,UAAW,IAAI,aAAc;AACnC,YAAM,OAAO,IAAI,KAAK,MAAM,YAAa,gBAAgB,UAAU,GAAI;AACvE,aAAO,KAAK,EAAE,MAAM,QAAA,CAAS;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,eAAe,IAAI,CAAC;AAG/B,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,UAA2C,CAAA;AACjD,WAAO,QAAQ,CAAA,UAAS;AACtB,cAAQ,MAAM,EAAE,IAAI,OAAO,OAAO,CAAA,MAAK,EAAE,UAAU,MAAM,EAAE;AAAA,IAC7D,CAAC;AAED,UAAM,aAAa,OAAO,OAAO,CAAA,MAAK,CAAC,EAAE,KAAK;AAC9C,QAAI,WAAW,SAAS,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAQ,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAI,QAAQ,OAAO,CAAC,EAAE,EAAE,KAAK,CAAA,GAAK,GAAG,UAAU;AAAA,IAC1E;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,CAAC;AAGnB,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,WAAmG,CAAA;AAEzG,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,UAAU,WAAW,MAAM;AAEjE,YAAM,SAAS,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,QAAA,IAAY,EAAE,MAAM,SAAS;AAEpF,aAAO,QAAQ,CAAC,UAAU;AACxB,cAAM,aAAa,MAAM,MAAM,QAAA;AAC/B,cAAM,YAAY,MAAM,OAAO,IAAI,KAAK,aAAa,GAAM,GAAG,QAAA;AAG9D,cAAM,cAAc,OAAO,OAAO,CAAA,UAAS;AACzC,cAAI,MAAM,OAAO,MAAM,GAAI,QAAO;AAClC,gBAAM,aAAa,MAAM,MAAM,QAAA;AAC/B,gBAAM,YAAY,MAAM,OAAO,IAAI,KAAK,aAAa,GAAM,GAAG,QAAA;AAC9D,iBAAO,aAAa,YAAY,WAAW;AAAA,QAC7C,CAAC;AAGD,YAAI,aAAa;AACjB,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,cAAc,YACjB,OAAO,CAAA,MAAK,SAAS,EAAE,EAAE,MAAM,MAAS,EACxC,IAAI,CAAA,MAAK,SAAS,EAAE,EAAE,EAAE,UAAU;AACrC,iBAAO,YAAY,SAAS,UAAU,GAAG;AACvC;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,MAAM,EAAE,IAAI;AAAA,UACnB;AAAA,UACA,cAAc,YAAY;AAAA,UAC1B,gBAAgB,YAAY,IAAI,CAAA,MAAK,EAAE,EAAE;AAAA,QAAA;AAAA,MAE7C,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,UAA6C,CAAA;AACnD,UAAM,UAAU,IAAI,KAAK,KAAK;AAG9B,YAAQ,YAAY,GAAG,GAAG,GAAG,CAAC;AAC9B,QAAI,QAAQ,QAAA,IAAY,MAAM,WAAW;AACvC,cAAQ,WAAW,QAAQ,WAAA,IAAe,CAAC;AAAA,IAC7C;AAEA,WAAO,QAAQ,QAAA,KAAa,IAAI,WAAW;AACzC,YAAM,WAAY,QAAQ,QAAA,IAAY,MAAM,QAAA,KAAa,gBAAiB;AAC1E,UAAI,WAAW,KAAK,WAAW,KAAK;AAClC,gBAAQ,KAAK,EAAE,MAAM,IAAI,KAAK,OAAO,GAAG,SAAS;AAAA,MACnD;AACA,cAAQ,WAAW,QAAQ,WAAA,IAAe,CAAC;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,KAAK,aAAa,CAAC;AAG9B,QAAM,aAAa,CAAC,MAAY,cAAc,UAAU;AACtD,UAAM,UAAsC;AAAA,MAC1C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,GAAI,eAAe,EAAE,QAAQ,UAAA;AAAA,IAAU;AAEzC,WAAO,KAAK,mBAAmB,CAAA,GAAI,OAAO;AAAA,EAC5C;AAEA,QAAM,iBAAiB,CAAC,OAAe;AACrC,UAAM,eAAe,KAAK,MAAM,KAAK,GAAI;AACzC,UAAM,QAAQ,KAAK,MAAM,eAAe,IAAI;AAC5C,UAAM,UAAU,KAAK,MAAO,eAAe,OAAQ,EAAE;AACrD,UAAM,UAAU,eAAe;AAC/B,QAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,KAAK,OAAO;AAC1C,QAAI,UAAU,EAAG,QAAO,GAAG,OAAO,KAAK,OAAO;AAC9C,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,YAAY,CAAC,SAAe;AAChC,WAAO,KAAK,cAAc,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE,IAAI;AAAA,EACjE;AAEA,QAAM,mBAAmB,CAAC,UAAyB;AACjD,UAAM,aAAa,MAAM,MAAM,QAAA;AAC/B,UAAM,YAAY,MAAM,OAAO,IAAI,KAAK,aAAa,GAAM,GAAG,QAAA;AAC9D,UAAM,eAAgB,aAAa,MAAM,QAAA,KAAa,gBAAiB;AACvE,UAAM,gBAAiB,WAAW,cAAc,gBAAiB;AACjE,WAAO;AAAA,MACL,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,MAChD,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,aAAa,YAAY,CAAC,CAAC;AAAA,IAAA;AAAA,EAEpE;AAEA,QAAM,iBAAiB,CAAC,WAAoB;AAC1C,QAAI,CAAC,OAAQ,QAAO,OAAO,OAAO,OAAO;AACzC,WAAO,OAAO,OAAO,OAAO,MAA2C,KAAK,OAAO,OAAO,OAAO;AAAA,EACnG;AAEA,QAAM,iBAAiB,CAAC,WAAoB;AAC1C,UAAM,SAAiC;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,KAAK;AAAA,IAAA;AAEP,WAAO,OAAO,UAAU,EAAE,KAAK;AAAA,EACjC;AAGA,QAAM,sBAAsB,gBAAgB,oBAAI,KAAA;AAChD,QAAM,MAAM,oBAAoB,QAAA;AAChC,QAAM,kBAAkB,gBAAgB,OAAO,MAAM,aAAa,OAAO,IAAI,QAAA,KACvE,MAAM,MAAM,QAAA,KAAa,gBAAiB,MAC5C;AAGJ,QAAM,mBAAmB,eACrB,OAAO,KAAK,OAAK,EAAE,OAAO,YAAY,IACtC;AAEJ,8BACG,OAAA,EAAI,OAAO,EAAE,UAAU,cAEtB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO;AAAA,UACL,WAAW;AAAA,UACX,WAAW;AAAA,UACX,UAAU;AAAA,QAAA;AAAA,QAGZ,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO,GAAG,OAAO,GAAG;AAAA,cACpB,UAAU;AAAA,cACV,UAAU;AAAA,YAAA;AAAA,YAIZ,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,cAAc,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,oBACvD,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,iBAAiB,qBAAqB,gBAAgB,OAAO,OAAO,WAAW;AAAA,oBAC/E,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,aAAA;AAAA,kBAAsB;AAAA,kBAIxG,UAAA;AAAA,oBAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,YAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,MAAM;AAAA,0BACN,QAAQ;AAAA,0BACR,iBAAiB,qBAAqB,gBAAgB,OAAO,OAAO,WAAW;AAAA,0BAC/E,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,aAAA;AAAA,0BAChF,aAAa,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,0BACpD,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,aAAa;AAAA,0BACb,UAAU;AAAA,0BACV,YAAY;AAAA;AAAA,0BACZ,OAAO,OAAO,OAAO,KAAK;AAAA,0BAC1B,eAAe;AAAA,0BACf,eAAe;AAAA,wBAAA;AAAA,wBAElB,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAKD,qBAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,cAE9B,UAAA;AAAA,sBAAA,kBAAkB,WAAW,IAAI,CAAC,QAAQ,UACzC;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,MAAM,GAAG,OAAO,OAAO;AAAA,4BACvB,KAAK;AAAA,4BACL,QAAQ;AAAA,4BACR,SAAS;AAAA,4BACT,eAAe;AAAA,4BACf,YAAY;AAAA,4BACZ,QAAQ;AAAA,0BAAA;AAAA,0BAGV,UAAA;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,OAAO;AAAA,gCACL,UAAU;AAAA,gCACV,OAAO,OAAO,OAAO,OAAO;AAAA,gCAC5B,YAAY,OAAO,WAAW,WAAW;AAAA,gCACzC,YAAY;AAAA,gCACZ,iBAAiB,GAAG,OAAO,OAAO,OAAO,OAAO;AAAA,gCAChD,SAAS;AAAA,gCACT,cAAc;AAAA,gCACd,WAAW;AAAA,8BAAA;AAAA,8BAGZ,UAAA,OAAO,KAAK,mBAAmB,CAAA,GAAI,EAAE,OAAO,SAAS,KAAK,UAAA,CAAW;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBACxE;AAAA,wBAzBK,OAAO,KAAK;AAAA,sBAAA,CA2BpB;AAAA,sBAGA,WAAW,IAAI,CAAC,OAAO,UACtB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,MAAM,GAAG,MAAM,OAAO;AAAA,4BACtB,WAAW;AAAA,4BACX,KAAK;AAAA,4BACL,UAAU;AAAA,4BACV,OAAO,OAAO,OAAO,KAAK;AAAA,4BAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,4BACzC,YAAY;AAAA,0BAAA;AAAA,0BAGb,UAAA,WAAW,MAAM,IAAI;AAAA,wBAAA;AAAA,wBAZjB;AAAA,sBAAA,CAcR;AAAA,oBAAA,EAAA,CACH;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIL,OAAO,IAAI,CAAC,UACX;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,cAAY,MAAM;AAAA,kBAClB,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,QAAQ,MAAM,UAAU;AAAA,oBACxB,cAAc,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,kBAAA;AAAA,kBAIzD,UAAA;AAAA,oBAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,YAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,MAAM;AAAA,0BACN,QAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,aAAa;AAAA,0BACb,UAAU;AAAA,0BACV,YAAY;AAAA;AAAA,0BACZ,OAAO,OAAO,OAAO,KAAK;AAAA,0BAC1B,eAAe;AAAA,0BACf,eAAe;AAAA,0BACf,iBAAiB,qBAAqB,gBAAgB,OAAO,OAAO,WAAW;AAAA,0BAC/E,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,aAAA;AAAA,0BAChF,aAAa,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,0BACpD,WAAW;AAAA,wBAAA;AAAA,wBAGZ,UAAA,MAAM;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAIT;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,MAAM;AAAA,0BACN,UAAU;AAAA,0BACV,QAAQ;AAAA,wBAAA;AAAA,wBAIT,UAAA;AAAA,0BAAA,kBAAkB,WAAW,IAAI,CAAC,QAAQ,UACzC;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BAEC,OAAO;AAAA,gCACL,UAAU;AAAA,gCACV,MAAM,GAAG,OAAO,OAAO;AAAA,gCACvB,KAAK;AAAA,gCACL,QAAQ;AAAA,gCACR,OAAO;AAAA,gCACP,iBAAiB,GAAG,OAAO,OAAO,OAAO,OAAO;AAAA,gCAChD,QAAQ;AAAA,gCACR,eAAe;AAAA,8BAAA;AAAA,4BACjB;AAAA,4BAVK,YAAY,KAAK;AAAA,0BAAA,CAYzB;AAAA,2BAEC,cAAc,MAAM,EAAE,KAAK,CAAA,GAAI,IAAI,CAAC,UAAU;AAC9C,kCAAM,EAAE,MAAM,UAAU,iBAAiB,KAAK;AAC9C,kCAAM,QAAQ,eAAe,MAAM,MAAM;AACzC,kCAAM,YAAY,iBAAiB,MAAM;AACzC,kCAAM,UAAU,cAAc,MAAM,EAAE;AACtC,kCAAM,aAAa,WAAW,QAAQ,eAAe;AAGrD,kCAAM,aAAa,aAAa,KAAK;AACrC,kCAAM,cAAc,UAAU,QAAQ,aAAa,KAAK;AACxD,kCAAM,YAAY,MAAM,UAAU,eAAe,cAAc;AAE/D,mCACE;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCAEC,MAAK;AAAA,gCACL,SAAS,MAAM,6CAAe;AAAA,gCAC9B,cAAc,CAAC,MAAM;AACnB,kDAAgB,MAAM,EAAE;AACxB,wCAAM,OAAO,EAAE,cAAc,sBAAA;AAC7B,gDAAc,EAAE,GAAG,KAAK,OAAO,KAAK,QAAQ,GAAG,GAAG,KAAK,MAAM,EAAA,CAAG;AAAA,gCAClE;AAAA,gCACA,cAAc,MAAM;AAClB,kDAAgB,IAAI;AACpB,gDAAc,IAAI;AAAA,gCACpB;AAAA,gCACA,WAAU;AAAA,gCACV,OAAO;AAAA,kCACL,UAAU;AAAA,kCACV;AAAA,kCACA;AAAA,kCACA,UAAU;AAAA,kCACV,QAAQ;AAAA,kCACR,KAAK,KAAK,IAAI,UAAU,cAAc,MAAM,UAAU,eAAe,aAAa,CAAC;AAAA,kCACnF,iBAAiB;AAAA,kCACjB,QAAQ,aAAa,YAAY,QAAQ,GAAG,OAAO,OAAO,OAAO,OAAO,IAAI;AAAA,kCAC5E,cAAc;AAAA,kCACd,QAAQ,eAAe,YAAY;AAAA,kCACnC,SAAS;AAAA,kCACT,YAAY;AAAA,kCACZ,UAAU;AAAA,kCACV,QAAQ,YAAY,MAAM;AAAA,kCAC1B,WAAW,YACP,4CAA4C,KAAK,OACjD;AAAA,kCACJ,YAAY;AAAA,kCACZ,WAAW,YAAY,iCAAiC;AAAA,gCAAA;AAAA,gCAI5D,UAAA;AAAA,kCAAA;AAAA,oCAAC;AAAA,oCAAA;AAAA,sCACC,OAAO;AAAA,wCACL,OAAO;AAAA,wCACP,QAAQ;AAAA,wCACR,iBAAiB;AAAA,wCACjB,YAAY;AAAA,wCACZ,cAAc;AAAA,sCAAA;AAAA,oCAChB;AAAA,kCAAA;AAAA,kCAIF;AAAA,oCAAC;AAAA,oCAAA;AAAA,sCACC,OAAO;AAAA,wCACL,MAAM;AAAA,wCACN,SAAS;AAAA,wCACT,UAAU;AAAA,wCACV,UAAU;AAAA,sCAAA;AAAA,sCAIZ,UAAA;AAAA,wCAAA;AAAA,0CAAC;AAAA,0CAAA;AAAA,4CACC,OAAO;AAAA,8CACL,SAAS;AAAA,8CACT,YAAY;AAAA,8CACZ,KAAK;AAAA,4CAAA;AAAA,4CAGP,UAAA;AAAA,8CAAC;AAAA,8CAAA;AAAA,gDACC,OAAO;AAAA,kDACL,UAAU;AAAA,kDACV,YAAY;AAAA;AAAA,kDACZ,OAAO;AAAA,kDACP,YAAY;AAAA,kDACZ,UAAU;AAAA,kDACV,cAAc;AAAA,gDAAA;AAAA,gDAGf,UAAA,MAAM;AAAA,8CAAA;AAAA,4CAAA;AAAA,0CACT;AAAA,wCAAA;AAAA,wCAID,MAAM,YAAY,CAAC,cAClB;AAAA,0CAAC;AAAA,0CAAA;AAAA,4CACC,OAAO;AAAA,8CACL,UAAU;AAAA,8CACV,OAAO;AAAA,8CACP,YAAY;AAAA,8CACZ,UAAU;AAAA,8CACV,cAAc;AAAA,8CACd,WAAW;AAAA,4CAAA;AAAA,4CAGZ,UAAA,MAAM;AAAA,0CAAA;AAAA,wCAAA;AAAA,sCACT;AAAA,oCAAA;AAAA,kCAAA;AAAA,kCAKH,cAAc,QAAQ,eAAe,KACpC;AAAA,oCAAC;AAAA,oCAAA;AAAA,sCACC,OAAO;AAAA,wCACL,UAAU;AAAA,wCACV,KAAK;AAAA,wCACL,OAAO;AAAA,wCACP,UAAU;AAAA,wCACV,QAAQ;AAAA,wCACR,iBAAiB,OAAO,OAAO,OAAO;AAAA,wCACtC,cAAc;AAAA,wCACd,SAAS;AAAA,wCACT,YAAY;AAAA,wCACZ,gBAAgB;AAAA,wCAChB,UAAU;AAAA,wCACV,YAAY;AAAA,wCACZ,OAAO;AAAA,wCACP,WAAW;AAAA,wCACX,QAAQ;AAAA,sCAAA;AAAA,sCAEV,OAAO,GAAG,QAAQ,eAAe,CAAC;AAAA,sCACnC,UAAA;AAAA,wCAAA;AAAA,wCACG,QAAQ;AAAA,sCAAA;AAAA,oCAAA;AAAA,kCAAA;AAAA,gCACZ;AAAA,8BAAA;AAAA,8BArHK,MAAM;AAAA,4BAAA;AAAA,0BAyHjB,CAAC;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACH;AAAA,gBAAA;AAAA,gBAlMK,MAAM;AAAA,cAAA,CAoMd;AAAA,cAGI,oBAAoB,QACnB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,MAAM,QAAQ,eAAe,QAAQ,eAAe,eAAe,eAAe;AAAA,oBAClF,OAAO;AAAA,oBACP,iBAAiB,OAAO,OAAO,OAAO;AAAA,oBACtC,WAAW,YAAY,OAAO,OAAO,OAAO,OAAO;AAAA,oBACnD,QAAQ;AAAA,oBACR,eAAe;AAAA,kBAAA;AAAA,kBAIjB,UAAA;AAAA,oBAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,iBAAiB,OAAO,OAAO,OAAO;AAAA,0BACtC,cAAc;AAAA,0BACd,WAAW;AAAA,0BACX,WAAW,WAAW,OAAO,OAAO,OAAO,OAAO;AAAA,wBAAA;AAAA,sBACpD;AAAA,oBAAA;AAAA,oBAIF;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,iBAAiB,OAAO,OAAO,OAAO;AAAA,0BACtC,OAAO,OAAO,OAAO,WAAW;AAAA,0BAChC,UAAU;AAAA,0BACV,YAAY;AAAA;AAAA,0BACZ,YAAY,OAAO,WAAW,WAAW;AAAA,0BACzC,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,YAAY;AAAA,0BACZ,WAAW;AAAA,wBAAA;AAAA,wBAGZ,UAAA,WAAW,qBAAqB,IAAI;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACvC;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,IAID,oBAAoB,cACnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,WAAW;AAAA,UACjB,KAAK,WAAW;AAAA,UAChB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,WAAW;AAAA,QAAA;AAAA,QAGb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,QAAQ,aAAa,eAAe,iBAAiB,MAAM,CAAC;AAAA,gBAC5D,cAAc,OAAO,aAAa;AAAA,gBAClC,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,WAAW,6CAA6C,eAAe,iBAAiB,MAAM,CAAC;AAAA,gBAC/F,gBAAgB;AAAA,cAAA;AAAA,cAIlB,UAAA;AAAA,gBAAA,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,cAAc,EAAA,GACzE,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,QAAQ,iBAAiB;AAAA,sBACzB,WAAW,eAAe,iBAAiB,MAAM;AAAA,sBACjD,MAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAER;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,YAAY;AAAA;AAAA,wBACZ,OAAO,eAAe,iBAAiB,MAAM;AAAA,wBAC7C,eAAe;AAAA,wBACf,eAAe;AAAA,sBAAA;AAAA,sBAGhB,UAAA,eAAe,iBAAiB,MAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAExC,iBAAiB,SAChB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,YAAY;AAAA;AAAA,wBACZ,SAAS;AAAA,wBACT,cAAc,OAAO,aAAa;AAAA,wBAClC,iBAAiB,GAAG,eAAe,iBAAiB,MAAM,CAAC;AAAA,wBAC3D,OAAO,eAAe,iBAAiB,MAAM;AAAA,sBAAA;AAAA,sBAG9C,UAAA,iBAAiB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACpB,GAEJ;AAAA,gBAGA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,YAAY;AAAA;AAAA,sBACZ,OAAO;AAAA,sBACP,cAAc;AAAA,oBAAA;AAAA,oBAGf,UAAA,iBAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAInB,iBAAiB,YAChB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,cAAc;AAAA,oBAAA;AAAA,oBAGf,UAAA,iBAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAKtB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,qBAAqB;AAAA,sBACrB,KAAK;AAAA,sBACL,UAAU;AAAA,sBACV,WAAW,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,sBAClD,YAAY;AAAA,oBAAA;AAAA,oBAGd,UAAA;AAAA,sBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,SAAA,CAAM;AAAA,0CAC1D,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAS,YAAY,OAAO,WAAW,WAAW,KAAA,GACxF,qBAAW,iBAAiB,OAAO,IAAI,GAC1C;AAAA,sBAEC,iBAAiB,OAChB,qBAAA,UAAA,EACE,UAAA;AAAA,wBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,OAAA,CAAI;AAAA,4CACxD,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAS,YAAY,OAAO,WAAW,WAAW,KAAA,GACxF,qBAAW,iBAAiB,KAAK,IAAI,GACxC;AAAA,wBAEA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,YAAA,CAAS;AAAA,wBAC9D,oBAAC,UAAK,OAAO,EAAE,OAAO,OAAO,OAAO,OAAO,WAAW,YAAY,OAC/D,UAAA,eAAe,iBAAiB,IAAI,QAAA,IAAY,iBAAiB,MAAM,QAAA,CAAS,EAAA,CACnF;AAAA,sBAAA,GACF;AAAA,sBAGF,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,OAAA,CAAI;AAAA,sBACzD,oBAAC,UAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,MAAM,UAAU,cAC1G,UAAA,UAAU,iBAAiB,KAAK,EAAA,CACnC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAID,gBACC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,WAAW;AAAA,sBACX,YAAY;AAAA,sBACZ,WAAW,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,sBAClD,UAAU;AAAA,sBACV,OAAO,OAAO,OAAO,KAAK;AAAA,sBAC1B,WAAW;AAAA,oBAAA;AAAA,oBAEd,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED;AAAA,YAAA;AAAA,UAAA;AAAA,UAKJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,iBAAiB;AAAA,gBACjB,aAAa,aAAa,eAAe,iBAAiB,MAAM,CAAC;AAAA,gBACjE,cAAc,aAAa,eAAe,iBAAiB,MAAM,CAAC;AAAA,cAAA;AAAA,YACpE;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,wBAKH,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKiB,OAAO,OAAO,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOnC,OAAO,OAAO,WAAW,QAAQ;AAAA;AAAA;AAAA;AAAA,wBAIjC,OAAO,OAAO,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA,wBAI5B,OAAO,OAAO,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAY5C;AAAA,EAAA,GACJ;AAEJ,CAAC;AAkBD,MAAM,cAAc,KAAK,SAASC,aAAY;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,OAAO;AACT,GAAqB;AACnB,QAAM,EAAE,OAAA,IAAW,SAAA;AACnB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA0C,IAAI;AAE5F,QAAM,gBAAgB,IAAI,QAAA,IAAY,MAAM,QAAA;AAC5C,QAAM,kBAAkB;AACxB,QAAM,UAAU,iBAAiB;AAGjC,QAAM,kBAAkB,YAAY,CAAC,SAAe;AAClD,QAAI,eAAe,YAAY;AAC7B,YAAM,OAAO,KAAK,QAAA,IAAY,QAAQ,QAAA;AACtC,YAAM,eAAe,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,GAAI;AACrD,YAAM,QAAQ,KAAK,MAAM,eAAe,IAAI;AAC5C,YAAM,UAAU,KAAK,MAAO,eAAe,OAAQ,EAAE;AACrD,YAAM,UAAU,eAAe;AAE/B,UAAI,QAAQ,GAAG;AACb,eAAO,GAAG,KAAK,KAAK,OAAO;AAAA,MAC7B;AACA,aAAO,GAAG,OAAO,KAAK,OAAO;AAAA,IAC/B,WAAW,eAAe,OAAO;AAC/B,aAAO,KAAK,YAAA,EAAc,MAAM,IAAI,EAAE,IAAI;AAAA,IAC5C;AACA,WAAO,KAAK,mBAAmB,IAAI,EAAE,MAAM,WAAW,QAAQ,WAAW;AAAA,EAC3E,GAAG,CAAC,YAAY,OAAO,CAAC;AAGxB,QAAM,aAAa,QAAQ,MAAM;AAC/B,UAAM,SAA4C,CAAA;AAClD,UAAM,iBAAiB;AACvB,UAAM,aAAa,KAAK,MAAM,iBAAiB,IAAI;AAEnD,aAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,YAAM,UAAW,IAAI,aAAc;AACnC,YAAM,OAAO,IAAI,KAAK,MAAM,YAAa,gBAAgB,UAAU,GAAI;AACvE,aAAO,KAAK,EAAE,MAAM,QAAA,CAAS;AAAA,IAC/B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,eAAe,IAAI,CAAC;AAG/B,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,UAA2C,CAAA;AACjD,WAAO,QAAQ,CAAA,UAAS;AACtB,cAAQ,MAAM,EAAE,IAAI,OAAO,OAAO,CAAA,MAAK,EAAE,UAAU,MAAM,EAAE;AAAA,IAC7D,CAAC;AACD,UAAM,aAAa,OAAO,OAAO,CAAA,MAAK,CAAC,EAAE,KAAK;AAC9C,QAAI,WAAW,SAAS,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAQ,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAI,QAAQ,OAAO,CAAC,EAAE,EAAE,KAAK,CAAA,GAAK,GAAG,UAAU;AAAA,IAC1E;AACA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,mBAAmB,CAAC,UAAyB;AACjD,UAAM,YAAY,MAAM,MAAM,QAAA;AAC9B,YAAS,YAAY,MAAM,QAAA,KAAa,gBAAiB;AAAA,EAC3D;AAEA,QAAM,iBAAiB,CAAC,WAAoB;AAC1C,QAAI,CAAC,OAAQ,QAAO,OAAO,OAAO,OAAO;AACzC,WAAO,OAAO,OAAO,OAAO,MAA2C,KAAK,OAAO,OAAO,OAAO;AAAA,EACnG;AAEA,QAAM,mBAAmB,OAAO,KAAK,CAAA,MAAK,EAAE,OAAO,YAAY;AAE/D,8BACG,OAAA,EAAI,OAAO,EAAE,UAAU,cACtB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO,GAAG,OAAO,GAAG;AAAA,UACpB,UAAU;AAAA,UACV,UAAU;AAAA,QAAA;AAAA,QAId,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,cAAc,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,cAAA;AAAA,cAGxD,UAAA,WAAW,IAAI,CAAC,OAAO,UACtB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,MAAM,GAAG,MAAM,OAAO;AAAA,oBACtB,WAAW;AAAA,oBACX,KAAK;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO,OAAO,OAAO,KAAK;AAAA,oBAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,oBACzC,YAAY;AAAA,oBACZ,YAAY;AAAA,kBAAA;AAAA,kBAGb,UAAA,gBAAgB,MAAM,IAAI;AAAA,gBAAA;AAAA,gBAbtB;AAAA,cAAA,CAeR;AAAA,YAAA;AAAA,UAAA;AAAA,UAIF,OAAO,IAAI,CAAC,OAAO,eAClB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,QAAQ,MAAM,UAAU;AAAA,gBACxB,cAAc,aAAa,OAAO,SAAS,IACvC,aAAa,OAAO,OAAO,OAAO,KAAK,OACvC;AAAA,cAAA;AAAA,cAIN,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,YAAY;AAAA;AAAA,sBACZ,OAAO,OAAO,OAAO,KAAK;AAAA,oBAAA;AAAA,oBAG3B,UAAA,MAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIT;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,UAAU;AAAA,sBACV,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,YAAY;AAAA,oBAAA;AAAA,oBAId,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,MAAM;AAAA,4BACN,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,iBAAiB,OAAO,OAAO,OAAO;AAAA,4BACtC,SAAS;AAAA,0BAAA;AAAA,wBACX;AAAA,sBAAA;AAAA,uBAIA,cAAc,MAAM,EAAE,KAAK,CAAA,GAAI,IAAI,CAAC,UAAU;AAC9C,8BAAM,cAAc,iBAAiB,KAAK;AAC1C,8BAAM,QAAQ,eAAe,MAAM,MAAM;AACzC,8BAAM,YAAY,iBAAiB,MAAM;AACzC,8BAAM,UAAU,YAAY,KAAK;AACjC,8BAAM,kBAAkB,MAAM,UAAU;AAExC,+BACE;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,MAAK;AAAA,4BACL,SAAS,MAAM,6CAAe;AAAA,4BAC9B,cAAc,CAAC,MAAM;AACnB,8CAAgB,MAAM,EAAE;AACxB,oCAAM,OAAO,EAAE,cAAc,sBAAA;AAC7B,iDAAmB,EAAE,GAAG,KAAK,OAAO,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAA,CAAK;AAAA,4BACnE;AAAA,4BACA,cAAc,MAAM;AAClB,8CAAgB,IAAI;AACpB,iDAAmB,IAAI;AAAA,4BACzB;AAAA,4BACA,OAAO;AAAA,8BACL,UAAU;AAAA,8BACV,MAAM,GAAG,WAAW;AAAA,8BACpB,WAAW;AAAA,8BACX,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,QAAQ;AAAA,8BACR,QAAQ;AAAA,8BACR,YAAY;AAAA,8BACZ,QAAQ,YAAY,KAAK;AAAA,8BACzB,YAAY;AAAA,4BAAA;AAAA,4BAEd,cAAY,MAAM;AAAA,4BAElB,8BAAC,sBAAA,EAAqB,QAAQ,iBAAiB,WAAW,OAAO,MAAM,QAAA,CAAS;AAAA,0BAAA;AAAA,0BA5B3E,MAAM;AAAA,wBAAA;AAAA,sBA+BjB,CAAC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH;AAAA,YAAA;AAAA,YAzFK,MAAM;AAAA,UAAA,CA2Fd;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIA,oBAAoB,mBACnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,gBAAgB;AAAA,UACtB,KAAK,gBAAgB,IAAI;AAAA,UACzB,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,UACjD,cAAc,OAAO,aAAa;AAAA,UAClC,SAAS;AAAA,UACT,UAAU;AAAA,UACV,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,WAAW,6CAA6C,OAAO,OAAO,OAAO,OAAO;AAAA,UACpF,gBAAgB;AAAA,UAChB,WAAW;AAAA,QAAA;AAAA,QAIb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,iBAAiB;AAAA,gBACjB,aAAa,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,gBACtD,cAAc,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,cAAA;AAAA,YACzD;AAAA,UAAA;AAAA,UAID,iBAAiB,UAChB,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,cAAc,KACzE,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,QAAQ,iBAAiB;AAAA,gBACzB,WAAW,eAAe,iBAAiB,MAAM;AAAA,gBACjD,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAER;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO,eAAe,iBAAiB,MAAM;AAAA,kBAC7C,eAAe;AAAA,kBACf,eAAe;AAAA,gBAAA;AAAA,gBAGhB,UAAA,iBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,YAEnB,iBAAiB,SAChB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,cAAc,OAAO,aAAa;AAAA,kBAClC,iBAAiB,GAAG,eAAe,iBAAiB,MAAM,CAAC;AAAA,kBAC3D,OAAO,eAAe,iBAAiB,MAAM;AAAA,gBAAA;AAAA,gBAG9C,UAAA,iBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,UACpB,GAEJ;AAAA,UAIF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,cAAc;AAAA,cAAA;AAAA,cAGf,UAAA,iBAAiB;AAAA,YAAA;AAAA,UAAA;AAAA,UAIpB,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAA,GAC3D,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,UAAU;AAAA,gBAAA;AAAA,gBAGZ,UAAA;AAAA,kBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,QAAA,CAAK;AAAA,sCACzD,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,KAAA,GAC1F,UAAA,gBAAgB,iBAAiB,KAAK,EAAA,CACzC;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,iBAAiB,SAChB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,UAAU;AAAA,gBAAA;AAAA,gBAGZ,UAAA;AAAA,kBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,WAAA,CAAQ;AAAA,kBAC7D,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,eAAe,OAAO,OAAO,OAAO,OAAO,GAAG,YAAY,IAAA,GAC7E,2BAAiB,MAAA,CACpB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAIJ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,UAAU;AAAA,gBAAA;AAAA,gBAGZ,UAAA;AAAA,kBAAA,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,SAAA,GAAY,UAAA,OAAA,CAAI;AAAA,kBACzD,oBAAC,QAAA,EAAK,OAAO,EAAE,OAAO,OAAO,OAAO,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,QAC1F,UAAA,iBAAiB,MAAM,YAAA,EAAc,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,EAAA,CACrE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,iBAAiB,YAChB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,WAAW,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,kBAClD,UAAU;AAAA,kBACV,OAAO,OAAO,OAAO,KAAK;AAAA,gBAAA;AAAA,gBAG3B,UAAA,iBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,UACpB,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,wBAKH,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAmBN;AAAA,EAAA,GACJ;AAEJ,CAAC;AAMM,MAAM,kBAAkB,KAAK,SAASC,iBAAgB;AAAA,EAC3D,QAAQ;AAAA,EACR;AAAA,EACA,SAAS,CAAA;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,cAAc;AAAA,EACd,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa,eAAe;AAAA,EAC5B,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,WAAW,aAAa;AAAA,EACxB,UAAU;AAAA,EACV;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AACnB,GAAyB;AACvB,QAAM,EAAE,QAAQ,MAAA,IAAU,SAAA;AAC1B,QAAM,qBAAqB,UAAU,iBAAiB,UAAU,sBAAsB,UAAU;AAChG,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAA2B,WAAW;AACtF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,WAAW;AAC5C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAyB,CAAA,CAAE;AAEzE,QAAM,WAAW,sBAAsB;AAEvC,QAAM,uBAAuB,YAAY,CAAC,SAA2B;AACnE,wBAAoB,IAAI;AACxB,yDAAmB;AAAA,EACrB,GAAG,CAAC,gBAAgB,CAAC;AAGrB,QAAM,EAAE,OAAO,IAAA,IAAQ,QAAQ,MAAM;AACnC,QAAI,aAAa,SAAS;AACxB,aAAO,EAAE,OAAO,WAAW,KAAK,QAAA;AAAA,IAClC;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,0BAAU,KAAA;AAChB,aAAO;AAAA,QACL,OAAO,IAAI,KAAK,IAAI,QAAA,IAAY,IAAO;AAAA,QACvC,KAAK,IAAI,KAAK,IAAI,QAAA,IAAY,IAAO;AAAA,MAAA;AAAA,IAEzC;AAEA,QAAI,UAAU,OAAO,CAAC,EAAE,MAAM,QAAA;AAC9B,QAAI,UAAU,OAAO,CAAC,EAAE,MAAM,QAAA;AAE9B,WAAO,QAAQ,CAAA,UAAS;AACtB,gBAAU,KAAK,IAAI,SAAS,MAAM,MAAM,SAAS;AACjD,gBAAU,KAAK,IAAI,UAAU,MAAM,OAAO,MAAM,OAAO,SAAS;AAAA,IAClE,CAAC;AAGD,UAAM,WAAW,UAAU;AAC3B,UAAM,UAAU,WAAW;AAE3B,WAAO;AAAA,MACL,OAAO,IAAI,KAAK,UAAU,OAAO;AAAA,MACjC,KAAK,IAAI,KAAK,UAAU,OAAO;AAAA,IAAA;AAAA,EAEnC,GAAG,CAAC,QAAQ,WAAW,OAAO,CAAC;AAG/B,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,UAAM,+BAAe,IAAA;AACrB,WAAO,QAAQ,CAAA,UAAS;AACtB,UAAI,MAAM,MAAO,UAAS,IAAI,MAAM,KAAK;AAAA,IAC3C,CAAC;AAED,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,CAAC,EAAE,IAAI,WAAW,OAAO,UAAU,QAAQ,aAAa;AAAA,IACjE;AAEA,WAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAA,QAAO;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,EACR;AAAA,EACJ,GAAG,CAAC,QAAQ,QAAQ,WAAW,CAAC;AAGhC,QAAM,eAAe,QAAQ,MAAM;AACjC,WAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,QAAA,IAAY,EAAE,MAAM,SAAS;AAAA,EACzE,GAAG,CAAC,MAAM,CAAC;AAEX,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,WAAW,2BAA2B,SAAS;AAAA,MAC1D,OAAO;AAAA,QACL,iBAAiB,qBAAqB,gBAAgB,OAAO,OAAO,WAAW;AAAA,QAC/E,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,aAAA;AAAA,QAChF,GAAI,OAAO,OAAO,OAAO,aAAa,EAAE,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK,GAAA;AAAA,QACvF,cAAc,OAAO,aAAa;AAAA,QAClC,UAAU;AAAA,MAAA;AAAA,MAIZ,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,SAAS;AAAA,cACT,cAAc,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,YAAA;AAAA,YAGvD,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,YAAY;AAAA;AAAA,oBACZ,OAAO,OAAO,OAAO,KAAK;AAAA,kBAAA;AAAA,kBAG3B,UAAA;AAAA,oBAAA;AAAA,oBAAM;AAAA,oBAAG,OAAO;AAAA,oBAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAI1B,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAA,GAEvD,UAAA;AAAA,gBAAA,aAAa,aAAa,WAAW,aAAa,cACjD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,cAAc;AAAA,sBACd,aAAa,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,oBAAA;AAAA,oBAGxD,UAAA;AAAA,sBAAA,oBAAC,SAAA,EAAQ,SAAQ,YACf,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAW;AAAA,0BACX,SAAS,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC;AAAA,0BAC9C,UAAU,QAAQ;AAAA,0BAClB,OAAO;AAAA,4BACL,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,gBAAgB;AAAA,4BAChB,iBAAiB,QAAQ,IAAI,gBAAgB,OAAO,OAAO,WAAW;AAAA,4BACtE,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,4BAC/C,cAAc,OAAO,aAAa;AAAA,4BAClC,OAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,WAAW,OAAO,OAAO,KAAK;AAAA,4BACpE,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,4BACpC,UAAU;AAAA,4BACV,YAAY;AAAA;AAAA,4BACZ,SAAS,QAAQ,IAAI,MAAM;AAAA,0BAAA;AAAA,0BAE9B,UAAA;AAAA,wBAAA;AAAA,sBAAA,GAGH;AAAA,sBACA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,WAAW;AAAA,4BACX,UAAU;AAAA,4BACV,YAAY,OAAO,WAAW,WAAW;AAAA,4BACzC,OAAO,OAAO,OAAO,KAAK;AAAA,0BAAA;AAAA,0BAG3B,UAAA;AAAA,4BAAA,KAAK,MAAM,OAAO,GAAG;AAAA,4BAAE;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAE1B,oBAAC,SAAA,EAAQ,SAAQ,WACf,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAW;AAAA,0BACX,SAAS,MAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC;AAAA,0BAC9C,UAAU,QAAQ;AAAA,0BAClB,OAAO;AAAA,4BACL,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,gBAAgB;AAAA,4BAChB,iBAAiB,QAAQ,IAAI,gBAAgB,OAAO,OAAO,WAAW;AAAA,4BACtE,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,4BAC/C,cAAc,OAAO,aAAa;AAAA,4BAClC,OAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,WAAW,OAAO,OAAO,KAAK;AAAA,4BACpE,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,4BACpC,UAAU;AAAA,4BACV,YAAY;AAAA;AAAA,4BACZ,SAAS,QAAQ,IAAI,MAAM;AAAA,0BAAA;AAAA,0BAE9B,UAAA;AAAA,wBAAA;AAAA,sBAAA,GAGH;AAAA,sBACA,oBAAC,SAAA,EAAQ,SAAQ,cACf,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAW;AAAA,0BACX,SAAS,MAAM,QAAQ,CAAC;AAAA,0BACxB,OAAO;AAAA,4BACL,QAAQ;AAAA,4BACR,SAAS;AAAA,4BACT,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,gBAAgB;AAAA,4BAChB,iBAAiB,OAAO,OAAO,WAAW;AAAA,4BAC1C,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,4BAC/C,cAAc,OAAO,aAAa;AAAA,4BAClC,OAAO,OAAO,OAAO,KAAK;AAAA,4BAC1B,QAAQ;AAAA,4BACR,UAAU;AAAA,4BACV,YAAY;AAAA,0BAAA;AAAA,0BAEf,UAAA;AAAA,wBAAA;AAAA,sBAAA,EAED,CACF;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAKD,kBACC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,KAAK;AAAA,sBACL,iBAAiB,qBAAqB,gBAAgB,OAAO,OAAO,WAAW;AAAA,sBAC/E,GAAI,sBAAsB,EAAE,gBAAgB,cAAc,sBAAsB,aAAA;AAAA,sBAChF,SAAS;AAAA,sBACT,cAAc,OAAO,aAAa;AAAA,oBAAA;AAAA,oBAGlC,WAAC,SAAS,QAAQ,SAAS,EAAyB,IAAI,CAAC,SAAS;AAClE,4BAAM,WAAW,aAAa;AAC9B,4BAAM,QAAiE;AAAA,wBACrE,OAAO;AAAA,wBACP,MAAM;AAAA,wBACN,SAAS;AAAA,sBAAA;AAEX,4BAAM,SAA2C;AAAA,wBAC/C,OAAO;AAAA,wBACP,MAAM;AAAA,wBACN,SAAS;AAAA,sBAAA;AAGX,6BACE,oBAAC,SAAA,EAAmB,SAAS,OAAO,IAAI,GACtC,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAY,OAAO,IAAI;AAAA,0BACvB,SAAS,MAAM,qBAAqB,IAAI;AAAA,0BACxC,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,gBAAgB;AAAA,4BAChB,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,iBAAiB,WAAW,OAAO,OAAO,OAAO,UAAU;AAAA,4BAC3D,QAAQ;AAAA,4BACR,cAAc,OAAO,aAAa;AAAA,4BAClC,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK;AAAA,4BACjD,QAAQ;AAAA,4BACR,YAAY;AAAA,4BACZ,WAAW,WAAW,aAAa;AAAA,4BACnC,WAAW,WAAW,aAAa,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,0BAAA;AAAA,0BAExE,cAAc,CAAC,MAAM;AACnB,gCAAI,CAAC,UAAU;AACb,gCAAE,cAAc,MAAM,kBAAkB,GAAG,OAAO,OAAO,OAAO,OAAO;AACvE,gCAAE,cAAc,MAAM,YAAY;AAAA,4BACpC;AAAA,0BACF;AAAA,0BACA,cAAc,CAAC,MAAM;AACnB,gCAAI,CAAC,UAAU;AACb,gCAAE,cAAc,MAAM,kBAAkB;AACxC,gCAAE,cAAc,MAAM,YAAY;AAAA,4BACpC;AAAA,0BACF;AAAA,0BAEA,8BAAC,MAAA,EAAK,MAAM,MAAM,IAAI,GAAG,MAAM,GAAA,CAAI;AAAA,wBAAA;AAAA,sBAAA,KAjCzB,IAmCd;AAAA,oBAEJ,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH,EAAA,CAEJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAID,WACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,iBAAiB,GAAG,OAAO,OAAO,WAAW,OAAO;AAAA,cACpD,gBAAgB;AAAA,cAChB,QAAQ;AAAA,YAAA;AAAA,YAGV,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,kBAC/C,gBAAgB,OAAO,OAAO,OAAO;AAAA,kBACrC,cAAc;AAAA,kBACd,WAAW;AAAA,gBAAA;AAAA,cACb;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,QAKJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS,aAAa,SAAS,cAAc;AAAA,cAC7C;AAAA,cACA,WAAW,YAAY,SAAS;AAAA,cAChC,WAAW,aAAa,SAAS,SAAS;AAAA,YAAA;AAAA,YAG3C,UAAA,OAAO,WAAW,IACjB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,eAAe;AAAA,kBACf,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,SAAS;AAAA,kBACT,OAAO,OAAO,OAAO,KAAK;AAAA,kBAC1B,KAAK;AAAA,gBAAA;AAAA,gBAGP,UAAA;AAAA,kBAAA,oBAAC,MAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,sCAC5B,QAAA,EAAK,OAAO,EAAE,UAAU,WAAA,GAAc,UAAA,uBAAA,CAAoB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA,IAE3D,aAAa;AAAA;AAAA,cAEf,aAAa,IAAI,CAAC,OAAO,UACvB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC;AAAA,kBACA,QAAQ,UAAU,aAAa,SAAS;AAAA,kBACxC;AAAA,gBAAA;AAAA,gBAHK,MAAM;AAAA,cAAA,CAKd;AAAA,gBACC,aAAa;AAAA;AAAA,cAEf;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,QAAQ;AAAA,kBACR;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,eAAe,iBAAiB;AAAA,kBAChC;AAAA,gBAAA;AAAA,cAAA;AAAA;AAAA;AAAA,cAIF;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,QAAQ;AAAA,kBACR;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,kBAAkB;AAAA,kBAClB;AAAA,gBAAA;AAAA,cAAA;AAAA;AAAA,UACF;AAAA,QAAA;AAAA,4BAKH,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGR,CAAC;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zendir/ui - Space Operations Components
|
|
3
|
+
*
|
|
4
|
+
* Pure React components following Astro UX Design System principles.
|
|
5
|
+
* Zero external dependencies - fully self-contained implementations.
|
|
6
|
+
*
|
|
7
|
+
* Design patterns follow:
|
|
8
|
+
* - Astro UX Design System (U.S. Space Force)
|
|
9
|
+
* - WCAG 2.1 AA accessibility standards
|
|
10
|
+
* - Space operations best practices
|
|
11
|
+
*
|
|
12
|
+
* Key Features:
|
|
13
|
+
* - 6-level status system (off, standby, normal, caution, serious, critical)
|
|
14
|
+
* - Dual coding for accessibility (color + shape)
|
|
15
|
+
* - Tabular numbers for data displays
|
|
16
|
+
* - Dark theme optimized
|
|
17
|
+
* - Keyboard navigable
|
|
18
|
+
* - Screen reader support
|
|
19
|
+
*/
|
|
20
|
+
export { StatusIndicator } from './StatusIndicator';
|
|
21
|
+
export type { StatusIndicatorProps, StatusVariant } from './StatusIndicator';
|
|
22
|
+
export { ClassificationBanner } from './ClassificationBanner';
|
|
23
|
+
export type { ClassificationBannerProps, ClassificationLevel } from './ClassificationBanner';
|
|
24
|
+
export { GlobalStatusBar } from './GlobalStatusBar';
|
|
25
|
+
export type { GlobalStatusBarProps } from './GlobalStatusBar';
|
|
26
|
+
export { MissionClock, SimpleTimer, MissionElapsedTime, SimulationClock } from './MissionClock';
|
|
27
|
+
export type { MissionClockProps, SimpleTimerProps, MissionElapsedTimeProps, SimulationClockProps, ClockFormat, DateFormat, TimeSource, TimerConfig, SimulationTimeConfig, } from './MissionClock';
|
|
28
|
+
export { SimulationControls, MiniSimulationControls, SimulationControlsWithClock } from './SimulationControls';
|
|
29
|
+
export type { SimulationControlsProps, MiniSimulationControlsProps, SimulationControlsWithClockProps, SimulationState, } from './SimulationControls';
|
|
30
|
+
export { MonitoringIcon } from './MonitoringIcon';
|
|
31
|
+
export type { MonitoringIconProps, MonitoringStatus } from './MonitoringIcon';
|
|
32
|
+
export { Progress } from './Progress';
|
|
33
|
+
export type { ProgressProps } from './Progress';
|
|
34
|
+
export { Notification } from './Notification';
|
|
35
|
+
export type { NotificationProps, NotificationStatus } from './Notification';
|
|
36
|
+
/**
|
|
37
|
+
* Timeline - Enterprise-grade timeline with 3 view modes
|
|
38
|
+
*
|
|
39
|
+
* Supports Gantt chart, List, and Scatter views with seamless switching.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* import { Timeline, type TimelineEvent } from '@zendir/ui/react';
|
|
44
|
+
*
|
|
45
|
+
* <Timeline
|
|
46
|
+
* title="Mission Timeline"
|
|
47
|
+
* events={events}
|
|
48
|
+
* defaultView="chart"
|
|
49
|
+
* />
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export { UnifiedTimeline as Timeline } from './UnifiedTimeline';
|
|
53
|
+
export type { UnifiedTimelineProps as TimelineProps, TimelineEvent, TimelineTrackDef, TimelineViewMode, TimeFormat, TimelineFilter, } from './UnifiedTimeline';
|
|
54
|
+
/**
|
|
55
|
+
* Status type (shared across components)
|
|
56
|
+
* Follows Astro UX 6-level status semantics
|
|
57
|
+
*/
|
|
58
|
+
export type AstroStatus = 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';
|
|
59
|
+
/**
|
|
60
|
+
* Classification levels (shared across components)
|
|
61
|
+
* Per DoD standards
|
|
62
|
+
*/
|
|
63
|
+
export type AstroClassification = 'unclassified' | 'cui' | 'controlled' | 'confidential' | 'secret' | 'top-secret' | 'top-secret-sci';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { AccessData, AccessWindow } from '../types';
|
|
3
|
+
|
|
4
|
+
export interface AccessCardProps {
|
|
5
|
+
/** Current access data */
|
|
6
|
+
access?: AccessData;
|
|
7
|
+
/** Ground station name */
|
|
8
|
+
groundStationName: string;
|
|
9
|
+
/** Spacecraft name */
|
|
10
|
+
spacecraftName?: string;
|
|
11
|
+
/** Next access windows */
|
|
12
|
+
upcomingWindows?: AccessWindow[];
|
|
13
|
+
/** Loading state */
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
/** Custom className */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Enable compact mode - shows condensed view that expands on hover/click */
|
|
18
|
+
compact?: boolean;
|
|
19
|
+
/** Start expanded when in compact mode (pinned state) */
|
|
20
|
+
defaultExpanded?: boolean;
|
|
21
|
+
/** Callback when pin state changes in compact mode */
|
|
22
|
+
onPinChange?: (isPinned: boolean) => void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* AccessCard - Displays spacecraft-ground station link status
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <AccessCard
|
|
30
|
+
* access={accessData}
|
|
31
|
+
* groundStationName="Goldstone"
|
|
32
|
+
* spacecraftName="ISS"
|
|
33
|
+
* upcomingWindows={windows}
|
|
34
|
+
* />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const AccessCard: React.NamedExoticComponent<AccessCardProps>;
|