:root{--fudan-purple:#7f238f;--ink:#17141b;--muted:#68616f;--line:#e8e1ea;--paper:#fbfaf7;--warm:#d7b46a;--teal:#147c7c;--white:#fff}*{box-sizing:border-box}html{scroll-behavior:smooth}body{color:var(--ink);background:var(--paper);margin:0;font-family:Arial,PingFang SC,Microsoft YaHei,sans-serif}a{color:inherit;text-decoration:none}button,input{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed}.hero-shell{min-height:92vh;color:var(--white);background:linear-gradient(110deg,#26142ce0,#7f238fc2),url(/images/fdsm-campus-bg.jpg) 50%/cover;padding:24px clamp(18px,4vw,64px) 56px}.topbar,.hero-grid,.stats-band,.section-grid,.today-board,.feature-grid{width:min(1180px,100%);margin:0 auto}.topbar{justify-content:space-between;align-items:center;gap:18px;display:flex}.brand,.top-actions,.hero-actions,.panel-head,.search-input{align-items:center;display:flex}.brand{gap:10px;font-weight:700}.top-actions{gap:12px;font-size:14px}.top-actions a,.top-actions button,.hero-actions a{color:var(--white);background:#ffffff14;border:1px solid #ffffff6b;border-radius:8px;padding:10px 14px}.top-actions button,.logout-button{align-items:center;gap:6px;display:inline-flex}.top-actions button{border-color:#ffffff47}.hero-grid{grid-template-columns:minmax(0,1fr) 380px;align-items:end;gap:40px;min-height:72vh;display:grid}.eyebrow,.section-title span,.today-board span{color:var(--warm);text-transform:uppercase;letter-spacing:0;font-size:13px;font-weight:700}.hero-copy h1{letter-spacing:0;max-width:760px;margin:18px 0;font-size:clamp(40px,5vw,62px);line-height:1.08}.hero-copy p{color:#ffffffd6;max-width:560px;font-size:17px;line-height:1.7}.hero-actions{gap:14px;margin-top:30px}.hero-actions a:first-child{color:var(--ink);background:var(--white)}.notice-panel{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#ffffff1f;border:1px solid #ffffff4d;border-radius:8px;padding:18px}.panel-head{gap:8px;margin-bottom:14px;font-weight:700}.notice-panel article{color:var(--ink);background:#ffffffeb;border-radius:8px;padding:16px}.notice-panel article+article{margin-top:12px}.notice-panel small,.notice-panel p,.stats-band p,.feature-grid p,.today-board p,.student-list p{color:var(--muted)}.notice-panel strong,.student-list strong,.schedule-list strong,.feature-grid strong{display:block}.notice-panel p{margin:8px 0 0;line-height:1.55}.stats-band{grid-template-columns:repeat(4,1fr);gap:14px;padding:24px clamp(18px,4vw,0);display:grid;transform:translateY(-34px)}.stats-band article,.search-card,.today-board,.feature-grid article{border:1px solid var(--line);background:var(--white);border-radius:8px;box-shadow:0 18px 44px #3d274414}.stats-band article{padding:22px}.stats-band strong{color:var(--fudan-purple);font-size:38px;display:block}.stats-band span{font-weight:700}.section-grid{grid-template-columns:.8fr 1.2fr;gap:34px;padding:32px clamp(18px,4vw,0) 70px;display:grid}.section-title h2,.today-board h2{margin:10px 0 0;font-size:clamp(28px,4vw,46px);line-height:1.16}.search-card{padding:22px}.search-card label{color:var(--muted);margin-bottom:10px;font-size:14px;display:block}.search-input{border:1px solid var(--line);border-radius:8px;gap:10px;padding:13px 14px}.search-input input{border:0;outline:0;width:100%}.student-list{gap:10px;margin-top:18px;display:grid}.student-list article{background:#f7f2f7;border-radius:8px;justify-content:space-between;align-items:center;gap:14px;padding:14px;display:flex}.student-list span{color:var(--muted);margin-top:3px;font-size:13px;display:block}.student-list p{margin:0;font-weight:700}.search-state{color:var(--muted);margin:12px 0 0;font-size:14px}.search-state.is-error{color:#9d1d1d}.today-board{grid-template-columns:.7fr 1.3fr;gap:24px;padding:28px;display:grid}.schedule-list{gap:12px;display:grid}.schedule-list article{border:1px solid var(--line);border-radius:8px;grid-template-columns:120px 1fr;gap:8px 16px;padding:14px;display:grid}.schedule-list time{color:var(--teal);grid-row:span 2;font-weight:700}.schedule-list span{color:var(--muted)}.feature-grid{grid-template-columns:repeat(3,1fr);gap:14px;padding:70px clamp(18px,4vw,0);display:grid}.feature-grid article{padding:22px}.feature-grid svg{color:var(--fudan-purple)}.feature-grid strong{margin-top:14px;font-size:18px}.feature-grid p{line-height:1.7}@media (max-width:820px){.hero-shell{min-height:auto;padding-bottom:34px}.topbar,.top-actions,.hero-grid,.section-grid,.today-board{display:block}.top-actions{margin-top:14px}.top-actions a,.top-actions button{display:none}.top-actions a:last-of-type{width:100%;display:block}.hero-copy{padding:74px 0 24px}.hero-copy h1{font-size:34px}.hero-copy p{font-size:16px}.hero-actions a{text-align:center;flex:1}.stats-band,.feature-grid{grid-template-columns:1fr 1fr}.stats-band{transform:none}.section-grid,.today-board,.feature-grid{padding-left:18px;padding-right:18px}.search-card,.schedule-list{margin-top:22px}}.login-page{min-height:100vh;color:var(--ink);background:linear-gradient(125deg,#ffffffeb,#fbfaf7db),url(/images/fdsm-campus-bg.jpg) 50%/cover;padding:22px clamp(18px,4vw,56px) 48px}.login-brand,.login-layout{width:min(980px,100%);margin:0 auto}.login-brand a{align-items:center;gap:10px;font-weight:700;display:inline-flex}.login-layout{grid-template-columns:minmax(0,.9fr) minmax(320px,420px);align-items:center;gap:42px;min-height:calc(100vh - 100px);display:grid}.login-copy span{color:var(--fudan-purple);font-size:13px;font-weight:700}.login-copy h2{letter-spacing:0;max-width:560px;margin:14px 0;font-size:clamp(34px,6vw,62px);line-height:1.08}.login-copy p{max-width:500px;color:var(--muted);font-size:17px;line-height:1.8}.login-card{border:1px solid var(--line);background:#fffffff0;border-radius:8px;width:100%;padding:18px;box-shadow:0 20px 50px #3d27441f}.login-mode{border:1px solid var(--line);background:#f4eff5;border-radius:8px;grid-template-columns:1fr 1fr;gap:6px;padding:4px;display:grid}.login-mode button{min-height:42px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px}.login-mode button.active{color:var(--ink);background:var(--white);box-shadow:0 8px 20px #3d274414}.login-heading{align-items:flex-start;gap:14px;padding:24px 4px 18px;display:flex}.login-heading svg{color:var(--fudan-purple);flex:none}.login-heading h1{margin:0;font-size:28px}.login-heading p{color:var(--muted);margin:8px 0 0;line-height:1.55}.login-form{gap:16px;display:grid}.login-form label span{color:var(--muted);margin-bottom:8px;font-size:14px;font-weight:700;display:block}.field-shell{border:1px solid var(--line);background:var(--white);border-radius:8px;align-items:center;gap:10px;min-height:50px;padding:0 14px;display:flex}.field-shell:focus-within{border-color:var(--fudan-purple);box-shadow:0 0 0 3px #7f238f1f}.field-shell svg{color:var(--muted);flex:none}.field-shell input{width:100%;min-width:0;color:var(--ink);background:0 0;border:0;outline:0}.login-message{border-radius:8px;margin:0;padding:12px 14px;font-size:14px;line-height:1.5}.login-message.error{color:#8a1f1f;background:#fff0f0}.login-message.success{color:#176b3b;background:#effaf3}.login-submit{min-height:52px;color:var(--white);background:var(--fudan-purple);cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;gap:8px;display:inline-flex}.login-submit:disabled{cursor:wait;opacity:.72}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}@media (max-width:820px){.login-layout{grid-template-columns:1fr;align-items:start;gap:24px;min-height:auto;padding-top:44px}.login-copy h2{font-size:36px}.login-copy p{font-size:16px}}@media (max-width:560px){.stats-band,.feature-grid,.schedule-list article{grid-template-columns:1fr}.schedule-list time{grid-row:auto}}.mg-page,.mg-admin-page{background:linear-gradient(#ffffffb8,#fbfaf7fa),#fbfaf7;min-height:100vh}.mg-hero,.mg-browser,.mg-featured,.mg-admin-hero,.mg-admin-layout{width:min(1180px,100%);margin:0 auto;padding-left:clamp(18px,4vw,0px);padding-right:clamp(18px,4vw,0px)}.mg-hero{grid-template-columns:minmax(0,1fr) 390px;align-items:end;gap:30px;padding-top:54px;padding-bottom:34px;display:grid}.mg-hero-copy h1,.mg-featured h2,.mg-admin-hero h1{letter-spacing:0;margin:10px 0 12px;font-size:clamp(34px,5vw,58px);line-height:1.08}.mg-hero-copy p,.mg-featured p,.mg-admin-hero p,.mg-stage-cover p,.mg-card p{color:var(--muted);line-height:1.75}.mg-eyebrow{color:var(--fudan-purple);letter-spacing:0;text-transform:uppercase;font-size:13px;font-weight:800}.mg-hero-stats,.mg-admin-checklist{gap:12px;display:grid}.mg-hero-stats{grid-template-columns:repeat(3,1fr)}.mg-hero-stats article,.mg-timeline,.mg-stage-view,.mg-card,.mg-storage-panel,.mg-upload-form{border:1px solid var(--line);background:var(--white);border-radius:8px;box-shadow:0 18px 44px #3d274414}.mg-hero-stats article{min-width:0;padding:18px}.mg-hero-stats svg,.mg-admin-checklist svg,.mg-panel-head svg,.mg-toolbar-meta svg,.mg-asset-row svg,.mg-mention-row svg,.mg-field-title svg,.mg-file-drop svg{color:var(--fudan-purple)}.mg-hero-stats strong{color:var(--ink);margin-top:8px;font-size:32px;display:block}.mg-hero-stats span{color:var(--muted);font-size:13px}.mg-browser{grid-template-columns:310px minmax(0,1fr);align-items:start;gap:18px;padding-bottom:54px;display:grid}.mg-timeline,.mg-stage-view,.mg-storage-panel,.mg-upload-form{padding:18px}.mg-panel-head,.mg-toolbar,.mg-search,.mg-toolbar-meta,.mg-card-kicker,.mg-asset-row,.mg-mention-row,.mg-admin-checklist span,.mg-field-title,.mg-file-drop{align-items:center;display:flex}.mg-panel-head{gap:8px;margin-bottom:14px;font-weight:800}.mg-mobile-tabs{display:none}.mg-rail{gap:10px;display:grid}.mg-rail button,.mg-mobile-tabs button{border:1px solid var(--line);width:100%;color:var(--ink);cursor:pointer;text-align:left;background:#fbfaf7;border-radius:8px}.mg-rail button{padding:14px}.mg-rail button.active,.mg-mobile-tabs button.active{background:#f7edf8;border-color:#7f238f61}.mg-rail span,.mg-mobile-tabs span,.mg-stage-cover span,.mg-card-kicker,.mg-visibility{color:var(--muted);font-size:12px}.mg-rail strong{margin:6px 0;display:block}.mg-rail small{color:var(--teal)}.mg-stage-cover{grid-template-columns:260px minmax(0,1fr);align-items:center;gap:18px;display:grid}.mg-stage-cover img,.mg-card-preview img{object-fit:cover;width:100%}.mg-stage-cover img{aspect-ratio:16/10;border-radius:8px}.mg-stage-cover h2{margin:6px 0 8px;font-size:clamp(24px,3vw,38px);line-height:1.16}.mg-stage-cover p,.mg-card p,.mg-featured p,.mg-admin-hero p{margin:0}.mg-toolbar{justify-content:space-between;gap:14px;margin:18px 0}.mg-search{border:1px solid var(--line);background:#fbfaf7;border-radius:8px;flex:1;gap:10px;min-width:0;padding:12px 13px}.mg-search input{background:0 0;border:0;outline:0;width:100%;min-width:0}.mg-toolbar-meta{white-space:nowrap;color:var(--teal);gap:7px;font-weight:800}.mg-card-grid,.mg-featured-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;display:grid}.mg-empty-state{color:var(--muted);background:#ffffffb8;border:1px dashed #d9cddd;border-radius:8px;margin:0;padding:18px}.mg-card{overflow:hidden}.mg-card-preview{background:#f3eef4;position:relative}.mg-card-preview img,.mg-file-preview{aspect-ratio:16/10}.mg-file-preview{color:var(--fudan-purple);place-items:center;display:grid}.mg-file-preview span{color:var(--muted);font-weight:800;display:block}.mg-visibility{color:var(--ink);background:#ffffffe6;border-radius:8px;padding:6px 8px;font-weight:800;position:absolute;bottom:10px;right:10px}.mg-card-body{padding:16px}.mg-card-kicker{justify-content:space-between;gap:10px}.mg-card h3{margin:8px 0;font-size:19px;line-height:1.25}.mg-asset-row,.mg-mention-row{flex-wrap:wrap;gap:8px;margin-top:12px}.mg-asset-row span,.mg-mention-row span{max-width:100%;color:var(--muted);background:#f7f2f7;border-radius:8px;align-items:center;gap:5px;padding:6px 8px;font-size:12px;display:inline-flex}.mg-mention-row{color:var(--fudan-purple)}.mg-featured{grid-template-columns:320px minmax(0,1fr);gap:24px;padding-bottom:70px;display:grid}.mg-card-compact{grid-template-columns:150px minmax(0,1fr);display:grid}.mg-card-compact .mg-card-preview img,.mg-card-compact .mg-file-preview{height:100%;min-height:170px}.mg-card-compact .mg-card-body{min-width:0}.mg-admin-hero{grid-template-columns:minmax(0,1fr) 360px;align-items:end;gap:24px;padding-top:54px;padding-bottom:28px;display:grid}.mg-admin-checklist{border:1px solid var(--line);background:var(--white);border-radius:8px;padding:18px}.mg-admin-checklist span{color:var(--muted);gap:8px;font-weight:700}.mg-admin-layout{grid-template-columns:minmax(0,1fr) 360px;align-items:start;gap:18px;padding-bottom:70px;display:grid}.mg-upload-form{gap:16px;display:grid}.mg-form-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;display:grid}.mg-upload-form label{color:var(--muted);gap:8px;font-size:14px;font-weight:700;display:grid}.mg-upload-form input,.mg-upload-form select,.mg-upload-form textarea{border:1px solid var(--line);width:100%;color:var(--ink);background:#fbfaf7;border-radius:8px;padding:12px}.mg-upload-form select[multiple]{min-height:118px}.mg-field-title{gap:6px}.mg-file-drop{text-align:center;background:#f7edf8;border:1px dashed #7f238f7a;border-radius:8px;justify-content:center;min-height:180px}.mg-file-drop span{max-width:520px;color:var(--muted);font-weight:400}.mg-file-drop input{background:var(--white);max-width:320px}.mg-form-actions{justify-content:flex-end;gap:12px;display:flex}.mg-form-actions button{border:1px solid var(--fudan-purple);color:var(--fudan-purple);background:var(--white);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:8px;padding:11px 15px;display:inline-flex}.mg-form-actions button:last-child,.mg-delete-box button{color:var(--white);background:var(--fudan-purple)}.mg-form-actions button:disabled,.mg-delete-box button:disabled{cursor:not-allowed;opacity:.68}.mg-toggle-line{grid-template-columns:auto minmax(0,1fr);place-content:center start;min-height:45px}.mg-toggle-line input{width:auto}.mg-mention-hints{flex-wrap:wrap;gap:8px;display:flex}.mg-mention-hints button{border:1px solid var(--line);color:var(--fudan-purple);cursor:pointer;background:#fbfaf7;border-radius:8px;padding:7px 10px}.mg-status{border-radius:8px;align-items:flex-start;gap:8px;margin:0 0 14px;padding:11px 12px;line-height:1.55;display:flex}.mg-status svg{flex:none;margin-top:3px}.mg-status-ok{color:#145c4a;background:#e9f6f1}.mg-status-error{color:#8b1e2d;background:#fff0f1}.mg-upload-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.mg-upload-list li{border:1px solid var(--line);background:#fbfaf7;border-radius:8px;gap:4px;padding:10px;display:grid}.mg-upload-list strong,.mg-upload-list small{overflow-wrap:anywhere}.mg-upload-list span,.mg-upload-list small{color:var(--muted);font-size:12px}.mg-upload-list em{width:fit-content;color:var(--teal);background:#e9f6f1;border-radius:8px;padding:4px 7px;font-size:12px;font-style:normal;font-weight:800}.mg-upload-list em[data-phase=failed]{color:#8b1e2d;background:#fff0f1}.mg-delete-box{gap:10px;display:grid}.mg-storage-panel .mg-delete-box{border-top:0;padding:0}.mg-delete-box input{border:1px solid var(--line);width:100%;color:var(--ink);background:#fbfaf7;border-radius:8px;padding:10px 11px}.mg-delete-box button{border:1px solid var(--fudan-purple);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:7px;width:fit-content;padding:9px 11px;display:inline-flex}.mg-delete-box span{color:var(--muted);line-height:1.5}.mg-spin{animation:.9s linear infinite mg-spin}@keyframes mg-spin{to{transform:rotate(360deg)}}.mg-storage-panel h2{margin:0 0 14px}.mg-storage-panel dl,.mg-storage-panel dd{margin:0}.mg-storage-panel div{border-top:1px solid var(--line);padding:14px 0}.mg-storage-panel dt{color:var(--muted);margin-bottom:6px;font-size:13px;font-weight:800}.mg-storage-panel dd{overflow-wrap:anywhere;line-height:1.55}@media (max-width:900px){.mg-hero,.mg-browser,.mg-featured,.mg-admin-hero,.mg-admin-layout{display:block}.mg-hero-stats,.mg-admin-checklist,.mg-timeline,.mg-stage-view,.mg-featured-list,.mg-storage-panel{margin-top:18px}.mg-rail{display:none}.mg-mobile-tabs{gap:10px;padding-bottom:4px;display:flex;overflow-x:auto}.mg-mobile-tabs button{flex:0 0 230px;padding:12px}.mg-mobile-tabs span{margin-bottom:5px;display:block}}@media (max-width:680px){.mg-hero{padding-top:34px}.mg-hero-stats,.mg-card-grid,.mg-featured-list,.mg-form-row,.mg-stage-cover{grid-template-columns:1fr}.mg-toolbar{display:grid}.mg-card-compact{grid-template-columns:1fr}.mg-form-actions{display:grid}}.app-page{background:linear-gradient(#ffffffd1,#fbfaf7 360px),radial-gradient(circle at 0 0,#147c7c1f,#0000 340px);min-height:100vh;padding:28px clamp(16px,4vw,56px) 56px}.directory-shell,.admin-import-panel,.admin-table-panel,.admin-module-grid,.admin-hero{width:100%;max-width:1180px;margin:0 auto}.directory-header,.admin-hero,.admin-import-panel,.admin-table-panel{border:1px solid var(--line);background:var(--white);border-radius:8px;box-shadow:0 16px 42px #3d274412}.directory-header,.admin-panel-head,.admin-hero{justify-content:space-between;align-items:flex-start;gap:20px;display:flex}.directory-header{padding:24px}.directory-kicker{color:var(--teal);font-size:13px;font-weight:700}.directory-header h1,.admin-hero h1,.admin-panel-head h2{letter-spacing:0;margin:8px 0;line-height:1.12}.directory-header h1,.admin-hero h1{font-size:clamp(30px,5vw,48px)}.admin-panel-head h2{font-size:28px}.directory-header p,.admin-hero p,.admin-panel-head p,.preview-bucket p{color:var(--muted);margin:0;line-height:1.65}.role-switcher,.import-actions,.admin-table-toolbar,.quick-chips{align-items:center;gap:8px;display:flex}.role-switcher,.quick-chips{flex-wrap:wrap}.role-switcher{justify-content:flex-end;min-width:260px}.role-switcher button,.quick-chips button,.directory-result-bar button,.import-actions button,.import-actions label,.admin-table-toolbar button,.save-draft-button{border:1px solid var(--line);min-height:38px;color:var(--ink);background:var(--white);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:7px;padding:9px 12px;display:inline-flex}.role-switcher button.is-active,.quick-chips button.is-active,.save-draft-button,.primary-action-button{color:var(--white);background:var(--fudan-purple);border-color:#7f238f38}.role-switcher button:disabled,.quick-chips button:disabled,.directory-result-bar button:disabled,.import-actions button:disabled,.admin-table-toolbar button:disabled,.save-draft-button:disabled,.primary-action-button:disabled{cursor:not-allowed;opacity:.58}.import-actions label:has(input:disabled){cursor:not-allowed;opacity:.58}.directory-layout{grid-template-columns:280px minmax(0,1fr);gap:18px;margin-top:18px;display:grid}.directory-filter-panel,.mobile-filter-card,.directory-result-bar,.directory-student-card{border:1px solid var(--line);background:var(--white);border-radius:8px}.directory-filter-panel{align-self:start;padding:16px;position:sticky;top:18px}.directory-filters{gap:13px;display:grid}.directory-filters.is-compact{grid-template-columns:repeat(2,minmax(0,1fr));padding-top:14px}.filter-field{gap:7px;display:grid}.filter-field span{color:var(--muted);font-size:13px;font-weight:700}.filter-field input,.filter-field select,.directory-search input,.admin-table-wrap input,.admin-table-wrap select{border:1px solid var(--line);width:100%;color:var(--ink);background:var(--white);border-radius:8px;outline:0;padding:10px 11px}.directory-search{border:1px solid var(--line);background:var(--white);border-radius:8px;align-items:center;gap:9px;padding:0 11px;display:flex}.directory-search input{border:0;padding-left:0}.directory-search svg{color:var(--teal);flex:none}.directory-results{min-width:0}.mobile-filter-card{padding:12px;display:none}.mobile-filter-card summary{min-height:42px;color:var(--ink);cursor:pointer;align-items:center;gap:8px;font-weight:700;list-style:none;display:flex}.mobile-filter-card summary::-webkit-details-marker{display:none}.mobile-filter-card mark{min-width:22px;height:22px;color:var(--white);background:var(--teal);border-radius:999px;justify-content:center;align-items:center;display:inline-flex}.directory-result-bar{justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}.quick-chips{margin:12px 0;padding-bottom:2px;overflow-x:auto}.quick-chips button{flex:none}.student-card-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;display:grid}.directory-student-card{padding:18px}.student-card-head{align-items:center;gap:12px;display:flex}.student-avatar{width:46px;height:46px;color:var(--white);background:linear-gradient(135deg, var(--fudan-purple), var(--teal));border-radius:8px;flex:none;place-items:center;font-weight:700;display:grid}.student-card-head h2{margin:0 0 5px;font-size:20px}.student-card-head p,.student-bio{color:var(--muted);margin:0;line-height:1.6}.student-meta-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:16px 0;display:grid}.student-meta-grid span,.student-contact-list span{min-width:0;color:var(--muted);border-radius:8px;align-items:center;gap:6px;font-size:13px;display:flex}.student-meta-grid span{background:#f7f2f7;padding:9px}.student-meta-grid svg,.student-contact-list svg{color:var(--teal);flex:none}.student-bio{min-height:52px}.student-tags{flex-wrap:wrap;gap:7px;margin:14px 0;display:flex}.student-tags span{color:#315d5d;background:#147c7c1a;border-radius:999px;padding:6px 9px;font-size:12px}.student-contact-list{gap:8px;margin-top:14px;display:grid}.student-contact-list span{border:1px solid var(--line);justify-content:space-between;padding:9px 10px}.student-contact-list strong{color:var(--ink);margin-right:auto}.student-contact-list span.is-muted{color:#978d9b;background:#fbfaf7}.admin-students-page,.admin-home-page,.app-home-page{gap:18px;display:grid}.admin-hero{padding:24px}.admin-home-hero{color:var(--white);background:linear-gradient(135deg,#7f238ff0,#2a1632eb),url(/images/fdsm-campus-bg.jpg) 50%/cover}.app-home-hero{color:var(--white);background:linear-gradient(135deg,#2a1632f0,#147c7ca8),url(/images/fdsm-campus-bg.jpg) 50%/cover}.admin-home-hero .directory-kicker,.admin-home-hero p,.app-home-hero .directory-kicker,.app-home-hero p{color:#ffffffc7}.logout-button{color:var(--fudan-purple);background:var(--white);border:1px solid #7f238f38;border-radius:8px;padding:10px 14px;font-weight:700}.admin-home-hero .logout-button,.app-home-hero .logout-button{color:var(--white);background:#ffffff1f;border-color:#ffffff5c}.app-home-overview{grid-template-columns:minmax(0,1.4fr) minmax(260px,.6fr);gap:14px;width:100%;max-width:1180px;margin:0 auto;display:grid}.app-balance-card{border:1px solid var(--line);background:var(--white);border-radius:8px;align-content:start;gap:12px;padding:20px;display:grid;box-shadow:0 16px 42px #3d274412}.app-balance-card span{color:var(--muted);font-weight:700}.app-balance-card strong{color:var(--fudan-purple);font-size:36px}.app-balance-card p{color:var(--muted);margin:0}.app-balance-card a{color:var(--teal);font-weight:700}.admin-module-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;display:grid}.admin-module-card{border:1px solid var(--line);background:var(--white);border-radius:8px;align-content:start;gap:12px;min-height:154px;padding:22px;display:grid;box-shadow:0 16px 42px #3d274412}.admin-module-card svg{color:var(--fudan-purple)}.admin-module-card strong{font-size:20px}.admin-module-card span{color:var(--muted);line-height:1.55}.admin-import-panel,.admin-table-panel{padding:20px}.admin-panel-head{margin-bottom:16px}.import-actions input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.import-actions label{position:relative}.import-file-line{border:1px solid var(--line);color:var(--muted);background:#fbfaf7;border-radius:8px;align-items:center;gap:9px;padding:11px 12px;display:flex}.import-file-line strong{color:#a33a3a;font-weight:700}.admin-action-feedback{border:1px solid var(--line);border-radius:8px;margin:12px 0;padding:11px 12px;line-height:1.55}.admin-action-feedback.is-success{color:#176a5f;background:#f1fbf8;border-color:#147c7c47}.admin-action-feedback.is-warning{color:#806018;background:#fff9eb;border-color:#b4781c47}.admin-action-feedback.is-error{color:#9b3333;background:#fff4f4;border-color:#a33a3a47}.import-stat-grid{grid-template-columns:repeat(5,1fr);gap:10px;margin:14px 0;display:grid}.import-stat-grid article{border:1px solid var(--line);background:#fbfaf7;border-radius:8px;padding:14px}.import-stat-grid strong{color:var(--fudan-purple);font-size:26px;display:block}.import-stat-grid span{color:var(--muted);font-size:13px}.import-preview-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.preview-bucket{border:1px solid var(--line);border-radius:8px;padding:14px}.preview-bucket h3{margin:0 0 10px;font-size:17px}.preview-table-wrap,.admin-table-wrap{overflow-x:auto}.preview-bucket table,.admin-table-wrap table{border-collapse:collapse;white-space:nowrap;width:100%}.preview-bucket th,.preview-bucket td,.admin-table-wrap th,.admin-table-wrap td{border-bottom:1px solid var(--line);text-align:left;vertical-align:top;padding:10px}.preview-bucket th,.admin-table-wrap th{color:var(--muted);font-size:12px;font-weight:700}.admin-table-toolbar{flex-wrap:wrap;margin-bottom:12px}.admin-table-toolbar .directory-search{flex:300px}.admin-inline-editor,.admin-bulk-editor,.admin-column-panel{border:1px solid var(--line);background:#fbfaf7;border-radius:8px;margin:0 0 12px;padding:12px}.admin-inline-editor{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.admin-inline-editor label{gap:6px;display:grid}.admin-inline-editor span{color:var(--muted);font-size:13px;font-weight:700}.admin-inline-editor input,.admin-inline-editor select,.admin-bulk-editor input,.admin-bulk-editor select{border:1px solid var(--line);width:100%;color:var(--ink);background:var(--white);border-radius:8px;outline:0;padding:10px 11px}.admin-inline-actions{align-items:end;display:flex}.admin-inline-actions button,.admin-bulk-editor button{border:1px solid var(--line);cursor:pointer;border-radius:8px;min-height:38px;padding:9px 12px}.admin-bulk-editor{grid-template-columns:minmax(130px,180px) minmax(180px,1fr) auto;gap:10px;display:grid}.admin-column-panel{flex-wrap:wrap;gap:10px 16px;display:flex}.admin-column-panel label{color:var(--ink);align-items:center;gap:7px;display:inline-flex}.admin-table-wrap input[type=checkbox]{width:18px;min-width:18px;height:18px;padding:0}.admin-table-wrap input,.admin-table-wrap select{min-width:112px}.spin-icon{animation:.9s linear infinite spin-icon}@keyframes spin-icon{to{transform:rotate(360deg)}}.admin-directory-preview .directory-header{margin-top:0}@media (max-width:900px){.directory-layout,.student-card-grid,.import-preview-grid{grid-template-columns:1fr}.directory-filter-panel{display:none}.mobile-filter-card{z-index:2;margin-bottom:12px;display:block;position:sticky;top:0}.directory-header,.admin-panel-head,.admin-hero{display:block}.role-switcher,.import-actions,.save-draft-button{justify-content:stretch;width:100%;margin-top:14px}.role-switcher button,.import-actions button,.import-actions label,.save-draft-button{flex:1}.import-stat-grid{grid-template-columns:repeat(3,1fr)}.admin-inline-editor{grid-template-columns:repeat(2,minmax(0,1fr))}.admin-bulk-editor{grid-template-columns:1fr}.admin-module-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.app-home-overview{grid-template-columns:1fr}}@media (max-width:560px){.app-page{padding:14px 12px 32px}.directory-header,.admin-hero,.admin-import-panel,.admin-table-panel{padding:16px}.directory-filters.is-compact,.student-meta-grid,.import-stat-grid,.admin-inline-editor{grid-template-columns:1fr}.directory-result-bar{align-items:flex-start}.admin-module-grid{grid-template-columns:1fr}.admin-module-card{min-height:130px;padding:18px}.student-bio{min-height:0}.student-contact-list span{grid-template-columns:auto auto 1fr;justify-content:start;display:grid}}.module-page{width:min(1180px,100%);margin:0 auto;padding:32px clamp(18px,4vw,40px) 72px}.module-hero{grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:24px;padding:44px 0 34px;display:grid}.module-hero h1{letter-spacing:0;max-width:820px;margin:12px 0 0;font-size:clamp(34px,6vw,64px);line-height:1.08}.module-hero p{max-width:720px;color:var(--muted);margin:18px 0 0;font-size:17px;line-height:1.85}.module-panel{border:1px solid var(--line);background:var(--white);border-radius:8px;box-shadow:0 18px 44px #3d274414}.module-panel-head{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:18px;display:flex}.module-panel-head span{color:var(--teal);text-transform:uppercase;letter-spacing:0;font-size:13px;font-weight:700}.module-panel-head h2{margin:0;font-size:clamp(24px,3vw,34px);line-height:1.18}.access-note,.payment-meta,.committee-contact span,.committee-count-band article{align-items:center;display:flex}.access-note{color:#0d675f;white-space:nowrap;background:#eef8f5;border:1px solid #d6e8e3;border-radius:8px;gap:8px;width:fit-content;padding:11px 13px;font-weight:700}.access-note.muted{border-color:var(--line);color:var(--muted);background:var(--white)}.access-stack{justify-items:end;gap:10px;display:grid}.fee-summary-grid,.fee-two-column,.committee-count-band{gap:14px;display:grid}.fee-summary-grid{grid-template-columns:repeat(4,1fr)}.fee-summary-grid article,.committee-count-band article{border:1px solid var(--line);background:var(--white);border-radius:8px;padding:20px;box-shadow:0 18px 44px #3d274414}.fee-summary-grid svg,.committee-count-band svg{color:var(--fudan-purple)}.fee-summary-grid span,.committee-count-band span{color:var(--muted);margin-top:14px;font-size:14px;display:block}.fee-summary-grid strong,.committee-count-band strong{margin-top:6px;font-size:clamp(22px,3vw,32px);display:block}.fee-two-column{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);margin-top:14px}.fee-rule-panel,.payment-panel,.ledger-panel,.committee-chart{padding:24px}.fee-rule-grid{grid-template-columns:repeat(2,1fr);gap:12px;display:grid}.fee-rule-grid article{border:1px solid var(--line);background:#fbfaf7;border-radius:8px;padding:16px}.fee-rule-grid svg{color:var(--warm)}.fee-rule-grid span{color:var(--muted);margin-top:12px;font-size:14px;display:block}.fee-rule-grid strong{margin-top:5px;font-size:22px;display:block}.fee-rule-panel p{color:var(--muted);margin:18px 0 0;line-height:1.7}.qr-placeholder{aspect-ratio:1;border:1px solid var(--line);background:#fff;border-radius:8px;grid-template-columns:repeat(7,1fr);gap:7px;width:min(280px,100%);margin:2px auto 20px;padding:18px;display:grid;position:relative}.qr-placeholder i{background:#f0e8ef;border-radius:2px}.qr-placeholder i.is-active{background:var(--ink)}.qr-placeholder svg{box-sizing:content-box;border:8px solid var(--white);color:var(--fudan-purple);background:var(--white);position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%)}.payment-meta{color:#6a4b00;background:#fff7df;border-radius:8px;gap:10px;padding:13px}.payment-meta span{color:#766333;margin-top:3px;font-size:13px;line-height:1.5;display:block}.ledger-panel{margin-top:14px}.ledger-list{gap:10px;display:grid}.ledger-row{border:1px solid var(--line);background:#fff;border-radius:8px;grid-template-columns:108px 72px minmax(220px,1fr) 88px 110px 86px;align-items:center;gap:12px;padding:14px;display:grid}.ledger-head{color:var(--muted);background:0 0;border:0;padding-top:0;padding-bottom:0;font-size:13px;font-weight:700}.ledger-row time{color:var(--muted);font-variant-numeric:tabular-nums}.ledger-row p{color:var(--muted);margin:4px 0 0;line-height:1.5}.ledger-row small{color:#8a5d13;margin-top:4px;display:block}.ledger-type{border-radius:999px;width:fit-content;padding:5px 9px;font-size:13px;font-weight:700}.ledger-type-income{color:#0d675f;background:#e8f6f2}.ledger-type-expense{color:#9a3b46;background:#fff0f2}.ledger-type-adjustment{color:#6a4b00;background:#fff7df}.amount-positive{color:#0d675f}.amount-negative{color:#9a3b46}.proof-cell{color:var(--muted);align-items:center;gap:5px;font-size:13px;display:inline-flex}.committee-page{width:min(1240px,100%)}.committee-count-band{grid-template-columns:repeat(2,1fr);margin-bottom:14px}.committee-count-band article{gap:14px}.committee-count-band span,.committee-count-band strong{margin-top:0}.committee-chart{border:1px solid var(--line);background:linear-gradient(#fffffff5,#ffffffe6),linear-gradient(90deg,#147c7c14,#d7b46a1f);border-radius:8px;box-shadow:0 18px 44px #3d274414}.committee-levels{gap:26px;display:grid}.committee-level{position:relative}.committee-level+.committee-level:before{content:"";background:#d5c7dc;width:2px;height:18px;position:absolute;top:-22px;left:50%}.committee-level-label{width:fit-content;color:var(--fudan-purple);background:#f5ecf7;border-radius:999px;margin:0 auto 12px;padding:6px 12px;font-size:13px;font-weight:700}.committee-level-grid{justify-content:center;gap:14px;display:grid;position:relative}.committee-level-1{grid-template-columns:minmax(280px,380px)}.committee-level-2{grid-template-columns:repeat(2,minmax(260px,340px))}.committee-level-3{grid-template-columns:repeat(6,minmax(150px,1fr))}.committee-level-2:before,.committee-level-3:before{content:"";background:#d5c7dc;height:2px;position:absolute;top:-10px;left:18%;right:18%}.committee-card{border:1px solid var(--line);background:var(--white);border-radius:8px;grid-template-columns:82px minmax(0,1fr);align-items:start;gap:14px;padding:16px;display:grid}.committee-card-compact{grid-template-columns:58px minmax(0,1fr)}.committee-avatar{aspect-ratio:1;color:var(--white);border-radius:8px;place-items:center;font-size:28px;font-weight:700;display:grid}.committee-card-compact .committee-avatar{font-size:22px}.avatar-purple{background:linear-gradient(135deg,#7f238f,#b7599d)}.avatar-teal{background:linear-gradient(135deg,#147c7c,#52a99b)}.avatar-gold{background:linear-gradient(135deg,#a36f04,#d7b46a)}.avatar-rose{background:linear-gradient(135deg,#9a3b46,#d9828a)}.avatar-green{background:linear-gradient(135deg,#2f7d47,#7a5)}.committee-card-body>span{color:var(--fudan-purple);font-size:14px;font-weight:700}.committee-card-body strong{margin-top:4px;font-size:21px;display:block}.committee-card-body p{color:var(--muted);margin:9px 0 0;line-height:1.65}.committee-card-compact .committee-card-body strong{font-size:18px}.committee-card-compact .committee-card-body p{font-size:14px}.committee-contact{flex-wrap:wrap;gap:7px;margin-top:12px;display:flex}.committee-contact span,.committee-contact.is-locked{color:#0d675f;background:#eef8f5;border-radius:999px;padding:6px 8px;font-size:12px;line-height:1}.committee-contact span{gap:4px}.committee-contact.is-locked{width:fit-content;color:var(--muted);background:#f4eff5}@media (max-width:980px){.fee-summary-grid{grid-template-columns:repeat(2,1fr)}.fee-two-column,.module-hero{grid-template-columns:1fr}.access-stack{justify-items:start}.ledger-head{display:none}.ledger-row{grid-template-columns:1fr;align-items:start}.ledger-row>span,.ledger-row>strong,.ledger-row>time{width:fit-content}.committee-level-3{grid-template-columns:repeat(2,minmax(260px,1fr))}}@media (max-width:720px){.module-page{padding-top:20px;padding-bottom:46px}.module-hero{padding-top:20px}.module-hero h1{font-size:38px}.fee-summary-grid,.fee-rule-grid,.committee-count-band,.committee-level-2,.committee-level-3{grid-template-columns:1fr}.committee-level+.committee-level:before,.committee-level-2:before,.committee-level-3:before{display:none}.committee-card,.committee-card-compact{grid-template-columns:64px minmax(0,1fr)}}@media (max-width:460px){.module-hero h1{font-size:32px}.access-note{white-space:normal}.fee-rule-panel,.payment-panel,.ledger-panel,.committee-chart{padding:18px}.committee-card,.committee-card-compact{grid-template-columns:1fr}.committee-avatar{width:64px}}
