@import "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Noto+Sans+SC:wght@400;500;700&family=Source+Sans+3:wght@400;600;700&display=swap";:root{font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0}:root{--ink:#1a2430;--ink-soft:#3d4a5c;--paper:#f3ebe0;--paper-deep:#e7dccb;--accent:#b84a1f;--accent-deep:#8e3414;--teal:#2a6a64;--line:#1a243024;--pass:#2a6a64;--fail:#b84a1f;--font-display:"Fraunces", Georgia, serif;--font-body:"Source Sans 3", system-ui, sans-serif;--font-zh:"Noto Sans SC", "Source Sans 3", sans-serif}*{box-sizing:border-box}html,body,#root{min-height:100%}body{color:var(--ink);font-family:var(--font-body);background-color:#0000;background-image:radial-gradient(1200px 600px at 10% -10%,#b84a1f1f,#0000 55%),radial-gradient(900px 500px at 100% 0,#2a6a6424,#0000 50%),linear-gradient(#f7f1e8 0%,#ebe2d4 100%);background-position:0 0,0 0,0 0;background-repeat:repeat,repeat,repeat;background-size:auto,auto,auto;background-attachment:fixed;background-origin:padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box;margin:0}a{color:inherit;text-decoration:none}h1,h2,h3{font-family:var(--font-display);letter-spacing:-.02em;font-weight:700}.page{width:min(1080px,100% - 2rem);margin:0 auto;padding:2rem 0 4rem}.hero{flex-direction:column;justify-content:flex-end;min-height:72vh;padding:3rem 0 2.5rem;display:flex;position:relative}.home-hero{justify-content:flex-start;min-height:auto;padding:2.25rem 0 1.75rem}.home-hero .brand,.home-hero h1,.home-hero .lede,.home-hero .cta-row,.home-hero .hero-hint{animation:.7s both brand-rise}.home-hero h1{animation-delay:80ms}.home-hero .lede{animation-delay:.14s}.home-hero .cta-row{animation-delay:.22s}.home-hero .hero-hint{margin:1rem 0 0;animation-delay:.3s}@keyframes brand-rise{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.atmosphere{pointer-events:none;z-index:-1;background-image:url("data:image/svg+xml,%3Csvg width='60' height='60' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 60L60 0M30 60L60 30M0 30L30 0' stroke='%231a2430' stroke-opacity='0.03'/%3E%3C/svg%3E");position:fixed;inset:0}.brand{font-family:var(--font-display);color:var(--ink);margin:0 0 1rem;font-size:clamp(3.2rem,9vw,6.5rem);line-height:.92}.hero h1{color:var(--ink-soft);margin:0;font-size:clamp(1.4rem,3vw,2rem);font-weight:500}.lede{max-width:36rem;color:var(--ink-soft);font-size:1.125rem;line-height:1.55}.cta-row{flex-wrap:wrap;gap:.75rem;margin-top:1.5rem;display:flex}.btn{font:inherit;cursor:pointer;border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;padding:.75rem 1.35rem;font-weight:600;transition:transform .15s,background .15s;display:inline-flex}.btn:hover{transform:translateY(-1px)}.btn-primary{background:var(--accent);color:#fff7f0}.btn-primary:hover{background:var(--accent-deep)}.btn-ghost{border-color:var(--line);color:var(--ink);background:0 0}.btn-audio{background:var(--teal);color:#f4fffc;border-radius:8px;padding:.45rem .9rem;font-size:.9rem}.readiness-panel,.history,.papers-page header,.results-page header{margin-top:1rem}.home-page .readiness-panel,.insights-page .readiness-panel{border-top:1px solid var(--line);margin-top:.5rem;padding-top:1.75rem}.home-page .history,.insights-page .history{border-top:1px solid var(--line);margin-top:2.5rem;padding-top:1.75rem}.section-head{justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.85rem;display:flex}.section-head h2{margin:0;font-size:1.45rem}.readiness-grid{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);align-items:center;gap:1.5rem 2rem;margin:.5rem 0 1rem;display:grid}.readiness-meters{grid-template-columns:repeat(auto-fit,minmax(7.5rem,1fr));gap:1rem;margin:0;display:grid}.checklist-title{margin:1.25rem 0 0;font-size:1.05rem;font-weight:600}.meter-label{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);font-size:.75rem;display:block}.meter-value{font-family:var(--font-display);font-size:2rem;line-height:1.1}.meter-unit{color:var(--ink-soft);margin-top:.15rem;font-size:.85rem;display:block}.guidance{max-width:40rem;margin:.5rem 0 1rem;font-size:1.05rem;line-height:1.5}.empty-readiness .guidance{margin-top:0}.pass-note,.muted,.tip{color:var(--ink-soft);font-size:.95rem}.dial-note{max-width:22rem;margin:.35rem 0 0}.ready-badge{color:var(--teal);background:#2a6a641f;border-radius:6px;padding:.3rem .75rem;font-size:.85rem;font-weight:700;display:inline-block}.history-empty{margin:0}.history-count{font-size:.9rem}.history-list{margin:.75rem 0 0;padding:0;list-style:none}.history-list li a{border-bottom:1px solid var(--line);grid-template-columns:1fr auto auto;align-items:baseline;gap:1rem;padding:.7rem 0;transition:color .15s;display:grid}.history-list li a:hover .hist-paper{color:var(--accent)}.hist-paper{font-family:var(--font-display);font-weight:600}.hist-score.pass{color:var(--teal);font-weight:700}.hist-score.fail{color:var(--accent);font-weight:700}.history-list time{color:var(--ink-soft);font-size:.9rem}.sparkline{align-items:flex-end;gap:.4rem;height:100px;margin:.25rem 0 .5rem;padding:.35rem 0 0;display:flex;position:relative}.sparkline .bar{border-radius:3px 3px 0 0;flex:1;min-width:8px;transition:height .35s}.sparkline .bar-fail{background:linear-gradient(180deg, var(--accent), #b84a1f59)}.sparkline .bar-pass{background:linear-gradient(180deg, var(--teal), #2a6a6459)}.sparkline .pass-line{border-top:1.5px dashed var(--teal);opacity:.55;position:absolute;left:0;right:0}.paper-list{padding:0;list-style:none}.paper-list a{border-bottom:1px solid var(--line);align-items:baseline;gap:1rem;padding:1.1rem 0;display:flex}.paper-list .num{font-family:var(--font-display);color:var(--accent);font-size:1.75rem}.paper-list strong{display:block}.paper-list span{color:var(--ink-soft)}.back{color:var(--ink-soft);font-size:.95rem}.exam-layout{width:min(1200px,100% - 1.5rem);margin:0 auto;padding:1rem 0 3rem}.exam-topbar{justify-content:space-between;align-items:flex-end;gap:1rem;margin-bottom:1.25rem;display:flex}.exam-topbar h1{margin:.2rem 0 0;font-size:1.4rem}.eyebrow{text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);margin:0;font-size:.75rem}.timer{font-variant-numeric:tabular-nums;flex-direction:column;align-items:flex-end;display:flex}.timer strong{font-family:var(--font-display);font-size:1.8rem}.exam-body{grid-template-columns:minmax(0,1fr) 180px;align-items:start;gap:1.25rem;display:grid}.exam-section h2{font-size:1.35rem}.part-block{border-top:1px solid var(--line);margin:1.5rem 0 2rem;padding-top:.5rem}.question{margin:1.25rem 0;padding:1rem 0}.question header{flex-direction:column;gap:.5rem;margin-bottom:.75rem;display:flex}.q-id{color:var(--teal);font-size:.8rem;font-weight:700}.pinyin-block{font-family:var(--font-zh);flex-direction:column;line-height:1.2;display:inline-flex}.pinyin-line{color:var(--ink-soft);font-size:.78rem;font-family:var(--font-body)}.hanzi-line{font-size:1.25rem}.pinyin-ruby{font-family:var(--font-zh);flex-wrap:wrap;align-items:flex-end;gap:3px 2px;display:inline-flex}.ruby-unit{flex-direction:column;align-items:center;line-height:1;display:inline-flex}.ruby-py{color:var(--ink-soft);font-size:9px;font-family:var(--font-body);-webkit-user-select:none;user-select:none}.ruby-hz{font-size:1.2rem;line-height:1.15}.pinyin-ruby.size-sm .ruby-hz,.pinyin-plain.size-sm{font-size:1rem}.pinyin-ruby.size-lg .ruby-hz,.pinyin-plain.size-lg,.pinyin-block.size-lg .hanzi-line{font-size:1.45rem}.option-visual{min-height:88px;color:var(--ink);justify-content:center;align-items:center;display:flex}.option-visual.icons{flex-wrap:wrap;gap:.5rem;padding:.5rem}.icon-group{gap:2px;display:inline-flex}.exam-icon{width:2rem;height:2rem}.option-visual.clock{flex-direction:column;gap:.25rem}.clock-face{width:3rem;height:3rem}.clock-label{color:var(--ink-soft);font-size:.8rem}.option-visual-img{aspect-ratio:4/3;object-fit:cover;background:var(--paper);border-radius:8px;width:100%;display:block}.pic-option .option-visual-img{border-radius:8px}.prob-dial{align-items:center;gap:1.25rem;margin:0;display:flex}.dial-svg{flex-shrink:0;width:7rem;height:7rem}.dial-pct{fill:var(--ink);font-family:var(--font-display);font-size:22px;font-weight:700}.dial-label{fill:var(--ink-soft);font-size:8px}.dial-status{font-family:var(--font-display);font-size:1.25rem}.checklist{margin:1rem 0;padding:0;list-style:none}.checklist li{border-bottom:1px solid var(--line);gap:.75rem;padding:.55rem 0;display:flex}.checklist .check{color:var(--ink-soft);width:1.25rem;font-weight:700}.checklist li.done .check{color:var(--teal)}.checklist strong{display:block}.checklist .muted{font-size:.85rem;display:block}.part-nav{justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:1rem;display:flex}.topbar-right{align-items:center;gap:1rem;display:flex}.pinyin-toggle{color:var(--ink-soft);align-items:center;gap:.35rem;font-size:.9rem;display:flex}.intro-card{max-width:36rem;margin-top:2rem;line-height:1.55}.intro-card ul{color:var(--ink-soft);padding-left:1.2rem}.confirm-overlay{z-index:50;background:#1a243073;place-items:center;padding:1rem;display:grid;position:fixed;inset:0}.confirm-box{width:100%;max-width:24rem;box-shadow:var(--shadow);background:#fffaf3;border-radius:16px;padding:1.5rem}.confirm-box h3{margin-top:0}.coach-list{padding-left:1.2rem;line-height:1.5}.question-line{margin-top:.35rem}.picture-grid{gap:.65rem;display:grid}.picture-grid.pics-3,.picture-grid.pics-6{grid-template-columns:repeat(3,minmax(0,1fr))}.pic-option{border:2px solid var(--line);cursor:pointer;background:#ffffff8c;border-radius:12px;padding:.4rem;position:relative;overflow:hidden}.pic-option.selected{border-color:var(--accent);box-shadow:0 0 0 2px #b84a1f33}.pic-option img{aspect-ratio:4/3;object-fit:cover;background:var(--paper);border-radius:8px;width:100%;display:block}.pic-label{color:#fff;z-index:1;background:#1a2430d9;border-radius:6px;padding:.15rem .45rem;font-size:.8rem;font-weight:700;position:absolute;top:.55rem;left:.55rem}.text-options{flex-direction:column;gap:.5rem;display:flex}.text-option,.bank-item{text-align:left;border:1px solid var(--line);font:inherit;cursor:pointer;background:#ffffff73;border-radius:10px;align-items:flex-start;gap:.65rem;padding:.7rem .9rem;display:flex}.text-option.selected{border-color:var(--accent);background:#b84a1f14}.letter-options{flex-wrap:wrap;gap:.4rem;display:flex}.letter-btn{border:1px solid var(--line);cursor:pointer;background:#ffffff8c;border-radius:8px;width:2.4rem;height:2.4rem;font-weight:700}.letter-btn.selected{background:var(--accent);color:#fff;border-color:var(--accent)}.match-bank{gap:.4rem;margin-bottom:1rem;display:grid}.bank-label{color:var(--ink-soft);margin:0 0 .25rem;font-size:.85rem}.audio-player{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.audio-el-hidden{opacity:0;pointer-events:none;width:0;height:0;position:absolute}.audio-status{color:var(--ink-soft);font-size:.85rem}.audio-transcript{width:100%;color:var(--ink-soft);font-size:.9rem}.answer-sheet{border:1px solid var(--line);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffcf6d9;border-radius:14px;padding:.75rem;position:sticky;top:1rem}.answer-sheet h3{margin:0 0 .5rem;font-size:1rem}.sheet-grid{grid-template-columns:repeat(4,1fr);gap:.3rem;display:grid}.sheet-cell{aspect-ratio:1;border:1px solid var(--line);cursor:pointer;background:0 0;border-radius:6px;font-size:.7rem}.sheet-cell.filled{background:#2a6a6433}.sheet-cell.current{outline:2px solid var(--accent)}.sheet-meta{color:var(--ink-soft);margin:.5rem 0 0;font-size:.8rem}.results-page .score-grid{grid-template-columns:repeat(3,1fr);gap:1rem;margin:1.25rem 0;display:grid}.score-grid span{color:var(--ink-soft);font-size:.85rem;display:block}.score-grid strong{font-family:var(--font-display);font-size:1.5rem}.pass-flag{letter-spacing:.04em;font-weight:700}.pass-flag.pass{color:var(--pass)}.pass-flag.fail{color:var(--fail)}.part-scores,.wrong-list{padding:0;list-style:none}.part-scores li,.wrong-list li{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:.75rem;padding:.65rem 0;display:flex}.explain{width:100%;color:var(--ink-soft);margin:.25rem 0 0;font-size:.95rem}@media (width<=860px){.exam-body{grid-template-columns:1fr}.answer-sheet{order:-1;position:static}.readiness-grid{grid-template-columns:1fr;gap:1.25rem}.readiness-meters,.results-page .score-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.picture-grid.pics-3,.picture-grid.pics-6{grid-template-columns:repeat(2,minmax(0,1fr))}.brand{font-size:clamp(2.6rem,14vw,4rem)}.hero:not(.home-hero){min-height:60vh}.history-list li a{grid-template-columns:1fr auto;gap:.35rem 1rem}.history-list time{grid-column:1/-1}}@media (width<=520px){.readiness-meters{grid-template-columns:1fr;gap:.85rem}.prob-dial{flex-direction:column;align-items:flex-start}}.account-bar{justify-content:flex-end;align-items:center;gap:.75rem;padding:.25rem 0 0;display:flex}.btn-sm{padding:.35rem .75rem;font-size:.9rem}.auth-page{flex-direction:column;justify-content:flex-end;min-height:88vh;padding:3rem 0 3.5rem;display:flex;position:relative}.auth-hero{z-index:1;width:min(28rem,100%);animation:.7s both brand-rise;position:relative}.auth-hero .brand{margin:0 0 1rem;font-size:clamp(2.75rem,10vw,4.5rem);line-height:.92}.auth-hero h1{color:var(--ink-soft);margin:0;font-size:clamp(1.4rem,3vw,2rem);font-weight:500;animation:.7s 80ms both brand-rise}.auth-hero .lede,.auth-hero>.muted{max-width:28rem;color:var(--ink-soft);margin:.85rem 0 0;font-size:1.125rem;line-height:1.55;animation:.7s .14s both brand-rise}.auth-form{flex-direction:column;gap:1rem;margin-top:1.75rem;animation:.7s .22s both brand-rise;display:flex}.auth-form label{color:var(--ink-soft);flex-direction:column;gap:.4rem;font-size:.95rem;font-weight:600;display:flex}.auth-form input{font:inherit;border:none;border-bottom:1px solid var(--line);color:var(--ink);background:0 0;border-radius:0;padding:.8rem 0;font-weight:400}.auth-form input::placeholder{color:#3d4a5c8c}.auth-form input:focus{border-bottom-color:var(--teal);box-shadow:0 1px 0 0 var(--teal);outline:none}.auth-actions{flex-wrap:wrap;gap:.75rem;margin-top:.5rem;display:flex}.auth-actions .btn{margin-top:0}.auth-error{color:var(--fail);margin:0;font-size:.95rem}.auth-info{color:var(--teal);margin:0;font-size:.95rem}.auth-switch{margin:1.75rem 0 0;animation:.7s .3s both brand-rise}.auth-switch a{color:var(--teal);text-underline-offset:2px;text-decoration:underline}.auth-loading{place-items:center;min-height:40vh;display:grid}@media (width<=640px){.auth-page{justify-content:flex-start;padding-top:2.5rem}.auth-actions{flex-direction:column}.auth-actions .btn{width:100%}}.level-tabs{flex-wrap:wrap;gap:.5rem;margin:.75rem 0 .25rem;display:flex}.hero-levels{margin:.5rem 0 .75rem}.level-tab{font:inherit;border:1px solid var(--line);color:var(--ink-soft);cursor:pointer;background:0 0;border-radius:999px;padding:.4rem .9rem;text-decoration:none}.level-tab.active{background:var(--teal);border-color:var(--teal);color:#fff}a.level-tab:hover{border-color:var(--teal)}.write-input{width:100%;font:inherit;border:1px solid var(--line);background:#fffdf9;border-radius:10px;margin-top:.75rem;padding:.7rem .85rem;font-size:1.15rem;display:block}.write-tokens{margin-top:.5rem}.token-chip{cursor:default}.tf-visual{max-width:180px;margin:.5rem 0}.app-shell{--sidebar-w:15.5rem;grid-template-columns:var(--sidebar-w) minmax(0, 1fr);min-height:100vh;display:grid;position:relative}.app-topbar,.app-backdrop{display:none}.app-sidebar{border-right:1px solid var(--line);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:2;background:#f7f1e8b8;flex-direction:column;align-self:start;gap:1.5rem;height:100vh;padding:1.5rem 1.1rem 1.25rem;display:flex;position:sticky;top:0}.app-brand-link{color:var(--ink);align-items:center;gap:.65rem;text-decoration:none;display:flex}.app-logo{object-fit:cover;border-radius:8px;flex-shrink:0;width:2.5rem;height:2.5rem}.app-topbar .app-logo{width:2rem;height:2rem}.app-wordmark{font-family:var(--font-display);letter-spacing:-.02em;font-size:1.15rem;font-weight:700;line-height:1}.app-nav{flex-direction:column;flex:1;gap:.2rem;display:flex}.app-nav-link{color:var(--ink-soft);border-left:3px solid #0000;border-radius:8px;padding:.55rem .75rem;font-weight:600;transition:background .15s,color .15s;display:block}.app-nav-link:hover{color:var(--ink);background:#1a24300a}.app-nav-link.active{color:var(--teal);border-left-color:var(--teal);background:#2a6a6414}.app-sidebar-foot{border-top:1px solid var(--line);flex-direction:column;align-items:flex-start;gap:.65rem;padding-top:1rem;display:flex}.app-account{word-break:break-word;margin:0;font-size:.88rem;line-height:1.35}.app-main{z-index:1;min-width:0;position:relative}.app-main .page{padding-top:1.75rem}.app-menu-btn{font:inherit;border:1px solid var(--line);color:var(--ink);cursor:pointer;background:0 0;border-radius:999px;padding:.4rem .75rem;font-weight:600}.insights-hero,.how-hero{padding:.5rem 0 .25rem}.eyebrow{letter-spacing:.04em;text-transform:uppercase;margin:0 0 .35rem;font-size:.85rem;font-weight:600}.insights-hero h1,.how-hero h1{margin:0;font-size:clamp(1.85rem,4vw,2.6rem)}.insights-hero .lede,.how-hero .lede{margin:.75rem 0 0}.empty-readiness .btn{margin-top:1rem}.how-steps{counter-reset:how;flex-direction:column;gap:1.75rem;max-width:36rem;margin:2rem 0 0;padding:0;list-style:none;display:flex}.how-steps li{counter-increment:how;padding-left:2.75rem;position:relative}.how-steps li:before{content:counter(how);color:#fff7f0;background:var(--accent);border-radius:999px;place-items:center;width:1.85rem;height:1.85rem;font-size:.9rem;font-weight:700;display:grid;position:absolute;top:.1rem;left:0}.how-steps h2{margin:0 0 .35rem;font-size:1.25rem}.how-steps p{color:var(--ink-soft);margin:0;line-height:1.55}.how-note{max-width:36rem;margin:2rem 0 0}.how-to-page .cta-row{margin-top:1.75rem}@media (width<=860px){.app-shell{grid-template-columns:1fr}.app-topbar{z-index:5;border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#f7f1e8eb;align-items:center;gap:.75rem;padding:.75rem 1rem;display:flex;position:sticky;top:0}.app-sidebar{width:min(18rem,86vw);height:100vh;box-shadow:none;border-right:1px solid var(--line);transition:transform .2s;position:fixed;inset:0 auto 0 0;transform:translate(-105%)}.app-shell.menu-open .app-sidebar{transform:translate(0);box-shadow:8px 0 32px #1a24301f}.app-backdrop{z-index:4;cursor:pointer;background:#1a243047;border:none;margin:0;padding:0;display:block;position:fixed;inset:0}.app-main .page{width:min(1080px,100% - 2rem)}}.landing-page{padding-top:1rem}.landing-nav{justify-content:space-between;align-items:center;gap:1rem;margin-bottom:2rem;display:flex}.landing-nav .app-brand-link{gap:.5rem}.landing-nav-actions{align-items:center;gap:.5rem;display:flex}.landing-hero{min-height:auto;padding:2rem 0 3rem}.landing-hero h1{animation:.7s 80ms both brand-rise}.landing-hero .lede{max-width:38rem;animation:.7s .14s both brand-rise}.landing-hero .cta-row{animation:.7s .22s both brand-rise}.landing-section{margin-top:3rem}.landing-steps{border-top:1px solid var(--line);padding-top:1.5rem}.landing-steps h2{margin:0 0 1.25rem;font-size:1.8rem}.landing-steps ol{grid-template-columns:repeat(auto-fit,minmax(16rem,1fr));gap:1.25rem;margin:0;padding:0;list-style:none;display:grid}.landing-steps li{border:1px solid var(--line);background:#fffdf9b8;border-radius:12px;padding:1.25rem}.step-number{background:var(--teal);color:#f4fffc;border-radius:50%;justify-content:center;align-items:center;width:1.75rem;height:1.75rem;margin-bottom:.75rem;font-size:.9rem;font-weight:700;display:inline-flex}.landing-steps h3{margin:0 0 .5rem;font-size:1.15rem}.landing-steps p{color:var(--ink-soft);margin:0;line-height:1.55}.landing-insights{border:1px solid var(--line);background:#fffdf9b8;border-radius:12px;padding:1.75rem}.landing-insights h2{margin:0 0 .75rem;font-size:1.5rem}.landing-insights p{color:var(--ink-soft);margin:0;line-height:1.55}.landing-footer{border-top:1px solid var(--line);color:var(--ink-soft);padding-top:1rem;font-size:.95rem}.landing-footer a{color:var(--teal);text-underline-offset:2px;text-decoration:underline}@media (width<=640px){.landing-nav{flex-wrap:wrap}.landing-nav-actions .btn{padding:.6rem 1rem;font-size:.9rem}.landing-hero{padding:1rem 0 2.5rem}.landing-insights{padding:1.25rem}}
