spaxel/dashboard/css/replay.css
jedarden 3038f632b7 fix(dashboard): CSS syntax fixes and timeline mode detection cleanup
Fix missing colons in CSS declarations across timeline.css and replay.css
that broke gap/padding/margin/bottom properties. Simplify timeline mode
detection to use router callbacks instead of SpaxelSimpleModeDetection.
Add aria-labels to select elements for accessibility.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-24 19:20:58 -04:00

464 lines
9.5 KiB
CSS

/* ============================================
Time-Travel Replay Mode Styles
============================================ */
/* ----- Replay Control Bar ----- */
.replay-control-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
background: linear-gradient(180deg, var(--bg-card) 0%, var(--bg-card) 100%);
border-bottom: 1px solid var(--bg-hover);
box-shadow: 0 4px 20px var(--shadow-lg);
z-index: 100;
padding: var(--space-3) var(--space-5);
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-5);
backdrop-filter: blur(10px);
}
.replay-controls {
display: flex;
align-items: center;
gap: var(--space-4);
flex: 1;
}
.replay-btn {
background: var(--border-default);
border: 1px solid var(--border-strong);
border-radius: var(--radius-card);
color: var(--slate-12);
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.replay-btn:hover {
background: var(--border-strong);
border-color: var(--border-strong);
transform: translateY(-1px);
}
.replay-btn:active {
background: var(--bg-hover);
transform: translateY(0);
}
.replay-btn svg {
width: 18px;
height: 18px;
}
.replay-info {
display: flex;
flex-direction: column;
gap: var(--space-half);
min-width: 150px;
}
.replay-timestamp {
font-size: var(--text-base);
font-weight: 600;
color: var(--blue-10);
font-family: var(--font-mono);
letter-spacing: 0.5px;
}
.replay-range {
font-size: var(--text-xs);
color: var(--text-muted);
font-family: var(--font-mono);
}
.replay-playback {
display: flex;
align-items: center;
gap: var(--space-2);
}
.replay-speed {
background: var(--border-subtle);
border: 1px solid var(--bg-hover);
border-radius: var(--radius-control);
color: var(--slate-11);
padding: var(--space-150) var(--space-250);
font-size: var(--text-sm);
cursor: pointer;
transition: all 0.2s ease;
}
.replay-speed:hover {
background: var(--bg-hover);
border-color: var(--border-strong);
}
.replay-speed:focus {
outline: none;
border-color: var(--blue-10);
}
.replay-timeline {
flex: 1;
max-width: 400px;
}
.replay-scrubber {
width: 100%;
height: 6px;
background: var(--bg-hover);
border-radius: var(--radius-control);
outline: none;
-webkit-appearance: none;
cursor: pointer;
}
.replay-scrubber::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px;
height: 16px;
background: var(--blue-10);
border-radius: 50%;
cursor: grab;
transition: all 0.15s ease;
box-shadow: 0 2px 6px var(--blue-border);
}
.replay-scrubber::-webkit-slider-thumb:hover {
transform: scale(1.2);
box-shadow: 0 2px 10px var(--blue-9);
}
.replay-scrubber::-webkit-slider-thumb:active {
cursor: grabbing;
transform: scale(1.1);
}
.replay-scrubber::-moz-range-thumb {
width: 16px;
height: 16px;
background: var(--blue-10);
border: none;
border-radius: 50%;
cursor: grab;
transition: all 0.15s ease;
box-shadow: 0 2px 6px var(--blue-border);
}
.replay-scrubber::-moz-range-thumb:hover {
transform: scale(1.2);
box-shadow: 0 2px 10px var(--blue-9);
}
.replay-scrubber::-moz-range-thumb:active {
cursor: grabbing;
}
.replay-scrubber::-moz-range-track {
background: var(--bg-hover);
border-radius: var(--radius-control);
height: 6px;
}
.replay-tuning {
display: flex;
align-items: center;
}
.replay-tune-btn {
background: var(--ok-bg);
border: 1px solid var(--ok-border);
border-radius: var(--radius-card);
color: var(--ok);
padding: var(--space-2) 14px;
font-size: var(--text-sm);
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: var(--space-150);
}
.replay-tune-btn:hover {
background: var(--ok-border);
border-color: var(--ok);
transform: translateY(-1px);
}
.replay-tune-btn:active {
transform: translateY(0);
}
.replay-tune-btn svg {
width: 16px;
height: 16px;
}
/* ----- Replay Tuning Panel ----- */
.replay-tuning-panel {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--overlay-strong);
backdrop-filter: blur(4px);
z-index: 1000;
display: none;
align-items: center;
justify-content: center;
padding: var(--space-5);
}
.replay-tuning-content {
background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-page) 100%);
border-radius: var(--radius-modal);
box-shadow: 0 20px 60px var(--shadow-xl);
width: 100%;
max-width: 500px;
max-height: 90vh;
overflow: hidden;
display: flex;
flex-direction: column;
border: 1px solid var(--bg-hover);
}
.replay-tuning-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-5) var(--space-6);
border-bottom: 1px solid var(--bg-hover);
flex-shrink: 0;
}
.replay-tuning-header h2 {
margin: 0;
font-size: var(--text-xl);
font-weight: 600;
color: var(--slate-12);
}
.replay-tuning-close {
background: none;
border: none;
color: var(--text-muted);
font-size: var(--text-3xl);
line-height: 1;
cursor: pointer;
padding: 0;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-control);
transition: all 0.2s ease;
}
.replay-tuning-close:hover {
background: var(--bg-hover);
color: var(--slate-12);
}
.replay-tuning-body {
padding: var(--space-6);
overflow-y: auto;
flex: 1;
}
.tuning-param {
margin-bottom: var(--space-6);
}
.tuning-param:last-child {
margin-bottom: 0;
}
.tuning-param label {
display: block;
font-size: var(--text-sm);
font-weight: 500;
color: var(--slate-11);
margin-bottom: var(--space-2);
}
.tuning-param input[type="range"] {
width: 100%;
height: 6px;
background: var(--bg-hover);
border-radius: var(--radius-control);
outline: none;
-webkit-appearance: none;
margin-bottom: var(--space-2);
}
.tuning-param input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px;
height: 16px;
background: var(--blue-10);
border-radius: 50%;
cursor: pointer;
transition: all 0.15s ease;
box-shadow: 0 2px 6px var(--blue-border);
}
.tuning-param input[type="range"]::-webkit-slider-thumb:hover {
transform: scale(1.15);
}
.tuning-param input[type="range"]::-moz-range-thumb {
width: 16px;
height: 16px;
background: var(--blue-10);
border: none;
border-radius: 50%;
cursor: pointer;
transition: all 0.15s ease;
box-shadow: 0 2px 6px var(--blue-border);
}
.tuning-param input[type="range"]::-moz-range-thumb:hover {
transform: scale(1.15);
}
.tuning-param input[type="range"]::-moz-range-track {
background: var(--bg-hover);
border-radius: var(--radius-control);
height: 6px;
}
.tuning-value {
font-family: var(--font-mono);
font-size: var(--text-sm);
color: var(--blue-10);
float: right;
}
.tuning-actions {
display: flex;
gap: var(--space-3);
margin-top: var(--space-7);
}
.tuning-btn {
flex: 1;
padding: var(--space-3) var(--space-5);
border: none;
border-radius: var(--radius-card);
font-size: var(--text-sm);
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.tuning-btn {
background: linear-gradient(135deg, var(--blue-10) 0%, var(--blue-10) 100%);
color: var(--slate-1);
}
.tuning-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px var(--blue-border);
}
.tuning-btn:active {
transform: translateY(0);
}
.tuning-btn-secondary {
background: var(--border-default);
color: var(--slate-11);
border: 1px solid var(--bg-hover);
}
.tuning-btn-secondary:hover {
background: var(--bg-active);
border-color: var(--border-strong);
}
/* ----- Responsive Adjustments ----- */
@media (max-width: 768px) {
.replay-control-bar {
flex-wrap: wrap;
padding: 10px var(--space-4);
}
.replay-controls {
flex-wrap: wrap;
gap: var(--space-3);
}
.replay-info {
min-width: 120px;
}
.replay-timeline {
max-width: 200px;
}
.replay-tuning-content {
max-width: 100%;
margin: 0;
}
}
/* ----- Replay Mode Indicator ----- */
.replay-mode-indicator {
position: fixed;
bottom: var(--space-5);
left: 50%;
transform: translateX(-50%);
background: var(--blue-10);
color: var(--slate-1);
padding: var(--space-2) var(--space-4);
border-radius: var(--radius-modal);
font-size: var(--text-xs);
font-weight: 600;
z-index: 99;
box-shadow: 0 2px 10px var(--blue-border);
display: none;
}
.replay-mode-indicator.visible {
display: block;
animation: slideUp 0.3s ease;
}
@keyframes slideUp {
from {
transform: translateX(-50%) translateY(20px);
opacity: 0;
}
to {
transform: translateX(-50%) translateY(0);
opacity: 1;
}
}
/* ----- Loading State ----- */
.replay-loading {
display: inline-block;
width: 14px;
height: 14px;
border: 2px solid var(--border-strong);
border-top-color: var(--blue-10);
border-radius: 50%;
animation: replaySpin 0.8s linear infinite;
}
@keyframes replaySpin {
to {
transform: rotate(360deg);
}
}