:root{--primary: #232382;--primary-dark: #1b1b66;--accent: #eb8714;--accent-soft: #fff4e6;--bg: #f5f6fa;--card: #ffffff;--border: #e6e8f0;--text: #1f2430;--text-secondary: #6b7280;--text-muted: #9aa1ad;--green: #16a34a;--green-bg: #e8f7ee;--red: #dc2626;--red-bg: #fdecec;--amber: #d97706;--amber-bg: #fdf3e3;--shadow: 0 1px 3px rgba(16, 24, 40, .06), 0 1px 2px rgba(16, 24, 40, .04);--shadow-hover: 0 4px 12px rgba(16, 24, 40, .08);--radius: 10px;--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--topbar-bg: #ffffff;--hover-bg: #f4f4fb;--active-bg: #ececfb;--thead-bg: #fbfbfd;--row-alt: #fafbfd;--row-hover: #f2f3fb;--input-bg: #ffffff}html.dark{--primary: #7c7cf0;--primary-dark: #5a5ad8;--accent: #f59e0b;--accent-soft: #2a2415;--bg: #0f172a;--card: #1e293b;--border: #334155;--text: #e2e8f0;--text-secondary: #94a3b8;--text-muted: #64748b;--green: #22c55e;--green-bg: #12291b;--red: #ef4444;--red-bg: #33151a;--amber: #f59e0b;--amber-bg: #2a2415;--shadow: 0 1px 3px rgba(0, 0, 0, .4), 0 1px 2px rgba(0, 0, 0, .3);--shadow-hover: 0 4px 14px rgba(0, 0, 0, .5);--topbar-bg: #1e293b;--hover-bg: #273449;--active-bg: #2c3a52;--thead-bg: #1b2739;--row-alt: #223047;--row-hover: #273449;--input-bg: #0f172a}@media (prefers-color-scheme: dark){html:not(.light):not(.dark){--primary: #7c7cf0;--primary-dark: #5a5ad8;--accent: #f59e0b;--accent-soft: #2a2415;--bg: #0f172a;--card: #1e293b;--border: #334155;--text: #e2e8f0;--text-secondary: #94a3b8;--text-muted: #64748b;--green: #22c55e;--green-bg: #12291b;--red: #ef4444;--red-bg: #33151a;--amber: #f59e0b;--amber-bg: #2a2415;--shadow: 0 1px 3px rgba(0, 0, 0, .4), 0 1px 2px rgba(0, 0, 0, .3);--shadow-hover: 0 4px 14px rgba(0, 0, 0, .5);--topbar-bg: #1e293b;--hover-bg: #273449;--active-bg: #2c3a52;--thead-bg: #1b2739;--row-alt: #223047;--row-hover: #273449;--input-bg: #0f172a}}*{box-sizing:border-box;margin:0;padding:0}html,body{font-family:var(--font);background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}#root{min-height:100vh}.app{display:flex;flex-direction:column;min-height:100vh}.container{width:100%;max-width:1200px;margin:0 auto;padding:24px}main{flex:1}.topbar{background:var(--topbar-bg);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:20}.topbar-inner{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 24px;height:60px}.brand{display:flex;align-items:center;gap:10px}.brand-logo{width:34px;height:34px;border-radius:8px;background:var(--primary);display:grid;place-items:center;flex-shrink:0}.brand-name{font-weight:700;font-size:18px;letter-spacing:.03em;color:var(--primary)}.brand-name span{color:var(--accent)}.brand-sub{display:block;font-size:10px;font-weight:500;letter-spacing:.14em;color:var(--text-muted);text-transform:uppercase}.topbar-right{display:flex;align-items:center;gap:16px}.topbar-nav{display:flex;align-items:center;gap:4px}.nav-link{display:inline-flex;align-items:center;padding:7px 14px;border-radius:8px;font-size:13px;font-weight:600;color:var(--text-secondary);text-decoration:none;transition:color .13s ease,background .13s ease}.nav-link:hover{color:var(--primary);background:var(--hover-bg)}.nav-link.is-active{color:var(--primary);background:var(--active-bg)}.clock{text-align:right;line-height:1.25}.clock-time{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums}.clock-date{font-size:11px;color:var(--text-secondary)}.health-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;font-size:12px;font-weight:600;background:var(--green-bg);color:var(--green);border:1px solid transparent}.health-pill.is-offline{background:var(--red-bg);color:var(--red)}.health-dot{width:8px;height:8px;border-radius:50%;background:currentColor;animation:pulse 2s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}.card-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--border)}.card-title{font-size:15px;font-weight:650;display:flex;align-items:center;gap:8px}.card-subtitle{font-size:12px;color:var(--text-secondary);font-weight:400}.card-body{padding:20px}.stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:24px}.stat-card{display:flex;align-items:center;gap:14px;padding:18px 20px;transition:box-shadow .15s ease,transform .15s ease}.stat-card:hover{box-shadow:var(--shadow-hover)}.stat-card.is-clickable{cursor:pointer}.stat-card.is-clickable:hover{transform:translateY(-1px)}.stat-card.is-pulse{animation:stat-pulse 1.6s ease-in-out infinite}@keyframes stat-pulse{0%,to{box-shadow:0 0 #dc262600}50%{box-shadow:0 0 0 5px #dc262638;border-color:var(--red)}}.stat-icon{width:46px;height:46px;border-radius:10px;display:grid;place-items:center;flex-shrink:0}.stat-icon svg{width:22px;height:22px}.stat-icon.blue{background:#e9e9f7;color:var(--primary)}.stat-icon.green{background:var(--green-bg);color:var(--green)}.stat-icon.red{background:var(--red-bg);color:var(--red)}.stat-icon.amber{background:var(--amber-bg);color:var(--amber)}.stat-info{min-width:0}.stat-value{font-size:26px;font-weight:700;line-height:1.1;font-variant-numeric:tabular-nums}.stat-label{font-size:12px;color:var(--text-secondary);margin-top:2px}.grid{display:grid;gap:16px}.grid-2col{grid-template-columns:1fr 1fr}.grid-ether{grid-template-columns:repeat(3,1fr)}.ether-card{padding:16px 20px}.ether-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.ether-name{font-weight:700;font-size:15px}.ether-status{font-size:12px;font-weight:600;padding:3px 10px;border-radius:999px}.ether-status.is-online{background:var(--green-bg);color:var(--green)}.ether-status.is-offline{background:var(--red-bg);color:var(--red)}.swatch.ether-rx{background:var(--accent)}.swatch.ether-tx{background:#06b6d4}.value.ether-rx{color:var(--accent)}.value.ether-tx{color:#06b6d4}.offline-list{display:flex;flex-wrap:wrap;gap:8px}.offline-chip{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border:1px solid var(--red-bg);border-radius:8px;background:var(--red-bg);color:var(--red);text-decoration:none;transition:all .13s ease}.offline-chip:hover{background:var(--red-bg);border-color:var(--red)}.offline-nama{font-weight:600;font-size:13px}.offline-arm{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;color:var(--text-muted)}.offline-empty{display:flex;align-items:center;justify-content:center;gap:8px;padding:24px 16px;color:var(--green);font-weight:600}grid-template-columns: 1fr 1fr; } .grid-traffic-list{grid-template-columns:1fr 1fr}.traffic-summary{display:flex;gap:24px;flex-wrap:wrap}.traffic-metric{display:flex;align-items:center;gap:10px}.traffic-metric .swatch{width:10px;height:10px;border-radius:3px}.swatch.rx{background:var(--primary)}.swatch.tx{background:var(--accent)}.traffic-metric .value{font-weight:650;font-variant-numeric:tabular-nums}.traffic-metric .label{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em}.chart-wrap{padding:20px}.chart{display:flex;align-items:flex-end;gap:3px;height:220px;padding-top:8px}.bar-group{flex:1;display:flex;align-items:flex-end;gap:3px;height:100%;min-width:0}.bar{flex:1;border-radius:3px 3px 0 0;min-height:2px;transition:height .4s ease}.bar.rx{background:var(--primary)}.bar.tx{background:var(--accent)}.chart-xaxis{display:flex;justify-content:space-between;margin-top:8px;font-size:11px;color:var(--text-muted)}.chart-empty{height:220px;display:grid;place-items:center}.toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.search-box{position:relative;min-width:240px}.search-box svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--text-muted);pointer-events:none}.search-box input{width:100%;padding:9px 12px 9px 36px;border:1px solid var(--border);border-radius:8px;font-size:13px;font-family:inherit;background:var(--input-bg);color:var(--text);outline:none;transition:border-color .15s ease,box-shadow .15s ease}.search-box input::placeholder{color:var(--text-muted)}.search-box input:focus{border-color:var(--primary);box-shadow:0 0 0 3px #23238214}.count-badge{font-size:12px;color:var(--text-secondary);background:var(--bg);border:1px solid var(--border);padding:4px 10px;border-radius:999px}.filter-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 20px;background:var(--red-bg);border-bottom:1px solid var(--red-bg);font-size:13px;color:var(--red);font-weight:600}.filter-bar.is-desa{background:var(--card);color:var(--text-secondary);border-bottom:1px solid var(--border);font-weight:500}.filter-label{font-size:12px}.filter-select{background:var(--input-bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:7px 10px;font-size:13px;font-family:inherit}.log-filter-bar{display:flex;align-items:center;gap:6px;background:var(--card);border:1px solid var(--border);border-radius:999px;padding:4px}.filter-btn{border:none;background:transparent;font-family:inherit;font-size:12px;font-weight:600;color:var(--text-secondary);padding:6px 14px;border-radius:999px;cursor:pointer;transition:all .13s ease}.filter-btn:hover{color:var(--primary)}.filter-btn.is-active{background:var(--primary);color:#fff}.log-status{display:flex;flex-direction:column;gap:2px}.log-resolved-at{font-size:11px;color:var(--text-muted);white-space:nowrap}.iframe-wrap{height:calc(100vh - 220px);min-height:480px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--card)}.iframe-wrap:fullscreen{height:100vh;border:none;border-radius:0}.peta-frame{width:100%;height:100%;border:none;display:block}.table-scroll{overflow-x:auto}table.table{width:100%;border-collapse:collapse;font-size:13px}.table thead th{text-align:left;padding:12px 16px;font-size:11px;font-weight:650;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;background:var(--thead-bg)}.table tbody td{padding:11px 16px;border-bottom:1px solid #f0f1f6;white-space:nowrap}.table tbody tr:last-child td{border-bottom:none}.table tbody tr:nth-child(2n){background:var(--row-alt)}.table tbody tr{transition:background .12s ease}.table tbody tr:hover{background:var(--row-hover)}.arm-id{font-weight:600;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:var(--primary)}.cell-nama{max-width:220px;overflow:hidden;text-overflow:ellipsis}.cell-ip{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:var(--text-secondary)}.status-badge{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:550}.status-badge .dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-badge.is-online{color:var(--green)}.status-badge.is-online .dot{background:var(--green)}.status-badge.is-offline{color:var(--red)}.status-badge.is-offline .dot{background:var(--red)}.status-badge.is-unknown{color:var(--text-muted)}.status-badge.is-unknown .dot{background:var(--text-muted)}.latency{font-variant-numeric:tabular-nums;font-size:12px}.latency.is-bad{color:var(--red);font-weight:600}.latency.is-unknown{color:var(--text-muted)}.btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);background:var(--card);color:var(--text-secondary);font-size:12px;font-weight:550;font-family:inherit;padding:5px 12px;border-radius:7px;cursor:pointer;transition:all .13s ease}.btn:hover:not(:disabled){border-color:var(--primary);color:var(--primary);background:var(--hover-bg)}.btn:disabled{opacity:.5;cursor:default}.btn.is-pinging{color:var(--accent);border-color:var(--accent);background:var(--accent-soft)}.btn svg{width:13px;height:13px}.spinner{width:12px;height:12px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.table-empty{text-align:center;padding:40px 16px;color:var(--text-muted)}.alert-list{display:flex;flex-direction:column;gap:10px}.alert-item{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--red-bg);border-left:3px solid var(--red);background:var(--red-bg);border-radius:8px}.alert-item .alert-icon{width:34px;height:34px;border-radius:8px;background:var(--red-bg);color:var(--red);display:grid;place-items:center;flex-shrink:0}.alert-item .alert-icon svg{width:17px;height:17px}.alert-item .alert-info{flex:1;min-width:0}.alert-item .alert-nama{font-weight:600;font-size:13px}.alert-item .alert-meta{font-size:12px;color:var(--text-secondary)}.alert-duration{font-size:12px;color:var(--red);font-weight:650;white-space:nowrap}.alert-empty{text-align:center;padding:28px 16px;color:var(--text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:48px 16px;text-align:center;color:var(--text-muted)}.state.error{color:var(--red)}.state .state-icon{font-size:28px}.state p{font-size:13px;max-width:320px}.retry-btn{margin-top:4px}.footer{border-top:1px solid var(--border);padding:16px 24px;text-align:center;font-size:12px;color:var(--text-muted);background:var(--topbar-bg)}.latency-chart{display:flex;align-items:flex-end;gap:3px;height:140px;padding-top:8px}.latency-bar{flex:1;min-width:4px;border-radius:3px 3px 0 0;min-height:2px;transition:height .4s ease}.latency-bar.bar-good{background:var(--green)}.latency-bar.bar-warn{background:var(--amber)}.latency-bar.bar-bad{background:var(--red)}.latency-bar.bar-nodata{background:var(--border)}.latency-legend{display:flex;gap:16px;flex-wrap:wrap;margin-top:12px;font-size:11px;color:var(--text-secondary)}.legend-dot{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:6px;vertical-align:-1px}.legend-dot.good{background:var(--green)}.legend-dot.warn{background:var(--amber)}.legend-dot.bad{background:var(--red)}.legend-dot.nodata{background:var(--border)}.back-link{flex-shrink:0}.detail-card{overflow:hidden}.detail-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:20px}.detail-info{min-width:0}.detail-nama{font-size:22px;font-weight:700;margin-bottom:8px}.detail-meta{display:flex;flex-wrap:wrap;gap:8px 20px;font-size:13px;color:var(--text-secondary)}.detail-meta strong{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.detail-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.detail-actions .btn{font-size:13px;padding:8px 16px}.line-chart-wrap{position:relative;height:200px;margin-bottom:8px}.line-chart-svg{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;overflow:visible}.line-chart-dot{position:absolute;width:9px;height:9px;border-radius:50%;transform:translate(-50%,-50%);border:2px solid var(--card);box-shadow:0 0 0 1px #1018281f}.severity-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;padding:3px 8px;border-radius:999px;white-space:nowrap}.severity-badge.is-critical{background:var(--red-bg);color:var(--red)}.severity-badge.is-warning{background:var(--amber-bg);color:var(--amber)}.alert-item .alert-icon.is-critical{background:var(--red-bg);color:var(--red)}.alert-item .alert-icon.is-warning{background:var(--amber-bg);color:var(--amber)}.alert-right{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex-shrink:0}.alert-tipe{font-size:11px;color:var(--text-muted);white-space:nowrap}@media (max-width: 900px){.stats-grid{grid-template-columns:repeat(2,1fr)}.grid-traffic-list{grid-template-columns:1fr}}@media (max-width: 640px){.container{padding:16px}.topbar-inner{padding:0 16px}.stats-grid{grid-template-columns:repeat(2,1fr);gap:10px}.stat-card{padding:14px}.stat-value{font-size:20px}.clock-date{display:none}.card-body,.chart-wrap{padding:14px}.search-box{min-width:100%}.toolbar{align-items:stretch}}@media (max-width: 768px){.brand-name{font-size:16px}.brand-sub{font-size:9px}.topbar-inner{gap:10px}.nav-link{padding:6px 10px;font-size:12px}.clock-time{font-size:13px}.health-pill{padding:5px 10px;font-size:11px}.stats-grid{grid-template-columns:repeat(2,1fr);gap:12px}.grid-traffic-list{grid-template-columns:1fr}.btn{padding:9px 14px;font-size:13px;min-height:40px}.btn svg{width:15px;height:15px}.search-box input{padding:11px 12px 11px 38px;font-size:15px}.chart{height:180px}.latency-chart{height:120px}.line-chart-wrap{height:160px}.table thead th,.table tbody td{padding:10px 12px}.detail-head{padding:16px}.detail-nama{font-size:18px}.detail-actions{width:100%}.detail-actions .status-badge{margin-right:auto}}.btn-wa{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:600;background:#25d366;color:#fff;text-decoration:none;border:none;cursor:pointer;transition:opacity .13s ease}.btn-wa:hover{opacity:.85;color:#fff}.btn-wa-sm{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:#25d366;color:#fff;text-decoration:none;flex-shrink:0;transition:opacity .13s ease}.btn-wa-sm:hover{opacity:.8;color:#fff}.analysis-grid{display:flex;flex-direction:column;gap:16px}.analysis-item{display:flex;flex-direction:column;gap:4px}.analysis-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary)}.analysis-value{font-size:14px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:8px;flex-wrap:wrap}.badge{display:inline-flex;font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px}.badge-warn{background:#fef3c7;color:#92400e}.badge-alert{background:#fee2e2;color:#991b1b}.login-page{min-height:100vh;display:grid;place-items:center;background:var(--bg);padding:24px}.login-card{width:100%;max-width:380px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-hover);padding:32px 28px;display:flex;flex-direction:column;align-items:center;gap:12px}.login-logo{height:48px;width:auto}.login-title{font-size:20px;font-weight:700;color:var(--primary)}.login-sub{font-size:13px;color:var(--text-secondary);margin-bottom:4px}.login-input{width:100%;padding:11px 14px;border:1px solid var(--border);border-radius:8px;font-size:14px;font-family:inherit;background:var(--input-bg);color:var(--text);outline:none}.login-input:focus{border-color:var(--primary);box-shadow:0 0 0 3px #2323821f}.login-error{width:100%;font-size:13px;color:var(--red);background:var(--red-bg);border-radius:8px;padding:8px 12px;text-align:center}.login-btn{width:100%;padding:11px 14px;border:none;border-radius:8px;background:var(--primary);color:#fff;font-size:14px;font-weight:600;font-family:inherit;cursor:pointer}.login-btn:hover:not(:disabled){background:var(--primary-dark)}.login-btn:disabled{opacity:.6;cursor:default}.icon-btn{background:var(--card);border:1px solid var(--border);border-radius:8px;width:34px;height:34px;display:grid;place-items:center;font-size:15px;cursor:pointer;transition:all .13s ease}.icon-btn:hover{border-color:var(--primary)}.traffic-tabs{display:flex;gap:4px;background:var(--bg);border:1px solid var(--border);border-radius:999px;padding:3px}.tab{border:none;background:transparent;font-family:inherit;font-size:12px;font-weight:600;color:var(--text-secondary);padding:5px 14px;border-radius:999px;cursor:pointer;transition:all .13s ease}.tab:hover{color:var(--primary)}.tab.is-active{background:var(--primary);color:#fff}.olt-legend{display:flex;gap:18px;flex-wrap:wrap;align-items:center;font-size:12px;color:var(--text-secondary);margin-bottom:16px;padding:10px 14px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius)}.olt-swatch{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:6px;vertical-align:-1px}.olt-swatch.is-good{background:var(--green)}.olt-swatch.is-warn{background:var(--amber)}.olt-swatch.is-bad{background:var(--red)}.olt-swatch.is-unknown{background:var(--text-muted)}.rx-badge{display:inline-flex;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;padding:3px 10px;border-radius:999px}.rx-badge.is-good{background:var(--green-bg);color:var(--green)}.rx-badge.is-warn{background:var(--amber-bg);color:var(--amber)}.rx-badge.is-bad{background:var(--red-bg);color:var(--red)}.rx-badge.is-unknown{background:var(--bg);color:var(--text-muted)}.traffic-line-wrap{border-bottom:1px solid var(--border)}.password-wrap{position:relative;display:flex;align-items:center}.show-pass-btn{position:absolute;right:10px;background:none;border:none;cursor:pointer;color:#64748b;padding:4px;display:flex;align-items:center}.show-pass-btn:hover{color:#232382}
