/* Timeline View Styles */ /* Timeline Container */ #timeline-view { position: fixed; top: 44px; /* Below mode toggle bar */ left: 0; right: 0; bottom: 0; display: none; /* Hidden by default, shown when timeline mode is active */ flex-direction: column; background: var(--bg-tertiary, var(--bg-card)); z-index: 50; } #timeline-view.visible, #timeline-view[style*="flex"] { display: flex !important; } /* Header */ .timeline-header { padding: var(--space-3) var(--space-4); background: var(--bg-secondary, var(--bg-card)); border-bottom: 1px solid var(--border-color, var(--bg-hover)); display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; } .timeline-title { font-size: var(--text-base); font-weight: 600; color: var(--text-primary, var(--slate-11)); margin: 0; display: flex; align-items: center; gap: var(--space-2); } .timeline-title svg { width: 18px; height: 18px; color: var(--accent-color, var(--blue-9)); } /* Filter Toggle Button */ .timeline-filter-toggle { background: transparent; border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); paddingvar(--space-150) var(--space-250); cursor: pointer; color: var(--text-secondary, var(--text-secondary)); display: flex; align-items: center; justify-content: center; transition: all 0.2s; } .timeline-filter-toggle:hover { background: var(--bg-primary, var(--bg-page)); color: var(--text-primary, var(--slate-11)); border-color: var(--accent-color, var(--blue-9)); } .timeline-filter-toggle svg { width: 14px; height: 14px; } /* Filter Bar */ .timeline-filter-bar { padding: var(--space-3) var(--space-4); background: var(--bg-secondary, var(--bg-card)); border-bottom: 1px solid var(--border-color, var(--bg-hover)); display: flex; gap: var(--space-6); flex-wrap: wrap; max-height: 200px; overflow-y: auto; transition: max-height 0.3s ease; } .timeline-filter-bar.collapsed { max-height: 0; padding-top: 0; padding-bottom: 0; border-bottom: none; overflow: hidden; } .timeline-filter-section { flex: 1; min-width: 200px; } .timeline-filter-section-title { font-size: var(--text-2xs); text-transform: uppercase; letter-spacing: var(--ls-wide); color: var(--text-muted, var(--text-muted)); margin: var(--space-2); } /* Category Checkboxes */ .timeline-category-checkboxes { display: flex; flex-wrap: wrap; gap: var(--space-2); } .timeline-category-checkbox { display: flex; align-items: center; gapvar(--space-150); paddingvar(--space-150) var(--space-250); background: var(--bg-primary, var(--bg-page)); border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); cursor: pointer; transition: all 0.2s; font-size: var(--text-xs); color: var(--text-secondary, var(--text-secondary)); } .timeline-category-checkbox:hover { border-color: var(--accent-color, var(--blue-9)); background: var(--bg-tertiary, var(--bg-card)); } .timeline-category-checkbox input[type="checkbox"] { width: 14px; height: 14px; accent-color: var(--accent-color, var(--blue-9)); cursor: pointer; } .timeline-category-checkbox:has(input:checked) { border-color: var(--accent-color, var(--blue-9)); background: var(--blue-muted); color: var(--text-primary, var(--slate-11)); } .timeline-category-checkbox input[type="checkbox"]:disabled { accent-color: var(--text-muted, var(--text-muted)); opacity: 0.5; } .timeline-category-label { font-weight: 500; } .timeline-category-icon { font-size: var(--text-sm); } /* Filter Controls */ .timeline-filter-controls { display: flex; flex-direction: column; gap: var(--space-2); } .timeline-filters { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; flex: 1; } .timeline-filter-select { background: var(--bg-primary, var(--bg-page)); border: 1px solid var(--border-color, var(--bg-hover)); color: var(--text-primary, var(--slate-11)); paddingvar(--space-150) var(--space-250); border-radius: var(--radius-control); font-size: var(--text-sm); min-width: 100px; cursor: pointer; transition: border-color 0.2s; } .timeline-filter-select:hover { border-color: var(--accent-color, var(--blue-9)); } .timeline-filter-select:focus { outline: none; border-color: var(--accent-color, var(--blue-9)); box-shadow: 0 0 0 2px var(--blue-border); } .timeline-search { background: var(--bg-primary, var(--bg-page)); border: 1px solid var(--border-color, var(--bg-hover)); color: var(--text-primary, var(--slate-11)); padding: 6px 10px 6px var(--space-8); border-radius: var(--radius-control); font-size: var(--text-sm); min-width: 200px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: 8px center; transition: border-color 0.2s; } .timeline-search:hover { border-color: var(--accent-color, var(--blue-9)); } .timeline-search:focus { outline: none; border-color: var(--accent-color, var(--blue-9)); box-shadow: 0 0 0 2px var(--blue-border); } .timeline-search::placeholder { color: var(--text-muted, var(--text-muted)); } /* Timeline Events List */ .timeline-events { flex: 1; overflow-y: auto; padding: var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); } .timeline-events::-webkit-scrollbar { width: 6px; } .timeline-events::-webkit-scrollbar-track { background: var(--bg-secondary, var(--bg-card)); } .timeline-events::-webkit-scrollbar-thumb { background: var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); } .timeline-events::-webkit-scrollbar-thumb:hover { background: var(--text-muted, var(--text-muted)); } /* Timeline Event Card */ .timeline-event { background: var(--bg-secondary, var(--bg-card)); border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-card); padding: var(--space-3); cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .timeline-event::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--event-color, var(--blue-9)); } .timeline-event:hover { border-color: var(--accent-color, var(--blue-9)); transform: translateX(2px); box-shadow: 0 2px 8px var(--shadow); } .timeline-event.severity-critical { border-color: var(--color-critical, var(--alert)); } .timeline-event.severity-critical::before { background: var(--color-critical, var(--alert)); } .timeline-event.severity-warning { border-color: var(--color-warning, var(--warn)); } .timeline-event.severity-warning::before { background: var(--color-warning, var(--warn)); } /* Event Header */ .timeline-event-header { display: flex; align-items: flex-start; gapvar(--space-250); margin-bottom: var(--space-150); } .timeline-event-icon { flex-shrink: 0; width: 28px; height: 28px; border-radius: var(--radius-control); background: var(--event-color-bg, var(--blue-muted)); display: flex; align-items: center; justify-content: center; color: var(--event-color, var(--blue-9)); } .timeline-event-icon svg { width: 16px; height: 16px; } .timeline-event-content { flex: 1; min-width: 0; } .timeline-event-title { font-size: var(--text-sm); font-weight: 500; color: var(--text-primary, var(--slate-11)); marginvar(--space-half); line-height: 1.3; } .timeline-event-meta { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; font-size: var(--text-xs); color: var(--text-muted, var(--text-muted)); } .timeline-event-time { display: flex; align-items: center; gap: var(--space-1); } .timeline-event-zone { display: flex; align-items: center; gap: var(--space-1); color: var(--accent-color, var(--blue-9)); } .timeline-event-person { display: flex; align-items: center; gap: var(--space-1); } /* Event Details */ .timeline-event-details { font-size: var(--text-sm); color: var(--text-secondary, var(--text-secondary)); margin-top: var(--space-150); line-height: 1.4; } /* Event Actions */ .timeline-event-actions { display: flex; align-items: center; gap: var(--space-1); margin-top: var(--space-2); padding-top: var(--space-2); border-top: 1px solid var(--border-color, var(--bg-hover)); } .timeline-feedback-btn { background: transparent; border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); padding: var(--space-1) var(--space-2); cursor: pointer; display: flex; align-items: center; gap: var(--space-1); font-size: var(--text-2xs); color: var(--text-muted, var(--text-muted)); transition: all 0.2s; } .timeline-feedback-btn:hover { background: var(--bg-primary, var(--bg-page)); color: var(--text-primary, var(--slate-11)); border-color: var(--text-muted, var(--text-muted)); } .timeline-feedback-btn.positive:hover { color: var(--color-success, var(--ok)); border-color: var(--color-success, var(--ok)); } .timeline-feedback-btn.negative:hover { color: var(--color-critical, var(--alert)); border-color: var(--color-critical, var(--alert)); } .timeline-feedback-btn svg { width: 14px; height: 14px; } .timeline-feedback-btn.active { background: var(--event-color-bg, var(--blue-muted)); border-color: var(--event-color, var(--blue-9)); color: var(--event-color, var(--blue-9)); } .timeline-feedback-btn.active.positive { background: var(--ok-bg); border-color: var(--color-success, var(--ok)); color: var(--color-success, var(--ok)); } .timeline-feedback-btn.active.negative { background: var(--alert-bg); border-color: var(--color-critical, var(--alert)); color: var(--color-critical, var(--alert)); } .timeline-explain-btn { background: transparent; border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); padding: var(--space-1) var(--space-2); cursor: pointer; display: flex; align-items: center; gap: var(--space-1); font-size: var(--text-2xs); color: var(--text-muted, var(--text-muted)); transition: all 0.2s; } .timeline-explain-btn:hover { background: var(--bg-primary, var(--bg-page)); color: var(--text-secondary, var(--text-secondary)); border-color: var(--text-muted, var(--text-muted)); } .timeline-seek-btn { margin-left: auto; background: transparent; border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); padding: var(--space-1) var(--space-2); cursor: pointer; display: flex; align-items: center; gap: var(--space-1); font-size: var(--text-2xs); color: var(--accent-color, var(--blue-9)); transition: all 0.2s; } .timeline-seek-btn:hover { background: var(--blue-muted); border-color: var(--accent-color, var(--blue-9)); } .timeline-seek-btn svg { width: 14px; height: 14px; } /* Event Type Colors */ .timeline-event[data-type="zone_entry"] { --event-color: var(--ok); --event-color-bg: var(--ok-bg); } .timeline-event[data-type="zone_exit"] { --event-color: var(--alert); --event-color-bg: var(--alert-bg); } .timeline-event[data-type="ZoneTransition"] { --event-color: var(--warn); --event-color-bg: var(--warn-bg); } .timeline-event[data-type="portal_crossing"] { --event-color: var(--blue-9); --event-color-bg: var(--blue-muted); } .timeline-event[data-type="anomaly"] { --event-color: var(--alert); --event-color-bg: var(--alert-bg); } .timeline-event[data-type="AnomalyDetected"] { --event-color: var(--alert); --event-color-bg: var(--alert-bg); } .timeline-event[data-type="anomaly_detected"] { --event-color: var(--alert); --event-color-bg: var(--alert-bg); } .timeline-event[data-type="FallDetected"] { --event-color: var(--alert); --event-color-bg: var(--alert-bg); } .timeline-event[data-type="security_alert"] { --event-color: var(--warn); --event-color-bg: var(--warn-bg); } .timeline-event[data-type="learning_milestone"] { --event-color: var(--blue-10); --event-color-bg: var(--blue-muted); } .timeline-event[data-type="system_event"] { --event-color: var(--slate-9); --event-color-bg: var(--bg-active); } .timeline-event[data-type="sleep_session_end"] { --event-color: var(--blue-10); --event-color-bg: var(--blue-muted); } /* Loading States */ .timeline-loading { display: flex; align-items: center; justify-content: center; padding: var(--space-6); color: var(--text-muted, var(--text-muted)); font-size: var(--text-sm); gap: var(--space-2); } .timeline-loading-spinner { width: 18px; height: 18px; border: 2px solid var(--border-color, var(--bg-hover)); border-top-color: var(--accent-color, var(--blue-9)); border-radius: 50%; animation: timeline-spin 1s linear infinite; } @keyframes timeline-spin { to { transform: rotate(360deg); } } /* Empty State */ .timeline-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-12) var(--space-6); color: var(--text-muted, var(--text-muted)); text-align: center; } .timeline-empty svg { width: 48px; height: 48px; margin-bottom: var(--space-4); opacity: 0.5; } .timeline-empty h3 { font-size: var(--text-base); margin: var(--space-2); color: var(--text-secondary, var(--text-secondary)); } .timeline-empty p { font-size: var(--text-sm); margin: 0; max-width: 300px; } /* Load More Button */ .timeline-load-more { display: flex; align-items: center; justify-content: center; padding: var(--space-3); margin-top: var(--space-2); } .timeline-load-more-btn { background: var(--bg-secondary, var(--bg-card)); border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); padding: var(--space-2) var(--space-4); color: var(--text-secondary, var(--text-secondary)); font-size: var(--text-sm); cursor: pointer; transition: all 0.2s; } .timeline-load-more-btn:hover { background: var(--bg-primary, var(--bg-page)); border-color: var(--accent-color, var(--blue-9)); color: var(--text-primary, var(--slate-11)); } .timeline-load-more-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Event Count Badge */ .timeline-count { background: var(--accent-color, var(--blue-9)); color: var(--text-on-accent); font-size: var(--text-2xs); font-weight: 600; paddingvar(--space-half) var(--space-150); border-radius: var(--radius-card); margin-left: var(--space-2); } /* New Event Animation */ .timeline-event.new-event { animation: timeline-slide-in 0.3s ease-out; } @keyframes timeline-slide-in { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Live Indicator */ .timeline-live-indicator { display: flex; align-items: center; gapvar(--space-150); font-size: var(--text-xs); color: var(--color-success, var(--ok)); padding: var(--space-1) var(--space-2); background: var(--ok-bg); border-radius: var(--radius-control); } .timeline-live-dot { width: 8px; height: 8px; background: var(--color-success, var(--ok)); border-radius: 50%; animation: timeline-pulse 2s ease-in-out infinite; } @keyframes timeline-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } /* Feedback dismissed state */ .timeline-event.feedback-dismissed { opacity: 0.5; pointer-events: none; } /* Selected Event (tap-to-jump highlight) */ .timeline-event.timeline-event-selected { background: color-mix(in srgb, var(--blue-9) 12%, transparent); border-color: var(--blue-9) !important; box-shadow: 0 0 0 1px color-mix(in srgb, var(--blue-9) 25%, transparent), 0 2px 12px color-mix(in srgb, var(--blue-9) 15%, transparent); } .timeline-event.timeline-event-selected::before { background: var(--blue-9); width: 4px; } .timeline-event.timeline-event-selected:hover { background: color-mix(in srgb, var(--blue-9) 18%, transparent); } /* Now Replaying Chip (in full-page timeline header) */ #timeline-now-replaying { display: none; align-items: center; gapvar(--space-150); paddingvar(--space-half) var(--space-250); margin-left: var(--space-2); background: color-mix(in srgb, var(--blue-9) 20%, transparent); color: var(--blue-11); border-radius: var(--radius-pill); font-size: var(--text-2xs); font-weight: 600; font-family: var(--font-mono, ui-monospace, monospace); white-space: nowrap; letter-spacing: 0.02em; animation: now-replaying-pulse 2s ease-in-out infinite; } .now-replaying-dot { width: 6px; height: 6px; background: var(--blue-9); border-radius: 50%; animation: timeline-pulse 1.5s ease-in-out infinite; } /* Secondary system events (expert mode - greyed out) */ .timeline-event.secondary { opacity: 0.6; font-size: 0.9em; padding: var(--space-2) var(--space-3); } .timeline-event.secondary .timeline-event-icon { width: 24px; height: 24px; font-size: var(--text-xs); } .timeline-event.secondary .timeline-event-title { font-size: var(--text-sm); color: var(--text-secondary, var(--text-secondary)); } .timeline-event.secondary .timeline-event-meta { font-size: var(--text-2xs); color: var(--text-muted, var(--text-muted)); } .timeline-event.secondary:hover { opacity: 1; } /* Responsive */ @media (max-width: 768px) { .timeline-header { flex-direction: column; align-items: stretch; } .timeline-filter-bar { flex-direction: column; gap: var(--space-3); } .timeline-filter-section { min-width: unset; } .timeline-filters { flex-direction: column; align-items: stretch; } .timeline-filter-select, .timeline-search { width: 100%; min-width: unset; } .timeline-event { paddingvar(--space-250); } .timeline-event-actions { flex-wrap: wrap; } } /* Custom Date Range */ .timeline-custom-date { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-2); padding: var(--space-2); background: var(--bg-primary, var(--bg-page)); border-radius: var(--radius-control); } .timeline-date-input { background: var(--bg-secondary, var(--bg-card)); border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); color: var(--text-primary, var(--slate-11)); padding: var(--space-1) var(--space-2); font-size: var(--text-xs); font-family: inherit; flex: 1; } .timeline-date-input::-webkit-calendar-picker-indicator { filter: invert(0.5); cursor: pointer; } .timeline-date-separator { color: var(--text-muted, var(--text-muted)); font-size: var(--text-xs); padding: 0 4px; } .timeline-date-apply-btn { background: var(--accent-color, var(--blue-9)); color: var(--bg-primary, var(--bg-page)); border: none; border-radius: var(--radius-control); padding: var(--space-1) var(--space-3); font-size: var(--text-xs); font-weight: 500; cursor: pointer; transition: background 0.2s; white-space: nowrap; } .timeline-date-apply-btn:hover { background: var(--blue-9); } /* ============================================ Sidebar Timeline Panel Styles ============================================ */ /* Main Sidebar Panel Container */ .sidebar-panel { position: fixed; top: 44px; /* Below status bar */ right: 0; width: 320px; height: calc(100vh - 44px); background: var(--bg-secondary, var(--bg-card)); border-left: 1px solid var(--border-color, var(--bg-hover)); display: flex; flex-direction: column; z-index: 60; transition: transform 0.3s ease, opacity 0.3s ease; box-shadow: -4px 0 20px var(--shadow); } .sidebar-panel.collapsed { transform: translateX(100%); opacity: 0; pointer-events: none; } /* Panel Header */ .sidebar-panel-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-3) var(--space-4); background: var(--bg-tertiary, var(--bg-card)); border-bottom: 1px solid var(--border-color, var(--bg-hover)); flex-shrink: 0; } .sidebar-panel-title { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-sm); font-weight: 600; color: var(--text-primary, var(--slate-11)); } .sidebar-panel-title svg { color: var(--accent-color, var(--blue-9)); } .sidebar-panel-actions { display: flex; gap: var(--space-1); } .sidebar-panel-btn { background: transparent; border: none; color: var(--text-secondary, var(--text-secondary)); paddingvar(--space-150); border-radius: var(--radius-control); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s; } .sidebar-panel-btn:hover { background: var(--bg-primary, var(--bg-page)); color: var(--text-primary, var(--slate-11)); } /* Panel Content */ .sidebar-panel-content { flex: 1; overflow-y: auto; position: relative; } .sidebar-panel-content::-webkit-scrollbar { width: 4px; } .sidebar-panel-content::-webkit-scrollbar-track { background: transparent; } .sidebar-panel-content::-webkit-scrollbar-thumb { background: var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); } .sidebar-panel-content::-webkit-scrollbar-thumb:hover { background: var(--text-muted, var(--text-muted)); } /* Timeline Events in Sidebar */ .sidebar-timeline-events { padding: var(--space-2); display: flex; flex-direction: column; gapvar(--space-150); } /* Compact Event Card for Sidebar */ .sidebar-timeline-event { background: var(--bg-primary, var(--bg-page)); border: 1px solid var(--border-color, var(--bg-hover)); border-radius: var(--radius-control); padding: var(--space-2) 10px; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; display: flex; gap: var(--space-2); align-items: flex-start; } .sidebar-timeline-event::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--event-color, var(--blue-9)); } .sidebar-timeline-event:hover { border-color: var(--accent-color, var(--blue-9)); transform: translateX(-2px); box-shadow: 0 2px 6px var(--shadow); } .sidebar-timeline-event.severity-critical { border-color: var(--color-critical, var(--alert)); } .sidebar-timeline-event.severity-critical::before { background: var(--color-critical, var(--alert)); } .sidebar-timeline-event.severity-warning { border-color: var(--color-warning, var(--warn)); } .sidebar-timeline-event.severity-warning::before { background: var(--color-warning, var(--warn)); } .sidebar-timeline-event.new-event { animation: sidebarEventSlideIn 0.3s ease-out; } @keyframes sidebarEventSlideIn { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } } /* Event Icon */ .sidebar-timeline-event-icon { flex-shrink: 0; font-size: var(--text-base); width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; background: var(--blue-muted); border-radius: var(--radius-control); } /* Event Content */ .sidebar-timeline-event-content { flex: 1; min-width: 0; } .sidebar-timeline-event-title { font-size: var(--text-sm); font-weight: 500; color: var(--text-primary, var(--slate-11)); line-height: 1.3; margin-bottom: var(--space-half); word-wrap: break-word; } .sidebar-timeline-event-meta { display: flex; flex-wrap: wrap; align-items: center; gapvar(--space-150); font-size: var(--text-2xs); color: var(--text-muted, var(--text-muted)); } .sidebar-timeline-event-time { color: var(--text-secondary, var(--text-secondary)); } .sidebar-timeline-event-zone { color: var(--accent-color, var(--blue-9)); } .sidebar-timeline-event-person { color: var(--ok); } /* Event Actions */ .sidebar-timeline-event-actions { display: flex; gapvar(--space-half); flex-shrink: 0; } .sidebar-timeline-action-btn { background: transparent; border: none; color: var(--text-muted, var(--text-muted)); padding: var(--space-1); border-radius: var(--radius-control); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.2s; font-size: var(--text-xs); min-width: 24px; height: 24px; } .sidebar-timeline-action-btn:hover { background: var(--bg-tertiary, var(--bg-card)); color: var(--text-secondary, var(--text-secondary)); } .sidebar-timeline-action-btn.feedback-positive:hover { background: var(--ok-muted); color: var(--ok); } .sidebar-timeline-action-btn.feedback-negative:hover { background: var(--alert-muted); color: var(--alert); } .sidebar-timeline-action-btn.active { background: var(--accent-color, var(--blue-9)); color: var(--bg-primary, var(--bg-page)); } /* Feedback Dismissed State */ .sidebar-timeline-event.feedback-dismissed { opacity: 0.5; text-decoration: line-through; } /* Loading State */ .sidebar-timeline-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-10) var(--space-5); color: var(--text-muted, var(--text-muted)); gap: var(--space-3); } .sidebar-spinner { width: 24px; height: 24px; border: 2px solid var(--border-color, var(--bg-hover)); border-top-color: var(--accent-color, var(--blue-9)); border-radius: 50%; animation: sidebarSpin 0.8s linear infinite; } @keyframes sidebarSpin { to { transform: rotate(360deg); } } /* Empty State */ .sidebar-timeline-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--space-10) var(--space-5); text-align: center; color: var(--text-muted, var(--text-muted)); } .sidebar-timeline-empty svg { color: var(--border-color, var(--bg-hover)); margin-bottom: var(--space-3); } .sidebar-timeline-empty h3 { font-size: var(--text-sm); color: var(--text-secondary, var(--text-secondary)); margin: var(--space-1); } .sidebar-timeline-empty p { font-size: var(--text-xs); margin: 0; } /* Show Button (when panel is collapsed) */ .sidebar-show-btn { position: fixed; top: 50%; right: 0; transform: translateY(-50%); background: var(--bg-secondary, var(--bg-card)); border: 1px solid var(--border-color, var(--bg-hover)); border-right: none; border-radius: var(--radius-card) 0 0 var(--radius-card); padding: var(--space-3) var(--space-2); cursor: pointer; z-index: 59; transition: all 0.3s ease; box-shadow: -2px 0 8px var(--overlay); } .sidebar-show-btn:hover { background: var(--bg-tertiary, var(--bg-card)); padding-right: var(--space-3); } .sidebar-show-btn svg { color: var(--text-secondary, var(--text-secondary)); } .sidebar-show-btn.hidden { transform: translateY(-50%) translateX(100%); opacity: 0; pointer-events: none; } /* Virtual Spacers */ .timeline-spacer { flex-shrink: 0; } /* Event Type Colors */ .sidebar-timeline-event[data-type="zone_entry"] { --event-color: var(--ok); } .sidebar-timeline-event[data-type="zone_exit"] { --event-color: var(--warn); } .sidebar-timeline-event[data-type="portal_crossing"] { --event-color: var(--blue-10); } .sidebar-timeline-event[data-type="detection"] { --event-color: var(--blue-9); } .sidebar-timeline-event[data-type="presence_transition"] { --event-color: var(--blue-9); } .sidebar-timeline-event[data-type="stationary_detected"] { --event-color: var(--blue-9); } .sidebar-timeline-event[data-type="anomaly"] { --event-color: var(--alert); } .sidebar-timeline-event[data-type="security_alert"] { --event-color: var(--alert); } .sidebar-timeline-event[data-type="fall_alert"] { --event-color: var(--alert); } .sidebar-timeline-event[data-type="node_online"] { --event-color: var(--ok); } .sidebar-timeline-event[data-type="node_offline"] { --event-color: var(--slate-10); } .sidebar-timeline-event[data-type="ota_update"] { --event-color: var(--blue-9); } .sidebar-timeline-event[data-type="baseline_changed"] { --event-color: var(--blue-9); } .sidebar-timeline-event[data-type="system"] { --event-color: var(--slate-9); } .sidebar-timeline-event[data-type="learning_milestone"] { --event-color: var(--blue-8); } .sidebar-timeline-event[data-type="anomaly_learned"] { --event-color: var(--blue-8); } /* Responsive Design */ @media (max-width: 768px) { .sidebar-panel { width: 100%; max-width: 320px; } .sidebar-show-btn { display: none; /* Always show panel on mobile, use close button instead */ } } /* Selected Event (tap-to-jump highlight) */ .sidebar-timeline-event.selected { background: color-mix(in srgb, var(--blue-9) 15%, transparent); border-left-color: var(--blue-9) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--blue-9) 30%, transparent); } .sidebar-timeline-event.selected:hover { background: color-mix(in srgb, var(--blue-9) 20%, transparent); } /* Now Replaying Chip (in sidebar panel header) */ .now-replaying-chip { display: inline-flex; align-items: center; gapvar(--space-150); paddingvar(--space-half) var(--space-250); margin-left: var(--space-2); background: color-mix(in srgb, var(--blue-9) 20%, transparent); color: var(--blue-11); border-radius: var(--radius-pill); font-size: var(--text-2xs); font-weight: 600; font-family: var(--font-mono, ui-monospace, monospace); white-space: nowrap; letter-spacing: 0.02em; animation: now-replaying-pulse 2s ease-in-out infinite; } @keyframes now-replaying-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } /* Secondary System Events (dimmed in expert mode) */ .sidebar-timeline-event.secondary { opacity: 0.6; } .sidebar-timeline-event.secondary:hover { opacity: 0.9; }