:root{--ink:#172033;--muted:#65708a;--line:#dfe5ee;--panel:#fff;--canvas:#f5f7fb;--navy:#14213d;--blue:#2457c5;--blue-soft:#e9f0ff;--green:#087c5d;--green-soft:#e5f6f0;--amber:#a15c00;--amber-soft:#fff4db;--red:#b42318;--red-soft:#feeceb;--shadow:0 12px 30px rgba(25,43,79,.08);font-family:Inter,"Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif;color:var(--ink)}*{box-sizing:border-box}body{margin:0;background:var(--canvas);min-width:320px}button,input,textarea,select{font:inherit}button{cursor:pointer}.hidden{display:none!important}.eyebrow{font-size:.75rem;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--blue);margin:0 0 .55rem}.auth-layout{min-height:100vh;display:grid;grid-template-columns:1.05fr .95fr;background:#fff}.brand-panel{padding:clamp(3rem,8vw,8rem);background:linear-gradient(140deg,#10203f,#1b489e);color:#fff;display:flex;flex-direction:column;justify-content:center}.brand-panel .eyebrow{color:#a8c6ff}.brand-panel h1{font-size:clamp(2.4rem,5vw,4.8rem);margin:.1rem 0 1.2rem;letter-spacing:-.055em}.brand-copy{max-width:35rem;font-size:1.1rem;line-height:1.8;color:#dce8ff}.brand-mark{display:grid;place-items:center;width:3.5rem;height:3.5rem;border-radius:1rem;background:#fff;color:var(--blue);font-weight:900;font-size:1.1rem;margin-bottom:2rem}.security-note{display:flex;gap:.8rem;align-items:flex-start;max-width:35rem;margin-top:2rem;padding:1rem 1.15rem;border:1px solid rgba(255,255,255,.23);background:rgba(255,255,255,.1);border-radius:.85rem;font-size:.86rem;line-height:1.55}.security-note span{color:#dce8ff}.auth-card{align-self:center;width:min(100%,31rem);margin:2rem auto;padding:2.5rem}.auth-card h2{font-size:2rem;letter-spacing:-.04em;margin:.2rem 0 .5rem}.auth-card>p:not(.eyebrow){color:var(--muted);line-height:1.6;margin:0 0 1.8rem}.form-stack{display:grid;gap:1rem}.form-stack label,.field{display:grid;gap:.45rem;font-size:.87rem;font-weight:700}.form-stack input,.field input,.field textarea,.field select{border:1px solid #c9d3e2;border-radius:.65rem;padding:.78rem .85rem;background:#fff;color:var(--ink);outline:none;transition:.15s}.form-stack input:focus,.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--blue);box-shadow:0 0 0 3px #dbe7ff}.field textarea{resize:vertical;min-height:6rem}.form-error{min-height:1.25rem;color:var(--red);font-size:.85rem;line-height:1.4}.btn{border:0;border-radius:.65rem;padding:.78rem 1rem;font-weight:800;transition:transform .15s,box-shadow .15s}.btn:hover{transform:translateY(-1px)}.btn-primary{background:var(--blue);color:#fff;box-shadow:0 6px 14px rgba(36,87,197,.25)}.btn-secondary{background:#eef2f8;color:#23314a}.btn-danger{background:var(--red);color:#fff}.btn-small{padding:.45rem .7rem;font-size:.8rem}.app-shell{min-height:100vh;display:grid;grid-template-columns:16.5rem 1fr}.sidebar{background:var(--navy);color:#fff;display:flex;flex-direction:column;padding:1.15rem .85rem;position:sticky;top:0;height:100vh}.logo{display:flex;gap:.65rem;align-items:center;color:#fff;text-decoration:none;font-weight:800;padding:.55rem .65rem;margin-bottom:1.5rem}.logo span{display:grid;place-items:center;width:2rem;height:2rem;border-radius:.55rem;background:#fff;color:var(--blue);font-size:.7rem}.sidebar nav{display:grid;gap:.3rem}.nav-link{border:0;background:transparent;color:#c7d0e2;text-align:left;border-radius:.6rem;padding:.74rem .7rem;font-weight:700;display:flex;align-items:center;gap:.7rem;width:100%}.nav-link:hover,.nav-link.active{background:rgba(255,255,255,.12);color:#fff}.nav-link span:first-child{width:1rem;text-align:center}.nav-link .badge{margin-left:auto;background:#dbe7ff;color:#163c91;border-radius:10rem;padding:.05rem .43rem;font-size:.7rem}.sidebar-foot{margin-top:auto;border-top:1px solid rgba(255,255,255,.13);padding-top:.8rem}.mini-user{font-size:.78rem;color:#c7d0e2;padding:.55rem .7rem;line-height:1.45}.muted{color:#adb8cc}.workspace{min-width:0}.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:5.5rem;padding:1rem clamp(1.1rem,3.5vw,3rem);background:rgba(255,255,255,.9);border-bottom:1px solid var(--line);position:sticky;z-index:5;top:0;backdrop-filter:blur(10px)}.topbar h1{margin:0;letter-spacing:-.035em;font-size:1.5rem}.topbar .eyebrow{margin:0 0 .25rem}.topbar-actions{display:flex;align-items:center;gap:.7rem}.topbar-user{font-size:.86rem;font-weight:700;color:var(--muted)}.icon-button{border:1px solid var(--line);background:#fff;width:2.35rem;height:2.35rem;border-radius:.6rem;color:var(--muted);font-size:1rem}.content{padding:clamp(1.1rem,3vw,2.4rem);max-width:1400px;margin:0 auto}.section-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1.2rem}.section-head h2{font-size:1.2rem;margin:0;letter-spacing:-.02em}.section-head p{margin:.3rem 0 0;color:var(--muted);font-size:.9rem}.metric-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin-bottom:1.6rem}.metric{background:var(--panel);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:.9rem;padding:1.1rem}.metric span{display:block;color:var(--muted);font-size:.8rem;font-weight:700}.metric strong{display:block;font-size:1.8rem;margin-top:.3rem;letter-spacing:-.05em}.grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:1rem}.card{background:var(--panel);border:1px solid var(--line);border-radius:.9rem;padding:1.2rem;box-shadow:var(--shadow)}.card h3{margin:0 0 .4rem;font-size:1rem}.card p{color:var(--muted);font-size:.88rem;line-height:1.55}.span-4{grid-column:span 4}.span-5{grid-column:span 5}.span-6{grid-column:span 6}.span-7{grid-column:span 7}.span-8{grid-column:span 8}.span-12{grid-column:span 12}.course-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(235px,1fr));gap:1rem}.course-card{display:flex;flex-direction:column;gap:.8rem;min-height:11rem}.course-card .course-subject{color:var(--blue);font-size:.76rem;font-weight:800;letter-spacing:.08em}.course-card h3{font-size:1.1rem}.course-card .course-meta{margin-top:auto;color:var(--muted);font-size:.8rem}.list{display:grid;gap:.2rem}.list-row{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.85rem .15rem;border-bottom:1px solid #e9edf3}.list-row:last-child{border-bottom:0}.list-row b{font-size:.9rem}.list-row small{display:block;margin-top:.24rem;color:var(--muted)}.chip{display:inline-flex;align-items:center;gap:.3rem;border-radius:10rem;padding:.22rem .55rem;font-size:.73rem;font-weight:800;background:#edf2f9;color:#536078;white-space:nowrap}.chip.green{background:var(--green-soft);color:var(--green)}.chip.amber{background:var(--amber-soft);color:var(--amber)}.chip.red{background:var(--red-soft);color:var(--red)}.chip.blue{background:var(--blue-soft);color:var(--blue)}.empty{padding:2.8rem 1rem;text-align:center;color:var(--muted);border:1px dashed #c9d3e2;border-radius:.8rem;background:#fbfcfe}.tabs{display:flex;gap:.4rem;overflow:auto;border-bottom:1px solid var(--line);margin-bottom:1rem}.tab{padding:.65rem .8rem;border:0;background:transparent;color:var(--muted);font-weight:800;white-space:nowrap}.tab.active{color:var(--blue);box-shadow:inset 0 -2px 0 var(--blue)}.toolbar{display:flex;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.detail-hero{background:linear-gradient(115deg,#17336e,#255bc3);color:#fff;border-radius:1rem;padding:1.5rem;margin-bottom:1rem}.detail-hero .eyebrow{color:#b4cfff}.detail-hero h2{font-size:1.8rem;letter-spacing:-.04em;margin:0 0 .5rem}.detail-hero p{margin:0;color:#e5edff;line-height:1.6;white-space:pre-wrap}.resource-list{display:grid;gap:.55rem;margin-top:1rem}.resource{display:flex;align-items:center;gap:.7rem;border:1px solid #dae2ed;border-radius:.65rem;padding:.7rem;text-decoration:none;color:var(--ink);font-size:.85rem;font-weight:700}.resource:hover{border-color:#91b0ea;background:#f7faff}.resource i{font-style:normal;color:var(--blue)}.assignment-card{display:flex;gap:1rem;align-items:flex-start}.assignment-card .date-box{flex:0 0 3.5rem;border-radius:.7rem;background:var(--blue-soft);color:var(--blue);padding:.45rem;text-align:center;font-size:.75rem;font-weight:800}.assignment-card h3{margin:.1rem 0 .3rem}.assignment-card p{margin:0}.assignment-card .actions{margin-left:auto;align-self:center}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:.75rem}.data-table{border-collapse:collapse;width:100%;min-width:640px;background:#fff;font-size:.86rem}.data-table th,.data-table td{text-align:left;padding:.72rem .8rem;border-bottom:1px solid var(--line);vertical-align:top}.data-table th{color:var(--muted);background:#f8faff;font-size:.74rem;letter-spacing:.04em;text-transform:uppercase}.data-table tr:last-child td{border-bottom:0}.link-button{border:0;background:transparent;color:var(--blue);font-weight:800;padding:0}.modal-root{position:fixed;z-index:20;inset:0;background:rgba(15,28,52,.52);padding:1rem;display:grid;place-items:center}.modal{background:#fff;border-radius:1rem;width:min(100%,46rem);max-height:calc(100vh - 2rem);overflow:auto;box-shadow:0 28px 65px rgba(14,27,53,.28)}.modal-head{display:flex;align-items:flex-start;justify-content:space-between;padding:1.25rem 1.35rem;border-bottom:1px solid var(--line)}.modal-head h2{font-size:1.25rem;margin:0}.modal-head p{margin:.3rem 0 0;color:var(--muted);font-size:.85rem}.modal-body{padding:1.35rem}.modal-foot{display:flex;justify-content:flex-end;gap:.65rem;padding:1rem 1.35rem;border-top:1px solid var(--line)}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.full{grid-column:1/-1}.checkbox-line{display:flex;align-items:center;gap:.5rem;font-size:.86rem;font-weight:700}.check-list{border:1px solid var(--line);max-height:13rem;overflow:auto;border-radius:.65rem;padding:.25rem}.check-list label{display:flex;gap:.6rem;align-items:center;padding:.55rem;font-weight:600;font-size:.86rem}.upload-row{display:flex;gap:.7rem;align-items:center;padding:.75rem;border:1px dashed #9bb1d7;border-radius:.65rem;background:#fbfdff}.upload-row input{max-width:100%}.attachment-items{display:grid;gap:.35rem;margin:.6rem 0}.attachment-item{font-size:.8rem;color:var(--green);font-weight:700}.notice{border-left:4px solid var(--blue);background:#eef4ff;padding:.85rem 1rem;border-radius:.25rem .6rem .6rem .25rem;color:#334c79;font-size:.87rem;line-height:1.55}.toast-root{position:fixed;right:1rem;bottom:1rem;z-index:40;display:grid;gap:.55rem}.toast{padding:.8rem 1rem;border-radius:.7rem;background:#172033;color:#fff;box-shadow:var(--shadow);font-size:.88rem;max-width:25rem}.toast.error{background:var(--red)}.mobile-only{display:none}@media(max-width:900px){.app-shell{grid-template-columns:1fr}.sidebar{position:fixed;z-index:10;transform:translateX(-102%);transition:transform .2s;width:16.5rem;box-shadow:var(--shadow)}.sidebar.open{transform:translateX(0)}.mobile-only{display:grid;place-items:center}.metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.span-4,.span-5,.span-6,.span-7,.span-8{grid-column:span 12}}@media(max-width:700px){.auth-layout{grid-template-columns:1fr}.brand-panel{padding:2.5rem 1.8rem;min-height:35vh}.brand-panel.compact{min-height:28vh}.auth-card{padding:2rem 1.35rem;margin:0}.topbar{padding:1rem}.topbar-user{display:none}.content{padding:1rem}.metric-grid{grid-template-columns:1fr 1fr;gap:.7rem}.metric{padding:.85rem}.metric strong{font-size:1.35rem}.form-grid{grid-template-columns:1fr}.assignment-card{flex-wrap:wrap}.assignment-card .actions{margin-left:0}.modal-root{padding:0}.modal{border-radius:0;width:100%;max-height:100vh;min-height:100vh}.modal-body{padding:1rem}.modal-head,.modal-foot{padding:1rem}}
.field-label{margin-top:.75rem;font-size:.8rem;font-weight:800;color:var(--muted)}.field-note{margin:.45rem 0;color:var(--muted);font-size:.84rem}.upload-progress{margin:.6rem 0;padding:.65rem .75rem;border:1px solid #cddcf7;border-radius:.65rem;background:#f6f9ff}.upload-progress>div:first-child{display:flex;justify-content:space-between;gap:.75rem;font-size:.8rem;color:#314b78}.upload-progress-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.upload-progress-value{color:var(--blue)}.upload-progress-track{height:.42rem;margin-top:.45rem;background:#dce7fa;border-radius:9rem;overflow:hidden}.upload-progress-fill{display:block;height:100%;width:0;background:linear-gradient(90deg,#2457c5,#4d80e7);transition:width .16s ease}.attachment-pending{display:flex;align-items:center;justify-content:space-between;gap:.75rem;color:var(--ink);padding:.6rem .7rem;border:1px solid #d8e2f0;border-radius:.6rem;background:#fbfdff}.attachment-pending span{min-width:0}.attachment-pending b,.attachment-pending small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-pending small{margin-top:.15rem;color:var(--muted);font-weight:600}.attachment-pending .btn{flex:0 0 auto}
.attachment-select{display:flex;align-items:flex-start;gap:.6rem;min-width:0;cursor:pointer}.attachment-select input{margin:.2rem 0 0;accent-color:var(--blue)}.attachment-select span{min-width:0}
.attachment-existing{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.6rem .7rem;border:1px solid #d8e2f0;border-radius:.6rem;background:#fbfdff;color:var(--ink)}.attachment-existing>span{min-width:0;overflow-wrap:anywhere}.attachment-existing .btn{flex:0 0 auto}
.student-filter{margin-bottom:1rem;padding:1rem;border:1px solid #d8e2f0;border-radius:.75rem;background:#fbfdff}.filter-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.8rem}.compact-toolbar{margin-top:.85rem;align-items:center}.filter-result{color:#52657d;font-size:.9rem}.pagination{display:flex;justify-content:flex-end;align-items:center;gap:.7rem;margin-top:.85rem;color:#52657d;font-size:.9rem}.student-table td:last-child{min-width:145px}@media(max-width:860px){.filter-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.compact-toolbar{align-items:flex-start;gap:.65rem;flex-direction:column}.pagination{justify-content:center}.student-table{min-width:760px}}@media(max-width:520px){.filter-grid{grid-template-columns:1fr}}

/* 教材與關聯作業 */
.content-assignment-list { display: grid; gap: 1rem; }
.content-assignment-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 1rem; padding: 1rem; border: 1px solid #dce5f3; border-radius: .8rem; background: #fff; }
.content-main > b { display: block; font-size: 1rem; color: #152b4c; }
.content-main > small { display: block; margin-top: .25rem; color: #68758a; }
.content-main > p { margin: .75rem 0; }
.related-assignment-panel { margin-top: .85rem; padding: .75rem; border-left: 3px solid #2f66d6; border-radius: .25rem .6rem .6rem .25rem; background: #f4f7fd; }
.related-assignment-title { margin-bottom: .45rem; font-size: .84rem; font-weight: 700; color: #315b9d; }
.related-assignment { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .55rem 0; border-top: 1px solid #dce5f3; }
.related-assignment:first-of-type { border-top: 0; }
.related-assignment strong, .related-assignment small { display: block; }
.related-assignment small { margin-top: .2rem; color: #68758a; }
.related-assignment-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .45rem; flex: 0 0 auto; }
.related-assignment-empty { color: #718096; font-size: .88rem; }
/* 批改篩選及提交檔案 */
.submission-filter { margin-bottom: 1rem; padding: .9rem; border: 1px solid #dce5f3; border-radius: .75rem; background: #f8faff; }
.submission-version-list { display: grid; gap: 1rem; }
.submission-version { padding: 1rem; border: 1px solid #dce5f3; border-radius: .75rem; background: #fff; }
.submission-version h3 { margin: 0 0 .65rem; color: #152b4c; }
.submission-version h3 small { font-weight: 400; color: #68758a; }
.submission-text { white-space: pre-wrap; padding: .75rem; border-radius: .5rem; background: #f8fafc; }
.submission-file-list { display: grid; gap: .5rem; margin-top: .75rem; }
.submission-file { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .65rem .75rem; border: 1px solid #dce5f3; border-radius: .55rem; background: #f8faff; }
.submission-file small { color: #68758a; }
@media (max-width: 640px) { .content-assignment-row { grid-template-columns: 1fr; } .related-assignment, .submission-file { align-items: flex-start; flex-direction: column; } .related-assignment-actions { justify-content: flex-start; } }

/* 課程作業成績總覽 */
.gradebook-groups { display: grid; gap: 1rem; }
.gradebook-group { border: 1px solid #d8e2f0; border-radius: .85rem; background: #fff; box-shadow: var(--shadow); overflow: hidden; }
.gradebook-group-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: 1rem 1.1rem; background: linear-gradient(120deg, #f8fbff, #edf4ff); }
.gradebook-group-head .eyebrow { margin-bottom: .35rem; }
.gradebook-group-head h3 { margin: 0; color: #152b4c; font-size: 1.05rem; }
.gradebook-group-head p { margin: .45rem 0; color: #3e536f; font-size: .9rem; }
.gradebook-group-head small { color: #68758a; }
.gradebook-average { min-width: 9.5rem; padding: .7rem .8rem; border: 1px solid #cddcf7; border-radius: .65rem; background: #fff; text-align: right; }
.gradebook-average span { display: block; color: #68758a; font-size: .78rem; font-weight: 700; }
.gradebook-average strong { display: block; margin-top: .18rem; color: #1f55bf; font-size: .98rem; }
.gradebook-group details { border-top: 1px solid #d8e2f0; }
.gradebook-group summary { padding: .85rem 1.1rem; color: #2457c5; font-size: .88rem; font-weight: 800; cursor: pointer; }
.gradebook-group details .table-wrap { margin: 0 1.1rem 1.1rem; }
.gradebook-table { min-width: 760px; }
@media (max-width: 640px) { .gradebook-group-head { flex-direction: column; } .gradebook-average { width: 100%; text-align: left; } }

/* 破壞性作業需與一般刪除清晰區分 */
.btn-force-delete { background: #8c1d18; border-color: #721612; box-shadow: none; }
.btn-force-delete:hover, .btn-force-delete:focus-visible { background: #68110e; border-color: #520d0b; }
.actions .btn-force-delete { margin-left: .25rem; }

/* 獨立輸入法測試模組入口 */
.typing-nav-link { text-decoration: none; display: flex; align-items: center; }


/* 學生首頁：優先作業與最新教材的上下分層通知 */
.student-home-panels { display: grid; gap: 1rem; }
.student-home-panel { padding: 0; overflow: hidden; }
.student-home-panel-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1.05rem 1.2rem .85rem; border-bottom: 1px solid var(--line); background: linear-gradient(105deg, #fbfdff, #f3f7ff); }
.student-home-panel-head .eyebrow { margin: 0 0 .28rem; }
.student-home-panel-head h3 { margin: 0; color: #172d50; font-size: 1.08rem; }
.student-home-count { display: grid; place-items: center; flex: 0 0 auto; min-width: 2rem; height: 2rem; padding: 0 .45rem; border-radius: 999px; color: #2457c5; background: #e7efff; font-size: .82rem; font-weight: 800; }
.student-home-list { padding: 0 1.2rem .2rem; }
.student-home-list .empty { margin: 1rem 0 1.15rem; padding: 1.8rem 1rem; }
.student-home-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(8.5rem, auto) max-content; align-items: center; gap: 1rem; padding: 1rem 0; border-bottom: 1px solid #e8edf5; }
.student-home-row:last-child { border-bottom: 0; }
.student-home-row-main { min-width: 0; }
.student-home-row-main b { display: block; color: #1d2b43; font-size: .96rem; line-height: 1.45; overflow-wrap: anywhere; }
.student-home-row-main small { display: block; margin-top: .28rem; color: var(--muted); font-size: .84rem; line-height: 1.45; overflow-wrap: anywhere; }
.student-home-row-status { justify-self: end; }
.student-home-time { min-width: 8.5rem; color: var(--muted); font-size: .82rem; line-height: 1.4; text-align: right; }
.student-home-action { white-space: nowrap; min-width: 5.9rem; }
.due-assignment-row { border-left: 3px solid #e5a100; padding-left: .85rem; }
.recent-content-row { border-left: 3px solid #4a7bdd; padding-left: .85rem; }
@media (max-width: 780px) {
  .student-home-row { grid-template-columns: minmax(0, 1fr) max-content; gap: .75rem; }
  .student-home-time { min-width: 0; }
  .student-home-action { grid-column: 2; }
}
@media (max-width: 560px) {
  .student-home-panel-head, .student-home-list { padding-left: 1rem; padding-right: 1rem; }
  .student-home-row { grid-template-columns: 1fr; gap: .6rem; padding: .9rem 0; }
  .student-home-row-status, .student-home-time { justify-self: start; text-align: left; }
  .student-home-action { grid-column: auto; justify-self: start; }
}


/* 系統管理：建立老師與學生帳戶操作 */
.admin-account-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .65rem; }
@media (max-width: 560px) {
  .section-head:has(.admin-account-actions) { align-items: flex-start; flex-direction: column; }
  .admin-account-actions { width: 100%; justify-content: stretch; }
  .admin-account-actions .btn { flex: 1 1 10rem; }
}

/* 教師快速重設：只列出其已指派課程所涵蓋班別的學生。 */
.managed-student-reset-card { display: grid; gap: 1rem; }
.managed-student-filter { margin: 0; }
.managed-student-table { min-width: 760px; }
.managed-student-table td:nth-child(3) { min-width: 16rem; color: #52657d; line-height: 1.5; }


/* AI 課程練習：來源文件、教師核對題目與學生答題區。 */
.practice-type-list { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); }
.practice-question-editor { margin: 1rem 0; padding: 1rem; border: 1px solid var(--line); border-left: 4px solid var(--blue); border-radius: 12px; background: #fbfdff; }
.practice-question-editor > header { display: flex; align-items: center; justify-content: space-between; gap: .8rem; margin-bottom: .8rem; }
.practice-question-editor .form-grid { gap: .8rem; }
.practice-student-panel { max-width: 100%; }
.practice-question-list { display: grid; gap: 1rem; margin: 1rem 0 1.25rem; }
.practice-question { padding: 1rem; border: 1px solid var(--line); border-radius: 12px; background: #fff; }
.practice-question header { display: flex; align-items: center; gap: .65rem; }
.practice-question header small { display: block; margin-top: .15rem; color: var(--muted); }
.practice-question > p { white-space: normal; line-height: 1.65; }
.practice-number { display: grid; place-items: center; flex: 0 0 2rem; width: 2rem; height: 2rem; border-radius: 50%; color: #fff; font-weight: 700; background: var(--blue); }
.practice-options { display: grid; gap: .55rem; margin-top: .8rem; }
.practice-options label { display: flex; align-items: flex-start; gap: .55rem; padding: .65rem .75rem; border: 1px solid #dce5f3; border-radius: 8px; cursor: pointer; }
.practice-options label:hover { border-color: var(--blue); background: #f4f8ff; }
.practice-options input { margin-top: .2rem; }
.practice-text-answer { width: 100%; margin-top: .75rem; min-height: 2.65rem; resize: vertical; }
textarea.practice-text-answer { min-height: 8rem; }
.practice-result { display: inline-block; margin-top: .8rem; font-weight: 600; }
.practice-result.correct { color: var(--green); }
.practice-result.incorrect { color: var(--red); }
.practice-result.pending { color: var(--amber); }
.practice-teacher-panel { margin-top: 1rem; }
.practice-teacher-questions { display: grid; gap: .65rem; }
.practice-teacher-questions details { padding: .8rem 1rem; border: 1px solid var(--line); border-radius: 9px; background: #fff; }
.practice-teacher-questions summary { cursor: pointer; font-weight: 700; }
.practice-teacher-questions p, .practice-teacher-questions ul { margin: .7rem 0; }
.practice-response-list { display: grid; gap: .7rem; margin-top: .85rem; }
.practice-response { padding: .8rem; border-left: 3px solid var(--blue); border-radius: 7px; background: #f8fbff; }
.practice-response p { margin: .45rem 0; }
@media (max-width: 640px) {
  .practice-question-editor > header { align-items: flex-start; flex-direction: column; }
  .practice-question-editor > header .btn { width: 100%; }
  .practice-options label { line-height: 1.45; }
}


/* AI 練習：先確認知識點，再平均配題 */
.knowledge-point-editor,
.knowledge-allocation,
.knowledge-coverage {
  border: 1px solid #dce3ef;
  border-radius: 12px;
  background: #f8fbff;
  padding: 14px;
  margin-bottom: 12px;
}
.knowledge-point-editor .checkbox-line { margin-bottom: 10px; }
.knowledge-point-editor .btn-danger { margin-top: 4px; }
.knowledge-allocation h3,
.knowledge-coverage h3 { margin: 0 0 10px; font-size: 1rem; }
.knowledge-allocation-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 8px;
}
.knowledge-allocation-list > span {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  padding: 9px 10px;
  border-radius: 9px;
  background: #eaf2ff;
  color: #183a70;
}
.knowledge-allocation-list b { overflow-wrap: anywhere; }
.knowledge-allocation-list small {
  flex: 0 0 auto;
  border-radius: 999px;
  padding: 3px 7px;
  background: #1e62c6;
  color: #fff;
  font-weight: 700;
}
.practice-question-editor header > div { min-width: 0; }
.knowledge-point-tag {
  display: inline-block;
  margin-left: 8px;
  padding: 3px 7px;
  border-radius: 999px;
  background: #e7f0ff;
  color: #1856aa;
  font-weight: 700;
  line-height: 1.35;
  overflow-wrap: anywhere;
}
@media (max-width: 640px) {
  .knowledge-allocation-list { grid-template-columns: 1fr; }
  .knowledge-point-tag { display: block; width: fit-content; margin: 6px 0 0; }
}


/* AI 練習知識點整理：僅顯示處理階段及百分比，不顯示私有教材內容。 */
.practice-knowledge-progress {
  display: grid;
  gap: 0.85rem;
  padding: 1.15rem;
  border: 1px solid var(--line);
  border-radius: 0.9rem;
  background: linear-gradient(135deg, rgba(40, 97, 210, 0.08), rgba(255, 255, 255, 0.92));
}
.practice-knowledge-progress-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  color: var(--ink);
}
.practice-knowledge-progress-head strong { overflow-wrap: anywhere; }
.practice-knowledge-progress-head b { color: var(--blue); white-space: nowrap; }
.practice-knowledge-progress-track {
  height: 0.75rem;
  overflow: hidden;
  border-radius: 999px;
  background: #dce6fb;
  box-shadow: inset 0 1px 2px rgba(21, 48, 96, 0.12);
}
.practice-knowledge-progress-track > span {
  display: block;
  height: 100%;
  min-width: 0;
  border-radius: inherit;
  background: linear-gradient(90deg, #215fd2, #3d90ef);
  box-shadow: 0 0 0.75rem rgba(43, 113, 223, 0.3);
  transition: width 0.45s ease;
}
@media (max-width: 560px) {
  .practice-knowledge-progress { padding: 1rem; }
  .practice-knowledge-progress-head { align-items: flex-start; }
}


/* AI 練習教材分析範圍：文字會全文整理，教師只選擇視覺頁面範圍。 */
.practice-page-range-options {
  display: grid;
  gap: 0.75rem;
  padding: 0.95rem;
  border: 1px solid #cfdcf1;
  border-radius: 0.75rem;
  background: #f8faff;
}
.practice-page-range-options > .checkbox-line {
  padding: 0.55rem 0;
  border-bottom: 1px solid #e1e8f3;
}
.practice-page-range-options > .checkbox-line:last-of-type { border-bottom: 0; }
.practice-page-range-inputs {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.75rem;
}
@media (max-width: 560px) {
  .practice-page-range-inputs { grid-template-columns: 1fr; }
}


/* 作業詳情：先顯示全寬關聯教材，再顯示學生答題或老師 AI 題目檢視。 */
.assignment-detail-stack {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1rem;
  width: 100%;
}
.assignment-detail-stack > .card {
  width: 100%;
  min-width: 0;
  margin: 0;
}
.assignment-detail-stack .practice-student-panel,
.assignment-detail-stack .practice-teacher-panel {
  margin-top: 0;
}
@media (max-width: 640px) {
  .assignment-detail-stack { gap: .8rem; }
}


/* 首頁會話驗證閘門：在 API 確認前只顯示中性載入狀態，避免已登入使用者看到登入表單閃現。 */
.boot-layout{min-height:100vh;display:grid;place-items:center;padding:1.5rem;background:linear-gradient(135deg,#eef4ff 0%,#f8fbff 52%,#e7efff 100%)}
.boot-card{display:flex;align-items:center;gap:1rem;max-width:32rem;width:100%;padding:1.35rem 1.5rem;border:1px solid #d7e3fa;border-radius:1rem;background:rgba(255,255,255,.96);box-shadow:0 18px 45px rgba(35,78,143,.13);color:#172d50}
.boot-card .eyebrow{margin:0 0 .25rem}.boot-card h1{margin:0;font-size:1.1rem;color:#172d50}.boot-card p:not(.eyebrow){margin:.3rem 0 0;color:#62718a;font-size:.9rem}.boot-mark{display:grid;place-items:center;flex:0 0 auto;width:2.7rem;height:2.7rem;border-radius:.8rem;background:linear-gradient(135deg,#1d4fae,#3c79e3);color:#fff;font-size:.8rem;font-weight:900;letter-spacing:.04em}.boot-spinner{width:1.25rem;height:1.25rem;margin-left:auto;border:3px solid #d9e5fa;border-top-color:#2862ca;border-radius:50%;animation:hubBootSpin .8s linear infinite}@keyframes hubBootSpin{to{transform:rotate(360deg)}}
@media(max-width:540px){.boot-layout{padding:1rem}.boot-card{padding:1.1rem;gap:.8rem}.boot-card h1{font-size:1rem}.boot-card p:not(.eyebrow){font-size:.84rem}}


/* AI 練習多空格填充題：各空分開輸入，避免將多個答案誤當成單一文字。 */
.practice-fill-blanks { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; margin-top: .8rem; }
.practice-fill-blanks label { display: grid; gap: .35rem; font-size: .9rem; font-weight: 700; color: var(--muted); }
.practice-fill-blanks .practice-text-answer { margin-top: 0; }
@media (max-width: 640px) { .practice-fill-blanks { grid-template-columns: 1fr; } }


/* AI 練習學生草稿：保存與正式提交保持並列且有明確提示。 */
.practice-draft-notice { margin: .9rem 0; border-left-color: var(--amber); background: var(--amber-soft); color: #6f4600; }
.practice-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .7rem; margin-top: 1rem; }
@media (max-width: 520px) { .practice-actions .btn { flex: 1 1 10rem; } }

/* AI 練習：教師可按知識點指定題數，總數須與設定題數相符。 */
.knowledge-point-editor .practice-allocation-input { max-width: 180px; }
.knowledge-point-editor .practice-allocation-input input { text-align: center; font-weight: 700; }
#knowledge-allocation.allocation-invalid {
  border: 1px solid #d83a3a;
  border-radius: 10px;
  padding: 10px;
  background: #fff7f7;
}
#knowledge-allocation.allocation-invalid .field-note { color: #a11d1d; font-weight: 650; }
@media (max-width: 640px) {
  .knowledge-point-editor .practice-allocation-input { max-width: none; }
}


/* 課程管理：老師／Admin 的編輯及永久刪除操作。 */
.course-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  margin-top: .75rem;
}
.course-card-actions .btn {
  flex: 1 1 8rem;
}

@media (max-width: 680px) {
  .course-card-actions .btn {
    flex-basis: 100%;
  }
}

/* 提交附件批量下載及快速入分 */
.submission-batch-toolbar { display:flex; flex-wrap:wrap; align-items:center; gap:.7rem 1rem; margin:0 0 1rem; padding:.75rem .9rem; border:1px solid #cddcf7; border-radius:.75rem; background:#f5f8ff; }
.submission-batch-toolbar .checkbox-line { margin:0; }
.submission-batch-toolbar small { color:#52657d; font-weight:700; }
.submission-review-table { min-width:1030px; }
.submission-select-cell { width:3.25rem; text-align:center; }
.submission-select { width:1rem; height:1rem; accent-color:var(--blue); cursor:pointer; }
.submission-row-actions { display:grid; gap:.45rem; min-width:20rem; }
.quick-grade-control { display:flex; align-items:center; flex-wrap:wrap; gap:.45rem; }
.quick-grade-control label { display:flex; align-items:center; gap:.35rem; color:#465b78; font-size:.82rem; font-weight:800; white-space:nowrap; }
.quick-grade-score { width:5.5rem; min-height:2rem; padding:.35rem .45rem; border:1px solid #b9c9e3; border-radius:.45rem; background:#fff; color:#172d50; font:inherit; }
.quick-grade-score:focus { outline:2px solid #8db1f4; outline-offset:1px; border-color:#356ad2; }
@media (max-width:640px) { .submission-batch-toolbar { align-items:stretch; } .submission-batch-toolbar .btn { width:100%; } .submission-row-actions { min-width:17rem; } }

/* 提交與批改：桌面專用寬視窗，窄螢幕維持安全表格捲動 */
.modal.submission-review-modal { width:min(100%,76rem); }
.submission-review-modal .modal-body { padding:1.15rem 1.35rem 1.35rem; }
.submission-review-modal .submission-review-table { min-width:0; table-layout:fixed; }
.submission-review-modal .submission-review-table th:nth-child(1), .submission-review-modal .submission-review-table td:nth-child(1) { width:4.4rem; }
.submission-review-modal .submission-review-table th:nth-child(2), .submission-review-modal .submission-review-table td:nth-child(2) { width:19%; }
.submission-review-modal .submission-review-table th:nth-child(3), .submission-review-modal .submission-review-table td:nth-child(3) { width:11%; white-space:nowrap; }
.submission-review-modal .submission-review-table th:nth-child(4), .submission-review-modal .submission-review-table td:nth-child(4) { width:20%; white-space:nowrap; }
.submission-review-modal .submission-review-table th:nth-child(5), .submission-review-modal .submission-review-table td:nth-child(5) { width:42%; }
.submission-review-modal .submission-row-actions { min-width:0; }
.submission-review-modal .quick-grade-control { justify-content:flex-end; }
.submission-review-modal .submission-row-actions > div:last-child { text-align:right; white-space:nowrap; }
@media (max-width:900px) { .modal.submission-review-modal { width:min(100%,calc(100vw - 1.5rem)); } .submission-review-modal .submission-review-table { min-width:960px; table-layout:auto; } }
@media (max-width:700px) { .modal.submission-review-modal { width:100%; } .submission-review-modal .modal-body { padding:1rem; } }

/* 獨立提交與批改頁：不再依附提交清單彈出視窗 */
.submission-review-page { padding:1.25rem; }
.submission-review-page .submission-review-table { min-width:1030px; }
.submission-detail-toolbar { align-items:center; }
.submission-review-detail { display:grid; gap:1rem; }
.submission-review-detail-head,.submission-version-head { display:flex; align-items:flex-start; justify-content:space-between; gap:1rem; }
.submission-review-detail-head h3,.submission-version-head h3 { margin:0; color:#152b4c; }
.submission-review-detail-head p { margin:.35rem 0 0; }
.submission-version-head small { display:block; margin-top:.25rem; color:#68758a; }
.current-submission-version { border-color:#89aceb; box-shadow:inset 3px 0 0 var(--blue); background:#fbfdff; }
.submission-score-summary { flex:0 0 auto; min-width:8rem; padding:.7rem .85rem; border:1px solid #cddcf7; border-radius:.65rem; background:#f7faff; text-align:right; }
.submission-score-summary span { display:block; color:#68758a; font-size:.77rem; font-weight:800; }
.submission-score-summary strong { display:block; margin-top:.2rem; color:#1f55bf; font-size:1rem; }
@media (max-width:700px) { .submission-review-page { padding:1rem; } .submission-detail-toolbar { align-items:stretch; } .submission-detail-toolbar > div { display:flex; flex-wrap:wrap; gap:.55rem; } .submission-review-detail-head,.submission-version-head { flex-direction:column; } .submission-score-summary { width:100%; text-align:left; } }

/* 雙欄批改工作區：左側學生清單，右側原地查看提交 */
.submission-split-workspace { --submission-pane-height:max(28rem, min(58rem, calc(100vh - 8rem))); display:grid; grid-template-columns:minmax(19rem,27rem) minmax(0,1fr); gap:1rem; align-items:stretch; }
.submission-roster-panel,.submission-inline-panel { min-width:0; height:var(--submission-pane-height); border:1px solid #d8e2f0; border-radius:.85rem; background:#fff; }
.submission-roster-panel { display:flex; flex-direction:column; overflow:hidden; }
.submission-roster-head { padding:1rem 1.05rem; border-bottom:1px solid #d8e2f0; background:linear-gradient(120deg,#f8fbff,#edf4ff); }
.submission-roster-head h3 { margin:0; color:#152b4c; }
.submission-roster-head p { margin:.35rem 0 0; color:#68758a; font-size:.82rem; line-height:1.45; }
.submission-roster-list { display:grid; flex:1 1 auto; gap:.65rem; min-height:0; overflow:auto; padding:.75rem; background:#f8faff; }
.submission-roster-item { display:grid; gap:.55rem; padding:.8rem; border:1px solid #dce5f3; border-radius:.7rem; background:#fff; transition:border-color .15s,box-shadow .15s,background .15s; }
.submission-roster-item.active { border-color:#5e8de1; background:#f6f9ff; box-shadow:0 0 0 2px rgba(36,87,197,.12); }
.submission-roster-item > header,.submission-roster-meta { display:flex; align-items:flex-start; justify-content:space-between; gap:.65rem; }
.submission-roster-student { min-width:0; }
.submission-roster-student strong,.submission-roster-student small { display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.submission-roster-student small,.submission-roster-meta { color:#68758a; font-size:.78rem; }
.submission-roster-meta { align-items:center; flex-wrap:wrap; line-height:1.35; }
.submission-file-select { display:flex; align-items:center; gap:.35rem; color:#315b9d; font-weight:700; white-space:nowrap; }
.submission-file-select input { accent-color:var(--blue); }
.submission-roster-actions { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:.45rem; }
.submission-roster-quick-grade { justify-content:flex-start; gap:.35rem; }
.submission-roster-quick-grade label { font-size:.76rem; }
.submission-roster-quick-grade .quick-grade-score { width:4.75rem; }
.submission-roster-item footer { display:flex; justify-content:flex-end; padding-top:.1rem; }
.submission-roster-reset { color:#536d9f; font-size:.78rem; }
.submission-roster-empty { color:#718096; font-size:.82rem; line-height:1.45; }
.submission-inline-panel { min-height:0; overflow:auto; overscroll-behavior:contain; scrollbar-gutter:stable; padding:1.2rem; }
.submission-inline-head { display:flex; align-items:flex-start; justify-content:space-between; gap:1rem; padding-bottom:1rem; border-bottom:1px solid #dce5f3; }
.submission-inline-head .eyebrow { margin-bottom:.35rem; }
.submission-inline-head h3 { margin:0; color:#152b4c; font-size:1.25rem; }
.submission-inline-head p:not(.eyebrow) { margin:.4rem 0 0; color:#52657d; font-size:.86rem; line-height:1.55; }
.submission-inline-actions { display:flex; justify-content:flex-end; flex-wrap:wrap; gap:.55rem; margin:1rem 0; }
.submission-inline-summary { margin:.15rem 0 1rem; color:#68758a; font-size:.86rem; }
.submission-inline-empty { display:grid; place-content:center; min-height:20rem; padding:2rem; border:1px dashed #c7d5e8; border-radius:.7rem; background:#fbfdff; color:#52657d; text-align:center; }
.submission-inline-empty strong { color:#315b9d; }
.submission-inline-empty p { max-width:28rem; margin:.6rem auto 0; font-size:.88rem; line-height:1.55; }
@media (max-width:1050px) { .submission-split-workspace { grid-template-columns:minmax(17rem,22rem) minmax(0,1fr); } .submission-roster-actions { grid-template-columns:1fr 1fr; } .submission-roster-actions > .quick-grade-control { grid-column:1/-1; } }
@media (max-width:780px) { .submission-split-workspace { --submission-pane-height:auto; grid-template-columns:1fr; } .submission-roster-panel,.submission-inline-panel { height:auto; } .submission-roster-list { flex:0 1 auto; max-height:min(42rem, calc(100vh - 8.5rem)); min-height:min(38rem, calc(100vh - 11rem)); } .submission-inline-panel { min-height:0; overflow:visible; } }
@media (max-width:520px) { .submission-roster-actions { grid-template-columns:1fr; } .submission-roster-actions > .quick-grade-control { grid-column:auto; } .submission-inline-head { flex-direction:column; } .submission-inline-actions .btn { flex:1 1 auto; } }

/* 獨立批量改分頁：只儲存已填寫的分數，保留個別批改的評語與發布設定 */
.batch-grade-page { padding:1.25rem; }
.batch-grade-page-head { display:flex; align-items:flex-start; justify-content:space-between; gap:1rem; margin-bottom:1rem; }
.batch-grade-page-head h3 { margin:0; color:#152b4c; }
.batch-grade-page-head p { margin:.35rem 0 0; color:#52657d; font-size:.88rem; line-height:1.5; }
.batch-grade-filter-note { max-width:32rem; padding:.65rem .8rem; border:1px solid #d8e4f5; border-radius:.6rem; background:#f7faff; text-align:right; }
.batch-grade-table { min-width:560px; }
.batch-grade-table th:last-child,.batch-grade-table td:last-child { width:12rem; }
.batch-grade-table td { vertical-align:middle; }
.batch-grade-class { display:block; margin-top:.2rem; color:#68758a; font-size:.8rem; }
.batch-grade-score { width:100%; max-width:10.5rem; }
.batch-grade-actions { display:flex; align-items:center; justify-content:space-between; gap:1rem; margin-top:1rem; padding-top:1rem; border-top:1px solid #dce5f3; }
.batch-grade-actions .field-note { margin:0; color:#5a6e89; }
@media (max-width:700px) { .batch-grade-page { padding:1rem; } .batch-grade-page-head,.batch-grade-actions { align-items:stretch; flex-direction:column; } .batch-grade-filter-note { max-width:none; text-align:left; } .batch-grade-actions .btn { width:100%; } }

/* 作業成績總覽：固定三欄篩選與獨立操作列，避免長作業名稱擠壓選單 */
.gradebook-filter-card { padding: 1.15rem 1.25rem; }
.gradebook-filter-grid { grid-template-columns: minmax(11rem, .8fr) minmax(16rem, 1.15fr) minmax(16rem, 1.15fr); gap: 1rem; align-items: end; }
.gradebook-filter-grid .field { min-width: 0; }
.gradebook-filter-grid select { width: 100%; min-width: 0; }
.gradebook-filter-actions { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 1rem; padding-top: .95rem; border-top: 1px solid #dce5f3; }
.gradebook-filter-actions > div:first-child { min-width: 0; }
.gradebook-filter-actions .filter-result { display: block; }
.gradebook-export-note { display: block; margin-top: .28rem; color: #66758a; font-size: .8rem; line-height: 1.45; }
.gradebook-filter-buttons { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: .55rem; flex: 0 0 auto; }
.gradebook-filter-buttons .btn { margin: 0; white-space: nowrap; }
@media (max-width: 980px) { .gradebook-filter-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .gradebook-filter-actions { align-items: flex-start; flex-direction: column; } .gradebook-filter-buttons { justify-content: flex-start; } }
@media (max-width: 600px) { .gradebook-filter-card { padding: 1rem; } .gradebook-filter-grid { grid-template-columns: 1fr; } .gradebook-filter-buttons { width: 100%; } .gradebook-filter-buttons .btn { flex: 1 1 auto; text-align: center; } }
