/* ── Timeline shell ─────────────────────────────────────────── */ .timeline { height: 180px; background: #080818; border-top: 1px solid #2a2a4a; display: flex; flex-direction: column; font-family: 'JetBrains Mono', monospace; font-size: 10px; flex-shrink: 0; user-select: none; } /* ── Controls bar ────────────────────────────────────────────── */ .tl-controls { display: flex; align-items: center; gap: 6px; padding: 6px 12px; background: #0d0d22; border-bottom: 1px solid #1e1e3a; flex-shrink: 0; } .tl-btn { padding: 4px 9px; background: #13132a; border: 1px solid #2a2a5a; border-radius: 4px; color: #8888bb; cursor: pointer; font-size: 11px; font-family: 'JetBrains Mono', monospace; transition: all 0.15s; } .tl-btn:hover { border-color: #6666ff; color: #aaaaff; background: #1a1a3a; } .tl-play { font-size: 13px; min-width: 32px; text-align: center; } .tl-play.playing { border-color: #44cc44; color: #88ff88; background: #0e1e0e; } .tl-time { font-size: 10px; color: #aaaacc; font-weight: 700; letter-spacing: 1px; min-width: 100px; padding: 0 6px; } .tl-kf-btn { background: #1a1a0a; border-color: #5a5a22; color: #cccc44; font-size: 9px; font-weight: 700; letter-spacing: 1px; padding: 4px 10px; } .tl-kf-btn:not(.disabled):hover { border-color: #aaaa44; color: #ffff66; background: #2a2a0e; } .tl-kf-btn.disabled { opacity: 0.3; cursor: not-allowed; } .tl-duration { display: flex; align-items: center; gap: 5px; margin-left: auto; color: #555577; font-size: 9px; } .tl-duration input { width: 44px; background: #13132a; border: 1px solid #2a2a4a; border-radius: 3px; color: #aaaacc; padding: 3px 5px; font-family: 'JetBrains Mono', monospace; font-size: 9px; text-align: center; outline: none; } /* ── Body (labels + tracks) ─────────────────────────────────── */ .tl-body { display: flex; flex: 1; overflow: hidden; min-height: 0; } /* Labels column */ .tl-labels { width: 140px; flex-shrink: 0; border-right: 1px solid #1e1e3a; overflow-y: auto; padding-top: 24px; /* align with ruler */ } .tl-empty { color: #333355; padding: 10px; font-size: 9px; text-align: center; } .tl-label { display: flex; align-items: center; gap: 5px; padding: 0 10px; height: 32px; border-bottom: 1px solid #111128; color: #666688; font-size: 9px; } .tl-label.active { background: #111130; color: #aaaaff; } .tl-label-dot { color: #4444aa; font-size: 11px; flex-shrink: 0; } .tl-label-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .tl-kf-count { background: #2a2a0a; color: #aaaa44; font-size: 8px; padding: 1px 4px; border-radius: 2px; flex-shrink: 0; } /* Tracks wrapper */ .tl-tracks-wrap { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; } /* ── Ruler ───────────────────────────────────────────────────── */ .tl-ruler { height: 24px; background: #0d0d22; border-bottom: 1px solid #1e1e3a; position: relative; cursor: crosshair; flex-shrink: 0; overflow: hidden; } .tl-tick { position: absolute; top: 0; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; pointer-events: none; } .tl-tick::before { content: ''; display: block; width: 1px; height: 8px; background: #3a3a5a; } .tl-tick span { font-size: 8px; color: #444466; margin-top: 1px; } /* Playhead needle (ruler) */ .tl-playhead { position: absolute; top: 0; bottom: 0; width: 2px; background: #ffcc00; transform: translateX(-1px); pointer-events: none; box-shadow: 0 0 6px #ffcc0099; z-index: 5; } /* ── Track rows ─────────────────────────────────────────────── */ .tl-tracks { flex: 1; overflow-y: auto; } .tl-track { position: relative; height: 32px; border-bottom: 1px solid #111128; background: #0a0a1e; transition: background 0.1s; } .tl-track.active { background: #0d0d28; } /* Playhead ghost line on each track */ .tl-track-playhead { position: absolute; top: 0; bottom: 0; width: 1px; background: #ffcc0055; transform: translateX(-0.5px); pointer-events: none; z-index: 2; } /* Connection line between keyframes */ .tl-kf-line { position: absolute; top: 50%; height: 2px; background: linear-gradient(90deg, #ffcc0077, #ffcc0033); transform: translateY(-50%); pointer-events: none; z-index: 1; } /* Keyframe diamond marker */ .tl-kf-diamond { position: absolute; top: 50%; transform: translate(-50%, -50%); color: #ffcc00; font-size: 12px; cursor: pointer; z-index: 3; text-shadow: 0 0 6px #ffcc0099; transition: all 0.1s; line-height: 1; } .tl-kf-diamond:hover { color: #ff4444; text-shadow: 0 0 8px #ff444499; transform: translate(-50%, -50%) scale(1.4); }