/* ⚠ THIS IS THE ONLY STYLESHEET INDEX.HTML LOADS — TREAT AS SOURCE OF TRUTH ⚠
   css/variables.css, css/components.css and css/mobile-ios.css are NOT
   linked anywhere and do NOT affect the live app. Several fixes (print
   @page landscape rule, mobile header/table patches near the bottom of
   this file) exist ONLY here. If you regenerate this file from those
   three "source" files, you will silently lose those fixes — see the
   header comments in each of those files. Until a real build step
   (concat + minify those 3 → this file) is wired into package.json,
   edit THIS file directly for any live styling change, and port the
   change back to the matching source file for documentation. */
:root{color-scheme:light;--brand:#1a3a6b;--brand-dk:#142e58;--brand-lt:rgba(26,58,107,.07);--teal:#0d9488;--teal-dk:#0a7a70;--color-primary:#1a3a6b;--color-primary-dark:#142e58;--color-primary-faint:rgba(26,58,107,.06);--color-teal:#0d9488;--color-teal-dark:#0a7a70;--color-teal-faint:rgba(13,148,136,.07);--color-bg:#f0f2f5;--color-white:#ffffff;--color-surface:#ffffff;--color-surface-2:#f4f6f9;--color-surface-light:#eaecf2;--color-border:#dde1eb;--color-border-light:#e8eaf0;--color-border-hover:#b4bdd0;--color-divider:#cdd2e0;--color-text:#0d1117;--color-text-secondary:#374151;--color-text-muted:#6b7280;--color-text-light:#9ca3af;--color-text-inverse:#ffffff;--color-success:#0a8f52;--color-success-light:#edfaf3;--color-success-border:#6dd6a8;--color-warning:#d97706;--color-warning-light:#fffbeb;--color-warning-border:#fde68a;--color-warning-text:#92400e;--color-error:#c41c1c;--color-error-light:#fef2f2;--color-error-border:#f8a0a0;--color-error-text:#7f1d1d;--color-info:#1a3a6b;--color-info-light:#eef3ff;--color-info-border:#c0d0f0;--font-family:Inter,system-ui,-apple-system,sans-serif;--text-xs:11px;--text-sm:12px;--text-base:13.5px;--text-lg:15px;--text-xl:17px;--text-2xl:20px;--text-3xl:24px;--text-4xl:30px;--font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--radius-sm:3px;--radius-md:4px;--radius-lg:5px;--radius-xl:7px;--radius-2xl:10px;--radius-full:9999px;--shadow-none:none;--shadow-xs:none;--shadow-sm:none;--shadow-base:none;--shadow-md:none;--shadow-lg:none;--sidebar-width:242px;--sidebar-rail-width:58px;--header-height:54px;--transition-fast:140ms ease;--transition-base:200ms ease;--z-dropdown:100;--z-sticky:200;--z-fixed:300;--z-overlay:350;--z-modal-overlay:500;--z-modal:510;--z-notification:700;--z-tooltip:9999}*,::after,::before{box-sizing:border-box;margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent;background:var(--color-bg)}body{font-family:var(--font-family);font-size:var(--text-base);color:var(--color-text);background:var(--color-bg);line-height:1.5;min-height:100%}h1,h2,h3,h4{font-weight:var(--font-semibold);line-height:1.25;color:var(--color-text)}a{color:var(--color-teal);text-decoration:none}a:hover{text-decoration:none}input[type=color],input[type=date],input[type=email],input[type=number],input[type=password],input[type=text],input[type=time],select,textarea{width:100%;height:38px;padding:0 11px;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-white);font-family:var(--font-family);font-size:var(--text-base);color:var(--color-text);outline:0;line-height:38px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);-webkit-appearance:none;appearance:none}textarea{height:auto;min-height:80px;padding:8px 11px;line-height:1.5;resize:vertical}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}input[type=date]::-webkit-calendar-picker-indicator,input[type=time]::-webkit-calendar-picker-indicator{display:none;-webkit-appearance:none}input[type=date],input[type=time]{cursor:text;letter-spacing:.03em}select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:32px;cursor:pointer}select::-ms-expand{display:none}input::placeholder,textarea::placeholder{color:var(--color-text-light);font-size:var(--text-sm)}input:hover,select:hover,textarea:hover{border-color:var(--color-border-hover)}input:focus,select:focus,textarea:focus{border-color:var(--color-primary);box-shadow:none;outline:0}input:disabled,select:disabled,textarea:disabled{background:var(--color-surface-2);color:var(--color-text-muted);cursor:not-allowed}.btn,button{font-family:var(--font-family);font-size:var(--text-base);font-weight:var(--font-medium);padding:7px 15px;border:none;background:0 0;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),opacity var(--transition-fast);display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap;user-select:none;text-decoration:none;line-height:1.4}.btn-primary{background:var(--color-primary);color:#fff}.btn-primary:hover{background:var(--color-primary-dark)}.btn-teal{background:var(--color-teal);color:#fff;border-radius:var(--radius-full);padding-left:14px;padding-right:14px}.btn-teal:hover{background:var(--color-teal-dark)}.btn-secondary{background:var(--color-white);color:var(--color-text-secondary);border:1px solid var(--color-border)}.btn-secondary:hover{background:var(--color-surface-2);border-color:var(--color-border-hover)}.btn-ghost{background:0 0;color:var(--color-text-muted);border:1px solid transparent}.btn-ghost:hover{background:var(--color-surface-2);color:var(--color-text)}.btn-danger{background:var(--color-error);color:#fff}.btn-danger:hover{background:#b01c1c}.btn-success{background:var(--color-success);color:#fff}.btn-success:hover{background:#077a44}.btn-sm{padding:4px 10px;font-size:var(--text-sm)}.btn-lg{padding:10px 20px;font-size:var(--text-lg)}.btn-block{width:100%}.btn:disabled,button:disabled{opacity:.38;cursor:not-allowed;pointer-events:none}.card{background:var(--color-white);border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;transition:border-color var(--transition-fast)}.card:hover{border-color:var(--color-border-hover)}.card-header{padding:12px 18px;border-bottom:1px solid var(--color-border-light);display:flex;align-items:center;justify-content:space-between}.card-title{font-size:var(--text-base);font-weight:var(--font-semibold);margin:0}.card-body{padding:18px}.card-footer{padding:12px 18px;border-top:1px solid var(--color-border-light)}.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:600;letter-spacing:.02em;border:1px solid transparent}.badge-success{background:var(--color-success-light);color:var(--color-success);border-color:var(--color-success-border)}.badge-warning{background:var(--color-warning-light);color:var(--color-warning);border-color:var(--color-warning-border)}.badge-error{background:var(--color-error-light);color:var(--color-error);border-color:var(--color-error-border)}.badge-info{background:var(--color-info-light);color:var(--color-info);border-color:var(--color-info-border)}.badge-primary{background:var(--color-primary-faint);color:var(--color-primary)}.badge-teal{background:var(--color-teal-faint);color:var(--color-teal)}.form-group{display:flex;flex-direction:column;gap:4px;margin-bottom:14px}.form-group:last-child{margin-bottom:0}.form-label{display:block;font-size:11px;font-weight:600;color:var(--color-text-secondary);margin-bottom:3px;letter-spacing:.03em;text-transform:uppercase}.form-helper{font-size:var(--text-xs);color:var(--color-text-muted)}.form-error{font-size:var(--text-xs);color:var(--color-error)}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;z-index:var(--z-modal-overlay);padding:24px;animation:fadeIn var(--transition-fast);pointer-events:all}.modal{background:var(--color-white);border:1px solid var(--color-border);border-radius:var(--radius-xl);width:100%;max-width:520px;max-height:90vh;overflow-y:auto;z-index:var(--z-modal);animation:slideUp 180ms ease;box-shadow:none}.modal-header{padding:20px 22px 16px;border-bottom:1px solid var(--color-border-light);display:flex;align-items:center;justify-content:space-between}.modal-title{font-size:16px;font-weight:700;margin:0}.modal-close{width:28px;height:28px;border-radius:var(--radius-md);background:0 0;border:none;cursor:pointer;color:var(--color-text-muted);display:flex;align-items:center;justify-content:center;transition:background var(--transition-fast),color var(--transition-fast)}.modal-close:hover{background:var(--color-surface-2);color:var(--color-text)}.modal-close svg{width:14px;height:14px}.modal-body{padding:22px 22px 18px}.modal-footer{padding:14px 22px 18px;border-top:1px solid var(--color-border-light);display:flex;gap:8px;justify-content:flex-end}.notification{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:var(--radius-lg);border:1px solid transparent;font-size:var(--text-sm);font-weight:500;pointer-events:all;animation:slideInRight 180ms ease;min-width:260px;max-width:380px;box-shadow:none}.notification-success{background:#edfaf3;border-color:#6dd6a8;color:#065f46}.notification-error{background:#fef2f2;border-color:#f8a0a0;color:#991b1b}.notification-warning{background:#fffbeb;border-color:#fde68a;color:#92400e}.notification-info{background:#eef3ff;border-color:#c0d0f0;color:#1a3a6b}.table-wrap{overflow-x:auto;border:1px solid var(--color-border);border-radius:var(--radius-lg)}.data-table{width:100%;border-collapse:collapse;font-size:var(--text-sm)}.data-table th{padding:10px 16px;font-size:11px;text-align:left;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);background:var(--color-surface-2);border-bottom:1px solid var(--color-border);white-space:nowrap}.data-table td{padding:11px 16px;border-bottom:1px solid var(--color-border-light);color:var(--color-text);vertical-align:middle}.data-table tr:last-child td{border-bottom:none}.data-table tr:hover td{background:var(--color-surface-2)}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px}.stat-card{background:var(--color-white);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:16px;display:flex;align-items:center;gap:12px;transition:border-color var(--transition-fast)}.stat-card:hover{border-color:var(--color-border-hover)}.stat-icon{width:38px;height:38px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;flex-shrink:0}.stat-icon svg{width:17px;height:17px}.stat-icon.stat-blue{background:#eef3ff;color:#1a3a6b}.stat-icon.stat-green{background:#edfaf3;color:#0a8f52}.stat-icon.stat-amber{background:#fdf6ec;color:#92400e}.stat-icon.stat-purple{background:#f5f3ff;color:#6d28d9}.stat-icon.stat-teal{background:#f0fdfc;color:#0d9488}.stat-value{font-size:22px;font-weight:700;color:var(--color-text);letter-spacing:-.04em;line-height:1}.stat-label{font-size:11px;font-weight:600;color:var(--color-text-muted);margin-top:3px;text-transform:uppercase;letter-spacing:.04em}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center}.empty-state svg{width:40px;height:40px;color:var(--color-text-light);margin-bottom:14px}.empty-state h3{font-size:15px;font-weight:600;color:var(--color-text);margin-bottom:6px}.empty-state p{font-size:13px;color:var(--color-text-muted);max-width:300px;line-height:1.55}.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:.75rem;margin-bottom:20px;align-items:stretch}.kpi-card{padding:0;min-height:100px;border-radius:5px;border:1px solid var(--color-border);background:var(--color-white);position:relative;display:flex;flex-direction:column;align-items:stretch;overflow:hidden;cursor:pointer;box-shadow:none;text-decoration:none!important;-webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:border-color .15s ease,opacity .1s,transform .1s cubic-bezier(.34,1.56,.64,1)}.kpi-card:hover{border-color:var(--color-border-hover);background:var(--color-white);box-shadow:none;transform:none;text-decoration:none!important}.kpi-card:hover .kpi-icon{filter:none}.kpi-card:hover .kpi-label{color:var(--color-text)}.kpi-card:hover *{text-decoration:none!important}.kpi-card:active{transform:scale(.98)!important;opacity:.92!important;transition:transform .06s cubic-bezier(.4,0,1,1),opacity .06s!important}.kpi-card-hd{display:flex;align-items:center;gap:.5rem;margin-bottom:0;width:100%;background:var(--color-surface-2);border-bottom:1px solid var(--color-border);padding:.35rem .75rem;flex-shrink:0}.kpi-icon{width:13px;height:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:0 0;border:none;border-radius:0;color:#111827;transition:none;box-shadow:none}.kpi-icon svg{width:13px;height:13px;display:block;flex-shrink:0}.kpi-icon.blue{color:#3b82f6}.kpi-icon.teal{color:#0d9488}.kpi-icon.green{color:#16a34a}.kpi-icon.amber{color:#d97706}.kpi-icon.red{color:#dc2626}.kpi-label{font-size:.72rem;font-weight:600;color:var(--color-text-muted);letter-spacing:0;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;transition:color 160ms ease;text-transform:none;text-decoration:none!important}.kpi-val{font-size:clamp(1.2rem, 2.5vw, 1.65rem);font-weight:700;color:var(--color-text);letter-spacing:-.04em;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;padding:1rem .75rem 0;text-decoration:none!important}.kpi-sub-line{font-size:.65rem;color:var(--color-text-light);font-weight:400;line-height:1.4;padding:.2rem .75rem 1rem}.kpi-change{font-size:.72rem;display:flex;align-items:center;gap:.25rem;padding:.25rem .75rem 0}.kpi-change.up{color:var(--color-success)}.kpi-change.down{color:var(--color-error)}.kpi-change.neutral{color:var(--color-text-muted)}.kpi-sub-warn{color:var(--color-error)!important;font-weight:600!important}.page-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;gap:14px;flex-wrap:wrap}.page-title{font-size:22px;font-weight:700;margin:0;color:var(--color-text);letter-spacing:-.02em}.page-subtitle{font-size:13px;color:var(--color-text-muted);margin-top:3px}.app-sidebar-section-label{font-size:10px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:var(--color-text-light);padding:14px 10px 4px;pointer-events:none;user-select:none}.dropdown-menu{position:absolute;top:100%;left:0;min-width:200px;background:var(--color-white);border:1px solid var(--color-border);border-radius:var(--radius-lg);z-index:var(--z-dropdown);margin-top:4px;box-shadow:none}.dropdown-item{display:block;padding:7px 14px;font-size:var(--text-sm);color:var(--color-text);cursor:pointer;transition:background var(--transition-fast)}.dropdown-item:hover{background:var(--color-surface-2)}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes slideUp{from{transform:translateY(8px);opacity:0}to{transform:none;opacity:1}}@keyframes slideInRight{from{transform:translateX(14px);opacity:0}to{transform:none;opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shimmer{to{background-position:-200% 0}}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-divider);border-radius:99px}::-webkit-scrollbar-thumb:hover{background:var(--color-border-hover)}::selection{background:rgba(13,148,136,.18);color:var(--color-text)}[data-theme=dark]{color-scheme:dark;--color-bg:#1c1c1e;--color-white:#2c2c2e;--color-surface:#2c2c2e;--color-surface-2:#3a3a3c;--color-surface-light:#444446;--color-border:rgba(255,255,255,.09);--color-border-light:rgba(255,255,255,.06);--color-border-hover:rgba(139,174,224,.45);--color-divider:rgba(255,255,255,.10);--color-text:#f5f5f7;--color-text-secondary:#d1d1d6;--color-text-muted:#aeaeb2;--color-text-light:#636366;--color-text-inverse:#1c1c1e;--color-primary:#8baee0;--color-primary-dark:#6b90c8;--color-primary-faint:rgba(139,174,224,.14);--color-teal:#16ad93;--color-teal-dark:#128a74;--color-teal-faint:rgba(22,173,147,.12);--color-success:#32d74b;--color-success-light:rgba(50,215,75,.13);--color-success-border:rgba(50,215,75,.30);--color-warning:#ff9f0a;--color-warning-light:rgba(255,159,10,.12);--color-warning-border:rgba(255,159,10,.30);--color-warning-text:#ffb454;--color-error:#ff453a;--color-error-light:rgba(255,69,58,.11);--color-error-border:rgba(255,69,58,.30);--color-error-text:#ff8a80;--color-info:#0a84ff;--color-info-light:rgba(10,132,255,.12);--color-info-border:rgba(10,132,255,.28);--shadow-xs:none;--shadow-sm:none;--shadow-base:none;--shadow-md:none;--shadow-lg:none}[data-theme=dark] input,[data-theme=dark] select,[data-theme=dark] textarea{background:#2c2c2e;color:#f5f5f7;border-color:rgba(255,255,255,.09)}[data-theme=dark] input::placeholder,[data-theme=dark] textarea::placeholder{color:#636366}[data-theme=dark] select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23aeaeb2' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E")}[data-theme=dark] input:hover,[data-theme=dark] select:hover,[data-theme=dark] textarea:hover{border-color:rgba(255,255,255,.18)}[data-theme=dark] input:focus,[data-theme=dark] select:focus,[data-theme=dark] textarea:focus{border-color:#16ad93;box-shadow:none}[data-theme=dark] input:disabled,[data-theme=dark] select:disabled,[data-theme=dark] textarea:disabled{background:#1c1c1e;color:#636366}[data-theme=dark] .badge-success{background:rgba(50,215,75,.13);color:#6fe08a;border-color:rgba(50,215,75,.3)}[data-theme=dark] .badge-warning{background:rgba(255,159,10,.12);color:#ffb454;border-color:rgba(255,159,10,.3)}[data-theme=dark] .badge-error{background:rgba(255,69,58,.11);color:#ff8a80;border-color:rgba(255,69,58,.3)}[data-theme=dark] .badge-info{background:rgba(10,132,255,.12);color:#6cb4ff;border-color:rgba(10,132,255,.28)}[data-theme=dark] .badge-primary{background:rgba(139,174,224,.14);color:#b7ccef}[data-theme=dark] .badge-teal{background:rgba(22,173,147,.12);color:#5eead0}[data-theme=dark] .stat-icon.stat-blue{background:rgba(10,132,255,.14);color:#6cb4ff}[data-theme=dark] .stat-icon.stat-green{background:rgba(50,215,75,.13);color:#6fe08a}[data-theme=dark] .stat-icon.stat-amber{background:rgba(255,159,10,.13);color:#ffb454}[data-theme=dark] .stat-icon.stat-purple{background:rgba(191,90,242,.12);color:#d9a8f5}[data-theme=dark] .stat-icon.stat-teal{background:rgba(22,173,147,.12);color:#5eead0}[data-theme=dark] .notification-success{background:rgba(50,215,75,.1);border-color:rgba(50,215,75,.3);color:#6fe08a}[data-theme=dark] .notification-error{background:rgba(255,69,58,.1);border-color:rgba(255,69,58,.3);color:#ff8a80}[data-theme=dark] .notification-warning{background:rgba(255,159,10,.1);border-color:rgba(255,159,10,.3);color:#ffb454}[data-theme=dark] .notification-info{background:rgba(10,132,255,.1);border-color:rgba(10,132,255,.28);color:#6cb4ff}[data-theme=dark] ::-webkit-scrollbar-thumb{background:rgba(62,203,179,.25)}[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background:rgba(62,203,179,.4)}[data-theme=dark] ::selection{background:rgba(62,203,179,.25);color:#eaf8f4}[data-theme=dark] .app-header{background:#1c1c1e!important;border-bottom-color:rgba(255,255,255,.09)!important}[data-theme=dark] .app-sidebar{background:#161618!important;border-right-color:rgba(255,255,255,.09)!important}@media print{body{background:#fff;font-size:11px}.app-header,.app-sidebar,.btn,.no-print,nav{display:none!important}.app-main{margin:0!important;padding:8px!important}td,th{border:1px solid #ccc!important}}@media (max-width:768px){.form-row{grid-template-columns:1fr}.page-header{flex-direction:column;align-items:flex-start}.modal{width:100%;max-width:100%;border-radius:var(--radius-xl) var(--radius-xl) 0 0}.modal-overlay{align-items:flex-end;padding:0}.modal-header{padding:16px 18px 14px}.modal-body{padding:18px 18px 14px}.modal-footer{padding:12px 18px 24px}}:root{--surface:var(--color-white);--surface-2:var(--color-surface-2);--surface-3:var(--color-surface-light);--border-2:var(--color-border-hover);--t1:var(--color-text);--t2:var(--color-text-secondary);--t3:var(--color-text-muted);--t4:var(--color-text-light);--brand:var(--color-primary);--brand-dk:var(--color-primary-dark);--brand-teal:var(--color-teal);--brand-teal-dk:var(--color-teal-dark);--brand-teal-lt:var(--color-teal-faint);--radius:var(--radius-lg);--danger:var(--color-error);--danger-bg:var(--color-error-light);--danger-border:var(--color-error-border)}[data-theme=dark]{--surface:var(--color-white);--surface-2:var(--color-surface-2);--surface-3:var(--color-surface-light)}.app-header{position:fixed;top:0;left:0;right:0;height:var(--header-height);z-index:var(--z-sticky);background:var(--color-white);border-bottom:1px solid var(--color-border);display:flex;align-items:center;padding:0 16px 0 0;overflow:visible}#hamburger-zone{width:var(--sidebar-rail-width);flex-shrink:0;display:none;align-items:center;justify-content:center;height:var(--header-height)}.app-header-logo-zone{width:var(--sidebar-width);min-width:var(--sidebar-width);flex-shrink:0;display:flex;align-items:center;padding-left:18px;height:var(--header-height)}.app-header-logo-zone .app-logo-text{white-space:nowrap}.app-header-content{display:flex;align-items:center;justify-content:space-between;flex:1;max-width:1600px;padding-left:20px}@media (max-width:768px){.app-header-logo-zone{width:auto;min-width:0;padding-left:0}.app-header-content{padding-left:4px}}.app-logo{display:flex;align-items:center;text-decoration:none!important;flex-shrink:0}.app-logo-text{display:flex;flex-direction:column;line-height:1.15}.brand-name{font-size:14px;font-weight:700;letter-spacing:-.03em;font-family:var(--font-family)}.brand-name .n1{color:var(--color-primary)}.brand-name .n2{color:var(--color-teal)}.ecm-n1{color:var(--color-primary)}.ecm-n2{color:var(--color-teal)}.brand-sub{font-size:8.5px;font-weight:500;letter-spacing:.03em;color:var(--color-text-light);opacity:.8}.app-header-actions{display:flex;align-items:center;gap:5px}.app-header-actions button svg{width:14px;height:14px}#theme-toggle{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid transparent;background:0 0;cursor:pointer;color:var(--color-text-muted);padding:0;transition:color .15s}#theme-toggle:hover{background:0 0;border-color:transparent;color:var(--color-text)}#theme-toggle:active,#theme-toggle:focus,#theme-toggle:focus-visible{background:0 0!important;outline:0;box-shadow:none;border-color:transparent}#theme-toggle svg{width:15px;height:15px;display:block}#theme-toggle.tt-pop{animation:none}[data-theme=dark] #theme-toggle:hover{background:0 0;border-color:transparent;color:#f5f5f7}#hamburger{display:flex;flex-direction:column;justify-content:center;align-items:center;width:34px;height:34px;background:0 0;border:none;cursor:pointer;gap:6px;padding:6px;border-radius:var(--radius-lg);transition:background var(--transition-fast);flex-shrink:0}#hamburger:hover{background:var(--color-surface-2)}#hamburger span{display:block;width:18px;height:2px;background:var(--color-text);border-radius:99px;transition:transform .28s cubic-bezier(.4,0,.2,1),opacity .2s ease,width .2s ease;transform-origin:center}#hamburger.open span:first-child{transform:translateY(8px) rotate(45deg)}#hamburger.open span:nth-child(2){opacity:0;width:0}#hamburger.open span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}#sidebar-desktop-toggle{display:none;align-items:center;justify-content:center;width:30px;height:30px;border-radius:7px;border:1px solid var(--color-border);background:var(--color-surface-2);cursor:pointer;color:var(--color-text-secondary);transition:color .14s ease,background .14s ease,border-color .14s ease;flex-shrink:0;-webkit-tap-highlight-color:transparent}#sidebar-desktop-toggle:focus-visible,#sidebar-desktop-toggle:hover{color:var(--color-text);background:var(--color-surface-light);border-color:var(--color-border-hover)}#sidebar-desktop-toggle:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}#sidebar-desktop-toggle svg{display:block;width:16px;height:16px}#sidebar-desktop-toggle .toggle-bar-left{opacity:1;transition:opacity .18s ease}body.sidebar-collapsed #sidebar-desktop-toggle .toggle-bar-left{opacity:.32}[data-theme=dark] #sidebar-desktop-toggle{color:#aeaeb2;background:#3a3a3c;border-color:#444446}[data-theme=dark] #sidebar-desktop-toggle:focus-visible,[data-theme=dark] #sidebar-desktop-toggle:hover{background:#444446;color:#f5f5f7;border-color:rgba(139,174,224,.45)}.app-sidebar-footer{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-top:1px solid var(--color-border);margin-top:auto;flex-shrink:0;transition:padding .28s cubic-bezier(.4,0,.2,1)}.sidebar-footer-ai{overflow:hidden;transition:opacity .22s ease,max-width .28s cubic-bezier(.4,0,.2,1),margin .28s cubic-bezier(.4,0,.2,1);max-width:160px}body.sidebar-collapsed .sidebar-footer-ai{opacity:0;max-width:0;margin:0;pointer-events:none}body.sidebar-collapsed .app-sidebar-item{justify-content:center;padding:0;margin-bottom:4px;gap:0;width:100%;position:relative}body.sidebar-collapsed .app-sidebar-item svg{width:18px;height:18px;opacity:.7}#conflicts-badge{transition:width .2s cubic-bezier(.4,0,.2,1),height .2s cubic-bezier(.4,0,.2,1),padding .2s cubic-bezier(.4,0,.2,1),font-size .15s ease}body.sidebar-collapsed #conflicts-badge{position:absolute;top:8px;right:12px;margin-left:0;min-width:8px;width:8px;height:8px;padding:0;font-size:0;line-height:0;border-radius:50%}@media (max-width:768px){#hamburger-zone{display:flex!important}#sidebar-desktop-toggle{display:none!important}}.app-sidebar.sidebar-hover-open{width:var(--sidebar-width)!important;box-shadow:4px 0 24px rgba(15,23,42,.1);z-index:calc(var(--z-fixed) + 1)}[data-theme=dark] .app-sidebar.sidebar-hover-open{box-shadow:4px 0 24px rgba(0,0,0,.35)}#sidebar-overlay{display:none!important}.app-sidebar{position:fixed;left:0;top:var(--header-height);width:var(--sidebar-width);height:calc(100vh - var(--header-height));background:var(--color-white);border-right:1px solid var(--color-border);overflow-y:auto;overflow-x:hidden;z-index:var(--z-fixed);display:flex;flex-direction:column;transition:width .28s cubic-bezier(.4, 0, .2, 1),box-shadow .28s cubic-bezier(.4, 0, .2, 1);will-change:width;contain:layout style}.app-sidebar-nav{display:flex;flex-direction:column;padding:16px 8px 24px;flex:1}.app-sidebar-item{display:flex;align-items:center;justify-content:flex-start;gap:12px;height:48px;padding:0 14px;border-radius:8px;cursor:pointer;text-decoration:none;font-size:13.5px;font-weight:500;color:var(--color-text-secondary);background:0 0;margin-bottom:4px;white-space:nowrap;overflow:hidden;width:100%;box-sizing:border-box}.app-sidebar-item span{max-width:160px;transition:opacity .16s cubic-bezier(.4,0,.2,1) .14s}body.sidebar-collapsed .app-sidebar-item span{transition:opacity .1s ease}.app-sidebar-item svg{width:18px;height:18px;flex-shrink:0;opacity:.62;transition:opacity .12s,width .28s cubic-bezier(.4,0,.2,1),height .28s cubic-bezier(.4,0,.2,1)}.app-sidebar-item:hover{background:var(--color-surface-2);color:var(--color-text);text-decoration:none}.app-sidebar-item:hover svg{opacity:.9}.app-sidebar-item.active{background:var(--color-primary-faint);color:var(--color-primary);font-weight:600}.app-sidebar-item.active svg{opacity:1;color:var(--color-primary)}.app-main{margin-left:var(--sidebar-width);margin-top:var(--header-height);padding:28px 30px;min-height:calc(100vh - var(--header-height));background:var(--color-bg)}#notification-container{position:fixed;top:14px;right:14px;z-index:var(--z-notification);display:flex;flex-direction:column;gap:7px;pointer-events:none}[data-theme=dark] .app-header{background:#1c1c1e;border-color:rgba(255,255,255,.09)}[data-theme=dark] .app-main{background:#1c1c1e}[data-theme=dark] .app-sidebar{background:#161618;border-color:rgba(255,255,255,.09)}[data-theme=dark] .app-sidebar-item{color:#f5f5f7}[data-theme=dark] .app-sidebar-item svg{opacity:.65}[data-theme=dark] .app-sidebar-item:hover{background:#3a3a3c;color:#f5f5f7}[data-theme=dark] .app-sidebar-item:hover svg{opacity:1}[data-theme=dark] .app-sidebar-item.active{background:rgba(139,174,224,.16);color:#f5f5f7;font-weight:600}[data-theme=dark] .app-sidebar-item.active svg{opacity:1;color:#8baee0}[data-theme=dark] .card{background:#2c2c2e;border-color:rgba(255,255,255,.09)}[data-theme=dark] .card:hover{border-color:rgba(139,174,224,.45)}[data-theme=dark] .card-footer,[data-theme=dark] .card-header{border-color:rgba(255,255,255,.08)}[data-theme=dark] .stat-card{background:#2c2c2e;border-color:rgba(255,255,255,.09)}[data-theme=dark] .stat-card:hover{border-color:rgba(139,174,224,.45)}[data-theme=dark] .kpi-card{background:var(--color-surface);border-color:var(--color-border)}[data-theme=dark] .kpi-card:hover{border-color:var(--color-border-hover);background:var(--color-surface)}[data-theme=dark] .kpi-card-hd{background:rgba(255,255,255,.03);border-bottom-color:var(--color-border)}[data-theme=dark] .kpi-val{color:#f5f5f7}[data-theme=dark] .kpi-label{color:var(--color-text-muted)}[data-theme=dark] .kpi-icon{background:0 0!important;color:#aeaeb2;border:none}[data-theme=dark] .kpi-card:hover .kpi-icon{filter:none}[data-theme=dark] .kpi-card:hover .kpi-label{color:var(--color-text)}[data-theme=dark] .stat-value{color:#f5f5f7}[data-theme=dark] .stat-label{color:#d1d1d6}[data-theme=dark] .modal{background:#2c2c2e;border-color:rgba(255,255,255,.09)}[data-theme=dark] .modal-footer,[data-theme=dark] .modal-header{border-color:rgba(255,255,255,.08)}[data-theme=dark] .modal-overlay{background:rgba(0,0,0,.7)}[data-theme=dark] .modal-close:hover{background:rgba(255,69,58,.1);color:#ff453a}[data-theme=dark] .modal-title{color:#f5f5f7}[data-theme=dark] .btn-secondary{background:#3a3a3c;border-color:rgba(255,255,255,.09);color:#f5f5f7}[data-theme=dark] .btn-secondary:hover{background:#444446;border-color:rgba(139,174,224,.45);color:#f5f5f7}[data-theme=dark] .btn-ghost{color:#d1d1d6}[data-theme=dark] .btn-ghost:hover{background:#3a3a3c;color:#f5f5f7}[data-theme=dark] .btn-primary{background:#254c88;color:#fff}[data-theme=dark] .btn-primary:hover{background:#1c3b6b}[data-theme=dark] .btn-teal{background:#0f6b5c;color:#fff;border-radius:var(--radius-full)}[data-theme=dark] .btn-teal:hover{background:#0d5247}[data-theme=dark] .btn-danger{background:#d70015;color:#fff}[data-theme=dark] .btn-danger:hover{background:#a30010}[data-theme=dark] .dropdown-menu{background:#2c2c2e;border-color:rgba(255,255,255,.09);box-shadow:none}[data-theme=dark] .dropdown-item{color:#f5f5f7}[data-theme=dark] .dropdown-item:hover{background:#3a3a3c;color:#f5f5f7}[data-theme=dark] #hamburger span{background:#f5f5f7}[data-theme=dark] .brand-name .n1{color:#fff}[data-theme=dark] .brand-name .n2{color:#16ad93}[data-theme=dark] .ecm-n1{color:#fff}[data-theme=dark] .ecm-n2{color:#16ad93}[data-theme=dark] .app-logo-img{border:none}[data-theme=dark] .brand-sub{color:#636366}[data-theme=dark] .app-header-actions button{color:#aeaeb2}[data-theme=dark] .app-header-actions button:hover{color:#f5f5f7}[data-theme=dark] .empty-state h3{color:#f5f5f7}[data-theme=dark] .empty-state p{color:#d1d1d6}[data-theme=dark] .empty-state svg{color:rgba(255,255,255,.09)}[data-theme=dark] .form-label{color:#d1d1d6}[data-theme=dark] .form-helper{color:#aeaeb2}[data-theme=dark] .form-error{color:#ff8a80}[data-theme=dark] .page-title{color:#f5f5f7}[data-theme=dark] .page-subtitle{color:#d1d1d6}[data-theme=dark] h1,[data-theme=dark] h2,[data-theme=dark] h3,[data-theme=dark] h4{color:#f5f5f7}[data-theme=dark] .notification{background:#2c2c2e;border-color:rgba(255,255,255,.09);color:#f5f5f7}[data-theme=dark] .tt-cell{border-left-color:rgba(255,255,255,.07);border-top-color:rgba(255,255,255,.07)}[data-theme=dark] .tt-cell-empty{border-left-color:rgba(255,255,255,.07);border-top-color:rgba(255,255,255,.07)}[data-theme=dark] .tt-cell:hover .tt-cell-inner{background:rgba(139,174,224,.09)!important}[data-theme=dark] .tt-cell:hover::after{border-color:rgba(139,174,224,.25)}[data-theme=dark] .tt-cell-subject{color:inherit}[data-theme=dark] .tt-cell-teacher{color:#aeaeb2;opacity:1;font-size:9px}[data-theme=dark] .tt-cell-room{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.1);color:#aeaeb2}[data-theme=dark] .tt-hdr-period{color:#d1d1d6}[data-theme=dark] .tt-hdr-time{color:rgba(255,255,255,.45)}[data-theme=dark] .tt-cell-special .tt-cell-inner{opacity:1}[data-theme=dark] .tt-cell-special-name{opacity:1;font-weight:700;letter-spacing:.01em}[data-theme=dark] .tt-cell-special-sub{color:#aeaeb2;opacity:1}[data-theme=dark] .tt-wrap{border-color:rgba(255,255,255,.07);box-shadow:0 0 0 1px rgba(255,255,255,.07)}.tt-legend{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px;padding-top:14px;border-top:1px solid var(--color-border)}.tt-legend-item{display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:600;color:var(--color-text-secondary);padding:3px 8px;border-radius:99px;border:1px solid var(--color-border);background:var(--color-surface-2)}.tt-legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}[data-theme=dark] .tt-legend{border-top-color:rgba(255,255,255,.1)}[data-theme=dark] .tt-legend-item{color:#d1d1d6;border-color:rgba(255,255,255,.1);background:#3a3a3c}@media (max-width:768px){#hamburger{display:flex}.app-sidebar{top:0;width:min(300px,85vw);transition:transform .26s cubic-bezier(.25, .46, .45, .94);will-change:transform}.app-sidebar.open{transform:translateX(0)}.app-main{margin-left:0;padding:16px 14px}.stats-grid{grid-template-columns:1fr 1fr}.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}.timetable td,.timetable th{min-width:90px;padding:6px 4px;font-size:10px}.page-header{flex-direction:column;align-items:flex-start;gap:10px}.page-header .btn{width:100%;justify-content:center}}@media (max-width:480px){.stats-grid{grid-template-columns:1fr 1fr}.app-main{padding:12px 10px}}@media (max-width:560px){.tt-card-toolbar{flex-wrap:wrap;row-gap:10px}.tt-card-title{flex-wrap:wrap}.tt-card-actions{width:100%;flex-wrap:wrap}.tt-card-actions .btn{flex:1 1 auto;justify-content:center;padding:6px 8px;font-size:12px}}@media (max-width:380px){.tt-card-actions .btn{flex-basis:calc(50% - 3px)}}.tt-wrap{border:1px solid var(--color-border);border-radius:10px;overflow:hidden}.tt-table{width:100%;border-collapse:collapse;min-width:700px;table-layout:fixed;font-family:var(--font-family)}.tt-hdr-row th{background:var(--tt-primary,#1a3a6b);color:#fff;padding:10px 6px;font-size:10px;font-weight:700;text-align:center;letter-spacing:.04em;text-transform:uppercase;border-left:1px solid rgba(255,255,255,.1);white-space:normal;word-break:break-word;position:sticky;top:0;z-index:8;vertical-align:middle}.tt-hdr-row th:first-child{border-left:none;position:sticky;left:0;z-index:12;min-width:52px;width:52px;border-right:1px solid rgba(255,255,255,.15)}.tt-hdr-period{font-size:11px;font-weight:700;line-height:1.3}.tt-hdr-time{font-size:9px;font-weight:400;opacity:.7;margin-top:2px;white-space:nowrap}.tt-day-cell{position:sticky;left:0;z-index:5;background:var(--tt-primary,#1a3a6b);color:#fff;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;text-align:center;padding:0;width:52px;min-width:52px;border-right:1px solid rgba(255,255,255,.15);border-top:1px solid rgba(255,255,255,.08);vertical-align:middle}.tt-day-inner{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px 4px;min-height:80px}.tt-day-abbr{font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.tt-day-full{display:none}.tt-cell{padding:0;border-left:1px solid var(--color-border-light);border-top:1px solid var(--color-border-light);min-width:100px;vertical-align:middle;cursor:pointer;transition:background .12s;position:relative}.tt-cell:hover .tt-cell-inner{background:var(--color-primary-faint)!important}.tt-cell::after{content:'';position:absolute;inset:0;border:1.5px solid transparent;pointer-events:none;transition:border-color .12s}.tt-cell:hover::after{border-color:var(--color-primary-faint)}tr[data-row=even] .tt-cell{background:var(--color-white)}tr[data-row=odd] .tt-cell{background:var(--color-surface-2)}.tt-cell-inner{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:8px 5px;min-height:80px;height:100%;box-sizing:border-box;transition:background .12s}.tt-cell-subject{font-size:11px;font-weight:700;color:var(--color-primary);line-height:1.35;text-align:center;overflow-wrap:break-word;white-space:normal;width:100%}.tt-cell-teacher{font-size:9px;font-weight:400;color:var(--color-text-muted);line-height:1.2;white-space:normal;overflow-wrap:break-word;text-align:center;width:100%}.tt-cell-room{display:inline-flex;align-items:center;font-size:9px;font-weight:600;color:var(--color-text-muted);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:99px;padding:1px 7px;margin-top:2px;line-height:1.4;letter-spacing:.01em}.tt-cell-special{border-left:2px solid;background:0 0!important;cursor:default}.tt-cell-special .tt-cell-inner{min-height:80px}.tt-cell-special-name{font-size:11px;font-weight:700;text-align:center;line-height:1.3}.tt-cell-special-sub{font-size:9px;opacity:.7;text-align:center}.tt-cell-empty{border-left:1px solid var(--color-border-light);border-top:1px solid var(--color-border-light);min-width:110px}.tt-theme-bar{margin-bottom:14px;padding:10px 14px 10px;background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:9px}.tt-theme-bar-top{display:flex;align-items:center;justify-content:space-between}.tt-theme-bar-toggle{cursor:pointer;user-select:none}.tt-theme-bar-toggle:hover .tt-theme-label{color:var(--color-text-secondary)}.tt-theme-bar-toggle:hover .tt-theme-hint{opacity:1}.tt-theme-bar-toggle:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:6px}.tt-theme-label{font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--color-text-muted);display:flex;align-items:center}.tt-theme-hint{font-size:10px;font-weight:600;color:var(--color-text-muted);opacity:0;letter-spacing:.03em}.tt-theme-active-name{font-size:11px;font-weight:600;border-radius:99px;padding:2px 10px;border:1px solid}.tt-theme-chevron{display:flex;align-items:center;color:var(--color-text-muted)}.tt-theme-chevron--open{transform:rotate(180deg)}.tt-theme-swatches{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.tt-theme-swatches--hidden{visibility:hidden;height:0;margin-top:0;overflow:hidden}.tt-theme-swatch{display:flex;align-items:center;gap:6px;padding:5px 12px 5px 8px;border-radius:7px;border:1px solid var(--color-border);background:var(--color-white);cursor:pointer;font-family:var(--font-family);white-space:nowrap;flex-shrink:0;box-shadow:none;outline:0}.tt-theme-swatch:hover{border-color:var(--color-border-hover);background:var(--color-surface-2)}.tt-theme-swatch.active{border-width:2px}.tt-swatch-lbl{font-size:11px;font-weight:500;color:var(--color-text-secondary)}.tt-theme-swatch.active .tt-swatch-lbl{font-weight:600}.tt-swatch-check{font-size:10px;font-weight:700;margin-left:2px}.tt-theme-dot{width:14px;height:14px;border-radius:50%;flex-shrink:0;box-shadow:none;border:1px solid rgba(0,0,0,.08)}.plain-swatch{border-style:dashed}.plain-swatch.active{border-style:solid}.tt-swatch-plain-preview{display:flex;flex-direction:column;gap:2px;width:14px;flex-shrink:0}.tt-swatch-line{display:block;height:3px;border-radius:1px;width:100%}.tt-swatch-edit{display:flex;align-items:center;justify-content:center;margin-left:2px;color:var(--color-text-muted);flex-shrink:0}.tt-swatch-edit:hover{color:var(--color-primary)}[data-theme=dark] .tt-theme-bar{background:#2c2c2e;border-color:rgba(255,255,255,.1)}[data-theme=dark] .tt-theme-label{color:#aeaeb2}[data-theme=dark] .tt-theme-hint{color:#aeaeb2}[data-theme=dark] .tt-theme-chevron{color:#aeaeb2}[data-theme=dark] .tt-theme-active-name{border-color:rgba(139,174,224,.45)!important}[data-theme=dark] .tt-theme-swatch{background:#3a3a3c;border-color:rgba(255,255,255,.1)}[data-theme=dark] .tt-theme-swatch:hover{border-color:rgba(139,174,224,.45);background:#444446}[data-theme=dark] .tt-theme-swatch.active{border-width:2px}[data-theme=dark] .tt-theme-dot{border-color:rgba(255,255,255,.1)}[data-theme=dark] .tt-swatch-lbl{color:#d1d1d6}[data-theme=dark] .tt-theme-swatch.active .tt-swatch-lbl{color:#f5f5f7;font-weight:600}[data-theme=dark] .plain-swatch{border-color:rgba(139,174,224,.45)}table tr:hover td{background:var(--color-surface-2)}[data-theme=dark] table tr:hover td{background:#3a3a3c}.conflict-item:hover{border-color:var(--color-primary)!important;background:var(--color-surface-2)!important}[data-theme=dark] .conflict-item:hover{border-color:var(--color-primary)!important;background:#3a3a3c!important}.form-input{border-radius:10px;height:clamp(42px,6.5vh,52px);font-size:.875rem;background:#fff;border:1.5px solid #d4e8e6;color:#071830;transition:border-color .18s;font-family:Inter,system-ui,sans-serif;box-shadow:none;padding:0 .75rem;-webkit-appearance:none;appearance:none}.form-input:focus{border-color:#0d9488;border-radius:10px;outline:0;box-shadow:none;-webkit-appearance:none}.l-panel-inner .form-input:focus{border-color:#0d9488;background:#fff;box-shadow:none;outline:0}.l-panel-inner .form-input::placeholder{color:#b0bec5;font-size:.78rem;font-weight:400;opacity:1;transition:opacity .15s ease}.l-panel-inner .form-input:focus::placeholder{opacity:0}.l-panel-inner .form-input:-webkit-autofill,.l-panel-inner .form-input:-webkit-autofill:focus,.l-panel-inner .form-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px rgba(13,148,136,.06) inset!important;box-shadow:0 0 0 1000px rgba(13,148,136,.06) inset!important;-webkit-text-fill-color:#071830!important;border-color:#0d9488!important;transition:background-color 5000s ease-in-out 0s}.dg-input:-webkit-autofill,.dg-input:-webkit-autofill:focus,.dg-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px rgba(13,148,136,.06) inset!important;box-shadow:0 0 0 1000px rgba(13,148,136,.06) inset!important;-webkit-text-fill-color:#071830!important;border-color:#0d9488!important;transition:background-color 5000s ease-in-out 0s}.l-panel-inner .form-err.form-shake{animation:formShake .45s cubic-bezier(.36,.07,.19,.97)}#auth-mfa .mfa-otp-box{flex:1;min-width:0;height:54px;text-align:center;font-size:1.5rem;font-weight:700;border:2px solid var(--border-2);border-radius:10px;background:var(--surface-2);color:var(--t1);transition:border-color .15s,background .15s;caret-color:transparent}#auth-mfa .mfa-otp-box:focus{outline:0;border-color:var(--brand);background:var(--surface)}#auth-mfa .mfa-otp-box.filled{border-color:var(--brand-teal);background:var(--brand-teal-lt)}.l-panel-inner .fi-wrap:focus-within .fi-icon{color:#0d9488}.l-panel-inner .form-label{font-size:.7rem;font-weight:600;color:var(--t2);margin-bottom:.4rem;letter-spacing:.02em;font-family:Inter,sans-serif;text-transform:uppercase}.pw-toggle{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);width:36px;height:36px;padding:0;flex-shrink:0;background:0 0;border:none;border-radius:8px;color:#9ca3af;cursor:pointer;z-index:10;display:flex;align-items:center;justify-content:center;touch-action:manipulation;-webkit-tap-highlight-color:transparent;user-select:none;transition:background .15s,color .15s,opacity .1s}.pw-toggle:hover{background:rgba(13,148,136,.08);color:#0d9488}.pw-toggle:active{opacity:.55}.pw-toggle .eye-off,.pw-toggle .eye-on{position:absolute;width:16px;height:16px;pointer-events:none;flex-shrink:0;transition:opacity .18s ease;display:block!important}.pw-toggle .eye-on{opacity:1}.pw-toggle .eye-off{opacity:0}.pw-toggle.pw-shown .eye-on{opacity:0}.pw-toggle.pw-shown .eye-off{opacity:1}.l-btn-primary{width:100%;height:clamp(44px,6.5vh,54px);display:flex;align-items:center;justify-content:center;gap:.6rem;margin-top:.5rem;background:linear-gradient(135deg,#0d9488 0,#0a7a70 100%);color:#fff;border:none;border-radius:10px;font-size:.9rem;font-weight:600;letter-spacing:.01em;cursor:pointer;transition:background .15s,transform .08s cubic-bezier(.2,0,.4,1);touch-action:manipulation;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,sans-serif;position:relative;overflow:hidden}.l-btn-primary::after{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.08) 0,transparent 55%);pointer-events:none}.l-btn-primary:hover:not(:disabled){background:linear-gradient(135deg,#0f9e91 0,#0a7a70 100%)}.l-btn-primary:active:not(:disabled){transform:scale(.98)}.l-btn-primary:disabled{opacity:.5;cursor:not-allowed}.l-btn-primary svg{flex-shrink:0;transition:transform .22s}.l-btn-primary:hover:not(:disabled) svg{transform:translateX(4px)}.l-btn-outline{width:100%;height:clamp(40px,6vh,48px);display:flex;align-items:center;justify-content:center;gap:.55rem;background:0 0;border:1.5px solid #b0ccc9;border-radius:10px;font-size:.86rem;font-weight:500;color:#0a2040;cursor:pointer;transition:border-color .18s,background .18s,color .18s;touch-action:manipulation;font-family:Inter,system-ui,sans-serif}.l-btn-outline svg{width:14px;height:14px;flex-shrink:0}.l-btn-outline:hover{border-color:#0d9488;background:rgba(13,148,136,.05);color:#0d9488}.l-btn-demo{width:100%;height:clamp(38px,5.5vh,46px);display:flex;align-items:center;justify-content:center;gap:.55rem;background:rgba(13,148,136,.09);border:1.5px solid rgba(13,148,136,.32);border-radius:10px;font-size:.84rem;font-weight:500;color:#0d9488;cursor:pointer;transition:background .18s,border-color .18s;touch-action:manipulation;font-family:Inter,sans-serif;margin-top:.75rem}.l-btn-demo svg{flex-shrink:0;color:#0d9488}.l-demo{display:flex;align-items:center;gap:.52rem;background:rgba(13,148,136,.05);border:1px solid rgba(13,148,136,.15);border-radius:10px;padding:.65rem .9rem;font-size:.72rem;color:#4a7a76;margin-top:1rem;font-family:Inter,sans-serif}.l-demo svg{flex-shrink:0;color:#0d9488}.l-demo strong{color:#071830}.l-divider{display:flex;align-items:center;gap:.75rem;margin:clamp(.6rem,2vh,1.4rem) 0}.l-divider::before{content:'';flex:1;height:1px;background:linear-gradient(to right,transparent 0,#d4e8e6 100%)}.l-divider::after{content:'';flex:1;height:1px;background:linear-gradient(to left,transparent 0,#d4e8e6 100%)}.l-divider span{font-size:.68rem;color:#6b7280;white-space:nowrap;font-weight:500;font-family:Inter,sans-serif}select.filter-select,select.form-input{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;pointer-events:none!important}.edu-sel-wrap{position:relative;display:inline-flex;width:auto}.form-field .edu-sel-wrap,.form-group .edu-sel-wrap{width:100%;display:flex}.filter-row .edu-sel-wrap{flex:1 1 140px;min-width:120px;max-width:220px;display:flex}.edu-sel-trigger{flex:1;width:100%;display:flex;align-items:center;gap:.55rem;padding:0 .875rem;background:var(--surface);border:1.5px solid var(--border-2);border-radius:var(--radius);cursor:pointer;user-select:none;font-family:inherit;font-size:.85rem;color:var(--t1);text-align:left;transition:border-color .16s,background .16s,box-shadow .16s;box-sizing:border-box;outline:0;-webkit-tap-highlight-color:transparent;touch-action:manipulation;min-height:42px}.edu-sel-wrap.edu-sel--filter .edu-sel-trigger,.filter-row .edu-sel-trigger{min-height:38px;font-size:.82rem}.edu-sel-trigger:hover:not(:disabled):not(.edu-sel--open){border-color:var(--brand)}.edu-sel-trigger.edu-sel--open{border-color:var(--brand-teal);background:var(--surface);outline:0;box-shadow:none}.edu-sel-trigger:focus-visible{border-color:var(--brand-teal);outline:0;box-shadow:none}.edu-sel-trigger:disabled{opacity:.55;cursor:not-allowed}.edu-sel-wrap.edu-sel--error .edu-sel-trigger{border-color:var(--danger)}.edu-sel-icon{color:var(--t4);flex-shrink:0;pointer-events:none;transition:color .16s;width:14px;height:14px;display:flex;align-items:center;justify-content:center}.edu-sel-trigger.edu-sel--open .edu-sel-icon{color:var(--brand-teal)}.edu-sel-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--t1)}.edu-sel-label.edu-sel--placeholder{color:var(--t4);font-weight:400}.edu-sel-chevron{flex-shrink:0;color:var(--t4);transition:transform .2s cubic-bezier(.22,1,.36,1),color .16s;pointer-events:none;width:14px;height:14px}.edu-sel-trigger.edu-sel--open .edu-sel-chevron{transform:rotate(180deg);color:var(--brand-teal)}.edu-sel-panel{position:fixed;background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:0 0 0 1px rgba(7,24,48,.04),0 4px 10px rgba(7,24,48,.07),0 14px 36px rgba(7,24,48,.13);z-index:9200;overflow:hidden;display:none;min-width:180px}.edu-sel-panel.edu-sel--visible{display:block;animation:eduSelIn .14s cubic-bezier(.22,1,.36,1) both}.edu-sel-panel.edu-sel--up{animation:eduSelInUp .14s cubic-bezier(.22,1,.36,1) both}@keyframes eduSelIn{from{opacity:0;transform:translateY(-5px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes eduSelInUp{from{opacity:0;transform:translateY(5px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.edu-sel-search-row{display:flex;align-items:center;gap:.45rem;padding:.6rem .85rem;border-bottom:1px solid var(--border);background:var(--surface-2)}.edu-sel-search-ic{color:var(--t4);flex-shrink:0;pointer-events:none}.edu-sel-search-input{flex:1;border:none;outline:0;background:0 0;font-size:.82rem;color:var(--t1);font-family:inherit;letter-spacing:.01em}.edu-sel-search-input::placeholder{color:var(--t4)}.edu-sel-list{max-height:220px;overflow-y:auto;padding:.3rem 0;overscroll-behavior:contain}.edu-sel-list::-webkit-scrollbar{width:4px}.edu-sel-list::-webkit-scrollbar-track{background:0 0}.edu-sel-list::-webkit-scrollbar-thumb{background:var(--border-2);border-radius:4px}.edu-sel-option{display:flex;align-items:center;gap:.55rem;padding:.56rem .85rem;font-size:.825rem;font-weight:400;color:var(--t2);cursor:pointer;transition:background .08s;border-left:2.5px solid transparent;user-select:none;-webkit-tap-highlight-color:transparent}.edu-sel-option:hover{background:var(--brand-teal-lt);color:var(--brand-teal);border-left-color:var(--brand-teal)}.edu-sel-option.edu-sel--selected{background:var(--brand-teal-lt);color:var(--brand-teal);font-weight:600;border-left-color:var(--brand-teal)}.edu-sel-option.edu-sel--focused{background:var(--brand-teal-lt);color:var(--brand-teal);border-left-color:var(--brand-teal)}.edu-sel-option[aria-disabled=true]{opacity:.45;cursor:default;pointer-events:none}.edu-sel-empty{padding:1.2rem;text-align:center;font-size:.75rem;color:var(--t4);line-height:1.6}.l-panel-inner .edu-sel-trigger{border-radius:10px;min-height:clamp(42px,6.5vh,52px);font-size:.875rem;background:#fff;border:1.5px solid #d4e8e6;color:#071830}.l-panel-inner .edu-sel-trigger.edu-sel--open,.l-panel-inner .edu-sel-trigger:focus-visible{border-color:#0d9488;box-shadow:none}@media (max-width:768px){.ge-selectors .edu-sel-wrap{width:100%}.ge-selectors .edu-sel-trigger{min-height:44px}}@media (max-width:520px){.filter-row .edu-sel-wrap{flex:1 1 calc(50% - .2rem);min-width:0}}[data-theme=dark] .edu-sel-option{color:var(--t2)!important}[data-theme=dark] .form-input:focus{border-color:var(--brand-teal)!important}[data-theme=dark] .form-input:hover:not(:focus):not(:disabled){border-color:rgba(22,173,147,.4)!important}[data-theme=dark] .edu-sel-panel{background:var(--color-white);border-color:var(--color-border)}[data-theme=dark] .edu-sel-trigger{background:var(--color-white);border-color:var(--color-border);color:var(--color-text)}[data-theme=dark] .edu-sel-search-row{background:var(--color-surface-2);border-color:var(--color-border)}[data-theme=dark] .edu-sel-search-input{color:var(--color-text)}@media (max-width:600px){.page-header{flex-direction:column;align-items:stretch;gap:10px;margin-bottom:16px}.page-header>div{flex:1}.page-header>a.btn,.page-header>button{width:100%;justify-content:center;min-height:44px;font-size:14px}.card-body>div[style*="display:flex"][style*=flex-wrap]{flex-direction:column!important;align-items:stretch!important}.card-body>div[style*="display:flex"][style*=flex-wrap]>button,.card-body>div[style*="display:flex"][style*=flex-wrap]>div{width:100%!important;min-width:0!important;flex:unset!important}.card-body>div[style*="display:flex"][style*=flex-wrap]>button{min-height:44px;font-size:14px}.card>div[style*=overflow-x]{overflow-x:unset!important}.card table{border-collapse:collapse;width:100%}.card table thead{display:none}.card table tbody{display:flex;flex-direction:column;gap:0}.card table tbody tr{display:flex;flex-direction:column;padding:12px 14px;border-bottom:1px solid var(--color-border)!important;gap:4px;position:relative}.card table tbody tr:last-child{border-bottom:none!important}.card table tbody td{display:block!important;width:100%!important;padding:1px 0!important;border:none!important;font-size:13px;max-width:unset!important;text-align:left!important}.card table tbody td:first-child{font-size:14px!important;font-weight:700!important;color:var(--color-text)!important;margin-bottom:4px;padding-right:70px!important}.card table tbody td:not(:first-child):not(:last-child){color:var(--color-text-muted);font-size:12px!important;line-height:1.5}.card table tbody td:last-child{position:absolute!important;top:10px;right:10px;width:auto!important;padding:0!important}.card table tbody td:last-child>div{flex-direction:row!important;gap:2px!important;justify-content:flex-end!important}.card table tbody td:last-child button{width:34px!important;height:34px!important;padding:0!important;border-radius:8px!important;display:flex!important;align-items:center!important;justify-content:center!important;background:var(--color-surface-2)!important;border:1px solid var(--color-border)!important}.card table tbody td:last-child button:active{opacity:.6}.card table tbody td .badge{display:inline-flex}.card table tbody td div[style*="white-space:nowrap"][style*="overflow:hidden"]{white-space:normal!important;overflow:visible!important;text-overflow:clip!important;word-break:break-word!important}div[style*="padding:10px 0;border-bottom"]{padding:11px 0!important;gap:10px}div[style*="justify-content:space-between"][style*="flex-wrap:wrap"]{flex-wrap:wrap!important;gap:8px!important}.card-header{display:flex!important;align-items:center!important;justify-content:space-between!important;gap:8px!important;padding:12px 14px!important;flex-wrap:wrap}.card-header .card-title{font-size:13px!important}.card table tbody td>div[style*="justify-content:center"]{justify-content:flex-start!important;gap:8px}.empty-state{padding:36px 20px}.empty-state h3{font-size:15px}.empty-state p{font-size:13px}.empty-state br{display:none}.page-title{font-size:18px!important}.card-body>div[style*="display:flex"][style*="align-items:flex-end"]{flex-direction:column!important;align-items:stretch!important;gap:12px!important}.card-body>div[style*="display:flex"][style*="align-items:flex-end"]>div{width:100%!important;min-width:0!important;flex:unset!important}#btn-load-classes,#btn-load-level{width:100%!important;min-height:44px;margin-top:4px}}@media (max-width:768px){button[style*="background:none"]{min-width:36px;min-height:36px}}@media (max-width:600px){[data-theme=dark] .card table tbody td:last-child button{background:var(--color-surface-light)!important;border-color:var(--color-border)!important}}.slot-edit-modal{max-width:460px;width:100%;border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.sem-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px 12px;border-bottom:1px solid var(--color-border);gap:10px;flex-shrink:0}.sem-header-left{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.sem-day-badge{background:var(--color-primary);color:#fff;border-radius:6px;padding:5px 10px;font-size:11px;font-weight:700;letter-spacing:.07em;white-space:nowrap;flex-shrink:0}.sem-header-text{min-width:0}.sem-time{font-size:14px;font-weight:700;color:var(--color-text);line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sem-sep{color:var(--color-text-muted);font-weight:400}.sem-status{font-size:11px;color:var(--color-text-muted);margin-top:2px;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sem-close{width:28px;height:28px;border-radius:6px;background:0 0;border:none;cursor:pointer;color:var(--color-text-muted);display:flex;align-items:center;justify-content:center;transition:background var(--transition-fast),color var(--transition-fast);flex-shrink:0}.sem-close:hover{background:var(--color-surface-2);color:var(--color-text)}.sem-body{padding:14px 18px 10px}.sem-section{margin-bottom:12px}.sem-section:last-child{margin-bottom:0}.sem-section--dimmed{opacity:.4;pointer-events:none;transition:opacity .2s ease}.sem-section-label{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--color-text-light);margin-bottom:7px;user-select:none}.sem-divider{height:1px;background:var(--color-border-light);margin:10px 0}.slot-subj-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:5px}.slot-subj-btn{display:flex;align-items:center;justify-content:center;padding:8px 10px;min-height:34px;border:1.5px solid var(--color-border);border-radius:7px;background:var(--color-white);color:var(--color-text-secondary);font-size:12px;font-weight:500;font-family:var(--font-family);line-height:1.3;text-align:center;cursor:pointer;transition:border-color .13s ease,background .13s ease,color .13s ease,transform 80ms ease;-webkit-tap-highlight-color:transparent;touch-action:manipulation;word-break:break-word}.slot-subj-btn:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-faint)}.slot-subj-btn:active{transform:scale(.96)}.slot-subj-btn--active{background:var(--color-primary)!important;border-color:var(--color-primary)!important;color:#fff!important;font-weight:600}.slot-pills{display:flex;flex-wrap:wrap;gap:5px;line-height:1}.slot-pill{border:1.5px solid var(--color-border);border-radius:9999px;padding:5px 12px;font-size:12px;font-weight:500;font-family:var(--font-family);cursor:pointer;transition:border-color .15s ease,background .15s ease,color .15s ease,transform 80ms ease;background:var(--color-white);color:var(--color-text-secondary);line-height:1.4;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;white-space:nowrap}.slot-pill:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-faint)}.slot-pill:active{transform:scale(.95)}.slot-pill--active{background:var(--color-primary)!important;border-color:var(--color-primary)!important;color:#fff!important;font-weight:600}.slot-pill--conflict{border-color:var(--color-warning-border)!important;color:var(--color-warning)!important;background:var(--color-warning-light)!important;position:relative}.slot-pill--conflict::after{content:'!';font-size:9px;font-weight:800;background:var(--color-warning);color:#fff;border-radius:99px;width:13px;height:13px;display:inline-flex;align-items:center;justify-content:center;margin-left:5px;vertical-align:middle;line-height:1}.slot-pills-empty,.slot-pills-noresult{font-size:12px;color:var(--color-text-light);font-style:italic;padding:2px 0}.slot-conflict-banner{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;background:var(--color-warning-light);border:1px solid var(--color-warning-border);border-radius:7px;margin-bottom:14px;font-size:12px;color:var(--color-warning-text);line-height:1.45}.slot-conflict-banner svg{flex-shrink:0;margin-top:1px}.slot-conflict-banner.is-error{background:var(--color-error-light);border-color:var(--color-error-border);color:var(--color-error-text)}.sem-footer{display:flex;align-items:center;justify-content:space-between;padding:10px 18px;border-top:1px solid var(--color-border);gap:8px;flex-shrink:0}.sem-footer-actions{display:flex;gap:8px;margin-left:auto}.sem-remove-btn{display:inline-flex;align-items:center;gap:5px;padding:0 10px;height:34px;border-radius:6px;border:1px solid transparent;background:0 0;color:var(--color-error);font-size:13px;font-weight:500;font-family:var(--font-family);cursor:pointer;transition:background .15s ease,border-color .15s ease}.sem-remove-btn:hover{background:var(--color-error-light);border-color:var(--color-error-border)}[data-theme=dark] .sem-day-badge{background:#254c88}[data-theme=dark] .sem-time{color:#fff}[data-theme=dark] .sem-status{color:var(--color-text-muted)}[data-theme=dark] .slot-subj-btn{background:var(--color-surface-2);border-color:var(--color-border);color:var(--color-text-muted)}[data-theme=dark] .slot-subj-btn:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-faint)}[data-theme=dark] .slot-subj-btn--active{background:#254c88!important;border-color:#254c88!important;color:#fff!important}[data-theme=dark] .slot-pill{background:var(--color-surface-2);border-color:var(--color-border);color:var(--color-text-muted)}[data-theme=dark] .slot-pill:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-faint)}[data-theme=dark] .slot-pill--active{background:#254c88!important;border-color:#254c88!important;color:#fff!important}[data-theme=dark] .slot-pill--conflict{border-color:rgba(255,159,10,.4)!important;color:var(--color-warning)!important;background:rgba(255,159,10,.12)!important}[data-theme=dark] .slot-conflict-banner{background:rgba(255,159,10,.1);border-color:rgba(255,159,10,.3);color:var(--color-warning-text)}[data-theme=dark] .slot-conflict-banner.is-error{background:rgba(255,69,58,.1);border-color:rgba(255,69,58,.3);color:var(--color-error-text)}[data-theme=dark] .sem-remove-btn:hover{background:rgba(255,69,58,.1);border-color:rgba(255,69,58,.28)}@media (max-width:480px){.slot-edit-modal{max-width:100%;border-radius:14px}.sem-header{padding:12px 14px 10px}.sem-body{padding:12px 14px 8px}.sem-footer{padding:9px 14px}.sem-time{font-size:13px}.slot-subj-grid{grid-template-columns:repeat(2,1fr);gap:4px}.slot-subj-btn{font-size:11.5px;padding:7px 8px;min-height:32px}.slot-pill{font-size:11.5px;padding:5px 10px}}@media (max-width:360px){.slot-subj-btn{font-size:11px;padding:6px 6px;min-height:30px}}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth;scrollbar-gutter:stable}*,::after,::before{-webkit-tap-highlight-color:transparent;box-sizing:border-box}.app-main,.app-sidebar,.cmd-results-inner,.modal-body,.table-wrap{-webkit-overflow-scrolling:touch}.app-main{overscroll-behavior-y:auto}.app-sidebar{overscroll-behavior:contain}.modal-body{overscroll-behavior:contain}body.sidebar-open{overflow:hidden}:focus-visible{outline:2.5px solid var(--color-teal);outline-offset:2px;border-radius:inherit}:focus:not(:focus-visible){outline:0}@media (prefers-reduced-motion:reduce){*,::after,::before{animation:none!important;transition:none!important}}.btn{position:relative;transition:background var(--transition-fast),transform .14s cubic-bezier(.34, 1.56, .64, 1),box-shadow .14s ease,opacity .1s ease;will-change:transform;user-select:none}@media (hover:hover) and (pointer:fine){.btn:hover{transform:none;box-shadow:none}.btn-primary:hover{box-shadow:none}.btn-teal:hover{box-shadow:none}.btn-danger:hover{box-shadow:none}}.btn:active{transform:translateY(1px) scale(.97);box-shadow:none;opacity:.88;transition:transform 60ms ease,box-shadow 60ms ease,opacity 60ms ease}.card,.kpi-card,.stat-card{transition:border-color var(--transition-fast);will-change:auto}@media (hover:hover) and (pointer:fine){.card:hover,.kpi-card:hover,.stat-card:hover{transform:none;box-shadow:none;border-color:#b0b0b0}}.card:active,.kpi-card:active,.stat-card:active{transform:none;box-shadow:none;opacity:1}.app-sidebar-item{transition:background .1s ease,color .1s ease,padding .28s cubic-bezier(.4, 0, .2, 1),margin .28s cubic-bezier(.4, 0, .2, 1),gap .28s cubic-bezier(.4, 0, .2, 1);will-change:auto}@media (hover:hover) and (pointer:fine){.app-sidebar-item:hover{transform:none}}.app-sidebar-item:active{opacity:.75;transform:scale(.97);transition:opacity 60ms ease,transform 60ms ease}.app-header-actions button{transition:background var(--transition-fast),color var(--transition-fast),transform .12s cubic-bezier(.34, 1.56, .64, 1);will-change:transform}@media (hover:hover) and (pointer:fine){.app-header-actions button:hover{transform:none}}.app-header-actions button:active{transform:scale(.88);opacity:.7;transition:transform 50ms ease}#theme-toggle{perspective:none;transform-style:flat}#theme-toggle:active,#theme-toggle:focus,#theme-toggle:focus-visible,#theme-toggle:hover{background:0 0!important;transform:none!important;transition:none!important;outline:0!important;box-shadow:none!important;border-color:transparent!important}.app-header-actions button:focus,.app-header-actions button:focus-visible{outline:0;box-shadow:none;background:0 0}@media (max-width:768px){#hamburger{position:relative;width:36px;height:36px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0;background:0 0;border:none;cursor:pointer;padding:0;border-radius:8px;transition:background .14s ease;-webkit-tap-highlight-color:transparent}#hamburger:hover{background:var(--color-surface-2)}#hamburger span{display:block;width:20px;height:2px;background:var(--color-text);border-radius:99px;position:absolute;left:50%;transform-origin:center;transition:transform .15s cubic-bezier(.4, 0, .2, 1),opacity .12s ease,top .15s cubic-bezier(.4, 0, .2, 1);margin-left:-10px}#hamburger span:first-child{top:10px}#hamburger span:nth-child(2){top:17px;opacity:1}#hamburger span:nth-child(3){top:24px}#hamburger.open span:first-child{top:17px;transform:rotate(45deg)}#hamburger.open span:nth-child(2){opacity:0;transform:scaleX(0)}#hamburger.open span:nth-child(3){top:17px;transform:rotate(-45deg)}#hamburger:active{transform:scale(.88);transition:transform 60ms ease}}.tt-cell{transition:background .12s ease,transform 80ms cubic-bezier(.34, 1.56, .64, 1);will-change:transform}.tt-cell:active{transform:scale(.96)}[data-tip]{position:relative}[data-tip]::after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%) translateY(-4px);background:var(--color-white);color:var(--color-text);border:1px solid var(--color-border);box-shadow:0 4px 16px rgba(15,23,42,.12);font-size:11px;font-weight:500;padding:5px 10px;border-radius:7px;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .14s ease,transform .14s cubic-bezier(.34, 1.56, .64, 1);z-index:var(--z-tooltip);letter-spacing:.01em}[data-tip]::before{content:'';position:absolute;top:calc(100% + 3px);left:50%;transform:translateX(-50%) translateY(-4px);border:5px solid transparent;border-bottom-color:var(--color-white);filter:drop-shadow(0 -1px 0 var(--color-border));opacity:0;transition:opacity .14s ease,transform .14s ease;pointer-events:none;z-index:var(--z-tooltip)}@media (hover:hover) and (pointer:fine){[data-tip]:hover::after,[data-tip]:hover::before{opacity:1;transform:translateX(-50%) translateY(0)}}[data-tip]:focus-visible::after,[data-tip]:focus-visible::before{opacity:1;transform:translateX(-50%) translateY(0)}#page-container{contain:layout;isolation:isolate}@keyframes pageEnterForward{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}@keyframes pageEnterBack{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:translateX(0)}}@keyframes pageExitForward{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-16px)}}@keyframes pageExitBack{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(16px)}}#page-container[data-direction=forward]{animation:pageEnterForward .26s cubic-bezier(.25,.46,.45,.94) both}#page-container[data-direction=back]{animation:pageEnterBack .26s cubic-bezier(.25,.46,.45,.94) both}#page-container.page-exit[data-direction=forward]{animation:pageExitForward .18s cubic-bezier(.25,.46,.45,.94) both}#page-container.page-exit[data-direction=back]{animation:pageExitBack .18s cubic-bezier(.25,.46,.45,.94) both}@media (max-width:768px){#page-container.page-exit[data-direction=back],#page-container.page-exit[data-direction=forward],#page-container[data-direction=back],#page-container[data-direction=forward]{animation:none!important;opacity:1!important;transform:none!important}}body.sidebar-collapsed .app-sidebar{width:var(--sidebar-rail-width)}body.sidebar-collapsed .app-main{margin-left:var(--sidebar-rail-width)}body.sidebar-collapsed .app-sidebar-nav{padding-left:0;padding-right:0}body.sidebar-collapsed .app-sidebar-item{padding:0 13px;margin:0 7px 4px;width:auto;gap:0;border-radius:8px}body.sidebar-collapsed .app-sidebar-item span{opacity:0;max-width:0;overflow:hidden;pointer-events:none}body.sidebar-collapsed #conflicts-badge{display:none!important}body.sidebar-collapsed .app-sidebar-item:hover svg{opacity:1}body.sidebar-collapsed .app-sidebar-item.active svg{opacity:1}body.sidebar-collapsed .app-sidebar-item.active::before{left:50%;top:85%;width:4px;height:4px;border-radius:99px;transform:translateX(-50%) translateY(0)}.app-sidebar.sidebar-hover-open .app-sidebar-item{justify-content:flex-start;padding:0 14px;margin-left:0;margin-right:0;gap:12px}.app-sidebar.sidebar-hover-open .app-sidebar-nav{padding-left:8px;padding-right:8px}.app-sidebar.sidebar-hover-open .app-sidebar-item span{opacity:1;max-width:160px;pointer-events:auto}.app-sidebar.sidebar-hover-open #conflicts-badge{position:static;margin-left:auto;min-width:18px;width:auto;height:auto;padding:1px 6px;font-size:10px;line-height:16px;border-radius:99px}.app-sidebar.sidebar-hover-open .app-sidebar-item.active::before{left:0;top:50%;width:3px;height:18px;border-radius:0 3px 3px 0;transform:translateX(0) translateY(-50%)}.app-sidebar.sidebar-hover-open .app-sidebar-footer{padding:10px 14px}.app-sidebar.sidebar-hover-open .sidebar-footer-ai{opacity:1;max-width:160px;pointer-events:auto}.app-sidebar.sidebar-hover-open #sidebar-rail-tip,.app-sidebar.sidebar-hover-open~#sidebar-rail-tip{opacity:0!important;visibility:hidden!important}#sidebar-rail-tip{position:fixed;left:0;top:0;z-index:var(--z-tooltip);background:var(--color-white);color:var(--color-text);border:1px solid var(--color-border);box-shadow:0 4px 16px rgba(15,23,42,.12);font-size:12px;font-weight:500;font-family:var(--font-family);padding:5px 11px;border-radius:7px;white-space:nowrap;pointer-events:none;letter-spacing:.01em;opacity:0;transform:translateX(-4px);transition:opacity .13s ease,transform .13s cubic-bezier(.34, 1.56, .64, 1);line-height:1.4}#sidebar-rail-tip.visible{opacity:1;transform:translateX(0)}[data-theme=dark] #sidebar-rail-tip{background:#444446;color:#f5f5f7;border-color:rgba(139,174,224,.45);box-shadow:0 4px 16px rgba(0,0,0,.4)}[data-tip]::after,[data-tip]::before{display:none!important}#sidebar-rail-tip{display:none!important}#cmd-overlay{position:fixed;inset:0;z-index:9998;display:flex;align-items:flex-start;justify-content:center;padding-top:14vh;opacity:0;visibility:hidden;transition:opacity .18s ease,visibility .18s ease;background:rgba(0,0,0,.5)}#cmd-overlay.open{opacity:1;visibility:visible}#cmd-overlay.closing{opacity:0;visibility:visible;pointer-events:none}#cmd-overlay.closing #cmd-palette{transform:scale(.94) translateY(-10px)}#cmd-palette{width:min(560px,92vw);background:var(--color-white);border:1px solid var(--color-border);border-radius:16px;box-shadow:none;overflow:hidden;transform:scale(.94) translateY(-10px);transition:transform .22s cubic-bezier(.34, 1.56, .64, 1)}#cmd-overlay.open #cmd-palette{transform:scale(1) translateY(0)}[data-theme=dark] #cmd-palette{background:#2c2c2e;border-color:rgba(255,255,255,.09);box-shadow:none}#cmd-search-wrap{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--color-border)}[data-theme=dark] #cmd-search-wrap{border-color:rgba(255,255,255,.09)}#cmd-search-icon{color:var(--color-text-muted);flex-shrink:0}#cmd-search-icon svg{width:17px;height:17px}#cmd-input{flex:1;border:none;background:0 0;font-size:15px;font-weight:400;color:var(--color-text);outline:0;height:auto;padding:0;border-radius:0;box-shadow:none}#cmd-input::placeholder{color:var(--color-text-light);font-size:15px}#cmd-shortcut-hint{font-size:11px;color:var(--color-text-light);border:1px solid var(--color-border);border-radius:5px;padding:2px 7px;flex-shrink:0}[data-theme=dark] #cmd-shortcut-hint{border-color:rgba(255,255,255,.09)}.cmd-recent-dot{width:5px;height:5px;border-radius:50%;background:var(--color-teal);flex-shrink:0;margin-left:auto;opacity:.6}#cmd-results{max-height:360px;overflow-y:auto;padding:6px}.cmd-section-label{font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--color-text-light);padding:10px 10px 4px}.cmd-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:9px;cursor:pointer;transition:background 90ms ease;color:var(--color-text);font-size:13.5px}.cmd-item.cmd-active,.cmd-item:hover{background:var(--color-surface-2)}[data-theme=dark] .cmd-item.cmd-active,[data-theme=dark] .cmd-item:hover{background:#3a3a3c}.cmd-item svg{width:15px;height:15px;color:var(--color-text-muted);flex-shrink:0}.cmd-item-label{flex:1}.cmd-item-shortcut{font-size:10px;color:var(--color-text-light);border:1px solid var(--color-border);border-radius:4px;padding:1px 6px}[data-theme=dark] .cmd-item-shortcut{border-color:rgba(255,255,255,.09)}.cmd-item.cmd-active .cmd-item-shortcut{border-color:var(--color-border-hover)}#cmd-footer{display:flex;align-items:center;gap:16px;padding:8px 16px;border-top:1px solid var(--color-border);font-size:11px;color:var(--color-text-light)}[data-theme=dark] #cmd-footer{border-color:rgba(255,255,255,.09)}.cmd-key{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--color-border);border-radius:4px;padding:1px 6px;font-size:10px;color:var(--color-text-muted)}[data-theme=dark] .cmd-key{border-color:rgba(255,255,255,.09)}[data-theme=dark] .btn:hover{box-shadow:none}[data-theme=dark] .card:hover,[data-theme=dark] .kpi-card:hover,[data-theme=dark] .stat-card:hover{box-shadow:none}[data-theme=dark] .btn-primary:hover{box-shadow:none}[data-theme=dark] .btn-teal:hover{box-shadow:none}[data-theme=dark] .app-sidebar-item.active::before{box-shadow:none}@media (max-width:768px){.app-header{height:56px;background:rgba(255,255,255,.98);border-bottom:.5px solid rgba(0,0,0,.12);padding-left:max(16px,env(safe-area-inset-left));padding-right:max(16px,env(safe-area-inset-right));padding-top:env(safe-area-inset-top)}#hamburger-zone{width:auto;margin-right:4px}[data-theme=dark] .app-header{background:rgba(28,28,30,.98);border-bottom-color:rgba(255,255,255,.07)}.app-logo-img{width:28px;height:28px;border-radius:8px}.app-header-logo-zone{padding-left:2px}.app-header-logo-zone .app-logo-text{white-space:nowrap}.app-header-logo-zone .brand-name{font-size:13px}.app-header-logo-zone .brand-sub{font-size:8px}#hamburger{display:flex;order:-1}.app-sidebar{top:0;height:100dvh;width:min(300px,85vw);transform:translateX(-110%);border-radius:0;border-right:1px solid var(--color-border);transition:transform .26s cubic-bezier(.25, .46, .45, .94);padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);z-index:500;background:var(--color-white);will-change:transform}.app-sidebar.sidebar-dragging{transition:none}[data-theme=dark] .app-sidebar{background:#161618;border-right-color:rgba(255,255,255,.08)}.app-sidebar.open{transform:translateX(0)}#sidebar-overlay{display:block!important;position:fixed;inset:0;z-index:499;background:rgba(0,0,0,.45);opacity:0;transition:opacity .26s cubic-bezier(.25, .46, .45, .94);pointer-events:none}#sidebar-overlay.visible{opacity:1;pointer-events:all}#sidebar-overlay.sidebar-dragging{transition:none}.app-sidebar-item{min-height:44px;padding:10px 14px;border-radius:10px;margin-bottom:2px;font-size:15px}.app-sidebar-item svg{width:18px;height:18px}.app-main{margin-left:0;margin-top:56px;padding:20px 16px;min-height:calc(100dvh - 56px);padding-bottom:max(24px,calc(env(safe-area-inset-bottom) + 16px))}.card{border-radius:10px}.card-footer,.card-header{padding:14px 16px}.card-body{padding:16px}.page-title{font-size:20px}.page-header{margin-bottom:18px}.page-header .btn{width:100%;height:44px;font-size:15px;border-radius:8px;justify-content:center}.stats-grid{grid-template-columns:1fr 1fr;gap:10px}.stat-card{border-radius:10px}.btn{height:44px;border-radius:8px;font-size:15px;padding:0 18px}.btn-sm{height:34px;font-size:13px;padding:0 13px;border-radius:6px}input[type=color],input[type=date],input[type=email],input[type=number],input[type=password],input[type=text],input[type=time],select,textarea{height:44px;font-size:16px;border-radius:8px;padding:0 14px}textarea{height:auto;padding:12px 14px}.form-group{margin-bottom:14px}.form-label{font-size:13px;margin-bottom:6px}.modal-overlay{align-items:center;padding:16px}.modal{width:100%;max-width:420px;border-radius:16px;padding-bottom:0;max-height:88dvh;overflow-y:auto;animation:modalCenterIn .18s cubic-bezier(.22,1,.36,1) both;will-change:transform}.modal.modal-dragging{transition:none}@keyframes modalCenterIn{from{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-header{padding:16px 20px 12px}.modal-body{padding:16px 20px 20px}.modal-footer{padding:14px 20px;gap:10px;flex-direction:column-reverse}.modal-footer .btn{width:100%}.slot-edit-modal .modal-footer{flex-direction:column-reverse;align-items:stretch}.slot-edit-modal .modal-footer>div{display:contents}.slot-edit-modal .modal-footer .slot-clear-btn{margin-left:0;width:100%;justify-content:center}.slot-search-input{height:30px;font-size:12px}.slot-pill{padding:7px 14px;font-size:12.5px}.table-wrap{border-radius:10px}#notification-container{top:auto;bottom:max(24px,calc(env(safe-area-inset-bottom) + 16px));right:14px;left:14px;align-items:stretch}.notification{width:100%;border-radius:10px;font-size:14px}#theme-toggle{width:30px;height:30px;border-radius:6px}#cmd-trigger-btn{display:none}}#bottom-tab-bar{display:none}@media (max-width:430px){#hamburger{display:none!important}#app-sidebar{display:none!important}#sidebar-overlay{display:none!important;pointer-events:none!important}.app-header{height:52px;padding-top:env(safe-area-inset-top)}.app-main{margin-top:52px;padding:14px 12px;padding-bottom:max(82px,calc(env(safe-area-inset-bottom) + 74px))}#bottom-tab-bar{position:sticky;bottom:0;left:0;right:0;height:calc(60px + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom);background:rgba(250,250,252,.98);border-top:.5px solid rgba(0,0,0,.11);display:flex;align-items:center;justify-content:space-around;z-index:400;contain:style;box-sizing:border-box;overflow:visible}[data-theme=dark] #bottom-tab-bar{background:rgba(28,28,30,.98);border-top-color:rgba(255,255,255,.07)}.tab-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-width:44px;padding:0 8px;padding-top:4px;cursor:pointer;color:var(--color-text-light);transition:color .16s ease;user-select:none;text-decoration:none;position:relative;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.tab-icon-wrap{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:8px;transition:background .12s ease,transform .2s cubic-bezier(.34, 1.56, .64, 1);position:relative}.tab-icon-outline{display:block}.tab-icon-filled{display:none;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.tab-item:not(.active) .tab-icon-filled{display:none}.tab-item.active .tab-icon-outline{display:none}.tab-item.active .tab-icon-filled{display:flex}.tab-item svg{width:22px;height:22px;stroke-width:1.8}.tab-item span.tab-label{font-size:10px;font-weight:500;letter-spacing:.01em;display:block;position:relative}.tab-item span.tab-label::after{content:attr(data-label);display:block;font-weight:600;height:0;overflow:hidden;visibility:hidden;pointer-events:none}.tab-item.active{color:var(--color-primary)}[data-theme=dark] .tab-item.active{color:var(--color-teal)}.tab-item.active .tab-icon-wrap{background:var(--color-primary-faint);transform:translateY(-4px) scale(1.15)}[data-theme=dark] .tab-item.active .tab-icon-wrap{background:var(--color-teal-faint)}.tab-item.active span.tab-label{font-weight:600}.tab-badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;background:var(--color-error);color:#fff;font-size:9px;font-weight:700;border-radius:99px;display:flex;align-items:center;justify-content:center;padding:0 4px;border:1.5px solid rgba(250,250,252,.9);line-height:1}[data-theme=dark] .tab-badge{border-color:rgba(28,28,30,.9)}#tab-more-sheet{position:fixed;inset:0;z-index:600;display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none;opacity:0;transition:opacity .22s ease;touch-action:none}#tab-more-sheet.open{pointer-events:all;opacity:1}#tab-more-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.45);touch-action:none;overscroll-behavior:none}#tab-more-panel{position:relative;background:var(--color-white);border-radius:10px 10px 0 0;padding:0 0 max(20px,env(safe-area-inset-bottom)) 0;transform:translateY(100%);transition:transform .38s cubic-bezier(.32, .72, 0, 1);max-height:60dvh;overflow-y:auto;overscroll-behavior:contain;touch-action:pan-y}[data-theme=dark] #tab-more-panel{background:#1c1c1e}#tab-more-sheet.open #tab-more-panel{transform:translateY(0)}#tab-more-panel::before{content:'';display:block;width:36px;height:4px;border-radius:99px;background:rgba(0,0,0,.18);margin:10px auto 0}[data-theme=dark] #tab-more-panel::before{background:rgba(255,255,255,.2)}#tab-more-title{font-size:13px;font-weight:600;color:var(--color-text);padding:14px 20px 12px;border-bottom:.5px solid var(--color-border);margin-bottom:4px;letter-spacing:-.01em}[data-theme=dark] #tab-more-title{border-bottom-color:rgba(255,255,255,.07)}.tab-more-item{display:flex;align-items:center;gap:14px;padding:13px 20px;font-size:16px;color:var(--color-text);text-decoration:none;border-bottom:.5px solid var(--color-border);cursor:pointer;transition:background .1s ease;-webkit-tap-highlight-color:transparent}.tab-more-item:last-child{border-bottom:none}.tab-more-item:active{background:var(--color-surface-2)}[data-theme=dark] .tab-more-item:active{background:#2c2c2e}.tab-more-item svg{width:20px;height:20px;color:var(--color-text-muted)}.page-title{font-size:18px}.card-body{padding:14px}.stats-grid{grid-template-columns:1fr 1fr}.modal-header{padding:14px 16px 10px}.modal-body{padding:14px 16px 16px}#notification-container{bottom:calc(max(82px,calc(env(safe-area-inset-bottom) + 74px)) + 10px)}}@media (max-width:430px){.tt-wrap{border-radius:10px;overflow-x:auto;-webkit-overflow-scrolling:touch;position:relative}.tt-wrap:not(.tt-scrolled)::after{content:'';position:absolute;top:0;right:0;bottom:0;width:44px;background:linear-gradient(to right,transparent,var(--color-bg) 90%);pointer-events:none;border-radius:0 10px 10px 0;transition:opacity .3s ease}.tt-wrap.tt-scrolled::after{opacity:0;pointer-events:none}.tt-wrap:not(.tt-scrolled)::before{content:'';position:absolute;top:50%;right:10px;transform:translateY(-50%);width:16px;height:16px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238aaec4' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'/%3E%3C/svg%3E");background-size:contain;background-repeat:no-repeat;background-position:center;pointer-events:none;opacity:.7;z-index:2;animation:swipeHintPulse 1.4s ease-in-out infinite}.tt-wrap.tt-scrolled::before{display:none}@keyframes swipeHintPulse{0%,100%{opacity:.7;transform:translateY(-50%) translateX(0)}50%{opacity:.35;transform:translateY(-50%) translateX(3px)}}.tt-table{min-width:560px}.tt-cell{min-width:80px}.tt-cell-inner{min-height:66px;padding:6px 4px}.tt-cell-subject{font-size:10px}.tt-cell-teacher{font-size:8px}.tt-day-cell{width:40px;min-width:40px}.tt-day-abbr{font-size:9px}.tt-hdr-row th{font-size:9px;padding:8px 4px}.tt-hdr-period{font-size:10px}.tt-hdr-time{font-size:8px}}#ptr-indicator{display:none!important}#ptr-arc{display:none!important}@keyframes iosSheetUp{from{transform:translateY(100%);opacity:.6}to{transform:translateY(0);opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}.lp-ripple{position:absolute;border-radius:50%;background:rgba(0,0,0,.07);transform:scale(0);animation:lpRippleExpand .4s cubic-bezier(0,0,.2,1) forwards;pointer-events:none;z-index:0}[data-theme=dark] .lp-ripple{background:rgba(255,255,255,.08)}@keyframes lpRippleExpand{to{transform:scale(4);opacity:0}}@media (max-width:430px){#loading-overlay{padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}.lo-brand h1{font-size:20px}.lo-circle,.lo-ring{width:88px;height:88px}}@media (hover:hover) and (pointer:fine){::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-divider);border-radius:99px}::-webkit-scrollbar-thumb:hover{background:var(--color-border-hover)}}.app-sidebar{scrollbar-width:none}.app-sidebar::-webkit-scrollbar{width:0;height:0;display:none}@media (max-width:768px){::-webkit-scrollbar{width:0;height:0}}#bottom-tab-bar,#cmd-overlay,#tab-more-panel{transform:translateZ(0)}@media (max-width:430px){#edu-coin-modal{align-items:center!important;padding:16px!important}#edu-coin-modal>div{margin:0!important;max-width:400px!important;width:100%!important;border-radius:18px!important;max-height:85dvh;overflow-y:auto;-webkit-overflow-scrolling:touch}#edu-coin-modal>div>div:first-child{padding:18px 18px 0!important}#edu-coin-modal>div>div:has(.coin-pkg-btn){padding:14px!important}.coin-pkg-btn{padding:11px 14px!important;margin-bottom:8px!important;border-radius:10px!important}.coin-pkg-btn>div:first-child{gap:10px!important}.coin-pkg-btn>div:first-child>div:last-child>div:first-child{font-size:13px!important}.coin-pkg-btn>div:first-child>div:last-child>div:last-child{font-size:10px!important}.coin-pkg-btn>div:last-child>div:first-child{font-size:15px!important;white-space:nowrap}.coin-pkg-btn>div:last-child>div:last-child{font-size:10px!important}#edu-coin-modal>div>div:last-child{padding:0 14px 14px!important;padding-bottom:max(14px,env(safe-area-inset-bottom))!important;gap:8px!important}#ecm-buy{height:46px!important;font-size:13px!important}#ecm-restore{height:38px!important;font-size:12px!important}}@media (max-width:768px){.form-input{font-size:16px}}.gen-btn-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}@media (max-width:768px){.gen-btn-grid{grid-template-columns:1fr}}
/* ── Password strength meter + requirements checklist (used by the
   Sign Up and Reset Password screens in the auth modal) ── */
.pw-strength-track{height:4px;background:var(--color-border,#e2e8f0);border-radius:2px;margin-top:8px;overflow:hidden}
.pw-strength-bar{height:100%;width:0%;border-radius:2px;transition:width .35s ease,background .35s ease}
.pw-strength-label{font-size:.75rem;font-weight:600;margin-top:5px;min-height:1rem;transition:color .3s}
.pw-req-block{margin:10px 0 4px}
.pw-req-heading{font-size:.78rem;font-weight:600;color:var(--color-text-muted,#6b7280);margin:0 0 7px;letter-spacing:.01em}
.pw-req-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:5px}
.pw-req-item{font-size:.78rem;color:var(--color-text-muted,#6b7280);display:flex;align-items:center;gap:.4rem;transition:color .25s}
.pw-req-item.met{color:var(--color-teal,#0d9488)}
.pw-req-item.met .pw-req-icon{color:var(--color-teal,#0d9488)}
.pw-req-icon{font-size:.85rem;width:14px;text-align:center;flex-shrink:0;color:#cbd5e1;transition:color .25s;font-style:normal}
.pw-req-item.met .pw-req-icon::before{content:'✓'}
.pw-req-item:not(.met) .pw-req-icon::before{content:'○'}
.pw-req-eg{color:var(--color-text-muted,#64748b);font-style:italic}
.pw-req-item.met .pw-req-eg{color:var(--color-teal,#0d9488)}
[data-theme="dark"] .pw-strength-track{background:rgba(255,255,255,.09)!important}
[data-theme="dark"] .pw-req-item{color:var(--color-text-muted,#9ca3af)!important}
[data-theme="dark"] .pw-req-item.met{color:#2dd4bf!important}
[data-theme="dark"] .pw-req-icon{color:#4b5563!important}
[data-theme="dark"] .pw-req-item.met .pw-req-icon{color:#2dd4bf!important}
[data-theme="dark"] .pw-req-eg{color:#9ca3af!important}
[data-theme="dark"] .pw-req-heading{color:#cbd5e1!important}
/* ══════════════════════════════════════════════════════════════
   FIX — Slot Edit Modal (mobile): subject-pill text was being
   clipped by the neighbouring grid column because <button> tags
   inherit `white-space:nowrap` from the base button reset, and
   the modal's own content could overflow its box with no way to
   scroll to the Save/Cancel footer on short viewports. This block
   uses .modal.slot-edit-modal (two chained classes) so it always
   wins the cascade regardless of where earlier rules appear.
   ══════════════════════════════════════════════════════════════ */
.modal.slot-edit-modal{
  display:flex;
  flex-direction:column;
  max-height:90vh;
  max-height:90dvh;
  overflow:hidden;
}
.modal.slot-edit-modal .sem-header,
.modal.slot-edit-modal .sem-footer{
  flex:0 0 auto;
}
.modal.slot-edit-modal .sem-body{
  flex:1 1 auto;
  min-height:0;
  overflow-y:auto;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
}
/* Let subject names (e.g. "Mathematics: Applications & Interpretation (SL)")
   wrap onto a second line inside their grid cell instead of being cut off
   at the column edge. */
.modal.slot-edit-modal .slot-subj-btn{
  white-space:normal;
  overflow-wrap:anywhere;
  word-break:break-word;
  line-height:1.25;
}
@media (max-width:768px){
  .modal.slot-edit-modal{
    max-height:88vh;
    max-height:88dvh;
  }
}
@media (max-width:480px){
  .modal.slot-edit-modal{
    max-height:85vh;
    max-height:85dvh;
  }
  .modal.slot-edit-modal .sem-footer{
    padding-bottom:max(9px, env(safe-area-inset-bottom));
  }
}

/* ══════════════════════════════════════════════════════════════
   FIX — Dashboard native print (Ctrl+P / mobile share-sheet print)
   was falling back to browser-default Portrait because this generic
   @media print block never declared an @page orientation, and the
   on-screen table's baked-in min-width (700–900px) then got squeezed
   into a narrow portrait sheet — this is the "thin portrait" print.
   The app's dedicated Print/PDF buttons (buildPrintDoc/printTT) are
   unaffected — they already open a correctly landscape-forced sheet.
   This block only hardens the fallback path so accidental Ctrl+P
   still comes out landscape and fills the page.
   FIX 2 — dark-mode print fade: if a user prints (Ctrl+P) while the
   app is in dark mode, --color-text/--color-primary/etc still resolve
   to their DARK values (e.g. pastel #8baee0 instead of #1a3a6b) even
   though the page background prints white — the on-screen dark-mode
   palette is tuned for a black background, so on paper it comes out
   washed-out/low-contrast. color-scheme:light plus explicitly
   re-declaring the light-mode variable values here forces true dark
   ink on the printed page regardless of which theme was active when
   Ctrl+P was pressed. Screen-mode dark theme is completely unaffected
   — this selector only exists inside @media print. ══════════════════ */
@media print{
  :root{
    color-scheme:light;
    --color-text:#0d1117; --color-text-secondary:#374151; --color-text-muted:#6b7280;
    --color-primary:#1a3a6b; --color-teal:#0d9488;
    --color-white:#ffffff; --color-surface:#ffffff; --color-surface-2:#f4f6f9;
    --color-border:#dde1eb; --color-border-light:#e8eaf0;
  }
  @page{ size:A4 landscape; margin:10mm; }
  .app-header,.app-sidebar,#bottom-tab-bar,.btn,.no-print,nav{ display:none!important; }
  .app-main{ margin:0!important; padding:6mm!important; width:100%!important; }
  .tt-wrap{ overflow:visible!important; border:none!important; box-shadow:none!important; }
  .tt-table{ min-width:0!important; width:100%!important; table-layout:fixed!important; }
  body,.tt-cell-subject,.tt-cell-teacher,.tt-cell-room,.tt-legend-item{ color:#0d1117!important; }
}


/* ══════════════════════════════════════════════════════════════
   FIX — Header actions (Sign In button) cut off on mobile.
   The demo-mode pill + curriculum flag/globe + stats badges +
   theme toggle + Sign In button were all crammed into one
   non-wrapping row with no shrink priority, so on narrow screens
   the row simply overflowed past the viewport edge — Sign In
   (last in the row) got pushed off-screen instead of clipping
   visibly, which is why it looked "cut off" rather than squished.
   Fix: let the row wrap as a safety net, and shrink/hide the
   lowest-priority items (demo pill text, curriculum flag) first
   so Sign In / the account button always stays on-screen. ══════ */
@media (max-width:600px){
  .app-header-content > div{
    gap:6px !important;
  }
  #demo-mode-pill{
    padding:4px 8px !important;
    gap:5px !important;
  }
  #demo-mode-pill .demo-pill-label{
    font-size:0 !important;
  }
  #demo-mode-pill .demo-pill-label::after{
    content: "Exit Demo";
    font-size:11px;
  }
  #mode-badge, #mode-badge-slot{
    display:none;
  }
  .hdr-free-label, .hdr-credit-label{
    display:none;
  }
  #hdr-free-badge, #hdr-credit-badge{
    padding:5px 8px !important;
  }
}
@media (max-width:360px){
  #hdr-free-badge{
    display:none;
  }
}

/* ── Mobile fix patch (applied directly here since this is the file
   index.html actually loads — mobile-ios.css/components.css edits
   alone never reached the browser) ── */
.tt-hdr-row th{border-left:1px solid rgba(255,255,255,.16);box-shadow:0 2px 5px -2px rgba(15,23,42,.35)}
.tt-hdr-row th:first-child{border-right:1px solid rgba(255,255,255,.22);box-shadow:2px 2px 5px -2px rgba(15,23,42,.35)}
.tt-day-cell{border-right:1px solid rgba(255,255,255,.22);box-shadow:2px 0 5px -2px rgba(15,23,42,.3)}
@media (max-width:768px){
.app-header-content{overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}
.app-header-content::-webkit-scrollbar{display:none}
.app-header-content>div{gap:6px!important}
#mode-badge-slot,#theme-toggle,#auth-header-slot,#auth-stats-slot,#demo-mode-pill{flex-shrink:0}
}
/* ── UX fix set (2026-08-15) ───────────────────────────────────────────
   1) Desktop sidebar: Timetable gets a permanent accent treatment (not
      just on .active) since it's the app's core feature — a left accent
      bar, tinted background and accent-colored icon/label, visible
      whether or not the user is currently on that page. The existing
      .active state (stronger fill + bold) still layers on top when it
      IS the current page, via normal cascade/specificity.
   2) Mobile bottom nav: Timetable is promoted to a raised, filled
      "primary" center button (5 tabs total: Home, Issues, Timetable,
      Generate, More), matching the reference nav supplied with the
      request (a raised, highlighted middle action). See TABS/isPrimary
      in mobile-ios.js.
   3) REDESIGN (per explicit feedback: the sidebar highlight "looks like
      the Timetable is the active tab" — because it WAS reusing the
      exact active-state visual language: var(--color-primary) navy +
      a var(--color-primary-faint) background fill + a left border in
      that same navy. Anyone glancing at it would reasonably read it as
      "currently selected." Replaced with a visual language the real
      .active state never uses: no background fill, no border, just a
      bolder label and a teal-tinted icon (:not(.active) guarded, so
      the true active state — navy + background fill — always wins
      outright the moment it IS the current page, with zero visual
      overlap between "featured" and "selected"). */

.app-sidebar-item[data-page="timetable"]:not(.active) {
  font-weight: 600;
}
.app-sidebar-item[data-page="timetable"]:not(.active) svg { opacity: 1; color: var(--color-teal); }
body.sidebar-collapsed .app-sidebar-item[data-page="timetable"]:not(.active) svg { opacity: 1; color: var(--color-teal); }
[data-theme="dark"] .app-sidebar-item[data-page="timetable"]:not(.active) svg { color: var(--color-teal); }

@media (max-width:430px) {
  /* Exact bar background as a custom property, so the primary button's
     "cutout ring" blends pixel-perfect instead of approximating with
     --color-bg (the bar uses a translucent rgba(...,.98), not the flat
     page background — a visible seam otherwise). */
  #bottom-tab-bar { --tab-bar-bg: rgba(250,250,252,.98); }
  [data-theme="dark"] #bottom-tab-bar { --tab-bar-bg: rgba(28,28,30,.98); }

  /* REDESIGN (per explicit feedback: "too much shadow, I hate shadows",
     and the active state "not looking professional"): dropped every
     blurred drop-shadow — there were two stacked (a soft ambient shadow
     AND a heavier one on .active), which read as a glowing floating
     blob rather than a clean button. Replaced with flat, zero-blur
     rings only (box-shadow with 0 blur radius is visually a crisp
     border, not a "shadow" — no opacity falloff, no glow). No scale/
     bounce on tap-to-active either — the only thing that changes on
     active is a thin accent-colored outline appearing outside the
     neutral separation ring; everything else stays static and calm. */
  .tab-item--primary { margin-top: -22px; z-index: 2; }
  .tab-item--primary .tab-icon-wrap {
    width: 52px; height: 52px; border-radius: 50%;
    /* Default (inactive) state: plain white circle with a light ash
       ring around it (matches the reference screenshot), matching the
       other tab icons' resting look — just raised and larger. No fill
       color until the tab is actually active.
       FIXED: border color now uses the same thin-ash tone as the bar's
       own top border (rgba(0,0,0,.11) on #bottom-tab-bar) instead of a
       separate hardcoded hex (#d5d9e0) that read lighter/inconsistent
       next to it — the circle's ring now visibly matches the rest of
       the nav bar's hairline styling. */
    background: var(--color-white);
    border: 1.5px solid rgba(0, 0, 0, 0.14);
    box-shadow: 0 0 0 4px var(--tab-bar-bg, var(--color-bg));
    /* Same spring curve the other 4 tabs use on their icon-wrap
       (see the base .tab-icon-wrap rule above) so the press/release
       feel is identical across the whole bar — this button just adds
       background/border-color to that shared list, it doesn't drop
       transform from it. */
    transition: background 0.16s ease, border-color 0.16s ease, transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
  }
  [data-theme="dark"] .tab-item--primary .tab-icon-wrap {
    background: #2c2c2e;
    border-color: rgba(255,255,255,0.16);
  }
  /* Use the OUTLINE icon, not the "filled" variant — several filled
     icons (timetable's included) are solid shapes designed to be read
     as currentColor against a light tinted background, not as a white
     glyph on a solid color; against this circle they'd render as an
     unrecognizable solid blob. The outline glyph stays legible at any
     size, in either the muted resting color or white once active. */
  .tab-item--primary .tab-icon-filled { display: none !important; }
  .tab-item--primary .tab-icon-outline { display: flex !important; }
  .tab-item--primary svg { color: var(--color-text-muted); width: 22px; height: 22px; transition: color 0.16s ease; }
  .tab-item--primary span.tab-label { color: var(--color-text-secondary); font-weight: 700; margin-top: 3px; }
  .tab-item--primary.active .tab-icon-wrap {
    /* Must explicitly re-declare background/transform here, not just
       box-shadow: `.tab-item.active .tab-icon-wrap` (3 classes) has
       HIGHER specificity than `.tab-item--primary .tab-icon-wrap` (2
       classes) above, so it was silently winning on `.active` — wiping
       out the gradient fill back to the app's default pale tint and
       adding an unwanted scale(1.15)+translateY(-4px) jump on top of
       this button's own raise. That mystery fade + jump is what read
       as "unprofessional" — not a design problem, a cascade bug.

       Active state: the same white circle simply turns into a flat
       fill of the SAME blue every other active tab already uses
       (var(--color-primary)) — no separate accent ring layered on top
       of it (per explicit feedback: no extra circle border when
       active), and per explicit feedback the two-color gradient is
       gone in favor of one flat, consistent brand blue so the
       Timetable button matches the rest of the bar's active color
       language instead of introducing its own palette.

       UPDATE (per explicit feedback: the button should feel as smooth
       as the other four on tap): the flat `transform: none` above
       removed ALL press feedback for this tab, not just the old
       translateY jump — so tapping it read as "dead" next to the
       springy pop the other tabs get on release (see
       `.tab-item.active .tab-icon-wrap`'s scale(1.15)). Restoring a
       small scale bump here brings back that same springy feel
       without reintroducing the old translateY stacking-on-top-of-the-
       raise jump (this button is already raised via margin-top, so it
       only scales, it doesn't also translate). */
    background: var(--color-primary);
    border-color: transparent;
    transform: scale(1.08);
    box-shadow: 0 0 0 4px var(--tab-bar-bg, var(--color-bg));
  }
  [data-theme="dark"] .tab-item--primary.active .tab-icon-wrap {
    /* Dark mode's "active" accent everywhere else is the teal, not the
       (light-mode-tuned) primary blue — match that here too. */
    background: var(--color-teal);
  }
  .tab-item--primary.active svg { color: #fff; }
  .tab-item--primary.active span.tab-label { color: var(--color-primary); }
  [data-theme="dark"] .tab-item--primary.active span.tab-label { color: var(--color-teal); }
}
