*{box-sizing:border-box}body{margin:0;background:#f5f7fb;color:#172033;font:15px Inter,Segoe UI,Arial,sans-serif;display:flex}aside{width:245px;min-height:100vh;background:#111b35;color:#eef3ff;padding:30px 20px;position:fixed}.menu-head{display:flex;align-items:center;justify-content:space-between}aside h1{font-size:20px;margin:0 0 40px}.menu-toggle{display:none}nav{display:grid;gap:8px}nav a{color:#b7c3df;text-decoration:none;padding:12px;border-radius:8px}nav a:hover,nav .add{background:#2864dc;color:#fff}.foot{position:absolute;bottom:20px;color:#74829d;font-size:12px}main{margin-left:245px;width:calc(100% - 245px);padding:48px;max-width:1500px}main.public-main{margin-left:0;width:100%;max-width:900px;margin-right:auto}.header{display:flex;align-items:center;justify-content:space-between;margin-bottom:28px}.header h2{margin:3px 0 6px;font-size:28px}.header p{margin:0;color:#66728b}.eyebrow{color:#2864dc!important;font-weight:700;font-size:12px;letter-spacing:1px}.button,button{border:0;border-radius:7px;background:#2864dc;color:#fff;padding:10px 16px;font-weight:600;text-decoration:none;cursor:pointer}.stats{display:grid;grid-template-columns:repeat(2,minmax(0,300px));gap:18px;margin-bottom:24px}.stats article,.card{background:#fff;border:1px solid #e6eaf1;border-radius:12px;box-shadow:0 3px 12px #1b315b0a}.stats article{padding:22px;display:grid;gap:7px}.stats span,.stats small{color:#71809a}.stats strong{font-size:36px}.card{padding:22px}.card h3{margin-top:0}table{width:100%;border-collapse:collapse}th{text-align:left;color:#71809a;font-size:12px;text-transform:uppercase;letter-spacing:.5px}th,td{padding:15px 10px;border-bottom:1px solid #edf0f5}tr:last-child td{border:0}.mono{font-family:Consolas,monospace;font-size:13px}.status{padding:5px 9px;border-radius:999px;background:#def7ea;color:#167042;font-size:12px;font-weight:700}.status.resetting{background:#fff2d8;color:#9b6400}.status.offline{background:#f1f2f5;color:#687287}.actions{display:flex;gap:8px}.actions form{margin:0}.secondary{background:#edf2ff;color:#2358c5}.danger{background:#fee8e9;color:#bb2937}.empty{padding:36px;color:#71809a;text-align:center}.alert{padding:13px 16px;border-radius:8px;margin-bottom:20px}.alert.success{background:#dff7e9;color:#167042}.alert.warning{background:#fff2d8;color:#825700}.enroll{display:grid;grid-template-columns:360px minmax(360px,650px);gap:24px;align-items:start}.enroll-batch{display:grid;grid-template-columns:repeat(5,minmax(180px,1fr));gap:16px;margin-bottom:24px}.qr{text-align:center}.qr h3{font-size:16px}.qr img{width:210px;max-width:100%;image-rendering:auto}.qr p{color:#71809a}.instructions li{margin:14px 0;line-height:1.45}.notice{background:#fff7e4;color:#825700;padding:13px;border-radius:7px;line-height:1.5}@media(max-width:1100px){.enroll-batch{grid-template-columns:repeat(3,minmax(180px,1fr))}}@media(max-width:800px){aside{position:static;width:100%;min-height:auto;padding:18px}.menu-head h1{margin:0}.menu-toggle{display:block;padding:8px 12px}#main-menu{display:none;margin-top:16px}#main-menu.open{display:grid}.foot{display:none}body{display:block}main,main.public-main{margin:0;width:100%;padding:20px}.header{align-items:flex-start;gap:15px;flex-direction:column}.header h2{font-size:24px}.stats,.enroll,.enroll-batch{grid-template-columns:1fr}.stats article{padding:18px}.card{padding:16px}.qr img{width:260px}.actions{flex-wrap:wrap}.actions button{padding:8px 10px}table{font-size:13px;display:block;overflow:auto;white-space:nowrap}}
.app-state{display:inline-flex;width:24px;height:24px;align-items:center;justify-content:center;border-radius:50%;font-size:15px;font-weight:800;line-height:1}.app-state.installed{background:#dff7e9;color:#167042}.app-state.missing{background:#fee8e9;color:#bb2937}
.device-filter{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:-10px 0 22px}.device-filter input,.device-filter select{height:39px;border:1px solid #d7deea;border-radius:7px;background:#fff;color:#172033;padding:0 10px;font:inherit}.device-filter input{min-width:270px;flex:1}.device-filter .button{padding:10px 16px}@media(max-width:800px){.device-filter{margin-top:0}.device-filter input,.device-filter select{width:100%;min-width:0}.device-filter button,.device-filter .button{flex:1;text-align:center}}
.device-count{margin:-8px 0 12px;color:#66728b}.device-count b{color:#172033}
.device-filter-toggle{display:none}@media(max-width:800px){.device-filter-toggle{display:block;width:100%;margin:0 0 12px}.device-filter{display:none}.device-filter.is-open{display:flex}}
.column-hidden{display:none}.column-picker-wrap{position:relative;display:inline-block;margin:0 0 12px}.column-picker{position:absolute;z-index:10;top:calc(100% + 6px);left:0;min-width:220px;padding:12px;background:#fff;border:1px solid #d7deea;border-radius:9px;box-shadow:0 8px 24px rgba(27,49,91,.18)}.column-picker label{display:block;padding:5px 2px;white-space:nowrap;cursor:pointer}@media(max-width:800px){.column-picker-wrap{display:block}.column-picker-wrap>.button{width:100%}.column-picker{right:0;left:auto;min-width:250px}}
.menu-toggle-input{display:none}
.mobile-credit{display:none}@media(max-width:800px){.menu-head{gap:10px}.mobile-credit{display:inline;color:#eef3ff;font-weight:600;margin-left:auto}.menu-toggle{display:block;padding:8px 12px;background:#2864dc;color:#fff;border-radius:7px;font-weight:600;cursor:pointer}.menu-toggle-input{display:none}.menu-toggle-input:checked~#main-menu{display:grid}#main-menu.open{display:none}#main-menu{position:fixed;z-index:1000;top:70px;left:12px;right:12px;max-height:calc(100vh - 86px);overflow:auto;padding:14px;background:#111b35;border:1px solid #31456f;border-radius:12px;box-shadow:0 14px 36px rgba(0,0,0,.35)}}

/* Wi-Fi setup: a compact digital control-panel treatment. */
.wifi-page{max-width:1120px}.wifi-hero{position:relative;overflow:hidden;isolation:isolate;min-height:164px;padding:28px 32px;border:1px solid #294e8c;border-radius:18px;background:linear-gradient(125deg,#111b35 0%,#172d5a 54%,#123d72 100%);color:#eef5ff}.wifi-hero:before{content:"";position:absolute;inset:0;z-index:-1;opacity:.25;background-image:linear-gradient(#75a9ff24 1px,transparent 1px),linear-gradient(90deg,#75a9ff24 1px,transparent 1px);background-size:22px 22px}.wifi-hero .eyebrow{color:#7fc1ff!important}.wifi-hero h2{margin:4px 0 8px;color:#fff}.wifi-hero p:not(.eyebrow){max-width:630px;color:#c5d8f8}.wifi-hero-signal{position:absolute;right:34px;bottom:25px;display:flex;align-items:end;gap:8px;opacity:.8}.wifi-hero-signal span{display:block;width:12px;border-radius:12px;background:#61d8be;box-shadow:0 0 18px #61d8beaa}.wifi-hero-signal span:nth-child(1){height:22px}.wifi-hero-signal span:nth-child(2){height:45px}.wifi-hero-signal span:nth-child(3){height:70px}.wifi-card{position:relative;overflow:hidden;margin-top:20px;border-color:#d7e3f8;box-shadow:0 12px 30px #16376a12}.wifi-card:before{content:"";position:absolute;top:0;left:0;width:5px;height:100%;background:linear-gradient(#2864dc,#57b5f9)}.wifi-card-title{display:flex;align-items:center;gap:12px;margin-bottom:17px}.wifi-card-title h3{margin:0;color:#172b54}.wifi-card-title p{margin:4px 0 0;color:#71809a;font-size:13px}.wifi-card-icon{display:grid;place-items:center;width:38px;height:38px;border:1px solid #b7d3ff;border-radius:11px;background:#edf5ff;color:#2161ce;font-size:23px;font-weight:700;box-shadow:inset 0 1px #fff}.wifi-bulk-card textarea{display:block;min-height:164px;margin:8px 0 10px;padding:14px 15px;border:1px solid #b9cbe9;border-radius:11px;background:#f9fbff;color:#172b54;font:14px/1.55 Consolas,monospace;outline:0;resize:vertical;transition:border-color .18s,box-shadow .18s}.wifi-bulk-card textarea:focus{border-color:#3375e7;box-shadow:0 0 0 4px #2864dc1c}.wifi-bulk-card .notice{margin:0 0 14px;border:1px solid #ffe1a4;background:#fffaf0;color:#75520d}.wifi-primary-action{display:inline-flex;align-items:center;gap:11px;border-radius:10px;padding:11px 18px;box-shadow:0 8px 16px #2864dc33}.wifi-primary-action span{font-size:18px;line-height:0}.wifi-form{display:grid;grid-template-columns:1.35fr 1.25fr .9fr auto;gap:13px;align-items:end}.wifi-form label{display:grid;gap:6px;color:#52617b;font-size:12px;font-weight:700}.wifi-form input:not([type=checkbox]),.wifi-form select{width:100%;height:42px;padding:0 11px;border:1px solid #c8d5e9;border-radius:9px;background:#fff;color:#172b54;font:14px Inter,Segoe UI,Arial,sans-serif;outline:0}.wifi-form input:focus,.wifi-form select:focus{border-color:#3375e7;box-shadow:0 0 0 3px #2864dc18}.wifi-form .check-label{display:flex;align-items:center;gap:7px;height:42px;white-space:nowrap}.wifi-form.compact{grid-template-columns:repeat(2,minmax(150px,1fr));margin-top:10px;padding:12px;border-radius:10px;background:#f4f8ff}.wifi-form.compact button{grid-column:1/-1;justify-self:start}.wifi-list-card table thead{background:#f3f7ff}.wifi-list-card th{color:#3d5e96}.wifi-list-card td{vertical-align:top}.wifi-list-card details summary{width:max-content;padding:7px 10px;border:1px solid #cbd9f0;border-radius:8px;color:#2864dc;cursor:pointer;font-weight:700;list-style:none}.wifi-list-card details summary:after{content:"⌄";margin-left:7px}.wifi-list-card details[open] summary{background:#edf4ff}.wifi-list-card details summary::-webkit-details-marker{display:none}@media(max-width:800px){.wifi-hero{min-height:145px;padding:23px 20px}.wifi-hero-signal{right:20px;bottom:16px;transform:scale(.75);transform-origin:right bottom}.wifi-hero p:not(.eyebrow){padding-right:50px}.wifi-form,.wifi-form.compact{grid-template-columns:1fr}.wifi-form button,.wifi-form.compact button{width:100%;justify-content:center}.wifi-card{padding:18px}.wifi-bulk-card textarea{min-height:145px}.wifi-list-card{padding:12px}.wifi-list-card .wifi-card-title{padding:6px}.wifi-list-card table{font-size:12px}}
/* Shared digital visual language for the portal. */
body{min-height:100vh;background:radial-gradient(circle at 80% -10%,#c9e3ff 0,transparent 29%),linear-gradient(135deg,#f7faff,#edf3fc 48%,#f8fbff);color:#172b54}body:before{content:"";position:fixed;z-index:-1;inset:0;pointer-events:none;opacity:.3;background-image:linear-gradient(#3974bd10 1px,transparent 1px),linear-gradient(90deg,#3974bd10 1px,transparent 1px);background-size:32px 32px}aside{z-index:20;width:267px;padding:26px 15px;background:linear-gradient(165deg,#0b1530,#111f43 56%,#0b2d53);border-right:1px solid #294a79;box-shadow:12px 0 35px #0a1d4322}aside:before{content:"";position:absolute;top:-110px;left:-70px;width:230px;height:230px;border-radius:50%;background:#3178e344;filter:blur(18px);pointer-events:none}.menu-head{position:relative;padding:4px 8px 24px;margin-bottom:10px;border-bottom:1px solid #35547f}.menu-head h1{position:relative;margin:0;color:#fff;font-size:21px;letter-spacing:.2px}.menu-head h1:before{content:"";display:inline-block;width:10px;height:10px;margin-right:9px;border-radius:3px;background:linear-gradient(135deg,#6fc4ff,#3d72ff);box-shadow:0 0 13px #60bfff}.mobile-credit,.nav-credit{font-size:12px}.mobile-credit{color:#9ebce5!important}nav{gap:5px;padding-top:3px}nav a,nav .nav-form button{position:relative;display:block;width:100%;padding:11px 13px;border:1px solid transparent;border-radius:9px;background:transparent;color:#afc2e2;text-align:left;font-size:14px;font-weight:600;transition:background .18s,border-color .18s,color .18s,transform .18s}nav a:before{content:"";display:inline-block;width:7px;height:7px;margin:0 10px 1px 2px;border:1px solid #7192c2;border-radius:50%;vertical-align:middle;transition:background .18s,border-color .18s}nav a:hover,nav .nav-form button:hover{transform:translateX(3px);border-color:#3d6090;background:#24549a40;color:#fff}nav a:hover:before{border-color:#68d9c0;background:#68d9c0;box-shadow:0 0 8px #68d9c0}.nav-form{margin:3px 0!important}.nav-form button{cursor:pointer}.nav-credit{display:block;margin:14px 8px 0;padding:11px;border:1px solid #35557f;border-radius:9px;background:#0a24465e;color:#a9c9f0}.foot{right:20px;bottom:18px;left:20px;color:#7196c3;font-size:11px;line-height:1.35}.menu-toggle{position:relative;z-index:2}main{position:relative;margin-left:267px;width:calc(100% - 267px);max-width:1600px;padding:40px 46px}.header{padding-bottom:18px;margin-bottom:23px;border-bottom:1px solid #d8e4f4}.header h2{color:#122855;letter-spacing:-.5px}.header p{color:#617493}.eyebrow{color:#2571d8!important;letter-spacing:1.4px}.card,.stats article{border:1px solid #d6e3f4;border-radius:15px;background:linear-gradient(145deg,#fff,#f9fbff);box-shadow:0 10px 28px #193d7310}.card{padding:24px}.card h3{color:#1d3768}.stats{gap:16px}.stats article{position:relative;overflow:hidden;padding:21px}.stats article:before{content:"";position:absolute;left:0;top:0;width:4px;height:100%;background:linear-gradient(#2b70dc,#68d2bc)}.stats strong{color:#12366e}.stats span,.stats small{color:#6c7f9d}.button,button{border:1px solid #1d64cf;border-radius:9px;background:linear-gradient(135deg,#2e72dc,#1d5dbf);box-shadow:0 7px 16px #2864dc2e;transition:transform .16s,box-shadow .16s,filter .16s}.button:hover,button:hover{transform:translateY(-1px);filter:brightness(1.05);box-shadow:0 10px 19px #2864dc3b}.button:active,button:active{transform:translateY(0);box-shadow:none}.secondary{border-color:#c8d8f3;background:#eef4ff;color:#2459b4;box-shadow:none}.danger{border-color:#f2b9c0;background:#fff0f1;color:#b92539;box-shadow:none}.danger:hover{background:#ffe3e6}.alert{border:1px solid transparent;box-shadow:0 6px 16px #1b315b0c}.alert.success{border-color:#a8e5ce}.alert.warning{border-color:#f5d796}input:not([type=checkbox]):not([type=radio]),select,textarea{border:1px solid #c6d5e9;border-radius:9px;background:#fff;color:#172b54;outline:0;transition:border-color .18s,box-shadow .18s}input:not([type=checkbox]):not([type=radio]):focus,select:focus,textarea:focus{border-color:#3375e7;box-shadow:0 0 0 4px #2864dc18}label{color:#4d6285;font-weight:650}table{border:1px solid #dce6f4;border-radius:11px;overflow:hidden;background:#fff}thead{background:linear-gradient(90deg,#eff5ff,#f8fbff)}th{color:#426594}tbody tr{transition:background .16s}tbody tr:hover{background:#f4f8ff}.status{border:1px solid #b6e9d0;background:#eafbf2}.status.offline{border-color:#dce1ea;background:#f5f6f8}.status.resetting{border-color:#f3d69f;background:#fff8e8}.empty{border:1px dashed #bbcee7;border-radius:11px;background:#f8fbff;color:#6680a7}.notice{border:1px solid #f5db9b;border-radius:10px}.table-wrap{border-radius:11px}.enroll .card,.enroll-batch .card{border-top:3px solid #3c7de0}.qr img{padding:8px;border:1px solid #c9d9ef;border-radius:12px;background:#fff;box-shadow:0 8px 18px #183a6d14}
@media(max-width:800px){body{background:#f3f7fd}aside{border-right:0;border-bottom:1px solid #34547f;box-shadow:0 6px 24px #0a1d4320}.menu-head{padding:2px 4px 0;margin:0;border:0}main{margin:0;width:100%;padding:22px 16px}.header{padding-bottom:15px;margin-bottom:18px}.card{padding:18px;border-radius:13px}.stats{gap:12px}.stats strong{font-size:31px}#main-menu{background:linear-gradient(165deg,#0d1b3a,#102b52)!important}.nav-credit{margin-top:10px}}
/* Mobile menu stays hidden until the hamburger toggles its adjacent checkbox. */
/* Start closed everywhere; desktop is the only permanently expanded layout. */
aside>nav#main-menu{display:none!important}
aside.menu-open>nav#main-menu{display:grid!important}
@media(min-width:1025px){aside>nav#main-menu{display:grid!important}}
/* Some Android WebViews report a desktop-sized viewport.  Detect touch input,
   not width, so their navigation still starts closed. */
@media(hover:none) and (pointer:coarse){
  body{display:block}
  aside{position:static;width:100%;min-height:auto;padding:18px}
  .menu-head{padding:2px 4px 0;margin:0;border:0}
  .menu-head h1{margin:0}
  .menu-toggle{display:block;padding:8px 12px;background:#2864dc;color:#fff;border-radius:7px;font-weight:600;cursor:pointer}
  aside:not(.menu-open)>nav#main-menu{display:none!important}
  aside.menu-open>nav#main-menu{position:fixed;z-index:1000;top:70px;left:12px;right:12px;max-height:calc(100vh - 86px);overflow:auto;padding:14px;background:linear-gradient(165deg,#0d1b3a,#102b52)!important;border:1px solid #31456f;border-radius:12px;box-shadow:0 14px 36px rgba(0,0,0,.35)}
  .foot{display:none}
  main,main.public-main{margin:0;width:100%;padding:22px 16px}
}

/* The device table has many optional columns.  The wrapper, rather than the
   table itself, owns the horizontal touch scroll on Android browsers. */
.device-table-scroll{display:block;max-width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;touch-action:pan-x;overscroll-behavior-x:contain}
.device-table-scroll>table{min-width:1120px;margin:0}
.device-table-scroll .status{display:inline-flex;align-items:center;white-space:nowrap}
.remote-reset-action{display:none!important}
.refresh-qr-button{white-space:nowrap}
@media(max-width:800px),(hover:none) and (pointer:coarse){.device-table-scroll{margin:0 -4px;padding-bottom:7px}.device-table-scroll>table{font-size:13px}}
@media(max-width:800px),(hover:none) and (pointer:coarse){.header>.refresh-qr-button{align-self:flex-end}}
