:root{--font-sans:system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--color-bg:#f4f6f9;--color-surface:#fff;--color-text:#1a2332;--color-muted:#5c6b7a;--color-border:#e2e8f0;--color-primary:#2563eb;--color-primary-hover:#1d4ed8;--color-success:#059669;--color-warning:#d97706;--color-danger:#dc2626;--radius:10px;--shadow:0 1px 3px #00000014;--bottom-nav-height:4rem;--mobile-header-height:3.25rem;--safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px);--safe-left:env(safe-area-inset-left,0px);--safe-right:env(safe-area-inset-right,0px);--bp-md:768px;--bp-lg:1024px}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;min-height:100dvh}body{font-family:var(--font-sans);color:var(--color-text);background:var(--color-bg);-webkit-font-smoothing:antialiased;margin:0;font-size:15px;line-height:1.5}h1,h2,p{margin:0}a{color:var(--color-primary);text-decoration:none}a:hover{text-decoration:underline}.dashboard{background:var(--color-bg);flex-direction:column;min-height:100dvh;display:flex}.dashboard__shell{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.dashboard__main{padding:1rem;padding-left:calc(1rem + var(--safe-left));padding-right:calc(1rem + var(--safe-right));padding-bottom:calc(1rem + var(--bottom-nav-height) + var(--safe-bottom));-webkit-overflow-scrolling:touch;flex:1;overflow:auto}.mobile-header{min-height:var(--mobile-header-height);padding:.5rem 1rem;padding-top:calc(.5rem + var(--safe-top));padding-left:calc(1rem + var(--safe-left));padding-right:calc(1rem + var(--safe-right));background:var(--color-surface);border-bottom:1px solid var(--color-border);z-index:20;flex-shrink:0;align-items:center;display:flex;position:sticky;top:0}.mobile-header__brand{align-items:center;gap:.65rem;min-width:0;display:flex}.mobile-header__brand strong{font-size:.95rem;line-height:1.2;display:block}.mobile-header__subtitle{color:var(--color-muted);font-size:.7rem;font-weight:400;display:block}.mobile-header__logo{background:var(--color-primary);color:#fff;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:.8rem;font-weight:700;display:flex}.bottom-nav{z-index:30;min-height:var(--bottom-nav-height);padding-bottom:var(--safe-bottom);background:var(--color-surface);border-top:1px solid var(--color-border);display:flex;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -4px 16px #0000000f}.bottom-nav__link{min-width:0;color:var(--color-muted);-webkit-tap-highlight-color:transparent;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:.15rem;padding:.35rem .2rem;font-size:.625rem;font-weight:600;text-decoration:none;transition:color .15s,background .15s;display:flex}.bottom-nav__link:hover{color:var(--color-text);background:var(--color-bg);text-decoration:none}.bottom-nav__link--active{color:var(--color-primary);background:#eff6ff}.bottom-nav__link--active .nav-icon{stroke:var(--color-primary)}.nav-icon{flex-shrink:0;width:1.35rem;height:1.35rem}.bottom-nav__label{text-overflow:ellipsis;white-space:nowrap;text-align:center;max-width:100%;line-height:1.1;overflow:hidden}.sidebar{background:var(--color-surface);border-right:1px solid var(--color-border);flex-direction:column;flex-shrink:0;width:240px;padding:1.5rem 1rem;display:none}.sidebar__brand{border-bottom:1px solid var(--color-border);align-items:center;gap:.75rem;margin-bottom:1rem;padding:0 .5rem 1.5rem;display:flex}.sidebar__brand strong{font-size:.95rem;display:block}.sidebar__subtitle{color:var(--color-muted);font-size:.75rem;font-weight:400;display:block}.sidebar__logo{border-radius:var(--radius);background:var(--color-primary);color:#fff;justify-content:center;align-items:center;width:40px;height:40px;font-size:.85rem;font-weight:700;display:flex}.sidebar__nav{flex-direction:column;flex:1;gap:.25rem;display:flex}.sidebar__link{color:var(--color-text);border-radius:8px;padding:.6rem .75rem;font-weight:500;text-decoration:none}.sidebar__link:hover{background:var(--color-bg);text-decoration:none}.sidebar__link--active{color:var(--color-primary);background:#eff6ff}.sidebar__footer{color:var(--color-muted);padding:1rem .5rem 0;font-size:.75rem}.sidebar__env{background:var(--color-bg);border-radius:6px;padding:.35rem .5rem;display:inline-block}.page-header{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1.75rem;display:flex}.page-header h1{font-size:1.5rem;font-weight:700}.page-header__desc{color:var(--color-muted);margin-top:.35rem;font-size:.9rem}.page-header__actions{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:.5rem;display:flex}.stats-grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1rem;margin-bottom:2rem;display:grid}.stat-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:1.25rem}.stat-card--highlight{background:#fef2f2;border-color:#fecaca}.stat-card__label{color:var(--color-muted);text-transform:uppercase;letter-spacing:.04em;font-size:.8rem;display:block}.stat-card__value{margin-top:.25rem;font-size:2rem;font-weight:700;display:block}.quick-links h2{margin-bottom:.75rem;font-size:1rem}.quick-links__grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:1rem;display:grid}.quick-link-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);color:inherit;box-shadow:var(--shadow);padding:1.25rem;transition:border-color .15s;display:block}.quick-link-card:hover{border-color:var(--color-primary);text-decoration:none}.quick-link-card__title{margin-bottom:.25rem;font-weight:600;display:block}.quick-link-card__desc{color:var(--color-muted);font-size:.85rem;display:block}.table-wrap{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:auto}.data-table{border-collapse:collapse;width:100%;font-size:.9rem}.data-table th,.data-table td{text-align:left;border-bottom:1px solid var(--color-border);padding:.75rem 1rem}.data-table th{text-transform:uppercase;letter-spacing:.04em;color:var(--color-muted);background:#f8fafc;font-size:.75rem}.data-table tbody tr:last-child td{border-bottom:none}.data-table tbody tr:hover{background:#f8fafc}.badge{text-transform:capitalize;border-radius:999px;padding:.2rem .55rem;font-size:.75rem;font-weight:600;display:inline-block}.badge--success{color:var(--color-success);background:#d1fae5}.badge--warning{color:var(--color-warning);background:#fef3c7}.badge--danger{color:var(--color-danger);background:#fee2e2}.badge--neutral{color:var(--color-muted);background:#f1f5f9}.query-fetch-bar{background:linear-gradient(90deg, transparent, var(--color-primary,#2563eb) 40%, transparent);border-radius:999px;height:3px;margin:0 0 .75rem;animation:1.2s ease-in-out infinite query-fetch-pulse}@keyframes query-fetch-pulse{0%,to{opacity:.35}50%{opacity:1}}.loading,.empty-state{color:var(--color-muted)}.error{color:var(--color-danger);border-radius:var(--radius);background:#fef2f2;padding:.75rem 1rem}.config-banner{border-radius:var(--radius);color:#92400e;background:#fffbeb;border:1px solid #fcd34d;margin:0 0 1rem;padding:.75rem 1rem;font-size:.9rem}.config-banner code{font-size:.85em}.filter-field{flex-direction:column;gap:.25rem;display:flex}.filter-field__label{color:var(--color-muted);text-transform:uppercase;letter-spacing:.04em;font-size:.75rem}.filter-field__input{border:1px solid var(--color-border);font:inherit;background:var(--color-surface);border-radius:8px;padding:.45rem .6rem}.btn{font:inherit;cursor:pointer;background:var(--color-primary);color:#fff;border:none;border-radius:8px;align-items:center;padding:.5rem 1rem;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{background:var(--color-primary-hover);text-decoration:none}.btn--secondary{background:var(--color-surface);color:var(--color-text);border:1px solid var(--color-border)}.btn--secondary:hover{border-color:var(--color-primary);background:#eff6ff}.btn--small{padding:.3rem .65rem;font-size:.8rem}.table-link{font-weight:600;text-decoration:none}.table-link:hover{text-decoration:underline}.calendar-year-label{color:var(--color-muted);margin-bottom:1rem;font-size:.9rem}.calendar-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem;display:grid}.calendar-month-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:1rem}.calendar-month-card h3{margin-bottom:.75rem;font-size:1rem}.calendar-month-card__stats{grid-template-columns:repeat(3,1fr);gap:.5rem;margin:0 0 .75rem;font-size:.85rem;display:grid}.calendar-month-card__stats dt{color:var(--color-muted);text-transform:uppercase;font-size:.7rem}.calendar-month-card__stats dd{margin:0;font-weight:700}.calendar-month-card__links{margin:0;padding:0;font-size:.85rem;list-style:none}.calendar-month-card__links li+li{margin-top:.35rem}.session-dates{color:var(--color-muted);margin-bottom:1rem;font-size:.9rem}.presence-matrix th .session-date-sub{text-transform:none;letter-spacing:0;color:var(--color-muted);font-size:.65rem;font-weight:400;display:block}.session-cell-btn{cursor:pointer;font:inherit;background:0 0;border:none;padding:0}.session-empty{color:var(--color-muted)}.sidebar__env--error{color:var(--color-danger);background:#fef2f2}.sidebar__env--ok{color:var(--color-success);background:#d1fae5}.modal-overlay{z-index:100;background:#00000073;justify-content:center;align-items:center;padding:1rem;display:flex;position:fixed;inset:0}.modal{background:var(--color-surface);border-radius:var(--radius);width:100%;max-width:440px;max-height:90vh;overflow:auto;box-shadow:0 8px 32px #00000026}.modal--wide{max-width:720px}.modal__header{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:1rem 1.25rem;display:flex}.modal__header h2{font-size:1.1rem}.modal__close{cursor:pointer;color:var(--color-muted);background:0 0;border:none;font-size:1.5rem;line-height:1}.modal__body{padding:1.25rem}.form{flex-direction:column;gap:1rem;display:flex}.form__field{flex-direction:column;gap:.35rem;display:flex}.form__field span,.form__fieldset legend{color:var(--color-muted);font-size:.8rem;font-weight:600}.form__field input,.form__field select{border:1px solid var(--color-border);font:inherit;border-radius:8px;padding:.5rem .65rem}.form__fieldset{border:1px solid var(--color-border);border-radius:8px;margin:0;padding:.75rem 1rem}.form__checks,.form__schedule-row{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.form__check{align-items:center;gap:.35rem;font-size:.9rem;display:flex}.form__schedule-row input[type=time]{border:1px solid var(--color-border);font:inherit;border-radius:6px;padding:.35rem}.form__actions{justify-content:flex-end;gap:.5rem;margin-top:.5rem;display:flex}.form__hint{color:var(--color-muted);margin:0 0 .5rem;font-size:.85rem}.toolbar{margin-bottom:1rem}.toolbar--wrap{flex-wrap:wrap;align-items:flex-end;gap:.75rem;display:flex}.filter-field--grow{flex:1;min-width:min(100%,12rem)}.filter-field--grow .filter-field__input{width:100%}.row-actions{flex-wrap:wrap;gap:.35rem;display:flex}.btn--danger{background:var(--color-danger)}.btn--danger:hover{background:#b91c1c}.inline-select{border:1px solid var(--color-border);font:inherit;border-radius:6px;max-width:140px;padding:.25rem .4rem}.group-grid{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.25rem;display:grid}.group-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}.group-card__header{border-bottom:1px solid var(--color-border);background:#f8fafc;justify-content:space-between;gap:1rem;padding:1rem 1.25rem;display:flex}.group-card__header h2{margin:0;font-size:1.05rem}.group-card__meta,.group-card__schedule{color:var(--color-muted);margin:.25rem 0 0;font-size:.8rem}.group-card__students{max-height:280px;margin:0;padding:.5rem 0;list-style:none;overflow-y:auto}.group-card__students li{border-bottom:1px solid var(--color-border);justify-content:space-between;gap:.5rem;padding:.5rem 1.25rem;font-size:.9rem;display:flex}.group-card__students li:last-child{border-bottom:none}.group-card__student-name{font-weight:600}.group-card__student-classes{color:var(--color-muted);font-size:.8rem}.group-card__empty{color:var(--color-muted);justify-content:center;font-style:italic}.payment-panel__toolbar{margin-bottom:1rem}@media (width<=380px){.bottom-nav__label{font-size:.55rem}.nav-icon{width:1.2rem;height:1.2rem}.stat-card__value{font-size:1.65rem}}@media (width<=767px){.page-header{flex-direction:column;align-items:stretch;gap:.75rem;margin-bottom:1.25rem}.page-header h1{font-size:1.25rem}.page-header__actions{flex-direction:column;align-items:stretch;gap:.5rem;width:100%;display:flex}.page-header__actions .btn{justify-content:center;width:100%}.stats-grid,.quick-links__grid,.calendar-grid{grid-template-columns:1fr}.calendar-month-card__stats{grid-template-columns:repeat(3,1fr)}.group-grid{grid-template-columns:1fr}.group-card__header{flex-direction:column;align-items:stretch}.group-card__header .row-actions{justify-content:flex-start}.toolbar .filter-field,.toolbar .filter-field__input{width:100%}.inline-select{width:100%;max-width:100%}.data-table th,.data-table td{padding:.6rem .75rem;font-size:.85rem}.table-wrap{margin-left:calc(-1 * (1rem + var(--safe-left)));margin-right:calc(-1 * (1rem + var(--safe-right)));border-left:none;border-right:none;border-radius:0}.presence-matrix th,.presence-matrix td{padding:.5rem;font-size:.8rem}.session-cell-btn{justify-content:center;align-items:center;min-width:2.5rem;min-height:2.25rem;display:inline-flex}.modal-overlay{align-items:flex-end;padding:0}.modal{border-radius:var(--radius) var(--radius) 0 0;max-width:none;max-height:92dvh;margin-bottom:0}.modal--wide{max-width:none}.form__actions{flex-direction:column-reverse;align-items:stretch}.form__actions .btn{justify-content:center;width:100%}.form__schedule-row{flex-direction:column;align-items:stretch}.form__schedule-row input[type=time],.form__schedule-row select{width:100%}.row-actions .btn{flex:auto;justify-content:center;min-width:calc(50% - .2rem)}.config-banner{font-size:.85rem}}@media (width>=768px){.dashboard{flex-direction:row}.mobile-header,.bottom-nav{display:none}.sidebar{display:flex}.dashboard__main{padding:1.5rem 2rem}}@media (width>=1024px){.dashboard__main{padding:2rem 2.5rem}.page-header h1{font-size:1.5rem}}
