/* Caption Overlay — Phase 10.1 Live Caption * Precision Broadcast Subtitle HUD */ :root { --d3-accent-main: #3b82f6; --d3-accent-glow: rgba(59, 130, 246, 0.45); --d3-accent-glow-dim: rgba(59, 130, 246, 0.2); --d3-accent-light: #93c5fd; --d3-accent-light-glow: rgba(147, 197, 253, 0.5); --d3-accent-light-glow-dim: rgba(147, 197, 253, 0.25); } * { margin: 0; padding: 0; box-sizing: border-box; } html, body { background: transparent; overflow: hidden; user-select: none; -webkit-app-region: no-drag; font-family: 'Pretendard Variable', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; } #root { width: 100%; height: 100%; display: flex; align-items: flex-end; justify-content: center; } .caption-overlay { width: 100%; padding: 12px 24px; display: flex; flex-direction: column; justify-content: flex-end; pointer-events: none; } #lines { display: flex; flex-direction: column; gap: 6px; align-items: center; } .caption-line { font-size: 16.5px; font-weight: 600; line-height: 1.5; color: #f4f4f5; background: rgba(15, 17, 22, 0.92); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.12); border-radius: 999px; padding: 6px 18px; opacity: 1; transition: opacity 0.4s ease-out; word-wrap: break-word; overflow-wrap: break-word; max-width: 90%; text-align: center; } .caption-line.fading { opacity: 0; } /* Newest line (bottom) is brightest with accent tint */ .caption-line:last-child { color: #ffffff; border: 1px solid rgba(59, 130, 246, 0.35); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.2); } /* Oldest lines are dimmer */ .caption-line:first-child { opacity: 0.65; } .caption-line:nth-child(2) { opacity: 0.82; } /* Delta (partial/unfinished) line has pulsing cursor */ .caption-line.delta::after { content: '\2588'; animation: blink 0.8s step-end infinite; margin-left: 4px; color: var(--d3-accent-main); opacity: 0.85; } @keyframes blink { 50% { opacity: 0; } } /* 로딩 중 표시 — 점멸 애니메이션 */ .caption-line.loading { opacity: 0.6; animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.8; } }