@import url('https://fonts.googleapis.com/css2?family=VT323&family=Share+Tech+Mono&display=swap'); *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --green: #00ff41; --green2: #00cc33; --dim: #005514; --cyan: #00ffff; --amber: #ffaa00; --red: #ff3333; --bg: #050a05; --bg2: #0a0f0a; --border: #00661a; } html { font-size: 16px; } body { background: var(--bg); color: var(--green); font-family: 'Share Tech Mono', 'Courier New', monospace; min-height: 100vh; overflow-x: hidden; position: relative; } /* CRT scanlines */ body::before { content: ''; position: fixed; inset: 0; background: repeating-linear-gradient(0deg, rgba(0,0,0,.10) 0px, rgba(0,0,0,.10) 1px, transparent 1px, transparent 3px); pointer-events: none; z-index: 9999; } /* CRT vignette */ body::after { content: ''; position: fixed; inset: 0; background: radial-gradient(ellipse at center, transparent 60%, rgba(0,0,0,.65) 100%); pointer-events: none; z-index: 9998; } .screen { width: 100%; padding: 1.5rem 2rem 4rem; box-sizing: border-box; } /* .ascii-banner legacy — replaced by .ascii-art inside .banner-wrap */ .ascii-banner { font-family: 'VT323', monospace; color: var(--green); font-size: 1.05rem; line-height: 1.2; white-space: pre; text-shadow: 0 0 8px var(--green); margin-bottom: .4rem; text-align: center; } .tagline { color: var(--dim); font-size: .82rem; margin-bottom: .2rem; } /* ── Banner ──────────────────────────────────────────────────── */ .banner-wrap { text-align: left; margin-bottom: 1rem; } .banner-hr { border: none; border-top: 1px solid var(--border); margin: .3rem 0; } .ascii-art { font-family: 'VT323', monospace; color: var(--green); font-size: 1rem; line-height: 1.2; white-space: pre; text-shadow: 0 0 8px var(--green); display: inline-block; text-align: left; margin: .3rem 0 .1rem; background: transparent; border: none; padding: 0; } .banner-sub { font-family: 'VT323', monospace; font-size: clamp(1rem, 4vw, 2.2rem); color: var(--amber); text-shadow: 0 0 12px var(--amber); letter-spacing: clamp(.05em, 1vw, .55em); margin: .4rem 0 .2rem; } .banner-sub::after { content: '█'; color: var(--green); text-shadow: 0 0 8px var(--green); margin-left: .2em; animation: blink 1s step-end infinite; } .host-line { color: var(--cyan); font-size: .85rem; text-shadow: 0 0 6px var(--cyan); margin-bottom: 1.5rem; } .box { border: 1px solid var(--border); background: var(--bg2); margin-bottom: 1.5rem; padding: 1rem 1.2rem; } .box-title { font-family: 'VT323', monospace; font-size: 1.4rem; color: var(--cyan); text-shadow: 0 0 8px var(--cyan); border-bottom: 1px solid var(--border); padding-bottom: .4rem; margin-bottom: .9rem; letter-spacing: 1px; } h2.section { font-family: 'VT323', monospace; font-size: 1.5rem; color: var(--amber); text-shadow: 0 0 8px var(--amber); margin: 2rem 0 .8rem; letter-spacing: 1px; } p { line-height: 1.7; margin-bottom: .7rem; font-size: .86rem; } p:last-child { margin-bottom: 0; } pre { background: #000d03; border: 1px solid var(--border); color: var(--green2); padding: .75rem 1rem; overflow-x: auto; font-size: .78rem; line-height: 1.65; margin: .5rem 0 1rem; white-space: pre-wrap; word-break: break-all; } .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: 1rem; margin-bottom: 1.5rem; } .card { border: 1px solid var(--border); background: var(--bg2); padding: .85rem 1rem; display: flex; flex-direction: column; } .card-meta { flex: 1; } .card.prev-banned { border-color: var(--amber); } .card.whitelisted { border-color: var(--green); } .card-ip { font-family: 'VT323', monospace; font-size: 1.25rem; color: var(--cyan); text-shadow: 0 0 5px var(--cyan); margin-bottom: .3rem; word-break: break-all; overflow-wrap: break-word; } .card-ip::before { content: '▸ '; color: var(--green); } .card-meta { font-size: .78rem; color: #777; line-height: 1.6; } .card-meta span { display: block; } .score-badge { display: inline-block; font-family: 'VT323', monospace; font-size: 1.1rem; padding: .05rem .5rem; border: 1px solid; float: right; margin-top: -.1rem; } .card-actions { display: flex; flex-wrap: wrap; gap: .35rem; margin-top: .7rem; } .card-actions button, .card-actions a { flex: 1 1 45%; font-size: .72rem; text-align: center; text-decoration: none; } .hi { color: var(--amber); } .good { color: var(--green); } .warn { color: var(--red); } .info { color: var(--cyan); } .muted { color: #555; } button, a.btn { display: inline-block; background: #001a05; border: 1px solid var(--border); color: var(--green); font-family: 'Share Tech Mono', monospace; font-size: .82rem; padding: .28rem .7rem; cursor: pointer; transition: background .15s, color .15s; text-decoration: none; } button:hover:not(:disabled), a.btn:hover { background: var(--dim); color: #fff; } button:disabled { color: var(--dim); cursor: not-allowed; border-color: #002608; } button.btn-red, a.btn-red { border-color: var(--red); color: var(--red); } button.btn-red:hover:not(:disabled), a.btn-red:hover { background: #330000; color: #fff; } button.btn-amber, a.btn-amber { border-color: var(--amber); color: var(--amber); } button.btn-amber:hover { background: #1a1000; color: #fff; } .blink { animation: blink 1s step-end infinite; } @keyframes blink { 50% { opacity: 0; } } .prompt { color: var(--dim); font-size: .78rem; margin-top: 2rem; } .prompt::before { content: 'root@mm-dc:~# '; color: var(--green2); } footer { border-top: 1px solid var(--border); color: #333; font-size: .72rem; padding-top: .7rem; margin-top: 3rem; text-align: center; } /* ── Live Feed ─────────────────────────────────────────────── */ .feed-status { font-size: .78rem; color: var(--amber); margin-bottom: .5rem; } .feed-status.ok { color: var(--green); } .feed-status.err { color: var(--red); } .feed-box { height: 200px; overflow-y: auto; background: #000d03; border: 1px solid var(--border); padding: .5rem .75rem; font-size: .75rem; line-height: 1.6; } .feed-box::-webkit-scrollbar { width: 6px; } .feed-box::-webkit-scrollbar-track { background: var(--bg); } .feed-box::-webkit-scrollbar-thumb { background: var(--dim); } .feed-line { color: var(--dim); display: block; } .feed-line.ban { color: var(--red); } /* ── Feed entries (ban-only, IP + jail display) ─────────────── */ .feed-entry { display: grid; grid-template-columns: 3.5rem 1fr auto; gap: .4rem; align-items: baseline; padding: .15rem 0; border-bottom: 1px solid #001a05; } .feed-time { color: var(--dim); font-size: .72rem; } .feed-ip { color: var(--green); font-size: .82rem; } .feed-jail { color: var(--amber); font-size: .72rem; text-align: right; } /* ── Two-column layout [feed | unified main] ─────────────────── */ .main-col { display: grid; grid-template-columns: 280px 1fr; gap: 1.2rem; align-items: start; margin-top: .8rem; } .col-main { min-width: 0; } .col-feed { position: sticky; top: 1rem; height: calc(100vh - 3rem); } .feed-col-box { height: 100%; display: flex; flex-direction: column; margin-bottom: 0; } .col-feed .feed-box { flex: 1; min-height: 0; height: auto; } /* ── Feed column title ───────────────────────────────────────── */ .feed-title { font-family: 'VT323', monospace; font-size: 1.1rem; color: var(--cyan); text-shadow: 0 0 6px var(--cyan); text-align: center; letter-spacing: 2px; padding: .4rem 0 .3rem; border-bottom: 1px solid var(--border); } /* ── Feed status dot ─────────────────────────────────────────── */ .feed-indicator { text-align: center; padding: .5rem 0 .3rem; } .status-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: var(--dim); box-shadow: 0 0 4px var(--dim); transition: background .3s, box-shadow .3s; } .status-dot.ok { background: var(--green); box-shadow: 0 0 8px var(--green); } .status-dot.err { background: var(--red); box-shadow: 0 0 8px var(--red); } .feed-rate { text-align: center; color: var(--dim); font-size: .65rem; padding: .3rem 0 .2rem; } /* ── Unified control bar ─────────────────────────────────────── */ .control-bar { background: var(--bg2); border: 1px solid var(--border); padding: .6rem .9rem; margin-bottom: 1rem; } .control-row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-bottom: .5rem; } .control-row-tools { gap: .8rem; border-top: 1px solid var(--border); padding-top: .5rem; margin-top: .1rem; } .tool-group { display: flex; align-items: center; gap: .35rem; flex-wrap: wrap; } .tool-group-right { margin-left: auto; } .tool-label { font-size: .68rem; letter-spacing: 1px; border-right: 1px solid var(--border); padding-right: .4rem; } .tool-group input[type="number"] { width: 46px; padding: .25rem .4rem; background: #001205; border: 1px solid var(--border); color: var(--green); font-family: 'Share Tech Mono', monospace; font-size: .82rem; text-align: center; } .tool-group input[type="number"]:focus { outline: none; border-color: var(--green); } .cb-label { display: flex; align-items: center; gap: .25rem; font-size: .75rem; color: var(--dim); cursor: pointer; } .cb-label input[type="checkbox"] { cursor: pointer; accent-color: var(--green); } .summary-bar { font-size: .75rem; color: var(--dim); margin-top: .35rem; border-top: 1px solid var(--border); padding-top: .3rem; } /* ── Scan filter button ──────────────────────────────────────── */ button[data-jail="scan"] { border-color: var(--amber); color: var(--amber); } button[data-jail="scan"].active { background: #1a1000; border-color: var(--amber); color: var(--amber); } /* ── Scan card differentiation ───────────────────────────────── */ .scan-card { background: #0d0d05; border-left: 3px solid var(--amber) !important; } .scan-badge { display: inline-block; font-size: .6rem; color: var(--amber); border: 1px solid var(--amber); padding: .05rem .3rem; margin-left: .4rem; vertical-align: middle; font-family: 'Share Tech Mono', monospace; } /* ── Card grid: fixed 4 columns ──────────────────────────────── */ .col-main .card-grid { grid-template-columns: repeat(4, 1fr); } @media (max-width: 900px) { .main-col { grid-template-columns: 1fr; } .col-feed { position: static; height: auto; } .feed-col-box { height: auto; } .col-feed .feed-box { height: 220px; flex: none; } .col-main .card-grid { grid-template-columns: repeat(2, 1fr); } .filter-bar { flex-wrap: wrap; } .filter-bar button { flex: 1 1 auto; min-width: 4rem; } .control-row-tools { flex-direction: column; align-items: flex-start; } .tool-group-right { margin-left: 0; width: 100%; flex-wrap: wrap; } .tool-group-right input[type="text"] { flex: 1 1 100%; } } /* ── Filter bar ────────────────────────────────────────────── */ .filter-bar { display: flex; flex: 1; gap: .4rem; } .filter-bar button { flex: 1; font-size: .75rem; padding: .2rem .4rem; text-align: center; } .filter-bar button.active { background: var(--dim); border-color: var(--green); color: var(--green); } /* ── Action bar ────────────────────────────────────────────── */ .action-bar { display: flex; flex-wrap: wrap; gap: .5rem; align-items: flex-end; margin-bottom: 1rem; } .action-bar input[type="text"], .action-bar select { background: #001205; border: 1px solid var(--border); color: var(--green); font-family: 'Share Tech Mono', monospace; font-size: .82rem; padding: .28rem .5rem; flex: 2 1 160px; } .action-bar input::placeholder { color: var(--dim); } .action-bar select { flex: 1 1 130px; cursor: pointer; } .action-bar input:focus, .action-bar select:focus { outline: none; border-color: var(--green); } #note-wrap { flex: 0 0 100%; } #note-wrap input { width: 100%; } /* ── Scan controls ─────────────────────────────────────────── */ .scan-controls { display: flex; align-items: center; gap: .6rem; margin-bottom: .8rem; flex-wrap: wrap; } .scan-controls label { color: var(--dim); font-size: .82rem; } .scan-controls input[type="number"] { width: 56px; padding: .25rem .4rem; background: #001205; border: 1px solid var(--border); color: var(--green); font-family: 'Share Tech Mono', monospace; font-size: .82rem; text-align: center; } .scan-controls input:focus { outline: none; border-color: var(--green); } /* ── Summary line ──────────────────────────────────────────── */ .summary { font-size: .78rem; color: var(--dim); margin-bottom: .8rem; }