:root{--paper:#f3f1e9;--paper-soft:#f9f7f0;--panel:#fffdf9;--ink:#1c1b18;--ink-soft:#6b6457;--line:#e3ddcc;--line-strong:rgba(28,27,24,0.22);--accent:#2b6e63;--accent-dark:#1c4d44;--accent-soft:rgba(43,110,99,0.1);--secondary-tone-dark:#7a5419;--secondary-tone-soft:rgba(185,133,44,0.14);--good:#2f7a4f;--good-bg:#e6f3ea;--bad:#c1392b;--bad-dark:#8a2318;--bad-bg:#fbeae7;--shadow-ink:rgba(28,27,24,0.16);--skin-tone:#e8cfae}*{box-sizing:border-box}body,html{margin:0;min-height:100%}body{position:relative;color:var(--ink);background:var(--paper);font-family:var(--font-mono),ui-monospace,"SFMono-Regular",Menlo,monospace;font-size:15px}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:.035;mix-blend-mode:multiply;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");background-size:180px 180px}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}main{padding:2rem 0 4rem}.topbar,main{position:relative;width:min(1180px,calc(100% - 2rem));margin:0 auto}.topbar{padding:1.25rem 0 1rem;display:flex;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--line)}.topbar,.wordmark{align-items:center}.wordmark{display:inline-flex}.wordmark img{width:180px;height:auto;display:block}.attempt-box,.keyboard,.lesson-text,.panel,.stat-card{border:1px solid var(--line);background:var(--panel);box-shadow:0 1px 2px rgba(28,27,24,.05);border-radius:12px}.hero,.typing-board{border:1.5px solid var(--ink);background:var(--panel);box-shadow:4px 4px 0 var(--accent-soft);border-radius:14px}.attempt-box,.hero,.keyboard,.panel,.typing-board{padding:1.6rem}.hero{display:grid;grid-gap:1rem;gap:1rem;margin-top:1.5rem}.hero-grid{display:grid;grid-template-columns:1.3fr 1fr;grid-gap:2rem;gap:2rem;align-items:center}.hero-art{display:flex;justify-content:center;align-items:center;color:var(--ink)}.hero-art img,.hero-art svg{width:100%;max-width:300px;height:auto}.eyebrow{display:inline-block;color:var(--accent);text-transform:uppercase;letter-spacing:.14em;font-size:.78rem;font-weight:700}.eyebrow:before{content:"— "}.headline{font-family:var(--font-display),Georgia,serif;font-size:clamp(1.9rem,4.6vw,3.5rem);line-height:1.08;margin:0;max-width:14ch;letter-spacing:-.01em}.headline:after,.page-title:after{content:"";display:inline;padding-left:.5em;margin-left:.15em;background:var(--accent);vertical-align:text-bottom;animation:blink 1.1s steps(1) infinite}@keyframes blink{50%{opacity:0}}.subhead{max-width:64ch;color:var(--ink-soft);font-size:.98rem;line-height:1.75}.grid{display:grid;grid-gap:1rem;gap:1rem}.grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.three{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.four{grid-template-columns:repeat(4,minmax(0,1fr))}.actions,.inline{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.button,.button-link{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;border-radius:8px;padding:.75rem 1.1rem;border:1.5px solid var(--ink);font-weight:700;font-size:.8rem;text-transform:uppercase;letter-spacing:.04em;cursor:pointer;background:var(--panel);color:var(--ink);box-shadow:2px 2px 0 var(--shadow-ink);transition:transform .1s ease,box-shadow .1s ease}.button-link:hover,.button:hover{transform:translate(-1px,-1px);box-shadow:3px 3px 0 var(--shadow-ink)}.button-link:active,.button:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--shadow-ink)}.button-link.primary,.button.primary{background:var(--accent);border-color:var(--accent-dark);color:#f9f7f0;box-shadow:2px 2px 0 var(--accent-dark)}.button-link.primary:hover,.button.primary:hover{box-shadow:3px 3px 0 var(--accent-dark)}.button-link.primary:active,.button.primary:active{box-shadow:1px 1px 0 var(--accent-dark)}.button-link.secondary,.button.secondary{background:var(--secondary-tone-soft);border-color:var(--secondary-tone-dark);color:var(--secondary-tone-dark);box-shadow:2px 2px 0 var(--secondary-tone-dark)}.button-link.secondary:hover,.button.secondary:hover{box-shadow:3px 3px 0 var(--secondary-tone-dark)}.button-link.secondary:active,.button.secondary:active{box-shadow:1px 1px 0 var(--secondary-tone-dark)}.button-link.small,.button.small{padding:.5rem .85rem;font-size:.72rem}.button-link.danger,.button.danger{border-color:var(--bad-dark);color:var(--bad);box-shadow:2px 2px 0 var(--bad-dark)}.button-link.danger:hover,.button.danger:hover{background:#fdf2f1;box-shadow:3px 3px 0 var(--bad-dark)}.button-link.danger:active,.button.danger:active{box-shadow:1px 1px 0 var(--bad-dark)}.button-link:disabled,.button:disabled{opacity:.5;cursor:not-allowed;box-shadow:none;transform:none}summary.button{list-style:none}summary.button::-webkit-details-marker{display:none}summary.button::marker{content:""}.inline>details[open]{flex-basis:100%}.entity-actions{flex-wrap:wrap}.entity-actions-confirm{display:grid;grid-gap:.5rem;gap:.5rem;padding:.6rem .75rem;border:1.5px solid #c0392b;border-radius:8px;background:#fdf2f1}.entity-actions-confirm-warning{font-size:.82rem;color:#7b2020;margin:0}.entity-actions-notice{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;padding:.5rem .75rem;border-radius:8px;font-size:.82rem}.entity-actions-notice--archive{background:var(--paper-soft);border:1.5px solid var(--line-strong);color:var(--ink-soft)}.entity-actions-notice--error{background:#fdf2f1;border:1.5px solid #c0392b;color:#7b2020}.reopen-confirm{align-items:center;flex-wrap:wrap}.reopen-confirm-date{border:1px solid var(--line-strong);border-radius:8px;padding:.3rem .5rem;background:var(--paper-soft);font-size:.82rem;line-height:1.3}.credential-reveal{display:grid;grid-gap:.4rem;gap:.4rem;padding:.75rem .9rem;border-radius:8px;background:var(--good-bg);border:1.5px solid var(--good);color:var(--ink)}.credential-reveal-value{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1rem;font-weight:700;letter-spacing:.02em}.fields{display:grid;grid-gap:1rem;gap:1rem}.field{display:grid;grid-gap:.4rem;gap:.4rem}.field>span{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft)}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line-strong);border-radius:8px;padding:.75rem .85rem;background:var(--paper-soft);line-height:1.3}.field select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%236b6457' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 8l4 4 4-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;padding-right:2.25rem}.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--accent);outline-offset:1px}.muted{color:var(--ink-soft)}.table-wrap{overflow-x:auto}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:.8rem .7rem;border-bottom:1px solid var(--line);vertical-align:middle}th{text-transform:uppercase;letter-spacing:.05em;font-size:.73rem;color:var(--ink-soft);border-bottom:2px solid var(--line);white-space:nowrap}tbody tr{transition:background .1s}tbody tr:hover>td{background:rgba(43,110,99,.04)}.attention-details summary{cursor:pointer;list-style:none}.attention-details summary::-webkit-details-marker{display:none}.attention-details summary:after{content:"";display:inline-block;margin-left:.4em;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid;vertical-align:middle}.attention-details[open] summary:after{transform:rotate(180deg)}.attention-list{list-style:none;margin:.5rem 0 0;padding:0;display:grid;grid-gap:.4rem;gap:.4rem}.attention-list li{display:flex;align-items:center;justify-content:space-between;gap:.6rem;font-size:.85rem}.status{display:inline-flex;border:1px solid var(--line);border-radius:999px;padding:.22rem .65rem;font-size:.73rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;background:var(--paper-soft);white-space:nowrap}.status.good{background:var(--good-bg);color:var(--good);border-color:var(--good)}.status.bad{background:var(--bad-bg);color:var(--bad);border-color:var(--bad)}.row-highlight>td{background:var(--accent-soft);border-left:3px solid var(--accent)}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-gap:1rem;gap:1rem}.stat-card{padding:1rem}.stat-label{font-size:.76rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft)}.stat-value{margin-top:.45rem;font-weight:700;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;font-size:1.8rem;color:var(--accent-dark)}.lesson-text{padding:1.25rem;font-size:1.15rem;line-height:1.9;letter-spacing:.01em;white-space:pre-wrap}.char{border-radius:3px}.char.correct{background:rgba(47,122,79,.16)}.char.incorrect{background:rgba(193,57,43,.18)}.char.current{outline:2px solid var(--accent);background:var(--accent-soft)}.char.pending{color:rgba(28,27,24,.45)}.kbd{--ku:38px;--kg:3px;display:inline-flex;flex-direction:column;gap:var(--kg);overflow-x:auto;scrollbar-width:thin;padding-bottom:2px}.kbd-row{display:flex;gap:var(--kg);flex-wrap:nowrap}.kbd-row--center{justify-content:center}.kbd-enter-anchor{position:relative;display:flex;flex-direction:column;gap:var(--kg)}.key{flex:none;height:var(--ku);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;border-radius:5px;background:var(--fz-soft,var(--panel));border:1px solid var(--fz-strong,var(--line-strong));font-family:var(--font-mono),monospace;font-size:.7rem;font-weight:600;color:var(--ink);box-shadow:0 2px 0 var(--line-strong);cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;transition:background .08s,color .08s;padding:0 3px}.key--special{background:var(--fz-soft,var(--paper-soft));font-size:.6rem;color:var(--ink-soft);font-weight:500}.key.active{background:var(--accent);color:#f9f7f0;border-color:var(--accent-dark);box-shadow:0 2px 0 var(--accent-dark);transform:translateY(1px)}.key-lbl{line-height:1;font-size:.75rem}.key-lbl2{line-height:1;font-size:.6rem;color:var(--ink-soft);opacity:.8}.key.active .key-lbl2{color:rgba(249,247,240,.65);opacity:1}.key--iso-enter{position:absolute;top:0;align-items:center;justify-content:flex-end;padding-bottom:5px}.key-lbl--iso-enter{font-size:.62rem}.attempt-input{width:100%;min-height:170px;border:1px solid var(--line-strong);border-radius:10px;padding:1rem;background:var(--paper-soft);font-size:1.05rem;line-height:1.7}.section-title{margin:0 0 .75rem;font-family:var(--font-display),Georgia,serif;font-size:1.2rem}.stack{display:grid;grid-gap:1rem;gap:1rem}.back-link{display:inline-flex;align-items:center;gap:.35rem;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft)}.back-link:hover{color:var(--ink)}.page-header{display:grid;grid-gap:.25rem;gap:.25rem}.page-title{font-family:var(--font-display),Georgia,serif;font-size:clamp(1.5rem,3vw,2.2rem);margin:0;line-height:1.1}.page-meta{color:var(--ink-soft);font-size:.9rem}.group-card{display:grid;grid-gap:.6rem;gap:.6rem;border:1.5px solid var(--ink);background:var(--panel);border-radius:14px;padding:1.5rem;text-decoration:none;color:var(--ink);box-shadow:4px 4px 0 var(--accent-soft);transition:transform .1s ease,box-shadow .1s ease}.group-card:hover{transform:translate(-2px,-2px);box-shadow:6px 6px 0 var(--accent-soft)}.group-card-name{font-family:var(--font-display),Georgia,serif;font-size:1.4rem}.group-card-meta{font-size:.84rem;color:var(--ink-soft)}.group-card-stats{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.25rem}.spotlight-card{border-color:var(--accent);box-shadow:4px 4px 0 var(--accent)}.spotlight-card-cta{justify-self:start;text-decoration:none}.group-card-link{display:contents}.group-card-action{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem;padding-top:.6rem;border-top:1px solid var(--line)}.status.warning{background:#fef3cd;color:#854d0e;border-color:#ca8a04}.status.info{background:var(--accent-soft);color:var(--accent-dark);border-color:var(--accent)}.assignment-row{display:flex;align-items:flex-start;gap:1rem;padding:1rem;border:1px solid var(--line);border-radius:10px;background:var(--paper-soft);flex-wrap:wrap}.assignment-row-done{background:var(--good-bg);border-color:var(--good)}.assignment-row-main{flex:1 1;display:grid;grid-gap:.4rem;gap:.4rem;min-width:0}.assignment-row-info{display:flex;flex-direction:column;gap:.15rem}.assignment-row-title{font-weight:700;font-size:1rem}.assignment-row-lesson{font-size:.83rem}.assignment-row-meta{display:flex;gap:.5rem;flex-wrap:wrap;align-items:center;font-size:.83rem}.assignment-row-actions{display:flex;gap:.5rem;flex-shrink:0;align-items:flex-start}.assignment-info-strip{display:flex;gap:1.5rem;flex-wrap:wrap;padding:1rem 1.25rem;background:var(--panel);border:1px solid var(--line);border-radius:10px;font-size:.88rem}.assignment-info-item{display:flex;flex-direction:column;gap:.2rem}.assignment-info-label{font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);font-weight:700}.summary-bar{display:flex;gap:0;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden}.summary-bar-item{flex:1 1;display:flex;flex-direction:column;gap:.2rem;padding:.9rem 1.1rem;border-right:1px solid var(--line)}.summary-bar-item:last-child{border-right:none}.summary-bar-value{font-family:var(--font-display),Georgia,serif;font-size:1.5rem;font-weight:700;line-height:1}.summary-bar-label{font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft)}.metric-low{color:var(--bad);font-weight:700}.metric-ok{color:var(--good);font-weight:600}.results-table td{vertical-align:middle}.ts{display:grid;grid-gap:1.1rem;gap:1.1rem}.ts-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;flex-wrap:wrap}.ts-title{font-family:var(--font-display),Georgia,serif;font-size:1.4rem;margin:.2rem 0 0;line-height:1.15}.ts-meta{font-size:.84rem;margin-top:.3rem}.ts-focus-toggle{flex-shrink:0;letter-spacing:.03em}.ts-focus-toggle--on{background:var(--ink);color:var(--paper-soft);border-color:var(--ink)}.ts-stats{display:flex;align-items:stretch;background:var(--panel);border:1.5px solid var(--ink);border-radius:10px;overflow:hidden}.ts-stat{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.15rem;padding:.65rem 1rem;border-right:1px solid var(--line);min-width:5rem}.ts-stat-value{font-family:var(--font-display),Georgia,serif;font-size:1.35rem;font-weight:700;line-height:1;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.ts-stat--primary{background:var(--accent-soft)}.ts-stat--primary .ts-stat-value{font-size:1.6rem;color:var(--accent-dark)}.ts-stat--low{color:var(--bad)}.ts-stat-label{font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-soft);white-space:nowrap}.ts-progress{flex:1 1;display:flex;flex-direction:column;justify-content:center;gap:.35rem;padding:.65rem 1rem}.ts-progress-track{height:5px;background:var(--line);border-radius:3px;overflow:hidden}.ts-progress-fill{height:100%;background:var(--accent);border-radius:3px;transition:width .2s ease}.ts-progress-label{font-size:.74rem;color:var(--ink-soft);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.ts-lesson{position:relative;height:10.5rem;overflow-y:auto;overflow-x:hidden;padding:1.25rem 1.5rem;background:var(--panel);border:1.5px solid var(--ink);border-radius:10px;font-family:var(--font-mono),ui-monospace,monospace;font-size:1.18rem;line-height:2.15;letter-spacing:.01em;white-space:pre-wrap;word-break:break-all;cursor:text;scrollbar-width:none}.ts-lesson::-webkit-scrollbar{display:none}.char{border-radius:2px;transition:background .05s}.char.correct{background:rgba(47,122,79,.15)}.char.incorrect{background:rgba(193,57,43,.13);-webkit-text-decoration:underline wavy var(--bad) 1.5px;text-decoration:underline wavy var(--bad) 1.5px}.char.current{background:var(--accent);color:#f9f7f0;border-radius:2px;animation:ts-cursor 1.05s steps(1) infinite}@keyframes ts-cursor{0%,48%{background:var(--accent);color:#f9f7f0}49%,to{background:rgba(43,110,99,.12);color:var(--ink)}}.char.pending{color:rgba(28,27,24,.36)}.ts-input-wrap{display:grid;grid-gap:.5rem;gap:.5rem}.ts-paste-notice{padding:.6rem .9rem;background:var(--bad-bg);border:1px solid var(--bad);border-radius:8px;font-size:.84rem;font-weight:700;color:var(--bad);animation:ts-fade-notice 3s ease forwards}@keyframes ts-fade-notice{0%,65%{opacity:1}to{opacity:0}}.ts-textarea{width:100%;resize:none;border:1.5px solid var(--ink);border-radius:10px;padding:1rem 1.25rem;background:var(--paper-soft);font-family:var(--font-mono),ui-monospace,monospace;font-size:1.05rem;line-height:1.75;letter-spacing:.01em}.ts-textarea:focus{outline:2px solid var(--accent);outline-offset:1px}.ts-input-footer{justify-content:space-between;flex-wrap:wrap;gap:.75rem;min-height:2.5rem}.ts-finger,.ts-input-footer{display:flex;align-items:center}.ts-finger{gap:.55rem;font-size:.85rem}kbd.ts-finger-key{font-family:var(--font-mono),monospace;background:var(--panel);border:solid var(--line-strong);border-width:1.5px 1.5px 3px;border-radius:5px;padding:.15rem .55rem;font-size:.9rem;font-weight:700;color:var(--ink);min-width:2rem;text-align:center}.ts-finger-label{color:var(--ink-soft)}.ts-result{display:grid;grid-gap:1.25rem;gap:1.25rem;padding:1.75rem;background:var(--panel);border:1.5px solid var(--ink);border-radius:14px;box-shadow:4px 4px 0 var(--accent-soft)}.ts-result-verdict{font-family:var(--font-display),Georgia,serif;font-size:1.9rem;font-weight:700}.ts-result-verdict--pass{color:var(--good)}.ts-result-verdict--fail{color:var(--bad)}.ts-result-verdict--practice{color:var(--accent)}.ts-result-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:.75rem;gap:.75rem}.ts-result-metric{display:flex;flex-direction:column;gap:.2rem;padding:.85rem 1rem;background:var(--paper-soft);border:1px solid var(--line);border-radius:8px}.ts-result-value{font-family:var(--font-display),Georgia,serif;font-size:1.65rem;font-weight:700;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;line-height:1}.ts-result-unit{font-size:.9rem;opacity:.7}.ts-result-label{font-size:.72rem;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-soft);margin-top:.2rem}.ts-practice-area{display:grid;grid-template-columns:auto 1fr auto;grid-template-areas:"hl kb hr";align-items:center;justify-content:center;grid-gap:1rem;gap:1rem}.ts-hand-slot--left{grid-area:hl}.ts-hand-slot--right{grid-area:hr}.ts-practice-area .ts-keyboard-wrap{grid-area:kb}.ts-hands-toggle{display:inline-flex;align-items:center;gap:.4rem;font-size:.78rem;color:var(--ink-soft);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ts-hands-toggle input{cursor:pointer}.hand-guide{position:relative;width:clamp(120px,15vw,180px);aspect-ratio:644/646;flex-shrink:0}.hand-guide--compact{width:clamp(80px,10vw,120px)}.hand-guide-art,.hand-guide-fill{position:absolute;inset:0;width:100%;height:100%}.hand-guide-art{pointer-events:none}.hand-finger{fill:var(--finger-fill,var(--skin-tone));stroke:none;transition:fill .12s,filter .12s}.hand-finger--active{stroke:var(--finger-stroke);stroke-width:3;filter:drop-shadow(0 0 4px var(--finger-stroke)) drop-shadow(0 1px 2px var(--shadow-ink))}.hand-guide-bubble{position:absolute;transform:translate(-50%,calc(-100% - 10px));background:var(--ink);color:var(--paper-soft);font-family:var(--font-mono),monospace;font-size:.72rem;font-weight:700;padding:.2rem .5rem;border-radius:6px;white-space:nowrap;box-shadow:0 2px 0 var(--shadow-ink)}.hand-guide-bubble:after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top:5px solid var(--ink)}.hand-guides{gap:1rem;align-items:center}.hand-guides,.ts-keyboard-wrap{display:flex;justify-content:center}.ts-keyboard-wrap{width:100%;overflow-x:auto}.ts-keyboard-inner{display:grid;grid-gap:.6rem;gap:.6rem;width:-moz-fit-content;width:fit-content;max-width:100%}.ts-keyboard-header{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.ts-keyboard-title{font-weight:700;font-size:.84rem;font-family:var(--font-display),Georgia,serif;color:var(--ink)}.ts-finger-info{display:flex;flex-direction:column;gap:.1rem}.ts-finger-hint{font-size:.76rem;color:var(--accent-dark);font-weight:600}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.ts--focus .ts-keyboard-wrap,.ts--focus .ts-meta{display:none}.assignment-flags{display:flex;gap:1.5rem;flex-wrap:wrap}.assignment-flag-label{display:flex;align-items:center;gap:.45rem;font-size:.88rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.assignment-flag-label input[type=checkbox]{width:1.05rem;height:1.05rem;accent-color:var(--accent);flex:none}.ts-result-header{display:grid;grid-gap:.35rem;gap:.35rem}.ts-result-failed{font-size:.88rem;color:var(--bad);margin:0}.ts-rule-notice{padding:.55rem .9rem;background:rgba(193,57,43,.06);border:1px solid rgba(193,57,43,.3);border-radius:8px;font-size:.84rem;color:var(--bad);font-weight:600}.import-preview{display:grid;grid-gap:.6rem;gap:.6rem;padding:1rem;background:var(--paper-soft);border:1px solid var(--line);border-radius:8px}.import-preview-stats{display:flex;gap:1.25rem;flex-wrap:wrap;font-size:.88rem;color:var(--ink-soft)}.import-preview-stats span strong{color:var(--ink);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.import-warning{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;padding:.6rem .75rem;background:#fef3cd;border:1px solid #ca8a04;border-radius:6px;font-size:.84rem;color:#854d0e}kbd.import-unusual-char{font-family:var(--font-mono),monospace;background:var(--panel);border:solid var(--line-strong);border-width:1.5px 1.5px 2px;border-radius:4px;padding:.1rem .4rem;font-size:.88rem;color:var(--ink);cursor:help}.import-excerpt{border:1px solid var(--line);border-radius:6px;overflow:hidden;max-height:9rem;overflow-y:auto}.import-excerpt-text{margin:0;padding:.75rem 1rem;font-family:var(--font-mono),monospace;font-size:.85rem;line-height:1.65;white-space:pre-wrap;word-break:break-all;background:var(--panel);color:var(--ink)}.auth-layout{min-height:calc(100dvh - 5.5rem);display:flex;align-items:center;justify-content:center;padding:2.5rem 1.25rem}.auth-layout--no-topbar{min-height:100dvh}.auth-container{gap:1.75rem;width:min(380px,100%)}.auth-brand,.auth-container{display:flex;flex-direction:column;align-items:center}.auth-brand{gap:.6rem;text-align:center}.auth-logo{width:min(280px,70vw);height:auto;filter:drop-shadow(0 4px 16px rgba(28,27,24,.12))}.auth-app-desc{margin:0;color:var(--ink-soft);font-size:.86rem;max-width:34ch;line-height:1.55}.auth-card{width:100%;background:var(--panel);border:1.5px solid var(--ink);border-radius:14px;padding:2rem;box-shadow:4px 4px 0 var(--shadow-ink);display:grid;grid-gap:1.25rem;gap:1.25rem}.auth-card-title{margin:0;font-family:var(--font-display),Georgia,serif;font-size:1.15rem;letter-spacing:.02em;padding-bottom:1rem;border-bottom:1px solid var(--line)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:.5rem;padding:2.5rem 1.5rem;color:var(--ink-soft)}.empty-state-title{font-family:var(--font-display),Georgia,serif;font-size:1rem;color:var(--ink);margin:0}.empty-state-desc{margin:0;font-size:.86rem;max-width:42ch;line-height:1.55}.nav-user{display:flex;align-items:center;gap:.75rem}.nav-user-info{display:flex;flex-direction:column;align-items:flex-end;gap:.15rem}.nav-user-group,.nav-user-name{font-size:.84rem;color:var(--ink-soft);white-space:nowrap}.nav-role-badge{display:inline-flex;align-items:center;padding:.18rem .55rem;background:var(--accent-soft);color:var(--accent-dark);border-radius:999px;font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap}.work-mode-fieldset{border:1px solid var(--line);border-radius:8px;padding:.85rem 1rem;display:grid;grid-gap:.6rem;gap:.6rem}.work-mode-legend{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);padding:0 .25rem}.work-mode-option{display:flex;align-items:flex-start;gap:.6rem;cursor:pointer}.work-mode-option input[type=radio]{margin-top:.18rem;flex:none;accent-color:var(--accent);width:1rem;height:1rem}.work-mode-label{display:block;font-weight:700;font-size:.9rem;color:var(--ink)}.work-mode-hint{display:block;font-size:.78rem;color:var(--ink-soft);margin-top:.15rem;line-height:1.45}.lesson-select-wrap{display:grid;grid-gap:.5rem;gap:.5rem}.lesson-filter-row{display:flex;align-items:center;gap:.5rem}.lesson-filter-label{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);white-space:nowrap}.lesson-language-filter{font-size:.82rem}.field-label{display:block;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);margin-bottom:.35rem}.ts-rule-notice--info{background:var(--accent-soft);border:1px solid var(--accent);color:var(--accent-dark)}.fragment-fieldset{border:1px solid var(--line);border-radius:10px;padding:1rem 1.1rem;margin:0}.fragment-legend{font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);padding:0 .35rem}.fragment-option{display:flex;gap:.65rem;align-items:flex-start;padding:.55rem 0;border-bottom:1px solid var(--line);cursor:pointer}.fragment-option:last-of-type{border-bottom:none;padding-bottom:0}.fragment-option input[type=radio]{margin-top:.2rem;flex-shrink:0;accent-color:var(--accent)}.fragment-option-label{font-weight:600;font-size:.87rem}.fragment-option-hint{margin:.25rem 0 0;font-size:.78rem;color:var(--ink-soft);line-height:1.5}.fragment-fields{margin-top:.65rem}.visibility-collapse{display:grid;grid-template-rows:0fr;transition:grid-template-rows .25s ease}.visibility-collapse.open{grid-template-rows:1fr}.visibility-collapse>div{overflow:hidden}.fragment-error{margin:.35rem 0 0;font-size:.78rem;color:var(--bad)}.fragment-summary{margin:.4rem 0 0;font-size:.8rem;color:var(--accent-dark);font-weight:600;background:var(--accent-soft);border-radius:6px;padding:.3rem .6rem;display:inline-block}.field-hint{margin:.3rem 0 0;font-size:.78rem;color:var(--ink-soft)}.ts-random-banner{border:1.5px dashed var(--accent);background:var(--accent-soft);border-radius:10px;padding:1.25rem 1.4rem;margin:0}.ts-random-banner-title{margin:0 0 .35rem;font-weight:700;font-size:.9rem;color:var(--accent-dark);text-transform:uppercase;letter-spacing:.06em}.ts-random-banner-desc{margin:0;font-size:.87rem;color:var(--ink-soft);line-height:1.55}@media (max-width:920px){.grid.four,.grid.three,.grid.two,.hero-grid,.stats{grid-template-columns:1fr}.hero-art{order:-1;max-width:180px;margin:0 auto}.headline{max-width:none}.ts-stats{flex-wrap:wrap}.ts-stat{flex:1 1;min-width:4.5rem;border-bottom:1px solid var(--line)}.ts-practice-area{grid-template-columns:1fr 1fr;grid-template-areas:"kb kb" "hl hr"}.hand-guide{width:clamp(70px,18vw,110px)}.ts-progress{width:100%}.ts-result-grid{grid-template-columns:repeat(2,1fr)}.ts-lesson{height:9rem;font-size:1.05rem}}.task-pack-card{display:block;padding:.75rem 1rem;border:1px solid var(--line);border-radius:8px;background:var(--paper-soft);cursor:pointer;transition:border-color .15s,box-shadow .15s}.task-pack-card:hover{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.task-pack-card-title{font-weight:600;font-size:.97rem}.task-pack-card-desc{font-size:.85rem;color:var(--ink-soft);margin-top:.2rem}.task-pack-card-meta{display:flex;gap:.5rem;margin-top:.4rem;flex-wrap:wrap}.tp-editor{display:flex;flex-direction:column;gap:.5rem}.tp-item{gap:.75rem;padding:.6rem .75rem;border:1px solid var(--line);border-radius:6px;background:var(--paper-soft)}.tp-item,.tp-item-order{display:flex;align-items:center}.tp-item-order{flex-direction:column;gap:.1rem;min-width:2rem}.tp-item-idx{font-size:.78rem;color:var(--ink-soft)}.tp-item-body{flex:1 1;min-width:0}.tp-item-title{font-weight:600;font-size:.92rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tp-item-meta{display:flex;gap:.35rem;margin-top:.25rem;flex-wrap:wrap}.tp-add-form{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--line)}.teacher-check-list{display:flex;flex-direction:column;gap:.4rem;margin:.5rem 0}.teacher-check-item{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.9rem}.tt-card{border:1px solid var(--line);border-radius:8px;background:var(--panel);overflow:hidden}.tt-header{display:flex;align-items:flex-start;gap:.75rem;padding:.85rem 1rem}.tt-order-controls{display:flex;flex-direction:column;align-items:center;gap:.1rem;min-width:2rem;padding-top:.1rem}.tt-idx{font-size:.75rem;color:var(--ink-soft);line-height:1}.tt-info{flex:1 1;min-width:0}.tt-title{font-weight:600;font-size:.95rem}.tt-meta{display:flex;gap:.35rem;margin-top:.3rem;flex-wrap:wrap}.tt-dates{font-size:.82rem;margin-top:.25rem}.tt-actions{display:flex;flex-direction:column;gap:.3rem;align-items:flex-end;min-width:7rem}.tt-edit-form,.tt-schedule-form{padding:1rem}.tt-edit-form,.tt-schedule-form,.tt-schedule-inline{border-top:1px solid var(--line);background:var(--paper-soft)}.tt-schedule-inline{display:flex;align-items:flex-end;flex-wrap:wrap;gap:.6rem;padding:.75rem 1rem}.tt-schedule-inline .field{gap:.25rem}.tt-schedule-inline .fragment-error{flex-basis:100%;margin:0}.tt-remove-confirm{padding:.85rem 1rem;border-top:1px solid var(--line);background:var(--bad-bg);font-size:.88rem}.tt-remove-confirm p{margin:0 0 .6rem;color:var(--bad)}.grading-detail-row td{background:var(--paper-soft)}.grading-student-detail .table-wrap{margin:0 .75rem .75rem}.lesson-row>td{border-bottom:none}.lesson-preview-row td{background:var(--paper-soft);border-bottom:1px solid var(--line)}.lesson-preview-box{margin:0 .75rem .75rem .7rem;border:1px solid var(--line);border-radius:6px;overflow:hidden;max-height:14rem;overflow-y:auto}.lesson-preview-text{margin:0;padding:.75rem 1rem;font-family:var(--font-mono),monospace;font-size:.85rem;line-height:1.65;white-space:pre-wrap;word-break:break-word;background:var(--panel);color:var(--ink)}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/edc640959b0c7826-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/ac0e76ddaeeb7981-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/64d784ea54a4acde-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/ff71da380fbe67dd-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/6d831b18ae5b01dc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/558ca1a6aa3cb55e-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/edc640959b0c7826-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ac0e76ddaeeb7981-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/64d784ea54a4acde-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ff71da380fbe67dd-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/6d831b18ae5b01dc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/558ca1a6aa3cb55e-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/edc640959b0c7826-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/ac0e76ddaeeb7981-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/64d784ea54a4acde-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/ff71da380fbe67dd-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/6d831b18ae5b01dc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(/_next/static/media/558ca1a6aa3cb55e-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:JetBrains Mono Fallback;src:local("Arial");ascent-override:75.79%;descent-override:22.29%;line-gap-override:0.00%;size-adjust:134.59%}.__className_898c26{font-family:JetBrains Mono,JetBrains Mono Fallback;font-style:normal}.__variable_898c26{--font-mono:"JetBrains Mono","JetBrains Mono Fallback"}@font-face{font-family:Special Elite;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/0c310187b552b27d-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Special Elite;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/e210f091ebfac73b-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Special Elite Fallback;src:local("Arial");ascent-override:60.00%;descent-override:25.33%;line-gap-override:0.00%;size-adjust:117.20%}.__className_91eb3e{font-family:Special Elite,Special Elite Fallback;font-weight:400;font-style:normal}.__variable_91eb3e{--font-display:"Special Elite","Special Elite Fallback"}