:root{--canvas:#fcf9f4;--surface:#fff;--ink:#1a1a1a;--ink-soft:#4b5563;--muted:#6b7280;--border:#e5e0d8;--mint:#16a34a;--mint-soft:#effaf2;--mint-deep:#15803d;--error:#c2413b;--shadow:0 14px 36px rgba(63,47,30,.08);--font-display:'Noto Serif SC','Source Han Serif SC','STSongti-SC','Songti SC',SimSun,serif;--font-body:'Noto Sans SC','PingFang SC','Microsoft YaHei','Helvetica Neue',Arial,sans-serif;--font-mono:'JetBrains Mono','SF Mono',Menlo,Consolas,monospace;--ease:cubic-bezier(.16,1,.3,1);--micro:150ms;--ui:220ms;--page:420ms}
*{box-sizing:border-box}html{background:var(--canvas);overflow-anchor:none}body{min-width:320px;margin:0;overflow-x:hidden;overflow-anchor:none;background:var(--canvas);color:var(--ink);font-family:var(--font-body);line-height:1.65}button,input,textarea{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible{outline:3px solid var(--mint);outline-offset:2px}.hidden{display:none!important}.skip-link{position:fixed;left:16px;top:-48px;z-index:30;padding:8px 12px;border-radius:10px;background:var(--ink);color:#fff;transition:top var(--ui) var(--ease)}.skip-link:focus{top:16px}
.site-header{width:min(1280px,calc(100% - 48px));min-height:76px;margin:auto;display:flex;gap:18px;align-items:center;border-bottom:1px solid var(--border)}.brand{display:inline-flex;align-items:center;gap:10px;color:var(--ink);font-weight:800;text-decoration:none}.brand-status-dot{width:10px;height:10px;display:inline-block;border-radius:50%;background:var(--mint-deep);box-shadow:0 0 0 4px var(--mint-soft);animation:brand-breathe 2.8s ease-in-out infinite}.header-note{margin:0;color:var(--muted);font-size:14px}.text-button{margin-left:auto;padding:8px 4px;border:0;background:transparent;color:var(--ink-soft);transition:color var(--ui) var(--ease),transform var(--micro) var(--ease)}.text-button:hover{color:var(--mint-deep);transform:translateY(-1px)}
@keyframes brand-breathe{0%,100%{box-shadow:0 0 0 3px var(--mint-soft)}50%{box-shadow:0 0 0 6px rgba(35,160,95,.12)}}
.shell{width:min(1280px,calc(100% - 48px));margin:0 auto;padding:48px 0 72px}.page-view{animation:page-in var(--page) var(--ease) both}.welcome-view{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(380px,.95fr);gap:48px;align-items:center;min-height:calc(100vh - 190px)}.welcome-copy{max-width:650px}.eyebrow{margin:0 0 8px;color:var(--mint-deep);font-family:var(--font-mono);font-size:12px;font-weight:800;letter-spacing:.09em}h1,h2,h3,p{overflow-wrap:anywhere}h1{max-width:740px;margin:0;font:700 clamp(36px,5vw,64px)/1.22 var(--font-display);letter-spacing:-.04em}h2{margin:0;font:700 28px/1.35 var(--font-display)}h3{margin:0;font:700 19px/1.4 var(--font-display)}.lede{max-width:610px;margin:22px 0 0;color:var(--ink-soft);font-size:18px}.feature-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:26px}.feature-list span,.count-badge{padding:5px 10px;border-radius:999px;background:var(--mint-soft);color:var(--mint-deep);font-size:13px;font-weight:700}
.entry-card,.content-panel,.side-panel,.card{border:1px solid var(--border);border-radius:22px;background:var(--surface);box-shadow:var(--shadow)}.entry-card{padding:30px}.entry-card-mint{background:linear-gradient(145deg,#fff 0%,var(--mint-soft) 100%)}.entry-card h2{margin-bottom:8px}.entry-card>p:not(.eyebrow):not(.hint){margin:0 0 22px;color:var(--ink-soft)}.entry-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.role-switch{display:flex;padding:3px;border:1px solid var(--border);border-radius:12px;background:#fff}.role-tab{min-height:44px;border:0;border-radius:9px;padding:6px 12px;background:transparent;color:var(--muted);font-weight:800;transition:background var(--ui) var(--ease),color var(--ui) var(--ease),transform var(--micro) var(--ease)}.role-tab.active{background:var(--ink);color:#fff}.role-tab:hover:not(.active){color:var(--mint-deep);transform:translateY(-1px)}.form-stack,.field{display:grid;gap:8px}.form-stack{gap:15px}.field label,.field>strong{color:var(--ink-soft);font-size:14px;font-weight:700}.field input,.field textarea{margin:0}input,textarea{width:100%;border:1px solid var(--border);border-radius:12px;outline:0;background:#fffdf9;color:var(--ink);padding:12px 13px;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease),background var(--ui) var(--ease)}textarea{min-height:100px;resize:vertical}input:focus,textarea:focus{border-color:var(--mint);background:#fff;box-shadow:0 0 0 4px rgba(22,163,74,.12)}.otp-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.hint,.inline-status{margin:0;color:var(--muted);font-size:13px}.inline-status.error{color:var(--error)}.inline-status.success{color:var(--mint-deep)}code{padding:2px 5px;border-radius:5px;background:rgba(22,163,74,.1);color:var(--mint-deep);font-family:var(--font-mono)}
.button{min-height:44px;border:1px solid transparent;border-radius:12px;padding:10px 16px;font-weight:800;transition:transform var(--micro) var(--ease),box-shadow var(--ui) var(--ease),background var(--ui) var(--ease),border-color var(--ui) var(--ease),opacity var(--ui) var(--ease)}.button:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 9px 16px rgba(26,26,26,.14)}.button:active:not(:disabled){transform:scale(.98);box-shadow:0 3px 8px rgba(26,26,26,.1)}.button:disabled{opacity:.52}.button-primary{background:var(--ink);color:#fff}.button-primary:hover:not(:disabled){background:#303030}.button-secondary{border-color:var(--border);background:#fff;color:var(--ink)}.button-secondary:hover:not(:disabled){border-color:var(--mint);color:var(--mint-deep)}
.workspace-head{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;margin-bottom:28px}.workspace-head h1{font-size:42px}.workspace-head p:not(.eyebrow){margin:8px 0 0;color:var(--ink-soft)}.workspace-layout{display:grid;grid-template-columns:286px minmax(0,1fr);gap:22px;align-items:start}.side-panel{position:sticky;top:18px;padding:19px}.panel-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:15px}.side-panel h2{font-size:20px}.select-list{display:grid;gap:8px}.select-item{width:100%;border:1px solid transparent;border-radius:14px;background:transparent;padding:12px;color:var(--ink);text-align:left;transition:background var(--ui) var(--ease),transform var(--micro) var(--ease),border-color var(--ui) var(--ease)}.select-item:hover{background:var(--mint-soft);transform:translateX(2px)}.select-item.selected{background:var(--mint-soft);border-color:#ccefd6}.select-item strong,.select-item small{display:block}.select-item small{margin-top:2px;color:var(--muted);font-size:12px}.content-panel{min-height:510px;padding:28px}.course-hero{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;padding-bottom:24px;border-bottom:1px solid var(--border)}.course-hero h2{font-size:34px}.course-hero p:not(.eyebrow){margin:6px 0 0;color:var(--ink-soft)}.course-code{min-width:130px;padding:12px;border-radius:14px;background:var(--mint-soft);color:var(--mint-deep);text-align:center}.course-code span,.course-code strong{display:block}.course-code span{font-size:12px}.course-code strong{margin-top:2px;font-family:var(--font-mono);font-size:17px}.workspace-nav{display:flex;flex-wrap:wrap;gap:4px;margin:20px 0 26px;padding:4px;border-bottom:1px solid var(--border)}.nav-item{border:0;border-bottom:2px solid transparent;padding:9px 12px;background:transparent;color:var(--muted);font-weight:800;transition:color var(--ui) var(--ease),border-color var(--ui) var(--ease),transform var(--micro) var(--ease)}.nav-item:hover{color:var(--mint-deep);transform:translateY(-1px)}.nav-item.active{border-color:var(--mint);color:var(--mint-deep)}.section-stack{display:grid;gap:20px}.section-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.section-title p{margin:0;color:var(--muted);font-size:13px}.live-banner,.student-live-card,.interaction-state{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:18px;border:1px solid var(--border);border-radius:16px;background:#fffdfa}.live-banner.live,.student-live-card.live,.interaction-state.live{border-color:#b8e8c3;background:var(--mint-soft)}.live-banner p,.student-live-card p,.interaction-state p{margin:4px 0 0;color:var(--ink-soft);font-size:14px}.status-dot{display:inline-block;width:9px;height:9px;margin-right:8px;border-radius:50%;background:#c5c0b8;vertical-align:middle}.status-dot.live{background:var(--mint);box-shadow:0 0 0 4px rgba(22,163,74,.12)}.metric-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.metric-grid .field{padding:16px;border:1px solid var(--border);border-radius:14px;background:#fffdfa}.metric-grid .field p{margin:4px 0 0;color:var(--ink);font-size:15px}.quick-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.quick-card{display:grid;gap:5px;min-height:125px;border:1px solid var(--border);border-radius:16px;padding:16px;background:#fff;color:var(--ink);text-align:left;transition:transform var(--ui) var(--ease),box-shadow var(--ui) var(--ease),border-color var(--ui) var(--ease)}.quick-card:hover{border-color:#b8e8c3;transform:translateY(-2px);box-shadow:var(--shadow)}.quick-card small{color:var(--muted);line-height:1.45}.quick-icon,.empty-icon{display:grid;place-items:center;width:32px;height:32px;border-radius:10px;background:var(--mint-soft);color:var(--mint-deep);font-family:var(--font-display);font-weight:800}.card-list{display:grid;border:1px solid var(--border);border-radius:16px;background:#fffdfa;padding:0 16px}.list-row,.question-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 0;border-bottom:1px solid var(--border)}.list-row:last-child,.question-row:last-child{border-bottom:0}.list-row p,.question-row p{margin:3px 0 0;color:var(--muted);font-size:14px}.time-label{min-width:112px;color:var(--mint-deep);font-family:var(--font-mono);font-size:13px;font-weight:800}.status{display:inline-flex;align-items:center;padding:4px 9px;border-radius:999px;background:#f4f2ee;color:var(--ink-soft);font-size:12px;font-weight:700;white-space:nowrap}.status.live{background:var(--mint-soft);color:var(--mint-deep)}.empty-card,.student-empty{display:grid;place-items:center;gap:8px;padding:48px 24px;border:1px dashed #cfd8ce;border-radius:16px;background:#fffdfa;text-align:center}.empty-card p,.student-empty p{max-width:480px;margin:0;color:var(--muted)}.empty-card .button{margin-top:8px}.knowledge-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.knowledge-card{display:grid;gap:8px;padding:18px;border:1px solid var(--border);border-radius:16px;background:#fffdfa}.knowledge-card p{margin:0;color:var(--muted);font-size:14px}.question-list{border:1px solid var(--border);border-radius:16px;background:#fffdfa;padding:0 16px}.question-row{justify-content:flex-start}.avatar{display:grid;place-items:center;flex:none;width:34px;height:34px;border-radius:11px;background:var(--mint-soft);color:var(--mint-deep);font-weight:800}.question-row small{color:var(--muted);font-size:12px}.question-form{display:grid;gap:12px;padding:18px;border:1px dashed #cfd8ce;border-radius:16px;background:#fffefa}.question-form label{display:grid;gap:8px;color:var(--ink-soft);font-size:14px;font-weight:700}.question-form .button{justify-self:start}.student-empty{min-height:340px}.student-live-card{margin-bottom:20px}.student-live-card .button{flex:none}
.toast{position:fixed;left:50%;bottom:28px;z-index:30;max-width:min(440px,calc(100% - 32px));transform:translate(-50%,20px);padding:11px 15px;border-radius:13px;background:var(--ink);color:#fff;box-shadow:var(--shadow);opacity:0;pointer-events:none;transition:opacity var(--ui) var(--ease),transform var(--ui) var(--ease)}.toast.visible{opacity:1;transform:translate(-50%,0)}.toast.error{background:var(--error)}.modal{width:min(460px,calc(100% - 32px));border:0;padding:0;border-radius:20px;background:transparent;box-shadow:0 20px 70px rgba(0,0,0,.2);opacity:0;transform:translateY(12px) scale(.98);transition:opacity var(--ui) var(--ease),transform var(--ui) var(--ease)}.modal[open]{opacity:1;transform:translateY(0) scale(1)}.modal[open].closing{opacity:0;transform:translateY(12px) scale(.98);pointer-events:none}.modal::backdrop{background:rgba(26,26,26,.34);animation:fade-in var(--ui) var(--ease) both}.modal.closing::backdrop{opacity:0;transition:opacity var(--ui) var(--ease)}.dialog-card{position:relative;display:grid;gap:15px;padding:28px;background:var(--surface)}.dialog-card h2{margin:0}.dialog-copy{margin:0;color:var(--ink-soft)}.modal-close{position:absolute;right:16px;top:14px;border:0;background:transparent;color:var(--muted);font-size:24px;line-height:1}.modal-close:hover{color:var(--ink)}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px}
@keyframes page-in{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{from{opacity:0}to{opacity:1}}
@media(max-width:900px){.welcome-view{grid-template-columns:1fr;min-height:auto;gap:28px}.welcome-copy{max-width:none}.workspace-layout{grid-template-columns:1fr}.side-panel{position:static}.quick-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.site-header,.shell{width:min(100% - 32px,1280px)}.site-header{min-height:64px}.header-note{display:none}.shell{padding-top:30px}.welcome-copy h1{font-size:42px}.entry-card{padding:23px}.entry-card-head,.workspace-head,.course-hero,.live-banner,.student-live-card{align-items:flex-start;flex-direction:column}.workspace-head h1{font-size:34px}.workspace-head>.button,.live-banner>.button,.student-live-card>.button{width:100%}.content-panel{padding:20px;min-height:360px}.course-hero h2{font-size:29px}.course-code{width:100%}.workspace-nav{overflow:visible}.nav-item{padding:8px 9px;font-size:13px}.metric-grid,.quick-grid,.knowledge-grid{grid-template-columns:1fr}.list-row,.question-row{align-items:flex-start;flex-wrap:wrap}.time-label{min-width:100%}.otp-row{grid-template-columns:1fr}.otp-row .button{width:100%}.dialog-actions{flex-wrap:wrap}.dialog-actions .button{flex:1}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:1ms!important;animation-iteration-count:1!important;transition-duration:1ms!important;scroll-behavior:auto!important}}
/* API workbench state transitions */
.section-stack{animation:section-in var(--ui) var(--ease) both}
.loading-state{display:grid;place-items:center;min-height:220px;color:var(--muted);animation:section-in var(--ui) var(--ease) both}
.reply-box{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto;min-width:min(100%,360px)}
.reply-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:start;width:min(100%,520px);margin-left:auto;min-width:0}.reply-composer input{width:100%;min-width:0}.reply-actions{display:flex;gap:8px;flex-wrap:wrap}.question-row p{overflow-wrap:anywhere;word-break:break-word}.realtime-updated{animation:realtime-update 220ms var(--ease)}@keyframes realtime-update{from{opacity:.78}to{opacity:1}}
.file-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px;min-width:0}.file-type-icon{display:inline-grid;place-items:center;flex:0 0 34px;width:34px;height:40px;border-radius:7px;color:#fff;font:700 14px/1 Arial,sans-serif;letter-spacing:-.02em;box-shadow:0 2px 4px rgb(24 34 29 / 12%);position:relative}.file-type-icon::after{content:"";position:absolute;right:0;top:0;border-width:0 0 8px 8px;border-style:solid;border-color:transparent transparent rgb(255 255 255 / 55%) transparent}.file-type-word{background:#185abd}.file-type-excel{background:#107c41}.file-type-powerpoint{background:#c43e1c}.file-type-pdf{background:#d83b01;font-size:9px}.file-type-image{background:#6b4fb3;font-size:10px}.file-type-file{background:#64748b;font-size:9px}.upload-dropzone small{display:block;margin-top:4px;color:var(--muted)}
.file-list-item{display:flex;align-items:center;gap:12px;min-width:0}.file-list-item>div{min-width:0}.file-list-item p,.file-list-item strong{overflow-wrap:anywhere}
.resource-row>.file-list-item{flex:1;min-width:0}.resource-row>.resource-time{flex:0 0 116px;justify-content:center;text-align:center}.resource-row>.button,.resource-row>.knowledge-file-link{flex:0 0 auto;white-space:nowrap}
.resource-viewer-backdrop{position:fixed;inset:0;z-index:40;display:grid;place-items:center;padding:24px;background:rgba(26,26,26,.36);opacity:0;transition:opacity var(--ui) var(--ease)}.resource-viewer-backdrop.open{opacity:1}.resource-viewer-backdrop.closing{opacity:0}.resource-viewer-modal{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(1100px,calc(100vw - 48px));height:min(86vh,900px);height:min(86dvh,900px);min-width:0;overflow:hidden;border:1px solid var(--border);border-radius:22px;background:var(--surface);box-shadow:var(--shadow);opacity:0;transform:translateY(12px) scale(.98);transition:opacity var(--ui) var(--ease),transform var(--ui) var(--ease)}.resource-viewer-backdrop.open .resource-viewer-modal{opacity:1;transform:translateY(0) scale(1)}.resource-viewer-backdrop.closing .resource-viewer-modal{opacity:0;transform:translateY(12px) scale(.98)}.resource-viewer-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px;border-bottom:1px solid var(--border)}.resource-viewer-header h2{font-size:24px}.resource-viewer-header p{margin:4px 0 0}.resource-viewer-body{position:relative;display:grid;place-items:center;min-width:0;min-height:0;overflow:auto;padding:20px;background:#f6f3ee;scrollbar-gutter:stable}.resource-viewer-loading{color:var(--muted)}.resource-viewer-frame{width:100%;height:100%;min-height:560px;border:1px solid var(--border);border-radius:12px;background:#fff}.resource-viewer-image{display:block;max-width:100%;max-height:100%;object-fit:contain;border:1px solid var(--border);border-radius:12px;background:#fff}.resource-viewer-fallback{position:absolute;right:20px;bottom:20px;display:flex;align-items:center;gap:12px;max-width:min(620px,calc(100% - 40px));padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:rgba(255,255,255,.94);box-shadow:var(--shadow)}.resource-viewer-fallback p{margin:0;color:var(--ink-soft);font-size:13px}.resource-viewer-fallback .button{flex:none}
@media (max-width:640px){.reply-composer{grid-template-columns:1fr;width:100%;margin-left:0}.reply-actions{width:100%}.reply-actions .button{width:100%}.question-row{min-width:0}.file-meta{align-items:flex-start}}
@keyframes section-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
 .upload-dropzone{display:grid;gap:8px;min-height:104px;padding:18px;border:1px dashed var(--border);border-radius:14px;background:var(--surface);cursor:pointer;transition:border-color var(--ui) var(--ease),background var(--ui) var(--ease),transform var(--micro) var(--ease)}.upload-dropzone:hover,.upload-dropzone:focus-visible,.upload-dropzone.dragover{border-color:var(--mint-deep);background:var(--mint-soft);outline:none;transform:translateY(-1px)}.upload-dropzone input[type=file]{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.upload-dropzone strong{color:var(--ink)}.upload-dropzone small{color:var(--muted)}.file-meta{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--border);border-radius:12px;background:var(--surface)}.file-meta button{min-height:44px}.custom-select{position:relative}.custom-select-trigger{width:100%;min-height:48px;padding:12px 14px;text-align:left;border:1px solid var(--border);border-radius:12px;background:var(--surface);color:var(--ink);cursor:pointer;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease)}.custom-select-trigger:focus-visible,.custom-select.open .custom-select-trigger{border-color:var(--mint-deep);box-shadow:0 0 0 3px var(--mint-soft);outline:none}.custom-select-list{position:absolute;z-index:20;left:0;right:0;top:calc(100% + 6px);display:none;max-height:220px;overflow:auto;padding:6px;border:1px solid var(--border);border-radius:12px;background:var(--surface);box-shadow:0 16px 32px rgba(30,31,29,.12)}.custom-select.open .custom-select-list{display:grid;gap:2px;animation:panel-enter 180ms var(--ease)}.custom-select-option{min-height:44px;padding:10px 12px;text-align:left;border:0;border-radius:9px;background:transparent;color:var(--ink);cursor:pointer}.custom-select-option:hover,.custom-select-option.active{background:var(--mint-soft);color:var(--mint-deep)}.custom-select-trigger.placeholder{color:var(--muted)}.custom-select-option small{display:block;margin-top:1px;color:var(--muted);font-size:12px}.date-picker{position:relative}.date-picker-popover{position:absolute;z-index:20;left:0;right:0;top:calc(100% + 6px);display:none;padding:14px;border:1px solid var(--border);border-radius:14px;background:var(--surface);box-shadow:0 16px 32px rgba(30,31,29,.12)}.date-picker.open .date-picker-popover{display:block;animation:panel-enter 180ms var(--ease)}.date-picker-grid{display:grid;grid-template-columns:repeat(7,minmax(30px,1fr));gap:4px}.date-picker-grid button{min-height:36px;border:0;border-radius:8px;background:transparent;color:var(--ink);cursor:pointer}.date-picker-grid button:hover,.date-picker-grid button.selected{background:var(--mint-soft);color:var(--mint-deep)}.date-picker-grid button:disabled{color:var(--muted);cursor:not-allowed}.date-picker-tools{display:flex;gap:8px;align-items:center;justify-content:space-between;margin-bottom:10px}.date-picker-tools button{min-height:40px}.date-picker-time{display:flex;gap:8px;margin-top:12px}.date-picker-time select{min-height:44px;flex:1}.assignment-expired{color:#9a4b3e}.ai-summary-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.ai-summary-status{min-height:22px;color:var(--muted)}.knowledge-file-link{color:var(--mint-deep);font-weight:700;text-decoration:none}.knowledge-file-link:hover{text-decoration:underline}@keyframes panel-enter{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip:rect(0 0 0 0)!important;white-space:nowrap!important}
.task-list{display:grid;gap:12px}.task-card{display:grid;gap:12px;padding:18px;border:1px solid var(--border);border-radius:16px;background:#fffdfa;animation:task-card-in 260ms var(--ease) both}.task-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-card h3{margin-top:5px}.task-prompt-preview{margin:0;color:var(--ink-soft);white-space:pre-wrap;overflow-wrap:anywhere}.task-composer{border-style:solid}.task-chat-backdrop{position:fixed;inset:0;z-index:40;display:flex;justify-content:flex-end;background:rgba(26,26,26,.28);animation:fade-in var(--ui) var(--ease) both}.task-chat-backdrop.closing{opacity:0;transition:opacity var(--ui) var(--ease)}.task-chat-drawer{position:relative;display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;width:min(620px,100%);height:100%;padding:22px;background:var(--canvas);box-shadow:-18px 0 48px rgba(30,31,29,.16);animation:drawer-in 320ms var(--ease) both}.closing .task-chat-drawer{animation:drawer-out 220ms var(--ease) both}.task-chat-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding-bottom:14px;border-bottom:1px solid var(--border)}.task-chat-header h2{font-size:24px}.task-prompt-panel{position:absolute;top:92px;right:22px;left:22px;z-index:2;padding:18px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:var(--shadow);animation:panel-enter 220ms var(--ease)}.task-prompt-panel p{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--ink-soft)}.dialogue-messages{display:flex;flex-direction:column;gap:12px;overflow:auto;padding:18px 4px;min-height:0;scroll-behavior:smooth}.dialogue-row{display:flex;width:100%;animation:message-in 220ms var(--ease) both}.dialogue-row.student{justify-content:flex-end}.dialogue-row.ai,.dialogue-row.teacher{justify-content:flex-start}.dialogue-bubble{max-width:min(78%,520px);padding:11px 14px;border:1px solid var(--border);border-radius:16px;background:#fff;color:var(--ink);box-shadow:0 4px 14px rgba(30,31,29,.05)}.dialogue-row.ai .dialogue-bubble{background:var(--ink);border-color:var(--ink);color:#fff}.dialogue-row.teacher .dialogue-bubble{background:#fff;color:var(--ink);border-left:3px solid var(--mint)}.dialogue-bubble small{display:block;margin-bottom:4px;color:var(--muted);font-size:11px;font-weight:800}.dialogue-row.ai .dialogue-bubble small{color:#b7e8c4}.dialogue-bubble p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.task-chat-composer{display:flex;gap:8px;align-items:flex-end;padding-top:12px;border-top:1px solid var(--border)}.task-chat-composer textarea{min-height:54px;max-height:150px}.task-chat-composer .button{flex:none}.task-chat-composer .button:last-child{white-space:nowrap}@keyframes task-card-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes drawer-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}@keyframes drawer-out{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(16px)}}@keyframes message-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
@media(max-width:620px){.task-chat-backdrop{align-items:flex-end}.task-chat-drawer{width:100%;height:min(86vh,760px);border-radius:20px 20px 0 0;animation-name:drawer-mobile-in}.closing .task-chat-drawer{animation-name:drawer-mobile-out}.dialogue-bubble{max-width:88%}.task-chat-composer{flex-wrap:wrap}.task-chat-composer textarea{width:100%}.task-chat-composer .button{flex:1}@keyframes drawer-mobile-in{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes drawer-mobile-out{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}}
.task-thread-list{display:grid;gap:10px;margin-top:18px;overflow:auto}.thread-picker-item{justify-content:flex-start;text-align:left}
@media(prefers-reduced-motion:reduce){.task-card,.dialogue-row,.task-chat-backdrop,.task-chat-drawer,.task-prompt-panel{animation:none!important}}

.question-content{flex:1;min-width:0}.question-reply{margin-top:12px;padding:12px 14px;border-left:3px solid var(--mint);border-radius:0 12px 12px 0;background:var(--mint-soft)}.question-reply p{color:var(--ink-soft)}.knowledge-details{padding:10px 12px;border:1px solid var(--border);border-radius:12px;background:#fff}.knowledge-details summary{cursor:pointer;color:var(--mint-deep);font-weight:800}.knowledge-details[open] summary{margin-bottom:8px}.knowledge-details p{white-space:pre-wrap;overflow-wrap:anywhere}.attachment-line{display:block;margin-top:7px;overflow-wrap:anywhere}.assignment-feedback{margin-top:9px!important;padding:10px 12px;border-radius:11px;background:var(--mint-soft);color:var(--ink-soft)!important}.submission-modal{width:min(760px,100%)}.submission-list{display:grid;gap:12px}.submission-roster{display:grid;gap:2px;max-height:52vh;overflow-y:auto;padding:0 4px;scrollbar-gutter:stable}.submission-roster .list-row{padding:14px 12px;border-bottom:1px solid var(--border);margin:0}.qa-row-missing .student-identity strong{color:var(--muted)}.submission-detail-slot.hidden{display:none}.submission-card{display:grid;gap:10px;padding:16px;border:1px solid var(--border);border-radius:16px;background:#fffdfa}.submission-card p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.submission-file-link{justify-self:start;max-width:100%;overflow-wrap:anywhere}.resource-copy{min-width:0}.resource-copy small{display:block;margin-top:5px;overflow-wrap:anywhere}

@media(max-width:620px){.submission-file-link{width:100%}.knowledge-card .reply-actions,.submission-card .task-card-head{align-items:stretch;flex-direction:column}.knowledge-card .reply-actions .button{width:100%}}

@media(prefers-reduced-motion:reduce){.question-reply,.knowledge-details,.submission-card{animation:none!important;scroll-behavior:auto}}
.task-prompt-panel{pointer-events:none}
.task-publish-backdrop{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(26,26,26,.30);opacity:0;animation:fade-in var(--ui) var(--ease) both}.task-publish-backdrop.closing{opacity:0;transition:opacity var(--ui) var(--ease)}.task-publish-modal{width:min(620px,100%);max-height:calc(100dvh - 48px);overflow:auto;padding:28px;border:1px solid var(--border);border-radius:24px;background:var(--surface);box-shadow:var(--shadow);animation:modal-enter 320ms var(--ease) both}.task-publish-backdrop.closing .task-publish-modal{animation:modal-out 220ms var(--ease) both}.task-publish-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:18px}.task-publish-header h2{margin:5px 0 0;font-family:var(--font-display);font-size:28px}.task-publish-modal label{display:grid;gap:8px;margin-top:16px;color:var(--ink-soft);font-size:14px;font-weight:700}.task-publish-modal input,.task-publish-modal textarea{width:100%;min-height:48px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fffdfa;outline:none;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease)}.task-publish-modal textarea{min-height:104px;resize:vertical}.task-publish-modal input:focus,.task-publish-modal textarea:focus{border-color:var(--mint-deep);box-shadow:0 0 0 3px var(--mint-soft)}.task-publish-errors{min-height:22px;margin-top:12px;color:var(--error);font-size:13px}.task-thread-picker-centered,.teacher-thread-modal{left:50%;right:auto;top:50%;width:min(900px,calc(100vw - 48px));height:min(820px,calc(100dvh - 48px));border-radius:24px;transform:translate(-50%,-46%) scale(.98);animation:modal-enter 320ms var(--ease) both}.task-chat-backdrop.open .task-thread-picker-centered,.task-chat-backdrop.open .teacher-thread-modal{transform:translate(-50%,-50%) scale(1)}.task-thread-picker-centered .task-thread-list{flex:1;min-height:0;overflow:auto}.task-thread-picker-centered .thread-picker-item{min-height:58px}.teacher-thread-modal{background:var(--surface)}.teacher-thread-modal .task-chat-composer{background:var(--surface)}@keyframes modal-enter{from{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes modal-out{from{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(12px) scale(.98)}}
.task-chat-backdrop.closing .task-thread-picker-centered,.task-chat-backdrop.closing .teacher-thread-modal{animation:modal-out 220ms var(--ease) both}
@media(max-width:620px){.task-publish-modal{padding:22px}.task-thread-picker-centered,.teacher-thread-modal{width:calc(100vw - 24px);height:min(88vh,760px);transform:translate(-50%,-46%) scale(.98)}.task-chat-backdrop.open .task-thread-picker-centered,.task-chat-backdrop.open .teacher-thread-modal{transform:translate(-50%,-50%) scale(1)}}
@media(prefers-reduced-motion:reduce){.task-publish-backdrop,.task-publish-modal,.task-thread-picker-centered,.teacher-thread-modal{animation:none!important;transition:none!important;transform:translate(-50%,-50%)!important}}

/* Centered task picker and teacher thread floaters participate in the viewport, not the flex drawer flow. */
.task-thread-picker-centered,.teacher-thread-modal{position:absolute}
.task-thread-picker-centered,.teacher-thread-modal{animation:center-modal-enter 320ms var(--ease) both}
.task-chat-backdrop.closing .task-thread-picker-centered,.task-chat-backdrop.closing .teacher-thread-modal{animation:center-modal-out 220ms var(--ease) both}
@keyframes center-modal-enter{from{opacity:0;transform:translate(-50%,-46%) scale(.98)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}
@keyframes center-modal-out{from{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,-46%) scale(.98)}}
@media(prefers-reduced-motion:reduce){.task-thread-picker-centered,.teacher-thread-modal{animation:none!important;transform:translate(-50%,-50%)!important}}

.head-actions{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end}.settings-shell{max-width:900px;margin:0 auto}.settings-head{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin-bottom:24px}.settings-head h1{font-size:42px}.settings-head p:not(.eyebrow){max-width:680px;margin:8px 0 0;color:var(--ink-soft)}.settings-card{display:grid;gap:24px;padding:28px;border:1px solid var(--border);border-radius:22px;background:var(--surface);box-shadow:var(--shadow)}.settings-section{display:grid;gap:8px;padding-bottom:20px;border-bottom:1px solid var(--border)}.settings-section h2{font-size:22px}.settings-section p{margin:0}.settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.settings-card select{width:100%;min-height:48px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fffdf9;color:var(--ink);outline:none;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease)}.settings-card select:focus{border-color:var(--mint);box-shadow:0 0 0 4px rgba(22,163,74,.12)}.field-hint{margin:0;color:var(--muted);font-size:12px}.settings-card .dialog-actions{border-top:1px solid var(--border);padding-top:20px}.settings-card [data-ai-python].hidden,.settings-card [data-ai-anthropic].hidden{display:none}
@media(max-width:620px){.head-actions{width:100%;justify-content:stretch}.head-actions .button{flex:1}.settings-head{align-items:stretch;flex-direction:column}.settings-head h1{font-size:34px}.settings-head>.button{width:100%}.settings-card{padding:20px}.settings-grid,.settings-model-grid{grid-template-columns:1fr}}
.settings-model-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
@media(max-width:620px){.settings-model-grid{grid-template-columns:1fr}}

/* 大班选择器与实时聊天稳定性：只滚动内部区域，不重排整块浮层。 */
.task-thread-picker-centered{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);overflow:hidden;min-width:0}
.thread-picker-toolbar{display:flex;align-items:center;justify-content:space-between;min-height:44px;padding:12px 0;border-bottom:1px solid var(--border)}
.task-thread-picker-centered .task-thread-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:max-content;align-content:start;gap:10px;margin-top:0;padding:14px 4px 4px;overflow:auto;scrollbar-gutter:stable}
.task-thread-picker-centered .thread-picker-item{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;align-items:center;min-width:0;min-height:64px;padding:10px 12px;text-align:left;justify-content:initial}
.thread-picker-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:800}
.thread-picker-status{justify-self:end;padding:2px 7px;border-radius:999px;background:#f4f2ee;color:var(--muted);font-size:11px;font-weight:700;white-space:nowrap}
.thread-picker-status.active{background:var(--mint-soft);color:var(--mint-deep)}.thread-picker-status.completed{background:#eef5ef;color:var(--mint-deep)}
.thread-picker-time{grid-column:1/-1;min-width:0;margin-top:2px;color:var(--muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.thread-picker-arrow{position:absolute;right:10px;bottom:8px;color:var(--mint-deep);font-size:18px;line-height:1}
.task-chat-drawer{grid-template-rows:auto auto minmax(0,1fr) auto auto;overflow:hidden;min-width:0}
.dialogue-messages{scrollbar-gutter:stable;scroll-behavior:auto;min-width:0}
.dialogue-row,.dialogue-bubble,.task-chat-composer{min-width:0}.dialogue-bubble{overflow-wrap:anywhere}
.task-chat-composer textarea{min-width:0;flex:1}.new-message-notice{justify-self:center;margin:4px 0 0}
.ai-guidance-card{display:grid;gap:12px;padding:18px;border:1px solid var(--border);border-radius:16px;background:var(--surface)}.ai-guidance-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.ai-guidance-head h4{margin:0;color:var(--ink);font-size:18px}.ai-guidance-card label{display:grid;gap:8px;color:var(--ink-soft);font-size:14px;font-weight:700}.ai-guidance-card textarea{width:100%;min-width:0;min-height:104px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fffdfa;resize:vertical;outline:none;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease)}.ai-guidance-card textarea:focus{border-color:var(--mint-deep);box-shadow:0 0 0 3px var(--mint-soft)}.ai-guidance-card .dialog-actions{justify-content:flex-start;padding-top:0;border-top:0}.ai-guidance-card .inline-status{min-height:20px;margin:0}
.thread-picker-toolbar .hint{margin:0}
/* 课堂问答全班视图：空态用轻量居中提示（不做大卡片），筛选 chips 复用全站单选样式 */
.qa-empty-hint{margin:0;padding:36px 12px;text-align:center;color:var(--muted)}
.qa-filter-chips{justify-content:flex-end}
@media(max-width:900px){.task-thread-picker-centered .task-thread-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.thread-picker-toolbar{display:flex}.task-thread-picker-centered .task-thread-list{grid-template-columns:1fr;padding-inline:0}.task-thread-picker-centered .thread-picker-item{min-height:58px}.task-chat-drawer{grid-template-rows:auto auto minmax(0,1fr) auto auto}.resource-row{align-items:flex-start}.resource-row>.resource-time{flex:0 0 116px}.resource-row>.file-list-item{width:calc(100% - 132px)}}
/* 资料查看弹窗横竖屏适配：桌面/横屏居中大弹窗；窄屏或竖屏手机铺满为 inset:8px 的近全屏浮层。两个断点都不允许横向溢出。 */
@media(min-width:761px){.resource-viewer-modal{width:min(1100px,92vw);height:min(86vh,900px);height:min(86dvh,900px)}}
@media(max-width:760px),(orientation:portrait) and (max-width:900px){
  .resource-viewer-backdrop{padding:8px}
  .resource-viewer-modal{width:100%;height:calc(100vh - 16px);height:calc(100dvh - 16px);border-radius:14px}
  .resource-viewer-header{flex-wrap:wrap;gap:10px;padding:14px 16px}
  .resource-viewer-header>div:first-child{min-width:0}
  .resource-viewer-header .reply-actions{flex-wrap:wrap;justify-content:flex-end}
  .resource-viewer-header h2{font-size:20px}
  .resource-viewer-body{padding:10px}
  .resource-viewer-frame{min-height:0}
  .resource-viewer-fallback{position:static;display:grid;max-width:none;margin-top:10px}
}
@media(prefers-reduced-motion:reduce){.resource-viewer-backdrop,.resource-viewer-modal{transition-duration:1ms!important;transform:none!important}}

/* 学生与教师线程统一使用居中大浮框；只有页面主体保持原课程侧栏。 */
.task-thread-modal-centered{position:absolute;left:50%;right:auto;top:50%;width:min(900px,calc(100vw - 48px));height:min(820px,calc(100dvh - 48px));border-radius:24px;background:var(--surface);box-shadow:var(--shadow);transform:translate(-50%,-46%) scale(.98);animation:center-modal-enter 320ms var(--ease) both}
.task-chat-backdrop.open .task-thread-modal-centered{transform:translate(-50%,-50%) scale(1)}
.task-chat-backdrop.closing .task-thread-modal-centered{animation:center-modal-out 220ms var(--ease) both}
@media(max-width:620px){.task-thread-modal-centered{width:calc(100vw - 24px);height:min(88vh,760px);border-radius:24px;transform:translate(-50%,-46%) scale(.98)}.task-chat-backdrop.open .task-thread-modal-centered{transform:translate(-50%,-50%) scale(1)}}
@media(prefers-reduced-motion:reduce){.task-thread-modal-centered{animation:none!important;transition:none!important;transform:translate(-50%,-50%)!important}}
.task-thread-picker-centered{grid-template-rows:auto auto auto minmax(0,1fr)!important;align-content:stretch}
.history-session-region{display:grid;gap:12px}.history-session-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.history-session-card{display:grid;gap:6px;padding:18px;border:1px solid var(--border);border-radius:16px;background:var(--surface);animation:task-card-in 260ms var(--ease) both}.history-session-card h4{margin:0;font:700 20px/1.35 var(--font-display)}.history-session-meta{margin:0;color:var(--ink-soft);overflow-wrap:anywhere}.history-session-card .button{justify-self:start;margin-top:6px}.history-modal-body{min-height:0;overflow:auto;padding-top:16px;scrollbar-gutter:stable}.history-modal-body .task-list{padding-bottom:20px}.history-guidance-note{margin-top:16px;padding:14px 16px;border-left:3px solid var(--mint);border-radius:10px;background:var(--mint-soft)}.history-guidance-note p{margin:4px 0 0;color:var(--ink-soft);white-space:pre-wrap;overflow-wrap:anywhere}.history-modal .task-chat-header{flex:none}.history-modal{grid-template-rows:auto auto minmax(0,1fr)}
@media(max-width:620px){.history-session-grid{grid-template-columns:1fr}.history-modal{height:min(88vh,760px)}}
.task-card[data-task-animation="stable"]{animation-name:none;animation-duration:260ms}

.resource-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:4px}.select-all-control{display:inline-flex;align-items:center;gap:8px;min-height:40px;color:var(--ink-soft);font-weight:700}.select-all-control input,.resource-select input{width:18px;height:18px;accent-color:var(--mint)}.resource-bulk-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;border:1px solid #cdebd5;border-radius:12px;background:var(--mint-soft);animation:resource-bar-in 220ms var(--ease) both}.resource-bulk-bar strong{margin-right:4px;color:var(--mint-deep)}.resource-list{gap:12px}.resource-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:12px}.resource-select{display:flex;align-items:center}.resource-copy{min-width:0}.resource-copy small{display:block;margin-top:5px}.resource-status{white-space:nowrap}.resource-status-hidden{background:#f4f2ee;color:var(--muted)}.resource-status-scheduled{background:#fff7df;color:#9a6700}.resource-status-expired{background:#fff0ed;color:#b42318}.resource-status-limited,.resource-status-visible{background:var(--mint-soft);color:var(--mint-deep)}.material-form{margin-top:4px}.resource-time-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:4px}.resource-time-grid label{display:grid;gap:8px;color:var(--ink-soft);font-size:13px;font-weight:700}.resource-time-grid input{min-width:0}.resource-time-grid.disabled{opacity:.55}.resource-time-grid.disabled input{cursor:not-allowed}.resource-visibility-backdrop,.resource-confirm-backdrop{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:24px;background:rgba(26,26,26,.32);opacity:0;transition:opacity 220ms var(--ease)}.resource-visibility-backdrop.open,.resource-confirm-backdrop.open{opacity:1}.resource-visibility-backdrop.closing,.resource-confirm-backdrop.closing{opacity:0}.resource-visibility-modal,.resource-confirm-modal{width:min(560px,calc(100vw - 32px));display:grid;gap:18px;padding:26px;border:1px solid var(--border);border-radius:22px;background:var(--surface);box-shadow:var(--shadow);transform:translateY(12px) scale(.98);transition:transform 220ms var(--ease)}.resource-confirm-modal{width:min(500px,calc(100vw - 32px))}.resource-visibility-backdrop.open .resource-visibility-modal,.resource-confirm-backdrop.open .resource-confirm-modal{transform:translateY(0) scale(1)}.resource-visibility-backdrop.closing .resource-visibility-modal,.resource-confirm-backdrop.closing .resource-confirm-modal{transform:translateY(12px) scale(.98)}.resource-dialog-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}.resource-dialog-head h2,.resource-confirm-modal h2{margin:4px 0 0;font:700 25px/1.25 var(--font-display)}.resource-confirm-modal p:not(.eyebrow){margin:0;color:var(--ink-soft);line-height:1.7}.resource-visibility-modal>label{display:grid;gap:8px;color:var(--ink-soft);font-size:13px;font-weight:700}.resource-visibility-modal select{width:100%;min-height:48px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fffdf9;color:var(--ink);outline:none}.resource-visibility-modal select:focus{border-color:var(--mint);box-shadow:0 0 0 4px rgba(22,163,74,.12)}.resource-confirm-modal .dialog-actions,.resource-visibility-modal .dialog-actions{display:flex;justify-content:flex-end;gap:10px;padding-top:16px;border-top:1px solid var(--border)}.button-danger{background:var(--error)!important;color:#fff!important;border-color:var(--error)!important}.button-danger:hover{filter:brightness(.96)}@keyframes resource-bar-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}
@media(max-width:960px){.resource-row{grid-template-columns:auto minmax(0,1fr);align-items:start}.resource-row>.resource-status{grid-column:2;justify-self:start}.resource-row>.button,.resource-row>.knowledge-file-link{grid-column:2;justify-self:start}.resource-time-grid{grid-template-columns:1fr}}
@media(max-width:620px){.resource-toolbar{align-items:stretch;flex-direction:column}.resource-bulk-bar{align-items:stretch}.resource-bulk-bar .button{flex:1}.resource-visibility-backdrop,.resource-confirm-backdrop{padding:12px}.resource-visibility-modal,.resource-confirm-modal{width:calc(100vw - 24px);padding:20px;border-radius:18px}.resource-dialog-head{gap:10px}.resource-dialog-head h2,.resource-confirm-modal h2{font-size:22px}.resource-visibility-modal .dialog-actions,.resource-confirm-modal .dialog-actions{flex-wrap:wrap}.resource-visibility-modal .dialog-actions .button,.resource-confirm-modal .dialog-actions .button{flex:1}}
@media(prefers-reduced-motion:reduce){.resource-bulk-bar,.resource-visibility-backdrop,.resource-confirm-backdrop,.resource-visibility-modal,.resource-confirm-modal{animation:none!important;transition:none!important;transform:none!important}}
.resource-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:8px;min-width:0}.resource-actions .button{white-space:nowrap}.resource-actions .resource-visibility-toggle{min-width:154px}.resource-actions .knowledge-file-link{display:inline-flex;align-items:center;min-height:44px;padding:10px 12px}.resource-row{grid-template-columns:auto minmax(220px,1fr) auto minmax(140px,auto);overflow-anchor:none}
@media(max-width:960px){.resource-row{grid-template-columns:auto minmax(0,1fr);align-items:start}.resource-row>.file-list-item{width:auto;min-width:0}.resource-row>.resource-status{grid-column:2;justify-self:start}.resource-row>.resource-actions{grid-column:2;justify-content:flex-start}}
@media(max-width:620px){.resource-actions{align-items:stretch;width:100%}.resource-actions .button,.resource-actions .knowledge-file-link{flex:1 1 140px;justify-content:center}}
.co-teacher-card{display:grid;gap:14px;padding:20px;border:1px solid var(--border);border-radius:18px;background:var(--surface)}.co-teacher-list{display:grid;gap:8px}.co-teacher-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fffdf9}.co-teacher-row strong,.co-teacher-row small{display:block}.co-teacher-row small{margin-top:3px}.co-teacher-add{display:flex;align-items:end;gap:10px;flex-wrap:wrap}.co-teacher-add label{display:grid;flex:1 1 260px;gap:8px;color:var(--ink-soft);font-size:13px;font-weight:700}.co-teacher-add input{min-width:0}.co-teacher-add .button{flex:0 0 auto}@media(max-width:620px){.co-teacher-add{align-items:stretch;display:grid}.co-teacher-add .button{width:100%}}
.resource-badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.resource-badges .status{padding:2px 8px;font-size:11px}
.agent-banner{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:18px;border:1px solid #b8e8c3;border-radius:16px;background:var(--mint-soft)}
.agent-banner:not(.connected){border-color:var(--border);background:#fffdfa}
.agent-banner p{margin:4px 0 0;color:var(--ink-soft);font-size:14px}
/* 学生学号账号、改密提醒与学生管理 */
.password-reminder{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 18px;border:1px solid #b8e8c3;border-radius:16px;background:#fffdfa}
.password-reminder strong{display:block;color:var(--ink)}
.password-reminder p{margin:4px 0 0;color:var(--ink-soft);font-size:14px}
.password-reminder>.button{flex:none}
.students-toolbar{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}
/* 学生管理全局视图：课程入口卡片网格（流式，窄屏自动收窄）、钻入返回行与未绑定学生区。 */
.course-entry-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(224px,1fr));gap:12px}
.course-entry-action{margin-top:4px;color:var(--mint-deep);font-size:12px;font-weight:800}
.roster-back-row{display:flex;justify-content:flex-start}
.students-unbound{display:grid;gap:12px;padding-top:18px;border-top:1px solid var(--border)}
.student-identity{min-width:0}
.student-identity strong,.student-identity small{display:block}
.student-no{font-family:var(--font-mono);font-size:12px;color:var(--muted);overflow-wrap:anywhere}
.student-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
.status-pending{background:var(--mint-soft);color:var(--mint-deep)}
/* AI 追问任务徽章：紫色仅限 AI 标识（DESIGN.md --purple-ai 语义），配合 .status 胶囊底座使用 */
.status.task-type-badge-ai{background:#f5edfb;color:#7e22ce}
.roster-group{display:grid;gap:10px}
.roster-group-title{display:flex;align-items:center;gap:10px}
.roster-group-title strong{font:700 17px/1.4 var(--font-display)}
.roster-more{display:flex;justify-content:center}
#roster-import-dialog{width:min(720px,calc(100% - 32px))}
.dialog-divider{margin:2px 0 0;padding-top:16px;border-top:1px solid var(--border);color:var(--muted);font-size:13px;font-weight:800}
.roster-preview{display:grid;gap:2px;max-height:300px;overflow:auto;padding:10px 12px;border:1px solid var(--border);border-radius:14px;background:#fffdfa;scrollbar-gutter:stable}
.roster-summary{margin:2px 0 6px;color:var(--ink-soft);font-size:13px;font-weight:700}
.roster-preview-row{display:grid;grid-template-columns:48px minmax(0,1.2fr) minmax(0,1fr) minmax(96px,1.3fr);gap:10px;align-items:start;padding:8px 0;border-bottom:1px solid var(--border);font-size:13px}
.roster-preview-row:last-child{border-bottom:0}
.roster-preview-head{font-weight:800;color:var(--ink-soft)}
.roster-row-action{display:grid;gap:4px;min-width:0}
.roster-reason{color:var(--error);overflow-wrap:anywhere}
.roster-status-error{background:#fff0ed;color:#b42318}
.attachment-line{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.learning-body{align-content:start;justify-items:stretch}
.learning-stack{display:grid;gap:18px;width:100%;max-width:860px;margin:auto;min-width:0}
.learning-member{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:16px;border:1px solid var(--border);border-radius:16px;background:#fffdfa}
.learning-member strong{font-size:17px}
.learning-copy{min-width:0}
.learning-copy p{overflow-wrap:anywhere}
.resource-viewer-download,.resource-viewer-fullscreen{display:inline-flex;align-items:center;white-space:nowrap}
@media(max-width:620px){.students-toolbar{align-items:stretch;flex-direction:column}.students-toolbar .button{width:100%}.password-reminder{align-items:stretch;flex-direction:column}.password-reminder>.button{width:100%}.roster-preview-head{display:none}.roster-preview-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.roster-preview-row>span:last-child{grid-column:1/-1}.learning-member{align-items:flex-start;flex-direction:column;gap:6px}.resource-viewer-header .reply-actions{flex-wrap:wrap;justify-content:flex-end}.resource-viewer-header .reply-actions .button{flex:1;justify-content:center}}
@media(prefers-reduced-motion:reduce){.password-reminder,.roster-group,.learning-stack{animation:none!important}}
/* 教师端「列表 + 上传按钮 + 弹窗表单」：作业/知识库工具栏与资料工具栏观感一致，主按钮右对齐。 */
.section-toolbar{display:flex;justify-content:flex-end;gap:12px;flex-wrap:wrap}
.resource-toolbar>.button-primary{margin-left:auto}
#material-upload-dialog,#assignment-publish-dialog{width:min(720px,calc(100% - 32px))}
.dialog-card .question-form{border:0;padding:0;background:transparent}
.dialog-card .question-form>.button:last-child{justify-self:end}
@media(max-width:620px){.section-toolbar .button,.resource-toolbar>.button-primary{width:100%}.dialog-card .question-form>.button:last-child{justify-self:stretch}}
/* 教师端「学情分析」：只读快照页的进度条、筛选栏与学生行。全部复用既有令牌（--surface/--border/--ink/--ink-soft/--muted/--mint/--mint-soft/--ui/--ease），不新增设计令牌颜色。 */
.analytics-body{display:grid;gap:20px;min-width:0}
.analytics-block{display:grid;gap:14px;min-width:0}
.meter{display:inline-block;flex:1 1 72px;min-width:72px;height:8px;border-radius:8px;background:var(--border);overflow:hidden}
.meter-fill{display:block;height:100%;border-radius:8px;background:var(--mint);transition:width var(--ui) var(--ease)}
.meter-line{display:flex;align-items:center;gap:8px;width:100%;min-width:0}
.meter-value{flex:none;color:var(--ink-soft);font-size:13px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.analytics-filter-bar{display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap;padding:14px 16px;border:1px solid var(--border);border-radius:16px;background:var(--surface)}
.analytics-filter{display:inline-flex;align-items:center;gap:7px;min-height:40px;color:var(--ink-soft);font-size:13px;font-weight:700}
.analytics-filter input[type="checkbox"]{width:18px;height:18px;margin:0;accent-color:var(--mint)}
.analytics-filter select{min-width:84px;min-height:40px;padding:7px 10px;border:1px solid var(--border);border-radius:10px;background:#fffdf9;color:var(--ink);outline:none;transition:border-color var(--ui) var(--ease),box-shadow var(--ui) var(--ease)}
.analytics-filter select:focus{border-color:var(--mint);box-shadow:0 0 0 3px var(--mint-soft)}
.analytics-filter-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-left:auto}
.analytics-match-count{white-space:nowrap}
.analytics-student-row,.analytics-assignment-row,.analytics-task-row{align-items:flex-start;justify-content:flex-start;flex-wrap:wrap;gap:12px 16px}
.analytics-student-row>.student-identity{flex:1 1 160px;min-width:0}
.analytics-assignment-row>.learning-copy,.analytics-task-row>.learning-copy{flex:1 1 200px}
.analytics-student-row>.reply-actions{flex:0 0 auto;margin-left:auto}
.analytics-cell{display:grid;align-content:start;gap:4px;flex:1 1 118px;min-width:0}
.analytics-cell-label{color:var(--muted);font-size:12px;font-weight:800}
.analytics-cell>p{margin:0;color:var(--ink);font-size:14px;overflow-wrap:anywhere}
.analytics-cell>.hint{color:var(--muted);font-size:12px}
.analytics-roster{min-width:0}
@media(max-width:620px){.analytics-filter-bar{gap:10px;padding:12px}.analytics-filter{flex:1 1 100%;flex-wrap:wrap}.analytics-filter-meta{width:100%;margin-left:0;justify-content:space-between}.analytics-filter-meta .button{flex:1}.analytics-student-row>.student-identity,.analytics-assignment-row>.learning-copy,.analytics-task-row>.learning-copy{flex:1 1 100%}.analytics-cell{flex:1 1 calc(50% - 16px)}.analytics-student-row>.reply-actions{width:100%;margin-left:0}.analytics-student-row>.reply-actions .button{flex:1}}
@media(prefers-reduced-motion:reduce){.meter-fill{transition:none!important}}
/* 知识库弹窗「资料分类」：单选 chips + 行内新建分类（任务A）。选中态对齐 .custom-select-option.active 的 mint-soft/mint-deep；8-9px 圆角胶囊感，非全局胶囊；仅色彩过渡，无位移动效。 */
.category-field{display:grid;gap:8px;color:var(--ink-soft);font-size:14px;font-weight:700}
.category-chip-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.category-chip{min-height:40px;padding:8px 14px;border:1px solid var(--border);border-radius:9px;background:var(--surface);color:var(--ink);font-weight:700;cursor:pointer;transition:background var(--ui) var(--ease),color var(--ui) var(--ease),border-color var(--ui) var(--ease)}
.category-chip:hover{background:var(--mint-soft);color:var(--mint-deep)}
.category-chip[aria-pressed="true"]{background:var(--mint-soft);color:var(--mint-deep);border-color:var(--mint-deep)}
.category-chip:focus-visible{outline:3px solid var(--mint);outline-offset:2px}
.category-chip-add{border-style:dashed;color:var(--ink-soft)}
.category-chip-create{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.category-chip-create input{flex:1 1 180px;min-width:0;min-height:40px;padding:8px 12px}
.category-chip-create .button{flex:none;min-height:40px;margin-top:0;padding:8px 14px;font-size:14px}
.category-chip-create .inline-status{flex:1 1 100%;min-height:0;margin-top:0}
/* 课堂互动（任务B）：历史课堂入口不再平铺，仅保留计数入口；浏览弹窗用独立 backdrop 类，避免与聊天抽屉 .task-chat-backdrop 互踢。 */
.history-entry-region{display:grid;gap:12px;justify-items:start}
.history-entry-region .button{margin-top:0}
.history-browser-backdrop{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(26,26,26,.30);animation:fade-in var(--ui) var(--ease) both}
.history-browser-backdrop.closing{opacity:0;transition:opacity var(--ui) var(--ease)}
.history-browser-backdrop.closing .history-browser-modal{animation:modal-out 220ms var(--ease) both}
.history-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;gap:14px;width:min(1040px,calc(100vw - 24px));height:calc(100dvh - 32px);padding:22px 26px;border:1px solid var(--border);border-radius:24px;background:var(--surface);box-shadow:var(--shadow);overflow:hidden;animation:modal-enter 320ms var(--ease) both}
.history-browser-tools{min-width:0}
.history-browser-tools input{min-height:44px}
.history-browser-list{display:grid;align-content:start;gap:12px;min-height:0;overflow:auto;padding:2px 4px 2px 2px;scrollbar-gutter:stable;min-width:0}
.history-browser-list .history-session-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.history-browser-list .task-list{padding:4px 0 12px}
.history-browser-detail-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;padding-bottom:12px;border-bottom:1px solid var(--border)}
.history-browser-detail-head .button{margin-top:0;flex:none}
.history-browser-detail-title{flex:1 1 220px;display:grid;gap:2px;min-width:0}
.history-browser-detail-title h3{margin:0;font:700 20px/1.35 var(--font-display)}
.history-browser-footer{display:flex;justify-content:center;min-height:0}
.history-browser-footer .button{margin-top:0;flex:0 1 auto}
@media(max-width:620px){.history-browser-backdrop{padding:8px}.history-browser-modal{width:calc(100vw - 16px);height:calc(100dvh - 16px);padding:16px 14px;border-radius:20px;gap:10px}.history-browser-list .history-session-grid{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){.history-browser-backdrop,.history-browser-modal{animation:none!important;transition:none!important}.category-chip{transition:none!important}}
/* ===== 班级管理：回收站入口与已删除班级列表 ===== */
.archived-classes-entry{width:100%;margin-top:8px;padding:10px 12px;border:1px dashed var(--border);border-radius:12px;background:transparent;color:var(--muted);font-weight:700;font-size:13px;text-align:center;transition:color var(--ui) var(--ease),border-color var(--ui) var(--ease),transform var(--micro) var(--ease)}
.archived-classes-entry:hover{color:var(--mint-deep);border-color:#b8e8c3;transform:translateX(2px)}
.archived-class-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;border:1px solid var(--border);border-radius:16px;background:#fffdfa}
.archived-class-info{min-width:0}
.archived-class-info strong{overflow-wrap:anywhere}
.archived-class-info small{display:block;margin-top:3px;color:var(--muted);font-size:12px}
.archived-class-row .button{flex:none}
@media(max-width:620px){.archived-class-row{flex-direction:column;align-items:stretch}.archived-class-row .button{width:100%}}
/* 班级设置卡：视觉与共同教师卡一致，但使用独立类名避免既有 e2e 严格定位歧义 */
.class-settings-card{display:grid;gap:14px;padding:20px;border:1px solid var(--border);border-radius:18px;background:var(--surface)}
/* toast 顶层化（Popover API）：原生 dialog 在 top layer，z-index 永远压不过；
   popover 的 UA 样式（inset:0/margin:auto/border 等）需复位，视觉保持原 .toast 不变。 */
#toast[popover]{inset:auto;margin:0;border:0;padding:11px 15px;background:var(--ink);color:#fff}
/* ===== PDF 翻页预览器（PDF.js Canvas 渲染） ===== */
.pdf-viewer{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;height:100%;min-height:0;gap:0}
.pdf-toolbar{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--border);background:#fffdfa}
.pdf-toolbar .button{min-height:38px;padding:6px 12px;font-size:13px}
.pdf-indicator{min-width:88px;text-align:center;font-family:var(--font-mono);font-size:13px;font-weight:700;color:var(--ink-soft)}
.pdf-zoom-value{min-width:48px;text-align:center;font-family:var(--font-mono);font-size:13px;color:var(--ink-soft)}
.pdf-toolbar-sep{width:1px;height:22px;margin:0 6px;background:var(--border)}
.pdf-stage-wrap{position:relative;display:grid;justify-items:center;align-items:start;min-height:0;overflow:auto;padding:18px;scrollbar-gutter:stable}
.pdf-stage{display:grid;justify-items:safe center;min-width:0}
/* 不设 max-width：放大超出容器时按真实 px 宽渲染，由 .pdf-stage-wrap 横向滚动；
   safe center 让超宽 canvas 退化为起始对齐，左侧内容滚动可达且宽高比不变形 */
.pdf-canvas{display:block;border:1px solid var(--border);border-radius:8px;background:#fff;box-shadow:0 8px 28px rgba(30,31,29,.10)}
.pdf-page-enter{animation:pdf-page-in var(--ui) var(--ease) both}
@keyframes pdf-page-in{from{opacity:0;transform:translateX(10px)}to{opacity:1;transform:translateX(0)}}
@media(max-width:620px){.pdf-toolbar{gap:4px;padding:6px 8px}.pdf-toolbar .button{min-height:44px;padding:8px 12px}.pdf-stage-wrap{padding:10px}.pdf-indicator{min-width:72px;font-size:12px}}
@media(prefers-reduced-motion:reduce){.pdf-page-enter{animation:none!important}}
/* ===== 课程信息编辑入口 + 知识库多文件上传：只做静态布局补充，全部复用既有令牌与动效类，不新增动画 ===== */
.course-hero-actions{margin-top:14px}
.file-meta-list{display:grid;gap:8px;margin-top:10px;min-width:0}
.file-meta-list .file-meta{margin-top:0}
.file-meta-list .file-meta>span{flex:1 1 auto;min-width:0;overflow-wrap:anywhere}
.knowledge-detail-fields{display:grid;gap:12px;min-width:0}
