:root{--bg:#ebebf2;--surface:#fff;--text:#1c2430;--muted:#6b7280;--line:#d1d5db;--primary:#db5461;--primary-light:#f2a1a8;--primary-end:#e06b76;--secondary:#bf7069;--accent:#2bb673;--danger:#b42318;--ok:#22c55e;--warn:#d97706;--error-wash:#fff7f6;--error-line:#f3c4c0;--wash:#ececf2;--progress-track:#dde0e8;--house-blue:#3b82f6;--house-red:#ef4444;--house-green:#22c55e;--house-yellow:#eab308;--medal-gold:gold;--medal-silver:silver;--medal-bronze:#cd7f32;--font:"Nunito", "Segoe UI", sans-serif;--display:"Fredoka", "Nunito", sans-serif;--mono:"IBM Plex Mono", ui-monospace, monospace;--radius:18px;--radius-sm:12px;--shadow-sm:0 1px 3px #0000000a, 0 1px 2px #0000000f;--shadow-card:0 2px 8px #0000000f;--dash-width:1120px;--shadow-xs:0 1px 2px 0 #1c1c220d;--shadow-glass:0 10px 40px -8px #00000029, 0 2px 10px -4px #00000014, inset 0 1px 0 0 #ffffff57;--glass-highlight:#fff3;--glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);--nav-font:"Inter", "Nunito", sans-serif}[data-appearance=dark]{--bg:#14151c;--surface:#1c1f2a;--text:#f8fafc;--muted:#94a3b8;--line:#3a4150;--ok:#4ade80;--warn:#fbbf24;--danger:#fca5a5;--error-wash:#301c1e;--error-line:#f3c4c0;--wash:#242734;--progress-track:#3a4150;--shadow-card:0 2px 8px #00000047;--shadow-xs:0 1px 2px 0 #0006;--shadow-glass:0 12px 48px -10px #00000085, 0 4px 14px -6px #00000052, inset 0 1px 0 0 #ffffff1f;--glass-highlight:#ffffff17;--glass-bg:color-mix(in srgb, var(--surface) 78%, transparent)}.dark{--shadow-xs:0 1px 2px 0 #0006;--shadow-glass:0 12px 48px -10px #00000085, 0 4px 14px -6px #00000052, inset 0 1px 0 0 #ffffff1f;--glass-highlight:#ffffff17;--glass-bg:color-mix(in srgb, var(--surface) 78%, transparent)}@media (prefers-color-scheme:dark){:root:not([data-appearance=light]){--bg:#14151c;--surface:#1c1f2a;--text:#f8fafc;--muted:#94a3b8;--line:#3a4150;--ok:#4ade80;--warn:#fbbf24;--danger:#fca5a5;--error-wash:#301c1e;--error-line:#f3c4c0;--wash:#242734;--progress-track:#3a4150;--shadow-card:0 2px 8px #00000047;--shadow-xs:0 1px 2px 0 #0006;--shadow-glass:0 12px 48px -10px #00000085, 0 4px 14px -6px #00000052, inset 0 1px 0 0 #ffffff1f;--glass-highlight:#ffffff17;--glass-bg:color-mix(in srgb, var(--surface) 78%, transparent)}}*,:before,:after{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:6.5rem}html,body{background:var(--bg);min-height:100%;color:var(--text);font-family:var(--font);-webkit-font-smoothing:antialiased;margin:0;overflow-x:hidden}button{font:inherit;cursor:pointer;color:inherit;background:0 0;border:none}:focus{outline:none}:focus-visible{outline:3px solid var(--primary);outline-offset:2px}.dashboard-page{background:radial-gradient(circle at 12% 18%, #db546129, transparent 28%), radial-gradient(circle at 88% 78%, #2bb67324, transparent 26%), var(--bg);min-height:100vh;animation:18s ease-in-out infinite bgShift;position:relative}@keyframes bgShift{0%,to{background-position:0 0,0 0,0 0}50%{background-position:0 12px,0 -10px,0 0}}.ambient{pointer-events:none;position:absolute;inset:0;overflow:hidden}.ambient:before,.ambient:after{content:"";filter:blur(30px);border-radius:50%;animation:12s ease-in-out infinite drift;position:absolute}.ambient:before{background:#db546129;width:220px;height:220px;top:6%;left:6%}.ambient:after{background:#2bb67324;width:180px;height:180px;animation-delay:-4s;bottom:12%;right:8%}@keyframes drift{0%,to{transform:translateY(0)}50%{transform:translateY(-18px)}}.dash-shell{z-index:1;width:min(var(--dash-width), calc(100% - 32px));margin:0 auto;padding:7.75rem 0 48px;position:relative}.site-header{z-index:1000;pointer-events:none;background:0 0;padding:.75rem .75rem 0;position:fixed;top:0;left:0;right:0}@media (width>=640px){.site-header{padding:.75rem 1rem 0}}@media (width>=1024px){.site-header{padding:.75rem 2rem 0}}.header-shell{pointer-events:auto;isolation:isolate;background:linear-gradient(145deg, color-mix(in srgb, var(--surface) 72%, transparent) 0%, color-mix(in srgb, var(--surface) 40%, transparent) 48%, color-mix(in srgb, var(--surface) 58%, transparent) 100%);-webkit-backdrop-filter:blur(28px)saturate(195%);backdrop-filter:blur(28px)saturate(195%);border:1px solid color-mix(in srgb, var(--text) 10%, transparent);max-width:80rem;box-shadow:var(--shadow-glass);border-radius:1rem;margin:0 auto;position:relative;overflow:visible}.header-shell:before{content:"";z-index:0;border-radius:inherit;pointer-events:none;background:radial-gradient(120% 90% at 50% 0%, var(--glass-highlight) 0%, transparent 72%);opacity:.75;position:absolute;inset:0}.header-container{z-index:1;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.75rem 1rem;display:flex;position:relative}@media (width>=640px){.header-container{padding:1rem 1.25rem}}.header-left{flex:auto;align-items:center;gap:1.25rem;min-width:0;max-width:100%;display:flex}.header-right{flex:none;align-items:center;gap:.625rem;margin-left:auto;display:flex}.logo{min-width:0;max-width:100%;color:inherit;flex:auto;align-items:center;gap:.625rem;text-decoration:none;display:flex}.brand-mark{border:1px solid color-mix(in srgb, var(--primary) 22%, transparent);background:color-mix(in srgb, var(--primary) 9%, transparent);width:2.5rem;height:2.5rem;box-shadow:var(--shadow-xs);border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.dark .brand-mark,[data-appearance=dark] .brand-mark{border-color:color-mix(in srgb, var(--primary) 28%, transparent);background:color-mix(in srgb, var(--primary) 14%, transparent)}.brand-mark svg{width:1.68rem;height:1.3rem;color:var(--primary)}.brand-text{min-width:0;line-height:1.15;font-family:var(--nav-font);flex-direction:column;flex:auto;display:flex}.logo-text{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.02em;color:var(--text);flex:none;font-size:1.125rem;font-weight:900;display:block;overflow:hidden}.brand-subtitle{-webkit-line-clamp:2;line-clamp:2;white-space:normal;word-break:break-word;color:var(--muted);-webkit-box-orient:vertical;font-size:.6875rem;font-weight:700;display:-webkit-box;overflow:hidden}.site-header .btn{min-height:0;font-family:var(--nav-font);box-shadow:none;border:1px solid #0000;border-radius:9999px;justify-content:center;align-items:center;padding:.625rem 1.5rem;font-size:.875rem;font-weight:600;text-decoration:none;display:inline-flex}.site-header .btn-primary{background:var(--primary);color:#fff}.site-header .btn-primary:hover{background:var(--primary-end)}.site-header .btn-outline{background:color-mix(in srgb, var(--surface) 60%, transparent);color:var(--text);border-color:var(--line)}.site-header .btn-outline:hover{background:var(--wash)}.refresh-btn,.theme-toggle,.menu-toggle{border:1px solid color-mix(in srgb, var(--line) 60%, transparent);background:color-mix(in srgb, var(--surface) 80%, transparent);width:2.5rem;height:2.5rem;color:var(--text);box-shadow:var(--shadow-xs);border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.refresh-btn{font-family:var(--nav-font);gap:.45rem}.refresh-btn .refresh-label{color:var(--muted);white-space:nowrap;font-size:.82rem;font-weight:700;display:none}.menu-action-label,.menu-toggle{display:none}.menu-toggle svg{flex-shrink:0;width:1.2rem;height:1.2rem}.menu-toggle svg:last-child,.site-header.is-menu-open .menu-toggle svg:first-child{display:none}.site-header.is-menu-open .menu-toggle svg:last-child{display:block}.refresh-btn:hover,.theme-toggle:hover,.menu-toggle:hover{background:var(--wash)}.refresh-btn:disabled,.refresh-btn.is-busy,.theme-toggle:disabled,.theme-toggle.is-busy{cursor:wait;opacity:.7}.refresh-btn svg,.theme-toggle svg{flex-shrink:0;width:1.2rem;height:1.2rem}.theme-toggle .icon-sun{display:block}.theme-toggle .icon-moon,.dark .theme-toggle .icon-sun,[data-appearance=dark] .theme-toggle .icon-sun{display:none}.dark .theme-toggle .icon-moon,[data-appearance=dark] .theme-toggle .icon-moon{display:block}.site-header .btn.sync-btn,.sync-label-short{display:none}.header-action-row{display:contents}@media (width<=720px){.header-container{flex-wrap:nowrap;align-items:center;gap:.75rem}.menu-toggle{margin-left:auto;display:inline-flex}.header-right{flex-direction:column;flex-basis:100%;align-items:stretch;gap:.5rem;width:100%;margin-left:0;padding-top:.15rem;display:none}.site-header.is-menu-open .header-container{flex-wrap:wrap}.site-header.is-menu-open .header-right{flex-direction:column;align-items:stretch;gap:.5rem;display:flex}.site-header.is-menu-open .header-action-row{align-items:stretch;gap:.5rem;display:flex}.site-header.is-menu-open .refresh-btn,.site-header.is-menu-open .theme-toggle{border-radius:9999px;flex:1 1 0;justify-content:center;gap:.5rem;width:auto;height:auto;min-height:2.75rem;padding:.65rem 1rem}.site-header.is-menu-open .refresh-btn:has(.refresh-label){flex-wrap:wrap;gap:.15rem .45rem;padding:.5rem .9rem}.site-header.is-menu-open .refresh-btn .menu-action-label{order:1}.site-header.is-menu-open .refresh-btn svg,.site-header.is-menu-open .refresh-btn .spinner{order:2}.site-header.is-menu-open .refresh-btn .refresh-label{text-align:center;order:3;width:100%;font-size:.68rem;font-weight:700;line-height:1.2;display:block}.site-header.is-menu-open .menu-action-label{font-family:var(--nav-font);font-size:.875rem;font-weight:700;display:inline}.site-header.is-menu-open .sync-btn{justify-content:center;width:100%;padding:.7rem 1rem}.site-header.is-menu-open .sync-label-long{display:inline}.site-header.is-menu-open .sync-label-short{display:none}}.visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (width>=993px){.refresh-btn:has(.refresh-label){background:color-mix(in srgb, var(--surface) 60%, transparent);border-color:var(--line);width:auto;min-height:2.5rem;padding:0 .9rem 0 1.05rem}.refresh-btn:has(.refresh-label):hover{background:var(--wash)}.refresh-btn .refresh-label{display:inline}}.dash-main{flex-direction:column;gap:20px;display:flex}.dash-state{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:14px;min-height:48vh;padding:48px 16px;display:flex}.dash-state h2{font-family:var(--display);margin:0;font-size:1.5rem}.dash-state-error{gap:16px;max-width:26rem;margin:0 auto}.dash-state-error h2{letter-spacing:-.02em;font-size:clamp(1.45rem,4vw,1.85rem);font-weight:700}.error-copy{max-width:22rem;margin:0}.error-hero{place-items:center;width:5.5rem;height:5.5rem;margin-bottom:.25rem;display:grid;position:relative}.error-hero-glow{background:radial-gradient(circle at 35% 30%,#db546147,#0000 62%),radial-gradient(circle at 70% 75%,#2bb6732e,#0000 58%);border-radius:50%;animation:2.8s ease-in-out infinite errorPulse;position:absolute;inset:0}.error-hero-mark{z-index:1;background:color-mix(in srgb, var(--surface) 88%, transparent);border:1.5px solid color-mix(in srgb, var(--primary) 28%, var(--line));width:4rem;height:4rem;box-shadow:var(--shadow-card);border-radius:1.15rem;place-items:center;animation:3.6s ease-in-out infinite errorFloat;display:grid;position:relative}.error-hero-mark .brand-mark{width:2.75rem;height:2.75rem;box-shadow:none;background:0 0;border:none}.error-hero-mark .brand-mark svg{width:2rem;height:1.55rem}.error-retry{min-width:10.5rem;margin-top:.35rem}.error-retry svg{width:1.1rem;height:1.1rem}@keyframes errorPulse{0%,to{opacity:.9;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes errorFloat{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.hint{color:var(--muted);margin:0;font-size:.94rem;font-weight:600;line-height:1.4}.hint.is-error,.is-error{color:var(--danger)}.banner-error{border-radius:var(--radius-sm);background:var(--error-wash);border:1.5px solid var(--error-line);color:var(--danger);margin:0;padding:10px 14px;font-weight:700}.gc-card{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-card);padding:20px}.section-title{letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin:0 0 14px;font-size:.75rem;font-weight:800}.btn{border-radius:var(--radius-sm);justify-content:center;align-items:center;gap:8px;min-height:48px;padding:12px 18px;font-weight:800;display:inline-flex}.btn.primary{background:linear-gradient(135deg, var(--primary), var(--primary-end));color:#fff;font-family:var(--display);min-height:52px;box-shadow:0 4px 14px #db54614d}.btn.primary:active{transform:scale(.97)}.btn:disabled{opacity:.45;cursor:wait}.empty-icon{background:var(--wash);width:64px;height:64px;color:var(--muted);border-radius:18px;place-items:center;margin:0 auto;display:grid}.empty-icon svg{width:32px;height:32px}.empty-icon.is-error{color:var(--danger)}.school-banner{color:#fff;text-align:center;border-radius:var(--radius);background:linear-gradient(135deg, var(--primary), var(--primary-end));padding:28px 24px 24px;box-shadow:0 6px 16px #db546147}.banner-brand{font-family:var(--display);letter-spacing:.08em;opacity:.85;margin:0;font-size:.75rem;font-weight:600}.banner-challenge{font-family:var(--display);letter-spacing:.04em;opacity:.95;margin:4px 0 10px;font-size:1.15rem;font-weight:700}.banner-value{font-family:var(--display);font-variant-numeric:tabular-nums;margin:0;font-size:clamp(2rem,5vw,3rem);font-weight:700}.banner-goal{opacity:.7;font-size:.42em;font-weight:600}.banner-pct{opacity:.88;margin:10px 0 0;font-weight:700}.banner-sub{opacity:.75;margin:4px 0 0;font-size:.9rem;font-weight:600}.progress-track{background:var(--progress-track);border-radius:999px;height:10px;overflow:hidden}.school-banner .progress-track{background:#ffffff38;max-width:520px;margin:16px auto 0}.progress-fill{height:100%;width:var(--pct,0%);border-radius:inherit;background:linear-gradient(90deg, var(--primary), var(--secondary));transition:width .8s}.school-banner .progress-fill{background:#fff;box-shadow:0 0 12px #ffffff73}.house-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;display:grid}.house-card{border-radius:var(--radius-sm);background:color-mix(in srgb, var(--house) 10%, var(--surface));border:1.5px solid color-mix(in srgb, var(--house) 28%, var(--line));padding:16px}.house-card-top{align-items:center;gap:8px;display:flex}.house-card-rank{align-items:center;display:inline-flex}.house-card-name{font-family:var(--display);margin:0;font-size:1.1rem;font-weight:700}.house-card-steps{font-family:var(--display);font-variant-numeric:tabular-nums;margin:12px 0 0;font-size:1.6rem;font-weight:700;line-height:1}.house-card-label{color:var(--muted);margin:4px 0 12px;font-size:.78rem;font-weight:700}.house-bar-track{background:var(--wash);border-radius:5px;height:8px;overflow:hidden}.house-bar-fill{height:100%;width:var(--pct,0%);background:var(--house);border-radius:5px;transition:width .45s}.house-card-share{color:var(--muted);margin:8px 0 0;font-size:.78rem;font-weight:700}.rank-medal{place-items:center;width:16px;display:inline-grid}.rank-medal svg{width:14px;height:14px}.rank-medal.rank-1{color:var(--medal-gold)}.rank-medal.rank-2{color:var(--medal-silver)}.rank-medal.rank-3{color:var(--medal-bronze)}.rank-num{color:var(--muted);font-size:.82rem;font-weight:800}.class-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.class-head .section-title{margin-bottom:0}.chip-row{flex-wrap:wrap;gap:6px;display:flex}.chip{background:var(--wash);min-height:36px;color:var(--muted);border-radius:999px;padding:6px 12px;font-size:.86rem;font-weight:800}.chip.is-active{background:var(--primary);color:#fff}.class-table-wrap{margin-top:14px;overflow-x:auto}.class-table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%}.class-table th,.class-table td{text-align:left;border-bottom:1px solid var(--line);padding:10px 8px}.class-table th{letter-spacing:.05em;text-transform:uppercase;color:var(--muted);font-size:.72rem;font-weight:800}.class-table td{font-weight:700}.class-table td:first-child,.class-table th:first-child{min-width:56px}.rank-cell{align-items:center;gap:6px;display:inline-flex}.class-name{font-family:var(--display);font-size:1.05rem}.class-steps,.class-table th:last-child,.class-table td:last-child{text-align:right}.class-empty{margin-top:16px}.class-section .hint{margin-top:12px}.spinner{border:2px solid color-mix(in srgb, var(--primary) 25%, transparent);border-top-color:var(--primary);border-radius:50%;width:16px;height:16px;animation:.8s linear infinite spin}.spinner-lg{width:36px;height:36px}@keyframes spin{to{transform:rotate(360deg)}}@media (width<=900px){.house-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=560px){.dash-shell{width:min(var(--dash-width), calc(100% - 24px));padding-top:8.5rem}.house-grid{grid-template-columns:1fr}.school-banner{padding:22px 16px 20px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
