:root{--navy:#07182f;--navy2:#0d2747;--gold:#d8aa45;--cyan:#33d2ff;--paper:#f6f8fb;--ink:#122035;--muted:#66748a;--line:#dce4ef}
*{box-sizing:border-box}
body{margin:0;background:linear-gradient(135deg,#f8fbff,#eef4fa);color:var(--ink);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
.app-shell{min-height:100vh;display:grid;grid-template-columns:280px 1fr}
.sidebar{background:linear-gradient(180deg,var(--navy),#04101f);color:#fff;padding:16px 14px;position:sticky;top:0;height:100vh;box-shadow:14px 0 35px rgba(7,24,47,.16);display:flex;flex-direction:column;overflow:hidden}
.brand{display:flex;gap:10px;align-items:center;color:#fff;text-decoration:none;font-weight:800;line-height:1.1;margin-bottom:14px;flex:0 0 auto}
.brand small{font-weight:600;color:#9ddff2}.brand-mark{display:grid;place-items:center;width:44px;height:44px;border-radius:8px;background:linear-gradient(135deg,var(--gold),#fff1b8);color:#10223b}.brand-logo{width:44px;height:44px;object-fit:contain;border-radius:8px;background:#fff;padding:4px;border:1px solid rgba(255,255,255,.45)}
.sidebar nav{display:grid;gap:3px;overflow-y:auto;overflow-x:hidden;padding-right:4px;scrollbar-width:thin;scrollbar-color:rgba(51,210,255,.55) rgba(255,255,255,.08)}.sidebar nav::-webkit-scrollbar{width:7px}.sidebar nav::-webkit-scrollbar-track{background:rgba(255,255,255,.08);border-radius:999px}.sidebar nav::-webkit-scrollbar-thumb{background:rgba(51,210,255,.55);border-radius:999px}.sidebar nav a{display:flex;gap:10px;align-items:center;color:#bed0e4;text-decoration:none;padding:8px 10px;border-radius:8px;font-weight:650;font-size:.92rem;min-height:38px}
.sidebar nav a:hover,.sidebar nav a.active{background:rgba(51,210,255,.13);color:#fff}.sidebar i{color:var(--cyan)}
.main{padding:26px;min-width:0}.topbar{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:22px}
.eyebrow{text-transform:uppercase;letter-spacing:.12em;color:var(--gold);font-size:.72rem;font-weight:800}h1{font-size:1.6rem;margin:2px 0 0;font-weight:850;letter-spacing:0}
.user-pill{display:flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--line);border-radius:8px;padding:9px 12px;box-shadow:0 10px 25px rgba(13,39,71,.07)}.user-pill small{color:var(--muted)}.user-pill a{color:var(--navy)}
.grid{display:grid;gap:16px}.metrics{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.two{grid-template-columns:1.1fr .9fr}.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.cardx{background:rgba(255,255,255,.92);border:1px solid var(--line);border-radius:8px;padding:18px;box-shadow:0 18px 42px rgba(13,39,71,.08)}.cardx h2,.cardx h3{font-size:1rem;margin:0 0 14px;font-weight:850}.card-link{display:block;color:var(--ink);text-decoration:none;cursor:pointer;touch-action:manipulation;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease,background .16s ease}.card-link:hover{color:var(--ink);border-color:var(--cyan);box-shadow:0 22px 48px rgba(13,39,71,.13);transform:translateY(-2px)}.card-link:active{transform:translateY(0) scale(.99);box-shadow:0 10px 24px rgba(13,39,71,.1)}.card-link:focus-visible{outline:3px solid rgba(51,210,255,.35);outline-offset:3px}
.chart-card canvas{max-height:210px}
.metric{position:relative;overflow:hidden}.metric:after{content:"";position:absolute;right:-32px;top:-32px;width:96px;height:96px;border-radius:50%;background:rgba(51,210,255,.12)}
.metric>span{color:var(--muted);font-size:.84rem;font-weight:750}.metric strong{display:block;font-size:2rem;line-height:1.1;margin-top:8px}.metric strong .status-dot{font-size:1.35rem}.metric i{color:var(--gold);font-size:1.4rem}.metric small{display:block;color:var(--muted);font-weight:750;margin-top:8px;overflow-wrap:anywhere}.metric-status.online,.metric-status.up{border-color:#8ee6c4}.metric-status.offline,.metric-status.down{border-color:#ffc1ca}.metric-status.unknown{border-color:#d8e1ec}
.traffic-line{color:#0d6387!important}
.status-dot{display:inline-flex;align-items:center;gap:7px}.status-dot:before{content:"";width:9px;height:9px;border-radius:50%;background:#98a6b8}.status-dot.online:before,.status-dot.up:before{background:#15c77f;box-shadow:0 0 0 5px rgba(21,199,127,.12);animation:statusPulse 1.8s ease-out infinite}.status-dot.offline:before,.status-dot.down:before{background:#ff4d67;box-shadow:0 0 0 5px rgba(255,77,103,.12)}
.table{vertical-align:middle}.badge-soft{background:#e9f8ff;color:#097392;border:1px solid #bcefff}.btn-primary{background:var(--navy2);border-color:var(--navy2)}.btn-primary:hover{background:#11365f;border-color:#11365f}.btn-gold{background:var(--gold);border-color:var(--gold);color:#152238;font-weight:800}
.form-control,.form-select{border-radius:8px;border-color:var(--line)}.actions{display:flex;gap:8px;flex-wrap:wrap}.qr-box{display:grid;place-items:center;min-height:260px;border:1px dashed #bfd0e2;border-radius:8px;background:#fbfdff}.hotel-card{border-top:4px solid var(--gold);color:var(--ink)}.hotel-card p{color:var(--muted)}.hotel-card .form-label,.hotel-card .form-check{color:var(--ink)}
.login-page{min-height:100vh;background:#061426;color:#fff;overflow-x:hidden}.login-page:before{content:"";position:fixed;inset:-20px;background:linear-gradient(105deg,rgba(6,20,38,.88),rgba(9,31,57,.66) 45%,rgba(4,13,26,.9)),var(--login-bg);background-size:cover;background-position:center;transform:scale(1.02);animation:loginBgDrift 18s ease-in-out infinite alternate;z-index:-2}.login-page:after{content:"";position:fixed;inset:0;background:linear-gradient(90deg,rgba(51,210,255,.08) 1px,transparent 1px),linear-gradient(0deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:74px 74px;mask-image:linear-gradient(90deg,transparent,black 16%,black 84%,transparent);animation:loginGridMove 24s linear infinite;z-index:-1}.login-shell{min-height:100vh;display:grid;place-items:center;padding:32px}.login-stage{width:min(1120px,100%);display:grid;grid-template-columns:1.08fr minmax(360px,.72fr);gap:34px;align-items:center}.login-brand-panel{animation:loginRise .7s ease-out both}.login-brand-lockup{display:flex;align-items:center;gap:20px;margin-bottom:18px}.login-logo,.login-logo-fallback{width:132px;height:132px;border-radius:8px;background:rgba(255,255,255,.94);border:1px solid rgba(255,255,255,.5);box-shadow:0 24px 70px rgba(0,0,0,.34);object-fit:contain;padding:10px}.login-logo-fallback{display:grid;place-items:center;color:#10223b;font-size:2rem;font-weight:900;background:linear-gradient(135deg,var(--gold),#fff2bd)}.login-brand-lockup h1{font-size:clamp(2.4rem,5vw,4.8rem);line-height:1;margin:4px 0 0;color:#fff;text-shadow:0 14px 34px rgba(0,0,0,.28)}.login-copy{max-width:650px;color:#d7e7f8;font-size:1.08rem;line-height:1.65;margin:0 0 22px}.login-signal-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;max-width:690px}.login-signal-grid span{display:flex;align-items:center;gap:9px;min-height:46px;border:1px solid rgba(255,255,255,.2);background:rgba(255,255,255,.1);backdrop-filter:blur(12px);border-radius:8px;padding:10px 12px;color:#eef7ff;font-weight:800}.login-signal-grid i{color:var(--gold);font-size:1.16rem}.login-card-wrap{animation:loginRise .8s .08s ease-out both}.login-card{position:relative;overflow:hidden;background:rgba(255,255,255,.94);color:var(--ink);border:1px solid rgba(255,255,255,.66);border-radius:8px;padding:28px;box-shadow:0 30px 90px rgba(0,0,0,.34)}.login-card:before{content:"";position:absolute;inset:0 0 auto;height:4px;background:linear-gradient(90deg,var(--gold),var(--cyan),#15c77f);animation:loginPulse 4s ease-in-out infinite}.login-card-head{display:flex;align-items:center;gap:14px;margin-bottom:22px}.login-card-logo{width:84px;height:84px;object-fit:contain;border-radius:8px;background:#fff;padding:6px;border:1px solid var(--line);box-shadow:0 12px 30px rgba(13,39,71,.12)}.login-card h2{font-size:1.7rem;font-weight:900;margin:3px 0 0}.login-form{display:grid;gap:10px}.login-form .form-label{font-weight:850;margin:0}.login-input{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:8px;background:#f8fbff;padding:0 12px;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}.login-input:focus-within{border-color:var(--cyan);box-shadow:0 0 0 4px rgba(51,210,255,.14);background:#fff}.login-input i{color:#0d6387;font-size:1.15rem}.login-input .form-control{border:0;background:transparent;box-shadow:none;padding:13px 0}.login-submit{display:flex;align-items:center;justify-content:center;gap:10px;min-height:48px;margin-top:10px;font-weight:850;position:relative;overflow:hidden}.login-submit:after{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent,rgba(255,255,255,.24),transparent);transform:translateX(-120%);animation:loginButtonSweep 3.6s ease-in-out infinite}@keyframes loginBgDrift{from{transform:scale(1.02) translate3d(0,0,0)}to{transform:scale(1.08) translate3d(-14px,-8px,0)}}@keyframes loginGridMove{from{background-position:0 0,0 0}to{background-position:148px 74px,74px 148px}}@keyframes loginRise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}@keyframes loginPulse{0%,100%{opacity:.78}50%{opacity:1}}@keyframes loginButtonSweep{0%,48%{transform:translateX(-120%)}72%,100%{transform:translateX(120%)}}@media(max-width:980px){.login-shell{padding:22px}.login-stage{grid-template-columns:1fr;gap:22px}.login-logo,.login-logo-fallback{width:104px;height:104px}.login-signal-grid{grid-template-columns:1fr}.login-card{padding:22px}.login-card-logo{width:72px;height:72px}}@media(max-width:560px){.login-brand-lockup{align-items:flex-start;flex-direction:column}.login-brand-lockup h1{font-size:2.25rem}.login-copy{font-size:1rem}.login-card-head{align-items:flex-start}.login-card h2{font-size:1.45rem}}@media(prefers-reduced-motion:reduce){.login-page:before,.login-page:after,.login-card:before,.login-submit:after,.login-brand-panel,.login-card-wrap{animation:none}}
.ops-hero{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;background:linear-gradient(135deg,#102c4f,#0b1728 60%,#214a55);border-radius:8px;padding:24px;color:#fff;box-shadow:0 18px 42px rgba(13,39,71,.18)}
.ops-hero h2{font-size:1.75rem;font-weight:900;margin:4px 0 8px;letter-spacing:0}.ops-hero p{max-width:820px;margin:0;color:#c9d8e7}.ops-hero-actions{display:flex;gap:10px;flex-wrap:wrap}.ops-hero-actions .btn{white-space:nowrap}
.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.section-head h2{margin:0}.section-head a{font-size:.86rem;font-weight:800;text-decoration:none;color:#0d6387}
.status-chip{display:inline-flex;align-items:center;border:1px solid #bdebf5;background:#eafaff;color:#08647e;border-radius:999px;padding:4px 9px;font-size:.76rem;font-weight:850}.status-chip.live-pulse{gap:7px}.status-chip.live-pulse:before{content:"";width:7px;height:7px;border-radius:50%;background:#15c77f;box-shadow:0 0 0 4px rgba(21,199,127,.12);animation:statusPulse 1.8s ease-out infinite}
.signal-row{display:grid;grid-template-columns:1fr auto;gap:8px 14px;border-top:1px solid var(--line);padding-top:14px}.signal-row span{color:var(--muted);font-weight:750}.signal-row strong{font-weight:900}
.health-card{padding:14px}.health-card .section-head{margin-bottom:6px}.health-chart-wrap{max-width:230px;margin:0 auto}.signal-row.compact{grid-template-columns:1fr auto;gap:4px 10px;padding-top:10px;font-size:.84rem}.signal-row.compact strong{font-size:.86rem}
.bandwidth-card{display:grid;gap:12px}.bandwidth-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}.bandwidth-tile{border:1px solid var(--line);border-radius:8px;background:#fbfdff;padding:12px;min-width:0}.bandwidth-tile span,.bandwidth-tile small{display:block;color:var(--muted);font-weight:800}.bandwidth-tile strong{display:block;font-size:1.45rem;line-height:1.12;margin:5px 0;overflow-wrap:anywhere}
.info-list{display:grid;grid-template-columns:110px 1fr;gap:8px 12px;margin-bottom:16px}.info-list dt{color:var(--muted);font-size:.82rem}.info-list dd{margin:0;font-weight:800;overflow-wrap:anywhere}
.access-stack{display:grid;gap:10px}.access-stack a,.access-stack>div,.shortcut-grid a{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:12px;background:#fbfdff}.access-stack a:hover,.shortcut-grid a:hover{border-color:var(--cyan);box-shadow:0 10px 25px rgba(13,39,71,.08)}.access-stack i,.shortcut-grid i{color:var(--gold);font-size:1.25rem}.access-stack span{flex:1;font-weight:800}.access-stack strong{font-size:1.35rem}
.event-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;border-bottom:1px solid #edf2f7;padding:8px 0;margin:0}.event-line small{margin-left:auto;color:var(--muted)}.empty-state{color:var(--muted);margin:0}
.ap-ops-table td{vertical-align:top}.ap-ops-table td strong,.ap-ops-table td small{display:block}.ap-ops-table td small{color:var(--muted);font-weight:700;margin-top:2px}.ap-actions{min-width:260px}
.profile-pills{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}.profile-pills span{background:#f3f7fb;border:1px solid var(--line);border-radius:999px;padding:7px 10px;font-weight:750}.profile-pills strong{color:#0d6387}
.shortcut-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.shortcut-grid span{font-weight:850}
.code-box{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.82rem;min-height:260px;white-space:pre;overflow:auto;background:#07182f;color:#e8f6ff;border-color:#173a61}
.vendor-pill{display:inline-flex;border:1px solid var(--line);background:#fff;border-radius:999px;padding:4px 8px;font-size:.8rem;font-weight:850;color:#24435f}
.voucher-table td{min-width:110px}.voucher-mini-input{max-width:92px;display:inline-block}.voucher-device-cell{display:grid;gap:5px;min-width:112px}.voucher-device-cell span{font-size:.82rem;color:var(--muted);font-weight:800}.voucher-device-cell .form-check{margin:0}
.tablet-form .form-label{font-weight:850}.tablet-form .form-control-lg{font-size:1.05rem;min-height:48px}.visitor-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid var(--line);border-radius:8px;padding:11px;margin-bottom:10px;background:#fbfdff}.visitor-row.watch-match{border-color:#f0bd50;background:#fff8e8}.visitor-row.overstay{border-color:#ff9aad;background:#fff5f7}.visitor-row strong,.visitor-row span,.visitor-row small{display:block}.visitor-row span{color:var(--ink);font-weight:750}.visitor-row small{color:var(--muted)}.visitor-thumb{width:48px;height:48px;border-radius:8px;object-fit:cover;float:left;margin-right:10px;border:1px solid var(--line)}.visitor-mini-form{border:1px dashed var(--line);border-radius:8px;background:#fbfdff;padding:12px}.watchlist-row{display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px solid var(--line);padding:10px 0}.watchlist-row strong,.watchlist-row small{display:block}.signature-pad{display:block;width:100%;height:170px;border:1px dashed #b7c6d8;border-radius:8px;background:#fff;touch-action:none}.badge-print-body{background:#eef4fa;min-height:100vh;display:grid;place-items:center;padding:24px}.visitor-pass{width:min(620px,100%);background:#fff;border:1px solid var(--line);border-radius:8px;padding:24px;box-shadow:0 24px 70px rgba(13,39,71,.14)}.visitor-pass-head,.voucher-pass-head{display:flex;align-items:center;gap:14px;border-bottom:1px solid var(--line);padding-bottom:16px;margin-bottom:18px}.visitor-pass-head img,.visitor-pass-head span,.voucher-pass-head img,.voucher-pass-head span{width:58px;height:58px;border-radius:8px;display:grid;place-items:center;object-fit:contain;background:#fff7e2;border:1px solid #edd083;font-weight:900}.visitor-pass-head h1,.voucher-pass-head h1{font-size:1.55rem}.visitor-pass-grid{display:grid;grid-template-columns:1fr 230px;gap:20px;align-items:center}.visitor-pass dl,.voucher-pass dl{display:grid;grid-template-columns:90px 1fr;gap:7px 12px}.visitor-pass dt,.voucher-pass dt{color:var(--muted)}.visitor-pass dd,.voucher-pass dd{margin:0;font-weight:800}.visitor-pass-qr{display:grid;place-items:center}.visitor-pass-actions{justify-content:flex-end;margin-top:18px}.voucher-print-page{width:min(1080px,100%)}.voucher-print-actions{justify-content:flex-end;margin-bottom:14px}.voucher-print-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.voucher-pass{background:#fff;border:1px solid var(--line);border-radius:8px;padding:18px;break-inside:avoid;page-break-inside:avoid;box-shadow:0 14px 34px rgba(13,39,71,.1)}.voucher-pass-body{display:grid;grid-template-columns:210px 1fr;gap:18px;align-items:center}.voucher-qr{display:grid;place-items:center;min-height:198px;border:1px dashed #bfd0e2;border-radius:8px;background:#fbfdff}.voucher-pass h2{font-size:1.65rem;letter-spacing:.04em;overflow-wrap:anywhere}@media(max-width:760px){.voucher-print-grid,.voucher-pass-body,.visitor-pass-grid{grid-template-columns:1fr}}@media print{.visitor-pass-actions,.voucher-print-actions{display:none}.badge-print-body{background:#fff;padding:0;display:block}.visitor-pass{box-shadow:none;border:0;width:100%}.voucher-print-grid{grid-template-columns:repeat(2,1fr);gap:10mm}.voucher-pass{box-shadow:none;border:1px solid #cfd8e3;min-height:126mm}.voucher-pass h2{font-size:1.4rem}}
.topology-canvas{background:#fff;border:1px solid var(--line);border-radius:8px;padding:18px;box-shadow:0 18px 42px rgba(13,39,71,.08)}
.topology-lane{display:grid;grid-template-columns:auto 1fr auto 1fr auto 1fr auto;align-items:center;gap:10px;margin-bottom:18px}.topology-node{min-width:150px;border:1px solid var(--line);border-radius:8px;padding:14px;background:#f9fcff;text-align:center}.topology-node i{display:block;color:var(--gold);font-size:1.55rem;margin-bottom:5px}.topology-node strong,.mini-node strong{display:block;font-weight:900}.topology-node small,.mini-node span,.mini-node small{color:var(--muted)}.topology-link{height:3px;background:linear-gradient(90deg,#33d2ff,#d8aa45);border-radius:999px}
.topology-node.online,.mini-node.online{border-color:#8ee6c4;background:#f0fff8}.topology-node.offline,.topology-node.down,.mini-node.offline{border-color:#ffc1ca;background:#fff4f6}.topology-node.unknown,.mini-node.unknown{border-color:#d8e1ec;background:#fbfdff}
.topology-branches{display:grid;grid-template-columns:1fr 1fr;gap:16px}.topology-group{border-top:1px solid var(--line);padding-top:14px}.topology-group h2{font-size:.95rem;margin:0 0 10px}.topology-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.mini-node{border:1px solid var(--line);border-radius:8px;padding:11px;background:#fbfdff}
.readiness-meter{height:12px;background:#edf3f8;border-radius:999px;overflow:hidden;margin-bottom:12px}.readiness-meter span{display:block;height:100%;background:linear-gradient(90deg,#15c77f,#33d2ff);border-radius:999px}.check-line{display:flex;align-items:center;gap:8px;margin:8px 0}.check-line.ok i{color:#15a66d}.check-line.missing i{color:#cf8a11}@keyframes statusPulse{0%{box-shadow:0 0 0 0 rgba(21,199,127,.34)}70%{box-shadow:0 0 0 8px rgba(21,199,127,0)}100%{box-shadow:0 0 0 0 rgba(21,199,127,0)}}@media(prefers-reduced-motion:reduce){.status-dot.online:before,.status-dot.up:before,.status-chip.live-pulse:before{animation:none}}
@media(max-width:980px){.app-shell{grid-template-columns:1fr}.sidebar{position:relative;height:auto;max-height:none;overflow:visible}.sidebar nav{grid-template-columns:repeat(2,minmax(0,1fr));overflow:visible}.sidebar nav a{min-height:36px}.metrics,.two,.three{grid-template-columns:1fr}.topbar{align-items:flex-start;flex-direction:column}}
@media(max-width:760px){.ops-hero{align-items:flex-start;flex-direction:column}.shortcut-grid{grid-template-columns:1fr}.bandwidth-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.event-line small{margin-left:0;width:100%}.info-list{grid-template-columns:1fr}.topology-lane{grid-template-columns:1fr}.topology-link{height:18px;width:3px;justify-self:center}.topology-branches,.topology-grid{grid-template-columns:1fr}}
@media(max-width:760px){body{background:#f4f7fb}.main{padding:16px}.sidebar{padding:12px}.brand{margin-bottom:10px}.sidebar nav{display:flex;gap:8px;overflow-x:auto;overflow-y:hidden;padding:2px 2px 8px;scroll-snap-type:x proximity}.sidebar nav a{flex:0 0 auto;min-height:44px;scroll-snap-align:start;padding:10px 12px;white-space:nowrap}.topbar{margin-bottom:16px}.topbar h1{font-size:1.35rem}.user-pill{width:100%;justify-content:space-between;flex-wrap:wrap}.cardx{padding:14px}.metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.metric strong{font-size:1.55rem}.section-head{align-items:flex-start;flex-direction:column}.section-head .actions{width:100%}.actions{gap:7px}.actions .btn,.actions form,.ops-hero-actions .btn{flex:1 1 150px}.btn,.form-control,.form-select{min-height:44px}.btn-sm{min-height:38px}.table-responsive{border:1px solid var(--line);border-radius:8px;overflow:auto;-webkit-overflow-scrolling:touch}.table{min-width:720px}.ap-ops-table{min-width:0}.ap-ops-table thead{display:none}.ap-ops-table tbody,.ap-ops-table tr,.ap-ops-table td{display:block;width:100%}.ap-ops-table tr{border:1px solid var(--line);border-radius:8px;background:#fff;margin-bottom:12px;padding:10px}.ap-ops-table td{border:0;padding:7px 4px}.ap-ops-table td:before{display:block;color:var(--muted);font-size:.72rem;font-weight:850;text-transform:uppercase;margin-bottom:2px}.ap-ops-table td:nth-child(1):before{content:"AP"}.ap-ops-table td:nth-child(2):before{content:"Network"}.ap-ops-table td:nth-child(3):before{content:"Status"}.ap-ops-table td:nth-child(4):before{content:"Uptime"}.ap-ops-table td:nth-child(5):before{content:"Clients"}.ap-ops-table td:nth-child(6):before{content:"Last Poll"}.ap-ops-table td:nth-child(7):before{content:"Actions"}.ap-actions{min-width:0}.ap-actions .btn,.ap-actions form{flex:1 1 120px}.visitor-row,.watchlist-row{align-items:flex-start;flex-direction:column}.visitor-row .actions,.watchlist-row .actions{width:100%}.portal-preview-frame{min-height:620px}}
@media(max-width:520px){.main{padding:12px}.metrics,.bandwidth-grid{grid-template-columns:1fr}.ops-hero{padding:16px}.ops-hero h2{font-size:1.35rem}.cardx{padding:12px}.login-shell,.portal-hero{padding:14px}.portal-panel{padding:16px}.voucher-pass,.visitor-pass{padding:14px}.visitor-pass dl,.voucher-pass dl{grid-template-columns:1fr}.actions .btn,.actions form,.ops-hero-actions .btn{flex-basis:100%}.code-box{min-height:220px}.qr-box{min-height:210px}.topbar h1{font-size:1.2rem}.metric strong .status-dot{font-size:1.05rem}}
@media(hover:none){.card-link:hover{transform:none}.card-link:active{background:#f8fcff;border-color:var(--cyan)}}
@media(max-width:760px){.device-ops-table{min-width:0}.device-ops-table thead{display:none}.device-ops-table tbody,.device-ops-table tr,.device-ops-table td{display:block;width:100%}.device-ops-table tr{border:1px solid var(--line);border-radius:8px;background:#fff;margin-bottom:12px;padding:10px}.device-ops-table td{border:0;padding:7px 4px;overflow-wrap:anywhere}.device-ops-table td:before{display:block;color:var(--muted);font-size:.72rem;font-weight:850;text-transform:uppercase;margin-bottom:2px}.device-ops-table td:nth-child(1):before{content:"Device"}.device-ops-table td:nth-child(2):before{content:"Network"}.device-ops-table td:nth-child(3):before{content:"Vendor"}.device-ops-table td:nth-child(4):before{content:"Type"}.device-ops-table td:nth-child(5):before{content:"Status"}.device-ops-table td:nth-child(6):before{content:"Last Poll"}.device-ops-table td:nth-child(7):before{content:"Notes"}.device-ops-table td:nth-child(8):before{content:"Actions"}.device-ops-table .actions .btn,.device-ops-table .actions form{flex:1 1 130px}}
@media(max-width:760px){.room-ops-table{min-width:0}.room-ops-table thead{display:none}.room-ops-table tbody,.room-ops-table tr,.room-ops-table td{display:block;width:100%}.room-ops-table tr{border:1px solid var(--line);border-radius:8px;background:#fff;margin-bottom:12px;padding:10px}.room-ops-table td{border:0;padding:7px 4px;overflow-wrap:anywhere}.room-ops-table td:before{display:block;color:var(--muted);font-size:.72rem;font-weight:850;text-transform:uppercase;margin-bottom:2px}.room-ops-table td:nth-child(1):before{content:"Room / Guest"}.room-ops-table td:nth-child(2):before{content:"Room Status"}.room-ops-table td:nth-child(3):before{content:"WiFi"}.room-ops-table td:nth-child(4):before{content:"Bandwidth Used"}.room-ops-table td:nth-child(5):before{content:"Access Expires"}.room-ops-table td:nth-child(6):before{content:"Actions"}.room-ops-table .actions .btn,.room-ops-table .actions form{flex:1 1 150px}}
@media(max-width:760px){.staff-ops-table{min-width:0}.staff-ops-table thead{display:none}.staff-ops-table tbody,.staff-ops-table tr,.staff-ops-table td{display:block;width:100%}.staff-ops-table tr{border:1px solid var(--line);border-radius:8px;background:#fff;margin-bottom:12px;padding:10px}.staff-ops-table td{border:0;padding:7px 4px;overflow-wrap:anywhere}.staff-ops-table td:before{display:block;color:var(--muted);font-size:.72rem;font-weight:850;text-transform:uppercase;margin-bottom:2px}.staff-ops-table td:nth-child(1):before{content:"Staff Member"}.staff-ops-table td:nth-child(2):before{content:"Connection"}.staff-ops-table td:nth-child(3):before{content:"Device / IP"}.staff-ops-table td:nth-child(4):before{content:"Current Usage"}.staff-ops-table td:nth-child(5):before{content:"Session"}.staff-ops-table td:nth-child(6):before{content:"Action"}}
@media(max-width:760px){.scan-results-table{min-width:0}.scan-results-table thead{display:none}.scan-results-table tbody,.scan-results-table tr,.scan-results-table td{display:block;width:100%}.scan-results-table tr{border:1px solid var(--line);border-radius:8px;background:#fff;margin-bottom:12px;padding:10px}.scan-results-table td{border:0;padding:7px 4px;overflow-wrap:anywhere}.scan-results-table td:before{display:block;color:var(--muted);font-size:.72rem;font-weight:850;text-transform:uppercase;margin-bottom:2px}.scan-results-table td:nth-child(1):before{content:"IP"}.scan-results-table td:nth-child(2):before{content:"MAC"}.scan-results-table td:nth-child(3):before{content:"Host"}.scan-results-table td:nth-child(4):before{content:"Vendor"}.scan-results-table td:nth-child(5):before{content:"Type"}.scan-results-table td:nth-child(6):before{content:"Status"}.scan-results-table td:nth-child(7):before{content:"Actions"}.scan-results-table .actions .btn{flex:1 1 132px}}

.portal-body{min-height:100vh;background:linear-gradient(rgba(7,24,47,.78),rgba(7,24,47,.9)),var(--portal-bg,url('/public/assets/images/hotel-wifi-bg.png'));background-size:cover;background-position:center}.portal-hero{min-height:100vh;display:grid;place-items:center;padding:28px}.portal-panel{width:min(1040px,100%);background:rgba(255,255,255,.94);border:1px solid rgba(255,255,255,.6);border-radius:8px;padding:28px;box-shadow:0 24px 70px rgba(0,0,0,.28)}.portal-panel h1{font-size:clamp(2rem,4vw,3.6rem);max-width:760px}.portal-panel p{color:var(--muted);font-size:1.08rem}.portal-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-top:24px}.portal-card{display:grid;gap:8px;text-decoration:none;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:8px;padding:18px;min-height:145px;box-shadow:0 12px 30px rgba(13,39,71,.08)}.portal-card:hover{border-color:var(--cyan);transform:translateY(-2px)}.portal-card i{font-size:1.7rem;color:var(--gold)}.portal-card span{color:var(--muted)}@media(max-width:800px){.portal-grid{grid-template-columns:1fr}.portal-panel{padding:20px}}

.portal-preview-frame{width:100%;min-height:760px;border:1px solid var(--line);border-radius:8px;background:#fff}
.portal-editor-preview{width:100%;max-height:360px;overflow:hidden;border:1px solid var(--line);border-radius:8px;background:#07182f}.portal-editor-preview img,.portal-editor-preview video{display:block;width:100%;max-height:360px;object-fit:cover}

.portal-body{position:relative;background:#061426;color:#fff;overflow-x:hidden;isolation:isolate}
.portal-body:before{content:"";position:fixed;inset:0;background:linear-gradient(110deg,rgba(5,13,25,.86),rgba(5,13,25,.48) 46%,rgba(5,13,25,.82));z-index:1;pointer-events:none}.portal-media{position:fixed;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;filter:saturate(1.08) contrast(1.02)}.portal-hero{position:relative;z-index:2;min-height:100vh;align-items:center;justify-items:start;padding:clamp(18px,4vw,48px)}.portal-panel{width:min(980px,100%);color:#fff;background:rgba(8,18,31,.58);border:1px solid rgba(255,255,255,.22);border-radius:8px;padding:clamp(20px,4vw,42px);box-shadow:0 30px 90px rgba(0,0,0,.34);backdrop-filter:blur(18px)}.portal-panel .brand{color:#fff!important}.portal-panel .brand small{color:rgba(255,255,255,.74)}.portal-panel .brand-logo,.portal-panel .brand-mark{box-shadow:0 14px 38px rgba(0,0,0,.24)}.portal-panel h1{font-size:clamp(2.1rem,6vw,5.2rem);line-height:.98;max-width:860px;color:#fff;margin:14px 0 14px;font-weight:900}.portal-panel p{max-width:720px;color:rgba(255,255,255,.82);font-size:clamp(1rem,2vw,1.2rem);line-height:1.65}.portal-panel .alert-info{background:rgba(255,255,255,.9);border-color:rgba(255,255,255,.72);color:#143454}.portal-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:28px}.portal-card{background:rgba(255,255,255,.94);border:1px solid rgba(255,255,255,.72);box-shadow:0 18px 42px rgba(0,0,0,.2);min-height:152px;transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease}.portal-card i{color:var(--portal-accent,var(--gold))}.portal-card:hover{border-color:var(--portal-accent,var(--cyan));box-shadow:0 24px 56px rgba(0,0,0,.26);transform:translateY(-2px)}.portal-card span{color:#66748a}.portal-style-editorial .portal-hero{justify-items:end}.portal-style-editorial .portal-panel{width:min(760px,100%);background:rgba(255,255,255,.93);color:var(--ink);backdrop-filter:blur(10px)}.portal-style-editorial .portal-panel .brand{color:var(--ink)!important}.portal-style-editorial .portal-panel .brand small,.portal-style-editorial .portal-panel p{color:#526178}.portal-style-editorial .portal-panel h1{color:var(--ink)}.portal-style-minimal:before{background:linear-gradient(180deg,rgba(5,13,25,.42),rgba(5,13,25,.84))}.portal-style-minimal .portal-hero{align-items:end;justify-items:center}.portal-style-minimal .portal-panel{width:min(1120px,100%);background:transparent;border:0;box-shadow:none;backdrop-filter:none;text-align:center}.portal-style-minimal .portal-panel .brand{justify-content:center}.portal-style-minimal .portal-panel p{margin-left:auto;margin-right:auto}.portal-style-minimal .portal-grid{text-align:left}@media(max-width:800px){.portal-hero{padding:16px;align-items:end}.portal-panel{padding:18px}.portal-panel h1{font-size:2.2rem}.portal-grid{grid-template-columns:1fr;margin-top:18px}.portal-card{min-height:118px}.portal-style-editorial .portal-hero,.portal-style-minimal .portal-hero{justify-items:center}.portal-style-minimal .portal-panel{text-align:left}.portal-style-minimal .portal-panel .brand{justify-content:flex-start}.portal-style-minimal .portal-panel p{margin-left:0;margin-right:0}}
.portal-grid{grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}
.portal-style-editorial .portal-panel{width:min(920px,100%)}

/* Guest captive portal home */
.portal-home:before{background:radial-gradient(circle at 78% 18%,rgba(51,210,255,.2),transparent 32%),linear-gradient(115deg,rgba(3,11,22,.9),rgba(4,17,31,.62) 48%,rgba(3,11,22,.88))}
.portal-home .portal-media{filter:saturate(.92) contrast(1.08);transform:scale(1.01)}
.portal-home .portal-hero{place-items:center;padding:clamp(16px,3vw,42px)}
.portal-home .portal-panel,.portal-home.portal-style-editorial .portal-panel,.portal-home.portal-style-minimal .portal-panel{width:min(1180px,100%);padding:0;overflow:hidden;color:#fff;text-align:left;background:linear-gradient(145deg,rgba(7,20,35,.88),rgba(8,25,42,.76));border:1px solid rgba(255,255,255,.18);border-radius:28px;box-shadow:0 35px 100px rgba(0,0,0,.44);backdrop-filter:blur(24px) saturate(1.15)}
.portal-home .portal-header{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:20px 28px;border-bottom:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.035)}
.portal-home .portal-header .brand{margin:0;color:#fff!important;gap:12px}
.portal-home .portal-header .brand-logo,.portal-home .portal-header .brand-mark{width:46px;height:46px;border-radius:14px;box-shadow:0 12px 28px rgba(0,0,0,.24)}
.portal-home .portal-header .brand>span:last-child{display:grid;gap:3px;font-size:.96rem;letter-spacing:.01em}
.portal-home .portal-header .brand small{display:block;color:rgba(255,255,255,.58);font-size:.67rem;letter-spacing:.12em;text-transform:uppercase}
.portal-network{display:flex;align-items:center;gap:10px;padding:8px 13px;border:1px solid rgba(255,255,255,.13);border-radius:999px;background:rgba(255,255,255,.07);font-size:.78rem;font-weight:800}
.portal-network>span:last-child{display:grid;line-height:1.15}.portal-network small{color:rgba(255,255,255,.52);font-size:.59rem;text-transform:uppercase;letter-spacing:.12em}
.portal-live-dot{width:8px;height:8px;border-radius:50%;background:#35e59a;box-shadow:0 0 0 5px rgba(53,229,154,.12),0 0 18px rgba(53,229,154,.52)}
.portal-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(420px,500px);gap:clamp(32px,5vw,72px);align-items:center;padding:clamp(34px,5vw,64px)}
.portal-intro{min-width:0}.portal-kicker{display:inline-flex;align-items:center;gap:8px;color:#d9efff;font-size:.75rem;font-weight:850;letter-spacing:.1em;text-transform:uppercase}.portal-kicker i{color:var(--portal-accent,var(--gold))}
.portal-home .portal-intro h1,.portal-home.portal-style-editorial .portal-intro h1{margin:18px 0 18px;max-width:650px;color:#fff;font-size:clamp(3rem,5.7vw,5.8rem);line-height:.95;letter-spacing:-.055em;font-weight:900;text-wrap:balance}
.portal-home .portal-intro>p,.portal-home.portal-style-editorial .portal-intro>p{max-width:580px;margin:0;color:rgba(230,241,251,.75);font-size:clamp(1rem,1.5vw,1.16rem);line-height:1.7}
.portal-notice{display:flex;align-items:flex-start;gap:10px;max-width:580px;margin-top:20px;padding:12px 14px;color:#e8f7ff;border:1px solid rgba(51,210,255,.2);border-radius:14px;background:rgba(51,210,255,.09);font-size:.88rem}.portal-notice i{color:#66ddff;margin-top:1px}
.portal-benefits{display:flex;flex-wrap:wrap;gap:9px;margin-top:26px}.portal-benefits span{display:inline-flex;align-items:center;gap:7px;padding:8px 11px;color:rgba(239,247,255,.78);border:1px solid rgba(255,255,255,.12);border-radius:999px;background:rgba(255,255,255,.055);font-size:.75rem;font-weight:750}.portal-benefits i{color:var(--portal-accent,var(--gold))}
.portal-access{color:#112137;padding:24px;border:1px solid rgba(255,255,255,.72);border-radius:24px;background:rgba(250,252,255,.96);box-shadow:0 25px 70px rgba(0,0,0,.28)}
.portal-access-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px}.portal-access-heading span{display:block;margin-bottom:3px;color:#7890a8;font-size:.67rem;font-weight:850;letter-spacing:.13em;text-transform:uppercase}.portal-access-heading h2{margin:0;color:#10223a;font-size:1.35rem;font-weight:900;letter-spacing:-.025em}.portal-access-heading>i{display:grid;place-items:center;width:42px;height:42px;color:#10223a;border-radius:13px;background:color-mix(in srgb,var(--portal-accent,var(--gold)) 72%,white);font-size:1.2rem}
.portal-home .portal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}
.portal-home .portal-card{position:relative;display:flex;align-items:flex-start;min-width:0;min-height:128px;padding:16px;color:#14243a;border:1px solid #e1e8f0;border-radius:17px;background:#fff;box-shadow:0 8px 24px rgba(17,40,68,.065);transition:transform .2s ease,border-color .2s ease,box-shadow .2s ease}
.portal-home .portal-card:hover{color:#14243a;border-color:color-mix(in srgb,var(--portal-accent,var(--gold)) 58%,#d8e1eb);box-shadow:0 15px 34px rgba(17,40,68,.13);transform:translateY(-3px)}
.portal-home .portal-card:focus-visible{outline:3px solid color-mix(in srgb,var(--portal-accent,var(--gold)) 45%,transparent);outline-offset:3px}
.portal-card-icon{display:grid;place-items:center;flex:0 0 auto;width:40px;height:40px;border-radius:12px;background:color-mix(in srgb,var(--portal-accent,var(--gold)) 16%,#f4f7fa)}
.portal-home .portal-card .portal-card-icon i{color:color-mix(in srgb,var(--portal-accent,var(--gold)) 75%,#152b43);font-size:1.15rem}
.portal-card-copy{align-self:flex-end;display:grid;gap:3px;margin-top:42px;min-width:0}.portal-home .portal-card-copy strong{color:#14243a;font-size:.95rem;font-weight:900}.portal-home .portal-card-copy small{color:#7a8ca0;font-size:.7rem;line-height:1.3}
.portal-home .portal-card .portal-card-arrow{position:absolute;top:16px;right:16px;color:#a5b2bf;font-size:.85rem;transition:color .2s ease,transform .2s ease}.portal-home .portal-card:hover .portal-card-arrow{color:#203b58;transform:translate(2px,-2px)}
.portal-terms-note{display:flex;align-items:center;justify-content:center;gap:7px;margin:16px 0 0!important;color:#8493a3!important;font-size:.72rem!important;line-height:1.4!important}.portal-terms-note i{color:#20a873}
.portal-footer{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:16px 28px;color:rgba(255,255,255,.48);border-top:1px solid rgba(255,255,255,.1);font-size:.7rem;font-weight:700}.portal-footer span{display:inline-flex;align-items:center;gap:7px}
.portal-maintenance{padding:clamp(50px,8vw,100px);text-align:center}.portal-maintenance .portal-icon{display:grid;place-items:center;width:62px;height:62px;margin:0 auto 18px;border-radius:18px;background:rgba(255,255,255,.1);font-size:1.5rem}.portal-home .portal-maintenance h1{margin:0 0 12px;color:#fff}.portal-home .portal-maintenance p{margin:0 auto;color:rgba(255,255,255,.7)}
@media(max-width:920px){.portal-home .portal-panel,.portal-home.portal-style-editorial .portal-panel,.portal-home.portal-style-minimal .portal-panel{width:min(720px,100%)}.portal-layout{grid-template-columns:1fr;gap:30px;padding:34px}.portal-home .portal-intro h1,.portal-home.portal-style-editorial .portal-intro h1{font-size:clamp(2.8rem,9vw,4.8rem)}}
@media(max-width:560px){.portal-home .portal-hero{padding:0;align-items:stretch}.portal-home .portal-panel,.portal-home.portal-style-editorial .portal-panel,.portal-home.portal-style-minimal .portal-panel{min-height:100vh;border:0;border-radius:0}.portal-home .portal-header{padding:15px 17px}.portal-home .portal-header .brand-logo,.portal-home .portal-header .brand-mark{width:40px;height:40px;border-radius:12px}.portal-network{padding:7px 10px}.portal-network small{display:none}.portal-layout{gap:24px;padding:30px 17px 24px}.portal-home .portal-intro h1,.portal-home.portal-style-editorial .portal-intro h1{margin:14px 0;font-size:clamp(2.65rem,14vw,4rem)}.portal-benefits{margin-top:20px}.portal-access{padding:17px;border-radius:21px}.portal-home .portal-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.portal-home .portal-card{min-height:122px;padding:13px;border-radius:15px}.portal-card-copy{margin-top:38px}.portal-home .portal-card .portal-card-arrow{top:13px;right:13px}.portal-card-icon{width:37px;height:37px}.portal-footer{padding:15px 17px;flex-direction:column;align-items:flex-start;gap:5px}}
@media(max-width:370px){.portal-home .portal-grid{grid-template-columns:1fr}.portal-home .portal-card{min-height:92px}.portal-card-copy{margin-top:22px}}
@media(prefers-reduced-motion:reduce){.portal-home .portal-card,.portal-home .portal-card-arrow{transition:none}}

/* Captive portal authentication forms */
.portal-form-body:before{background:radial-gradient(circle at 75% 15%,rgba(51,210,255,.16),transparent 30%),linear-gradient(115deg,rgba(3,11,22,.9),rgba(4,17,31,.68),rgba(3,11,22,.9))}
.portal-form-body .portal-media{filter:saturate(.9) contrast(1.08)}
.portal-form-body .portal-hero{place-items:center;padding:clamp(18px,4vw,48px)}
.portal-form-body .portal-hero>section{width:100%}
.portal-form-body .hotel-card{position:relative;overflow:hidden;padding:clamp(22px,4vw,34px);border:1px solid rgba(255,255,255,.78);border-top:0;border-radius:24px;background:rgba(252,253,255,.96);box-shadow:0 30px 85px rgba(0,0,0,.38);backdrop-filter:blur(20px)}
.portal-form-body .hotel-card:before{content:"";position:absolute;inset:0 0 auto;height:4px;background:linear-gradient(90deg,var(--portal-accent,var(--gold)),#39cfee,#35df9a)}
.portal-form-body .hotel-card h1{margin:5px 0 9px;color:#10223a;font-size:clamp(1.8rem,5vw,2.55rem);font-weight:900;letter-spacing:-.04em}
.portal-form-body .hotel-card>p{margin-bottom:22px;color:#6f8093;line-height:1.55}
.portal-form-body .hotel-card .form-label{margin-bottom:7px;color:#263b53;font-size:.78rem;font-weight:850;letter-spacing:.02em}
.portal-form-body .hotel-card .form-control{min-height:50px;padding:12px 14px;border:1px solid #dce5ee;border-radius:13px;background:#f8fafc;color:#15273d;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}
.portal-form-body .hotel-card .form-control:focus{border-color:var(--portal-accent,var(--gold));background:#fff;box-shadow:0 0 0 4px color-mix(in srgb,var(--portal-accent,var(--gold)) 18%,transparent)}
.portal-form-body .hotel-card .form-check{display:flex;align-items:flex-start;gap:8px;color:#65768a;font-size:.82rem;line-height:1.45}.portal-form-body .hotel-card .form-check-input{flex:0 0 auto;margin-top:3px}.portal-form-body .hotel-card .form-check-input:checked{border-color:var(--portal-accent,var(--gold));background-color:var(--portal-accent,var(--gold))}
.portal-form-body .hotel-card .btn-primary,.portal-form-body .hotel-card .btn-gold{min-height:50px;border:0;border-radius:13px;background:#102a48;color:#fff;font-weight:850;box-shadow:0 12px 28px rgba(16,42,72,.2);transition:transform .18s ease,box-shadow .18s ease}.portal-form-body .hotel-card .btn-primary:hover,.portal-form-body .hotel-card .btn-gold:hover{background:#15395f;color:#fff;box-shadow:0 16px 34px rgba(16,42,72,.27);transform:translateY(-1px)}
.portal-form-body .hotel-card .alert{border:0;border-radius:13px;font-size:.84rem}.portal-form-body .hotel-card .brand{margin-bottom:20px!important}.portal-form-body .hotel-card .brand-logo,.portal-form-body .hotel-card .brand-mark{border-radius:13px}
.portal-form-body .portal-hero>section>p{text-align:center!important}.portal-form-body .portal-hero>section>p a{display:inline-flex;align-items:center;min-height:40px;padding:8px 14px;color:#fff!important;border:1px solid rgba(255,255,255,.2);border-radius:999px;background:rgba(8,20,34,.42);text-decoration:none;font-size:.78rem;font-weight:800;backdrop-filter:blur(10px)}
@media(max-width:560px){.portal-form-body .portal-hero{align-items:center;padding:14px}.portal-form-body .hotel-card{border-radius:20px}.portal-form-body .hotel-card h1{font-size:2rem}}

/* Calm portal scene themes */
.portal-motion-drift .portal-media{animation:portalSceneDrift 30s ease-in-out infinite alternate}
.portal-motion-float .portal-media{animation:portalSceneFloat 20s ease-in-out infinite alternate}
.portal-home.portal-motion-drift:after,.portal-home.portal-motion-float:after,.portal-form-body.portal-motion-drift:after,.portal-form-body.portal-motion-float:after{content:"";position:fixed;inset:-15%;z-index:1;pointer-events:none;background:radial-gradient(circle at 25% 30%,rgba(255,255,255,.08),transparent 26%),radial-gradient(circle at 75% 65%,rgba(51,210,255,.07),transparent 28%);animation:portalAmbientLight 18s ease-in-out infinite alternate}
.portal-theme-sunset:before{background:radial-gradient(circle at 17% 52%,rgba(255,152,75,.16),transparent 27%),linear-gradient(112deg,rgba(18,8,14,.84),rgba(28,17,25,.48) 48%,rgba(8,13,24,.82))}
.portal-theme-waterfall:before{background:radial-gradient(circle at 78% 30%,rgba(82,219,160,.12),transparent 30%),linear-gradient(112deg,rgba(3,18,17,.9),rgba(5,31,26,.53) 48%,rgba(2,14,18,.83))}
.portal-theme-twilight:before{background:radial-gradient(circle at 77% 48%,rgba(255,147,125,.1),transparent 25%),linear-gradient(112deg,rgba(3,11,29,.9),rgba(7,24,52,.48) 48%,rgba(2,8,23,.86))}
@keyframes portalSceneDrift{0%{transform:scale(1.04) translate3d(-.7%,0,0)}50%{transform:scale(1.075) translate3d(.5%,-.5%,0)}100%{transform:scale(1.05) translate3d(.9%,.35%,0)}}
@keyframes portalSceneFloat{0%{transform:scale(1.055) translate3d(0,-.45%,0)}100%{transform:scale(1.08) translate3d(0,.5%,0)}}
@keyframes portalAmbientLight{0%{opacity:.45;transform:translate3d(-2%,-1%,0) rotate(-2deg)}100%{opacity:1;transform:translate3d(2%,1.5%,0) rotate(2deg)}}
@media(prefers-reduced-motion:reduce){.portal-motion-drift .portal-media,.portal-motion-float .portal-media,.portal-home:after,.portal-form-body:after{animation:none!important}}

/* Admin captive portal theme picker */
.portal-theme-picker{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:13px}
.portal-theme-option{display:grid;gap:6px;min-width:0;padding:10px;border:1px solid var(--line);border-radius:14px;background:#fbfdff;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}.portal-theme-option:hover{border-color:#9bdff0;box-shadow:0 12px 26px rgba(13,39,71,.1);transform:translateY(-2px)}.portal-theme-option.selected,.portal-theme-option:has(input:checked){border-color:#25acd0;box-shadow:0 0 0 3px rgba(51,210,255,.14)}.portal-theme-option>input{position:absolute;width:1px;height:1px;opacity:.01}.portal-theme-option>strong{font-size:.88rem}.portal-theme-option>small{min-height:34px;color:var(--muted);font-size:.72rem;line-height:1.35}
.portal-theme-thumb{position:relative;display:block;overflow:hidden;aspect-ratio:16/9;border-radius:10px;background:#07182f;pointer-events:none}.portal-theme-thumb img,.portal-theme-thumb video{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.portal-theme-thumb>i{position:absolute;top:8px;right:8px;display:none;color:#fff;filter:drop-shadow(0 2px 5px rgba(0,0,0,.45));font-size:1.1rem}.portal-theme-option.selected .portal-theme-thumb>i,.portal-theme-option:has(input:checked) .portal-theme-thumb>i{display:block}.portal-theme-select{display:inline-flex;align-items:center;gap:6px;margin-top:3px;color:#567087;font-size:.7rem}.portal-theme-select b{font-weight:850}.portal-theme-option.selected .portal-theme-select,.portal-theme-option:has(input:checked) .portal-theme-select{color:#087d9d}.portal-theme-option.selected .portal-theme-select i:before,.portal-theme-option:has(input:checked) .portal-theme-select i:before{content:"\\f26a"}
@media(max-width:980px){.portal-theme-picker{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:520px){.portal-theme-picker{grid-template-columns:1fr 1fr;gap:8px}.portal-theme-option{padding:7px}.portal-theme-option>small{display:none}}

/* Captive portal primitives are local so the sign-in UI works before internet access. */
.portal-body .w-100{width:100%}
.portal-body .mx-auto{margin-left:auto;margin-right:auto}
.portal-body .mb-2{margin-bottom:.5rem}.portal-body .mb-3{margin-bottom:1rem}.portal-body .mt-3{margin-top:1rem}
.portal-body .text-center{text-align:center}.portal-body .text-start{text-align:left}
.portal-body .text-dark{color:#15273d!important}.portal-body .text-white{color:#fff!important}.portal-body .text-muted{color:#6c7886!important}
.portal-body .text-uppercase{text-transform:uppercase}.portal-body .small{font-size:.875em}
.portal-body .btn{display:inline-flex;align-items:center;justify-content:center;padding:.7rem 1rem;border:1px solid transparent;border-radius:.5rem;font:inherit;line-height:1.2;text-align:center;text-decoration:none;cursor:pointer}
.portal-body .form-label{display:inline-block}
.portal-body .form-control{display:block;width:100%;font:inherit;line-height:1.5;appearance:none}
.portal-body .form-check-input{width:1em;height:1em;margin:0;vertical-align:top;appearance:auto}
.portal-body .alert{position:relative;padding:.85rem 1rem;margin-bottom:1rem}
.portal-body .alert-danger{color:#842029;background:#f8d7da}.portal-body .alert-info{color:#055160;background:#cff4fc}
.portal-body .bi{display:inline-block;width:1em;text-align:center;font-style:normal;line-height:1}
.portal-body .bi:before{content:"•"}
.portal-body .bi-wifi:before{content:"◔"}.portal-body .bi-tools:before{content:"⚒"}.portal-body .bi-stars:before{content:"✦"}
.portal-body .bi-ticket-perforated:before{content:"▣"}.portal-body .bi-door-open:before{content:"▯"}.portal-body .bi-chat-dots:before{content:"…"}.portal-body .bi-person-badge:before{content:"♙"}
.portal-body .bi-arrow-up-right:before{content:"↗"}.portal-body .bi-shield-check:before{content:"✓"}.portal-body .bi-lightning-charge:before{content:"ϟ"}.portal-body .bi-clock:before{content:"◷"}
.portal-body .bi-info-circle:before{content:"i"}.portal-body .bi-lock:before{content:"●"}.portal-body .bi-headset:before{content:"☎"}
