:root{--text:#4a4a4a;--text-heading:#1a1a1a;--bg:#faf8f4;--panel-bg:#fff;--border:#decfbc;--muted:#999;--accent:#9d4d2d;--accent-glow:#9d4d2d99;--teal:#2f6f62;--error:#c0392b;--serif:"Source Serif 4", Georgia, serif;--mono:"Source Code Pro", ui-monospace, monospace;font-family:var(--serif);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;font-size:17px;line-height:1.6}@media (prefers-color-scheme:dark){:root{--text:#b0b0b0;--text-heading:#e8e8e8;--bg:#1a1a1a;--panel-bg:#242424;--border:#3a3a3a;--muted:#777;--accent:#e08a5e;--accent-glow:#e08a5e99;--teal:#6bc2b0;--error:#e74c3c}}*{box-sizing:border-box}body{margin:0;padding:1.5rem}#app{max-width:1440px;margin:0 auto}.header-top{align-items:baseline;gap:.75rem;display:flex}.header-actions{align-items:baseline;gap:.5rem;display:flex}.header-sep{color:var(--border);-webkit-user-select:none;user-select:none;font-size:.75rem}.lang-toggle{all:unset;font-family:var(--mono);color:var(--muted);cursor:pointer;white-space:nowrap;font-size:.75rem;transition:color .15s}.lang-toggle:hover{color:var(--accent)}.lang-toggle .lang-cn{font-family:system-ui,sans-serif}.about-link{font-family:var(--mono);color:var(--muted);white-space:nowrap;font-size:.75rem;text-decoration:none}.about-link:hover{color:var(--accent)}h1{font-family:var(--serif);color:var(--text-heading);letter-spacing:-.02em;margin:0 0 .25rem;font-size:1.8rem;font-weight:700}h2{font-family:var(--serif);color:var(--text-heading);margin:1.5rem 0 .4rem;font-size:1.05rem;font-weight:600}.subtitle{color:var(--muted);max-width:640px;margin:0 0 .6rem;font-size:.88rem}.header-controls{flex-wrap:wrap;align-items:center;gap:1.25rem;margin-bottom:1.25rem;display:flex}.start-training-btn{font-family:var(--mono);background:var(--teal);color:#fff;cursor:pointer;letter-spacing:.01em;white-space:nowrap;border:none;border-radius:5px;padding:.45rem 1.4rem;font-size:.85rem;font-weight:600;transition:background .15s,transform .1s}.start-training-btn:hover{background:color-mix(in srgb, var(--teal) 85%, #000)}.start-training-btn:active{transform:scale(.97)}.start-training-btn.running{background:var(--muted);opacity:.6}.shortcut-strip{color:var(--muted);flex-wrap:wrap;gap:.9rem;font-size:.75rem;display:flex}.shortcut-strip kbd{vertical-align:0;padding:.05em .3em;font-size:.7rem}.how-it-works{max-width:900px}.how-it-works h3{font-family:var(--serif);color:var(--text-heading);margin:1rem 0 .25rem;font-size:.92rem;font-weight:600}.how-it-works h3:first-child{margin-top:0}.how-it-works p{margin:0 0 .4rem;font-size:.85rem}.explain-row{border-bottom:1px solid var(--border);align-items:flex-start;gap:1.5rem;padding:1rem 0;display:flex}.explain-row:last-child{border-bottom:none}.explain-text{flex:1;min-width:0}.explain-viz{flex-direction:column;flex:0 0 280px;align-items:center;gap:.3rem;display:flex}.explain-viz canvas{background:var(--panel-bg);border:1px solid var(--border);border-radius:4px;width:280px;display:block}#explain-network-diagram{height:180px}#explain-activation,#explain-init,#explain-live-weights{height:200px}#explain-heatmap-legend{height:140px}#explain-lr{height:180px}.explain-caption{color:var(--muted);text-align:center;margin:0;font-size:.7rem;font-style:italic;line-height:1.3}.explain-row-simple{border-bottom:none}.explain-row-simple .explain-text{max-width:640px}.explain-list{margin:.4rem 0 .6rem;padding-left:1.2rem;font-size:.88rem;line-height:1.5}.explain-list li{margin-bottom:.25rem}.pairing-grid{border:1px solid var(--border);border-radius:4px;grid-template-columns:auto 1fr 1fr 1fr;gap:1px;margin:.6rem 0;font-size:.75rem;display:grid;overflow:hidden}.pairing-header{font-family:var(--mono);text-transform:uppercase;letter-spacing:.03em;background:var(--panel-bg);color:var(--text-heading);text-align:center;padding:.3rem .4rem;font-size:.65rem;font-weight:600}.pairing-label{font-family:var(--mono);background:var(--panel-bg);color:var(--text-heading);align-items:center;padding:.4rem;font-size:.7rem;font-weight:600;display:flex}.pairing-cell{background:var(--bg);padding:.35rem .5rem;line-height:1.3}.pairing-cell.good{background:color-mix(in srgb, var(--teal) 8%, var(--bg));border-left:3px solid var(--teal)}.pairing-cell.bad{background:color-mix(in srgb, var(--error) 6%, var(--bg));border-left:3px solid var(--error)}.pairing-cell.mid{background:color-mix(in srgb, var(--muted) 5%, var(--bg));border-left:3px solid var(--border)}.explain-pick{all:unset;color:var(--text-heading);cursor:pointer;border-bottom:1.5px dashed var(--muted);padding-bottom:.5px;font-weight:700;transition:color .15s,border-color .15s}.explain-pick:hover{color:var(--teal);border-bottom-color:var(--teal)}.explain-pick:active{color:var(--accent);border-bottom-color:var(--accent)}.explain-note{color:var(--muted);border-left:3px solid var(--border);margin-top:.3rem;padding-left:.6rem;font-size:.78rem}.pairing-header .explain-pick,.pairing-label .explain-pick{font-size:inherit;text-transform:inherit;letter-spacing:inherit}footer{border-top:1px solid var(--border);color:var(--muted);margin-top:2rem;padding-top:1rem;font-size:.78rem}footer a{color:var(--accent)}.swatch{vertical-align:-1px;border-radius:2px;width:11px;height:11px;display:inline-block}.swatch.pos{background:var(--teal)}.swatch.neg{background:var(--accent)}.error{color:var(--error);font-size:.9rem}.color-legend{font-family:var(--mono);color:var(--muted);align-items:center;gap:.4rem;margin-bottom:.5rem;font-size:.7rem;display:flex}.legend-swatch{border-radius:2px;flex-shrink:0;width:10px;height:10px}.legend-swatch.neg{background:var(--accent);margin-left:.6rem}.legend-swatch.pos{background:var(--teal)}.legend-text{white-space:nowrap}kbd{font-family:var(--mono);border:1px solid var(--border);background:var(--panel-bg);color:var(--text-heading);vertical-align:.05em;border-radius:3px;padding:.1em .35em;font-size:.75em;line-height:1;display:inline-block}.mnist-visualizer{align-items:stretch;gap:1.25rem;margin:1rem 0;display:flex}.mnist-network{flex:1;align-items:stretch;gap:1.25rem;min-width:0;display:flex}.mnist-panel{flex-direction:column;align-items:center;gap:.35rem;min-width:0;display:flex;position:relative}.mnist-network>.mnist-panel+.mnist-panel:before{content:"›";color:var(--muted);opacity:.2;pointer-events:none;font-size:1rem;position:absolute;top:50%;left:-.85rem;transform:translateY(-50%)}.mnist-panel-label{color:var(--text-heading);text-transform:uppercase;letter-spacing:.06em;text-align:center;font-size:.65rem;font-weight:600}.mnist-dim{color:var(--muted);text-transform:none;letter-spacing:0;font-weight:400}.mnist-input-panel{flex:1.14;min-width:0}.mnist-input-wrap{border:1px solid var(--border);background:var(--panel-bg);border-radius:6px;width:100%;transition:border-color .3s;position:relative;overflow:hidden}.mnist-input-canvas{aspect-ratio:1;width:100%;image-rendering:pixelated;display:block}.mnist-input-grid-overlay{pointer-events:none;background-image:linear-gradient(90deg,#80808026 1px,#0000 1px),linear-gradient(#80808026 1px,#0000 1px);background-size:3.57143% 3.57143%;position:absolute;inset:0}.mnist-hover-label{font-family:var(--mono);color:#fff;pointer-events:none;opacity:0;background:#0000008c;border-radius:3px;padding:1px 5px;font-size:.55rem;transition:opacity .15s;position:absolute;bottom:4px;left:4px}.mnist-hover-label.visible{opacity:1}.mnist-input-info{font-size:.7rem;font-weight:600;font-family:var(--mono);gap:.5rem;padding-top:.35rem;display:flex}.mnist-true-label{color:var(--text-heading)}.mnist-prediction{color:var(--accent)}.mnist-prediction.mnist-wrong{color:var(--error)}.mnist-layer-panel{flex:1;min-width:0}.mnist-layer-grid{flex:1;grid-template-columns:repeat(4,1fr);align-content:start;gap:6px;width:100%;display:grid}.mnist-neuron{flex-direction:column;align-items:center;gap:1px;display:flex}.mnist-heatmap{image-rendering:pixelated;background:var(--panel-bg);aspect-ratio:1;cursor:pointer;border-radius:2px;width:100%;transition:box-shadow .15s,transform .12s}.mnist-layer-panel[data-layer="1"] .mnist-heatmap:hover,.mnist-layer-panel[data-layer="2"] .mnist-heatmap:hover{z-index:1;outline:2px solid var(--teal);outline-offset:1px;transform:scale(1.12)}.mnist-neuron-activation{color:var(--muted);font-size:.5rem;font-family:var(--mono);font-variant-numeric:tabular-nums;z-index:0;border-radius:2px;padding:0 2px;position:relative;overflow:hidden}.mnist-neuron-activation:before{content:"";width:var(--act-pct,0%);background:var(--accent);opacity:.15;z-index:-1;border-radius:2px;transition:width .15s;position:absolute;top:0;bottom:0;left:0}.mnist-output-panel{flex:none;justify-content:flex-start;width:150px}.mnist-output-grid{flex-direction:column;gap:3px;width:100%;display:flex}.mnist-output-row{height:22px;font-size:.65rem;font-family:var(--mono);font-variant-numeric:tabular-nums;border-radius:3px;align-items:center;gap:4px;padding:0 2px;transition:background-color .1s;display:flex}.mnist-output-row:hover{background:var(--border)}.mnist-output-row.mnist-correct .mnist-digit-label{color:var(--accent);font-weight:700}.mnist-output-row.mnist-correct .mnist-bar{background:var(--accent)}.mnist-output-row.mnist-predicted:not(.mnist-correct) .mnist-bar{background:var(--error)}.mnist-digit-label{text-align:right;width:10px;color:var(--text-heading);font-weight:600}.mnist-bar-bg{background:var(--border);border-radius:3px;flex:1;height:10px;overflow:hidden}.mnist-bar{background:var(--teal);border-radius:3px;min-width:0;height:100%;transition:width .15s}.mnist-pct-label{text-align:right;width:32px;color:var(--muted);font-size:.55rem}.mnist-feed{border-left:1px solid var(--border);flex-direction:column;flex:0 0 320px;gap:.6rem;padding-left:1.25rem;display:flex}.mnist-feed-header{justify-content:space-between;align-items:center;display:flex}.mnist-feed-grid{flex-wrap:nowrap;gap:0;display:flex}.mnist-feed-grid .mnist-feed-digit+.mnist-feed-digit{border-left:1px solid var(--border)}.mnist-feed-digit{cursor:pointer;background:var(--panel-bg);border:2px solid #0000;border-radius:5px;flex-direction:column;flex:1 1 0;align-items:center;gap:3px;min-width:0;padding:3px 3px 4px;transition:border-color .12s,transform .1s;display:flex}.mnist-feed-digit:hover:not(:has(.mnist-feed-toggle:hover)){border-color:var(--accent);transform:scale(1.05)}.mnist-feed-digit:active:not(:has(.mnist-feed-toggle:active)){transform:scale(.95)}.mnist-feed-digit.exhausted{opacity:.2;pointer-events:none}.mnist-feed-digit canvas{width:100%;height:auto;image-rendering:pixelated;border-radius:3px;display:block}.mnist-feed-remaining-wrap{flex-direction:column;gap:2px;width:100%;display:flex}.mnist-remaining-bar-bg{background:var(--border);border-radius:2px;width:100%;height:4px;overflow:hidden}.mnist-remaining-bar{background:var(--teal);border-radius:2px;height:100%;transition:width .2s}.digit-remaining{text-align:center;font-size:.55rem;font-family:var(--mono);color:var(--muted);font-variant-numeric:tabular-nums;line-height:1;display:block}.mnist-feed-toggle{cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;width:100%;height:14px;padding:0;display:flex}.mnist-feed-toggle-track{background:var(--border);border-radius:5px;width:22px;height:10px;transition:background .2s;position:relative}.mnist-feed-toggle-track:after{content:"";background:var(--panel-bg);border-radius:50%;width:8px;height:8px;transition:transform .2s;position:absolute;top:1px;left:1px;box-shadow:0 .5px 1px #00000026}.mnist-feed-toggle:hover .mnist-feed-toggle-track{background:color-mix(in srgb, var(--teal) 60%, var(--border));box-shadow:0 0 3px #2f6f624d}.mnist-feed-toggle.on .mnist-feed-toggle-track{background:var(--accent)}.mnist-feed-toggle.on:hover .mnist-feed-toggle-track{background:color-mix(in srgb, var(--accent) 80%, #000);box-shadow:0 0 3px var(--accent-glow)}.mnist-feed-toggle.on .mnist-feed-toggle-track:after{transform:translate(12px)}.mnist-drop-zone{background:var(--panel-bg);border:1px dashed var(--border);border-radius:6px;flex:1;min-height:140px;position:relative;overflow:hidden}.mnist-drop-canvas{width:100%;height:100%;display:block;position:absolute;top:0;left:0}.mnist-feed-controls{align-items:center;gap:.4rem;display:flex}.mnist-btn-auto{flex-shrink:0}.mnist-speed-group{flex:1;align-items:center;gap:.3rem;min-width:0;display:flex}.mnist-speed{width:100%;min-width:0;accent-color:var(--accent)}.mnist-speed-label{color:var(--muted);font-size:.65rem;font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap}.mnist-lr-group{align-items:center;gap:.3rem;display:flex}.mnist-lr-label-static{color:var(--text-heading);font-size:.6rem;font-weight:600;font-family:var(--mono);text-transform:uppercase;letter-spacing:.04em}.mnist-lr{min-width:0;accent-color:var(--teal);flex:1}.mnist-lr-label{color:var(--muted);font-size:.65rem;font-family:var(--mono);font-variant-numeric:tabular-nums;min-width:2.5em}.mnist-settings-group{gap:.6rem;margin-top:.25rem;display:flex}.mnist-setting{align-items:center;gap:.3rem;display:flex}.mnist-setting-label{color:var(--text-heading);font-size:.6rem;font-weight:600;font-family:var(--mono);text-transform:uppercase;letter-spacing:.04em}.mnist-select{font-family:var(--mono);border:1px solid var(--border);background:var(--panel-bg);color:var(--text);cursor:pointer;border-radius:3px;padding:.15rem .3rem;font-size:.65rem}.mnist-select:focus{outline:1px solid var(--teal);border-color:var(--teal)}.mnist-feed-stats{flex-direction:column;gap:.25rem;display:flex}.mnist-metrics{color:var(--muted);font-size:.6rem;font-family:var(--mono);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:.5rem;display:flex}.mnist-progress-wrap{width:100%}.mnist-progress-track{background:var(--border);border-radius:2px;height:3px;overflow:hidden}.mnist-progress-bar{background:var(--teal);border-radius:2px;width:0;height:100%;transition:width .3s}.mnist-progress-label{font-family:var(--mono);color:var(--muted);text-align:right;margin-top:2px;font-size:.6rem;display:block}.mnist-btn{background:var(--panel-bg);border:1px solid var(--border);font-family:var(--mono);color:var(--text-heading);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:4px;padding:.25rem .55rem;font-size:.7rem;transition:background-color .12s,border-color .12s}.mnist-btn:hover{background:var(--border)}.mnist-btn.active{background:var(--accent);color:var(--bg);border-color:var(--accent)}.mnist-btn-reset{padding:.15rem .4rem;font-size:.6rem}.mnist-btn-draw{margin-left:auto;padding:.1rem .35rem;font-size:.6rem}.mnist-input-wrap.draw-mode{border-color:var(--accent)}.mnist-input-wrap.draw-mode .mnist-input-canvas{cursor:crosshair}.mnist-input-wrap.draw-mode .mnist-input-grid-overlay{opacity:.25}.mnist-scoreboard{background:var(--panel-bg);border:1px solid var(--border);border-radius:8px;margin-top:1.25rem;padding:.75rem 1rem}.mnist-scoreboard-header{justify-content:space-between;align-items:center;margin-bottom:.5rem;display:flex}.mnist-total-score{font-family:var(--mono);color:var(--text-heading);font-size:1.1rem;font-weight:700}.mnist-scoreboard-grid{align-items:stretch;gap:0;display:flex}.mnist-score-col{border-right:1px solid var(--border);flex-direction:column;flex:1;gap:4px;padding:4px 3px;display:flex}.mnist-score-col:last-child{border-right:none}.mnist-score-digit-label{font-family:var(--mono);color:var(--text-heading);text-align:center;font-size:.6rem;font-weight:700;line-height:1}.mnist-score-acc{font-family:var(--mono);color:var(--muted);text-align:center;font-variant-numeric:tabular-nums;font-size:.5rem;line-height:1;transition:color .3s}.mnist-score-acc.good{color:var(--teal)}.mnist-score-images{grid-template-columns:repeat(3,1fr);gap:2px;display:grid}.mnist-score-cell{cursor:pointer;transition:transform .1s;position:relative}.mnist-score-cell:hover{transform:scale(1.08)}.mnist-score-cell canvas{width:100%;height:auto;image-rendering:pixelated;border:2px solid var(--border);border-radius:2px;transition:border-color .2s;display:block}.mnist-score-cell.correct canvas{border-color:var(--teal)}.mnist-score-cell.wrong canvas{border-color:var(--error)}.mnist-misclass-label{font-family:var(--mono);color:#fff;background:var(--error);pointer-events:none;border-radius:2px;padding:0 2px;font-size:.45rem;font-weight:700;line-height:1.3;position:absolute;bottom:3px;right:3px}.mnist-spark-wrap{display:block}.mnist-spark-label{font-family:var(--mono);color:var(--muted);text-align:right;margin-top:2px;font-size:.55rem;line-height:1}.mnist-spark{width:100%;height:80px;display:block}.mnist-score-total-col{border-right:none;border-left:1px solid var(--border);flex:0 0 120px;align-items:stretch;padding-left:8px}.mnist-total-heatmap{grid-template-rows:repeat(10,1fr);grid-template-columns:auto repeat(9,1fr);gap:1px;width:100%;display:grid}.mnist-heatmap-row-label{font-family:var(--mono);color:var(--muted);justify-content:center;align-items:center;padding-right:2px;font-size:.5rem;font-weight:600;display:flex}.mnist-heatmap-cell{aspect-ratio:1;background:var(--border);cursor:pointer;border-radius:1px;transition:background-color .2s}.mnist-heatmap-cell:hover{opacity:.7}.mnist-heatmap-cell.correct{background:var(--teal)}.mnist-heatmap-cell.wrong{background:var(--error)}.mnist-spark-total{width:100%;height:80px}@media (width<=900px){body{padding:1rem}h1{font-size:1.4rem}.mnist-visualizer{flex-direction:column}.mnist-feed{border-left:none;border-top:1px solid var(--border);flex:none;width:100%;padding-top:1rem;padding-left:0}.mnist-drop-zone{min-height:100px}.mnist-network{flex-wrap:wrap;gap:.75rem}.mnist-layer-panel{flex:1 0 40%}.mnist-spark,.mnist-spark-total{height:50px}.mnist-score-total-col{flex:0 0 100px}.explain-row{flex-direction:column;gap:.75rem}.explain-viz{flex:none;width:100%;max-width:320px}.explain-viz canvas{width:100%}}@media (width<=600px){body{padding:.75rem}h1{font-size:1.2rem}.subtitle{font-size:.8rem}.mnist-network{gap:.5rem}.mnist-input-panel{flex:1 0 100%}.mnist-layer-panel{flex:1 0 45%}.mnist-output-panel{flex:1 0 100%;width:auto}.mnist-output-grid{flex-flow:wrap;gap:2px}.mnist-output-row{flex:none;width:calc(50% - 1px);height:20px;font-size:.55rem}.mnist-pct-label{width:26px;font-size:.5rem}.mnist-feed-digit{gap:2px;padding:2px}.mnist-feed-toggle{height:12px}.mnist-feed-toggle-track{width:18px;height:8px}.mnist-feed-toggle-track:after{width:6px;height:6px}.mnist-feed-toggle.on .mnist-feed-toggle-track:after{transform:translate(10px)}.mnist-spark,.mnist-spark-total{height:40px}.mnist-score-total-col{flex:0 0 80px;padding-left:4px}.mnist-score-col{padding:2px 1px}.mnist-score-digit-label{font-size:.5rem}.mnist-scoreboard{padding:.5rem}.mnist-settings-group{gap:.4rem}.mnist-setting-label{font-size:.55rem}.mnist-select{padding:.1rem .2rem;font-size:.6rem}.how-it-works p{font-size:.78rem}.pairing-grid{font-size:.65rem}.explain-viz canvas{height:auto}.header-controls{gap:.75rem}.start-training-btn{padding:.4rem 1rem;font-size:.8rem}.shortcut-strip{gap:.5rem;font-size:.7rem}.mnist-network>.mnist-panel+.mnist-panel:before{display:none}}
