.auth-shell{min-height:100%;display:grid;place-items:center;padding:32px 16px;background:radial-gradient(1100px 700px at 15% 5%,rgba(220,20,60,.08),transparent 60%),radial-gradient(900px 600px at 85% 95%,rgba(220,20,60,.06),transparent 65%),var(--bg)}.auth-card{width:100%;max-width:440px;background:var(--surface);border:1px solid var(--border);border-radius:16px;box-shadow:0 24px 60px #1118271a;overflow:hidden}.auth-card__header{text-align:center;padding:28px 24px 8px}.auth-card__logo{width:64px;height:64px;object-fit:contain}.auth-card__title{font-size:22px;margin:10px 0 4px}.auth-card__sub{color:var(--text-muted);font-size:13px;margin:0}.auth-card__body{padding:20px 24px 24px}.auth-field{margin-bottom:14px}.auth-label{display:block;font-size:13px;font-weight:600;margin-bottom:6px}.auth-input{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:8px;font:inherit}.auth-input:focus{outline:2px solid var(--ants-red-soft);border-color:var(--ants-red)}.auth-btn{width:100%;margin-top:6px;padding:11px;border:none;border-radius:8px;background:var(--ants-red);color:#fff;font:inherit;font-weight:600;cursor:pointer}.auth-btn:hover{background:var(--ants-red-600)}.auth-btn:disabled{opacity:.6;cursor:not-allowed}.auth-error{background:#fdecec;border:1px solid #f5c2c2;color:#8f2020;border-radius:8px;padding:10px 12px;font-size:13px;margin-bottom:12px}.auth-hint{display:flex;align-items:center;justify-content:center;gap:5px;color:var(--text-muted);font-size:12px;margin:14px 0 0}.auth-foot{border-top:1px solid var(--border);padding:12px;text-align:center;font-size:12px;color:var(--text-muted)}@font-face{font-family:Niramit;font-style:normal;font-weight:300;font-display:swap;src:url(/fonts/niramit-300-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Niramit;font-style:normal;font-weight:300;font-display:swap;src:url(/fonts/niramit-300-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Niramit;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/niramit-400-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Niramit;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/niramit-400-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Niramit;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/niramit-600-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Niramit;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/niramit-600-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Niramit;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/niramit-700-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Niramit;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/niramit-700-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--ants-red: #dc143c;--ants-red-600: #c01235;--ants-red-700: #a50f2e;--ants-red-soft: #fff1f3;--bg: #f6f7fb;--surface: #ffffff;--border: #e5e7eb;--text: #111827;--text-muted: #6b7280;--good: #0ca30c;--warning: #fab219;--serious: #ec835a;--critical: #d03b3b;--viz-bar: #c01235;--viz-track: #f0f1f4}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:Niramit,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-variant-ligatures:none;font-feature-settings:"liga" 0,"clig" 0}h1,h2,h3{margin:0;font-weight:600}.app-shell{display:grid;grid-template-rows:56px 1fr;grid-template-columns:240px 1fr;grid-template-areas:"sidebar topbar" "sidebar main";height:100%}.sidebar{grid-area:sidebar;background:var(--surface);border-right:1px solid var(--border);padding:16px 12px;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:10px;padding:4px 8px 16px}.brand__logo{width:42px;height:42px;object-fit:contain}.brand__title{font-weight:700;font-size:18px;line-height:1}.brand__sub{color:var(--text-muted);font-size:13px}.nav{display:flex;flex-direction:column;gap:2px}.nav__section{margin:16px 8px 6px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}.nav__link{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;padding:9px 12px;border-radius:8px;color:var(--text);text-decoration:none;font-size:14px;font-family:inherit;text-align:left;background:none;border:0;cursor:pointer}.nav__link:hover{background:var(--bg)}.nav__link.active{background:var(--ants-red-soft);color:var(--ants-red-700);font-weight:600}.nav__level{flex:none;padding:1px 7px;font-size:10px;font-weight:600;letter-spacing:.02em}.sidebar__foot{margin-top:auto;padding:12px 8px 0;font-size:11px;color:var(--text-muted)}.topbar{grid-area:topbar;background:var(--ants-red);color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 20px}.topbar__title{font-weight:600}.topbar__user{display:flex;align-items:center;gap:14px}.topbar__id{display:flex;flex-direction:column;line-height:1.2;text-align:right}.topbar__name{font-size:14px;font-weight:600}.topbar__role{font-size:11px;opacity:.85}.main{grid-area:main;padding:24px;overflow:auto}.page-stack,.form-stack{display:flex;flex-direction:column;gap:20px;max-width:1280px}.card{background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden}.card__head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;border-bottom:1px solid var(--border)}.card__title{font-size:16px}.card__body{padding:18px}.card--pickers{overflow:visible}.section-title{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin:18px 0 8px}.card__body>.section-title:first-child{margin-top:0}.btn{border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:8px;padding:8px 14px;font:inherit;font-weight:600;font-size:13px;cursor:pointer}.btn:hover{background:var(--bg)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn--primary{background:var(--ants-red);border-color:var(--ants-red);color:#fff}.btn--primary:hover{background:var(--ants-red-600)}.btn--danger{background:#fff;border-color:var(--critical);color:var(--critical)}.btn--danger:hover{background:#fdf2f2}.btn--ghost{background:transparent}.topbar .btn--ghost{border-color:#ffffff8c;color:#fff}.topbar .btn--ghost:hover{background:#ffffff26}.btn--small{padding:5px 10px;font-size:12px;margin-right:6px}.row-actions{display:flex;gap:10px;margin-top:18px}.row-actions--end{justify-content:flex-end}.tabs{display:flex;gap:4px}.tabs--standalone{align-self:flex-start}.tab{border:1px solid var(--border);background:var(--surface);border-radius:999px;padding:5px 12px;font:inherit;font-size:12px;cursor:pointer;color:var(--text-muted)}.tab--on{background:var(--ants-red-soft);border-color:#fecdd3;color:var(--ants-red-700);font-weight:600}.field{display:flex;flex-direction:column;gap:6px;margin-bottom:16px}.field>span{font-size:13px;font-weight:600}.field small,.check small{display:block;font-weight:400;color:var(--text-muted);font-size:12px}input,select,textarea{font:inherit;font-size:14px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);width:100%}input:focus,select:focus,textarea:focus{outline:2px solid var(--ants-red-soft);border-color:var(--ants-red)}input:disabled,select:disabled,textarea:disabled{background:var(--bg);color:var(--text-muted);cursor:not-allowed}textarea{resize:vertical}.check{display:flex;gap:10px;align-items:flex-start;margin-bottom:16px;font-size:14px}.check input{width:auto;margin-top:3px}.check--off{cursor:not-allowed}.check--off>span{color:var(--text-muted)}.check--off small{color:var(--text-muted)}.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 20px}.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 20px}.grid-3--top{align-items:start;gap:24px}.inline-add{display:flex;gap:8px;margin-bottom:8px;align-items:center}.inline-add input{flex:1}.inline-add .btn{white-space:nowrap}.grow{flex:1}.iface__fields{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;min-height:36px;margin-top:8px}.iface__fields .field{margin:0;max-width:190px}.iface__fields .check{margin:0 0 6px;white-space:nowrap}.btn--asLink{background:none;border:0;padding:0;font:inherit;color:var(--ants-red);text-decoration:underline;cursor:pointer}.grow--right{margin-right:auto}.chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.chip{border:1px solid var(--border);background:var(--surface);border-radius:999px;padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}.chip:hover{border-color:var(--ants-red)}.chip--on{background:var(--ants-red-soft);border-color:#fecdd3;color:var(--ants-red-700);font-weight:600}.chip--static{cursor:default;font-size:12px;color:var(--text-muted)}.hint-box{display:flex;align-items:center;justify-content:space-between;gap:16px;background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:10px 14px;margin-bottom:16px;font-size:13px}.table{width:100%;border-collapse:collapse;font-size:14px}.table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:8px 10px;border-bottom:1px solid var(--border);font-weight:600}.table td{padding:10px;border-bottom:1px solid var(--border);vertical-align:middle}.table tr:last-child td{border-bottom:none}.table--compact td,.table--compact th{padding:6px 8px;font-size:13px}.table--compact input,.table--compact select{padding:5px 8px;font-size:13px}.num{font-variant-numeric:tabular-nums}.nowrap{white-space:nowrap}.sub{font-size:12px;color:var(--text-muted)}.sub--warn{color:var(--critical);font-weight:600}.muted{color:var(--text-muted)}.lead{font-size:15px;margin:0 0 16px}.notes{white-space:pre-wrap;margin:0}.notes-pre{white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--bg);padding:14px;border-radius:8px;margin:0}.ssh-keys{overflow-wrap:anywhere;font-size:12px;margin-top:8px}.badge{display:inline-block;padding:3px 9px;border-radius:999px;font-size:12px;font-weight:600;border:1px solid transparent}.badge--good{background:#e7f7e7;color:#0a6b0a;border-color:#bde5bd}.badge--info{background:#eef2ff;color:#3730a3;border-color:#c7d2fe}.badge--warning{background:#fef7e6;color:#8a5a00;border-color:#fbe3a8}.badge--critical{background:#fdecec;color:#8f2020;border-color:#f5c2c2}.badge--muted{background:var(--bg);color:var(--text-muted);border-color:var(--border)}.tag--sim{background:#f3eefc;color:#5b3ba8;border-color:#ddd0f5;font-weight:600}.sim{text-decoration:none;border-bottom:1px dotted var(--text-muted);cursor:help}.state{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600}.state--good{color:#0a6b0a}.state--warning{color:#8a5a00}.state--serious{color:#a2492a}.state--critical{color:#8f2020}.alert{border-radius:10px;padding:12px 16px;font-size:14px;border:1px solid}.alert--critical{background:#fdecec;border-color:#f5c2c2;color:#8f2020}.alert--good{background:#e7f7e7;border-color:#bde5bd;color:#0a6b0a}.alert--warning{background:#fef7e6;border-color:#fbe3a8;color:#8a5a00}.empty{padding:28px;text-align:center;color:var(--text-muted);font-size:14px}.spinner{padding:28px;text-align:center;color:var(--text-muted)}.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:14px}.tile{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px 18px}.tile__label{font-size:12px;color:var(--text-muted);margin-bottom:6px}.tile__value{font-size:26px;font-weight:600;line-height:1.1}.tile--hero{border-color:#fecdd3;background:var(--ants-red-soft)}.tile--hero .tile__value{font-size:48px;color:var(--ants-red-700)}.barlist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.barlist__row{display:grid;grid-template-columns:minmax(90px,30%) 1fr auto;align-items:center;gap:10px;padding:3px 0;font-size:13px}.barlist__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.barlist__track{background:var(--viz-track);border-radius:3px;height:14px}.barlist__bar{display:block;height:100%;background:var(--viz-bar);border-radius:0 4px 4px 0}.barlist__value{font-variant-numeric:tabular-nums;color:var(--text-muted);min-width:56px;text-align:right}.meter{margin-bottom:14px}.meter__head{display:flex;justify-content:space-between;font-size:13px;margin-bottom:5px}.meter__detail{color:var(--text-muted);font-size:12px}.meter__track{background:var(--viz-track);border-radius:4px;height:10px;overflow:hidden}.meter__fill{height:100%;border-radius:0 4px 4px 0}.meter__fill--good{background:var(--viz-bar)}.meter__fill--warning{background:var(--serious)}.meter__fill--critical{background:var(--critical)}.node-meta{display:flex;gap:18px;align-items:center;font-size:13px;margin-bottom:16px}.bridges{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 24px}.field-ro{display:flex;flex-direction:column;gap:2px}.field-ro__label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted)}.field-ro__value{font-size:14px}.modal-backdrop{position:fixed;inset:0;background:#11182780;display:grid;place-items:center;padding:24px;z-index:100}.modal{background:var(--surface);border-radius:12px;width:100%;max-width:560px;max-height:88vh;display:flex;flex-direction:column}.modal--wide{max-width:900px}.modal__head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;background:var(--ants-red);color:#fff;border-radius:12px 12px 0 0}.modal__head h2{font-size:16px}.modal__close{display:inline-flex;align-items:center;justify-content:center;padding:4px;background:none;border:none;border-radius:6px;color:#fff;cursor:pointer}.modal__close:hover{background:#ffffff2e}.modal__body{padding:18px;overflow:auto}.confirm p{margin:0 0 10px;line-height:1.5}.confirm p:last-child{margin-bottom:0}.modal-actions{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:20px;padding-top:16px;border-top:1px solid var(--border)}@media(max-width:900px){.app-shell{grid-template-columns:1fr;grid-template-areas:"topbar" "main"}.sidebar{display:none}.grid-2,.grid-3,.detail-grid{grid-template-columns:1fr}}.form-legend{margin:0;font-size:13px}.req{color:var(--ants-red);font-weight:700}.field-ok{color:#0a6b0a;font-weight:600}.field-ko{color:#8f2020;font-weight:600}.field-advice-warn{color:#a2492a;display:inline-flex;align-items:flex-start;gap:5px}.checklist{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:13px}.checklist__item{display:inline-flex;align-items:center;gap:5px}.checklist__item--ok{color:#0a6b0a}.checklist__item--ko{color:#8f2020;font-weight:600}.checklist__falta{margin:8px 0 0;font-size:13px;text-align:right}.profile{position:relative}.topbar__right{display:flex;align-items:center;gap:12px}.viewswitch{display:inline-flex;align-items:center;gap:7px;padding:5px 12px 5px 9px;border-radius:999px;border:1px solid rgba(255,255,255,.45);background:transparent;color:#fff;font:inherit;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s,color .15s}.viewswitch:hover{background:#ffffff2e}.viewswitch__eye{flex:none;opacity:.75}.viewswitch:hover .viewswitch__eye{opacity:1}.viewswitch--on{background:#fff;color:var(--ants-red-700);border-color:#fff;box-shadow:0 0 0 3px #ffffff47}.viewswitch--on .viewswitch__eye{opacity:1}.userview-frame{position:fixed;inset:0;z-index:90;pointer-events:none;border:3px solid var(--ants-red);border-radius:4px}.profile__button{display:flex;align-items:center;gap:10px;background:#ffffff1f;border:1px solid rgba(255,255,255,.35);border-radius:999px;padding:4px 12px 4px 4px;color:#fff;font:inherit;font-size:13px;cursor:pointer}.profile__button:hover{background:#ffffff38}.profile__id{display:flex;flex-direction:column;align-items:flex-start;gap:2px;line-height:1.2}.profile__id .badge{padding:0 6px;font-size:10px}.profile__asrole{font-size:10px;opacity:.85}.profile__avatar{width:28px;height:28px;border-radius:50%;background:#fff;color:var(--ants-red-700);font-weight:700;font-size:12px;display:grid;place-items:center}.profile__caret{opacity:.8}.profile__menu{position:absolute;top:calc(100% + 8px);right:0;width:300px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:12px;box-shadow:0 20px 50px #11182738;z-index:200;overflow:hidden}.profile__head{padding:14px 16px;border-bottom:1px solid var(--border)}.profile__name{font-weight:600}.profile__mail{font-size:12px;color:var(--text-muted);word-break:break-all}.profile__rows{padding:10px 16px;display:flex;flex-direction:column;gap:8px}.profile__row{display:flex;justify-content:space-between;gap:12px;font-size:13px}.profile__row span:first-child{color:var(--text-muted)}.profile__groups{display:flex;flex-wrap:wrap;gap:4px;justify-content:flex-end}.profile__foot{padding:12px 16px;border-top:1px solid var(--border)}.profile__foot .btn{width:100%}.credit{font-size:11px;color:var(--text-muted)}.credit a{color:inherit;text-decoration:underline}.badge--role-superadmin{background:var(--ants-red-soft);color:var(--ants-red-700);border-color:#fecdd3}.badge--role-admin{background:#eef2ff;color:#3730a3;border-color:#c7d2fe}.badge--role-user{background:var(--bg);color:var(--text-muted);border-color:var(--border)}.tile--warning{border-color:#fbe3a8;background:#fffdf7}.tile--warning .tile__value{color:#8a5a00}.tile--superadmin{border-color:#fecdd3}.tile--superadmin .tile__value{color:var(--ants-red-700)}.tile--admin{border-color:#c7d2fe}.tile--admin .tile__value{color:#3730a3}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.profile__foot{display:flex;flex-direction:column;gap:8px}.notice{background:#eef2ff;border:1px solid #c7d2fe;color:#312e81;border-radius:8px;padding:10px 14px;font-size:13px;margin-bottom:16px}.notice ul{margin:6px 0 0;padding-left:18px}input[type=radio],input[type=checkbox]{width:auto;flex:none;margin:0}.placement__head{gap:12px}.placement__meta{color:var(--text-muted);font-size:12px}.placement__node{font-size:15px}.tagset{display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center}.th-sort{display:inline-flex;align-items:center;gap:6px;padding:0;border:0;background:none;font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;cursor:pointer}.th-sort__arrow{display:inline-flex;opacity:.35}.th-sort:hover .th-sort__arrow{opacity:.7}.th-sort--on{color:var(--ants-red-700)}.th-sort--on .th-sort__arrow{opacity:1}.status-note{font-size:12px;color:var(--text-muted);white-space:nowrap}.status-note--ok{color:#0a6b0a}.status-note--bad{color:#8f2020}.input--bad{border-color:#e5a0a0}.kv--tight{margin:0 0 18px}.row--click{cursor:pointer}.row--click:hover td{background:var(--bg)}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:28px;padding:0;border:1px solid transparent;border-radius:8px;background:none;color:var(--text-muted);cursor:pointer}.btn-icon:hover{background:var(--surface);border-color:var(--border);color:var(--text)}.btn-icon--danger:hover{color:var(--ants-red-700);border-color:#f5c2c2;background:#fdecec}.copy{padding:0;border:0;background:none;font:inherit;color:var(--ants-red-700);cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}.copy:hover{text-decoration-style:solid}.copy--done{color:#0a6b0a;text-decoration:none;font-weight:600}.row-inline{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}.card__tools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.search{display:inline-flex;align-items:center;gap:8px}.search input{width:220px;padding:6px 10px;font-size:13px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}.search__count{font-size:12px;color:var(--text-muted);white-space:nowrap}.tag{border-radius:999px;padding:2px 10px;font-size:12px;font-weight:600;border:1px solid var(--border);background:var(--bg);color:var(--text-muted)}.tag--infra{background:#eef2ff;color:#3730a3;border-color:#c7d2fe}.tag--gaia{background:#ecfdf5;color:#065f46;border-color:#a7f3d0}.tag--critical{background:#fdecec;color:#8f2020;border-color:#f5c2c2}.tag--5g{background:#fff7ed;color:#9a3412;border-color:#fed7aa}.tag--gpu{background:#faf5ff;color:#6b21a8;border-color:#e9d5ff}.adjust{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:14px;margin-top:12px}.kv{display:grid;grid-template-columns:200px 1fr;gap:8px 16px;font-size:14px}.kv dt{color:var(--text-muted);font-size:12px;text-transform:uppercase;letter-spacing:.05em}.kv dd{margin:0}.check--inline{margin:6px 0 0;font-size:13px;align-items:center}.switch{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:12px 0;border-bottom:1px solid var(--border)}.switch:last-child{border-bottom:none}.switch .sub{max-width:62ch;margin-top:2px}.switch .btn{white-space:nowrap}.tag__x{border:none;background:none;cursor:pointer;font:inherit;padding:0 0 0 6px;color:inherit}.icon{flex:none;vertical-align:-.14em}.back{display:inline-flex;align-items:center;gap:6px}:root{--online: #16a34a;--sim: #5b3ba8;--shadow-sm: 0 1px 2px rgba(17, 24, 39, .05);--shadow-md: 0 8px 24px rgba(17, 24, 39, .08)}a{color:var(--ants-red-700)}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;background:var(--bg);padding:1px 5px;border-radius:4px}.card{box-shadow:var(--shadow-sm)}.card__title{display:flex;align-items:center;gap:8px}.card__icon{display:inline-flex;color:var(--ants-red)}.card__actions{display:flex;gap:8px;align-items:center}.nav__label{display:inline-flex;align-items:center;gap:10px}.nav__link .icon{opacity:.75}.nav__link.active .icon{opacity:1}.kv__row{display:contents}.kv{grid-template-columns:140px 1fr}.kv dd{overflow-wrap:anywhere}.btn{display:inline-flex;align-items:center;gap:6px;text-decoration:none}.btn--big{padding:11px 20px;font-size:14px}.btn--small{margin-right:0}.row-actions--top{margin:0 0 12px;flex-wrap:wrap}.row-tools{text-align:right}.sub .icon,.muted .icon{vertical-align:-.18em}.sub--go{color:#0a6b0a;font-weight:600}.lead{color:var(--text)}.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}.page-head h1{font-size:24px;margin-bottom:4px}.page-head p{margin:0;max-width:70ch}.badge--serious{background:#fdf3ee;color:#a2492a;border-color:#f6d9c9}.badge--sim{background:#f3eefc;color:var(--sim);border-color:#ddd0f5}.alert{display:flex;gap:10px;align-items:flex-start;line-height:1.45}.alert__icon{flex:none;display:inline-flex;margin-top:1px}.alert--muted{background:var(--bg);border-color:var(--border);color:var(--text-muted)}.alert--info{background:#eef2ff;border-color:#c7d2fe;color:#312e81}.spinner{display:flex;align-items:center;justify-content:center;gap:10px}.spinner__ring{width:16px;height:16px;border-radius:50%;border:2px solid var(--ants-red-soft);border-top-color:var(--ants-red);animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.peer{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--text-muted)}.peer__dot{width:8px;height:8px;border-radius:50%;background:#cbd5e1;flex:none}.peer--on{color:#0a6b0a;font-weight:600}.peer--on .peer__dot{background:var(--online);box-shadow:0 0 0 3px #16a34a2e}.device-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px}.device{display:flex;flex-direction:column;gap:6px;text-align:left;background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:16px 18px;font:inherit;color:inherit;cursor:pointer;box-shadow:var(--shadow-sm);transition:border-color .15s,box-shadow .15s,transform .15s;border-top:3px solid var(--border)}.device:hover{border-color:#fecdd3;box-shadow:var(--shadow-md);transform:translateY(-1px)}.device--active{border-top-color:var(--online)}.device--approved{border-top-color:#6366f1}.device--pending{border-top-color:var(--warning)}.device--expired{border-top-color:var(--serious)}.device__top{display:flex;align-items:center;justify-content:space-between}.device__icon{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;background:var(--ants-red-soft);color:var(--ants-red-700)}.device__name{font-size:17px;font-weight:600;margin-top:6px}.device__kind{font-size:13px;color:var(--text-muted)}.device__roles{display:flex;flex-wrap:wrap;gap:5px;margin-top:4px}.device__foot{display:flex;flex-direction:column;gap:4px;margin-top:auto;padding-top:10px;border-top:1px dashed var(--border)}.hero-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:48px 24px;background:var(--surface);border:1px dashed #fecdd3;border-radius:16px;color:var(--ants-red)}.hero-empty h2{color:var(--text);font-size:20px}.hero-empty p{max-width:52ch;margin:0 0 6px}.kind-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:18px}.kind{display:flex;flex-direction:column;align-items:center;gap:8px;padding:16px 8px;border:1px solid var(--border);border-radius:12px;background:var(--surface);font:inherit;font-size:13px;font-weight:600;color:var(--text-muted);cursor:pointer}.kind:hover{border-color:#fecdd3;color:var(--text)}.kind--on{border-color:var(--ants-red);background:var(--ants-red-soft);color:var(--ants-red-700);box-shadow:0 0 0 3px #dc143c14}.role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}.rolecard{position:relative;display:flex;flex-direction:column;gap:6px;text-align:left;padding:14px;border:1px solid var(--border);border-radius:12px;background:var(--surface);font:inherit;color:inherit;cursor:pointer}.rolecard:hover{border-color:#fecdd3}.rolecard--on{border-color:var(--ants-red);background:var(--ants-red-soft)}.rolecard--static{cursor:default}.rolecard--static:hover{border-color:var(--border)}.rolecard__head{display:flex;align-items:center;gap:8px;font-size:15px}.rolecard__count{margin-left:auto;font-size:12px;color:var(--text-muted);padding-right:64px}.rolecard__desc{font-size:13px;color:var(--text-muted)}.rolecard__vlans{display:flex;flex-wrap:wrap;gap:5px}.rolecard__actions{position:absolute;top:10px;right:10px;display:flex;gap:2px}.rolecard__check{width:18px;height:18px;border-radius:5px;border:1.5px solid #cbd5e1;display:inline-grid;place-items:center;flex:none;background:#fff}.rolecard__check--on{background:var(--ants-red);border-color:var(--ants-red);color:#fff}.reach{margin-top:16px;padding:14px 16px;border-radius:12px;background:#f8faff;border:1px solid #c7d2fe}.reach__title{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:#3730a3;margin-bottom:8px;font-weight:600}.reach__list{display:flex;flex-wrap:wrap;gap:8px 16px;margin-bottom:8px;font-size:13px}.reach__item b{color:#312e81}.submit-bar{position:sticky;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;background:#ffffffeb;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow-md)}.detail-head{display:flex;align-items:center;gap:16px}.detail-head__icon{width:56px;height:56px;border-radius:16px;display:grid;place-items:center;background:var(--ants-red);color:#fff;box-shadow:0 8px 20px #dc143c40}.detail-head__text h1{font-size:24px;margin-bottom:4px}.detail-head__actions{margin-left:auto;display:flex;gap:8px}.detail-grid--main{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:20px}.detail-col{display:flex;flex-direction:column;gap:20px}.stepper{display:flex;list-style:none;margin:0;padding:0;gap:0}.step{flex:1;display:flex;align-items:center;gap:10px;position:relative;padding-right:16px;font-size:13px;color:var(--text-muted)}.step:not(:last-child):after{content:"";flex:1;height:2px;background:var(--border);border-radius:2px}.step--done:not(:last-child):after{background:var(--ants-red)}.step__dot{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;flex:none;border:2px solid var(--border);background:var(--surface);font-weight:700;font-size:12px}.step--done .step__dot{background:var(--ants-red);border-color:var(--ants-red);color:#fff}.step--now .step__dot{border-color:var(--ants-red);color:var(--ants-red-700);box-shadow:0 0 0 4px var(--ants-red-soft)}.step__label{font-weight:600;color:var(--text);white-space:nowrap}.step__when{white-space:nowrap}.stepper--closed{opacity:.5}.card--cta{border-color:#fecdd3;background:linear-gradient(180deg,var(--ants-red-soft),var(--surface) 70%)}.card--decision{border-color:#fbe3a8}.steps-list{list-style:none;margin:0 0 16px;padding:0;display:flex;flex-direction:column;gap:6px;font-size:14px}.steps-list li{display:flex;align-items:center;gap:8px}.steps-list .icon{color:var(--ants-red)}.conn{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:18px;margin:4px 0 8px}.conn__state{display:flex;align-items:center;gap:12px;font-size:15px}.conn__dot{width:14px;height:14px;border-radius:50%;background:#cbd5e1}.conn--on .conn__dot{background:var(--online);box-shadow:0 0 0 5px #16a34a29;animation:pulse 2s ease-in-out infinite}@keyframes pulse{50%{box-shadow:0 0 0 9px #16a34a0f}}.conn__stats{display:flex;gap:28px}.conn__stats>div{display:flex;flex-direction:column;gap:2px}.conn__stats b{font-size:15px;font-variant-numeric:tabular-nums}.prefixes{list-style:none;margin:12px 0;padding:0;display:flex;flex-direction:column;gap:4px}.prefixes li{font-size:14px;padding:6px 10px;background:var(--bg);border-radius:8px}.tagset--roles{margin-bottom:4px}.key{font-size:12px;overflow-wrap:anywhere}.conf{margin:0;padding:14px 16px;border-radius:10px;background:#0f172a;color:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}.conf--cmd{background:#111827;margin:8px 0}.conf-line{display:flex;align-items:flex-start;flex-wrap:nowrap;width:100%}.conf-line .conf{flex:1;margin:0;white-space:pre-wrap;word-break:break-all}.conf--log{background:var(--bg);color:var(--text);border:1px solid var(--border);max-height:260px;overflow:auto}.howto{margin-top:16px}.howto__title{display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px}.tile--button{display:flex;flex-direction:column;justify-content:flex-start;text-align:left;font:inherit;color:inherit;cursor:pointer}.tile--live{border-color:#bde5bd;background:#f3fbf3}.tile--live .tile__value{color:#0a6b0a}.tile--button:hover{border-color:#fecdd3}.tile--sim{border-color:#ddd0f5;background:#f8f5fe}.tile--sim .tile__value{color:var(--sim)}.tile .tile__value--text{font-size:22px}.tab{display:inline-flex;align-items:center;gap:6px}.tab__count{font-size:11px;padding:0 6px;border-radius:999px;background:var(--bg);color:var(--text-muted)}.tab--on .tab__count{background:#fff;color:var(--ants-red-700)}.vlan-pick{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:16px}.vlan-pick__item{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:10px;background:var(--surface);font:inherit;font-size:13px;cursor:pointer;text-align:left}.vlan-pick__item--on{border-color:var(--ants-red);background:var(--ants-red-soft)}.audit__detail{max-width:420px;overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}@media(max-width:900px){.kind-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.detail-grid--main{grid-template-columns:1fr}.page-head{flex-direction:column}.stepper{flex-direction:column;gap:10px}.step:after{display:none}.vlan-pick{grid-template-columns:1fr}}.device__for{display:flex;align-items:center;gap:5px;font-size:12.5px;color:var(--ants-red-700);margin-top:-2px}.for-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:8px}.for-grid .kind{flex-direction:column;align-items:flex-start;gap:2px;padding:10px 12px;min-height:0}.nft-summary{margin:14px 0 4px;padding:12px 14px;border:1px solid var(--border);border-radius:10px;background:var(--bg)}.nft-summary__head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:8px}.nft-summary .table{background:var(--surface);margin-bottom:8px}.nft-summary__code{margin:8px 0;padding:10px 12px;border-radius:8px;background:#0f172a;color:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere;max-height:220px;overflow:auto}.nft-summary__code .nft-add{color:#86efac}.nft-summary__code .nft-del{color:#fca5a5}td.nft-add{color:#0a6b0a}td.nft-del{color:#8f2020}.card__body>p.muted:not(.lead){font-size:14px}.nav__label{white-space:nowrap}.nav__level{font-size:10px;padding:1px 7px;flex-shrink:0}.vstripe{display:flex;gap:2px;border-radius:999px;overflow:hidden;flex-shrink:0}.vstripe--md{height:6px;width:100%}.vstripe__seg{flex:1 1 0;min-width:4px}.vstripe--bar{height:5px;width:100%;border-radius:0;gap:2px}.vstripe__seg--empty{background:var(--border)}.vdot{width:9px;height:9px;border-radius:50%;display:inline-block;flex-shrink:0;margin-right:5px;vertical-align:-1px}.chip--vlan{display:inline-flex;align-items:center}.roletag,.chip--pick{display:inline-flex;flex-direction:column;align-items:stretch;gap:4px;padding:4px 10px 6px;border-radius:8px;min-width:64px;color:var(--text)}.roletag__name{text-align:center;line-height:1.2}.roletag--strong{font-weight:600;font-size:13px;padding:5px 12px 7px}.rolecard>.vstripe{margin:-2px 0 2px}.stripe-preview{display:flex;align-items:center;gap:12px;margin:4px 0 12px}.stripe-preview .vstripe{max-width:260px}.swatches{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.swatch{width:26px;height:26px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px var(--border);display:inline-flex;align-items:center;justify-content:center;color:#fff;cursor:pointer;padding:0}.swatch--on{box-shadow:0 0 0 2px var(--text)}.swatch-custom{width:34px;height:28px;padding:0 2px;border:1px solid var(--border);border-radius:8px;background:var(--surface);cursor:pointer}.prefix-vid{font-size:12px;margin-right:6px}.rolecard--static .rolecard__actions{top:22px}.nft-state{margin-bottom:8px;flex-wrap:wrap}.nft-rule{font-size:12px;overflow-wrap:anywhere}.nft-check{font-size:12px;background:var(--bg);padding:6px 8px;border-radius:6px;overflow-wrap:anywhere;flex:1}.prefixes--muted{opacity:.65}.nft-summary__code{tab-size:4}.for-grid{margin-bottom:14px}.for-grid .kind{text-align:left;justify-content:flex-start}.for-grid .kind b.row-inline{gap:6px}.custom-access{margin-top:4px}.custom-access .inline-add input{max-width:340px}.prefix-remove{margin-left:auto}.prefixes li{display:flex;align-items:center;gap:2px}.transfer-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 16px;margin-bottom:8px}@media(max-width:900px){.transfer-list{grid-template-columns:1fr}}.userpick{position:relative;flex:1}.userpick>input{width:100%}.userpick__list{position:absolute;z-index:20;top:calc(100% + 2px);left:0;right:0;margin:0;padding:4px;list-style:none;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 12px 32px #11182724;max-height:240px;overflow:auto}.userpick__list button{width:100%;text-align:left;border:none;background:none;font:inherit;font-size:13px;padding:7px 9px;border-radius:6px;cursor:pointer}.userpick__list button:hover{background:var(--ants-red-soft)}.pubkey{display:flex;flex-direction:column;gap:8px}.pubkey .howto{margin-top:0}.pubkey__sure{margin-top:8px}
