@zendir/ui 0.1.13 → 0.1.15

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.
@@ -1 +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":"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"}
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';\nimport { Checkbox } from '../core/Checkbox';\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 /** Secondary accent color for team/category identification (CSS color string).\n * List: thin top stripe. Chart/Gantt: optional thin top stripe only; status is shown via Astro shape + hover, not a top line.\n * Scatter: outer ring around the dot. Does NOT override status coloring. */\n color?: string;\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 (empty / omitted = all tracks) */\n tracks?: string[];\n /** Filter by display status (multi-select; empty / omitted = all) */\n status?: TimelineEvent['status'][];\n /** Case-insensitive match on title, subtitle, badge, track, argument values */\n search?: string;\n /** Duration shape: point (no end or zero length), range (has end after start), all */\n eventShape?: 'all' | 'point' | 'range';\n /** Only events with a team/category accent (`event.color`) */\n teamColoredOnly?: boolean;\n}\n\nconst ALL_TIMELINE_STATUSES: TimelineEvent['status'][] = [\n 'off',\n 'standby',\n 'normal',\n 'caution',\n 'serious',\n 'critical',\n];\n\n/** Display status used for filtering and markers (badgeVariant overrides raw status when set). */\nexport function getTimelineEventDisplayStatus(event: TimelineEvent): TimelineEvent['status'] {\n if (event.badgeVariant && event.badgeVariant !== 'default' && event.badgeVariant !== 'primary') {\n return event.badgeVariant as TimelineEvent['status'];\n }\n return event.status ?? 'normal';\n}\n\nexport function isTimelineFilterActive(filter: TimelineFilter): boolean {\n return Boolean(\n (filter.search && filter.search.trim()) ||\n (filter.tracks && filter.tracks.length > 0) ||\n (filter.status && filter.status.length > 0) ||\n (filter.eventShape && filter.eventShape !== 'all') ||\n filter.teamColoredOnly\n );\n}\n\nfunction normalizeTimelineFilter(f: TimelineFilter): TimelineFilter {\n const o: TimelineFilter = {};\n const s = f.search?.trim();\n if (s) o.search = s;\n if (f.tracks?.length) o.tracks = [...f.tracks];\n if (f.status?.length) o.status = [...f.status];\n if (f.eventShape && f.eventShape !== 'all') o.eventShape = f.eventShape;\n if (f.teamColoredOnly) o.teamColoredOnly = true;\n return o;\n}\n\nexport function matchesTimelineFilter(event: TimelineEvent, filter: TimelineFilter): boolean {\n if (!isTimelineFilterActive(filter)) return true;\n\n if (filter.tracks?.length) {\n const tid = event.track ?? 'default';\n if (!filter.tracks.includes(tid)) return false;\n }\n\n if (filter.status?.length) {\n const ds = getTimelineEventDisplayStatus(event);\n if (!filter.status.includes(ds)) return false;\n }\n\n const q = filter.search?.trim().toLowerCase();\n if (q) {\n const argStr = event.arguments\n ? Object.values(event.arguments)\n .map((v) => String(v))\n .join(' ')\n : '';\n const hay = [\n event.title,\n event.subtitle,\n event.badge,\n event.track,\n argStr,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n if (!hay.includes(q)) return false;\n }\n\n if (filter.eventShape === 'point') {\n const endT = event.end?.getTime();\n const st = event.start.getTime();\n if (endT != null && endT > st) return false;\n }\n if (filter.eventShape === 'range') {\n const endT = event.end?.getTime();\n const st = event.start.getTime();\n if (endT == null || endT <= st) return false;\n }\n\n if (filter.teamColoredOnly && !event.color) return false;\n\n return true;\n}\n\nfunction countTimelineFilterChips(filter: TimelineFilter): number {\n let n = 0;\n if (filter.search?.trim()) n++;\n if (filter.tracks?.length) n++;\n if (filter.status?.length) n++;\n if (filter.eventShape && filter.eventShape !== 'all') n++;\n if (filter.teamColoredOnly) n++;\n return n;\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 advanced filter & search toolbar (enable/disable for end users) */\n showFilters?: boolean;\n /** Collapsed by default; set true to start with filters expanded */\n filtersDefaultExpanded?: boolean;\n /** When any filter is active, hide chart/scatter track rows that have no matching events */\n hideEmptyTracksWhenFiltered?: boolean;\n /** Controlled filter state */\n filter?: TimelineFilter;\n /** Filter change handler (receives normalized filter object) */\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 position: 'relative',\n flex: 1,\n marginBottom: '16px',\n padding: event.color ? '19px 20px 16px 20px' : '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 overflow: 'hidden',\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 {/* Team color top stripe (secondary accent) */}\n {event.color && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 3,\n backgroundColor: event.color,\n }}\n />\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 displayStatus: TimelineEvent['status'] =\n event.badgeVariant && event.badgeVariant !== 'default' && event.badgeVariant !== 'primary'\n ? event.badgeVariant\n : (event.status ?? 'normal');\n const color = getStatusColor(displayStatus);\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 ? 30 : 38;\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 {/* Team-only top stripe; status is not duplicated as a line (shape + border/hover carry severity). */}\n {event.color ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 2,\n backgroundColor: event.color,\n borderRadius: '4px 4px 0 0',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n aria-hidden\n />\n ) : null}\n\n {/* Content: status symbol + title */}\n <div\n style={{\n flex: 1,\n padding: `${event.color ? 6 : 4}px 8px 4px 8px`,\n overflow: 'hidden',\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n minWidth: 0,\n }}\n >\n <TimelineStatusMarker\n status={displayStatus}\n fillColor={color}\n size={hasOverlap ? 8 : 10}\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 minWidth: 0,\n }}\n >\n {event.title}\n </span>\n </div>\n\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 paddingLeft: 16,\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 const tooltipColor = getStatusColor(hoveredEventData.status);\n return (\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 ${tooltipColor}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 ${tooltipColor}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={tooltipColor}\n size={10}\n />\n <span\n style={{\n fontSize: '0.75rem',\n fontWeight: 500, // AstroUXDS medium (was 600)\n color: tooltipColor,\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: `${tooltipColor}20`,\n color: tooltipColor,\n }}\n >\n {hoveredEventData.badge}\n </span>\n )}\n </div>\n\n {/* Team color indicator */}\n {hoveredEventData.color && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: hoveredEventData.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: hoveredEventData.color, fontWeight: 500 }}>\n {(hoveredEventData.arguments as any)?.Team || hoveredEventData.badge || 'Team'}\n </span>\n </div>\n )}\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 ${tooltipColor}50`,\n borderBottom: `1px solid ${tooltipColor}50`,\n }}\n />\n </div>\n );\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 borderRadius: '50%',\n boxShadow: event.color ? `0 0 0 2px ${event.color}` : undefined,\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 const scatterTipColor = getStatusColor(hoveredEventData.status);\n return (\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 ${scatterTipColor}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 ${scatterTipColor}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 ${scatterTipColor}40`,\n borderBottom: `1px solid ${scatterTipColor}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={scatterTipColor}\n size={10}\n />\n <span\n style={{\n fontSize: '0.75rem',\n fontWeight: 500,\n color: scatterTipColor,\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: `${scatterTipColor}20`,\n color: scatterTipColor,\n }}\n >\n {hoveredEventData.badge}\n </span>\n )}\n </div>\n )}\n\n {/* Team color indicator */}\n {hoveredEventData.color && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: hoveredEventData.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: hoveredEventData.color, fontWeight: 500 }}>\n {(hoveredEventData.arguments as any)?.Team || hoveredEventData.badge || 'Team'}\n </span>\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 \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// Advanced filters toolbar (search, tracks, status, duration, team color)\n// ============================================================================\n\ninterface TimelineFiltersToolbarProps {\n filter: TimelineFilter;\n onFilterChange: (next: TimelineFilter) => void;\n trackOptions: { id: string; label: string }[];\n defaultExpanded: boolean;\n}\n\nconst TimelineFiltersToolbar = memo(function TimelineFiltersToolbar({\n filter,\n onFilterChange,\n trackOptions,\n defaultExpanded,\n}: TimelineFiltersToolbarProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const [expanded, setExpanded] = useState(defaultExpanded);\n const chipCount = countTimelineFilterChips(filter);\n\n const patch = useCallback(\n (partial: Partial<TimelineFilter>) => {\n onFilterChange(normalizeTimelineFilter({ ...filter, ...partial }));\n },\n [filter, onFilterChange]\n );\n\n const clearAll = useCallback(() => {\n onFilterChange({});\n }, [onFilterChange]);\n\n const toggleTrack = useCallback(\n (id: string) => {\n const cur = filter.tracks ?? [];\n const next = cur.includes(id) ? cur.filter((t) => t !== id) : [...cur, id];\n patch({ tracks: next.length ? next : undefined });\n },\n [filter.tracks, patch]\n );\n\n const toggleStatus = useCallback(\n (st: TimelineEvent['status']) => {\n const cur = filter.status ?? [];\n const next = cur.includes(st) ? cur.filter((s) => s !== st) : [...cur, st];\n patch({ status: next.length ? next : undefined });\n },\n [filter.status, patch]\n );\n\n const pillBase = (active: boolean): React.CSSProperties => ({\n padding: '4px 10px',\n borderRadius: tokens.borderRadius.full ?? 999,\n fontSize: '0.6875rem',\n fontWeight: 500,\n border: `1px solid ${active ? tokens.colors.accent.primary : tokens.colors.border.muted}`,\n backgroundColor: active ? `${tokens.colors.accent.primary}22` : tokens.colors.background.elevated,\n color: active ? tokens.colors.accent.primary : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'background-color 150ms ease, border-color 150ms ease, color 150ms ease',\n });\n\n return (\n <div\n style={{\n padding: '12px 20px',\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.elevated,\n ...(isTransparentTheme && { backdropFilter: 'blur(8px)', WebkitBackdropFilter: 'blur(8px)' as const }),\n }}\n >\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <div style={{ flex: '1 1 220px', minWidth: 0, position: 'relative' }}>\n <Icon\n name=\"search\"\n size={16}\n style={{\n position: 'absolute',\n left: 12,\n top: '50%',\n transform: 'translateY(-50%)',\n color: tokens.colors.text.tertiary,\n pointerEvents: 'none',\n }}\n />\n <input\n type=\"search\"\n value={filter.search ?? ''}\n onChange={(e) => patch({ search: e.target.value || undefined })}\n placeholder=\"Search title, badge, track, fields…\"\n aria-label=\"Search timeline events\"\n style={{\n width: '100%',\n boxSizing: 'border-box',\n height: 36,\n paddingLeft: 40,\n paddingRight: 12,\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.surface,\n color: tokens.colors.text.primary,\n fontSize: '0.8125rem',\n outline: 'none',\n }}\n />\n </div>\n\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n aria-controls=\"zendir-timeline-filters-panel\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n height: 36,\n padding: '0 14px',\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.surface,\n color: tokens.colors.text.primary,\n cursor: 'pointer',\n fontSize: '0.8125rem',\n fontWeight: 500,\n }}\n >\n Filters\n {chipCount > 0 ? (\n <Badge variant=\"filled\" size=\"small\" status=\"normal\">\n {chipCount}\n </Badge>\n ) : null}\n <Icon name={expanded ? 'chevron-up' : 'chevron-down'} size={18} />\n </button>\n\n {isTimelineFilterActive(filter) ? (\n <button\n type=\"button\"\n onClick={clearAll}\n style={{\n height: 36,\n padding: '0 12px',\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: 'transparent',\n color: tokens.colors.text.secondary,\n cursor: 'pointer',\n fontSize: '0.75rem',\n fontWeight: 500,\n }}\n >\n Clear all\n </button>\n ) : null}\n </div>\n\n {expanded ? (\n <div\n id=\"zendir-timeline-filters-panel\"\n style={{\n marginTop: 14,\n display: 'flex',\n flexDirection: 'column',\n gap: 14,\n }}\n >\n {trackOptions.length > 0 ? (\n <div>\n <div\n style={{\n fontSize: '0.625rem',\n fontWeight: 600,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: tokens.colors.text.tertiary,\n marginBottom: 8,\n }}\n >\n Tracks\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {trackOptions.map((t) => {\n const active = filter.tracks?.includes(t.id) ?? false;\n return (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => toggleTrack(t.id)}\n style={pillBase(active)}\n >\n {t.label}\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div>\n <div\n style={{\n fontSize: '0.625rem',\n fontWeight: 600,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: tokens.colors.text.tertiary,\n marginBottom: 8,\n }}\n >\n Status\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {ALL_TIMELINE_STATUSES.map((st) => {\n const active = filter.status?.includes(st) ?? false;\n return (\n <button key={st} type=\"button\" onClick={() => toggleStatus(st)} style={pillBase(active)}>\n {st}\n </button>\n );\n })}\n </div>\n </div>\n\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 16,\n }}\n >\n <div>\n <div\n style={{\n fontSize: '0.625rem',\n fontWeight: 600,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: tokens.colors.text.tertiary,\n marginBottom: 8,\n }}\n >\n Duration\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>\n {(['all', 'point', 'range'] as const).map((key) => {\n const active = (filter.eventShape ?? 'all') === key;\n return (\n <button key={key} type=\"button\" onClick={() => patch({ eventShape: key })} style={pillBase(active)}>\n {key === 'all' ? 'All' : key === 'point' ? 'Instant' : 'Range'}\n </button>\n );\n })}\n </div>\n </div>\n <Checkbox\n label=\"Team color only\"\n checked={Boolean(filter.teamColoredOnly)}\n onChange={(checked) => patch({ teamColoredOnly: checked || undefined })}\n size=\"small\"\n />\n </div>\n </div>\n ) : null}\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 filtersDefaultExpanded = false,\n hideEmptyTracksWhenFiltered = true,\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 const filter = _filter !== undefined ? _filter : _internalFilter;\n\n const setFilter = useCallback(\n (next: TimelineFilter) => {\n const n = normalizeTimelineFilter(next);\n if (_filter === undefined) _setInternalFilter(n);\n _onFilterChange?.(n);\n },\n [_filter, _onFilterChange]\n );\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 const filteredEvents = useMemo(\n () => events.filter((e) => matchesTimelineFilter(e, filter)),\n [events, filter]\n );\n\n const effectiveTracksForViews = useMemo(() => {\n if (!hideEmptyTracksWhenFiltered || !isTimelineFilterActive(filter)) return effectiveTracks;\n const ids = new Set(filteredEvents.map((e) => e.track || 'default'));\n return effectiveTracks.filter((t) => ids.has(t.id));\n }, [effectiveTracks, filteredEvents, filter, hideEmptyTracksWhenFiltered]);\n\n const trackOptionsForToolbar = useMemo(() => {\n if (tracks.length > 0) return tracks.map((t) => ({ id: t.id, label: t.label }));\n const u = new Set<string>();\n events.forEach((e) => {\n if (e.track) u.add(e.track);\n });\n if (u.size === 0) return [{ id: 'default', label: 'Events' }];\n return [...u].sort().map((id) => ({ id, label: id }));\n }, [events, tracks]);\n\n // Sort filtered events by start time (newest first for list view)\n const sortedEvents = useMemo(() => {\n return [...filteredEvents].sort((a, b) => b.start.getTime() - a.start.getTime());\n }, [filteredEvents]);\n\n const countLabel =\n !_showCount\n ? title\n : `${title} (${filteredEvents.length}${filteredEvents.length !== events.length ? ` / ${events.length}` : ''})`;\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 {countLabel}\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 {_showFilters ? (\n <TimelineFiltersToolbar\n filter={filter}\n onFilterChange={setFilter}\n trackOptions={trackOptionsForToolbar}\n defaultExpanded={filtersDefaultExpanded}\n />\n ) : null}\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 ) : filteredEvents.length === 0 ? (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 24px',\n color: tokens.colors.text.tertiary,\n gap: 12,\n textAlign: 'center',\n }}\n >\n <Icon name=\"search\" size={32} />\n <span style={{ fontSize: '0.875rem', color: tokens.colors.text.secondary }}>\n No events match the current filters.\n </span>\n {_showFilters && isTimelineFilterActive(filter) ? (\n <button\n type=\"button\"\n onClick={() => setFilter({})}\n style={{\n marginTop: 4,\n padding: '8px 16px',\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.accent.primary}`,\n backgroundColor: `${tokens.colors.accent.primary}18`,\n color: tokens.colors.accent.primary,\n cursor: 'pointer',\n fontSize: '0.8125rem',\n fontWeight: 500,\n }}\n >\n Clear filters\n </button>\n ) : null}\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={filteredEvents}\n tracks={effectiveTracksForViews}\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={filteredEvents}\n tracks={effectiveTracksForViews}\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","TimelineFiltersToolbar","UnifiedTimeline"],"mappings":"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"}