Spaces:
Configuration error
Configuration error
| /* ββββββββββββββββββββββββββββββββββββββββββ | |
| SentinelNet β style.css | |
| Edit this file to change colors / layout | |
| ββββββββββββββββββββββββββββββββββββββββββ */ | |
| *,*::before,*::after { box-sizing:border-box; margin:0; padding:0 } | |
| :root { | |
| --bg:#04080d; --bg2:#080e16; --bg3:#0d1520; | |
| --surface:#101d2e; --surface2:#162438; | |
| --border:rgba(0,210,130,0.08); | |
| --border2:rgba(0,210,130,0.18); | |
| --border3:rgba(0,210,130,0.35); | |
| --accent:#00e87a; --cyan:#00c8e8; | |
| --red:#ff3d5a; --amber:#ffaa00; --purple:#b06fff; | |
| --text:#d8eeff; --muted:#4a6a88; --muted2:#7a9ab8; | |
| --mono:'IBM Plex Mono',monospace; | |
| --sans:'Space Grotesk',sans-serif; | |
| --glow-green:0 0 20px rgba(0,232,122,0.25); | |
| } | |
| html { scroll-behavior:smooth } | |
| body { | |
| background:var(--bg); color:var(--text); | |
| font-family:var(--sans); min-height:100vh; overflow-x:hidden; | |
| } | |
| body::before { | |
| content:''; position:fixed; inset:0; pointer-events:none; z-index:0; | |
| background: | |
| radial-gradient(ellipse 60% 40% at 10% 20%,rgba(0,232,122,0.04) 0%,transparent 60%), | |
| radial-gradient(ellipse 50% 50% at 90% 80%,rgba(0,200,232,0.03) 0%,transparent 60%), | |
| repeating-linear-gradient(0deg,transparent,transparent 40px,rgba(0,210,130,0.015) 40px,rgba(0,210,130,0.015) 41px), | |
| repeating-linear-gradient(90deg,transparent,transparent 40px,rgba(0,210,130,0.015) 40px,rgba(0,210,130,0.015) 41px); | |
| } | |
| .app { position:relative; z-index:1; max-width:1500px; margin:0 auto; padding:0 24px 80px } | |
| /* ββ HEADER ββ */ | |
| header { | |
| display:flex; align-items:center; justify-content:space-between; | |
| padding:20px 0; border-bottom:1px solid var(--border2); | |
| margin-bottom:0; position:relative; | |
| } | |
| header::after { | |
| content:''; position:absolute; bottom:-1px; left:0; | |
| width:200px; height:1px; | |
| background:linear-gradient(90deg,var(--accent),transparent); | |
| } | |
| .logo { display:flex; align-items:center; gap:14px } | |
| .logo-shield { | |
| width:44px; height:44px; border-radius:12px; | |
| background:linear-gradient(135deg,#001a0d,#003020); | |
| border:1px solid var(--border3); display:flex; | |
| align-items:center; justify-content:center; | |
| font-size:20px; box-shadow:var(--glow-green); | |
| } | |
| .logo-name { font-family:var(--mono); font-size:20px; font-weight:700; color:var(--accent); letter-spacing:-0.5px } | |
| .logo-tag { font-size:10px; color:var(--muted); letter-spacing:3px; text-transform:uppercase; margin-top:3px; font-family:var(--mono) } | |
| .header-right { display:flex; align-items:center; gap:14px } | |
| .live-badge { | |
| display:flex; align-items:center; gap:8px; padding:7px 16px; | |
| border-radius:999px; border:1px solid var(--border2); | |
| background:rgba(0,232,122,0.05); | |
| font-family:var(--mono); font-size:11px; color:var(--accent); | |
| } | |
| .dot { width:7px; height:7px; border-radius:50%; background:var(--accent); animation:blink 1.4s ease-in-out infinite; flex-shrink:0 } | |
| .dot.red { background:var(--red); animation:none; box-shadow:0 0 6px var(--red) } | |
| .dot.amber { background:var(--amber); box-shadow:0 0 6px var(--amber) } | |
| .dot.green { background:var(--accent); box-shadow:0 0 8px var(--accent) } | |
| @keyframes blink { 0%,100%{opacity:1} 50%{opacity:0.2} } | |
| #sessionClock { | |
| font-family:var(--mono); font-size:11px; color:var(--muted2); | |
| background:var(--surface); padding:6px 12px; | |
| border-radius:6px; border:1px solid var(--border); | |
| } | |
| /* ββ TABS ββ */ | |
| .tab-nav { display:flex; border-bottom:1px solid var(--border2); margin-bottom:28px } | |
| .tab-btn { | |
| padding:16px 32px; font-family:var(--mono); font-size:11px; | |
| font-weight:600; letter-spacing:2px; text-transform:uppercase; | |
| color:var(--muted); background:transparent; border:none; cursor:pointer; | |
| transition:color .2s; border-bottom:2px solid transparent; margin-bottom:-1px; | |
| } | |
| .tab-btn:hover { color:var(--muted2) } | |
| .tab-btn.active { color:var(--accent); border-bottom:2px solid var(--accent) } | |
| .tab-btn .tab-icon { margin-right:8px } | |
| .tab-pane { display:none } | |
| .tab-pane.active { display:block; animation:fadeIn .25s ease } | |
| @keyframes fadeIn { from{opacity:0;transform:translateY(4px)} to{opacity:1;transform:none} } | |
| /* ββ PANEL ββ */ | |
| .panel { background:var(--bg2); border:1px solid var(--border); border-radius:14px; overflow:hidden } | |
| .panel-head { | |
| padding:12px 18px; font-family:var(--mono); font-size:10px; color:var(--muted); | |
| border-bottom:1px solid var(--border); display:flex; justify-content:space-between; | |
| align-items:center; letter-spacing:1.5px; text-transform:uppercase; background:rgba(0,0,0,0.2); | |
| } | |
| .panel-head .accent{color:var(--accent)} .panel-head .red{color:var(--red)} | |
| .panel-head .cyan{color:var(--cyan)} .panel-head .amber{color:var(--amber)} | |
| /* ββ CONFIG STRIP ββ */ | |
| .config-strip { | |
| display:flex; gap:10px; align-items:center; | |
| background:var(--bg2); border:1px solid var(--border2); | |
| border-radius:12px; padding:14px 18px; margin-bottom:22px; flex-wrap:wrap; | |
| } | |
| .speed-wrap { display:flex; align-items:center; gap:8px; font-family:var(--mono); font-size:11px; color:var(--muted) } | |
| .speed-wrap select { | |
| background:var(--surface); border:1px solid var(--border2); | |
| border-radius:7px; color:var(--cyan); font-family:var(--mono); | |
| font-size:11px; padding:7px 12px; outline:none; cursor:pointer; | |
| } | |
| /* ββ BUTTONS ββ */ | |
| .btn { padding:8px 18px; border-radius:8px; font-family:var(--mono); font-size:11px; font-weight:700; cursor:pointer; border:none; transition:all .2s; white-space:nowrap; letter-spacing:.5px } | |
| .btn-start { background:rgba(0,232,122,0.12); color:var(--accent); border:1px solid rgba(0,232,122,0.3) } | |
| .btn-start:hover:not(:disabled) { background:rgba(0,232,122,0.22); box-shadow:var(--glow-green) } | |
| .btn-start:disabled { opacity:.4; cursor:not-allowed } | |
| .btn-stop { background:rgba(255,61,90,0.1); color:var(--red); border:1px solid rgba(255,61,90,0.25) } | |
| .btn-stop:hover:not(:disabled) { background:rgba(255,61,90,0.2) } | |
| .btn-stop:disabled { opacity:.4; cursor:not-allowed } | |
| .btn-clear { background:var(--surface); color:var(--muted2); border:1px solid var(--border) } | |
| .btn-clear:hover { color:var(--text); border-color:var(--border2) } | |
| /* ββ CONNECTION BADGE ββ */ | |
| #connBadge { font-family:var(--mono); font-size:11px; padding:6px 14px; border-radius:7px; white-space:nowrap; transition:all .3s } | |
| #connBadge.real { background:rgba(0,232,122,0.1); color:var(--accent); border:1px solid rgba(0,232,122,0.2) } | |
| #connBadge.local { background:rgba(255,170,0,0.1); color:var(--amber); border:1px solid rgba(255,170,0,0.2) } | |
| #connBadge.idle { background:var(--surface); color:var(--muted); border:1px solid var(--border) } | |
| /* ββ METRICS ββ */ | |
| .metrics { display:grid; grid-template-columns:repeat(6,1fr); gap:12px; margin-bottom:22px } | |
| @media(max-width:1000px) { .metrics { grid-template-columns:repeat(3,1fr) } } | |
| .mc { background:var(--bg2); border:1px solid var(--border); border-radius:12px; padding:18px 16px; position:relative; overflow:hidden; transition:border-color .3s } | |
| .mc.flash { border-color:var(--accent); animation:mcflash .6s ease-out } | |
| @keyframes mcflash { 0%{box-shadow:0 0 16px rgba(0,232,122,0.5)} 100%{box-shadow:none} } | |
| .mc-label { font-family:var(--mono); font-size:9px; letter-spacing:2px; text-transform:uppercase; color:var(--muted); margin-bottom:10px } | |
| .mc-val { font-family:var(--mono); font-size:28px; font-weight:700; line-height:1 } | |
| .mc-val.green{color:var(--accent)} .mc-val.red{color:var(--red)} .mc-val.amber{color:var(--amber)} .mc-val.blue{color:var(--cyan)} .mc-val.purple{color:var(--purple)} | |
| .mc-sub { font-size:10px; color:var(--muted); margin-top:6px; font-family:var(--mono) } | |
| .mc-bar { position:absolute; bottom:0; left:0; height:2px; transition:width .6s ease } | |
| .mc-bar.green{background:linear-gradient(90deg,var(--accent),transparent)} .mc-bar.red{background:linear-gradient(90deg,var(--red),transparent)} .mc-bar.blue{background:linear-gradient(90deg,var(--cyan),transparent)} .mc-bar.purple{background:linear-gradient(90deg,var(--purple),transparent)} | |
| /* ββ MAIN GRID ββ */ | |
| .main-grid { display:grid; grid-template-columns:1fr 360px; gap:18px; margin-bottom:18px } | |
| @media(max-width:1100px) { .main-grid { grid-template-columns:1fr } } | |
| .feed-wrap { max-height:480px; overflow-y:auto } | |
| .feed-table { width:100%; border-collapse:collapse; font-size:11px } | |
| .feed-table th { padding:9px 14px; text-align:left; font-family:var(--mono); font-size:9px; color:var(--muted); background:var(--surface); position:sticky; top:0; letter-spacing:1.5px; z-index:2 } | |
| .feed-table td { padding:8px 14px; border-top:1px solid var(--border); font-family:var(--mono) } | |
| .feed-table tr.new-row { animation:rowIn .4s ease-out } | |
| @keyframes rowIn { from{opacity:0;background:rgba(0,232,122,0.07)} to{opacity:1;background:transparent} } | |
| /* ββ BADGES ββ */ | |
| .cls-badge { display:inline-flex; padding:3px 9px; border-radius:5px; font-size:9px; font-weight:700; letter-spacing:.5px; font-family:var(--mono) } | |
| .cls-normal { background:rgba(0,232,122,0.12); color:var(--accent); border:1px solid rgba(0,232,122,0.2) } | |
| .cls-DoS { background:rgba(255,61,90,0.14); color:var(--red); border:1px solid rgba(255,61,90,0.2) } | |
| .cls-Probe { background:rgba(0,200,232,0.12); color:var(--cyan); border:1px solid rgba(0,200,232,0.2) } | |
| .cls-R2L { background:rgba(255,170,0,0.12); color:var(--amber); border:1px solid rgba(255,170,0,0.2) } | |
| .cls-U2R { background:rgba(176,111,255,0.13);color:var(--purple); border:1px solid rgba(176,111,255,0.2) } | |
| /* ββ SIDE PANELS ββ */ | |
| .side-panels { display:flex; flex-direction:column; gap:18px } | |
| .bar-row { display:flex; align-items:center; gap:10px; margin-bottom:10px } | |
| .bar-lbl { font-size:10px; font-family:var(--mono); color:var(--muted2); width:58px; flex-shrink:0 } | |
| .bar-track{ flex:1; background:var(--surface); border-radius:3px; height:5px; overflow:hidden } | |
| .bar-fill { height:100%; border-radius:3px; transition:width .8s cubic-bezier(.4,0,.2,1) } | |
| .bar-cnt { font-size:10px; font-family:var(--mono); min-width:34px; text-align:right; color:var(--text) } | |
| .timeline-wrap { padding:14px 16px } | |
| .tl-canvas { width:100%; height:80px; display:block } | |
| .term-wrap { max-height:180px; overflow-y:auto; padding:12px 14px; background:rgba(0,0,0,0.4) } | |
| .term-line { font-family:var(--mono); font-size:10px; line-height:1.9; white-space:nowrap } | |
| .term-line .ts{color:var(--muted)} .term-line .ok{color:var(--accent)} .term-line .warn{color:var(--amber)} .term-line .crit{color:var(--red)} .term-line .info{color:var(--cyan)} | |
| /* ββ BOTTOM GRID ββ */ | |
| .empty-state { padding:70px 20px; text-align:center; color:var(--muted); font-family:var(--mono); font-size:12px } | |
| .empty-icon { font-size:40px; margin-bottom:14px; opacity:.3; display:block } | |
| .bottom-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:18px } | |
| @media(max-width:800px) { .bottom-grid { grid-template-columns:1fr } } | |
| .heatmap-grid { display:grid; grid-template-columns:repeat(12,1fr); gap:3px; padding:14px } | |
| .hm-cell { aspect-ratio:1; border-radius:3px; background:var(--surface) } | |
| .summary-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:10px; padding:14px } | |
| .sum-item { background:var(--surface); border-radius:10px; padding:14px; border:1px solid var(--border) } | |
| .sum-label { font-family:var(--mono); font-size:9px; color:var(--muted); letter-spacing:1.5px; text-transform:uppercase; margin-bottom:6px } | |
| .sum-val { font-family:var(--mono); font-size:20px; font-weight:700 } | |
| /* ββββββββββββββββββββββββββββββββββββββββββ | |
| CSV TAB | |
| ββββββββββββββββββββββββββββββββββββββββββ */ | |
| .upload-zone { | |
| border:2px dashed var(--border2); border-radius:20px; padding:70px 40px; | |
| text-align:center; cursor:pointer; transition:all .3s; | |
| background:var(--bg2); position:relative; overflow:hidden; | |
| } | |
| .upload-zone:hover,.upload-zone.drag-over { border-color:var(--accent); background:rgba(0,232,122,0.03) } | |
| .upload-zone input { position:absolute; inset:0; opacity:0; cursor:pointer; width:100%; height:100% } | |
| .upload-icon { font-size:56px; margin-bottom:18px; display:block; opacity:.5 } | |
| .upload-title { font-family:var(--mono); font-size:18px; color:var(--accent); margin-bottom:10px; font-weight:700 } | |
| .upload-sub { font-size:13px; color:var(--muted2) } | |
| .upload-hint { display:inline-block; margin-top:18px; padding:8px 20px; border-radius:8px; border:1px solid var(--border2); font-family:var(--mono); font-size:10px; color:var(--muted); letter-spacing:1px; background:var(--surface) } | |
| .format-banner { display:flex; align-items:center; gap:12px; padding:12px 18px; border-radius:10px; font-family:var(--mono); font-size:11px; margin-bottom:16px; border:1px solid } | |
| .format-banner.ok { background:rgba(0,232,122,0.06); border-color:rgba(0,232,122,0.2); color:var(--accent) } | |
| .file-card { background:var(--bg2); border:1px solid var(--border2); border-radius:14px; padding:18px 22px; margin-bottom:18px; display:flex; align-items:center; gap:18px } | |
| .file-icon { font-size:32px; flex-shrink:0 } | |
| .file-details { flex:1 } | |
| .file-name { font-family:var(--mono); font-size:14px; color:var(--accent); font-weight:700 } | |
| .file-meta { font-family:var(--mono); font-size:10px; color:var(--muted); margin-top:5px; line-height:1.8 } | |
| .file-actions { display:flex; gap:10px } | |
| .progress-block { background:var(--bg2); border:1px solid var(--border2); border-radius:14px; padding:24px; margin-bottom:22px } | |
| .scan-line { height:1px; background:linear-gradient(90deg,transparent,var(--accent),transparent); animation:scanAnim 1.5s ease-in-out infinite; margin:0 0 16px } | |
| @keyframes scanAnim { 0%,100%{opacity:0;transform:scaleX(0.2)} 50%{opacity:1;transform:scaleX(1)} } | |
| .progress-header { display:flex; justify-content:space-between; align-items:center; margin-bottom:16px } | |
| .progress-title { font-family:var(--mono); font-size:11px; color:var(--muted); letter-spacing:2px; text-transform:uppercase } | |
| .progress-stats { font-family:var(--mono); font-size:13px; color:var(--cyan); font-weight:600 } | |
| .progress-track { background:var(--surface); border-radius:6px; height:10px; overflow:hidden; margin-bottom:14px } | |
| .progress-fill { height:100%; background:linear-gradient(90deg,var(--accent),var(--cyan)); border-radius:6px; transition:width .4s ease; width:0% } | |
| .progress-fill.warning { background:linear-gradient(90deg,var(--amber),var(--red)) } | |
| .progress-row { display:flex; justify-content:space-between; font-family:var(--mono); font-size:10px; color:var(--muted); margin-bottom:12px; flex-wrap:wrap; gap:6px } | |
| .current-row-display { font-family:var(--mono); font-size:10px; background:rgba(0,0,0,0.4); border-radius:8px; padding:10px 14px; color:var(--cyan); word-break:break-all; border-left:2px solid var(--accent); min-height:36px; line-height:1.6 } | |
| .batch-status { display:flex; gap:8px; margin-top:12px; flex-wrap:wrap } | |
| .batch-chip { font-family:var(--mono); font-size:10px; padding:4px 10px; border-radius:5px; background:var(--surface); color:var(--muted); border:1px solid var(--border) } | |
| .batch-chip.done { color:var(--accent); border-color:rgba(0,232,122,0.3); background:rgba(0,232,122,0.07) } | |
| .batch-chip.active { color:var(--cyan); border-color:rgba(0,200,232,0.3); background:rgba(0,200,232,0.07); animation:blink 1s infinite } | |
| .csv-results-grid { display:grid; grid-template-columns:1fr 340px; gap:18px; margin-bottom:20px } | |
| @media(max-width:1100px) { .csv-results-grid { grid-template-columns:1fr } } | |
| .csv-feed-wrap { max-height:520px; overflow-y:auto } | |
| .csv-feed-table { width:100%; border-collapse:collapse; font-size:11px } | |
| .csv-feed-table th { padding:9px 14px; text-align:left; font-family:var(--mono); font-size:9px; color:var(--muted); background:var(--surface); position:sticky; top:0; letter-spacing:1.5px; z-index:2 } | |
| .csv-feed-table td { padding:8px 14px; border-top:1px solid var(--border); font-family:var(--mono) } | |
| .csv-feed-table tr.csv-new-row { animation:rowIn .3s ease-out } | |
| .mini-stat-panel { display:flex; flex-direction:column; gap:14px } | |
| .mini-card { background:var(--bg2); border:1px solid var(--border); border-radius:12px; padding:16px } | |
| .mini-card-title { font-family:var(--mono); font-size:9px; color:var(--muted); letter-spacing:2px; text-transform:uppercase; margin-bottom:12px } | |
| .sev-bar-row { display:flex; align-items:center; gap:10px; margin-bottom:9px } | |
| .sev-bar-lbl { font-family:var(--mono); font-size:10px; width:62px; color:var(--muted2) } | |
| .sev-bar-track{ flex:1; background:var(--surface); border-radius:3px; height:7px; overflow:hidden } | |
| .sev-bar-fill { height:100%; border-radius:3px; transition:width .8s ease } | |
| .sev-bar-cnt { font-family:var(--mono); font-size:10px; min-width:36px; text-align:right } | |
| /* ββββββββββββββββββββββββββββββββββββββββββ | |
| REPORT | |
| ββββββββββββββββββββββββββββββββββββββββββ */ | |
| .processing-area { display:none } | |
| .processing-area.visible { display:block } | |
| .report-section { display:none } | |
| .report-section.visible { display:block; animation:fadeIn .4s ease } | |
| .completion-banner { | |
| background:linear-gradient(135deg,rgba(0,232,122,0.08),rgba(0,200,232,0.05)); | |
| border:1px solid rgba(0,232,122,0.3); border-radius:14px; | |
| padding:20px 24px; display:flex; align-items:center; gap:18px; margin-bottom:22px; | |
| } | |
| .banner-title { font-family:var(--mono); font-size:15px; font-weight:700; color:var(--accent) } | |
| .banner-sub { font-family:var(--mono); font-size:10px; color:var(--muted2); margin-top:4px; line-height:1.8 } | |
| .export-bar { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:24px } | |
| .btn-export { padding:10px 22px; border-radius:9px; font-family:var(--mono); font-size:11px; font-weight:700; cursor:pointer; border:none; transition:all .2s; letter-spacing:.5px } | |
| .btn-export-csv { background:rgba(0,232,122,0.1); color:var(--accent); border:1px solid rgba(0,232,122,0.25) } | |
| .btn-export-csv:hover { background:rgba(0,232,122,0.2) } | |
| .btn-export-pdf { background:rgba(0,200,232,0.1); color:var(--cyan); border:1px solid rgba(0,200,232,0.25) } | |
| .btn-export-pdf:hover { background:rgba(0,200,232,0.2) } | |
| .btn-export-json { background:rgba(176,111,255,0.1);color:var(--purple); border:1px solid rgba(176,111,255,0.25) } | |
| .btn-export-json:hover { background:rgba(176,111,255,0.2) } | |
| .btn-new-scan { background:rgba(255,170,0,0.1); color:var(--amber); border:1px solid rgba(255,170,0,0.25) } | |
| .btn-new-scan:hover { background:rgba(255,170,0,0.2) } | |
| .report-header { | |
| background:linear-gradient(135deg,rgba(0,232,122,0.05),rgba(0,200,232,0.03)); | |
| border:1px solid var(--border2); border-radius:18px; padding:32px 36px; margin-bottom:22px; | |
| } | |
| .report-title { font-family:var(--mono); font-size:24px; font-weight:700; color:var(--accent); margin-bottom:6px } | |
| .report-subtitle { font-family:var(--mono); font-size:10px; color:var(--muted); letter-spacing:2px; text-transform:uppercase } | |
| .report-meta { display:flex; gap:28px; margin-top:22px; flex-wrap:wrap } | |
| .report-meta-item{ font-family:var(--mono); font-size:11px; color:var(--muted) } | |
| .report-meta-item span { color:var(--text) } | |
| .report-grid { display:grid; grid-template-columns:repeat(5,1fr); gap:14px; margin-bottom:22px } | |
| @media(max-width:1000px) { .report-grid { grid-template-columns:repeat(3,1fr) } } | |
| .report-stat { background:var(--bg2); border:1px solid var(--border); border-radius:12px; padding:20px 16px; text-align:center; position:relative; overflow:hidden } | |
| .report-stat::before { content:''; position:absolute; top:0; left:0; right:0; height:2px } | |
| .report-stat.green::before{background:var(--accent)} .report-stat.red::before{background:var(--red)} .report-stat.amber::before{background:var(--amber)} .report-stat.cyan::before{background:var(--cyan)} .report-stat.purple::before{background:var(--purple)} | |
| .report-stat-val { font-family:var(--mono); font-size:30px; font-weight:700; margin-bottom:6px; line-height:1 } | |
| .report-stat-lbl { font-family:var(--mono); font-size:9px; color:var(--muted); letter-spacing:2px; text-transform:uppercase } | |
| .report-charts { display:grid; grid-template-columns:1fr 1fr 1fr; gap:18px; margin-bottom:22px } | |
| @media(max-width:1000px) { .report-charts { grid-template-columns:1fr 1fr } } | |
| .chart-canvas-wrap { padding:16px } | |
| .chart-canvas { width:100%; height:160px; display:block } | |
| .cluster-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:14px; padding:16px } | |
| @media(max-width:900px) { .cluster-grid { grid-template-columns:repeat(2,1fr) } } | |
| .cluster-card { background:var(--surface); border-radius:10px; padding:16px; border:1px solid var(--border); border-left:3px solid } | |
| .cluster-card.DoS{border-left-color:var(--red)} .cluster-card.Probe{border-left-color:var(--cyan)} .cluster-card.R2L{border-left-color:var(--amber)} .cluster-card.U2R{border-left-color:var(--purple)} .cluster-card.normal{border-left-color:var(--accent)} | |
| .cluster-title { font-family:var(--mono); font-size:11px; font-weight:700; margin-bottom:6px } | |
| .cluster-count { font-family:var(--mono); font-size:24px; font-weight:700; margin-bottom:4px } | |
| .cluster-sub { font-family:var(--mono); font-size:9px; color:var(--muted); line-height:1.8 } | |
| .threat-table { width:100%; border-collapse:collapse; font-size:11px } | |
| .threat-table th { padding:10px 16px; text-align:left; font-family:var(--mono); font-size:9px; color:var(--muted); background:var(--surface); position:sticky; top:0; letter-spacing:1.5px; z-index:2; border-bottom:1px solid var(--border2) } | |
| .threat-table td { padding:9px 16px; border-top:1px solid var(--border); font-family:var(--mono); font-size:11px } | |
| .threat-table tr.row-intrusion td:first-child { border-left:2px solid var(--red) } | |
| .pager { display:flex; align-items:center; gap:8px; padding:12px 16px; font-family:var(--mono); font-size:11px; color:var(--muted); border-top:1px solid var(--border) } | |
| .pager-btn { padding:5px 14px; border-radius:6px; background:var(--surface); border:1px solid var(--border2); color:var(--cyan); font-family:var(--mono); font-size:11px; cursor:pointer } | |
| .pager-btn:disabled { opacity:.4; cursor:not-allowed } | |
| .proto-bars { padding:14px 18px } | |
| .proto-row { display:flex; align-items:center; gap:10px; margin-bottom:10px } | |
| .proto-lbl { font-family:var(--mono); font-size:10px; color:var(--muted2); width:50px; flex-shrink:0 } | |
| .proto-track{ flex:1; background:var(--surface); border-radius:3px; height:6px; overflow:hidden } | |
| .proto-fill { height:100%; border-radius:3px; transition:width .9s ease } | |
| .proto-cnt { font-family:var(--mono); font-size:10px; min-width:90px; text-align:right; color:var(--muted2) } | |
| .services-list { padding:14px 18px } | |
| .svc-row { display:flex; align-items:center; padding:6px 0; border-top:1px solid var(--border); gap:8px } | |
| .svc-name{ font-family:var(--mono); font-size:11px; min-width:70px } | |
| .risk-gauge-wrap { padding:16px; display:flex; flex-direction:column; align-items:center; gap:8px } | |
| .risk-gauge-canvas { width:160px; height:90px; display:block } | |
| .risk-label { font-family:var(--mono); font-size:11px; color:var(--muted2); text-align:center } | |
| /* ββ SCROLLBAR ββ */ | |
| ::-webkit-scrollbar { width:4px; height:4px } | |
| ::-webkit-scrollbar-track { background:transparent } | |
| ::-webkit-scrollbar-thumb { background:var(--surface2); border-radius:2px } |