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