@font-face{font-family:LocalSans;src:local('Aptos'),local('Segoe UI'),local('Arial');font-display:swap}
:root{--paper:#f5f3ec;--card:#fffef9;--ink:#26342f;--muted:#65726b;--line:#dcded4;--accent:#bb4023;--orange:#df5a33;--green:#35654d;--soft:#e7ede0;--mono:'Cascadia Code','Consolas',monospace;--radius:18px}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:LocalSans,system-ui,sans-serif;font-size:16px;line-height:1.6}button,input,select{font:inherit}button,a,input,select,summary{touch-action:manipulation}button{cursor:pointer}button:disabled{cursor:default;opacity:.55}a{color:inherit}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--accent);outline-offset:4px}button,a{-webkit-tap-highlight-color:transparent}.skip{position:fixed;left:20px;top:-100px;z-index:10;background:var(--ink);color:white;padding:12px}.skip:focus{top:10px}.topbar{min-height:98px;max-width:1400px;margin:auto;padding:18px 48px;display:flex;align-items:center;gap:40px;border-bottom:1px solid var(--line)}.brand{display:flex;gap:12px;text-decoration:none;align-items:center;font-size:24px;font-weight:800;letter-spacing:-1px;line-height:1.1}.brand-light{font-weight:400}.brand small{display:block;font-size:8px;font-weight:650;letter-spacing:2.1px;margin-top:7px}.brand-mark{position:relative;background:var(--accent);color:var(--paper);width:42px;height:46px;border-radius:13px 13px 13px 2px;font-family:Georgia,serif;font-style:italic;font-size:38px;text-align:center}.brand-mark span{font-style:normal;font-size:25px;position:absolute;right:1px;top:-4px}.topbar nav{display:flex;align-items:center;gap:28px;margin:auto}.topbar nav a{font-size:14px;text-decoration:none;padding:12px 0;position:relative;color:var(--muted);font-weight:600}.topbar nav a.active{color:var(--ink)}.topbar nav a.active:after{content:'';height:3px;background:var(--accent);position:absolute;bottom:0;left:0;right:0;border-radius:4px}.xp-pill{font:600 13px var(--mono);border:1px solid var(--line);border-radius:40px;padding:9px 16px;white-space:nowrap}.xp-pill>span:first-child{color:var(--accent);margin-right:6px}main{max-width:1304px;margin:0 auto;padding:38px 48px 70px;min-height:75vh}h1,h2,h3,p{margin-top:0}h1{font-size:48px;line-height:1.07;letter-spacing:-2px;font-weight:750;margin-bottom:22px}h2{font-size:24px;line-height:1.2;letter-spacing:-.7px;margin-bottom:14px}h3{font-size:18px;line-height:1.3;margin-bottom:9px}p{margin-bottom:16px}.eyebrow{font:600 10px var(--mono);letter-spacing:2px;text-transform:uppercase;color:var(--muted);margin-bottom:15px;display:flex;gap:10px;align-items:center}.eyebrow .dot{width:7px;height:7px;display:inline-block;background:var(--accent);border-radius:50%}.hero{display:grid;grid-template-columns:1.22fr 1fr;align-items:center;gap:36px;margin-bottom:38px}.hero h1{font-size:clamp(42px,4.8vw,67px);letter-spacing:-2.8px}.hero h1 em{font-family:Georgia,serif;color:var(--accent);font-weight:400}.hero-copy p{max-width:425px;color:var(--muted);font-size:17px;line-height:1.7}.hero-actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:25px}.btn{display:inline-flex;justify-content:center;align-items:center;gap:16px;border:1px solid var(--ink);border-radius:8px;background:var(--ink);color:var(--card);padding:12px 19px;font-weight:650;font-size:14px;text-decoration:none;line-height:1.5;transition:transform .15s,background .15s}.btn:hover{background:#405046;transform:translateY(-1px)}.btn.secondary{background:transparent;color:var(--ink);border-color:var(--line)}.btn.secondary:hover{background:var(--soft)}.btn.orange{background:var(--accent);border-color:var(--accent)}.btn.small{padding:8px 13px;font-size:13px}.text-link{border:0;background:transparent;color:var(--accent);font-size:13px;text-decoration:underline;text-underline-offset:3px;padding:8px}.hero-art{background:#e9eddf;border:1px solid #d6dccd;border-radius:var(--radius);min-height:322px;position:relative;overflow:hidden;background-image:linear-gradient(#6176650b 1px,transparent 1px),linear-gradient(90deg,#6176650b 1px,transparent 1px);background-size:24px 24px}.hero-art svg{display:block;width:100%;height:282px}.art-label{display:flex;justify-content:space-between;padding:15px 20px;font:10px var(--mono);letter-spacing:1px}.art-note{position:absolute;bottom:17px;left:20px;font:11px var(--mono);background:var(--card);border:1px solid var(--line);border-radius:5px;padding:7px 10px}.art-sigma{position:absolute;right:23px;bottom:20px;font:italic 26px Georgia;color:var(--green)}.stats-strip{display:flex;align-items:center;gap:22px;padding:19px 24px;border-radius:12px;border:1px solid var(--line);background:var(--card);margin-bottom:35px}.stats-strip b{font:600 22px var(--mono);letter-spacing:-1px}.stats-strip span{font-size:12px;color:var(--muted)}.stats-strip .stat{min-width:88px;display:flex;flex-direction:column}.progress-track{height:7px;background:#e7e9df;border-radius:7px;overflow:hidden}.progress-track>span{display:block;height:100%;background:var(--green);border-radius:7px}.journey-progress{flex:1}.journey-progress .caption{display:flex;justify-content:space-between;margin-bottom:9px}.section-heading{display:flex;align-items:end;justify-content:space-between;margin-bottom:20px;gap:20px}.section-heading h2{margin-bottom:5px}.section-heading p{margin-bottom:0;color:var(--muted);font-size:13px}.section-heading>span{font:11px var(--mono);color:var(--muted)}.dashboard-grid{display:grid;grid-template-columns:1fr 280px;gap:25px}.mission-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.mission{position:relative;border:1px solid var(--line);background:var(--card);border-radius:12px;padding:20px;text-align:left;color:var(--ink);min-height:154px;transition:transform .15s,border .15s}.mission:hover:not(:disabled){transform:translateY(-3px);border-color:var(--green)}.mission.current{border-color:var(--green);box-shadow:inset 0 3px var(--green)}.mission:disabled{opacity:.7}.mission-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:17px}.mission-number{font:11px var(--mono);color:var(--muted)}.mission-icon{font:23px Georgia;color:var(--green);line-height:1}.mission h3{font-size:17px;margin-bottom:4px}.mission p{font-size:12px;color:var(--muted);margin:0}.mission-bottom{display:flex;justify-content:space-between;align-items:center;margin-top:13px;font-size:10px;color:var(--muted)}.mini-dots{display:flex;gap:4px}.mini-dots i{width:7px;height:7px;background:#dce0d5;border-radius:50%}.mini-dots i.done{background:var(--green)}.side-card{padding:24px;border-radius:14px;background:var(--ink);color:var(--paper);margin-bottom:16px}.side-card .eyebrow{color:#c3ceb9}.side-card h3{font-size:23px}.side-card p{font-size:13px;color:#c4cfbf}.side-card .medal{font-size:48px;color:#e6b672;line-height:1.5}.badge-name{font:12px var(--mono);margin:12px 0}.side-card.light{background:#ebe9df;color:var(--ink)}.side-card.light p{color:var(--muted)}.side-card.light .eyebrow{color:var(--muted)}.side-card.light .btn{width:100%}.badge-list{display:flex;gap:6px;flex-wrap:wrap;margin-top:18px}.badge-chip{display:grid;place-items:center;width:35px;height:35px;border:1px solid #a6b09d55;border-radius:50%;color:#a0ac96}.badge-chip.earned{background:#e5bb7c;color:var(--ink);border-color:#e5bb7c}.page-heading{max-width:760px;margin-bottom:30px}.page-heading p{color:var(--muted)}.back{font:12px var(--mono);display:inline-block;text-decoration:none;color:var(--muted);margin-bottom:24px}.workbench{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(260px,.85fr);gap:25px;align-items:start}.panel{background:var(--card);border:1px solid var(--line);padding:28px;border-radius:var(--radius);min-width:0}.panel+.panel{margin-top:20px}.task-title{font-size:27px;letter-spacing:-.8px}.context{font-size:15px;line-height:1.8;color:#495b4f}.case-sketch{background:#f0f1e8;border-radius:10px;margin:20px 0;overflow:hidden}.case-sketch svg{display:block;width:100%;height:120px}.task-stepper{display:flex;gap:10px;margin-bottom:25px}.step{border:1px solid var(--line);border-radius:7px;background:transparent;padding:9px 14px;font:12px var(--mono);color:var(--muted)}.step.selected{background:var(--ink);color:var(--paper);border-color:var(--ink)}.step.solved{border-color:var(--green);color:var(--green)}.fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:17px;margin-top:22px}.field{display:block;font-size:13px;font-weight:600;min-width:0}.field .input-wrap{display:flex;align-items:center;border:1px solid #c8cec2;background:white;border-radius:7px;margin-top:7px;overflow:hidden}.field input,.field select{min-width:0;width:100%;padding:11px;border:0;background:transparent;color:var(--ink);border-radius:7px;font:15px var(--mono)}.field select{font-family:inherit;font-size:13px;border:1px solid #c8cec2;margin-top:7px;background:white;min-height:46px}.field .unit{padding-right:10px;font:11px var(--mono);color:var(--muted);white-space:nowrap}.field.wide{grid-column:1/-1}.field input[aria-invalid=true],.field select[aria-invalid=true]{background:#fff0ea}.input-help{font-size:11px;color:var(--muted);margin:15px 0}.answer-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px}.feedback{margin-top:20px;padding:18px;border-radius:9px;background:#edf2e7;border:1px solid #cedec0;font-size:14px}.feedback.wrong{background:#fcf0df;border-color:#ead0a8}.feedback h3{font-size:17px}.feedback p:last-child{margin:0}.answer-detail{border-top:1px solid #c7d7ba;padding-top:12px;margin-top:12px}.hint{margin-top:14px;padding:15px;background:#f6eddf;border-left:3px solid #ba8950;font-size:14px}.lesson{font-size:14px;line-height:1.8}.lesson h2{font-size:20px}.formula{font:13px/1.9 var(--mono);white-space:pre-wrap;padding:16px;background:#edf0e7;border-radius:8px;overflow-wrap:anywhere;margin:18px 0}.source-tag{font-size:10px;color:var(--muted);border-top:1px solid var(--line);padding-top:15px;margin-top:20px}.lesson details{margin-top:10px}.lesson summary{cursor:pointer;font-weight:650}.reward-stars{color:var(--accent);letter-spacing:4px}.notice{padding:12px 22px;background:#fbe8d0;font-size:13px;text-align:center}.lab-layout{display:grid;grid-template-columns:300px minmax(0,1fr);gap:22px;align-items:start}.lab-controls h2{font-size:19px}.lab-controls select{width:100%;padding:10px;border:1px solid var(--line);border-radius:6px;background:white;margin:8px 0 18px}.matrix-inputs{display:grid;grid-template-columns:1fr 1fr;gap:12px}.matrix-inputs .field input{padding:8px;width:100%;font-size:14px}.lab-controls .field{font-size:12px}.lab-controls .panel{padding:22px}.presets{display:flex;gap:7px;flex-wrap:wrap;margin-top:19px}.preset{border:1px solid var(--line);background:var(--paper);border-radius:30px;padding:6px 10px;font-size:11px;color:var(--ink)}.plot-card{padding:22px 25px 18px}.plot-head{display:flex;justify-content:space-between;align-items:start;gap:12px}.plot-head h2{font-size:21px;margin:0}.plot-head span{font:10px var(--mono);color:var(--muted)}#mohr-svg{width:100%;height:auto;display:block;overflow:visible}.plot-caption{font-size:11px;color:var(--muted);margin:0}.slider-row{display:grid;grid-template-columns:auto 1fr 60px;gap:15px;align-items:center;border-top:1px solid var(--line);margin-top:16px;padding-top:18px;font:13px var(--mono)}input[type=range]{width:100%;accent-color:var(--accent)}.lab-values{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:17px 0 0}.value-cell{border:1px solid var(--line);border-radius:9px;padding:13px}.value-cell small{display:block;color:var(--muted);font-size:10px}.value-cell b{font:500 20px var(--mono);display:block;margin-top:4px}.value-cell span{font:10px var(--mono);color:var(--muted)}.tensor-display{font:13px/1.8 var(--mono);white-space:pre;text-align:center;background:#f1f2e9;padding:13px;border-left:2px solid var(--green);border-right:2px solid var(--green);border-radius:5px;margin:16px 0}.rotation-result{display:flex;gap:16px;align-items:center;margin-top:16px;font:12px/1.9 var(--mono)}.rotation-result svg{width:94px;min-width:94px;height:94px}.compact{font-size:12px;color:var(--muted)}.exam-intro{display:grid;grid-template-columns:1fr 300px;gap:30px;align-items:start}.exam-rules{display:flex;gap:22px;flex-wrap:wrap;margin:25px 0;font-size:13px}.exam-rules b{display:block;font:24px var(--mono)}.exam-bar{display:flex;justify-content:space-between;align-items:center;padding:15px 20px;background:var(--ink);color:var(--paper);border-radius:9px;margin-bottom:20px;font:12px var(--mono);gap:14px}.exam-form{max-width:880px;margin:auto}.exam-result{max-width:900px;margin:auto}.score{font:76px var(--mono);letter-spacing:-5px;line-height:1.2;color:var(--green)}.score small{font-size:22px;letter-spacing:0}.result-row{display:flex;gap:14px;align-items:center;justify-content:space-between;margin:15px 0;border-bottom:1px solid var(--line);padding-bottom:15px;font-size:13px}.result-row b{font-family:var(--mono)}.review-table{width:100%;border-collapse:collapse;font-size:12px}.review-table td,.review-table th{text-align:left;padding:10px 8px;border-bottom:1px solid var(--line);overflow-wrap:anywhere}.review-table th{color:var(--muted);font-weight:500}.review-table .yes{color:var(--green)}.review-table .no{color:var(--accent)}.notebook{display:grid;grid-template-columns:1.35fr .85fr;gap:25px}.reference-list{padding-left:18px;font-size:13px}.reference-list li{margin-bottom:17px}.reference-list a{font-weight:650;text-decoration-color:#a2ad9c;text-underline-offset:3px}.reference-list small{display:block;color:var(--muted);margin-top:4px}.table-wrap{overflow-x:auto}.reference-table{border-collapse:collapse;font-size:13px;width:100%}.reference-table td,.reference-table th{text-align:left;padding:12px 8px;border-bottom:1px solid var(--line)}.reference-table th{font-size:11px;color:var(--muted)}.trophy-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px}.trophy{font-size:11px;padding:13px;border:1px dashed var(--line);border-radius:8px;color:var(--muted)}.trophy span{font:27px Georgia;display:block;color:#929d88}.trophy.earned{background:#f6ead5;border:1px solid #dbc395;color:#6b4b1d}.trophy.earned span{color:var(--accent)}.save-actions{display:flex;gap:8px;flex-wrap:wrap}.save-actions .btn{font-size:12px}.file-label{cursor:pointer}#import-progress{display:none}.empty-state{padding:45px;max-width:760px;margin:30px auto;text-align:center}.empty-state .big-icon{font-size:55px;font-family:Georgia;color:var(--accent);margin-bottom:15px}footer{display:flex;gap:20px;justify-content:space-between;align-items:center;max-width:1304px;margin:auto;padding:25px 48px;border-top:1px solid var(--line);font-size:10px;color:var(--muted)}footer a{text-underline-offset:3px}.footer-dot{margin:0 10px;color:var(--accent)}#toast{position:fixed;bottom:25px;left:50%;transform:translate(-50%,20px);background:var(--ink);color:white;padding:12px 22px;border-radius:10px;font-size:14px;opacity:0;pointer-events:none;transition:.25s;max-width:90vw;z-index:20}#toast.visible{transform:translate(-50%,0);opacity:1}[hidden]{display:none!important}
@media(min-width:1450px){main{padding-top:48px}}@media(max-width:1050px){.topbar{padding:20px 28px;gap:20px}.topbar nav{gap:20px}main{padding:30px 28px 55px}.dashboard-grid{grid-template-columns:1fr 245px;gap:18px}.mission{padding:17px}.hero{gap:22px}.hero-art{min-height:300px}.notebook{grid-template-columns:1fr 1fr}.workbench{grid-template-columns:1.1fr .9fr}.fields{grid-template-columns:1fr}.lab-layout{grid-template-columns:260px 1fr}.lab-values{grid-template-columns:repeat(2,1fr)}.value-cell b{font-size:18px}footer{padding:20px 28px}}@media(max-width:780px){.topbar{flex-wrap:wrap;padding:17px 20px;gap:13px}.brand{font-size:22px}.topbar nav{order:3;width:100%;justify-content:space-between;gap:13px}.topbar nav a{font-size:13px;padding:8px 0}.xp-pill{margin-left:auto;padding:8px 11px}.hero{grid-template-columns:1fr;gap:25px}.hero h1{font-size:51px}.hero-copy p{max-width:100%}.hero-art{min-height:265px}.hero-art svg{height:233px}.dashboard-grid{grid-template-columns:1fr}.dashboard-aside{display:grid;grid-template-columns:1fr 1fr;gap:14px}.side-card{margin:0}.workbench,.lab-layout,.exam-intro,.notebook{grid-template-columns:1fr}.lesson{order:2}.lab-controls .panel{padding:20px}.matrix-inputs{grid-template-columns:repeat(3,1fr)}.fields{grid-template-columns:1fr 1fr}.lab-values{grid-template-columns:repeat(3,1fr)}.exam-intro .side-card{display:none}main{padding:27px 20px 40px}h1{font-size:39px;letter-spacing:-1.4px}.stats-strip{gap:15px;padding:15px}.stats-strip .stat{min-width:62px}.stats-strip b{font-size:19px}.stats-strip span{font-size:10px}.panel{padding:22px}footer{flex-wrap:wrap;padding:20px;font-size:10px;gap:10px}.section-heading>span{display:none}.plot-card{padding:18px}.lab-layout .panel+.panel{margin-top:16px}.page-heading{margin-bottom:23px}}@media(max-width:450px){.mission-grid{gap:10px}.mission{padding:15px 12px;min-height:163px}.mission h3{font-size:15px}.mission p{font-size:11px}.mission-bottom{font-size:9px}.mission-top{margin-bottom:13px}.dashboard-aside{grid-template-columns:1fr}.hero h1{font-size:47px}.hero-actions .btn{font-size:13px;padding:12px 14px}.hero-art{min-height:248px}.hero-art svg{height:220px}.art-label{font-size:8px;padding:12px}.hero-art .art-note{font-size:9px;left:12px}.hero-art .art-sigma{font-size:22px}.fields{grid-template-columns:1fr}.field.wide{grid-column:auto}.stats-strip .stat:nth-child(2){display:none}.stats-strip{margin-bottom:27px}.lab-values{grid-template-columns:repeat(2,1fr)}.value-cell b{font-size:18px}.plot-head{flex-direction:column;gap:4px}.rotation-result{gap:5px;font-size:11px}.step{padding:9px 11px}.score{font-size:64px}.exam-bar{font-size:10px}.review-table{font-size:10px}.review-table td,.review-table th{padding:8px 4px}.empty-state{padding:25px}.formula{font-size:12px}.btn{max-width:100%}.tensor-display{font-size:12px}.task-title{font-size:25px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}@media print{.topbar,footer,.btn,.back,#toast,.exam-bar,.skip{display:none!important}body{background:white;color:black}main{max-width:none;padding:0}.panel{border:0;padding:10px;break-inside:avoid}.panel+.panel{margin-top:12px}.score{font-size:42px}.exam-result{max-width:none}.review-table{font-size:10px}}

main:focus,#feedback:focus{outline:none}

/* QA: visible feedback, keyboard controls and a graph sized to its viewport. */
.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}
h1[tabindex="-1"]:focus{outline:none}
.input-wrap:focus-within,.angle-entry:focus-within{outline:3px solid var(--accent);outline-offset:3px}
.input-wrap input:focus-visible,.angle-entry input:focus-visible{outline:none}
.field-status{display:block;font-size:12px;margin-top:5px;font-weight:600}
.field-status:empty{display:none}.field-status.correct{color:var(--green)}.field-status.incorrect{color:var(--accent)}
.feedback .btn{margin-top:10px}#feedback{scroll-margin-block:20px}
.task-stepper{flex-wrap:wrap}.step.selected.solved{color:var(--paper)}
.slider-row{grid-template-columns:auto minmax(60px,1fr) 92px;gap:12px}
.angle-entry{display:flex;align-items:center;border:1px solid #c8cec2;border-radius:7px;background:white;padding-right:9px}
.angle-entry input{width:100%;min-width:0;padding:10px 8px;background:transparent;color:var(--ink);border:0;border-radius:7px;font:14px var(--mono)}
.angle-entry input[aria-invalid=true]{background:#fff0ea}
.plot-legend{display:flex;gap:8px 18px;flex-wrap:wrap;font:12px/1.7 var(--mono);margin:0 0 14px}
.plot-legend:empty{display:none}.plot-legend span{display:flex;gap:7px;align-items:center}
.plot-legend i{width:9px;height:9px;display:inline-block;border-radius:50%;flex-shrink:0}
@media(max-width:780px){
  .field input,.field select,.matrix-inputs .field input,.lab-controls select,.angle-entry input{font-size:16px;min-height:44px}
  .preset,.step{min-height:44px}.preset{font-size:12px;padding:9px 12px}
  .topbar nav a{min-height:44px;display:flex;align-items:center}
  .plot-caption,.compact,.input-help{font-size:12px}
}
@media(max-width:360px){
  .hero h1{font-size:41px}.mission-grid{grid-template-columns:1fr}
  .art-note{max-width:175px}.art-label{letter-spacing:0}
  .panel{padding:18px}.matrix-inputs{gap:9px}
  .result-row{flex-wrap:wrap}.tensor-display{font-size:11px}
}

.result-row b{white-space:nowrap;flex-shrink:0}
@media(max-width:450px){.result-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px 12px}.result-row a{grid-column:1/-1}.review-table{font-size:12px}}
@media(max-width:360px){.brand{font-size:20px;gap:8px}.brand small{font-size:7px;letter-spacing:1.6px}.brand-mark{width:36px;height:40px;font-size:33px}.xp-pill{padding:7px 9px;font-size:12px}}

/* Structured tensors: true rows and columns, with units outside the brackets. */
.matrix-prose{display:block}
.matrix-equation{display:flex;align-items:center;justify-content:flex-start;gap:12px;max-width:100%;margin:18px 0;overflow-x:auto;font-size:19px;line-height:1.5;white-space:normal;break-inside:avoid}
.matrix-symbol,.matrix-unit{flex-shrink:0;white-space:nowrap}
.matrix-symbol{font-family:Georgia,serif;font-size:1.2em}
.matrix-unit{font-size:.8em;color:var(--muted)}
.matrix-brackets{position:relative;flex-shrink:0;border-left:2px solid currentColor;border-right:2px solid currentColor;padding:3px 6px;color:var(--green)}
.matrix-brackets::before,.matrix-brackets::after{content:"";position:absolute;top:0;bottom:0;width:7px;border-top:2px solid currentColor;border-bottom:2px solid currentColor;pointer-events:none}
.matrix-brackets::before{left:0}.matrix-brackets::after{right:0}
.matrix-table{border-collapse:collapse;border-spacing:0;width:auto;font:inherit;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ink)}
.matrix-table td{border:0;padding:4px 10px;text-align:center;white-space:nowrap}
.matrix-table .matrix-unknown{color:var(--accent);font-weight:700;background:#fff0ea;border-radius:4px}
.formula .matrix-equation{font-size:16px;margin:5px 0}
.formula .matrix-prose{white-space:pre-wrap;margin-top:14px}
.tensor-display{border:0;padding:0;white-space:normal}
.tensor-display .matrix-equation{font-size:14px;margin:18px 0 0;gap:8px}
.tensor-display .matrix-table td{padding:4px 7px}
@media(max-width:480px){
  .matrix-equation{font-size:16px;gap:8px}
  .matrix-table td{padding:4px 7px}
}
@media print{.matrix-equation{overflow:visible}.matrix-brackets{color:black}}

.matrix-equation>:first-child{margin-left:auto}.matrix-equation>:last-child{margin-right:auto}

/* J04 · Laboratoire 3D : scène sombre de banc d'essai, commandes tactiles, jauges. */
:root{--stage:#1c2823;--stage-2:#26362f;--tension:#ff8a5c;--compression:#66b6ff;--shear:#f2c14e}
.nav-short{display:none}
.nocaps{text-transform:none;letter-spacing:.5px}
.lab-intro{display:flex;justify-content:space-between;align-items:end;gap:28px;margin-bottom:26px}
.lab-intro>div:first-child{max-width:720px}.lab-intro p{color:var(--muted);margin-bottom:0}
.lab-switch{display:flex;gap:8px;flex-shrink:0;padding:6px;border:1px solid var(--line);border-radius:14px;background:var(--card)}
.lab-switch a{display:flex;flex-direction:column;padding:10px 16px;border-radius:9px;text-decoration:none;color:var(--muted);min-width:150px;line-height:1.35}
.lab-switch a b{color:var(--ink);font-size:14px}.lab-switch a span{font:11px var(--mono)}
.lab-switch a[aria-current=page]{background:var(--ink)}.lab-switch a[aria-current=page] b{color:var(--paper)}.lab-switch a[aria-current=page] span{color:#c3ceb9}
.lab-switch a:not([aria-current]):hover{background:var(--soft)}
.lab-grid{display:grid;grid-template-columns:292px minmax(0,1fr);gap:22px;align-items:start}
.lab-aside{position:sticky;top:14px;max-height:calc(100vh - 28px);overflow:auto;border-radius:var(--radius);scrollbar-width:thin}
.lab-aside .panel{padding:22px}.lab-aside h2{font-size:19px}
.lab-aside select{width:100%;padding:10px;border:1px solid var(--line);border-radius:7px;background:white;margin:8px 0 16px;color:var(--ink)}
.lab-main{min-width:0}
.lab-views{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:18px;align-items:start}
.stage3d{background:radial-gradient(120% 90% at 30% 20%,var(--stage-2),var(--stage));color:#eef0e6;border-radius:var(--radius);padding:18px 18px 14px;min-width:0;box-shadow:inset 0 0 0 1px #33463d}
.stage3d .eyebrow{color:#9fb09d;margin-bottom:6px}.stage3d h2{color:#fbfaf3;font-size:21px;margin:0}
.stage-head{display:flex;justify-content:space-between;gap:12px;align-items:start;flex-wrap:wrap;margin-bottom:10px}
.view-buttons{display:flex;gap:6px;flex-wrap:wrap}
.view-buttons button,.real-scale{border:1px solid #4a6155;background:#23332c;color:#dfe6d8;border-radius:20px;padding:6px 11px;font:600 11px var(--mono)}
.view-buttons button:hover,.real-scale:hover{background:#2f443a}
.stage-canvas{position:relative;border-radius:12px;overflow:hidden;background-image:linear-gradient(#ffffff08 1px,transparent 1px),linear-gradient(90deg,#ffffff08 1px,transparent 1px);background-size:28px 28px}
#element-3d{display:block;width:100%;height:auto;aspect-ratio:1/1;max-height:560px;cursor:grab;touch-action:none;border-radius:12px}
#element-3d.dragging{cursor:grabbing}#element-3d.on-handle{cursor:pointer}
#element-3d:focus-visible{outline:3px solid var(--tension);outline-offset:-3px}
.stage-badges{position:absolute;top:10px;left:10px;display:flex;gap:6px;flex-wrap:wrap;align-items:center;max-width:calc(100% - 20px)}
.stage-badges,.stage-legend{pointer-events:none}.stage-badges button{pointer-events:auto}
.amp-badge{font:600 11px var(--mono);background:#101a16cc;border:1px solid #3d5247;color:#f2c14e;border-radius:20px;padding:5px 10px}
.amp-badge.real{color:#9fcf8f}.real-scale[aria-pressed=true]{background:#f2c14e;color:var(--ink);border-color:#f2c14e}
.stage-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:10px;font:10.5px/1.6 var(--mono);color:#cfd8cb}
.stage-legend:empty{display:none}.stage-legend span{display:inline-flex;gap:5px;align-items:center}
.lg{display:inline-block;width:14px;height:3px;border-radius:2px}.lg.tension{background:var(--tension)}.lg.compression{background:var(--compression)}.lg.shear{background:var(--shear)}.lg.vector{background:#fbfaf3}.lg.ghost{background:none;border-top:2px dashed #e0e5d8;height:0}
.scale-note{color:#9fb09d}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.chip{border:1px solid #4a6155;background:transparent;color:#cdd6c9;border-radius:20px;padding:6px 12px;font:600 11px/1.3 LocalSans,system-ui,sans-serif}
.chip[aria-pressed=true]{background:#e9eee1;color:var(--ink);border-color:#e9eee1}
.chip[aria-pressed=true]::before{content:"✓ ";color:var(--green)}
.tensor-panel .chip{border-color:var(--line);color:var(--ink)}.tensor-panel .chip[aria-pressed=true]{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.tensor-panel .chip[aria-pressed=true]::before{color:#e6b672}
.plot-card{min-width:0}
#mohr-svg .mohr-handle{cursor:grab}#mohr-svg.dragging,#mohr-svg.dragging .mohr-handle{cursor:grabbing}
#mohr-svg{touch-action:pan-y}
.plot-legend i.zone{background:#bb40231f;border:1px solid #bb402366;border-radius:3px}
.plot-legend i.hollow{background:var(--card);border:2px solid #bb4023}.plot-legend i.hollow.grey{border-color:#65726b}
.orientation{border-top:1px solid var(--line);margin-top:14px;padding-top:14px}
.orientation .eyebrow{margin-bottom:6px}.orientation>.compact{margin-bottom:6px}
.orientation .slider-row{border:0;margin-top:4px;padding-top:6px}
.orientation #align{margin-top:12px}
.rotation-result{font:12px/1.9 var(--mono);border-top:1px solid var(--line);padding-top:12px}
.slider-stack{display:grid;gap:12px;margin-bottom:6px}
.slide-field{display:grid;grid-template-columns:42px minmax(0,1fr);align-items:center;gap:4px 10px}
.slide-field label{font:italic 17px Georgia,serif;color:var(--ink)}
.slide-field .input-wrap{display:flex;align-items:center;border:1px solid #c8cec2;background:white;border-radius:7px;overflow:hidden}
.slide-field input[type=text]{width:100%;min-width:0;border:0;background:transparent;padding:8px 9px;font:14px var(--mono);color:var(--ink)}
.slide-field input[aria-invalid=true]{background:#fff0ea}
.slide-field .unit{padding-right:9px;font:11px var(--mono);color:var(--muted);white-space:nowrap}
.slide-field .slide{grid-column:2}
.material-row{border-top:1px solid var(--line);margin-top:14px;padding-top:12px}
.material-row .input-wrap{display:flex;align-items:center;border:1px solid #c8cec2;background:white;border-radius:7px;margin-top:7px}
.material-row .input-wrap input{width:100%;border:0;background:transparent;padding:9px;font:14px var(--mono);color:var(--ink)}
.material-row .unit{padding-right:9px;font:11px var(--mono);color:var(--muted)}
.lab-note{margin-top:14px}
.restraint{border:0;padding:0;margin:14px 0 4px;display:flex;flex-wrap:wrap;gap:7px}
.restraint legend{font-size:12px;font-weight:650;margin-bottom:8px;padding:0}
.radio-chip{position:relative;display:inline-flex}
.radio-chip input{position:absolute;opacity:0;inset:0;margin:0;cursor:pointer}
.radio-chip span{border:1px solid var(--line);border-radius:20px;padding:7px 12px;font-size:12px;background:var(--paper)}
.radio-chip input:checked+span{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.radio-chip input:focus-visible+span{outline:3px solid var(--accent);outline-offset:3px}
.presets .preset[data-preset=fillet]{border-color:#e0b39f;background:#fbeee6}
.lab-under{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:18px;margin-top:18px;align-items:start}
.lab-under .panel+.panel{margin-top:0}
.matrices{display:flex;flex-wrap:wrap;gap:0 26px;align-items:center}
.matrices .tensor-display{margin:0}.tensor-display.rotated .matrix-brackets{color:var(--accent)}
#tensor-note{margin:10px 0 0}
.weld-chip{margin-top:14px}
.weld-panel{margin-top:14px;padding:16px;border-radius:12px;background:#fbf3ec;border:1px solid #ecd2c1}
.weld-values{display:flex;flex-wrap:wrap;gap:6px 16px;font:600 14px var(--mono);margin:8px 0 12px}
.weld-verdict{font-weight:650;margin:10px 0 0;font-size:13px}.weld-verdict[data-pass=true]{color:var(--green)}.weld-verdict[data-pass=false]{color:var(--accent)}
.hud .eyebrow{margin-bottom:10px}
.gauge{margin-bottom:14px}
.gauge-head{display:flex;justify-content:space-between;gap:10px;font-size:13px}.gauge-head b{font:600 14px var(--mono)}
.gauge-track{position:relative;height:9px;border-radius:9px;background:#e7e9df;margin:6px 0 4px;overflow:visible}
.gauge-track span{display:block;height:100%;border-radius:9px;background:var(--green);transition:width .15s}
.gauge[data-level=warn] .gauge-track span{background:#d59a2c}.gauge[data-level=over] .gauge-track span{background:var(--accent)}
.gauge-track i{position:absolute;top:-4px;bottom:-4px;width:2px;background:var(--ink);border-radius:2px}
.gauge small,.hud-line small{display:block;font-size:11px;color:var(--muted)}
.hud-line{border-top:1px solid var(--line);padding-top:10px;margin-top:10px;font-size:13px}
.hud-line b{display:block;font:500 13px/1.6 var(--mono);overflow-wrap:anywhere}
.observe{margin-top:18px}.observe .insight{display:block;color:var(--accent);margin-bottom:6px}
.lab-page .lab-values,.story-page .lab-values{margin-top:18px}

/* J05 · Mode histoire : hub d'épisodes, mission, suivi d'objectif. */
.story-hub .stats-strip{margin-bottom:30px}
.act{margin-bottom:30px}
.act-head{display:flex;gap:18px;align-items:baseline;margin-bottom:14px;border-bottom:1px solid var(--line);padding-bottom:10px}
.act-head h2{margin:0}.act-head p{margin:2px 0 0;color:var(--muted);font-size:13px}
.act-number{font:600 12px var(--mono);letter-spacing:2px;color:var(--accent);white-space:nowrap}
.episode-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.episode-card{display:flex;flex-direction:column;gap:4px;text-align:left;border:1px solid var(--line);background:var(--card);border-radius:12px;padding:16px;color:var(--ink);min-height:150px;transition:transform .15s,border-color .15s}
.episode-card:hover:not(:disabled){transform:translateY(-3px);border-color:var(--green)}
.episode-card h3{font-size:16px;margin:6px 0 0}.episode-card p{font-size:12px;color:var(--muted);margin:0}
.episode-card.current{border-color:var(--accent);box-shadow:inset 0 3px var(--accent)}
.episode-card.done{background:#f3f6ee;border-color:#c9d8bf}
.episode-card:disabled{opacity:.6}
.episode-top{display:flex;justify-content:space-between;gap:8px}
.episode-num{font:11px var(--mono);color:var(--muted)}.episode-stars{color:var(--accent);letter-spacing:2px;font-size:13px}
.episode-status{margin-top:auto;padding-top:10px;font-size:11px;color:var(--muted)}
.story-note{max-width:760px}
.story-page .back{margin-bottom:18px}
.story-mission{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;margin-bottom:16px}
.story-mission h1{font-size:30px;letter-spacing:-1px;margin-bottom:4px}.mission-place{font:12px/1.5 var(--mono);color:var(--muted);margin:0 0 16px}
.briefing{display:flex;gap:12px;align-items:start;font-size:14px;line-height:1.65;margin-bottom:18px}
.briefing p:last-child{margin-bottom:0}
.mentor{flex-shrink:0;display:grid;place-items:center;width:46px;height:46px;border-radius:14px 14px 14px 3px;background:var(--green);color:var(--paper);font:italic 26px Georgia,serif}
.mentor-name{font:600 11px var(--mono);letter-spacing:1px;color:var(--muted);margin-bottom:6px;text-transform:uppercase}
.objectives h2{font-size:18px;margin-bottom:10px}
.goals{list-style:none;padding:0;margin:0;display:grid;gap:8px}
.goal{display:flex;gap:10px;align-items:start;padding:10px 12px;border:1px solid var(--line);border-radius:10px;font-size:14px;line-height:1.5;color:var(--muted);transition:background .2s,border-color .2s}
.goal-mark{flex-shrink:0;display:grid;place-items:center;width:24px;height:24px;border-radius:50%;border:1.5px solid currentColor;font:600 12px var(--mono)}
.goal.current{color:var(--ink);border-color:var(--accent);background:#fff6f1}
.goal.done{color:var(--green);border-color:#c9d8bf;background:#f1f6ec}
.goal.done .goal-mark{background:var(--green);border-color:var(--green);color:var(--paper);font-size:0}
.goal.done .goal-mark::after{content:"✓";font-size:13px}
.mission-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.instruments{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:16px}
.instrument{background:var(--stage);color:#eef0e6;border-radius:10px;padding:11px 13px}
.instrument small{display:block;color:#9fb09d;font:11px var(--mono)}
.instrument b{display:block;font:500 20px var(--mono);color:#f2c14e;margin-top:3px}
.instrument span{font:10px var(--mono);color:#9fcf8f}
.episode-success{position:relative;overflow:hidden;margin-bottom:16px;padding:26px;border-radius:var(--radius);background:linear-gradient(135deg,#f6ead5,#eef3e6);border:1px solid #dbc395}
.episode-success:focus{outline:none}.episode-success h2{font-size:28px}
.episode-success .debrief{background:#fffef9cc;border-radius:12px;padding:16px 18px;margin-top:14px;font-size:14px;line-height:1.75}
.episode-success .debrief h3{font-size:15px}
.success-burst{position:absolute;right:48px;top:44px;width:0;height:0}
.success-burst i{position:absolute;width:7px;height:7px;border-radius:2px;background:var(--accent);transform:rotate(var(--a)) translateY(0);animation:burst 1.1s cubic-bezier(.2,.7,.3,1) forwards;opacity:0}
.success-burst i:nth-child(3n){background:#e6b672}.success-burst i:nth-child(3n+1){background:var(--green)}
@keyframes burst{0%{opacity:1;transform:rotate(var(--a)) translateY(0) scale(1)}100%{opacity:0;transform:rotate(var(--a)) translateY(calc(-60px - var(--d)*18px)) scale(.6)}}
.quest-tracker{margin-top:12px;display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 12px;align-items:center;background:var(--ink);color:var(--paper);border-radius:14px;padding:11px 16px;box-shadow:0 10px 30px #1c28234d}
.quest-step{font:600 11px var(--mono);color:#e6b672;white-space:nowrap}
.quest-text{font-size:13px;line-height:1.4}
.quest-bar{grid-column:1/-1;height:5px;border-radius:5px;background:#3c4d45;overflow:hidden}
.quest-bar i{display:block;height:100%;width:0;background:#e6b672;border-radius:5px;transition:width .2s}
.quest-feedback{grid-column:1/-1;font-size:12px;color:#ffb89a}.quest-feedback:empty{display:none}
.quest-tracker.complete{background:var(--green)}.quest-tracker.complete .quest-bar i{background:#fffef9}
.story-card{background:linear-gradient(160deg,#3a2a22,#26342f)}
.story-card .eyebrow{color:#f2c3a6}.story-card .btn{width:100%;margin-top:4px}

.story-grid{grid-template-columns:340px minmax(0,1fr)}
.story-grid .lab-aside{scrollbar-gutter:stable}
.story-grid .lab-controls .eyebrow:first-child{color:var(--accent)}
.control-deck{margin-bottom:16px;padding:18px 20px}
.control-deck .slider-stack{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px 22px}
.control-deck>.slide-field{max-width:520px;margin-bottom:10px}
.control-deck .orientation{margin-top:10px;padding-top:10px}.control-deck .orientation>.compact{display:none}
.control-deck .orientation .slider-row{max-width:560px}
.control-deck .restraint{margin-top:10px}
@media(max-width:1180px){.lab-views{grid-template-columns:1fr}.episode-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1050px){.lab-grid{grid-template-columns:260px minmax(0,1fr)}.lab-under{grid-template-columns:1fr}
  .story-grid{display:flex;flex-direction:column;gap:16px;align-items:stretch}.story-grid .lab-aside,.story-grid .lab-main,.story-grid .lab-views{display:contents}
  .story-grid .story-mission{order:1;margin:0}.story-grid .episode-success{order:2;margin:0}.story-grid .stage3d{order:3}.story-grid .instruments{order:4;margin:0}.story-grid .lab-controls{order:5}.story-grid .plot-card{order:6}.story-grid .lab-under{order:7;margin:0}.story-grid .lab-values{order:8;margin:0}.story-grid .observe{order:9;margin:0}
  .story-page{padding-bottom:110px}
  .quest-tracker{position:fixed;left:50%;bottom:calc(12px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);z-index:15;width:min(620px,calc(100vw - 24px));margin:0}
  body:has(.quest-tracker) #toast{bottom:calc(110px + env(safe-area-inset-bottom,0px))}
}
@media(max-width:780px){
  .lab-intro{flex-direction:column;align-items:stretch}.lab-switch a{min-width:0;flex:1}
  .lab-grid{display:flex;flex-direction:column;gap:16px;align-items:stretch}.lab-main,.lab-views{display:contents}
  .stage3d{order:1}.plot-card{order:2}.lab-aside{order:3;position:static;max-height:none;overflow:visible}.lab-under{order:4;margin-top:0}.lab-grid .lab-values{order:5;margin-top:0}.lab-grid .observe{order:6;margin-top:0}
  .lab-views{gap:16px}.stage3d{padding:14px 12px 12px}
  .slide-field input[type=text],.material-row .input-wrap input,.lab-aside select{font-size:16px;min-height:44px}
  .view-buttons button,.real-scale,.chip,.radio-chip span{min-height:40px;display:inline-flex;align-items:center}
  .episode-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .story-mission{padding:20px}.story-mission h1{font-size:28px}
  .act-head{flex-direction:column;gap:2px}
}
@media(max-width:560px){#element-3d{max-height:62vh}.instruments{grid-template-columns:repeat(2,minmax(0,1fr))}.instrument b{font-size:17px}
  .stage3d .chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;margin-right:-12px;padding-right:12px;-webkit-mask-image:linear-gradient(90deg,#000 85%,transparent);mask-image:linear-gradient(90deg,#000 85%,transparent)}.stage3d .chip{flex-shrink:0}}
@media(max-width:450px){.episode-grid{grid-template-columns:1fr}.episode-card{min-height:0}.quest-tracker{padding:10px 12px}.quest-text{font-size:12px}.lab-switch{padding:4px}.lab-switch a{padding:8px 10px}}
@media(max-width:400px){.topbar nav .nav-long{display:none}.topbar nav .nav-short{display:inline}}
@media(prefers-reduced-motion:reduce){.success-burst{display:none}}
@media print{.quest-tracker,.stage3d,.lab-aside{display:none!important}}
.lab-aside,.story-grid .lab-aside{position:sticky}
@media(max-width:780px){.lab-aside{position:static}}

/* Polices de repli plus larges (Linux, Android) : la navigation passe à la ligne au lieu de déborder. */
@media(max-width:780px){.topbar nav{flex-wrap:wrap;row-gap:0}.topbar nav a{white-space:nowrap}}
@media(max-width:360px){.topbar nav{gap:0 10px;justify-content:space-around}.topbar nav a{font-size:12.5px}}
