*{margin:0;padding:0;box-sizing:border-box}:root{--primary: #1c1c1e;--primary-dark: #000000;--bg: #f5f5f7;--sidebar-bg: #141416;--sidebar-text: #9c9ca3;--card-bg: #ffffff;--border: #e5e5ea;--text: #1c1c1e;--text-muted: #6e6e73;--success: #22c55e;--warning: #f59e0b;--danger: #ef4444}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text)}.loading-screen{display:flex;align-items:center;justify-content:center;height:100vh;font-size:1.2rem;color:var(--text-muted)}.login-page{display:flex;min-height:100vh;background:#f5f5f7}.login-side{flex:1;background:#141416;color:#fff;display:flex;flex-direction:column;justify-content:space-between;padding:44px 48px;position:relative;overflow:hidden}.login-side-mark{position:absolute;right:-70px;bottom:-70px;opacity:.08}.login-side-brand{display:flex;align-items:center;gap:10px}.login-side-brand .word{font-size:.66rem;letter-spacing:.3em;font-weight:600;line-height:1.5}.login-side-brand .word small{display:block;font-size:.5rem;letter-spacing:.22em;color:#6e6e76;font-weight:600}.login-side-tag small{display:block;font-size:.74rem;font-weight:500;color:#9c9ca3}.login-form-panel{width:420px;display:flex;align-items:center;justify-content:center;padding:0 44px}.login-form-inner{width:100%;max-width:340px}.login-form-hd{font-size:1.05rem;font-weight:800;margin-bottom:16px}.login-mobile-brand{display:none}.login-label{display:block;font-size:.7rem;font-weight:700;color:var(--text-muted);margin-bottom:4px}.login-field{width:100%;border:1px solid var(--border);border-radius:10px;padding:10px 13px;font-size:.9rem;font-family:inherit;outline:none;background:var(--card-bg);margin-bottom:12px}.login-field:focus{border-color:var(--text)}.login-btn{width:100%;border:none;background:var(--text);color:#fff;border-radius:10px;padding:11px 0;font-size:.9rem;font-weight:700;cursor:pointer;margin-top:4px}.login-btn:disabled{opacity:.5}.login-error{background:#f1f1f3;color:var(--text);padding:.55rem .85rem;border-radius:10px;font-size:.82rem;font-weight:600;text-align:center;margin-bottom:12px}.login-hint{text-align:center;font-size:.7rem;color:#aeaeb4;margin-top:16px}@media (max-width: 760px){.login-side{display:none}.login-form-panel{width:100%;padding:0 24px}.login-form-inner{background:var(--card-bg);border:1px solid var(--border);border-radius:18px;padding:34px 32px 26px}.login-form-hd{display:none}.login-mobile-brand{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:22px}.login-mobile-brand .word{font-size:.64rem;letter-spacing:.34em;font-weight:600;text-indent:.34em}.login-mobile-brand .sub{font-size:.56rem;letter-spacing:.24em;color:#aeaeb4;font-weight:600;text-indent:.24em}}.app-layout{display:flex;min-height:100vh}.sidebar{width:200px;background:var(--sidebar-bg);color:var(--sidebar-text);padding:1rem 0;flex-shrink:0;display:flex;flex-direction:column;transition:width .2s ease}.sidebar.collapsed{width:52px}.sidebar-top{display:flex;align-items:center;justify-content:space-between;padding:0 .75rem 1rem}.sidebar-logo{display:flex;align-items:center;gap:9px;color:#fff;white-space:nowrap;overflow:hidden}.sidebar-logo .word{font-size:.66rem;letter-spacing:.3em;font-weight:600;line-height:1.5}.sidebar-logo .word small{display:block;font-size:.5rem;letter-spacing:.22em;color:#6e6e76;font-weight:600}.sidebar.collapsed .sidebar-logo{justify-content:center}.sidebar-toggle{background:none;border:none;color:#fff6;cursor:pointer;font-size:.7rem;padding:4px;border-radius:4px;transition:color .15s;flex-shrink:0}.sidebar-toggle:hover{color:#fff}.sidebar.collapsed .sidebar-toggle{margin:0 auto}.sidebar a{display:flex;align-items:center;gap:10px;margin:1px 10px;padding:.5rem .65rem;border-radius:9px;color:var(--sidebar-text);text-decoration:none;font-size:.8rem;font-weight:600;transition:background .15s;white-space:nowrap;overflow:hidden}.sidebar a svg{flex-shrink:0}.sidebar.collapsed a{justify-content:center;padding:.5rem 0}.sidebar a:hover{background:#ffffff0f;color:#fff}.sidebar a.active{background:#26262b;color:#fff}.sidebar-footer{margin-top:auto;padding:1rem 1.25rem;border-top:1px solid rgba(255,255,255,.1)}.sidebar.collapsed .sidebar-footer{padding:.75rem .5rem;text-align:center}.sync-indicator{display:flex;align-items:center;gap:6px;padding:6px 0;margin-bottom:8px;cursor:default}.sync-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.sync-label{font-size:.7rem;color:#94a3b8;font-weight:500}.sync-ago{font-size:.65rem;color:#64748b;margin-left:auto}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.sidebar-user{font-size:.75rem;color:var(--text-muted);margin-bottom:.5rem;overflow:hidden;text-overflow:ellipsis}.sidebar-logout{background:none;border:1px solid rgba(255,255,255,.2);color:var(--sidebar-text);padding:.3rem .8rem;border-radius:4px;font-size:.8rem;cursor:pointer}.sidebar-logout:hover{background:#ffffff1a}.main-content{flex:1;min-width:0;padding:1.5rem 2rem;overflow-x:auto}.page-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.page-header h1{font-size:1.5rem;font-weight:600}.card{background:var(--card-bg);border:1px solid var(--border);border-radius:8px;padding:1.25rem;margin-bottom:1rem}.stats-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card{text-align:center}.stat-label{font-size:.8rem;color:var(--text-muted);margin-bottom:.25rem}.stat-value{font-size:2rem;font-weight:700;color:var(--primary)}table{width:100%;border-collapse:collapse}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border);font-size:.875rem}th{font-weight:600;color:var(--text-muted);font-size:.75rem;text-transform:uppercase;letter-spacing:.5px}tr:hover td{background:#f1f5f9}.btn{display:inline-flex;align-items:center;gap:.4rem;padding:.5rem 1rem;border:none;border-radius:6px;font-size:.875rem;font-weight:500;cursor:pointer;transition:background .15s}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-dark)}.btn-primary:disabled{opacity:.6;cursor:not-allowed}.btn-sm{padding:.3rem .6rem;font-size:.8rem;background:var(--card-bg);border:1px solid var(--border)}.btn-sm:hover{background:#f1f5f9}.btn-success{background:var(--success);color:#fff}.btn-warning{background:var(--warning);color:#fff}.btn-danger{background:var(--danger);color:#fff}.form-group{margin-bottom:1rem}.form-group label{display:block;font-size:.8rem;font-weight:600;color:var(--text-muted);margin-bottom:.3rem}.form-group input,.form-group select,.form-group textarea{width:100%;padding:.5rem .75rem;border:1px solid var(--border);border-radius:6px;font-size:.875rem}.form-group input:focus,.form-group select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px #6366f11a}.form-group input[type=checkbox]{width:auto}.form-group .check-label{display:flex;align-items:center;gap:.35rem;font-size:.85rem;white-space:nowrap}.back-link{display:inline-flex;align-items:center;gap:5px;padding:5px 12px 5px 9px;border-radius:999px;background:var(--bg-hover, #f1f1f3);color:var(--text-muted, #6e6e73);font-size:.76rem;font-weight:700;text-decoration:none;border:none;cursor:pointer;font-family:inherit;transition:background .12s,color .12s}.back-link:hover{background:#e4e4e7;color:var(--text, #1c1c1e);text-decoration:none}.back-link svg{flex-shrink:0}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem}.search-input{width:100%;padding:.5rem .75rem;margin-bottom:1rem;border:1px solid var(--border);border-radius:6px;font-size:.875rem}.search-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px #6366f11a}.badge{display:inline-block;padding:.15rem .5rem;border-radius:999px;font-size:.75rem;font-weight:600}.badge-active{background:#dcfce7;color:#166534}.badge-completed{background:#dbeafe;color:#1e40af}.badge-cancelled{background:#fee2e2;color:#991b1b}.badge-pending{background:#fef3c7;color:#92400e}.location-tabs{display:flex;gap:8px;margin-bottom:16px}.location-tabs .tab{padding:8px 20px;border:2px solid #ddd;border-radius:8px;background:#fff;cursor:pointer;font-weight:600;font-size:.9rem;transition:all .2s}.location-tabs .tab:hover{border-color:#1a1a2e}.location-tabs .tab.active{background:#1a1a2e;color:#fff;border-color:#1a1a2e}.location-tabs .tab[data-location=DH].active{background:#2c7be5;border-color:#2c7be5}.location-tabs .tab[data-location=TW].active{background:#e67e22;border-color:#e67e22}.calendar-controls{display:flex;align-items:center;gap:16px;margin-bottom:12px;justify-content:center}#weekLabel{font-weight:600;font-size:1rem;min-width:200px;text-align:center}.calendar-wrapper{overflow:auto;margin-bottom:16px}.cal-sticky .cal-header{position:sticky;top:0;z-index:30}.cal-sticky .cal-header--sub{top:var(--cal-head1-h, 32px);z-index:29}.cal-sticky .cal-time-label{position:sticky;left:0;z-index:25}.cal-sticky .cal-corner{left:0;z-index:31}.list-sticky{overflow:auto;margin-bottom:16px}.list-sticky .list-toolbar{position:sticky;top:0;left:0;z-index:31;background:var(--card-bg, #fff);padding:.25rem 0 .5rem}.list-sticky thead th{position:sticky;top:calc(var(--list-head1-h, 40px) - 1px);z-index:30;background:var(--bg-muted, #f5f5f7);box-shadow:inset 0 -1px 0 var(--border, #e5e5e5)}.calendar-grid{display:grid;grid-template-columns:60px repeat(7,minmax(210px,1fr));width:max-content;border:1px solid var(--border);border-radius:14px;position:relative;background:var(--card-bg)}.cal-header:first-child{border-top-left-radius:13px}.cal-header:last-of-type{border-top-right-radius:13px}.cal-time-label:last-of-type{border-bottom-left-radius:13px}.cal-cell:last-of-type{border-bottom-right-radius:13px}.cal-header{background:var(--card-bg);color:#aeaeb4;padding:8px 4px;text-align:center;font-size:.78rem;font-weight:600;letter-spacing:.08em;border-bottom:1px solid var(--border)}.cal-header--sub:not(.cal-corner){background:var(--bg)}.cal-sticky .cal-header--room{top:calc(var(--cal-head1-h, 32px) + var(--cal-head2-h, 28px) - 1px);z-index:28;background:var(--card-bg);padding:3px 4px;letter-spacing:0;font-size:.72rem}.cal-sticky .cal-corner.cal-header--room{z-index:32}.cal-header.today{color:var(--text);font-weight:800}.cal-time-label{background:var(--card-bg);padding:2px 8px 0 0;font-size:.74rem;font-weight:600;color:#aeaeb4;border-right:1px solid #f4f4f6;border-bottom:1px solid #f8f8fa;text-align:right;min-height:46px}.cal-cell{position:relative;border-right:1px solid #f4f4f6;border-bottom:1px solid #f8f8fa;min-height:46px}.cal-event{position:absolute;left:2px;right:2px;border-radius:8px;padding:5px 8px;font-size:.8rem;line-height:1.35;overflow:hidden;cursor:pointer;z-index:1;transition:all .2s}.cal-event:hover{z-index:10!important;box-shadow:0 2px 8px #0003}.cal-event.is-expanded{overflow:visible;z-index:20!important;box-shadow:0 6px 22px #00000047;max-height:78vh;overflow-y:auto}.cal-event .event-category{font-weight:700;opacity:.75}.cal-event .event-time{font-weight:600;font-size:.68rem;opacity:.7;margin-bottom:1px}.cal-event .event-lesson-badge{display:inline-block;background:#0000001f;border-radius:3px;padding:0 4px;margin-right:4px;font-weight:700;opacity:1}.cal-event .event-course{display:block;color:inherit;font-weight:700;font-size:.86rem;line-height:1.25;margin-bottom:2px;overflow-wrap:anywhere}.cal-event .event-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px;font-size:.66rem;color:#444}.cal-event .event-room-tag{background:#0000001f;border-radius:3px;padding:0 4px;font-weight:700;font-size:.64rem;color:inherit;display:inline-block}.cal-event .event-teacher{color:#555;font-style:normal;opacity:.85}.cal-event.type-pro{background:#cce5ff;border:1px solid #007bff}.cal-event.type-min{background:#fff3cd;border:1px solid #ffc107}.cal-event.type-big{background:#f8d7da;border:1px solid #dc3545}.cal-event.type-lit{background:#d4edda;border:1px solid #28a745}.cal-event.type-tns{background:#e2d5f1;border:1px solid #6f42c1}.cal-event.type-ctm{background:#fce4ec;border:1px solid #e91e63}.cal-event.type-tut{background:#e0f7fa;border:1px solid #00bcd4}.cal-event.type-other{background:#f5f5f5;border:1px solid #999}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:flex-start;justify-content:center;padding-top:5vh;z-index:2000}.modal-content{background:#fff;border-radius:12px;width:90%;max-width:700px;max-height:85vh;overflow:auto;box-shadow:0 20px 60px #0000004d}.modal-header{padding:16px 20px;border-bottom:2px solid #e0e0e0;display:flex;justify-content:space-between;align-items:flex-start}.modal-title{font-weight:700;font-size:1.1rem}.modal-sub{color:#666;font-size:.85rem;margin-top:4px}.modal-close{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#999;line-height:1}.modal-info{display:flex;gap:24px;padding:12px 20px;border-bottom:1px solid #eee;font-size:.85rem;flex-wrap:wrap}.modal-body{padding:16px 20px}.modal-body h3{margin:0 0 12px;font-size:1rem}.status-badge{display:inline-block;padding:2px 10px;border-radius:4px;font-size:.75rem;font-weight:600;color:#fff}.timetable-event{background:var(--primary);color:#fff;border-radius:4px;padding:.25rem .4rem;margin-bottom:2px;font-size:.7rem;line-height:1.3;cursor:pointer}.timetable-event:hover{opacity:.9}.center-tabs{display:flex;gap:.5rem;margin-bottom:1rem}.center-tab{padding:.4rem 1rem;border:1px solid var(--border);border-radius:6px;background:var(--card-bg);cursor:pointer;font-size:.85rem}.center-tab.active{background:var(--primary);color:#fff;border-color:var(--primary)}.page-container{max-width:1200px}.page-loading{padding:2rem;color:var(--text-muted)}.setup-section{background:var(--card-bg);border:1px solid var(--border);border-radius:8px;padding:1.25rem 1.5rem;margin-bottom:1.5rem}.setup-section h2{font-size:1.1rem;font-weight:600;margin-bottom:.5rem}.setup-section p.muted{font-size:.85rem;color:var(--text-muted);margin-bottom:1rem}.info-box{background:#ecfdf5;border:1px solid #86efac;border-radius:6px;padding:.75rem 1rem;margin-bottom:1rem;font-size:.875rem;color:#065f46}.error-box{background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:.75rem 1rem;margin-bottom:1rem;font-size:.875rem;color:#991b1b}.data-table{width:100%;margin-top:1rem}.data-table .empty{color:var(--text-muted);text-align:center;padding:1rem;font-style:italic}.error-cell{color:#991b1b;font-size:.8rem;max-width:240px;word-break:break-word}.pill{display:inline-block;padding:.15rem .5rem;border-radius:999px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px}.pill-active{background:#d1fae5;color:#065f46}.pill-token_expired{background:#fef3c7;color:#92400e}.pill-revoked{background:#fee2e2;color:#991b1b}.pill-disabled{background:#e5e7eb;color:#4b5563}.device-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.5rem;margin-bottom:1rem;padding:.75rem;background:#f8fafc;border-radius:6px}.device-form input,.device-form select{padding:.5rem;font-size:.875rem;border:1px solid var(--border);border-radius:4px}.device-form button{background:var(--primary);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;cursor:pointer}.device-form button:disabled{opacity:.6;cursor:not-allowed}.checklist{margin-left:1.25rem;font-size:.875rem;line-height:1.7}.link-btn{background:none;border:none;color:var(--primary);cursor:pointer;font-size:.8rem;text-decoration:underline}.page-eyebrow{font-size:.6rem;letter-spacing:.24em;color:#aeaeb4;font-weight:600}.search-box{flex:1 1 14rem;min-width:12rem;display:flex;align-items:center;gap:8px;background:var(--card-bg);border:1px solid var(--border);border-radius:10px;padding:7px 12px;color:#aeaeb4}.search-box input{border:none;outline:none;flex:1;font-size:.85rem;font-family:inherit;color:var(--text);background:transparent}.select-pill{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--card-bg) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236e6e73' stroke-width='2.4' stroke-linecap='round'><path d='M6 9l6 6 6-6'/></svg>") no-repeat right 10px center / 10px;border:1px solid var(--border);border-radius:10px;padding:7px 30px 7px 12px;font-size:.8rem;font-weight:600;color:var(--text);cursor:pointer;font-family:inherit}.av-sm{width:30px;height:30px;border-radius:99px;background:#ececee;color:var(--text);display:inline-flex;align-items:center;justify-content:center;font-size:.68rem;font-weight:700;flex-shrink:0}.cell-name b{display:block;font-weight:700}.cell-name span{font-size:.72rem;color:var(--text-muted)}.chip-cat{display:inline-block;font-size:.68rem;font-weight:700;padding:2px 9px;border-radius:99px;background:#f1f1f3;font-variant-numeric:tabular-nums}.chip-team{display:inline-block;font-size:.64rem;font-weight:700;padding:2px 9px;border-radius:99px;background:var(--text);color:#fff}.icon-btn{width:28px;height:28px;border:none;border-radius:8px;background:transparent;color:#c6c6cb;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.icon-btn:hover{background:#f1f1f3;color:var(--text)}.icon-btn.danger:hover{color:#b3423a;background:#fbeeee}.pager{display:flex;align-items:center;gap:10px;margin-top:1rem}.pager .info{flex:1;font-size:.78rem;color:var(--text-muted)}.pager .pg{font-size:.8rem;font-weight:700;font-variant-numeric:tabular-nums}.pager button{width:30px;height:30px;border:1px solid var(--border);background:var(--card-bg);border-radius:99px;display:flex;align-items:center;justify-content:center;color:var(--text);cursor:pointer;padding:0}.pager button:disabled{color:#d9d9de;cursor:default}.tab-bar{display:flex;gap:22px;border-bottom:1px solid var(--border);margin-bottom:20px}.tab-btn{border:none;background:none;padding:8px 2px 10px;cursor:pointer;font-size:.86rem;font-weight:700;color:#aeaeb4;position:relative;font-family:inherit}.tab-btn.on{color:var(--text)}.tab-btn.on:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--text)}.mini-label{font-size:.62rem;letter-spacing:.16em;color:#aeaeb4;font-weight:700;margin:12px 0 7px}.member-chip{display:inline-flex;align-items:center;gap:7px;background:#f1f1f3;border-radius:99px;padding:4px 12px 4px 4px;font-size:.78rem;font-weight:600}.member-chip .av{width:22px;height:22px;border-radius:99px;background:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:.6rem;font-weight:700}.add-member-select{-moz-appearance:none;appearance:none;-webkit-appearance:none;border:1.5px dashed #c6c6cb;background:none;border-radius:99px;padding:4px 14px;font-size:.74rem;font-weight:600;color:#8a8a90;cursor:pointer;font-family:inherit}.rule-row{display:flex;align-items:center;gap:11px;padding:9px 0;border-bottom:1px solid #f4f4f6}.rule-row:last-child{border-bottom:none}.rule-row .cond{flex:1;font-size:.8rem}.rule-row .cond .chip-cat{margin-right:5px}.rule-row .amt{font-size:.88rem;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}.rule-row .amt small{font-weight:600;color:#8a8a90;font-size:.68rem}.draft-chip{font-size:.64rem;font-weight:700;padding:2px 10px;border-radius:99px;background:#f7f1e4;color:#a96a00}@keyframes pt-pressplay{0%{transform:translate(-30px) scale(.8);opacity:0}60%{transform:translate(4px) scale(1.04);opacity:1}to{transform:none;opacity:1}}@keyframes pt-spread{0%{letter-spacing:.8em;opacity:0}to{letter-spacing:.42em;opacity:1}}@keyframes pt-breath{0%,to{opacity:1}50%{opacity:.15}}.pt-splash-mark{animation:pt-pressplay 1.2s cubic-bezier(.2,.9,.3,1.2) both,pt-breath 1.8s ease-in-out 1.8s infinite}.pt-splash-word{animation:pt-spread 1.2s ease-out both,pt-breath 1.8s ease-in-out 1.8s infinite}@media (prefers-reduced-motion: reduce){.pt-splash-mark,.pt-splash-word{animation:none}}
