diff --git a/base.css b/base.css index 1b2d0bb..2919118 100644 --- a/base.css +++ b/base.css @@ -146,6 +146,7 @@ /* --- Typography --- */ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'Courier New', monospace; --font-display: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace; + --font-crt: 'VT323', 'Courier New', monospace; /* --- Spacing --- */ --space-xs: 0.25rem; @@ -907,6 +908,19 @@ hr { border-color: var(--border-dim); } +/* Display-only fields — readable, non-editable, not "broken" */ +.lt-display-field, +.lt-input.lt-display-field, +.lt-select.lt-display-field, +.lt-textarea.lt-display-field { + opacity: 1; + color: var(--text-secondary); + cursor: default; + pointer-events: none; + background: transparent; + border-color: var(--border-dim); +} + .lt-input::placeholder, .lt-textarea::placeholder { color: var(--text-dim); } @@ -5488,3 +5502,86 @@ body.lt-is-offline .lt-main { margin-top: 2rem; transition: margin-top 0.25s eas @media (max-width: 479px) { .lt-footer { flex-direction: column; align-items: flex-start; gap: 0.25rem; } } + +/* ================================================================ + BLINKING CURSOR +

SYSTEM STATUS

+ SCANNING + ================================================================ */ +.lt-cursor::after { + content: '▊'; + animation: lt-blink 1s step-end infinite; + color: var(--accent-green); + margin-left: 2px; +} +.lt-cursor--cyan::after { color: var(--accent-cyan); } +.lt-cursor--orange::after { color: var(--accent-orange); } +.lt-cursor--red::after { color: var(--accent-red); } +@keyframes lt-blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } +} + +/* ================================================================ + CRT SCANLINE OVERLAY + Add lt-scanlines to or any container to enable. + Automatically suppressed in light theme. + ================================================================ */ +.lt-scanlines::after { + content: ''; + position: fixed; + inset: 0; + background: repeating-linear-gradient( + 0deg, + transparent, + transparent 2px, + rgba(0, 0, 0, 0.04) 2px, + rgba(0, 0, 0, 0.04) 4px + ); + pointer-events: none; + z-index: 9998; +} +html[data-theme="light"] .lt-scanlines::after { display: none; } + +/* ================================================================ + RADAR SWEEP LOADING INDICATOR +
+ Drop-in replacement for lt-spinner where a radar aesthetic fits. + ================================================================ */ +.lt-radar { + display: inline-block; + width: 48px; height: 48px; + border-radius: 50%; + border: 1px solid var(--accent-cyan); + position: relative; + overflow: hidden; + flex-shrink: 0; +} +.lt-radar::before { + content: ''; + position: absolute; + inset: 0; + background: conic-gradient( + from 0deg, + transparent 70%, + rgba(0, 212, 255, 0.35) 100% + ); + animation: lt-radar-sweep 2s linear infinite; + transform-origin: center; +} +.lt-radar::after { + content: ''; + position: absolute; + inset: 50% 0 0 50%; + width: 1px; height: 50%; + background: var(--accent-cyan); + transform-origin: top left; + animation: lt-radar-sweep 2s linear infinite; + opacity: 0.6; +} +.lt-radar--sm { width: 28px; height: 28px; } +.lt-radar--lg { width: 72px; height: 72px; } +.lt-radar--green { border-color: var(--accent-green); } +.lt-radar--green::before { background: conic-gradient(from 0deg, transparent 70%, rgba(0,255,136,0.35) 100%); } +.lt-radar--green::after { background: var(--accent-green); } +@keyframes lt-radar-sweep { to { transform: rotate(360deg); } } diff --git a/base.html b/base.html index a40a896..000b14b 100644 --- a/base.html +++ b/base.html @@ -29,10 +29,10 @@ All