*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans KR,sans-serif;color:#1f2328;background:#f6f8fa}.app{max-width:1200px;margin:0 auto;padding:24px}header h1{margin:0 0 4px;font-size:22px}header .sub{margin:0 0 20px;color:#57606a;font-size:14px}.layout{display:grid;grid-template-columns:340px 1fr;gap:20px;align-items:start}@media (max-width: 860px){.layout{grid-template-columns:1fr}}.panel,.result{background:#fff;border:1px solid #d0d7de;border-radius:10px;padding:18px}.panel h2{font-size:14px;margin:18px 0 10px;text-transform:uppercase;letter-spacing:.03em;color:#57606a}.panel h2:first-child{margin-top:0}.seg{display:flex;gap:6px;margin-bottom:12px}.seg button{flex:1;padding:8px;border:1px solid #d0d7de;background:#f6f8fa;border-radius:6px;cursor:pointer}.seg button.on{background:#0969da;color:#fff;border-color:#0969da}.field{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;font-size:13px}.field>span{color:#57606a}.field input,.field select{padding:7px 8px;border:1px solid #d0d7de;border-radius:6px;font-size:13px}.field select[multiple]{min-height:72px}.row{display:flex;gap:10px}.field.small{flex:1}.endpoint-fields{border:1px solid #d0d7de;border-radius:8px;padding:10px 12px;margin-bottom:12px}.endpoint-fields legend{font-size:12px;font-weight:600;padding:0 6px;color:#0969da}button.primary{padding:9px;border:0;border-radius:6px;background:#1f883d;color:#fff;cursor:pointer;font-weight:600}button.primary:disabled{opacity:.5;cursor:not-allowed}button.analyze{width:100%;margin-top:8px}.hint{font-size:12px;color:#57606a}.error{color:#cf222e;font-size:13px;margin-top:8px}.muted{color:#8c959f}.empty{color:#8c959f;text-align:center;padding:60px 20px}.verdict{font-size:18px;font-weight:700;padding:12px 16px;border-radius:8px;margin-bottom:18px}.verdict.REACHABLE{background:#dafbe1;color:#1a7f37}.verdict.UNREACHABLE{background:#ffebe9;color:#cf222e}.verdict.INDETERMINATE{background:#fff8c5;color:#9a6700}.diagram{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-bottom:18px}.hop-wrap{display:flex;align-items:center;gap:4px}.arrow{font-size:20px;color:#8c959f}.node{border:2px solid #d0d7de;border-radius:8px;padding:8px 10px;min-width:84px;text-align:center;background:#fff}.node.endpoint{background:#24292f;color:#fff;border-color:#24292f}.node .node-title{font-size:12px;font-weight:600}.node .node-ip{font-size:11px;opacity:.85;margin-top:2px}button.node.hop{cursor:pointer}button.node.hop.active{box-shadow:0 0 0 3px #0969da4d}.node .badge{font-size:11px;font-weight:700;margin-top:3px}.hop-detail,.rule-table{border-top:1px solid #eaeef2;padding-top:14px;margin-top:14px}.hop-detail h3,.rule-table h3{font-size:14px;margin:0 0 8px}table{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:6px 8px;border-bottom:1px solid #eaeef2;vertical-align:top}.hop-detail th{width:90px;color:#57606a}.st.ALLOWED{color:#1a7f37;font-weight:600}.st.BLOCKED{color:#cf222e;font-weight:600}.st.UNKNOWN{color:#9a6700;font-weight:600}.st.SKIPPED{color:#57606a}.apphead{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.gear{padding:8px 12px;border:1px solid #d0d7de;background:#fff;border-radius:6px;cursor:pointer;font-size:13px;white-space:nowrap}.gear:hover{background:#f6f8fa}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:50;padding:20px}.modal{background:#fff;border-radius:12px;padding:22px;width:100%;max-width:520px;max-height:90vh;overflow-y:auto}.modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.modal-head h2{margin:0;font-size:18px}.modal .x{border:0;background:transparent;font-size:18px;cursor:pointer;color:#57606a}.cred-group{border:1px solid #d0d7de;border-radius:8px;padding:10px 14px;margin:12px 0}.cred-group legend{font-weight:600;color:#0969da;padding:0 6px}.field em.ok{color:#1a7f37;font-style:normal;font-size:11px;margin-left:6px}.ok-msg{color:#1a7f37;font-size:13px}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}.modal-actions button{padding:8px 16px;border:1px solid #d0d7de;background:#f6f8fa;border-radius:6px;cursor:pointer}.modal-actions button.primary{background:#1f883d;color:#fff;border:0;font-weight:600}.seg.small button{padding:4px 8px;font-size:12px}.hint.warn{color:#9a6700}.hint.cross{background:#ddf4ff;border:1px solid #b6e3ff;color:#0550ae;padding:8px 10px;border-radius:6px;margin:4px 0 12px}.platform-summary{display:block}.addressing{font-size:13px;color:#57606a;margin:-8px 0 16px}.addressing code{background:#f6f8fa;border:1px solid #d0d7de;border-radius:4px;padding:1px 5px;font-size:12px}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin-bottom:8px}.check input{width:auto}.node-dir{font-size:10px;font-weight:700;letter-spacing:.04em;opacity:.75;margin-bottom:2px}.node.hop.sg{border-style:dashed}.sg-panel{margin-top:22px}.sg-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 900px){.sg-grid{grid-template-columns:1fr}}.sg-endpoint{border:1px solid #d0d7de;border-radius:8px;padding:12px;overflow-x:auto}.sg-endpoint h4{margin:0 0 10px;font-size:14px;display:flex;align-items:center;gap:8px}.sg-endpoint h4 code{background:#f6f8fa;border:1px solid #d0d7de;border-radius:4px;padding:1px 5px;font-size:12px}.sg-endpoint .plat{font-size:11px;background:#ddf4ff;color:#0550ae;border-radius:10px;padding:1px 7px}.sg-section{margin-bottom:12px;padding:8px;border-radius:6px;background:#f6f8fa}.sg-section.judged{background:#ddf4ff}.sg-section h5{margin:0 0 6px;font-size:12px;display:flex;align-items:center;gap:6px}.sg-section .count{background:#d0d7de;border-radius:10px;padding:0 6px;font-size:11px}.sg-section .judged-tag{font-size:10px;background:#0969da;color:#fff;border-radius:3px;padding:1px 5px}table.sg-rules{width:100%;border-collapse:collapse;font-size:12px}table.sg-rules th,table.sg-rules td{text-align:left;padding:3px 6px;border-bottom:1px solid #eaeef2}table.sg-rules tr.deciding{background:#fff8c5;font-weight:600}table.sg-rules tr.disabled{opacity:.45;text-decoration:line-through}table.sg-rules td.allow{color:#1a7f37}table.sg-rules td.deny{color:#cf222e;font-weight:700}table.sg-rules td.nets{font-family:ui-monospace,monospace;font-size:11px}.trace{margin:18px 0;border:1px solid #d0d7de;border-radius:8px;overflow:hidden}.trace-section+.trace-section{border-top:2px solid #d0d7de}.trace-section-head{background:#f6f8fa;padding:6px 12px;font-size:12px;font-weight:700;display:flex;gap:8px;align-items:center;border-bottom:1px solid #eaeef2}.trace-endpoint{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:13px;background:#fbfcfd}.trace-ep-title{font-weight:600}.trace-endpoint code{background:#fff;border:1px solid #d0d7de;border-radius:4px;padding:1px 6px;font-size:12px}.trace-row{display:flex;align-items:flex-start;gap:10px;width:100%;text-align:left;padding:8px 12px;background:#fff;border:0;border-top:1px solid #eaeef2;cursor:pointer;font:inherit}.trace-row.static{cursor:default}.trace-row:not(.static):hover{background:#f6f8fa}.trace-row.active{background:#ddf4ff}.trace-icon{width:18px;text-align:center;font-weight:700;flex:none}.trace-row.ALLOWED .trace-icon{color:#1a7f37}.trace-row.BLOCKED .trace-icon{color:#cf222e}.trace-row.UNKNOWN .trace-icon{color:#9a6700}.trace-row.SKIPPED .trace-icon{color:#8c959f}.trace-body{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.trace-title{font-size:13px;font-weight:600;display:flex;gap:6px;align-items:center}.trace-tag{font-size:10px;background:#eaeef2;border-radius:3px;padding:1px 5px;font-weight:600}.trace-reason{font-size:12px;color:#57606a}.trace-addr{font-size:11px;color:#8c959f;font-family:ui-monospace,monospace}.trace-status{font-size:11px;font-weight:700;flex:none;align-self:center}.trace-row.ALLOWED .trace-status{color:#1a7f37}.trace-row.BLOCKED .trace-status{color:#cf222e}.trace-row.UNKNOWN .trace-status{color:#9a6700}.trace-row.SKIPPED .trace-status{color:#8c959f}.explorer{margin-bottom:16px}.explorer-toggle{width:100%;text-align:left;padding:8px 12px;font:inherit;font-size:13px;font-weight:600;background:#f6f8fa;border:1px solid #d0d7de;border-radius:8px;cursor:pointer}.explorer-toggle:hover{background:#eaeef2}.explorer-body{border:1px solid #d0d7de;border-top:0;border-radius:0 0 8px 8px;padding:10px}.explorer-bar{display:flex;gap:12px;margin-bottom:10px;flex-wrap:wrap}.explorer-bar .seg{margin-bottom:0}.explorer-list{max-height:460px;overflow-y:auto}.exp{border:1px solid #eaeef2;border-radius:6px;margin-bottom:6px}.exp.open{border-color:#d0d7de}.exp-head{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:13px;padding:6px 10px;background:#fff;border:0;cursor:pointer;border-radius:6px}.exp-head:hover{background:#f6f8fa}.exp-caret{color:#57606a;width:12px}.exp-title{font-weight:600}.exp-sub{color:#8c959f;font-size:11px;font-family:ui-monospace,monospace;flex:1}.exp-count{background:#eaeef2;border-radius:10px;padding:0 7px;font-size:11px;font-weight:700}.exp-body{padding:4px 10px 10px;overflow-x:auto}.raw-subhead{font-size:12px;font-weight:700;margin:8px 0 4px;display:flex;gap:6px;align-items:center}table.raw{width:100%;border-collapse:collapse;font-size:12px}table.raw th,table.raw td{text-align:left;padding:3px 6px;border-bottom:1px solid #eaeef2;vertical-align:top}table.raw th{color:#57606a;font-weight:600;white-space:nowrap}table.raw tr.disabled{opacity:.45;text-decoration:line-through}table.raw td.allow{color:#1a7f37;font-weight:600}table.raw td.deny{color:#cf222e;font-weight:700}table.raw td.nets{font-family:ui-monospace,monospace;font-size:11px;max-width:260px;word-break:break-all}table.raw td.desc{color:#8c959f;max-width:220px}.hint.owner{color:#24292f;font-weight:600;margin-bottom:2px}.progress-list{margin-top:10px;display:flex;flex-direction:column;gap:6px}.progress-item{font-size:11px}.progress-item.done .progress-fill{background:#1a7f37}.progress-label{display:flex;align-items:center;gap:6px;margin-bottom:2px}.progress-label .plat{background:#ddf4ff;color:#0550ae;border-radius:8px;padding:0 5px;font-weight:700}.progress-count{margin-left:auto;color:#57606a;font-variant-numeric:tabular-nums}.progress-bar{height:4px;background:#eaeef2;border-radius:2px;overflow:hidden}.progress-fill{height:100%;background:#0969da;transition:width .2s ease}.login-screen{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f6f8fa}.login-card{background:#fff;border:1px solid #d0d7de;border-radius:10px;padding:28px;width:320px;display:flex;flex-direction:column;gap:12px;box-shadow:0 4px 16px #0000000f}.login-card h1{font-size:18px;margin:0 0 8px;text-align:center}.tenant-bar{display:flex;align-items:center;gap:10px;padding:6px 16px;background:#24292f;color:#fff;font-size:12px}.tenant-user{font-weight:700}.tenant-single{background:#ffffff26;border-radius:10px;padding:2px 8px}.tenant-bar select{background:#ffffff26;color:#fff;border:1px solid rgba(255,255,255,.3);border-radius:6px;padding:2px 6px}.tenant-logout{margin-left:auto;background:transparent;color:#fff;border:1px solid rgba(255,255,255,.3);border-radius:6px;padding:2px 10px;cursor:pointer;font-size:12px}.tenant-logout:hover{background:#ffffff1a}.tenant-admin{background:#ffffff26;color:#fff;border:1px solid rgba(255,255,255,.3);border-radius:6px;padding:2px 10px;cursor:pointer;font-size:12px}.tenant-admin:hover{background:#ffffff40}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:100}.modal{background:#fff;border-radius:10px;padding:20px;width:480px;max-width:92vw;max-height:86vh;overflow-y:auto;box-shadow:0 8px 30px #0003}.modal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.modal-head h2{margin:0;font-size:16px}.modal-close{background:none;border:0;font-size:16px;cursor:pointer;color:#57606a}.admin-tab{display:flex;flex-direction:column;gap:12px;margin-top:12px}table.admin-table{width:100%;border-collapse:collapse;font-size:13px}table.admin-table th,table.admin-table td{text-align:left;padding:5px 6px;border-bottom:1px solid #eaeef2}.you-tag{margin-left:6px;font-size:10px;background:#ddf4ff;color:#0550ae;border-radius:8px;padding:0 6px}.admin-form{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.admin-form.column{flex-direction:column;align-items:stretch}.admin-form input,.admin-form select{padding:5px 8px;border:1px solid #d0d7de;border-radius:6px;font:inherit}.admin-form select[multiple]{min-width:140px;height:60px}button.danger{background:#ffebe9;color:#cf222e;border:1px solid #ffb8b0;border-radius:6px;padding:3px 10px;cursor:pointer;font-size:12px}button.danger:hover{background:#ffd7d5}
