:root{--bg:#f6f4ee;--bg-soft:#edeae1;--card:#fdfcf9;--card-edge:#dcd7c9;--fg:#26251f;--muted:#7b766b;--accent:#9d3b33;--accent-deep:#7e2f28;--ink:#26251f;--danger:#b0492f;--warn:#a87b1f;--ok:#4a7c59;--info:#3d6b99;--shadow-card:0 10px 30px rgba(38,37,31,.08), 0 1px 3px rgba(38,37,31,.05);--font-serif:"Source Han Serif SC", "Noto Serif CJK SC", "Songti SC", "STSong", "SimSun", Georgia, "Times New Roman", serif;--font-sans:-apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--tab-h:58px}*{box-sizing:border-box}html,body{min-height:100dvh;color:var(--fg);font-family:var(--font-sans);-webkit-tap-highlight-color:transparent;background:linear-gradient(#f8f6f0 0%,#f2efe7 100%) fixed;margin:0;padding:0;font-size:16px;line-height:1.6}::selection{background:color-mix(in srgb, var(--accent) 18%, transparent)}h1,h2,h3,h4{font-family:var(--font-serif)}button{font:inherit}input,textarea{font:inherit;color:var(--fg);background:var(--card);border:1px solid var(--card-edge);border-radius:8px;width:100%;padding:10px 12px}input:focus,textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);outline:none}textarea{resize:vertical}:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 60%, transparent);outline-offset:1px}.muted{color:var(--muted)}.error{color:var(--danger)}.center-block{text-align:center;padding:32px 0}.app-shell{min-height:100dvh}.app-header{z-index:10;background:color-mix(in srgb, var(--bg) 88%, transparent);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--card-edge);padding:calc(env(safe-area-inset-top) + 12px) 16px 12px;text-align:center;position:sticky;top:0}.app-header .logo{font-family:var(--font-serif);letter-spacing:.04em;font-weight:700}.app-main{max-width:720px;padding:20px 16px calc(var(--tab-h) + env(safe-area-inset-bottom) + 24px);margin:0 auto}.app-main.immersive{max-width:none;padding:0}.tab-bar{z-index:20;background:color-mix(in srgb, var(--card) 90%, transparent);-webkit-backdrop-filter:blur(14px);border-top:1px solid var(--card-edge);padding-bottom:env(safe-area-inset-bottom);display:flex;position:fixed;bottom:0;left:0;right:0}.tab{min-height:var(--tab-h);color:var(--muted);letter-spacing:.1em;text-indent:.1em;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:2px;font-size:.7rem;text-decoration:none;transition:color .15s;display:flex;position:relative}.tab svg{width:21px;height:21px}.tab.active{color:var(--fg);font-weight:600}.tab.active svg{color:var(--accent)}.tab.active:before{content:"";border-top:2px solid var(--accent);width:32px;position:absolute;top:0;left:50%;transform:translate(-50%)}.btn{border:1px solid var(--card-edge);background:var(--card);color:var(--fg);cursor:pointer;border-radius:10px;justify-content:center;align-items:center;gap:6px;padding:10px 18px;transition:border-color .15s,background .15s,transform 50ms;display:inline-flex}@media (hover:hover){.btn:hover{border-color:var(--muted)}}.btn:active{transform:scale(.97)}.btn:disabled{opacity:.5;cursor:default}.btn.primary{background:var(--ink);border-color:var(--ink);color:var(--bg)}@media (hover:hover){.btn.primary:hover{background:#3a382f;border-color:#3a382f}}.btn.ghost{color:var(--muted);background:0 0;border-color:transparent}.unlock-page{justify-content:center;align-items:center;min-height:70dvh;display:flex}.unlock-card{background:var(--card);border:1px solid var(--card-edge);text-align:center;width:100%;max-width:360px;box-shadow:var(--shadow-card);border-radius:16px;flex-direction:column;gap:14px;padding:32px 24px;display:flex}.unlock-card h1{letter-spacing:.03em;margin:0;font-size:1.35rem}.unlock-card h1:after{content:"";border-bottom:2px solid var(--accent);width:36px;margin:12px auto 2px;display:block}.unlock-card p{margin:0}.study-page{max-width:560px;height:100dvh;padding:calc(env(safe-area-inset-top) + 12px) 14px calc(var(--tab-h) + env(safe-area-inset-bottom) + 12px);flex-direction:column;margin:0 auto;display:flex}.study-hud{flex:none}.hud-progress{background:rgba(38,37,31,.08);border-radius:2px;height:4px;overflow:hidden}.hud-fill{background:linear-gradient(90deg, var(--accent), #c99a3c);border-radius:2px;height:100%;transition:width .35s cubic-bezier(.2,.8,.3,1)}.hud-row{flex-wrap:wrap;align-items:center;gap:10px;min-height:28px;margin-top:9px;display:flex}.hud-remaining{color:var(--muted);font-size:.85rem}.hud-error{margin:4px 0 0;font-size:.85rem}.hud-edit{margin-left:auto;padding:4px 10px;font-size:.85rem}.combo{color:var(--accent-deep);align-items:center;gap:4px;font-size:.9rem;font-weight:700;animation:.3s cubic-bezier(.2,.8,.3,1) combo-pop;display:inline-flex}.combo.combo-alt{animation-name:combo-pop-alt}@keyframes combo-pop{0%{transform:scale(1.55)}to{transform:scale(1)}}@keyframes combo-pop-alt{0%{transform:scale(1.55)}to{transform:scale(1)}}.outcome{color:var(--muted);font-size:.72rem}.deck{flex:1;min-height:48dvh;margin:12px 0 14px;position:relative}.stack-card{background:var(--card);border:1px solid var(--card-edge);pointer-events:none;border-radius:16px;position:absolute;left:10px;right:10px;box-shadow:0 1px 3px rgba(38,37,31,.05)}.stack-1{opacity:.55;top:10px;bottom:-12px;transform:scale(.962)}.stack-2{opacity:.28;top:20px;bottom:-24px;transform:scale(.925)}.card-stage{z-index:2;position:absolute;inset:0}.card-face{overscroll-behavior:contain;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:pan-y;background:var(--card);border:1px solid var(--card-edge);width:100%;height:100%;box-shadow:var(--shadow-card);font-family:var(--font-serif);will-change:transform;border-radius:16px;padding:24px 20px 12px;font-size:1.12rem;transition:transform 80ms linear;position:relative;overflow-y:auto}.card-face img{-webkit-user-drag:none}.answer-wrap{grid-template-rows:0fr;transition:grid-template-rows .55s cubic-bezier(.25,.8,.3,1);display:grid}.card-face.revealed .answer-wrap{grid-template-rows:1fr}.answer-clip{min-height:0;overflow:hidden}.answer-body{opacity:0;filter:blur(8px);transition:opacity .55s,transform .55s cubic-bezier(.25,.8,.3,1),filter .55s;transform:translateY(28px)}.card-face.revealed .answer-body{opacity:1;filter:none;transform:none}.answer-label{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--card-edge));font-family:var(--font-sans);letter-spacing:.2em;text-indent:.2em;color:var(--accent-deep);opacity:.85;border-radius:999px;margin:16px 0 6px;padding:2px 12px;font-size:.68rem;display:inline-block}.answer-content{border-top:1px dashed var(--card-edge);margin-top:8px;padding:6px 0 18px}.card-face:after{content:"点按显示答案";text-align:right;font-family:var(--font-sans);letter-spacing:.2em;color:var(--muted);opacity:.75;pointer-events:none;font-size:.68rem;display:block;position:sticky;bottom:0}.card-face.revealed:after{content:"答案"}.drag-hint{z-index:3;color:#fdfcf9;letter-spacing:.15em;text-indent:.15em;opacity:0;pointer-events:none;border-radius:999px;padding:6px 16px;font-size:.95rem;font-weight:700;position:absolute;top:20px;box-shadow:0 4px 14px rgba(38,37,31,.2)}.hint-bad{background:var(--danger);left:18px;transform:rotate(-9deg)}.hint-good{background:var(--ok);right:18px;transform:rotate(9deg)}.card-stage.exiting-left .card-face{opacity:0;transition:transform .26s ease-in,opacity .26s ease-in;transform:translate(-125%)rotate(-22deg)}.card-stage.exiting-right .card-face{opacity:0;transition:transform .26s ease-in,opacity .26s ease-in;transform:translate(125%)rotate(22deg)}.card-stage.exiting-up .card-face{opacity:0;transition:transform .26s ease-in,opacity .26s ease-in;transform:translateY(-110%)scale(.95)}.card-stage.entering .card-face{animation:.34s cubic-bezier(.2,.85,.3,1) card-in}@keyframes card-in{0%{opacity:0;transform:translateY(48px)scale(.965)}to{opacity:1;transform:none}}.grade-bar{flex:none;grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.grade{color:#fdfcf9;letter-spacing:.08em;text-indent:.08em;cursor:pointer;border:none;border-radius:14px;flex-direction:column;align-items:center;gap:2px;padding:12px 0 10px;font-weight:700;transition:transform .12s,filter .15s;display:flex;box-shadow:0 4px 12px rgba(38,37,31,.12)}.grade .g-icon{font-size:1.15rem;line-height:1}.grade .g-label{font-size:.82rem}@media (hover:hover){.grade:hover{filter:brightness(1.06)}}.grade:active{transform:scale(.93)}.grade:disabled{opacity:.5;cursor:default}.grade.g1{background:linear-gradient(160deg, var(--danger), color-mix(in srgb, var(--danger) 78%, #000))}.grade.g3{background:linear-gradient(160deg, var(--warn), color-mix(in srgb, var(--warn) 78%, #000))}.grade.g4{background:linear-gradient(160deg, var(--ok), color-mix(in srgb, var(--ok) 78%, #000))}.grade.g5{background:linear-gradient(160deg, var(--info), color-mix(in srgb, var(--info) 78%, #000))}.gesture-hint{text-align:center;color:var(--muted);flex:none;margin:10px 0 0;font-size:.72rem}.done{text-align:center;flex-direction:column;justify-content:center;align-items:center;animation:.4s cubic-bezier(.2,.85,.3,1) card-in;display:flex;position:absolute;inset:0}.done-emoji{font-size:3.4rem;line-height:1.2}.done h2{margin:8px 0 4px}.done-stats{gap:26px;margin:16px 0 4px;display:flex}.stat b{font-size:1.55rem;font-family:var(--font-serif);color:var(--accent-deep);display:block}.stat span{color:var(--muted);font-size:.74rem}.done .btn{margin-top:18px}.confetti-layer{z-index:60;pointer-events:none;position:fixed;inset:0}.confetti{opacity:0;border-radius:2px;width:10px;height:15px;animation:.95s cubic-bezier(.15,.6,.4,1) forwards confetti-burst;position:absolute;top:38%;left:50%}@keyframes confetti-burst{0%{opacity:1;transform:translate(0)rotate(0)}70%{opacity:1}to{transform:translate(var(--dx), var(--dy)) rotate(var(--rot));opacity:0}}.modal-overlay{z-index:40;background:rgba(38,37,31,.45);justify-content:center;display:flex;position:fixed;inset:0}.modal-sheet{background:var(--bg);width:100%;max-width:720px;height:100%;padding:calc(env(safe-area-inset-top) + 14px) 16px calc(env(safe-area-inset-bottom) + 20px);flex-direction:column;gap:14px;display:flex;overflow-y:auto}.modal-head{justify-content:space-between;align-items:center;display:flex}.modal-head h2{margin:0;font-size:1.1rem}.field{flex-direction:column;gap:6px;display:flex}.field span{color:var(--muted);font-size:.85rem}.field textarea{font-family:var(--font-mono);font-size:.92rem}.modal-actions{justify-content:flex-end;gap:10px;display:flex}.preview h3{color:var(--muted);margin:4px 0 10px;font-size:.95rem}.preview-block{background:var(--card);border:1px solid var(--card-edge);border-radius:10px;padding:12px 14px}.preview hr{border:none;border-top:1px dashed var(--card-edge);margin:12px 0}.search-form,.ask-form{align-items:stretch;gap:10px;display:flex}.search-form{margin-bottom:16px}.search-form input{flex:1}.ask-form{flex-direction:column}.ask-form .btn{align-self:flex-end}.page-hint{text-align:center;margin:20px 0 0;font-size:.85rem}.page-hint a{color:var(--muted);text-underline-offset:3px}.page-hint a:hover{color:var(--accent)}.hit{background:var(--card);border:1px solid var(--card-edge);border-radius:10px;margin-bottom:10px;overflow:hidden}.hit summary{cursor:pointer;align-items:flex-start;gap:10px;padding:11px 14px;list-style:none;display:flex}.hit summary::-webkit-details-marker{display:none}.hit summary:after{content:"▾";color:var(--muted);flex:none;margin-top:4px;transition:transform .15s}.hit[open] summary:after{transform:rotate(180deg)}.hit[open] summary{border-bottom:1px dashed var(--card-edge)}.hit-rank{background:var(--bg-soft);min-width:26px;height:26px;color:var(--muted);border-radius:8px;flex:none;justify-content:center;align-items:center;margin-top:1px;padding:0 4px;font-size:.78rem;font-weight:600;display:inline-flex}.hit:first-child .hit-rank{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--accent-deep)}.hit-titles{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.hit-heading{font-weight:600;font-family:var(--font-serif);overflow-wrap:anywhere;font-size:.95rem;line-height:1.4}.hit-meta{color:var(--muted);overflow-wrap:anywhere;font-size:.78rem}.hit-excerpt{color:var(--fg);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-top:2px;font-size:.85rem;line-height:1.7;display:-webkit-box;overflow:hidden}.hit[open] .hit-excerpt{display:none}.hit-content{padding:10px 14px 12px;font-size:.92rem}mark{background:color-mix(in srgb, var(--warn) 28%, transparent);color:inherit;border-radius:3px;padding:0 2px}.ask-page{flex-direction:column;display:flex}.ask-intro{margin:0 0 14px;font-size:.88rem}.ask-panel{border-top:none;margin-top:0;padding-top:0}.ask-panel h2{margin:0 0 12px;font-size:1.15rem}.stream-text{white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono);background:var(--bg-soft);border:1px solid var(--card-edge);border-radius:10px;margin:14px 0 0;padding:12px 14px;font-size:.9rem}.ask-answer{background:var(--card);border:1px solid var(--card-edge);border-left:2px solid var(--accent);border-radius:10px;margin-top:14px;padding:4px 14px}.markdown-body{font-family:var(--font-serif);line-height:1.8}.markdown-body p{margin:.5em 0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4{margin:.8em 0 .4em;line-height:1.35}.markdown-body ul,.markdown-body ol{margin:.5em 0;padding-left:1.4em}.markdown-body hr{border:none;border-top:1px solid var(--card-edge);margin:1em 0}.markdown-body img{border-radius:8px;max-width:100%;height:auto}.markdown-body code{font-size:.9em;font-family:var(--font-mono);background:rgba(38,37,31,.07);border-radius:4px;padding:.1em .35em}.markdown-body pre{background:var(--bg-soft);border:1px solid var(--card-edge);border-radius:10px;padding:12px 14px;overflow-x:auto}.markdown-body pre code{background:0 0;padding:0}.markdown-body blockquote{border-left:2px solid var(--accent);color:var(--muted);margin:.6em 0;padding:2px 14px}.markdown-body table{border-collapse:collapse;width:100%;margin:.6em 0;display:block;overflow-x:auto}.markdown-body th,.markdown-body td{border:1px solid var(--card-edge);padding:6px 10px}.markdown-body thead th{background:var(--bg-soft)}.markdown-body a{color:var(--accent);text-underline-offset:3px;text-decoration:underline}.markdown-body .katex-display{padding:4px 0;overflow:auto hidden}.badge.ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 45%, transparent)}.badge.pending{color:var(--muted);border-style:dashed}.admin-stats{flex-wrap:wrap;gap:8px;margin-bottom:14px;display:flex}.admin-badges{gap:6px;margin-top:4px;display:flex}.admin-raw{margin-top:10px}.admin-raw summary{cursor:pointer;color:var(--muted);font-size:.82rem}.admin-raw pre{background:var(--bg-soft);border:1px solid var(--card-edge);white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono);border-radius:10px;padding:12px 14px;font-size:.82rem;overflow-x:auto}.admin-cards{border-left:2px solid var(--card-edge);margin-top:12px;padding-left:12px}.admin-card{border-bottom:1px dashed var(--card-edge);padding:10px 0}.admin-card:last-child{border-bottom:none}.admin-card hr{border:none;border-top:1px dashed var(--card-edge);margin:6px 0}.admin-card-meta{align-items:center;gap:6px;margin:6px 0 0;display:flex}.pager{justify-content:center;align-items:center;gap:12px;margin-top:16px;display:flex}@media (width>=720px){.study-page{padding-top:24px}.deck{margin:20px 0 18px}.card-face{padding:30px 32px 12px;font-size:1.2rem}}.badge{border:1px solid var(--card-edge);color:var(--muted);white-space:nowrap;border-radius:999px;align-items:center;padding:1px 8px;font-size:.75rem;display:inline-flex}.badge.due{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 45%, transparent)}.page-title{text-align:center;letter-spacing:.04em;margin:0 0 14px;font-size:1.2rem}.progress-page{flex-direction:column;display:flex}.prog-overview{background:var(--card);border:1px solid var(--card-edge);box-shadow:var(--shadow-card);border-radius:12px;margin-bottom:14px;padding:18px 16px 14px}.prog-overview-head{align-items:baseline;gap:10px;margin-bottom:10px;display:flex}.prog-overview-pct{font-family:var(--font-serif);color:var(--accent-deep);font-size:2rem;font-weight:700;line-height:1}.prog-stats{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.prog-track{background:rgba(38,37,31,.08);border-radius:4px;height:8px;display:flex;overflow:hidden}.prog-fill{height:100%;transition:width .35s cubic-bezier(.2,.8,.3,1)}.prog-fill.mastered{background:var(--ok)}.prog-fill.learning{background:color-mix(in srgb, var(--accent) 65%, transparent)}.prog-doc{background:var(--card);border:1px solid var(--card-edge);border-radius:10px;margin-bottom:10px;overflow:hidden}.prog-doc>summary{cursor:pointer;flex-direction:column;gap:6px;padding:12px 14px;list-style:none;display:flex}.prog-doc>summary::-webkit-details-marker{display:none}.prog-doc>summary:after{content:none}.prog-doc-head{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.prog-doc-name{font-weight:600;font-family:var(--font-serif);overflow-wrap:anywhere;font-size:.98rem}.prog-doc-pct{color:var(--accent-deep);flex:none;font-weight:700}.prog-doc[open]>summary{border-bottom:1px dashed var(--card-edge)}.prog-chapters{flex-direction:column;gap:12px;padding:6px 14px 12px;display:flex}.prog-chapter{flex-direction:column;gap:5px;display:flex}.prog-chapter-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.prog-chapter-name{overflow-wrap:anywhere;font-size:.9rem}.mode-tabs{background:var(--bg-soft);border-radius:12px;gap:8px;margin-bottom:16px;padding:4px;display:flex}.mode-tab{color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:9px;flex:1;padding:9px 4px;font-size:.92rem}.mode-tab.active{background:var(--card);color:var(--fg);box-shadow:var(--shadow-card);font-weight:600}.upload-box{border:1.5px dashed var(--card-edge);background:var(--card);cursor:pointer;color:var(--muted);border-radius:14px;flex-direction:column;align-items:center;gap:10px;padding:26px 14px;transition:border-color .15s;display:flex}.upload-box:hover{border-color:var(--accent)}.upload-box input{display:none}.photo-preview{border:1px solid var(--card-edge);max-width:100%;max-height:320px;box-shadow:var(--shadow-card);border-radius:12px;margin:12px auto 0;display:block}.btn.wide{width:100%;margin-top:12px}.cloze-editor{flex-direction:column;gap:10px;margin-top:14px;display:flex}.cloze-actions{flex-wrap:wrap;gap:10px;display:flex}.subtabs{gap:8px;display:flex}.subtab{border:1px solid var(--card-edge);background:var(--card);color:var(--muted);cursor:pointer;border-radius:999px;padding:6px 14px;font-size:.88rem}.subtab.active{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}.cloze-picker{background:var(--card);border:1px solid var(--card-edge);border-radius:12px;padding:10px 12px}.cloze-chars{white-space:pre-wrap;word-break:break-all;font-size:1.08rem;line-height:2.1;font-family:var(--font-serif)}.cp-char{cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border-radius:4px;padding:1px 0}.cp-char:hover{background:color-mix(in srgb, var(--accent) 12%, transparent)}.cp-char.clozed{background:color-mix(in srgb, var(--accent) 18%, transparent);color:var(--accent-deep);box-shadow:0 2px 0 0 var(--accent-deep);font-weight:600}.btn.mic{border-color:var(--info);color:var(--info)}.btn.mic.listening{background:var(--info);border-color:var(--info);color:#fff;animation:1.2s ease-in-out infinite mic-pulse}@keyframes mic-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb, var(--info) 40%, transparent)}50%{box-shadow:0 0 0 7px color-mix(in srgb, var(--info) 12%, transparent)}}.interim{background:color-mix(in srgb, var(--info) 10%, transparent);color:var(--info);border-radius:8px;min-height:1.2em;margin:4px 0;padding:8px 12px;font-size:.92rem}.muted.small{font-size:.85rem}.draft-list{flex-direction:column;gap:12px;margin-top:16px;display:flex}.draft-card{background:var(--card);border:1px solid var(--card-edge);border-radius:12px;flex-direction:column;gap:10px;padding:12px 14px;display:flex}.draft-head{font-family:var(--font-serif);justify-content:space-between;align-items:center;font-weight:600;display:flex}.cloze-gap{border-bottom:2px solid var(--ink);vertical-align:baseline;min-width:2em;height:1em;margin:0 2px;display:inline-block}.cloze-term{background:color-mix(in srgb, var(--accent) 16%, transparent);color:var(--accent-deep);border-radius:4px;padding:0 4px;font-weight:600}.recent{margin-top:28px}.recent h3{color:var(--muted);border-bottom:1px dashed var(--card-edge);padding-bottom:6px;font-size:.95rem}.recent-list{flex-direction:column;display:flex}.recent-item{border-bottom:1px solid var(--bg-soft);align-items:flex-start;gap:10px;padding:10px 2px;display:flex}.recent-item .badge{color:var(--accent);border:1px solid color-mix(in srgb, var(--accent) 40%, transparent);border-radius:999px;flex-shrink:0;margin-top:2px;padding:1px 8px;font-size:.72rem}.recent-q{flex:1;font-size:.92rem}.recent-q p{margin:0}.btn.del,.btn.edit{flex-shrink:0;padding:4px 8px}.toast{background:color-mix(in srgb, var(--ok) 14%, transparent);color:var(--ok);border-radius:8px;margin:4px 0;padding:9px 12px;font-size:.92rem}