terminal / static /css /terminal.css
ghostdrive1's picture
Upload 8 files
52dd3c8 verified
Raw
History Blame Contribute Delete
6.44 kB
/* ═══════════════════════════════════════════════════════════════
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; }
}