:root{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#eaf2ff;background:#0b1220;line-height:1.45;font-synthesis:none}*{box-sizing:border-box}body{margin:0}a{color:inherit;text-decoration:none}button,input,select{font:inherit}button{cursor:pointer}button:disabled{opacity:.5;cursor:wait}.app{min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 max(24px,calc((100vw - 1200px)/2));display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #263145;background:#101827}.brand{display:flex;align-items:center;gap:12px}.brand .fox{display:grid;place-items:center;background:#243246;border-radius:13px;width:45px;height:45px;font-size:26px}.brand strong{display:block;font-size:19px;line-height:1.1}.brand span:not(.fox){font-size:11px;color:#8b9bb4;letter-spacing:.09em;text-transform:uppercase}.top-actions{display:flex;gap:20px;align-items:center}.top-actions form{margin:0}.admin-pill{font-size:13px;color:#53deb1}.plain{color:#b9c6d9;background:none;border:0;padding:10px}.plain:hover{color:white}.container{flex:1;width:min(1200px,calc(100% - 48px));margin:35px auto}.heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:30px}.heading h1{font-size:30px;margin:7px 0 5px;letter-spacing:-.025em}.heading p{color:#8da0ba;margin:0}.eyebrow{color:#6be4b7;font-size:11px;letter-spacing:.18em;font-weight:800}.button,button{display:inline-flex;justify-content:center;align-items:center;border-radius:10px;padding:10px 15px;border:1px solid transparent;font-weight:650;transition:background .1s}.primary{background:#2ab88a;color:#07140f;border-color:#2ab88a}.primary:hover{background:#3bd4a2}.secondary{background:#1b293c;color:#dee8f9;border-color:#2b3e56}.secondary:hover{background:#283c55}.danger-outline{color:#ffb0b0;background:#2a1e2b;border-color:#543343}.danger-outline:hover{background:#442637}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-bottom:35px}.stat{border:1px solid #27374d;background:#131e30;border-radius:15px;padding:20px;display:flex;flex-direction:column;gap:8px}.stat-icon{color:#60d5af;font-size:19px}.stat span{font-size:13px;color:#91a2ba}.stat strong{font-size:28px;letter-spacing:-.03em}.section-heading{display:flex;align-items:center;justify-content:space-between;gap:15px;margin-bottom:16px}.section-heading h2{font-size:20px;margin:0}.nodes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.node{background:#141f32;border:1px solid #2c3a50;border-radius:15px;padding:18px;min-width:0}.node-heading{display:flex;align-items:center;gap:12px}.node-icon{display:grid;place-items:center;background:#203b48;border-radius:11px;width:45px;height:45px;color:#59dfb6;font-size:25px;flex-shrink:0}.node-title{min-width:0;flex:1}.node h3{font-size:16px;margin:0;overflow-wrap:anywhere}.sub{font-size:12px;color:#8e9db7;overflow-wrap:anywhere}.status{border-radius:30px;padding:5px 8px;white-space:nowrap;font-size:11px;font-weight:750}.status.waiting{background:#333b4c;color:#b9c5d8}.status.online{background:#153f35;color:#65e4b8}.status.offline{background:#4c2834;color:#ff9fb0}.node-summary{color:#bbcadf;font-size:13px;margin:18px 0 12px}.node-details{font-size:13px;color:#96b0ca;overflow-wrap:anywhere}.detail-pre{white-space:pre-wrap;background:#0c1625;padding:10px;border-radius:8px}.vm-table{width:100%;border-collapse:collapse;font-size:12px;margin:12px 0}.vm-table th,.vm-table td{text-align:left;border-bottom:1px solid #304056;padding:7px 4px}.vm-table td:last-child{text-align:right}.vm-table button{padding:4px 7px;margin:2px;font-size:11px}.vm-running{color:#69ddb0}.vm-stopped{color:#eeb68a}.mini-list{margin:6px 0 15px;padding-left:15px;max-height:180px;overflow:auto}.node-footer{display:flex;gap:8px;align-items:center;margin-top:20px;flex-wrap:wrap;border-top:1px solid #27374d;padding-top:15px}.node-footer button,.node-footer .button{font-size:12px;padding:7px 11px}.delete-form{margin-left:auto}.empty{background:#141f32;border:1px dashed #3c506b;padding:46px 20px;border-radius:16px;text-align:center}.empty-icon{font-size:42px}.empty h3{margin:12px 0 5px}.empty p{max-width:500px;margin:0 auto 20px;color:#a1b1c7}.tip{border:1px solid #33485a;background:#152431;border-radius:12px;color:#a9bbd2;padding:15px;margin-top:28px;font-size:13px}.tip strong{color:#78d7b7}.alert{margin-bottom:20px;border-radius:10px;padding:13px 15px;background:#20364a;color:#cbdcf0}.alert.error{background:#472a34;color:#ffd3d8}.alert.success{background:#1c4139;color:#a6f3cc}.login-card{width:min(430px,100%);margin:7vh auto 0;background:#141f32;padding:36px;border:1px solid #2a4057;border-radius:19px}.login-icon{font-size:49px}.login-card h1{font-size:30px;margin:8px 0 0}.login-card p{color:#96abc3;margin:0 0 24px}.login-card label,.field label{display:block;font-size:13px;font-weight:700;color:#b9c9dd;margin-bottom:8px}.login-card input,.field input,.field select{width:100%;background:#0b1524;color:#ebf4ff;border:1px solid #395069;padding:12px;border-radius:9px;outline:none}.login-card input:focus,.field input:focus,.field select:focus{border-color:#58d6ae}.login-card label:not(:first-child){margin-top:17px}.full{width:100%;margin-top:22px}.login-note{font-size:12px;text-align:center;color:#8197b2;margin-top:21px}.back{color:#69dcaf;font-size:13px}.heading.compact{margin-bottom:16px}.edit-card{max-width:900px;background:#141f32;border:1px solid #27374d;border-radius:15px;padding:28px}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:20px;row-gap:20px}.edit-card hr{height:1px;border:0;background:#324256;margin:28px 0}.checkboxes{margin-top:24px;display:flex;flex-wrap:wrap;gap:18px}.toggle{font-size:13px;color:#b6c8de}.toggle input{accent-color:#35c695}.help{margin:20px 0;color:#91a7c1;font-size:13px}.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:27px}footer{padding:18px 24px;border-top:1px solid #203047;text-align:center;color:#637893;font-size:11px}@media(max-width:850px){.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.nodes{grid-template-columns:1fr}}@media(max-width:530px){.container{width:calc(100% - 28px);margin:22px auto}.topbar{padding:0 14px}.heading{display:block}.heading h1{font-size:25px}.heading .primary{margin-top:18px;width:100%}.admin-pill{display:none}.stats{gap:9px}.stat{padding:15px}.stat strong{font-size:23px}.stat span{font-size:11px}.section-heading h2{font-size:17px}.node{padding:14px}.node-heading{gap:8px}.node-icon{width:35px;height:35px;font-size:20px}.node h3{font-size:14px}.status{font-size:10px}.edit-card{padding:16px}.form-grid{grid-template-columns:1fr}.login-card{padding:24px}}

[hidden]{display:none!important}

/* v1.1: gestão WireGuard */
.nav-links{display:flex;gap:6px;align-items:center}.nav-links a{font-size:13px;padding:9px 12px;border-radius:9px;color:#bbc9dc}.nav-links a:hover{background:#223148;color:#fff}.vpn-hero{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:24px}.vpn-host{font-size:22px!important}.vpn-add{max-width:none;margin-bottom:30px}.vpn-add h2{margin:0 0 6px}.muted{color:#92a6bf;font-size:13px}.vpn-form{display:flex;align-items:flex-end;gap:14px;margin:20px 0}.vpn-form .field{width:min(440px,100%)}.vpn-form button{height:45px}.vpn-list{margin-bottom:32px}.vpn-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.vpn-peer{background:#141f32;border:1px solid #2b3c54;border-radius:14px;padding:18px;min-width:0}.vpn-peer.new-peer{border-color:#42cfa6}.vpn-peer-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.vpn-peer h3{margin:0 0 3px;font-size:17px;overflow-wrap:anywhere}.vpn-peer .status{flex-shrink:0}.vpn-traffic{display:flex;gap:16px;border-top:1px solid #27384a;margin:16px 0 12px;padding-top:12px;font-size:12px;color:#8fa6bc;flex-wrap:wrap}.vpn-traffic b{color:#dce7f5}.vpn-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.vpn-actions .button,.vpn-actions button{font-size:12px;padding:7px 10px}.vpn-actions form{margin-left:auto}.vpn-qr{margin-top:14px;border:1px solid #32485c;border-radius:12px;background:#0b1422;padding:18px}.qr-inner{display:flex;align-items:center;flex-direction:column;gap:10px}.qr-inner img{max-width:240px;width:100%;background:#fff;border-radius:9px}.qr-inner p{font-size:12px;color:#9db0c7;margin:0;text-align:center}.tip a{color:#78eac0;text-decoration:underline}.vpn-add .help{margin:7px 0 0}@media(max-width:850px){.vpn-cards{grid-template-columns:1fr}}@media(max-width:530px){.nav-links a{font-size:11px;padding:6px}.top-actions{gap:3px}.vpn-hero{gap:8px}.vpn-hero .stat{padding:10px}.vpn-hero .stat strong{font-size:16px!important}.vpn-form{display:block}.vpn-form button{margin-top:12px;width:100%}.vpn-peer-top{display:block}.vpn-peer-top .status{display:inline-block;margin-top:9px}.vpn-actions form{margin-left:0}}
@media(max-width:530px){.topbar{height:auto;min-height:76px;flex-wrap:wrap;gap:0;padding-top:8px;padding-bottom:8px}.top-actions{flex:1;justify-content:flex-end}.nav-links{flex-wrap:wrap;justify-content:flex-end}}

/* v1.1.1: QR adaptado a PC/telemóvel, erros visíveis */
.vpn-qr .qr-inner img{display:block;width:min(280px,100%);max-width:100%;height:auto;aspect-ratio:1;background:white;padding:10px;object-fit:contain;border-radius:10px}.vpn-qr .qr-inner img[hidden]{display:none!important}.vpn-qr .qr-loading{color:#9db0c7;font-size:13px;padding:25px 10px;text-align:center}.vpn-qr .qr-error{max-width:390px;color:#ffc6cb;font-size:13px;overflow-wrap:anywhere;text-align:center}.vpn-qr .qr-error[hidden],.vpn-qr .qr-loading[hidden]{display:none!important}
