/* ═══════════════════════════════════════════════════════════════ HF Terminal — Skeuomorphic CRT Stylesheet Hand-crafted CSS. No frameworks. No compromises. ═══════════════════════════════════════════════════════════════ */ :root { --phosphor: #33ff00; --phosphor-dim: #1a8c00; --phosphor-glow: rgba(51, 255, 0, 0.6); --phosphor-bg: #0C0C0C; --screen-radius: 18px; --bezel-width: 24px; --bezel-color: #2a2a2a; --scanline-opacity: 0.08; --scanline-size: 2px; } :root[data-phosphor="amber"] { --phosphor: #ffb000; --phosphor-dim: #b37d00; --phosphor-glow: rgba(255, 176, 0, 0.6); } :root[data-phosphor="white"] { --phosphor: #e0e0e0; --phosphor-dim: #a0a0a0; --phosphor-glow: rgba(224, 224, 224, 0.5); } *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; height: 100%; overflow: hidden; background: #1a1a1a; font-family: monospace; } #monitor { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; height: calc(100% - 48px); padding: 12px; perspective: 800px; } #bezel { position: relative; background: var(--bezel-color); border-radius: calc(var(--screen-radius) + var(--bezel-width)); padding: var(--bezel-width); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.7), 0 0 0 2px #1a1a1a, inset 0 1px 0 rgba(255, 255, 255, 0.06), inset 0 -1px 0 rgba(0, 0, 0, 0.4); width: 100%; max-width: 920px; height: 100%; max-height: 640px; display: flex; align-items: center; justify-content: center; } #screen { position: relative; width: 100%; height: 100%; background: var(--phosphor-bg); border-radius: var(--screen-radius); overflow: hidden; box-shadow: inset 0 0 80px rgba(0, 0, 0, 0.5), inset 0 0 20px rgba(0, 0, 0, 0.3), inset 2px 2px 20px rgba(255, 255, 255, 0.02); border: 1px solid rgba(255, 255, 255, 0.03); } #screen.no-curve { border-radius: 4px; box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.4), inset 0 0 10px rgba(0, 0, 0, 0.2); } #scanlines { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 10; background: repeating-linear-gradient( to bottom, transparent 0px, transparent var(--scanline-size), rgba(0, 0, 0, var(--scanline-opacity)) var(--scanline-size), rgba(0, 0, 0, var(--scanline-opacity)) calc(var(--scanline-size) * 2) ); } #scanlines.hidden { display: none; } #terminal { width: 100%; height: 100%; padding: 8px; position: relative; z-index: 5; } #terminal .xterm { height: 100%; padding: 4px; } #terminal .xterm-viewport { background-color: var(--phosphor-bg) !important; } #terminal .xterm-screen { height: 100% !important; } :root[data-glow="true"] #terminal .xterm-rows { color: var(--phosphor); text-shadow: 0 0 2px var(--phosphor), 0 0 8px var(--phosphor-glow), 0 0 20px var(--phosphor-glow); } :root[data-glow="false"] #terminal .xterm-rows { color: var(--phosphor); text-shadow: none; } #terminal .xterm-selection div { background-color: rgba(51, 255, 0, 0.25) !important; } #terminal .xterm-viewport::-webkit-scrollbar { width: 6px; } #terminal .xterm-viewport::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.3); } #terminal .xterm-viewport::-webkit-scrollbar-thumb { background: var(--phosphor-dim); border-radius: 3px; } #terminal .xterm-viewport::-webkit-scrollbar-thumb:hover { background: var(--phosphor); } #monitor-base { width: 100%; max-width: 920px; display: flex; justify-content: center; } #monitor-foot { width: 40%; height: 16px; background: linear-gradient(to bottom, #333, #222); border-radius: 0 0 6px 6px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5); } #controls { position: fixed; bottom: 0; left: 0; width: 100%; height: 48px; background: #1e1e1e; border-top: 1px solid #333; display: flex; align-items: center; justify-content: center; gap: 20px; z-index: 100; font-size: 12px; color: #888; } .control-group { display: flex; align-items: center; gap: 6px; cursor: pointer; user-select: none; } .control-group span { font-family: monospace; letter-spacing: 0.5px; text-transform: uppercase; font-size: 10px; } .control-group select { background: #2a2a2a; color: #ccc; border: 1px solid #444; border-radius: 3px; padding: 2px 6px; font-family: monospace; font-size: 11px; cursor: pointer; outline: none; } .control-group select:focus { border-color: var(--phosphor-dim); } .control-group input[type="checkbox"] { appearance: none; width: 28px; height: 16px; background: #333; border-radius: 8px; position: relative; cursor: pointer; transition: background 0.2s; } .control-group input[type="checkbox"]::after { content: ''; position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; background: #666; border-radius: 50%; transition: transform 0.2s, background 0.2s; } .control-group input[type="checkbox"]:checked { background: var(--phosphor-dim); } .control-group input[type="checkbox"]:checked::after { transform: translateX(12px); background: var(--phosphor); } @keyframes flicker { 0% { opacity: 1; } 3% { opacity: 0.97; } 6% { opacity: 1; } 7% { opacity: 0.98; } 9% { opacity: 1; } 50% { opacity: 1; } 51% { opacity: 0.99; } 100% { opacity: 1; } } #screen { animation: flicker 8s infinite; } @media (prefers-reduced-motion: reduce) { #screen { animation: none; } } @media (max-width: 768px) { #bezel { padding: 12px; border-radius: calc(var(--screen-radius) + 12px); max-height: none; } #screen { border-radius: 10px; } #monitor-foot { width: 60%; } #controls { gap: 10px; padding: 0 8px; flex-wrap: wrap; height: auto; min-height: 48px; padding-top: 6px; padding-bottom: 6px; } .control-group span { font-size: 9px; } } @media (max-width: 480px) { #bezel { padding: 6px; border-radius: calc(var(--screen-radius) + 6px); } #screen { border-radius: 8px; } #monitor-foot { display: none; } }