@zendir/ui 0.2.5 → 0.2.7
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.
|
@@ -17,6 +17,8 @@ const Z = {
|
|
|
17
17
|
sticky: 15,
|
|
18
18
|
/** Floating day-marker lines above track content */
|
|
19
19
|
dayMarker: 5,
|
|
20
|
+
/** Current-time playhead line — above sticky headers and events */
|
|
21
|
+
playhead: 25,
|
|
20
22
|
/** Loading overlay covering chart content */
|
|
21
23
|
loadingOverlay: 100,
|
|
22
24
|
/** Floating tooltips — above all chart chrome */
|
|
@@ -961,13 +963,13 @@ const ChartView = memo(function ChartView2({
|
|
|
961
963
|
{
|
|
962
964
|
style: {
|
|
963
965
|
position: "absolute",
|
|
964
|
-
top:
|
|
966
|
+
top: 0,
|
|
965
967
|
bottom: 0,
|
|
966
|
-
left: `calc(${trackLabelWidth}px +
|
|
968
|
+
left: `calc(${trackLabelWidth}px + (100% - ${trackLabelWidth}px) * ${playheadPercent} / 100)`,
|
|
967
969
|
width: 2,
|
|
968
970
|
backgroundColor: tokens.colors.accent.primary,
|
|
969
971
|
boxShadow: `0 0 12px ${tokens.colors.accent.primary}`,
|
|
970
|
-
zIndex: Z.
|
|
972
|
+
zIndex: Z.playhead,
|
|
971
973
|
pointerEvents: "none",
|
|
972
974
|
transition: "left 0.4s linear"
|
|
973
975
|
},
|
|
@@ -977,7 +979,7 @@ const ChartView = memo(function ChartView2({
|
|
|
977
979
|
{
|
|
978
980
|
style: {
|
|
979
981
|
position: "absolute",
|
|
980
|
-
top:
|
|
982
|
+
top: 22,
|
|
981
983
|
left: -5,
|
|
982
984
|
width: 12,
|
|
983
985
|
height: 12,
|
|
@@ -993,7 +995,7 @@ const ChartView = memo(function ChartView2({
|
|
|
993
995
|
{
|
|
994
996
|
style: {
|
|
995
997
|
position: "absolute",
|
|
996
|
-
top:
|
|
998
|
+
top: 4,
|
|
997
999
|
left: "50%",
|
|
998
1000
|
transform: "translateX(-50%)",
|
|
999
1001
|
backgroundColor: tokens.colors.accent.primary,
|
|
@@ -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, useEffect } from 'react';\nimport { useTheme } from '../theme';\nimport type { ThemeTokens } from '../theme';\nimport { classNames, safeAccentText } from '../utils';\nimport type { CategoryDef } from '../types';\nimport { useCategoryPalette } from '../context/CategoryContext';\nimport { Icon } from '../core/Icon';\nimport { Badge } from '../core/Badge';\nimport { Tooltip } from '../core/Tooltip';\nimport { Button } from '../core/Button';\nimport { useBreakpoint } from '../core/layout/useBreakpoint';\n// ============================================================================\n// Types\n// ============================================================================\n\n// ============================================================================\n// Z-Index scale — prevents conflicts with global modals, toasts, nav overlays\n// ============================================================================\nconst Z = {\n /** Base layer for track events / scatter dots */\n trackEvent: 1,\n /** Hovered track event raised above siblings */\n trackEventHovered: 20,\n /** Sticky column elements (playhead, track labels) */\n sticky: 15,\n /** Floating day-marker lines above track content */\n dayMarker: 5,\n /** Loading overlay covering chart content */\n loadingOverlay: 100,\n /** Floating tooltips — above all chart chrome */\n tooltip: 1000,\n} as const;\n\n/** Filter key for events with no team accent (use with `TimelineFilter.teams`). */\nexport const TIMELINE_FILTER_TEAM_NONE = '__zendir_team_none__';\n/** Filter key for legacy accent color only (no structured `team.id`). */\nexport const TIMELINE_FILTER_TEAM_LEGACY = '__zendir_team_legacy__';\n\nexport type TimelineViewMode = 'list' | 'chart' | 'scatter';\n\n/**\n * Team / category identity on the timeline.\n *\n * Extends the SDK-level `CategoryDef` with `label` kept optional for\n * backward compatibility — existing code that passes `{ id, color }` without\n * a label continues to compile and run unchanged.\n *\n * Because it extends `CategoryDef`, a `TimelineTeam` value can be used\n * anywhere a `CategoryDef` is expected (e.g. `CategoryPalette` constructor).\n */\nexport interface TimelineTeam extends Omit<CategoryDef, 'label'> {\n /** Human-readable name (tooltips, search, filter pills). Optional for backward compat. */\n label?: string;\n}\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 * Team assignment (preferred): id + accent color (+ optional label).\n * List: thin top stripe. Chart/Gantt: thin top stripe; status via Astro shape + hover.\n * Scatter: outer ring. Does NOT override status fill.\n */\n team?: TimelineTeam;\n /**\n * @deprecated Prefer `team: { id, color, label? }`. If set without `team`, still used as the accent color (legacy).\n */\n color?: string;\n}\n\n/** Resolved team accent for rendering (from `event.team` or legacy `event.color`). */\nexport function getTimelineTeamAccent(\n event: TimelineEvent\n): { color: string; id?: string | number; label?: string } | null {\n const t = event.team;\n if (t?.color) {\n return { color: t.color, id: t.id, label: t.label };\n }\n if (event.color) {\n return { color: event.color };\n }\n return null;\n}\n\n/** Label for team row in tooltips (id / label / arguments.Team / badge). */\nexport function getTimelineTeamDisplayLabel(\n event: TimelineEvent,\n accent: NonNullable<ReturnType<typeof getTimelineTeamAccent>>\n): string {\n if (accent.label) return accent.label;\n if (accent.id !== undefined && accent.id !== '') return String(accent.id);\n const args = event.arguments as Record<string, unknown> | undefined;\n const argsTeam = args?.Team;\n if (argsTeam !== undefined && argsTeam !== '') return String(argsTeam);\n return event.badge || 'Team';\n}\n\n/** Stable key for team filter pills (`TimelineFilter.teams`). */\nexport function getTimelineTeamFilterKey(event: TimelineEvent): string {\n const accent = getTimelineTeamAccent(event);\n if (!accent) return TIMELINE_FILTER_TEAM_NONE;\n if (accent.id === undefined || accent.id === '') return TIMELINE_FILTER_TEAM_LEGACY;\n return String(accent.id);\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 /**\n * Filter by team keys from `getTimelineTeamFilterKey` (e.g. `\"42\"`, `\"alpha\"`).\n * Include `TIMELINE_FILTER_TEAM_NONE` / `TIMELINE_FILTER_TEAM_LEGACY` when those buckets exist in data.\n */\n teams?: string[];\n /**\n * @deprecated Use `teams` with explicit keys. When true (and `teams` is empty), only events with a team accent match.\n */\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.teams && filter.teams.length > 0) ||\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.teams?.length) o.teams = [...f.teams];\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 accent = getTimelineTeamAccent(event);\n const teamHay = accent\n ? [accent.label, accent.id !== undefined ? String(accent.id) : ''].filter(Boolean).join(' ')\n : '';\n const hay = [\n event.title,\n event.subtitle,\n event.badge,\n event.track,\n argStr,\n teamHay,\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.teams?.length) {\n const teamKey = getTimelineTeamFilterKey(event);\n if (!filter.teams.includes(teamKey)) return false;\n }\n\n if (filter.teamColoredOnly && !(filter.teams && filter.teams.length > 0) && !getTimelineTeamAccent(event)) {\n return false;\n }\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.teams && filter.teams.length > 0) n++;\n if (filter.teamColoredOnly && !(filter.teams && filter.teams.length > 0)) 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 filter & search controls in header (default true) */\n showFilters?: boolean;\n /** Start with the filter panel expanded (default false) */\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 // === Customization ===\n /**\n * Override the label used for the \"Teams\" secondary-category filter section.\n * Useful when the `team` field on events represents squads, categories, groups, etc.\n * Defaults to `\"Teams\"`. The value is also used for ARIA labels and tooltip text.\n * @example teamLabel=\"Squads\"\n * @example teamLabel=\"Categories\"\n */\n teamLabel?: string;\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 const teamAccent = getTimelineTeamAccent(event);\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: teamAccent ? '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 accent top stripe (id + color via `team` or legacy `color`) */}\n {teamAccent && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 3,\n backgroundColor: teamAccent.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 /* scrollX tracks the horizontal scroll offset so events outside the visible area can be skipped.\n This provides cheap bounding-box culling without a virtual-DOM library. */\n const [scrollX, setScrollX] = useState(0);\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 /**\n * Returns false for events whose rendered position is entirely outside the current horizontal\n * scroll viewport, so we can skip them without touching the DOM. This is cheap per-frame\n * bounding-box culling; the scroll container width is read once from the ref at render time.\n */\n const isEventVisible = useCallback(\n (event: TimelineEvent): boolean => {\n const container = scrollContainerRef.current;\n if (!container) return true; // fallback: always render during SSR / first paint\n const viewportWidth = container.clientWidth - trackLabelWidth;\n if (viewportWidth <= 0) return true;\n const totalWidth = container.scrollWidth - trackLabelWidth;\n const eventStartMs = event.start.getTime();\n const eventEndMs = (event.end ?? new Date(eventStartMs + 300_000)).getTime();\n const leftPx = ((eventStartMs - start.getTime()) / totalDuration) * totalWidth;\n const rightPx = ((eventEndMs - start.getTime()) / totalDuration) * totalWidth;\n /* Add 50px overscan so events sliding into view don't pop in */\n const overscan = 50;\n return rightPx >= scrollX - overscan && leftPx <= scrollX + viewportWidth + overscan;\n },\n [start, totalDuration, scrollX, trackLabelWidth],\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 // Auto-follow playhead: keep the playhead marker visible by scrolling the\n // chart view horizontally when the playhead nears the edge of the viewport.\n const lastAutoScrollRef = useRef(0);\n useEffect(() => {\n if (playheadPercent === null) return;\n const container = scrollContainerRef.current;\n if (!container) return;\n const contentWidth = container.scrollWidth;\n const viewportWidth = container.clientWidth;\n if (contentWidth <= viewportWidth) return;\n // Position of the playhead in px (within the scrollable content area past trackLabelWidth)\n const timelineContentWidth = contentWidth - trackLabelWidth;\n const playheadPx = trackLabelWidth + (playheadPercent / 100) * timelineContentWidth;\n const scrollLeft = container.scrollLeft;\n const visibleLeft = scrollLeft + trackLabelWidth;\n const visibleRight = scrollLeft + viewportWidth;\n // Scroll when the playhead is beyond 85% of the visible region or before 15%\n const margin = viewportWidth * 0.15;\n if (playheadPx > visibleRight - margin || playheadPx < visibleLeft + margin) {\n // Throttle auto-scroll to avoid fighting user scrolling\n const nowMs = Date.now();\n if (nowMs - lastAutoScrollRef.current < 300) return;\n lastAutoScrollRef.current = nowMs;\n const targetScroll = playheadPx - viewportWidth * 0.5;\n container.scrollTo({ left: Math.max(0, targetScroll), behavior: 'smooth' });\n }\n }, [playheadPercent, trackLabelWidth]);\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 onScroll={(e) => setScrollX((e.currentTarget as HTMLDivElement).scrollLeft)}\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: Z.trackEventHovered,\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: Z.trackEventHovered + 5,\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: Z.dayMarker,\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: Z.sticky,\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: Z.trackEvent,\n pointerEvents: 'none',\n }}\n />\n ))}\n \n {(eventsByTrack[track.id] || []).filter(isEventVisible).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 const teamAccent = getTimelineTeamAccent(event);\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 aria-label={`${event.title}${event.status ? `, status: ${event.status}` : ''}`}\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 onFocus={(e) => {\n /* keyboard navigation: show tooltip when event receives focus */\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onBlur={() => {\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 ? Z.trackEventHovered : Z.trackEvent,\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 {teamAccent ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 2,\n backgroundColor: teamAccent.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: `${teamAccent ? 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: Z.sticky - 5,\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: Z.trackEventHovered,\n pointerEvents: 'none',\n transition: 'left 0.4s linear',\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 const teamTip = getTimelineTeamAccent(hoveredEventData);\n return (\n <div\n style={{\n position: 'fixed',\n left: tooltipPos.x,\n top: tooltipPos.y,\n transform: 'translate(-50%, -100%)',\n zIndex: Z.tooltip,\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 id + accent (or legacy color-only) */}\n {teamTip && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: teamTip.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: teamTip.color, fontWeight: 500 }}>\n {getTimelineTeamDisplayLabel(hoveredEventData, teamTip)}\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. Hitbox is always 24px (WCAG 2.5.5 minimum). */}\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 /* Transparent padding expands the clickable hit area to ≥24×24 without growing the visible dot. */\n const hitboxPad = Math.max(0, (24 - dotSize) / 2);\n const effectiveStatus = event.status ?? 'normal';\n const scatterTeamAccent = getTimelineTeamAccent(event);\n\n return (\n <button\n key={event.id}\n type=\"button\"\n aria-label={`${event.title}${event.status ? `, status: ${event.status}` : ''}`}\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 onFocus={(e) => {\n /* keyboard navigation: show tooltip on focus */\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onBlur={() => {\n setHoveredEvent(null);\n setTooltipPosition(null);\n }}\n style={{\n position: 'absolute',\n left: `${leftPercent}%`,\n transform: 'translateX(-50%)',\n /* visible size + transparent padding = ≥24px touch/click target */\n width: dotSize,\n height: dotSize,\n padding: hitboxPad,\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 ? Z.trackEventHovered : Z.trackEvent,\n lineHeight: 0,\n borderRadius: '50%',\n boxSizing: 'content-box',\n boxShadow: scatterTeamAccent ? `0 0 0 2px ${scatterTeamAccent.color}` : undefined,\n }}\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 const scatterTeamTip = getTimelineTeamAccent(hoveredEventData);\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: Z.tooltip,\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 id + accent (or legacy color-only) */}\n {scatterTeamTip && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: scatterTeamTip.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: scatterTeamTip.color, fontWeight: 500 }}>\n {getTimelineTeamDisplayLabel(hoveredEventData, scatterTeamTip)}\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, teams)\n// ============================================================================\n\ninterface TimelineTeamFilterOption {\n key: string;\n label: string;\n /** Accent swatch; empty when bucket is \"no team\" */\n color: string;\n isNoneBucket: boolean;\n}\n\nfunction buildTeamFilterOptions(events: TimelineEvent[], tokens: ThemeTokens, categoryLabel: string = 'team'): TimelineTeamFilterOption[] {\n const map = new Map<string, TimelineTeamFilterOption>();\n for (const event of events) {\n const key = getTimelineTeamFilterKey(event);\n if (map.has(key)) continue;\n const accent = getTimelineTeamAccent(event);\n const isNone = key === TIMELINE_FILTER_TEAM_NONE;\n const isLegacy = key === TIMELINE_FILTER_TEAM_LEGACY;\n const label = isNone\n ? `No ${categoryLabel.toLowerCase()}`\n : isLegacy\n ? 'Accent only'\n : accent\n ? getTimelineTeamDisplayLabel(event, accent)\n : key;\n const color = isNone ? '' : accent?.color ?? tokens.colors.text.tertiary;\n map.set(key, { key, label, color, isNoneBucket: isNone });\n }\n const list = [...map.values()];\n list.sort((a, b) => {\n if (a.isNoneBucket !== b.isNoneBucket) return a.isNoneBucket ? 1 : -1;\n if (a.key === TIMELINE_FILTER_TEAM_LEGACY) return b.key === TIMELINE_FILTER_TEAM_NONE ? -1 : 1;\n if (b.key === TIMELINE_FILTER_TEAM_LEGACY) return a.key === TIMELINE_FILTER_TEAM_NONE ? 1 : -1;\n return a.label.localeCompare(b.label, undefined, { sensitivity: 'base' });\n });\n return list;\n}\n\ninterface TimelineFiltersToolbarProps {\n filter: TimelineFilter;\n onFilterChange: (next: TimelineFilter) => void;\n trackOptions: { id: string; label: string }[];\n events: TimelineEvent[];\n expanded: boolean;\n /** Display label for the team/secondary-category section (defaults to \"Teams\"). */\n teamLabel: string;\n}\n\n/** Expandable filter panel — rendered below the header when expanded. Search + toggle live in the header. */\nconst TimelineFiltersPanel = memo(function TimelineFiltersPanel({\n filter,\n onFilterChange,\n trackOptions,\n events,\n expanded,\n teamLabel,\n}: TimelineFiltersToolbarProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const accentColor = tokens.colors.accent.primary;\n\n const teamOptions = useMemo(() => buildTeamFilterOptions(events, tokens, teamLabel), [events, tokens, teamLabel]);\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 toggleTeam = useCallback(\n (teamKey: string) => {\n const cur = filter.teams ?? [];\n const next = cur.includes(teamKey) ? cur.filter((k) => k !== teamKey) : [...cur, teamKey];\n patch({ teams: next.length ? next : undefined });\n },\n [filter.teams, patch]\n );\n\n /* Astro-compliant pill: borderRadius.md, 2px 8px, uppercase xxs (10px), 500 weight, 0.06em tracking.\n Active pill uses accent border + faint accent bg (mirrors LogViewer severity filter pattern). */\n const pillStyle = useCallback(\n (active: boolean, tintColor?: string): React.CSSProperties => {\n const c = tintColor || accentColor;\n return {\n padding: '2px 8px',\n borderRadius: tokens.borderRadius.md,\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: 500,\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n lineHeight: 1.4,\n border: `1px solid ${active ? `${c}66` : tokens.colors.border.muted}`,\n backgroundColor: active ? `${c}22` : 'transparent',\n color: active ? c : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: tokens.animation.fast,\n };\n },\n [accentColor, tokens],\n );\n\n /* Section header: Astro DataTable column-header pattern — bold, uppercase, 10px, 0.06em tracking. */\n const sectionHeader = (text: string): React.ReactElement => (\n <div\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: tokens.colors.text.tertiary,\n marginBottom: 8,\n }}\n >\n {text}\n </div>\n );\n\n if (!expanded) return null;\n\n return (\n <div\n id=\"zendir-timeline-filters-panel\"\n style={{\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(8px)', WebkitBackdropFilter: 'blur(8px)' as const }),\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacing.smd,\n }}\n >\n {/* Tracks */}\n {trackOptions.length > 0 ? (\n <div role=\"group\" aria-label=\"Filter by track\">\n {sectionHeader('Tracks')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {trackOptions.map((t) => {\n const active = filter.tracks?.includes(t.id) ?? false;\n return (\n <button key={t.id} type=\"button\" aria-pressed={active} onClick={() => toggleTrack(t.id)} style={pillStyle(active)}>\n {t.label}\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n {/* Status — pills tinted with their status color */}\n <div role=\"group\" aria-label=\"Filter by status\">\n {sectionHeader('Status')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {ALL_TIMELINE_STATUSES.map((st) => {\n const active = filter.status?.includes(st) ?? false;\n const statusColor = st ? tokens.colors.status[st] : accentColor;\n return (\n <button\n key={st}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggleStatus(st)}\n style={{\n ...pillStyle(active, statusColor),\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: active ? statusColor : `${statusColor}50`,\n flexShrink: 0,\n transition: tokens.animation.fast,\n }}\n />\n {st}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Duration + Teams on one row where space allows */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${tokens.spacing.smd} ${tokens.spacing.lg}`,\n alignItems: 'flex-start',\n }}\n >\n <div role=\"group\" aria-label=\"Filter by duration\" style={{ minWidth: 0 }}>\n {sectionHeader('Duration')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {(['all', 'point', 'range'] as const).map((key) => {\n const active = (filter.eventShape ?? 'all') === key;\n return (\n <button key={key} type=\"button\" aria-pressed={active} onClick={() => patch({ eventShape: key })} style={pillStyle(active)}>\n {key === 'all' ? 'All' : key === 'point' ? 'Instant' : 'Range'}\n </button>\n );\n })}\n </div>\n </div>\n\n {teamOptions.length > 0 ? (\n <div role=\"group\" aria-label={`Filter by ${teamLabel.toLowerCase()}`} style={{ flex: 1, minWidth: 180 }}>\n {sectionHeader(teamLabel)}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {teamOptions.map((opt) => {\n const active = filter.teams?.includes(opt.key) ?? false;\n return (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggleTeam(opt.key)}\n style={{\n ...pillStyle(active, opt.color || undefined),\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n maxWidth: '100%',\n }}\n >\n {opt.isNoneBucket ? (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n border: `${tokens.borders?.width?.thick ?? '2px'} solid ${tokens.colors.border.muted}`,\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n />\n ) : (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: opt.color,\n flexShrink: 0,\n }}\n />\n )}\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{opt.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n </div>\n\n {/* Clear all — only when filters active. Uses SDK Button for consistent focus ring & a11y. */}\n {isTimelineFilterActive(filter) ? (\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Button variant=\"borderless\" size=\"small\" onClick={clearAll}>\n Clear all\n </Button>\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 = true,\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 teamLabel: teamLabelProp,\n}: UnifiedTimelineProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const { isMobile } = useBreakpoint();\n const categoryCtx = useCategoryPalette();\n /** Explicit prop → CategoryProvider label → default \"Teams\" */\n const teamLabel = teamLabelProp ?? categoryCtx?.categoryLabel ?? 'Teams';\n const [internalViewMode, setInternalViewMode] = useState<TimelineViewMode>(defaultView);\n const [zoom, setZoom] = useState(initialZoom);\n const [_internalFilter, _setInternalFilter] = useState<TimelineFilter>({});\n const [filtersExpanded, setFiltersExpanded] = useState(filtersDefaultExpanded);\n const filter = _filter !== undefined ? _filter : _internalFilter;\n const filterChipCount = _showFilters ? countTimelineFilterChips(filter) : 0;\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 patchFilter = useCallback(\n (partial: Partial<TimelineFilter>) => {\n setFilter(normalizeTimelineFilter({ ...filter, ...partial }));\n },\n [filter, setFilter]\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 — stacks vertically on mobile so controls don't overflow */}\n <div\n style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'stretch' : 'center',\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n gap: isMobile ? tokens.spacing.xs : tokens.spacing.sm,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n <h3\n style={{\n margin: 0,\n fontSize: '1rem',\n fontWeight: 500, // AstroUXDS medium\n color: tokens.colors.text.primary,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n {countLabel}\n </h3>\n\n {/* Spacer pushes controls right (only in row/desktop layout) */}\n {!isMobile && <div style={{ flex: 1 }} />}\n </div>\n\n {/* Second row on mobile, same row on desktop */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm, flex: isMobile ? undefined : 1, justifyContent: isMobile ? 'space-between' : 'flex-end' }}>\n\n {/* Inline search + filter icon — left of zoom/view toggle */}\n {_showFilters && (\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, flex: isMobile ? 1 : undefined, flexShrink: 0 }}>\n {/* Compact search: expands on mobile to fill available width */}\n <div style={{ position: 'relative', width: isMobile ? '100%' : 180 }}>\n <Icon\n name=\"search\"\n size={14}\n style={{\n position: 'absolute',\n left: 8,\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) => patchFilter({ search: e.target.value || undefined })}\n placeholder=\"Search…\"\n aria-label=\"Search timeline events\"\n style={{\n width: '100%',\n boxSizing: 'border-box',\n height: tokens.elementSize.sm,\n paddingLeft: 28,\n paddingRight: 8,\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.sm,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'all 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onFocus={(e) => {\n e.target.style.borderColor = tokens.colors.accent.primary;\n e.target.style.boxShadow = `0 0 0 3px ${tokens.colors.accent.primary}50, 0 0 20px ${tokens.colors.accent.primary}15`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = tokens.colors.border.muted;\n e.target.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Filter panel toggle icon */}\n <Tooltip content={filtersExpanded ? 'Hide filters' : 'Show filters'}>\n <button\n type=\"button\"\n aria-label={filtersExpanded ? 'Hide filters' : 'Show filters'}\n aria-expanded={filtersExpanded}\n aria-controls=\"zendir-timeline-filters-panel\"\n onClick={() => setFiltersExpanded((v) => !v)}\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n border: `1px solid ${filterChipCount > 0 ? `${tokens.colors.accent.primary}80` : tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n backgroundColor: filterChipCount > 0 ? `${tokens.colors.accent.primary}12` : 'transparent',\n color: filterChipCount > 0 ? tokens.colors.accent.primary : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: tokens.animation.fast,\n }}\n >\n <Icon name=\"filter\" size={16} />\n {filterChipCount > 0 ? (\n <span\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 14,\n height: 14,\n borderRadius: '50%',\n backgroundColor: tokens.colors.accent.primary,\n color: '#fff',\n fontSize: '0.5625rem',\n fontWeight: 700,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n {filterChipCount}\n </span>\n ) : null}\n </button>\n </Tooltip>\n </div>\n )}\n\n {/* Right side controls */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexShrink: 0 }}>\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 — role=group tells assistive tech these buttons share a purpose */}\n {showViewToggle && (\n <div \n role=\"group\"\n aria-label=\"View mode\"\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 aria-pressed={isActive}\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> {/* end right side controls */}\n </div> {/* end second-row */}\n </div> {/* end header */}\n\n {_showFilters ? (\n <TimelineFiltersPanel\n filter={filter}\n onFilterChange={setFilter}\n trackOptions={trackOptionsForToolbar}\n events={events}\n expanded={filtersExpanded}\n teamLabel={teamLabel}\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: Z.loadingOverlay,\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","TimelineFiltersPanel","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, useEffect } from 'react';\nimport { useTheme } from '../theme';\nimport type { ThemeTokens } from '../theme';\nimport { classNames, safeAccentText } from '../utils';\nimport type { CategoryDef } from '../types';\nimport { useCategoryPalette } from '../context/CategoryContext';\nimport { Icon } from '../core/Icon';\nimport { Badge } from '../core/Badge';\nimport { Tooltip } from '../core/Tooltip';\nimport { Button } from '../core/Button';\nimport { useBreakpoint } from '../core/layout/useBreakpoint';\n// ============================================================================\n// Types\n// ============================================================================\n\n// ============================================================================\n// Z-Index scale — prevents conflicts with global modals, toasts, nav overlays\n// ============================================================================\nconst Z = {\n /** Base layer for track events / scatter dots */\n trackEvent: 1,\n /** Hovered track event raised above siblings */\n trackEventHovered: 20,\n /** Sticky column elements (playhead, track labels) */\n sticky: 15,\n /** Floating day-marker lines above track content */\n dayMarker: 5,\n /** Current-time playhead line — above sticky headers and events */\n playhead: 25,\n /** Loading overlay covering chart content */\n loadingOverlay: 100,\n /** Floating tooltips — above all chart chrome */\n tooltip: 1000,\n} as const;\n\n/** Filter key for events with no team accent (use with `TimelineFilter.teams`). */\nexport const TIMELINE_FILTER_TEAM_NONE = '__zendir_team_none__';\n/** Filter key for legacy accent color only (no structured `team.id`). */\nexport const TIMELINE_FILTER_TEAM_LEGACY = '__zendir_team_legacy__';\n\nexport type TimelineViewMode = 'list' | 'chart' | 'scatter';\n\n/**\n * Team / category identity on the timeline.\n *\n * Extends the SDK-level `CategoryDef` with `label` kept optional for\n * backward compatibility — existing code that passes `{ id, color }` without\n * a label continues to compile and run unchanged.\n *\n * Because it extends `CategoryDef`, a `TimelineTeam` value can be used\n * anywhere a `CategoryDef` is expected (e.g. `CategoryPalette` constructor).\n */\nexport interface TimelineTeam extends Omit<CategoryDef, 'label'> {\n /** Human-readable name (tooltips, search, filter pills). Optional for backward compat. */\n label?: string;\n}\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 * Team assignment (preferred): id + accent color (+ optional label).\n * List: thin top stripe. Chart/Gantt: thin top stripe; status via Astro shape + hover.\n * Scatter: outer ring. Does NOT override status fill.\n */\n team?: TimelineTeam;\n /**\n * @deprecated Prefer `team: { id, color, label? }`. If set without `team`, still used as the accent color (legacy).\n */\n color?: string;\n}\n\n/** Resolved team accent for rendering (from `event.team` or legacy `event.color`). */\nexport function getTimelineTeamAccent(\n event: TimelineEvent\n): { color: string; id?: string | number; label?: string } | null {\n const t = event.team;\n if (t?.color) {\n return { color: t.color, id: t.id, label: t.label };\n }\n if (event.color) {\n return { color: event.color };\n }\n return null;\n}\n\n/** Label for team row in tooltips (id / label / arguments.Team / badge). */\nexport function getTimelineTeamDisplayLabel(\n event: TimelineEvent,\n accent: NonNullable<ReturnType<typeof getTimelineTeamAccent>>\n): string {\n if (accent.label) return accent.label;\n if (accent.id !== undefined && accent.id !== '') return String(accent.id);\n const args = event.arguments as Record<string, unknown> | undefined;\n const argsTeam = args?.Team;\n if (argsTeam !== undefined && argsTeam !== '') return String(argsTeam);\n return event.badge || 'Team';\n}\n\n/** Stable key for team filter pills (`TimelineFilter.teams`). */\nexport function getTimelineTeamFilterKey(event: TimelineEvent): string {\n const accent = getTimelineTeamAccent(event);\n if (!accent) return TIMELINE_FILTER_TEAM_NONE;\n if (accent.id === undefined || accent.id === '') return TIMELINE_FILTER_TEAM_LEGACY;\n return String(accent.id);\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 /**\n * Filter by team keys from `getTimelineTeamFilterKey` (e.g. `\"42\"`, `\"alpha\"`).\n * Include `TIMELINE_FILTER_TEAM_NONE` / `TIMELINE_FILTER_TEAM_LEGACY` when those buckets exist in data.\n */\n teams?: string[];\n /**\n * @deprecated Use `teams` with explicit keys. When true (and `teams` is empty), only events with a team accent match.\n */\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.teams && filter.teams.length > 0) ||\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.teams?.length) o.teams = [...f.teams];\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 accent = getTimelineTeamAccent(event);\n const teamHay = accent\n ? [accent.label, accent.id !== undefined ? String(accent.id) : ''].filter(Boolean).join(' ')\n : '';\n const hay = [\n event.title,\n event.subtitle,\n event.badge,\n event.track,\n argStr,\n teamHay,\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.teams?.length) {\n const teamKey = getTimelineTeamFilterKey(event);\n if (!filter.teams.includes(teamKey)) return false;\n }\n\n if (filter.teamColoredOnly && !(filter.teams && filter.teams.length > 0) && !getTimelineTeamAccent(event)) {\n return false;\n }\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.teams && filter.teams.length > 0) n++;\n if (filter.teamColoredOnly && !(filter.teams && filter.teams.length > 0)) 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 filter & search controls in header (default true) */\n showFilters?: boolean;\n /** Start with the filter panel expanded (default false) */\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 // === Customization ===\n /**\n * Override the label used for the \"Teams\" secondary-category filter section.\n * Useful when the `team` field on events represents squads, categories, groups, etc.\n * Defaults to `\"Teams\"`. The value is also used for ARIA labels and tooltip text.\n * @example teamLabel=\"Squads\"\n * @example teamLabel=\"Categories\"\n */\n teamLabel?: string;\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 const teamAccent = getTimelineTeamAccent(event);\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: teamAccent ? '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 accent top stripe (id + color via `team` or legacy `color`) */}\n {teamAccent && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 3,\n backgroundColor: teamAccent.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 /* scrollX tracks the horizontal scroll offset so events outside the visible area can be skipped.\n This provides cheap bounding-box culling without a virtual-DOM library. */\n const [scrollX, setScrollX] = useState(0);\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 /**\n * Returns false for events whose rendered position is entirely outside the current horizontal\n * scroll viewport, so we can skip them without touching the DOM. This is cheap per-frame\n * bounding-box culling; the scroll container width is read once from the ref at render time.\n */\n const isEventVisible = useCallback(\n (event: TimelineEvent): boolean => {\n const container = scrollContainerRef.current;\n if (!container) return true; // fallback: always render during SSR / first paint\n const viewportWidth = container.clientWidth - trackLabelWidth;\n if (viewportWidth <= 0) return true;\n const totalWidth = container.scrollWidth - trackLabelWidth;\n const eventStartMs = event.start.getTime();\n const eventEndMs = (event.end ?? new Date(eventStartMs + 300_000)).getTime();\n const leftPx = ((eventStartMs - start.getTime()) / totalDuration) * totalWidth;\n const rightPx = ((eventEndMs - start.getTime()) / totalDuration) * totalWidth;\n /* Add 50px overscan so events sliding into view don't pop in */\n const overscan = 50;\n return rightPx >= scrollX - overscan && leftPx <= scrollX + viewportWidth + overscan;\n },\n [start, totalDuration, scrollX, trackLabelWidth],\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 // Auto-follow playhead: keep the playhead marker visible by scrolling the\n // chart view horizontally when the playhead nears the edge of the viewport.\n const lastAutoScrollRef = useRef(0);\n useEffect(() => {\n if (playheadPercent === null) return;\n const container = scrollContainerRef.current;\n if (!container) return;\n const contentWidth = container.scrollWidth;\n const viewportWidth = container.clientWidth;\n if (contentWidth <= viewportWidth) return;\n // Position of the playhead in px (within the scrollable content area past trackLabelWidth)\n const timelineContentWidth = contentWidth - trackLabelWidth;\n const playheadPx = trackLabelWidth + (playheadPercent / 100) * timelineContentWidth;\n const scrollLeft = container.scrollLeft;\n const visibleLeft = scrollLeft + trackLabelWidth;\n const visibleRight = scrollLeft + viewportWidth;\n // Scroll when the playhead is beyond 85% of the visible region or before 15%\n const margin = viewportWidth * 0.15;\n if (playheadPx > visibleRight - margin || playheadPx < visibleLeft + margin) {\n // Throttle auto-scroll to avoid fighting user scrolling\n const nowMs = Date.now();\n if (nowMs - lastAutoScrollRef.current < 300) return;\n lastAutoScrollRef.current = nowMs;\n const targetScroll = playheadPx - viewportWidth * 0.5;\n container.scrollTo({ left: Math.max(0, targetScroll), behavior: 'smooth' });\n }\n }, [playheadPercent, trackLabelWidth]);\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 onScroll={(e) => setScrollX((e.currentTarget as HTMLDivElement).scrollLeft)}\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: Z.trackEventHovered,\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: Z.trackEventHovered + 5,\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: Z.dayMarker,\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: Z.sticky,\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: Z.trackEvent,\n pointerEvents: 'none',\n }}\n />\n ))}\n \n {(eventsByTrack[track.id] || []).filter(isEventVisible).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 const teamAccent = getTimelineTeamAccent(event);\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 aria-label={`${event.title}${event.status ? `, status: ${event.status}` : ''}`}\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 onFocus={(e) => {\n /* keyboard navigation: show tooltip when event receives focus */\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onBlur={() => {\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 ? Z.trackEventHovered : Z.trackEvent,\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 {teamAccent ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 2,\n backgroundColor: teamAccent.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: `${teamAccent ? 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: Z.sticky - 5,\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: 0,\n bottom: 0,\n left: `calc(${trackLabelWidth}px + (100% - ${trackLabelWidth}px) * ${playheadPercent} / 100)`,\n width: 2,\n backgroundColor: tokens.colors.accent.primary,\n boxShadow: `0 0 12px ${tokens.colors.accent.primary}`,\n zIndex: Z.playhead,\n pointerEvents: 'none',\n transition: 'left 0.4s linear',\n }}\n >\n {/* Playhead arrow indicator */}\n <div\n style={{\n position: 'absolute',\n top: 22,\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: 4,\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 const teamTip = getTimelineTeamAccent(hoveredEventData);\n return (\n <div\n style={{\n position: 'fixed',\n left: tooltipPos.x,\n top: tooltipPos.y,\n transform: 'translate(-50%, -100%)',\n zIndex: Z.tooltip,\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 id + accent (or legacy color-only) */}\n {teamTip && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: teamTip.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: teamTip.color, fontWeight: 500 }}>\n {getTimelineTeamDisplayLabel(hoveredEventData, teamTip)}\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. Hitbox is always 24px (WCAG 2.5.5 minimum). */}\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 /* Transparent padding expands the clickable hit area to ≥24×24 without growing the visible dot. */\n const hitboxPad = Math.max(0, (24 - dotSize) / 2);\n const effectiveStatus = event.status ?? 'normal';\n const scatterTeamAccent = getTimelineTeamAccent(event);\n\n return (\n <button\n key={event.id}\n type=\"button\"\n aria-label={`${event.title}${event.status ? `, status: ${event.status}` : ''}`}\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 onFocus={(e) => {\n /* keyboard navigation: show tooltip on focus */\n setHoveredEvent(event.id);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onBlur={() => {\n setHoveredEvent(null);\n setTooltipPosition(null);\n }}\n style={{\n position: 'absolute',\n left: `${leftPercent}%`,\n transform: 'translateX(-50%)',\n /* visible size + transparent padding = ≥24px touch/click target */\n width: dotSize,\n height: dotSize,\n padding: hitboxPad,\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 ? Z.trackEventHovered : Z.trackEvent,\n lineHeight: 0,\n borderRadius: '50%',\n boxSizing: 'content-box',\n boxShadow: scatterTeamAccent ? `0 0 0 2px ${scatterTeamAccent.color}` : undefined,\n }}\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 const scatterTeamTip = getTimelineTeamAccent(hoveredEventData);\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: Z.tooltip,\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 id + accent (or legacy color-only) */}\n {scatterTeamTip && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, backgroundColor: scatterTeamTip.color, flexShrink: 0 }} />\n <span style={{ fontSize: '0.6875rem', color: scatterTeamTip.color, fontWeight: 500 }}>\n {getTimelineTeamDisplayLabel(hoveredEventData, scatterTeamTip)}\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, teams)\n// ============================================================================\n\ninterface TimelineTeamFilterOption {\n key: string;\n label: string;\n /** Accent swatch; empty when bucket is \"no team\" */\n color: string;\n isNoneBucket: boolean;\n}\n\nfunction buildTeamFilterOptions(events: TimelineEvent[], tokens: ThemeTokens, categoryLabel: string = 'team'): TimelineTeamFilterOption[] {\n const map = new Map<string, TimelineTeamFilterOption>();\n for (const event of events) {\n const key = getTimelineTeamFilterKey(event);\n if (map.has(key)) continue;\n const accent = getTimelineTeamAccent(event);\n const isNone = key === TIMELINE_FILTER_TEAM_NONE;\n const isLegacy = key === TIMELINE_FILTER_TEAM_LEGACY;\n const label = isNone\n ? `No ${categoryLabel.toLowerCase()}`\n : isLegacy\n ? 'Accent only'\n : accent\n ? getTimelineTeamDisplayLabel(event, accent)\n : key;\n const color = isNone ? '' : accent?.color ?? tokens.colors.text.tertiary;\n map.set(key, { key, label, color, isNoneBucket: isNone });\n }\n const list = [...map.values()];\n list.sort((a, b) => {\n if (a.isNoneBucket !== b.isNoneBucket) return a.isNoneBucket ? 1 : -1;\n if (a.key === TIMELINE_FILTER_TEAM_LEGACY) return b.key === TIMELINE_FILTER_TEAM_NONE ? -1 : 1;\n if (b.key === TIMELINE_FILTER_TEAM_LEGACY) return a.key === TIMELINE_FILTER_TEAM_NONE ? 1 : -1;\n return a.label.localeCompare(b.label, undefined, { sensitivity: 'base' });\n });\n return list;\n}\n\ninterface TimelineFiltersToolbarProps {\n filter: TimelineFilter;\n onFilterChange: (next: TimelineFilter) => void;\n trackOptions: { id: string; label: string }[];\n events: TimelineEvent[];\n expanded: boolean;\n /** Display label for the team/secondary-category section (defaults to \"Teams\"). */\n teamLabel: string;\n}\n\n/** Expandable filter panel — rendered below the header when expanded. Search + toggle live in the header. */\nconst TimelineFiltersPanel = memo(function TimelineFiltersPanel({\n filter,\n onFilterChange,\n trackOptions,\n events,\n expanded,\n teamLabel,\n}: TimelineFiltersToolbarProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const accentColor = tokens.colors.accent.primary;\n\n const teamOptions = useMemo(() => buildTeamFilterOptions(events, tokens, teamLabel), [events, tokens, teamLabel]);\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 toggleTeam = useCallback(\n (teamKey: string) => {\n const cur = filter.teams ?? [];\n const next = cur.includes(teamKey) ? cur.filter((k) => k !== teamKey) : [...cur, teamKey];\n patch({ teams: next.length ? next : undefined });\n },\n [filter.teams, patch]\n );\n\n /* Astro-compliant pill: borderRadius.md, 2px 8px, uppercase xxs (10px), 500 weight, 0.06em tracking.\n Active pill uses accent border + faint accent bg (mirrors LogViewer severity filter pattern). */\n const pillStyle = useCallback(\n (active: boolean, tintColor?: string): React.CSSProperties => {\n const c = tintColor || accentColor;\n return {\n padding: '2px 8px',\n borderRadius: tokens.borderRadius.md,\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: 500,\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n lineHeight: 1.4,\n border: `1px solid ${active ? `${c}66` : tokens.colors.border.muted}`,\n backgroundColor: active ? `${c}22` : 'transparent',\n color: active ? c : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: tokens.animation.fast,\n };\n },\n [accentColor, tokens],\n );\n\n /* Section header: Astro DataTable column-header pattern — bold, uppercase, 10px, 0.06em tracking. */\n const sectionHeader = (text: string): React.ReactElement => (\n <div\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: tokens.colors.text.tertiary,\n marginBottom: 8,\n }}\n >\n {text}\n </div>\n );\n\n if (!expanded) return null;\n\n return (\n <div\n id=\"zendir-timeline-filters-panel\"\n style={{\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(8px)', WebkitBackdropFilter: 'blur(8px)' as const }),\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacing.smd,\n }}\n >\n {/* Tracks */}\n {trackOptions.length > 0 ? (\n <div role=\"group\" aria-label=\"Filter by track\">\n {sectionHeader('Tracks')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {trackOptions.map((t) => {\n const active = filter.tracks?.includes(t.id) ?? false;\n return (\n <button key={t.id} type=\"button\" aria-pressed={active} onClick={() => toggleTrack(t.id)} style={pillStyle(active)}>\n {t.label}\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n {/* Status — pills tinted with their status color */}\n <div role=\"group\" aria-label=\"Filter by status\">\n {sectionHeader('Status')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {ALL_TIMELINE_STATUSES.map((st) => {\n const active = filter.status?.includes(st) ?? false;\n const statusColor = st ? tokens.colors.status[st] : accentColor;\n return (\n <button\n key={st}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggleStatus(st)}\n style={{\n ...pillStyle(active, statusColor),\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: active ? statusColor : `${statusColor}50`,\n flexShrink: 0,\n transition: tokens.animation.fast,\n }}\n />\n {st}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Duration + Teams on one row where space allows */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${tokens.spacing.smd} ${tokens.spacing.lg}`,\n alignItems: 'flex-start',\n }}\n >\n <div role=\"group\" aria-label=\"Filter by duration\" style={{ minWidth: 0 }}>\n {sectionHeader('Duration')}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {(['all', 'point', 'range'] as const).map((key) => {\n const active = (filter.eventShape ?? 'all') === key;\n return (\n <button key={key} type=\"button\" aria-pressed={active} onClick={() => patch({ eventShape: key })} style={pillStyle(active)}>\n {key === 'all' ? 'All' : key === 'point' ? 'Instant' : 'Range'}\n </button>\n );\n })}\n </div>\n </div>\n\n {teamOptions.length > 0 ? (\n <div role=\"group\" aria-label={`Filter by ${teamLabel.toLowerCase()}`} style={{ flex: 1, minWidth: 180 }}>\n {sectionHeader(teamLabel)}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: tokens.spacing.xs }}>\n {teamOptions.map((opt) => {\n const active = filter.teams?.includes(opt.key) ?? false;\n return (\n <button\n key={opt.key}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggleTeam(opt.key)}\n style={{\n ...pillStyle(active, opt.color || undefined),\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n maxWidth: '100%',\n }}\n >\n {opt.isNoneBucket ? (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n border: `${tokens.borders?.width?.thick ?? '2px'} solid ${tokens.colors.border.muted}`,\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n />\n ) : (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: opt.color,\n flexShrink: 0,\n }}\n />\n )}\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{opt.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n </div>\n\n {/* Clear all — only when filters active. Uses SDK Button for consistent focus ring & a11y. */}\n {isTimelineFilterActive(filter) ? (\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Button variant=\"borderless\" size=\"small\" onClick={clearAll}>\n Clear all\n </Button>\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 = true,\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 teamLabel: teamLabelProp,\n}: UnifiedTimelineProps) {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n const { isMobile } = useBreakpoint();\n const categoryCtx = useCategoryPalette();\n /** Explicit prop → CategoryProvider label → default \"Teams\" */\n const teamLabel = teamLabelProp ?? categoryCtx?.categoryLabel ?? 'Teams';\n const [internalViewMode, setInternalViewMode] = useState<TimelineViewMode>(defaultView);\n const [zoom, setZoom] = useState(initialZoom);\n const [_internalFilter, _setInternalFilter] = useState<TimelineFilter>({});\n const [filtersExpanded, setFiltersExpanded] = useState(filtersDefaultExpanded);\n const filter = _filter !== undefined ? _filter : _internalFilter;\n const filterChipCount = _showFilters ? countTimelineFilterChips(filter) : 0;\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 patchFilter = useCallback(\n (partial: Partial<TimelineFilter>) => {\n setFilter(normalizeTimelineFilter({ ...filter, ...partial }));\n },\n [filter, setFilter]\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 — stacks vertically on mobile so controls don't overflow */}\n <div\n style={{\n display: 'flex',\n flexDirection: isMobile ? 'column' : 'row',\n alignItems: isMobile ? 'stretch' : 'center',\n padding: `${tokens.spacing.smd} ${tokens.spacing.md}`,\n gap: isMobile ? tokens.spacing.xs : tokens.spacing.sm,\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n <h3\n style={{\n margin: 0,\n fontSize: '1rem',\n fontWeight: 500, // AstroUXDS medium\n color: tokens.colors.text.primary,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n {countLabel}\n </h3>\n\n {/* Spacer pushes controls right (only in row/desktop layout) */}\n {!isMobile && <div style={{ flex: 1 }} />}\n </div>\n\n {/* Second row on mobile, same row on desktop */}\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm, flex: isMobile ? undefined : 1, justifyContent: isMobile ? 'space-between' : 'flex-end' }}>\n\n {/* Inline search + filter icon — left of zoom/view toggle */}\n {_showFilters && (\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.xs, flex: isMobile ? 1 : undefined, flexShrink: 0 }}>\n {/* Compact search: expands on mobile to fill available width */}\n <div style={{ position: 'relative', width: isMobile ? '100%' : 180 }}>\n <Icon\n name=\"search\"\n size={14}\n style={{\n position: 'absolute',\n left: 8,\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) => patchFilter({ search: e.target.value || undefined })}\n placeholder=\"Search…\"\n aria-label=\"Search timeline events\"\n style={{\n width: '100%',\n boxSizing: 'border-box',\n height: tokens.elementSize.sm,\n paddingLeft: 28,\n paddingRight: 8,\n borderRadius: tokens.borderRadius.md,\n border: `1px solid ${tokens.colors.border.muted}`,\n backgroundColor: tokens.colors.background.base,\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.sm,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'all 200ms cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onFocus={(e) => {\n e.target.style.borderColor = tokens.colors.accent.primary;\n e.target.style.boxShadow = `0 0 0 3px ${tokens.colors.accent.primary}50, 0 0 20px ${tokens.colors.accent.primary}15`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = tokens.colors.border.muted;\n e.target.style.boxShadow = 'none';\n }}\n />\n </div>\n\n {/* Filter panel toggle icon */}\n <Tooltip content={filtersExpanded ? 'Hide filters' : 'Show filters'}>\n <button\n type=\"button\"\n aria-label={filtersExpanded ? 'Hide filters' : 'Show filters'}\n aria-expanded={filtersExpanded}\n aria-controls=\"zendir-timeline-filters-panel\"\n onClick={() => setFiltersExpanded((v) => !v)}\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n border: `1px solid ${filterChipCount > 0 ? `${tokens.colors.accent.primary}80` : tokens.colors.border.muted}`,\n borderRadius: tokens.borderRadius.sm,\n backgroundColor: filterChipCount > 0 ? `${tokens.colors.accent.primary}12` : 'transparent',\n color: filterChipCount > 0 ? tokens.colors.accent.primary : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: tokens.animation.fast,\n }}\n >\n <Icon name=\"filter\" size={16} />\n {filterChipCount > 0 ? (\n <span\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 14,\n height: 14,\n borderRadius: '50%',\n backgroundColor: tokens.colors.accent.primary,\n color: '#fff',\n fontSize: '0.5625rem',\n fontWeight: 700,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: 1,\n }}\n >\n {filterChipCount}\n </span>\n ) : null}\n </button>\n </Tooltip>\n </div>\n )}\n\n {/* Right side controls */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexShrink: 0 }}>\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 — role=group tells assistive tech these buttons share a purpose */}\n {showViewToggle && (\n <div \n role=\"group\"\n aria-label=\"View mode\"\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 aria-pressed={isActive}\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> {/* end right side controls */}\n </div> {/* end second-row */}\n </div> {/* end header */}\n\n {_showFilters ? (\n <TimelineFiltersPanel\n filter={filter}\n onFilterChange={setFilter}\n trackOptions={trackOptionsForToolbar}\n events={events}\n expanded={filtersExpanded}\n teamLabel={teamLabel}\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: Z.loadingOverlay,\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","TimelineFiltersPanel","UnifiedTimeline"],"mappings":"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"}
|