:root{--nav:#17243a;--blue:#2563eb;--bg:#f4f7fb;--text:#182230;--muted:#697586;--border:#e4e9f0}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;color:var(--text);background:var(--bg)}a{color:inherit}.sidebar{position:fixed;inset:0 auto 0 0;width:230px;background:var(--nav);color:#fff;padding:24px 16px;z-index:20}.brand{font-size:23px;font-weight:800;padding:0 12px 24px}.sidebar nav{display:grid;gap:7px}.sidebar nav a,.sidebar nav span{padding:12px;border-radius:9px;text-decoration:none;color:#c8d1df}.sidebar nav a.active{background:#263752;color:#fff}.sidebar small{float:right;font-size:10px;opacity:.55}.shell{margin-left:230px;min-height:100vh}.topbar{height:68px;background:#fff;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 28px;gap:18px}.user-menu{margin-left:auto;display:flex;gap:14px;align-items:center;font-size:14px}.user-menu a{color:var(--blue);text-decoration:none}.user-menu form{margin:0}.link-button{border:0;background:none;color:var(--muted);cursor:pointer}.content{padding:28px;max-width:1400px;margin:auto}.page-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:22px}.page-heading h1,h1{margin:0 0 6px;font-size:25px}.page-heading p{margin:0;color:var(--muted)}.badge{padding:6px 10px;border-radius:99px;background:#dbeafe;color:#1d4ed8;font-size:13px}.cards{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.cards article,.panel{background:#fff;border:1px solid var(--border);border-radius:14px;padding:20px;box-shadow:0 2px 7px #1e293b0a}.cards span,.cards small{display:block;color:var(--muted)}.cards strong{display:block;font-size:30px;margin:12px 0}.empty{text-align:center;margin-top:18px;padding:60px 20px}.empty-icon,.login-logo{width:52px;height:52px;border-radius:15px;background:#dbeafe;color:var(--blue);display:grid;place-items:center;margin:auto;font-size:25px;font-weight:800}.empty h2{margin:15px 0 8px}.empty p{color:var(--muted)}.nav-toggle,.menu-button,.backdrop{display:none}.login-body{min-height:100vh;display:grid;place-items:center;padding:20px;background:linear-gradient(145deg,#eff6ff,#f8fafc)}.login-card{width:min(410px,100%);padding:38px;background:#fff;border:1px solid var(--border);border-radius:18px;box-shadow:0 18px 50px #17243a18}.login-card h1{text-align:center;margin:14px 0 5px}.login-card>p{text-align:center;color:var(--muted);margin:0 0 25px}.login-card label{display:grid;gap:7px;margin:15px 0;font-weight:600}.login-card input,.form-panel input{width:100%;padding:12px;border:1px solid #cbd5e1;border-radius:8px;font:inherit}.primary{width:100%;border:0;border-radius:8px;background:var(--blue);color:#fff;padding:12px;font:inherit;font-weight:700;cursor:pointer}.error,.notice{background:#fef2f2;color:#b91c1c;padding:11px;border-radius:8px}.form-panel{max-width:600px}.form-panel .helptext{display:block;color:var(--muted);font-size:13px}.form-panel ul{color:var(--muted);font-size:13px;padding-left:20px}
@media(max-width:800px){.sidebar{transform:translateX(-100%);transition:.2s}.shell{margin-left:0}.topbar{padding:0 16px}.menu-button{display:block;font-size:22px}.nav-toggle:checked~.sidebar{transform:none}.nav-toggle:checked~.backdrop{display:block;position:fixed;inset:0;background:#0006;z-index:10}.content{padding:18px 14px}.cards{grid-template-columns:repeat(2,1fr)}.user-menu span{display:none}}
@media(max-width:420px){.cards{grid-template-columns:1fr}.login-card{padding:28px 20px}.topbar{gap:10px}.user-menu{gap:8px}.page-heading{align-items:flex-start}}
.compact{width:auto;text-decoration:none;padding:10px 14px;display:inline-block}.secondary{border:1px solid #cbd5e1;border-radius:8px;background:#fff;color:#334155;padding:10px 14px;text-decoration:none;font:inherit;cursor:pointer}.table-panel{padding:0;overflow:hidden}.table-wrap{overflow-x:auto}.table-panel table{border-collapse:collapse;width:100%;min-width:680px}.table-panel th,.table-panel td{padding:15px 18px;border-bottom:1px solid var(--border);text-align:left;font-size:14px}.table-panel th{font-size:13px;color:var(--muted);background:#f8fafc;font-weight:600}.table-panel tbody tr:last-child td{border-bottom:0}.table-panel td a,.table-link,.panel-heading a{color:var(--blue);text-decoration:none}.status{display:inline-block;padding:3px 8px;border-radius:99px;background:#f1f5f9;color:#64748b;font-size:12px}.status.success{background:#dcfce7;color:#15803d}.search-form{display:flex;gap:10px;padding:16px;border-bottom:1px solid var(--border)}.search-form .form-control{max-width:280px}.form-row{margin:0 0 18px}.form-row>label{display:block;margin-bottom:7px;font-weight:600}.form-control{width:100%;padding:10px 11px;border:1px solid #cbd5e1;border-radius:8px;background:#fff;font:inherit;color:var(--text)}textarea.form-control{resize:vertical}.checkbox{width:16px;height:16px;vertical-align:middle;margin:0 7px 0 0}.check-row{display:flex;align-items:center}.check-row label{margin:0}.field-error{color:#b91c1c;font-size:13px;margin-top:5px}.required{color:#dc2626}.form-actions,.action-group{display:flex;gap:10px;align-items:center}.form-actions{margin-top:25px}.form-submit{width:auto;padding:10px 20px}.empty-state{padding:55px 20px;text-align:center;color:var(--muted)}.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.panel h2{font-size:17px;margin:0 0 16px}.panel dl{display:grid;grid-template-columns:110px 1fr;gap:13px;margin:0}.panel dt{color:var(--muted)}.panel dd{margin:0}.panel-heading{display:flex;align-items:center;justify-content:space-between}.contact-list{list-style:none;margin:0;padding:0}.contact-list li{display:grid;grid-template-columns:1fr auto;gap:6px;padding:12px 0;border-top:1px solid var(--border)}.contact-list li:first-child{border-top:0}.contact-list li>span{font-size:13px;color:var(--muted)}.contact-list li>a{grid-column:2;grid-row:1 / span 2;color:var(--blue);text-decoration:none;font-size:13px}.muted{color:var(--muted)}
@media(max-width:800px){.detail-grid{grid-template-columns:1fr}.page-heading{gap:12px}.page-heading .primary{flex-shrink:0}}
.calendar-tools{display:flex;gap:9px;margin:-8px 0 16px}.week-calendar{display:grid;grid-template-columns:repeat(7,minmax(150px,1fr));gap:10px;overflow-x:auto;padding-bottom:6px}.calendar-day{min-height:300px;background:#fff;border:1px solid var(--border);border-radius:12px;padding:12px;min-width:150px}.calendar-day.today{border-color:#93c5fd;box-shadow:0 0 0 1px #dbeafe}.calendar-day header{display:flex;justify-content:space-between;margin-bottom:10px;font-size:13px}.calendar-day header span{color:var(--muted)}.session-card{display:grid;gap:4px;text-decoration:none;background:#eff6ff;border-left:3px solid var(--blue);border-radius:6px;padding:9px;margin:0 0 9px;color:#1e3a5f;font-size:12px}.session-card strong{font-size:13px}.session-card span,.session-card small{color:#536c8c}.session-card.cancelled{background:#f8fafc;border-left-color:#94a3b8;color:#64748b;text-decoration:line-through}.no-session{font-size:12px;color:#94a3b8;margin:15px 0}.session-form{max-width:760px}.student-options{max-height:200px;overflow-y:auto;border:1px solid #cbd5e1;border-radius:8px;padding:8px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px}.student-options label{display:flex;gap:6px;align-items:center;padding:6px;font-weight:400}.student-options input{width:auto}.student-select>label{font-weight:600;display:block;margin-bottom:7px}
@media(max-width:800px){.week-calendar{grid-template-columns:repeat(7,150px)}.student-options{grid-template-columns:1fr}.calendar-tools{overflow-x:auto}}
.positive{color:#15803d;font-weight:700}.negative{color:#b91c1c;font-weight:700}
.financial-cards{margin-bottom:18px}.transaction-list{list-style:none;margin:0;padding:0}.transaction-list li{display:grid;gap:4px;padding:12px 0;border-top:1px solid var(--border)}.transaction-list li:first-child{border-top:0}.transaction-list span,.transaction-list small{color:var(--muted);font-size:13px}
.filter-bar{display:flex;gap:10px;align-items:end;margin:0 0 16px}.filter-bar .form-control{max-width:240px}.danger{border:1px solid #fecaca;border-radius:8px;background:#fff1f2;color:#be123c;padding:10px 14px;text-decoration:none;font:inherit;cursor:pointer;width:auto}.form-actions .danger{display:inline-block}
@media(max-width:800px){.filter-bar{flex-wrap:wrap}.filter-bar .form-control{max-width:none;flex:1 1 160px}.form-actions,.action-group{flex-wrap:wrap}.page-heading{align-items:flex-start}.page-heading .action-group{justify-content:flex-start}.table-panel th,.table-panel td{padding:12px}.form-panel{padding:16px}.form-row{margin-bottom:14px}}
@media(max-width:520px){.topbar{height:auto;min-height:58px}.user-menu a{font-size:12px}.page-heading h1,h1{font-size:22px}.cards article,.panel{padding:16px}.cards strong{font-size:26px}.action-group>a,.action-group>button{font-size:13px;padding:9px 11px}.form-actions{display:grid;grid-template-columns:1fr 1fr}.form-actions .primary,.form-actions .secondary{width:100%;text-align:center}.calendar-tools{padding-bottom:4px}}

/* 开心英语：温暖自然的学习空间 */
:root{--nav:#fdfbf6;--blue:#5f8061;--bg:#f8f6f0;--text:#344238;--muted:#839083;--border:#ebe7dd;--accent:#d9874a;--soft-green:#eff4ed;--card:#fffefa}
body{background:var(--bg);color:var(--text)}
.sidebar{width:260px;padding:24px 16px;background:var(--nav);border-right:1px solid var(--border);color:var(--text);box-shadow:none}
.brand{display:grid;grid-template-columns:42px 1fr;column-gap:9px;align-items:center;padding:5px 12px 28px;font-size:25px;color:#304236;line-height:1}
.brand:before{content:"✦";display:grid;place-items:center;width:39px;height:39px;border-radius:15px;background:linear-gradient(135deg,#688967 0 45%,#de9560 46%);color:#fff;font-size:20px;grid-row:1 / span 2}
.brand span{font-weight:800}.brand small{float:none;font-size:9px;letter-spacing:1.5px;color:#aab29f;opacity:1;margin-top:5px}
.sidebar nav{gap:4px}.sidebar nav a{color:#667064;padding:11px 12px;border-radius:10px;font-size:15px;transition:.18s}.sidebar nav a:hover,.sidebar nav a.active{background:#668565;color:#fff;box-shadow:0 4px 12px #6685652b}.sidebar nav a:before{content:"○";display:inline-block;width:22px;color:inherit;font-size:14px}.shell{margin-left:260px}.topbar{height:74px;background:#fffefa;border-bottom:1px solid var(--border);padding:0 34px}.topbar strong{font-size:19px}.topbar:after{content:"开心英语";margin-left:auto;color:#70806d;font-size:14px}.user-menu{margin-left:0;gap:13px;color:#697569}.topbar-bell{font-size:18px;color:#58715b}.content{max-width:1560px;padding:28px 34px}.panel,.cards article{background:var(--card);border:1px solid #f0ede5;border-radius:16px;box-shadow:0 8px 24px #5c684408}.page-heading h1,h1{color:#334137}.page-heading p,.muted{color:#889284}.primary{background:#5e8060;border-radius:10px}.primary:hover{background:#4e6f50}.secondary{border-color:#dce4d8;color:#58705a;background:#fffefa}.notice{background:#f3f7ef;color:#527053}.error{background:#fff3ef;color:#b85d45}.form-control{background:#fffefa;border-color:#dde4d9}.table-panel th{background:#f8f7f2;color:#788374}.table-panel td a,.table-link,.panel-heading a{color:#5d8060}.status.success{background:#e7f1e4;color:#4e754f}.danger{background:#fff7f3;border-color:#f4d6ca;color:#b9654e}
.welcome-banner{min-height:150px;display:flex;justify-content:space-between;align-items:center;padding:18px 34px 18px 22px;margin-bottom:18px;border-radius:18px;background:linear-gradient(100deg,#fffefa 0%,#fffefa 58%,#f3e9da 58%,#f7ecde 100%);border:1px solid #f0eadf;overflow:hidden}.welcome-banner h1{font-size:28px;margin:4px 0 7px}.welcome-banner p{margin:0;color:#859181}.eyebrow{font-size:11px!important;letter-spacing:1.3px;color:#d08a59!important;font-weight:700}.welcome-illustration{position:relative;width:290px;height:110px}.welcome-illustration:before{content:"";position:absolute;inset:0;background:#eadac6;border-radius:100% 100% 0 0;opacity:.8}.welcome-illustration i{position:absolute;right:88px;bottom:3px;width:42px;height:76px;background:#7f9b73;border-radius:25px 25px 5px 5px;box-shadow:-17px 13px 0 -6px #a8b99a,18px 14px 0 -5px #668762}.welcome-illustration b{position:absolute;right:37px;bottom:0;width:55px;height:42px;border:4px solid #d7a879;border-bottom:0}.welcome-illustration span{position:absolute;z-index:1;right:100px;top:8px;color:#d98b54;font-size:24px}
.dashboard-grid{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:18px}.dashboard-main{min-width:0}.warm-cards{grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:18px}.warm-cards article{display:flex;gap:13px;align-items:center;padding:17px}.warm-cards small{font-size:13px}.warm-cards strong{font-size:26px;margin:4px 0;white-space:nowrap}.warm-cards em{display:block;color:#8b988a;font-style:normal;font-size:11px}.metric-icon{flex:0 0 auto;display:grid;place-items:center;width:43px;height:43px;border-radius:50%;font-size:20px;font-weight:700;background:#edf3ea;color:#5e8060}.metric-icon.calendar{background:#f8eee3;color:#d6884a}.metric-icon.income{background:#eef1df;color:#6d8660}.metric-icon.wallet{background:#fbeee4;color:#c67a45}.today-panel{min-height:315px}.today-panel .panel-heading{margin-bottom:10px}.today-panel .transaction-list li{grid-template-columns:1fr auto;align-items:center;padding:16px 7px}.today-panel .transaction-list strong{display:grid;grid-template-columns:64px 1fr;gap:8px;align-items:center}.today-panel time{font-size:16px;color:#5c7a5f}.today-panel .transaction-list span{grid-column:1;grid-row:2;padding-left:72px}.today-panel .transaction-list a{grid-column:2;grid-row:1 / span 2;color:#5d8060;text-decoration:none;font-size:13px}.soft-empty{display:grid;place-items:center;min-height:190px;color:#8f9b8c}.soft-empty b{font-size:33px;color:#d98952}.soft-empty p{margin:8px 0}.quick-panel{padding:20px}.quick-panel h2,.reminder-panel h2{font-size:17px;margin-bottom:17px}.quick-actions{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.quick-actions a{display:grid;gap:7px;place-items:center;text-decoration:none;color:#657461;font-size:11px;text-align:center}.quick-actions b{display:grid;place-items:center;width:47px;height:47px;border-radius:50%;background:#eff3eb;color:#5e8060;font-size:20px}.quick-actions a:nth-child(2) b,.quick-actions a:nth-child(4) b{background:#fdf0e7;color:#ce834a}.reminder-panel{margin-top:18px;padding:20px}.reminder-panel .panel-heading{margin-bottom:2px}.reminder-panel>a{display:grid;grid-template-columns:35px 1fr auto;gap:10px;align-items:center;padding:16px 0;border-top:1px solid var(--border);text-decoration:none;color:#758170}.reminder-panel>a>b{display:grid;place-items:center;width:32px;height:32px;border-radius:50%;background:#f3f4ed;color:#d18750}.reminder-panel>a:nth-of-type(2)>b{color:#668565;background:#edf4ec}.reminder-panel>a span{font-size:13px;color:#4c5b4d}.reminder-panel>a small{display:block;margin-top:4px;color:#98a198;font-size:11px}.reminder-panel>a:last-child{padding-bottom:0}
.login-body{background:radial-gradient(circle at 15% 20%,#e4ecdf 0,transparent 32%),radial-gradient(circle at 85% 85%,#f5ddc9 0,transparent 30%),#f8f6ef}.login-card{border-color:#ebe5d9;background:#fffefa;box-shadow:0 22px 55px #64745b1f}.login-logo{background:#668565;color:#fff}.login-card h1{color:#435a45}.login-card>p{color:#849082}
@media(max-width:1080px){.warm-cards{grid-template-columns:repeat(2,1fr)}.dashboard-grid{grid-template-columns:1fr}.dashboard-aside{display:grid;grid-template-columns:1fr 1fr;gap:18px}.reminder-panel{margin-top:0}}
@media(max-width:800px){.sidebar{width:260px}.shell{margin-left:0}.topbar{padding:0 16px}.topbar:after{display:none}.content{padding:16px}.welcome-banner{padding:20px;min-height:130px}.welcome-illustration{width:140px;transform:scale(.72);transform-origin:right center}.dashboard-aside{grid-template-columns:1fr}.reminder-panel{margin-top:0}.sidebar nav a:hover{background:#668565;color:#fff}}
@media(max-width:520px){.welcome-banner h1{font-size:23px}.welcome-illustration{display:none}.warm-cards{grid-template-columns:1fr 1fr}.warm-cards article{padding:13px;gap:9px}.warm-cards strong{font-size:20px}.metric-icon{width:36px;height:36px}.quick-actions b{width:42px;height:42px}.today-panel .transaction-list strong{grid-template-columns:48px 1fr}.today-panel .transaction-list span{padding-left:56px}.today-panel .transaction-list a{font-size:12px}}
.login-help{font-size:12px!important;margin-top:18px!important}.two-factor-panel{max-width:850px;margin-bottom:18px}.two-factor-panel h2{margin-top:12px}.setup-panel{display:grid;grid-template-columns:minmax(280px,1fr) minmax(260px,360px);gap:34px;align-items:start}.setup-panel p{line-height:1.7;color:var(--muted)}.totp-qr{display:block;width:210px;height:210px;margin:18px 0 14px;border:8px solid #fff;border-radius:12px;box-shadow:0 5px 15px #5c684414}.setup-panel details{color:#687765;font-size:14px}.manual-key{display:block;margin-top:9px;padding:10px;border-radius:8px;background:#f5f4ed;word-break:break-all;color:#455546}.recovery-panel{border-color:#ecd9b8;background:#fffdf7}.recovery-codes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:18px 0}.recovery-codes code{padding:11px 8px;text-align:center;border-radius:8px;background:#f4efe4;color:#5a513e;font-size:15px;font-weight:700;letter-spacing:.5px}.two-factor-form{padding:20px;border-radius:12px;background:#f8f8f2;border:1px solid #ebece4}.two-factor-form h2{margin-top:0}@media(max-width:700px){.setup-panel{grid-template-columns:1fr}.recovery-codes{grid-template-columns:repeat(2,1fr)}}

/* 可切换主题：默认暖阳，其他主题只替换设计变量，页面布局保持一致。 */
html[data-theme="warm"]{--nav:#fdfbf6;--blue:#5f8061;--bg:#f8f6f0;--text:#344238;--muted:#839083;--border:#ebe7dd;--accent:#d9874a;--soft-green:#eff4ed;--card:#fffefa}
html[data-theme="ocean"]{--nav:#fbfdff;--blue:#397796;--bg:#f1f7fb;--text:#263d4a;--muted:#718895;--border:#dce9ef;--accent:#dd8c58;--soft-green:#eaf4f7;--card:#ffffff}
html[data-theme="violet"]{--nav:#fdfaff;--blue:#7464a3;--bg:#f6f3fb;--text:#39334c;--muted:#837b99;--border:#e9e3f1;--accent:#bd7b9b;--soft-green:#f0edfa;--card:#fffefe}
html[data-theme="night"]{--nav:#162331;--blue:#71a59a;--bg:#0f1822;--text:#e3edf2;--muted:#a3b3be;--border:#2a3b4a;--accent:#e3a165;--soft-green:#203440;--card:#1b2936}
.theme-switcher{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);white-space:nowrap}.theme-switcher select{border:1px solid var(--border);border-radius:7px;background:var(--card);color:var(--text);padding:5px 22px 5px 7px;font:inherit;cursor:pointer}
html[data-theme="ocean"] .welcome-banner{background:linear-gradient(100deg,#fff 0%,#fff 58%,#e2f0f6 58%,#eaf5f8 100%)}html[data-theme="ocean"] .welcome-illustration:before{background:#cae1e8}html[data-theme="ocean"] .welcome-illustration i{background:#5d91a3;box-shadow:-17px 13px 0 -6px #9fc5ce,18px 14px 0 -5px #4d7f92}html[data-theme="ocean"] .welcome-illustration b{border-color:#d28b66}
html[data-theme="violet"] .welcome-banner{background:linear-gradient(100deg,#fffefe 0%,#fffefe 58%,#eee5f5 58%,#f4ebf6 100%)}html[data-theme="violet"] .welcome-illustration:before{background:#e4d9ee}html[data-theme="violet"] .welcome-illustration i{background:#8c7fb0;box-shadow:-17px 13px 0 -6px #b9afd1,18px 14px 0 -5px #74679c}html[data-theme="violet"] .welcome-illustration b{border-color:#c784a3}
html[data-theme="night"] .topbar,html[data-theme="night"] .welcome-banner,html[data-theme="night"] .panel,html[data-theme="night"] .cards article,html[data-theme="night"] .calendar-day,html[data-theme="night"] .form-control,html[data-theme="night"] .theme-switcher select{background:var(--card);color:var(--text);border-color:var(--border)}html[data-theme="night"] .sidebar{border-color:var(--border)}html[data-theme="night"] .sidebar nav a{color:#b6c5ce}html[data-theme="night"] .sidebar nav a.active,html[data-theme="night"] .sidebar nav a:hover{background:#294656;color:#fff}html[data-theme="night"] .welcome-banner{background:linear-gradient(100deg,#1b2936 0%,#1b2936 58%,#203542 58%,#25404b 100%);border-color:var(--border)}html[data-theme="night"] .welcome-illustration:before{background:#294757}html[data-theme="night"] .welcome-illustration i{background:#659486;box-shadow:-17px 13px 0 -6px #497565,18px 14px 0 -5px #3f7b86}html[data-theme="night"] .welcome-illustration b{border-color:#db9b69}html[data-theme="night"] .table-panel th{background:#22323f;color:#bfccd3}html[data-theme="night"] .table-panel td{border-color:var(--border)}html[data-theme="night"] .two-factor-form{background:#22323f;border-color:var(--border)}html[data-theme="night"] .manual-key,html[data-theme="night"] .recovery-codes code{background:#263947;color:#e3edf2}html[data-theme="night"] .recovery-panel{background:#2b2b29;border-color:#5d4e3d}@media(max-width:650px){.theme-switcher{display:none}}
