:root{--bg: #0b0d12;--panel: rgba(var(--fg), .035);--panel-2: rgba(0, 0, 0, .28);--line: rgba(var(--fg), .08);--line-2: rgba(var(--fg), .22);--text: #e9ecf2;--text-2: #c9cfdc;--muted: #8b93a7;--accent: #f08a5d;--accent-soft: rgba(var(--accent-rgb), .12);--cyan: #6fb7c9;--cyan-soft: rgba(var(--cyan-rgb), .1);--ok: #7bd88f;--warn: #f0c05d;--r-sm: 8px;--r-md: 12px;--r-lg: 16px;--t: .18s ease-out;--mono: "JetBrains Mono", ui-monospace, monospace;--fg: 255, 255, 255;--accent-rgb: 240, 138, 93;--cyan-rgb: 111, 183, 201;--ok-rgb: 123, 216, 143;--warn-rgb: 240, 192, 93;--on-accent: #0b0d12}*{box-sizing:border-box}html,body{margin:0;background:var(--bg);color:var(--text);font-family:Heebo,system-ui,sans-serif;font-weight:300;font-size:15px}body{min-height:100vh;background:radial-gradient(900px 500px at 85% -10%,rgba(var(--accent-rgb),.1),transparent 60%),radial-gradient(800px 500px at 10% 110%,rgba(var(--cyan-rgb),.1),transparent 60%),var(--bg)}.wrap{max-width:1320px;margin:0 auto;padding:18px 20px 40px}button{font:inherit;cursor:pointer;color:inherit}button:disabled{cursor:default;opacity:.4}button:focus-visible,input:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}svg.i{width:18px;height:18px;flex:none}.accent{color:var(--accent)}.ok{color:var(--ok)}.warn{color:var(--accent)}header{display:flex;align-items:center;gap:18px;padding:10px 4px 18px;flex-wrap:wrap}.logo{display:flex;align-items:center;gap:10px;font-weight:700;font-size:18px}.logo i{width:28px;height:28px;border-radius:8px;background:conic-gradient(from 90deg,var(--accent),var(--cyan),var(--accent))}.logo small{font-weight:300;color:var(--muted);margin-inline-start:6px}.hero{order:1;flex-basis:100%;margin:0;color:var(--text-2);font-size:15px;line-height:1.5}.steps{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}.steps span{display:flex;align-items:center;gap:6px}.steps b{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:500;border:1px solid var(--line-2)}.steps .on{color:var(--text)}.steps .on b{background:var(--accent);border-color:transparent;color:var(--on-accent)}.steps .sep{width:28px;height:1px;background:var(--line-2)}.modes{display:flex;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:4px;gap:2px;margin-inline-start:auto}.modes button{border:0;background:transparent;color:var(--muted);padding:8px 16px;min-height:44px;border-radius:999px;font-size:14px;display:flex;align-items:center;gap:7px;transition:background var(--t),color var(--t)}.modes button:hover{color:var(--text)}.modes button.on{background:rgba(var(--fg),.09);color:var(--text);font-weight:500}.grid{display:grid;grid-template-columns:280px 1fr 320px;gap:16px}.grid>*{min-width:0}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg)}.card h4{margin:0;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);font-weight:500}.pad{padding:16px}.col{display:flex;flex-direction:column}.field{margin-top:16px}.field>label{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}.hint{font-size:12px;color:var(--muted);margin:6px 0 0;line-height:1.5}.tools{display:grid;grid-template-columns:repeat(auto-fit,minmax(52px,1fr));gap:8px;margin-top:12px}.tool{height:48px;border-radius:var(--r-md);border:1px solid var(--line);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;font-size:11px;color:var(--muted);transition:background var(--t),border-color var(--t),color var(--t)}.tool:hover{background:rgba(var(--fg),.05);border-color:var(--line-2);color:var(--text)}.tool.on{background:var(--accent-soft);border-color:rgba(var(--accent-rgb),.4);color:var(--text)}.range{display:flex;align-items:center;gap:10px}.range input[type=range]{flex:1;accent-color:var(--accent);min-height:44px;margin:0}.range .v{font-family:var(--mono);font-size:12px;min-width:40px;direction:ltr;text-align:left}.caption{display:flex;gap:8px}.caption input{flex:1;min-width:0;height:48px;border-radius:var(--r-md);border:1px solid var(--line);background:var(--panel-2);color:var(--text);padding:0 14px;font:inherit;font-size:18px;font-weight:400}.caption input::placeholder{color:var(--muted)}.presets,.chips{display:flex;flex-wrap:wrap;gap:6px}.presets button{border:1px solid var(--line);background:transparent;color:var(--text-2);border-radius:999px;padding:0 14px;min-height:44px;font-size:13px;transition:background var(--t),border-color var(--t)}.presets button:hover{background:rgba(var(--fg),.06);border-color:var(--line-2)}.chip-btn{min-width:44px;height:44px;padding:0 10px;border-radius:var(--r-sm);border:1px solid var(--line);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1;color:var(--muted);transition:background var(--t),border-color var(--t),color var(--t)}.chip-btn b{font-size:18px;font-weight:500}.chip-btn small{font-family:var(--mono);font-size:9px;margin-top:3px}.chip-btn.done{color:var(--text);border-color:rgba(var(--ok-rgb),.4)}.chip-btn.done small{color:var(--ok)}.chip-btn.now{background:var(--accent-soft);border-color:rgba(var(--accent-rgb),.5);color:var(--text)}.stage{position:relative;display:flex;flex-direction:column;overflow:hidden;min-height:560px}@media (min-width: 1101px){.stage.sticky{align-self:start;position:sticky;top:16px;height:min(820px,calc(100vh - 32px))}}.stage-view{position:relative;flex:1;display:flex;flex-direction:column;min-height:0}.stage-input{padding:12px 12px 0}.save{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.save .ghost{border-color:rgba(var(--accent-rgb),.45);color:var(--text)}.save .ghost:hover{background:var(--accent-soft)}.stage-svg{width:100%;flex:1;display:block;touch-action:none;cursor:crosshair}.stage-svg .axis{stroke:rgb(var(--fg));stroke-opacity:.14;stroke-width:.25}.stage-svg .ticks line{stroke:rgb(var(--fg));stroke-opacity:.2;stroke-width:.25}.stage-svg .axis-labels text{font-family:var(--mono);font-size:2.2px;fill:var(--muted)}.stage-svg .ghost path{fill:none;stroke:rgb(var(--fg));stroke-opacity:.12;stroke-width:.3}.stage-svg .strokes path{fill:none;stroke:var(--text);stroke-width:.6;stroke-linecap:round;stroke-linejoin:round}.stage-svg .done path{fill:none;stroke:var(--accent);stroke-width:.6;stroke-linecap:round;stroke-linejoin:round}.stage-svg .circles circle{fill:none;stroke:var(--cyan);stroke-width:.22;stroke-opacity:.8;cursor:pointer;transition:stroke var(--t)}.stage-svg .circles circle.hot{stroke:var(--accent);stroke-width:.45;stroke-opacity:1}.stage-svg .arm{fill:none;stroke:var(--text);stroke-width:.25;stroke-opacity:.9}.stage-svg .trace{fill:none;stroke:var(--accent);stroke-width:.7;stroke-linecap:round}.stage-svg .tip{fill:#fff}.hud{position:absolute;top:14px;inset-inline:14px;display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:12px;color:var(--muted);pointer-events:none;z-index:2}.chip{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 10px;font-family:var(--mono);direction:ltr}.chip:empty{display:none}.chip b{color:var(--ok);font-weight:600}.chip.amber{border-color:rgba(var(--warn-rgb),.5)}.chip.amber b{color:var(--warn)}.chip.ok{border-color:rgba(var(--ok-rgb),.5)}.empty{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;pointer-events:none;text-align:center;color:var(--muted);font-size:15px;line-height:1.7;transition:opacity var(--t);z-index:1}.empty.hide{opacity:0}.empty b{display:block;color:var(--text);font-weight:500;font-size:20px}.bar{display:flex;align-items:center;gap:10px;padding:12px 16px;border-top:1px solid var(--line);flex-wrap:wrap}.bar .speed{font-size:12px;color:var(--muted);gap:6px}.bar .speed input{width:90px;flex:none}.ghost{height:44px;padding:0 14px;border-radius:var(--r-md);border:1px solid var(--line);background:transparent;display:flex;align-items:center;gap:8px;font-size:14px;color:var(--text-2);transition:background var(--t)}.ghost:hover:not(:disabled){background:rgba(var(--fg),.06)}.prog{font-size:13px;color:var(--muted)}.cta{height:44px;padding:0 18px;border-radius:var(--r-md);border:0;background:var(--accent);color:var(--on-accent);font-weight:500;font-size:15px;display:flex;align-items:center;gap:8px;transition:filter var(--t)}.cta:hover:not(:disabled){filter:brightness(1.08)}.cta:disabled{background:rgba(var(--fg),.1);color:var(--muted);opacity:1}.bar .cta{margin-inline-start:auto}.tabs{display:flex;gap:4px;margin-top:10px;background:var(--panel-2);padding:3px;border-radius:var(--r-sm)}.tabs button{flex:1;border:0;background:transparent;color:var(--muted);border-radius:6px;padding:6px;min-height:44px;font-size:12px;transition:background var(--t),color var(--t)}.tabs button.on{background:rgba(var(--fg),.09);color:var(--text)}.eqs{display:flex;flex-direction:column;gap:6px;margin-top:10px}.eq{display:grid;grid-template-columns:14px 1fr auto;gap:8px;align-items:center;padding:8px 10px;border-radius:var(--r-sm);background:var(--panel-2);border:1px solid transparent;font-family:var(--mono);font-size:12px;color:var(--text-2);cursor:pointer;transition:border-color var(--t),background var(--t)}.eq:hover,.eq.hot{background:var(--accent-soft);border-color:rgba(var(--accent-rgb),.35)}.eq .dot{width:8px;height:8px;border-radius:50%;background:var(--cyan)}.eq .f{direction:ltr;text-align:left}.eq .f b{color:var(--accent);font-weight:600}.eq .meta{font-size:11px;color:var(--muted);font-family:Heebo,sans-serif;white-space:nowrap}.eq.wait{color:var(--muted);background:transparent;border:1px dashed var(--line);cursor:default;grid-template-columns:1fr}.xy{margin-top:10px;padding:10px;border-radius:var(--r-sm);background:var(--panel-2);font-family:var(--mono);font-size:11.5px;direction:ltr;text-align:left;color:var(--text-2);line-height:1.7;white-space:pre;overflow-x:auto}.xy b{color:var(--text);font-weight:600}.stats{margin-top:14px}.stat{display:flex;justify-content:space-between;align-items:baseline;padding:10px 0;border-bottom:1px solid var(--line);font-size:14px;color:var(--text-2)}.stat b{font-family:var(--mono);font-weight:500;color:var(--text);direction:ltr}.sum{margin-top:16px}.sum h4{margin-bottom:6px}.row{display:flex;justify-content:space-between;padding:6px 0;font-size:13px;color:var(--text-2)}.row b{font-family:var(--mono);font-weight:500;color:var(--text);direction:ltr}.row.total{border-top:1px solid var(--line);margin-top:4px;padding-top:10px;color:var(--text)}.opt-bar{margin-top:10px;height:6px;border-radius:3px;background:rgba(var(--fg),.1);overflow:hidden}.opt-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--cyan),var(--ok));transition:width .4s ease-out}.tip{margin-top:auto;padding:12px;border-radius:var(--r-md);background:var(--cyan-soft);border:1px solid rgba(var(--cyan-rgb),.25);font-size:13px;line-height:1.6;color:var(--text-2)}.tip b{color:var(--cyan);font-weight:500}.s3d{cursor:grab}.s3d:active{cursor:grabbing}.s3d .axes3 text,.d3 .axes3 text{font-family:var(--mono);font-size:2.6px;fill:var(--muted);text-anchor:middle}.s3d .axis,.d3 .axis{stroke-width:.3}.s3d .ax-y,.d3 .ax-y{stroke-opacity:.35}.s3d .ax-z,.d3 .ax-z{stroke-dasharray:1.2 1}.d3 .mesh path{fill:none;stroke:var(--cyan);stroke-width:.2;stroke-opacity:.5}.s3d .mesh path{stroke:var(--bg);stroke-width:.1;stroke-opacity:.55;stroke-linejoin:round}.d3 .rings path{fill:none;stroke:var(--cyan);stroke-width:.16;stroke-opacity:.28}.s3d .cur{fill:none;stroke:var(--accent);stroke-width:.6;stroke-linejoin:round}.s3d .disks path{fill:none;stroke:var(--ok);stroke-width:.2;stroke-opacity:.7}.row.v b{color:var(--accent)}.opts{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-top:10px}.opts button{min-height:48px;border-radius:var(--r-md);border:1px solid var(--line);background:transparent;color:var(--text);font-size:18px;transition:background var(--t),border-color var(--t)}.opts button:hover:not(:disabled){background:rgba(var(--fg),.06);border-color:var(--line-2)}.opts button.right{border-color:rgba(var(--ok-rgb),.6);background:rgba(var(--ok-rgb),.12);opacity:1}.opts button.wrong{text-decoration:line-through}.acts{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.verdict{margin-top:10px;font-size:13px;line-height:1.6;color:var(--text-2)}.d3.orbit{cursor:grab}.d3 .floor path{stroke:rgb(var(--fg));stroke-opacity:.07;stroke-width:.25}.d3 .ln{fill:none;stroke:var(--accent);stroke-width:.7;stroke-linecap:round;stroke-linejoin:round}.d3 .ghostl{fill:none;stroke:rgb(var(--fg));stroke-opacity:.16;stroke-width:.45}.d3 .bk{stroke-opacity:.18;stroke-dasharray:.8 .8}.d3 .pad{fill:rgb(var(--fg));fill-opacity:.03;stroke:rgb(var(--fg));stroke-opacity:.12;stroke-width:.3}.d3 .lathe-axis{stroke-dasharray:1.5 1;stroke-opacity:.4}.d3 .sphere{fill:rgb(var(--fg));fill-opacity:.03;stroke:rgb(var(--fg));stroke-opacity:.25;stroke-width:.3}.d3 .wire{fill:none;stroke:var(--cyan);stroke-opacity:.35;stroke-width:.18}.d3 .face{fill:var(--accent);fill-opacity:.14;stroke:var(--accent);stroke-width:.55;stroke-linejoin:round}.d3 .face.far{fill-opacity:.05;stroke-opacity:.45}.d3 .edge path{stroke:var(--accent);stroke-opacity:.45;stroke-width:.25}.d3 .ell path{fill:none;stroke:var(--cyan);stroke-width:.2;stroke-opacity:.7}.d3-info .eq3{font-family:var(--mono);font-size:12px;color:var(--text);background:var(--panel-2);border-radius:var(--r-sm);padding:8px 10px;margin:8px 0;direction:ltr;text-align:left}.d3-info p{color:var(--text-2);font-size:13px;line-height:1.6}.mat{display:inline-grid;gap:2px 12px;padding:4px 9px;border-inline:1.5px solid var(--muted);border-radius:7px;font-family:var(--mono);font-size:12px;color:var(--text);text-align:right;direction:ltr;vertical-align:middle}.mat .dim{color:var(--muted);opacity:.55}.mat-line{direction:ltr;text-align:left;font-family:var(--mono);font-size:13px;color:var(--text-2);margin:8px 0}.mx{border-top:1px solid var(--line);margin-top:12px;padding-top:10px}.ell-row{display:flex;align-items:center;gap:8px;direction:ltr;padding:6px 8px;border-radius:var(--r-sm);border:1px solid transparent;font-family:var(--mono);font-size:12px;color:var(--text-2);cursor:pointer;transition:border-color var(--t),background var(--t)}.ell-row:hover{border-color:var(--accent);background:var(--accent-soft)}.ell-row .k{min-width:42px;color:var(--accent)}.mat-edit{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;direction:ltr;margin:6px 0 10px;padding:6px 10px;border-inline:2px solid var(--muted);border-radius:10px}.mat-edit input{width:100%;min-height:40px;text-align:center;font-family:var(--mono);font-size:14px;background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:var(--r-sm)}.hint.warn{color:var(--amber, #f5b74e)}.d3 .sface{fill:var(--accent);fill-opacity:.07;stroke:none}.d3 .sedge path{fill:none;stroke:var(--accent);stroke-width:.5;stroke-linejoin:round}.d3 .svert circle{fill:var(--text)}.d3 .hedgehog .spine{stroke:var(--cyan);stroke-width:.3;stroke-linecap:round}.d3 .eigl line{stroke:#ffd43b;stroke-width:.6;stroke-dasharray:2 1}.d3 .eigl text{font-family:var(--mono);font-size:2.6px;fill:#ffd43b}.eig-row{display:flex;align-items:center;gap:8px;direction:ltr;margin:6px 0;font-family:var(--mono);font-size:12px;color:var(--text-2);flex-wrap:wrap}.eig-row .k{color:#ffd43b;min-width:70px}.angs{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0;direction:ltr}.ang{font-family:var(--mono);font-size:12px;color:var(--text);background:var(--panel-2);border-radius:999px;padding:3px 10px}.ang small{color:var(--muted)}.d3 .pedge{stroke:#ffd43b;stroke-width:.7;stroke-linecap:round}.d3 .pedge.sel{stroke-width:1.1}.d3 .pvert{fill:#ffd43b}.d3 .parc path{fill:none;stroke-width:.7}.d3 .parc text{font-family:var(--mono);font-size:2.8px;text-anchor:middle;dominant-baseline:middle;fill:var(--text)}.d3 .parc.c0 path{stroke:#e0457b}.d3 .parc.c1 path{stroke:#4a6cf7}.d3 .parc.c2 path{stroke:#2bb673}.d3 .parc.c3 path{stroke:#f08a5d}.d3 .parc.c4 path{stroke:#9b5de5}.d3 .parc.hot path{stroke-width:1.4}.d3 .parc.hot text{font-size:3.6px;font-weight:700}.unfold{width:100%;max-width:260px;display:block;margin:6px auto;color:var(--text-2)}.unfold text{font-family:var(--mono);font-size:11px;fill:var(--text);text-anchor:middle;dominant-baseline:middle}.unfold text.gap{fill:var(--muted)}.mx h4.sub{margin-top:12px;font-size:13px}.corner-card{display:flex;align-items:center;gap:10px;padding:8px;margin:6px 0;border-radius:var(--r-sm);border:1px solid var(--line);border-inline-start:3px solid var(--c, var(--accent));color:var(--text-2)}.corner-card:hover{background:var(--panel-2)}.true-ang{width:64px;flex:none;color:var(--text)}.corner-val{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.corner-val .deg{font-family:var(--mono);font-size:16px;color:var(--text)}.calc{direction:ltr;text-align:left;font-family:var(--mono);font-size:11px;color:var(--muted);line-height:1.6;margin-top:4px}.guess{display:inline-flex;gap:6px}.guess input{width:70px;min-height:36px;text-align:center;font-family:var(--mono);background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:var(--r-sm)}.guess button{min-height:36px;padding:0 12px;border-radius:999px;border:1px solid var(--accent);background:var(--accent-soft);color:var(--text)}.fb{font-size:12px;color:var(--muted)}.fb.ok{color:#51cf66}.fb.near{color:#ffd43b}.guess-mode{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2);margin:6px 0;min-height:32px}.d3 .turn{fill:none;stroke:var(--accent);stroke-width:.8;stroke-linejoin:round}.d3 .ell path.hot{stroke:var(--accent);stroke-width:.6;stroke-opacity:1}.d3 .basis line{stroke-width:.55;stroke-linecap:round}.d3 .basis text{font-family:var(--mono);font-size:3px;font-weight:700;text-anchor:middle;dominant-baseline:middle}.d3 .b-i line,.d3 .b-i circle{stroke:#ff6b6b;fill:#ff6b6b}.d3 .b-i text{fill:#ff6b6b}.d3 .b-j line,.d3 .b-j circle{stroke:#51cf66;fill:#51cf66}.d3 .b-j text{fill:#51cf66}.d3 .b-k line,.d3 .b-k circle{stroke:#4dabf7;fill:#4dabf7}.d3 .b-k text{fill:#4dabf7}.lesson{margin-top:16px;display:none}.lesson.open{display:block}.lesson .head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:16px 18px;border-bottom:1px solid var(--line)}.lesson .head h3{margin:0;font-size:20px;font-weight:500}.lesson .head p{margin:4px 0 0;color:var(--muted);font-size:13px}.formula{padding:14px 18px;font-family:var(--mono);font-size:13px;direction:ltr;text-align:left;color:var(--text-2);background:var(--panel-2);line-height:1.8;overflow-x:auto}.formula b{color:var(--text);font-weight:600}.contours{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px;padding:16px 18px}.ct{border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--panel-2)}.ct summary{display:flex;align-items:center;gap:10px;padding:10px 12px;min-height:44px;cursor:pointer;list-style:none;font-size:14px}.ct summary::-webkit-details-marker{display:none}.ct summary b{font-size:20px;font-weight:500;color:var(--accent);min-width:26px;text-align:center}.ct summary small{color:var(--muted);font-family:var(--mono);margin-inline-start:auto;direction:ltr}.ct table{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:11.5px;direction:ltr;text-align:right}.ct th{color:var(--muted);font-weight:400;padding:6px 10px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);text-align:right}.ct td{padding:4px 10px;color:var(--text-2);border-bottom:1px solid rgba(var(--fg),.04)}.ct td:first-child,.ct th:first-child{text-align:left;color:var(--muted)}.ct td.role{direction:ltr;font-family:Heebo,sans-serif}.ct tr.main td{color:var(--text)}@media (max-width: 1100px){.grid{grid-template-columns:1fr}.stage{order:-1;min-height:0}.stage-view,.stage-svg{flex:none;height:auto}.hud{position:static;padding:10px 12px 0;flex-wrap:wrap}.steps{display:none}.modes{max-width:100%;overflow-x:auto;margin-inline-start:0}.modes button{flex:none;white-space:nowrap;padding:8px 12px}.bar .cta{margin-inline-start:0;width:100%;justify-content:center}}@media (max-width: 560px){.modes{display:grid;grid-template-columns:repeat(3,1fr);width:100%;overflow:visible;border-radius:var(--r-lg)}.modes button{flex-direction:column;justify-content:center;gap:2px;padding:6px 4px;font-size:12px;border-radius:var(--r-md)}}@media (prefers-reduced-motion: reduce){*{transition:none!important}}.cmp{max-width:480px;margin-bottom:16px}.cmp .thumbs{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-top:8px}.thumb{display:flex;flex-direction:column;align-items:center;gap:2px;min-height:44px;padding:6px 4px;background:var(--panel-2);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--text-2);font:inherit;cursor:pointer;transition:border-color var(--t),background var(--t)}.thumb:hover{border-color:var(--line-2)}.thumb.on{border-color:var(--accent);background:var(--accent-soft)}.thumb svg{width:100%;aspect-ratio:1}.thumb path{fill:none;vector-effect:non-scaling-stroke;stroke-linejoin:round}.thumb path.o{stroke:var(--line-2);stroke-width:1}.thumb path.a{stroke:var(--accent);stroke-width:1.5}.thumb span{font-family:var(--mono);font-size:11px;direction:ltr}.thumb small{font-size:10px;color:var(--muted)}.chart{display:block;width:100%;height:auto;margin-top:6px}.chart text{fill:var(--muted);font:8px var(--mono)}.chart .grid{stroke:var(--line)}.chart .target{stroke:var(--ok);stroke-dasharray:3 3}.chart .curve{fill:none;stroke:var(--cyan);stroke-width:1.5}.chart .pt{fill:var(--bg);stroke:var(--cyan);stroke-width:1.5;cursor:pointer}.chart .pt.on{fill:var(--accent);stroke:var(--accent)}#copy-tex{align-self:flex-start;margin-top:8px}.eq.off{opacity:.45}.eq.off .f{text-decoration:line-through}.eq.off .dot{background:transparent;border:1px solid var(--muted)}.lab-head{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.lab-head .hint{margin:0}.lab-head button{align-self:flex-start}.overlay text{direction:ltr;font-family:var(--mono);font-size:3px;text-anchor:middle;dominant-baseline:middle}.ang-w{fill:var(--accent-soft);stroke:var(--accent);stroke-width:.25}.ang-w.reflex{fill:rgba(var(--warn-rgb),.14);stroke:var(--warn)}.ang-v{fill:var(--text)}.ang-l{fill:var(--cyan);font-weight:600}.ang-t{fill:var(--ok);font-size:2.6px}.ang-ext{stroke:var(--ok);stroke-width:.3;stroke-dasharray:1 .8}.ang-trail{fill:none;stroke:var(--ok);stroke-width:.6;stroke-linejoin:round}.ang-walker{fill:var(--ok)}.ang{margin:8px 0 16px}.ang-rows{display:grid;grid-template-columns:1fr 1fr;column-gap:16px}.row.reflex b{color:var(--warn)}.proof{margin:6px 0 0;padding-inline-start:18px;color:var(--muted);font-size:13px;line-height:1.6}.proof li{margin-bottom:6px}.proof li.on{color:var(--text)}.app{--bg: #f6efff;--panel: rgba(255, 255, 255, .74);--panel-2: rgba(34, 22, 74, .045);--line: rgba(34, 22, 74, .1);--line-2: rgba(34, 22, 74, .22);--text: #22164a;--text-2: #463b72;--muted: #655c8c;--accent: #7b5cff;--accent-soft: rgba(123, 92, 255, .1);--cyan: #d9407e;--cyan-soft: rgba(255, 111, 165, .1);--ok: #128a63;--warn: #b86e00;--peach: #ff9a52;--fg: 34, 22, 74;--accent-rgb: 123, 92, 255;--cyan-rgb: 217, 64, 126;--ok-rgb: 18, 138, 99;--warn-rgb: 184, 110, 0;--on-accent: #fff;--grad: linear-gradient(90deg, #7b5cff 0%, #ff6fa5 55%, #ff9a52 100%);--r-sm: 10px;--r-md: 14px;--r-lg: 26px;--t: .22s cubic-bezier(.2, .8, .2, 1);--display: Unbounded, Figtree, system-ui, sans-serif;--shadow: 0 24px 50px -30px rgba(80, 40, 160, .38)}body.app{font-family:Figtree,system-ui,sans-serif;font-weight:400;color:var(--text);background:radial-gradient(60% 420px at 8% 0%,#e2d6ff 0,transparent 70%),radial-gradient(55% 420px at 100% 12%,#ffe1d0 0,transparent 70%),radial-gradient(70% 500px at 30% 100%,#d4f6e9 0,transparent 70%),var(--bg);background-attachment:fixed}.app .eq .meta,.app .ct td.role{font-family:Figtree,sans-serif}.app button:focus-visible,.app input:focus-visible,.app [tabindex]:focus-visible{outline-color:var(--accent)}.app header{gap:10px 18px;padding:6px 2px 18px}.app .logo{gap:10px;font:800 20px var(--display);letter-spacing:-.03em}.app .logo .mark{width:40px;height:40px;border-radius:13px;background:var(--text);flex:none}.app .logo .word{text-transform:lowercase}.app .logo .word b{font-weight:800;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.app .logo small{font:500 13px Figtree,sans-serif;letter-spacing:0;color:var(--muted)}.app .title{order:1;flex-basis:100%;margin:8px 0 0;font:800 clamp(32px,6.4vw,64px)/1.02 var(--display);letter-spacing:-.045em}.app .title span{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.app .hero{order:2;max-width:46ch;color:var(--text-2);font-size:17px}.app .modes{order:3;margin-inline-start:0;background:none;border:0;padding:4px 0 0;gap:8px;flex-wrap:wrap}.app .modes button{background:#ffffffb3;color:var(--text);padding:0 16px 0 7px;min-height:46px;font-weight:600;box-shadow:0 6px 16px -10px #3c1e7866;transition:background var(--t),color var(--t),transform var(--t)}.app .modes button:hover{transform:translateY(-1px);background:#fff}.app .modes button svg.i{width:32px;height:32px;padding:7px;border-radius:50%;background:var(--c);color:var(--text)}.app .modes button:nth-child(1){--c: #d8ccff}.app .modes button:nth-child(2){--c: #ffd2bd}.app .modes button:nth-child(3){--c: #bff0dc}.app .modes button:nth-child(4){--c: #ffeaa0}.app .modes button:nth-child(5){--c: #ffcfe2}.app .modes button:nth-child(6){--c: #cfe6ff}.app .modes button.on{background:var(--text);color:#fff;font-weight:600}.app .steps b{border-color:var(--line-2)}.app .steps .on b{background:var(--grad);color:#fff}.app .card{background:var(--panel);border:1px solid rgba(255,255,255,.9);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.app .card h4{font:700 13px var(--display);letter-spacing:-.01em;text-transform:none;color:var(--text)}.app .cta{background:var(--grad);color:#fff;font:700 14px var(--display);letter-spacing:-.01em;border-radius:16px;box-shadow:0 10px 22px -12px #7b5cffcc;transition:transform var(--t),filter var(--t),box-shadow var(--t)}.app .cta:hover:not(:disabled){transform:translateY(-1px);filter:saturate(1.1)}.app .cta:active:not(:disabled){transform:scale(.97)}.app .cta:disabled{background:#22164a14;color:var(--muted);box-shadow:none}.app .ghost,.app .presets button,.app .tool{background:#fffc}.app .ghost:hover:not(:disabled),.app .presets button:hover,.app .tool:hover{background:#fff}.app .save .ghost{border-color:#7b5cff59}.app .tool.on{background:var(--accent-soft);border-color:#7b5cff73;color:var(--text)}.app .caption input{background:#fff;border-color:var(--line);font-weight:500}.app .tabs button.on{background:#fff;box-shadow:0 2px 8px -4px #3c1e7866}.app .opt-bar i{background:var(--grad)}.app .stage{min-height:520px}:is(.app .stage-svg,.stage-svg.app) pattern circle{fill:rgb(var(--fg));fill-opacity:.14}:is(.app .stage-svg,.stage-svg.app) .circles circle{stroke:#5a3cc842;stroke-width:.2;fill:#7b5cff08}:is(.app .stage-svg,.stage-svg.app) .circles circle:nth-child(-n+3){stroke:#5a3cc880;stroke-width:.32;fill:#7b5cff0f}:is(.app .stage-svg,.stage-svg.app) .circles circle.hot{stroke:#ff6fa5;stroke-width:.55;fill:#ff6fa51a}:is(.app .stage-svg,.stage-svg.app) .arm{stroke:var(--text);stroke-opacity:.6;stroke-width:.28}:is(.app .stage-svg,.stage-svg.app) .trace,:is(.app .stage-svg,.stage-svg.app) .done path{stroke:url(#ribbon);vector-effect:non-scaling-stroke;stroke-width:5px;stroke-linecap:round;stroke-linejoin:round}:is(.app .stage-svg,.stage-svg.app) .done path{stroke-width:5.5px}:is(.app .stage-svg,.stage-svg.app) .tip{fill:#fff;stroke:#ff6fa5;stroke-width:.45;r:1.3px}:is(.app .stage-svg,.stage-svg.app) .strokes path{stroke:var(--text)}@media (min-width: 1101px){:is(.app .stage-svg,.stage-svg.app) .trace,:is(.app .stage-svg,.stage-svg.app) .done path{stroke-width:7px}}.app .chip{white-space:nowrap;background:#fff;border-color:transparent;box-shadow:0 6px 16px -8px #3c1e7859;border-radius:999px;padding:7px 12px;color:var(--text)}.app .chip.ok{background:var(--text);color:#fff;animation:pop .55s cubic-bezier(.3,1.7,.5,1)}.app .chip.ok b{color:#ffd04d}.app .empty b{font:800 22px var(--display);letter-spacing:-.03em}.app .stage.landed .done{animation:land-pop .6s cubic-bezier(.3,1.6,.5,1);transform-box:fill-box;transform-origin:center}.app .confetti{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;z-index:3}.app .col>*,.app .stage-input,.app .lesson.open{animation:rise .38s cubic-bezier(.2,.8,.2,1) both}.app .col>:nth-child(2){animation-delay:40ms}.app .col>:nth-child(3){animation-delay:80ms}.app .col>:nth-child(n+4){animation-delay:.12s}@keyframes rise{0%{opacity:0;transform:translateY(8px)}}@keyframes pop{0%{transform:scale(.6);opacity:0}}@keyframes land-pop{40%{transform:scale(1.05)}}.app header{position:relative;isolation:isolate}.app header:before,.app header:after{content:"";position:absolute;z-index:-1;border-radius:50%;pointer-events:none;filter:blur(2px)}.app header:before{width:180px;height:180px;right:4%;top:-30px;background:radial-gradient(circle at 30% 30%,#ffffffe6,#b7a4ff73 60%,#b7a4ff00 72%);animation:drift 14s ease-in-out infinite alternate}.app header:after{width:110px;height:110px;right:22%;top:70px;background:radial-gradient(circle at 30% 30%,#ffffffe6,#ffb48c80 60%,#ffb48c00 72%);animation:drift 11s ease-in-out -4s infinite alternate-reverse}@keyframes drift{to{transform:translate(-36px,26px) scale(1.08)}}.app .title{animation:rise .7s cubic-bezier(.2,.8,.2,1) both}.app .title span{display:inline-block;background-size:200% 100%;animation:rise .7s cubic-bezier(.2,.8,.2,1) .12s both,shimmer 7s ease-in-out .8s infinite alternate;background-image:linear-gradient(90deg,#7b5cff,#ff6fa5 30%,#ff9a52,#ff6fa5 70%,#7b5cff)}@keyframes shimmer{to{background-position:100% 0}}.app .hero{animation:rise .7s cubic-bezier(.2,.8,.2,1) .22s both}.app .modes{animation:rise .7s cubic-bezier(.2,.8,.2,1) .32s both}.app .empty{place-items:end center;padding-bottom:12px}.app .empty>div{position:relative;max-width:92%;font-size:14px;line-height:1.45;text-shadow:0 0 6px #fff,0 0 12px #fff}.app .empty b{font-size:20px}@media (max-width: 560px){.app .empty{padding-bottom:6px}.app .empty>div{font-size:13px}.app .empty b{font-size:17px}.app header:before{width:120px;height:120px}.app header:after{width:70px;height:70px;top:50px}}.app .empty .attract{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:.9}.make3d{position:absolute;right:12px;bottom:12px;z-index:4;display:flex;align-items:center;gap:8px;min-height:46px;padding:0 16px 0 12px;border:0;border-radius:999px;color:#fff;font:700 14px var(--display);letter-spacing:-.01em;background:var(--grad);box-shadow:0 12px 26px -10px #7b5cffcc;animation:pop .6s cubic-bezier(.3,1.7,.5,1) .5s both;transition:transform var(--t)}.make3d:hover{transform:translateY(-2px) rotate(-1deg)}.make3d.busy{opacity:.7;cursor:progress}.sticker{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;border-radius:inherit;background:radial-gradient(70% 70% at 50% 40%,#fff 0,#f3ecff 70%);animation:rise .35s cubic-bezier(.2,.8,.2,1) both}.sticker canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;touch-action:none;cursor:grab}.sticker-hint{position:absolute;left:0;right:0;top:12px;margin:0;text-align:center;font-size:13px;color:var(--muted);pointer-events:none}.sticker-bar{position:absolute;left:12px;right:12px;bottom:12px;display:flex;justify-content:center;gap:8px}.app .stage-view{min-height:220px}.gl3d{position:absolute;pointer-events:none;z-index:0}.s3d.gl{position:relative;z-index:1}.s3d.gl>rect{display:none}@media (prefers-reduced-motion: reduce){.app *,.app *:before,.app *:after{animation:none!important}}@media (max-width: 1100px){.app .modes{width:100%}.app .stage{min-height:0}}@media (max-width: 560px){.app .wrap{padding:12px 12px 32px}.app .logo small{display:none}.app .wrap{padding-top:8px}.app header{gap:6px;padding-bottom:10px}.app .logo{font-size:17px;gap:8px}.app .logo .mark{width:32px;height:32px;border-radius:10px}.app .title{margin-top:2px;font-size:27px}.app .hero{margin:0;font-size:15px;line-height:1.4}.app .modes{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding-top:2px}.app .modes button{flex-direction:row;justify-content:flex-start;min-height:44px;padding:0 8px 0 6px;gap:6px;border-radius:14px;font-size:13px}.app .modes button svg.i{width:26px;height:26px;padding:5px}.app .stage-view{min-height:0}.app .make3d{position:static;align-self:center;margin:6px 0 10px}}.app .stage-view:has(.empty:not(.hide)) :is(.ticks,.axis-labels,.axis){opacity:0}.app .empty>div{background:#ffffffe0;border-radius:18px;padding:12px 18px;box-shadow:0 10px 24px -16px #3c1e7873;max-width:86%}@media (max-width: 560px){.app .empty>div{font-size:13px;line-height:1.45;padding:10px 14px}.app .empty b{font-size:18px}}
