/* Python track: shared learning, assessment and runtime surfaces for chapters 33-40. */
.py-route-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:13px;margin-top:18px}
.py-route-card{position:relative;display:flex;min-height:170px;padding:19px;border:1px solid var(--line);border-radius:13px;background:var(--panel);color:var(--ink);flex-direction:column;text-decoration:none;overflow:hidden;transition:.18s}
.py-route-card::before{content:"";position:absolute;inset:0 auto 0 0;width:3px;background:var(--route-accent,var(--cyan))}
.py-route-card:nth-child(2){--route-accent:var(--amber)}.py-route-card:nth-child(3){--route-accent:var(--violet)}.py-route-card:nth-child(5){--route-accent:var(--green)}.py-route-card:nth-child(6){--route-accent:var(--orange)}
.py-route-card:hover{border-color:var(--route-accent,var(--cyan));transform:translateY(-3px);text-decoration:none}
.py-route-card small{color:var(--route-accent,var(--cyan));font:11px "JetBrains Mono",monospace;text-transform:uppercase;letter-spacing:.05em}
.py-route-card h3{margin:9px 0 7px;font-size:18px;line-height:1.25}.py-route-card p{margin:0;color:var(--muted);font-size:13.5px;line-height:1.55}.py-route-card b{margin-top:auto;padding-top:14px;color:var(--ink);font-size:12px}
.py-exam-map{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:11px;margin-top:15px}.py-exam-card{padding:15px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}.py-exam-card strong{display:block;color:var(--amber);font:700 12px "JetBrains Mono",monospace}.py-exam-card p{margin:6px 0 0;color:var(--muted);font-size:13px;line-height:1.55}.py-exam-card.foundation{border-style:dashed}.py-exam-card.foundation strong{color:var(--muted)}
.py-concept-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px;margin:17px 0}.py-concept{padding:17px;border:1px solid var(--line);border-radius:11px;background:var(--panel)}.py-concept h3{margin:0 0 6px;color:var(--cyan);font-size:16px}.py-concept p{margin:0;color:var(--ink);font-size:14px;line-height:1.65}.py-concept code{white-space:nowrap}
.py-rule-table{width:100%;border-collapse:collapse;margin:16px 0;border:1px solid var(--line);background:var(--panel)}.py-rule-table th,.py-rule-table td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}.py-rule-table th{color:var(--cyan);font:11px "JetBrains Mono",monospace;text-transform:uppercase}.py-rule-table td{color:var(--ink);font-size:13.5px}.py-rule-table tr:last-child td{border-bottom:0}
.py-code{position:relative;margin:13px 0;border:1px solid var(--line);border-radius:10px;background:var(--bg2);overflow:auto}.py-code::before{content:"PY";position:absolute;top:9px;right:11px;color:var(--muted);font:9px "JetBrains Mono",monospace}.py-code pre{margin:0;padding:16px 44px 16px 17px;color:var(--ink);font:13px/1.7 "JetBrains Mono",monospace;white-space:pre;tab-size:4}.py-code .kw{color:var(--violet)}.py-code .fn{color:var(--cyan)}.py-code .str{color:var(--amber)}
.py-checklist{display:grid;gap:8px;margin:14px 0;padding:0;list-style:none}.py-checklist li{position:relative;padding:10px 12px 10px 38px;border:1px solid var(--line);border-radius:9px;background:var(--panel);font-size:14px}.py-checklist li::before{content:"✓";position:absolute;left:13px;color:var(--green);font:700 14px "JetBrains Mono",monospace}
.py-api-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(235px,1fr));gap:10px;margin:16px 0}.py-api{padding:13px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}.py-api code{display:inline-block;margin-bottom:6px;color:var(--cyan);font:700 12px "JetBrains Mono",monospace}.py-api p{margin:0;color:var(--ink);font-size:12.5px;line-height:1.55}.py-api small{display:block;margin-top:6px;color:var(--muted);font-size:11px;line-height:1.45}.py-api.warn{border-color:color-mix(in srgb,var(--amber) 58%,var(--line))}.py-api.warn code{color:var(--amber)}
.py-theory-run{display:grid;grid-template-columns:minmax(0,.92fr) minmax(320px,1.08fr);gap:16px;align-items:start;margin-top:15px}.py-theory-run .py-mini{margin:0}.py-lesson-copy .theory-block{margin:0}.py-key-points{display:grid;gap:7px;margin-top:14px}.py-key-points p{margin:0;padding-left:13px;border-left:2px solid var(--cyan);color:var(--ink);font-size:13px;line-height:1.5}.py-key-points b{color:var(--cyan)}.py-reference{margin-top:14px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}.py-reference summary{padding:11px 13px;cursor:pointer;color:var(--cyan);font:700 12px "JetBrains Mono",monospace}.py-reference .py-api-grid{margin:0;padding:0 12px 12px}.py-reference .py-api{padding:10px}.py-reference .py-api p{font-size:12px}.py-mini-values{display:grid;gap:4px}.py-mini-values span{padding:4px 5px;border-bottom:1px solid var(--line);color:var(--ink);font:10px/1.45 "JetBrains Mono",monospace}.py-mini-values span:last-child{border-bottom:0}.py-mini-values b{color:var(--cyan)}
.py-flow-hint{margin-top:14px;border:1px solid var(--line);border-radius:10px;background:var(--panel);overflow:hidden}.py-flow-hint-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line)}.py-flow-hint-head strong{color:var(--cyan);font:700 11px "JetBrains Mono",monospace;text-transform:uppercase}.py-flow-hint-head span{color:var(--muted);font-size:11px}.py-flow-hint ol{display:grid;justify-items:center;gap:0;margin:0;padding:11px;list-style:none}.py-flow-hint li{position:relative;display:grid;grid-template-columns:21px minmax(170px,1fr);gap:7px;align-items:center;width:min(100%,440px);min-height:45px;padding:8px 11px;border:1px solid var(--line);background:var(--bg2);font-size:11px;line-height:1.35}.py-flow-hint li+li{margin-top:20px}.py-flow-hint li+li::before{content:"↓";position:absolute;bottom:100%;left:50%;height:20px;transform:translateX(-50%);color:var(--amber);font:700 15px "JetBrains Mono",monospace;text-align:center}.py-flow-hint li span{display:grid;place-items:center;width:21px;height:21px;border:1px solid var(--line);border-radius:50%;color:var(--muted);font:9px "JetBrains Mono",monospace}.py-flow-hint li b{color:var(--ink);font-weight:600}.py-flow-hint .flow-terminal{border-radius:999px}.py-flow-hint .flow-terminal span{border-color:var(--green);color:var(--green)}.py-flow-hint .flow-decision{transform:skew(-10deg);border-color:color-mix(in srgb,var(--amber) 58%,var(--line))}.py-flow-hint .flow-decision>*{transform:skew(10deg)}.py-flow-hint .flow-decision span{border-color:var(--amber);color:var(--amber)}
.py-mini{margin:18px 0;border:1px solid var(--line);border-radius:12px;background:var(--bg2);overflow:hidden}.py-mini-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:11px 13px;border-bottom:1px solid var(--line);background:var(--panel)}.py-mini-head strong{display:block;color:var(--ink);font:700 13px "JetBrains Mono",monospace}.py-mini-head span{display:block;margin-top:3px;color:var(--muted);font-size:11px;line-height:1.4}.py-mini-status{flex:0 0 auto;color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.py-mini-status.ready{color:var(--green)}.py-mini-status.busy{color:var(--amber)}.py-mini-status.error{color:var(--red)}.py-mini-grid{display:grid;grid-template-columns:minmax(220px,1fr) minmax(220px,.9fr)}.py-mini-code{min-height:132px;margin:0;padding:9px 0;background:var(--bg);border-right:1px solid var(--line);overflow:auto}.py-mini-code span{display:block;padding:2px 11px;color:var(--ink);font:11px/1.55 "JetBrains Mono",monospace;white-space:pre}.py-mini-code span.active{background:color-mix(in srgb,var(--cyan) 12%,var(--bg));box-shadow:inset 3px 0 var(--cyan)}.py-mini-code i{display:inline-block;width:27px;padding-right:8px;color:var(--muted);font-style:normal;text-align:right;user-select:none}.py-mini-state{min-width:0;padding:10px;background:var(--bg2)}.py-mini-line{color:var(--muted);font-size:11px}.py-mini-line b{color:var(--cyan);font-family:"JetBrains Mono",monospace}.py-mini-vars{min-height:76px;margin-top:8px}.py-mini-vars .pyt-vars th,.py-mini-vars .pyt-vars td{padding:4px 5px;font-size:9px}.py-mini-out{min-height:36px;max-height:75px;margin:8px 0 0;padding:7px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--green);font:10px/1.45 "JetBrains Mono",monospace;white-space:pre-wrap;overflow:auto}.py-mini-controls{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:9px 12px;border-top:1px solid var(--line);background:var(--panel)}.py-mini-controls .pyt-button{padding:6px 9px}.py-mini-controls span{margin-left:auto;color:var(--muted);font:10px "JetBrains Mono",monospace}.py-mini-controls span b{color:var(--ink)}

.python-tutor{margin:19px 0;border:1px solid var(--line);border-radius:14px;background:var(--bg2);box-shadow:0 18px 45px color-mix(in srgb,var(--bg) 58%,transparent);overflow:hidden}

/* Concrete visual models keep theory about data and control flow, not an editor. */
.py-trajectory-graph{min-width:340px}.py-trajectory-graph svg{display:block;width:100%;max-width:480px;height:auto;margin:0 auto}.py-trajectory-graph .edge{fill:none;stroke:var(--line);stroke-width:2}.py-trajectory-graph .edge.active{stroke:var(--amber);stroke-width:3}.py-trajectory-graph text{fill:var(--muted);font:10px "JetBrains Mono",monospace;text-anchor:middle}.py-trajectory-graph .node circle{fill:var(--panel);stroke:var(--line);stroke-width:2}.py-trajectory-graph .node>text{fill:var(--ink);font-weight:700}.py-trajectory-graph .node.active circle{fill:color-mix(in srgb,var(--cyan) 14%,var(--panel));stroke:var(--cyan)}.py-trajectory-graph .node .ways{fill:var(--muted);font-size:8px;font-weight:400}
.py-mini-model{border-top:1px solid var(--line);background:color-mix(in srgb,var(--violet) 3%,var(--bg2))}.py-model{min-height:190px}.py-model-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--line);background:var(--panel)}.py-model-head strong{display:block;color:var(--violet);font:700 11px "JetBrains Mono",monospace;text-transform:uppercase}.py-model-head span{display:block;margin-top:3px;color:var(--muted);font-size:11px;line-height:1.4}.py-model-live{color:var(--amber)!important;font:10px "JetBrains Mono",monospace;text-transform:uppercase;white-space:nowrap}.py-model-stage{min-height:126px;padding:13px;background:var(--bg);overflow:auto}.py-model-controls{display:flex;justify-content:center;gap:7px;flex-wrap:wrap;padding:9px 12px;border-top:1px solid var(--line);background:var(--panel)}.py-model-caption{margin:11px 0 0;color:var(--muted);font-size:11px;line-height:1.5}.py-model-caption b{color:var(--ink)}.py-model-cards{display:grid;gap:8px}.py-model-cards>div{min-width:0;padding:9px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--ink);font:12px/1.4 "JetBrains Mono",monospace}.py-bindings{grid-template-columns:repeat(2,minmax(0,1fr))}.py-bindings>div{display:grid;grid-template-columns:1fr 18px 1fr;align-items:center;gap:5px}.py-bindings>div:last-child{grid-column:1/-1;font:12px/1.5 "Manrope",sans-serif}.py-binding-name{color:var(--cyan)}.py-bindings i{color:var(--amber);font-style:normal;text-align:center}.py-array{display:flex;align-items:stretch;justify-content:center;gap:5px;min-width:max-content;padding:15px 4px 4px}.py-array-cell{position:relative;display:grid;place-items:center;min-width:42px;min-height:44px;padding:7px 6px;border:1px solid var(--line);border-radius:7px;background:var(--panel);color:var(--ink);font:12px "JetBrains Mono",monospace}.py-array-cell i{position:absolute;top:-16px;color:var(--muted);font:9px "JetBrains Mono",monospace;font-style:normal}.py-array-cell.active{border-color:var(--cyan);background:color-mix(in srgb,var(--cyan) 12%,var(--panel));box-shadow:0 0 0 2px color-mix(in srgb,var(--cyan) 13%,transparent)}.py-array-cell.marked{border-color:var(--green);color:var(--green)}.py-pipeline{display:grid;justify-content:center;gap:5px}.py-pipeline>div{padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:var(--panel);font-size:12px}.py-pipeline>div span{display:block;margin-bottom:3px;color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.py-pipeline>i,.py-transform-line>i{color:var(--amber);font-style:normal;text-align:center}.py-pipeline.numeric>div:last-child{border-color:var(--green);color:var(--green)}.py-division{display:grid;grid-template-columns:auto 20px minmax(130px,1fr);align-items:center;gap:10px;max-width:440px;margin:auto}.py-division>div{display:grid;gap:4px;padding:11px;border:1px solid var(--line);border-radius:8px;background:var(--panel);text-align:center}.py-division>div span{color:var(--muted);font-size:10px}.py-division>i{color:var(--amber);font-style:normal;text-align:center}.py-division-groups{display:flex!important;align-items:center;justify-content:center;flex-wrap:wrap}.py-division-groups b{padding:3px 5px;border:1px solid var(--cyan);border-radius:5px;color:var(--cyan);font:11px "JetBrains Mono",monospace}.py-division-groups em{padding:3px 5px;border:1px solid var(--amber);border-radius:5px;color:var(--amber);font:11px "JetBrains Mono",monospace;font-style:normal}.py-division p,.py-division small{grid-column:1/-1;margin:0;text-align:center}.py-division p{color:var(--green);font:700 13px "JetBrains Mono",monospace}.py-division small{color:var(--muted);font-size:11px}.py-model-select{display:grid;grid-template-columns:auto 100px;gap:8px;align-items:center;margin:0 auto 10px;max-width:210px;color:var(--muted);font-size:11px}.py-model-select select{padding:6px;border:1px solid var(--line);border-radius:6px;background:var(--panel);color:var(--ink);font:11px "JetBrains Mono",monospace}.py-branch-stack{display:grid;gap:7px;max-width:420px;margin:auto}.py-branch-stack>div{display:flex;justify-content:space-between;gap:9px;padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:var(--panel);font:11px "JetBrains Mono",monospace}.py-branch-stack>div.pass{border-color:var(--green);background:color-mix(in srgb,var(--green) 9%,var(--panel));color:var(--green)}.py-logic-gate{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:9px;max-width:500px;margin:auto}.py-logic-gate>div{padding:10px;border:1px solid var(--line);border-radius:8px;background:var(--panel);font-size:12px;text-align:center}.py-logic-gate>div b{display:block;margin-top:5px;color:var(--ink)}.py-logic-gate>div.yes{border-color:var(--green)}.py-logic-gate>div.no{border-color:var(--red)}.py-logic-gate>div.no b{color:var(--red)}.py-logic-gate>div.skipped{border-style:dashed;opacity:.58}.py-logic-gate>i{color:var(--amber);font:700 15px "JetBrains Mono",monospace;font-style:normal}.py-loop-model{position:relative;width:240px;height:180px;margin:0 auto;border:1px dashed color-mix(in srgb,var(--violet) 50%,var(--line));border-radius:50%}.py-loop-node{position:absolute;display:grid;place-items:center;width:105px;min-height:40px;padding:5px;border:1px solid var(--line);border-radius:7px;background:var(--panel);color:var(--muted);font-size:9px;text-align:center}.py-loop-node b{display:block;margin-top:3px;color:var(--ink);font:10px "JetBrains Mono",monospace}.py-loop-node.top{top:-8px;left:calc(50% - 58px);border-color:var(--amber);transform:skew(-8deg)}.py-loop-node.top>*{transform:skew(8deg)}.py-loop-node.right{top:66px;right:-15px;border-color:var(--cyan)}.py-loop-node.bottom{bottom:-8px;left:calc(50% - 58px);border-color:var(--green)}.py-loop-center{position:absolute;top:73px;left:calc(50% - 26px);display:grid;place-items:center;width:52px;height:30px;border-radius:999px;background:var(--violet);color:var(--accent-ink);font:700 10px "JetBrains Mono",monospace}.py-loop-return{position:absolute;top:70px;left:8px;color:var(--amber);font:700 11px "JetBrains Mono",monospace;writing-mode:vertical-rl}.py-number-state{grid-template-columns:repeat(3,minmax(0,1fr))}.py-slice-readout{display:flex;justify-content:center;gap:10px;margin-bottom:16px;color:var(--ink);font:12px "JetBrains Mono",monospace}.py-slice-readout b{color:var(--cyan)}.py-slice-readout span{color:var(--green)}.py-slice-cuts,.py-slice-cells{display:grid;grid-template-columns:repeat(6,46px);justify-content:center;min-width:max-content}.py-slice-cuts{grid-template-columns:repeat(7,1fr);width:276px;margin:0 auto -5px}.py-slice-cuts button{height:12px;padding:0;border:0;border-left:1px solid var(--muted);background:transparent;cursor:pointer}.py-slice-cuts button.start{border-left:3px solid var(--cyan)}.py-slice-cuts button.stop{border-left:3px solid var(--amber)}.py-slice-cells>span{position:relative;display:grid;place-items:center;min-height:44px;border:1px solid var(--line);background:var(--panel);font:12px "JetBrains Mono",monospace}.py-slice-cells i,.py-slice-cells em{position:absolute;color:var(--muted);font:9px "JetBrains Mono",monospace;font-style:normal}.py-slice-cells i{top:-16px}.py-slice-cells em{bottom:-16px}.py-slice-cells>span.selected{background:color-mix(in srgb,var(--cyan) 16%,var(--panel));box-shadow:inset 0 -3px var(--cyan)}.py-slice-range{display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:330px;margin:28px auto 0}.py-slice-range label{display:grid;gap:4px;color:var(--muted);font:10px "JetBrains Mono",monospace}.py-transform-line{display:grid;gap:5px;max-width:360px;margin:auto}.py-transform-line>div{padding:8px;border:1px solid var(--line);border-radius:7px;background:var(--panel);font:11px "JetBrains Mono",monospace}.py-transform-line>div.active{border-color:var(--cyan);background:color-mix(in srgb,var(--cyan) 9%,var(--panel))}.py-transform-line span{display:inline-block;width:72px;color:var(--muted);font-size:9px}.py-matrix-tools,.py-sort-tabs{display:flex;justify-content:center;gap:6px;flex-wrap:wrap;margin-bottom:12px}.py-matrix{min-width:245px;margin:auto;border-collapse:collapse;background:var(--panel);font:12px "JetBrains Mono",monospace}.py-matrix th,.py-matrix td{padding:0;border:1px solid var(--line);text-align:center}.py-matrix th{height:24px;color:var(--muted);font-weight:400}.py-matrix button{display:grid;place-items:center;width:52px;height:42px;border:0;background:transparent;color:var(--ink);cursor:pointer;font:inherit}.py-matrix button.target{background:color-mix(in srgb,var(--cyan) 10%,transparent);box-shadow:inset 0 0 0 2px var(--cyan)}.py-sort-tabs button{padding:6px 8px;border:1px solid var(--line);border-radius:999px;background:var(--panel);color:var(--muted);cursor:pointer;font:10px "JetBrains Mono",monospace}.py-sort-tabs button.active{border-color:var(--violet);color:var(--violet)}.py-sort-lanes{display:grid;gap:20px;max-width:600px;margin:8px auto}.py-sort-lanes>div{display:grid;grid-template-columns:35px minmax(0,1fr);align-items:center;gap:5px}.py-sort-lanes>div>span{color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.py-sort-facts{display:grid;gap:3px;max-width:520px;margin:11px auto;padding:8px 10px;border-left:3px solid var(--amber);background:var(--panel)}.py-sort-facts b{color:var(--ink);font-size:11px}.py-sort-facts span{color:var(--muted);font-size:11px}.py-search-strip{max-width:520px;margin:8px auto;padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:var(--bg2);color:var(--muted);font-size:11px;line-height:1.45}.py-search-strip b{color:var(--cyan)}.py-stack-visual{display:grid;justify-items:center;gap:5px}.py-stack-visual>div{width:min(100%,260px);padding:9px 12px;border:1px solid var(--violet);border-radius:7px;background:color-mix(in srgb,var(--violet) 8%,var(--panel));color:var(--ink);font:11px "JetBrains Mono",monospace}.py-stack-visual>div.top{border-color:var(--cyan);background:color-mix(in srgb,var(--cyan) 10%,var(--panel))}.py-scope-visual{display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:500px;margin:auto}.py-scope-visual>div{min-height:75px;padding:10px;border:1px solid var(--cyan);border-radius:8px;background:var(--panel)}.py-scope-visual>div.local{border-color:var(--violet)}.py-scope-visual span{display:block;color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.py-scope-visual b{display:block;margin-top:9px;color:var(--ink);font:11px "JetBrains Mono",monospace}.py-recursion-tree{display:grid;justify-items:center;gap:5px}.py-recursion-tree .node{padding:8px 18px;border:1px solid var(--violet);border-radius:999px;background:var(--panel);color:var(--ink);font:11px "JetBrains Mono",monospace}.py-recursion-tree .node.active{border-color:var(--cyan);background:color-mix(in srgb,var(--cyan) 12%,var(--panel));color:var(--cyan)}.py-recursion-tree i{color:var(--amber);font-style:normal}.py-return-path{display:flex;justify-content:center;gap:5px;flex-wrap:wrap;margin-top:10px}.py-return-path span{padding:4px 6px;border:1px solid var(--green);border-radius:5px;color:var(--green);font:10px "JetBrains Mono",monospace}.py-set-visual,.py-frequency,.py-file-stream,.py-residue{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}.py-set-visual .incoming,.py-frequency .incoming,.py-residue .incoming{padding:9px;border:1px solid var(--amber);border-radius:7px;background:var(--panel);color:var(--muted);font-size:10px;text-align:center}.py-set-visual .incoming b,.py-frequency .incoming b,.py-residue .incoming b{display:block;margin-top:4px;color:var(--amber);font:13px "JetBrains Mono",monospace}.py-set-visual>i,.py-file-stream>i{color:var(--amber);font-style:normal}.set-box{min-width:120px;padding:15px;border:1px solid var(--green);border-radius:50%;color:var(--green);font:13px "JetBrains Mono",monospace;text-align:center}.py-frequency table{border-collapse:collapse;background:var(--panel);font:11px "JetBrains Mono",monospace}.py-frequency th,.py-frequency td{padding:6px 9px;border:1px solid var(--line);text-align:center}.py-frequency th{color:var(--muted);font-weight:400}.py-frequency tr.active td{color:var(--cyan);background:color-mix(in srgb,var(--cyan) 9%,var(--panel))}.py-file-stream>div{padding:9px;border:1px solid var(--line);border-radius:7px;background:var(--panel);font:11px "JetBrains Mono",monospace}.py-file-stream>div.ok{border-color:var(--green);color:var(--green)}.py-invariant{max-width:450px;margin:12px auto;padding:9px;border:1px solid var(--green);border-radius:7px;background:color-mix(in srgb,var(--green) 7%,var(--panel));color:var(--green);font:11px "JetBrains Mono",monospace;text-align:center}.py-state-graph{display:flex;align-items:center;justify-content:center;gap:6px}.py-state-graph>div{display:grid;place-items:center;width:55px;height:55px;border:1px solid var(--line);border-radius:50%;background:var(--panel)}.py-state-graph>div.active{border-color:var(--cyan);box-shadow:0 0 0 3px color-mix(in srgb,var(--cyan) 12%,transparent)}.py-state-graph b{color:var(--ink);font:12px "JetBrains Mono",monospace}.py-state-graph span{color:var(--muted);font-size:8px}.py-state-graph i{color:var(--amber);font-style:normal}.py-residue{align-items:flex-start}.py-residue .incoming span{display:block;margin-top:4px;color:var(--muted);font-size:9px}.py-buckets{display:grid;grid-template-columns:repeat(5,minmax(42px,1fr));gap:5px}.py-buckets>div{min-height:50px;padding:5px;border:1px solid var(--line);border-radius:6px;background:var(--panel);text-align:center}.py-buckets b{display:block;color:var(--muted);font:9px "JetBrains Mono",monospace}.py-buckets span{display:block;margin-top:5px;color:var(--ink);font:10px "JetBrains Mono",monospace}.py-buckets .need{border-color:var(--amber)}.py-buckets .current{border-color:var(--cyan)}
.pyt-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 15px;border-bottom:1px solid var(--line);background:var(--panel)}.pyt-brand{display:flex;align-items:center;gap:9px;min-width:0}.pyt-brand i{width:10px;height:10px;border-radius:50%;background:var(--cyan);box-shadow:0 0 13px color-mix(in srgb,var(--cyan) 65%,transparent)}.pyt-brand strong{font:700 13px "JetBrains Mono",monospace}.pyt-brand span{color:var(--muted);font-size:11px}.pyt-runtime{color:var(--muted);font:10px "JetBrains Mono",monospace}.pyt-runtime.ready{color:var(--green)}.pyt-runtime.busy{color:var(--amber)}.pyt-runtime.error{color:var(--red)}
.pyt-grid{display:grid;grid-template-columns:minmax(330px,1.08fr) minmax(330px,.92fr)}.pyt-editor-pane{min-width:0;border-right:1px solid var(--line);background:var(--bg)}.pyt-state-pane{min-width:0;background:var(--bg2)}
.pyt-pane-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 12px;border-bottom:1px solid var(--line);color:var(--ink);font-size:12px}.pyt-pane-head span{color:var(--muted);font:10px "JetBrains Mono",monospace;text-transform:uppercase;letter-spacing:.05em}
.pyt-editor{display:block;width:100%;min-height:260px;margin:0;padding:14px;border:0;border-radius:0;background:var(--bg);color:var(--ink);outline:0;resize:vertical;font:13px/1.65 "JetBrains Mono",monospace;tab-size:4}.pyt-editor:focus{box-shadow:inset 3px 0 var(--cyan)}
.pyt-inputs{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid var(--line)}.pyt-input-block{min-width:0;padding:10px}.pyt-input-block+.pyt-input-block{border-left:1px solid var(--line)}.pyt-input-block label{display:block;margin-bottom:5px;color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.pyt-stdin,.pyt-file{min-height:66px;padding:8px;border-radius:6px;background:var(--panel);font-size:11px;line-height:1.45}
.pyt-controls{display:flex;align-items:center;gap:7px;flex-wrap:wrap;padding:10px 12px;border-top:1px solid var(--line);background:var(--panel)}.pyt-controls .pyt-step-count{margin-left:auto;color:var(--muted);font:10px "JetBrains Mono",monospace}.pyt-button{display:inline-flex;align-items:center;gap:5px;padding:7px 10px;border:1px solid var(--line);border-radius:7px;background:var(--panel2);color:var(--ink);cursor:pointer;font:600 11px "Manrope",sans-serif;transition:.15s}.pyt-button:hover{border-color:var(--cyan);color:var(--cyan)}.pyt-button.primary{border-color:var(--cyan);background:var(--cyan);color:var(--accent-ink)}.pyt-button.danger{color:var(--red)}.pyt-button:disabled{opacity:.42;cursor:not-allowed}
.pyt-code-view{max-height:230px;overflow:auto;padding:8px 0;border-bottom:1px solid var(--line);background:var(--bg)}.pyt-line{display:grid;grid-template-columns:36px minmax(0,1fr);min-width:max-content;padding:2px 11px;border-left:3px solid transparent;color:var(--ink);font:11px/1.55 "JetBrains Mono",monospace}.pyt-line b{color:var(--muted);font-weight:400;text-align:right;padding-right:10px;user-select:none}.pyt-line code{padding:0;background:transparent;color:inherit;white-space:pre}.pyt-line.active{border-left-color:var(--cyan);background:color-mix(in srgb,var(--cyan) 10%,var(--bg))}.pyt-line.active b{color:var(--cyan)}.pyt-line.error{border-left-color:var(--red);background:color-mix(in srgb,var(--red) 8%,var(--bg))}
.pyt-state-tabs{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:1px solid var(--line)}.pyt-tab{padding:8px;border:0;border-right:1px solid var(--line);background:var(--panel);color:var(--muted);cursor:pointer;font:10px "JetBrains Mono",monospace}.pyt-tab:last-child{border-right:0}.pyt-tab.active{color:var(--cyan);background:var(--panel2)}
.pyt-state{min-height:205px;max-height:280px;overflow:auto;padding:11px}.pyt-panel{display:none}.pyt-panel.active{display:block}.pyt-empty{padding:20px 10px;color:var(--muted);font-size:12px;text-align:center}.pyt-vars{width:100%;border-collapse:collapse}.pyt-vars th,.pyt-vars td{padding:7px 8px;border-bottom:1px solid var(--line);text-align:left;font:10px/1.4 "JetBrains Mono",monospace;vertical-align:top}.pyt-vars th{color:var(--muted);text-transform:uppercase}.pyt-vars td:first-child{color:var(--cyan)}.pyt-object-id{display:inline-block;margin-left:5px;padding:1px 4px;border:1px solid var(--line);border-radius:4px;color:var(--amber);font-size:8px}.pyt-stack{display:grid;gap:7px}.pyt-frame{padding:8px;border:1px solid var(--line);border-radius:7px;background:var(--panel)}.pyt-frame strong{color:var(--violet);font:11px "JetBrains Mono",monospace}.pyt-frame span{float:right;color:var(--muted);font:9px "JetBrains Mono",monospace}.pyt-frame p{clear:both;margin:5px 0 0;color:var(--ink);font:10px/1.45 "JetBrains Mono",monospace}.pyt-console{margin:0;min-height:145px;padding:10px;border:1px solid var(--line);border-radius:7px;background:var(--bg);color:var(--green);font:11px/1.55 "JetBrains Mono",monospace;white-space:pre-wrap;overflow-wrap:anywhere}.pyt-error{margin-top:8px;padding:8px;border-left:3px solid var(--red);background:color-mix(in srgb,var(--red) 7%,var(--panel));color:var(--red);font-size:11px;white-space:pre-wrap}.pyt-event{padding:9px 12px;border-top:1px solid var(--line);color:var(--muted);font-size:11px}.pyt-event b{color:var(--amber);font-family:"JetBrains Mono",monospace}.pyt-event.success{color:var(--green)}.pyt-event.failure{color:var(--red)}
.pyt-trace{display:flex;gap:5px;padding:9px 12px;border-top:1px solid var(--line);overflow-x:auto;background:var(--panel)}.pyt-trace button{flex:0 0 auto;width:28px;height:28px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--muted);cursor:pointer;font:9px "JetBrains Mono",monospace}.pyt-trace button.active{border-color:var(--cyan);color:var(--cyan);background:var(--panel2)}.pyt-trace button.return{border-color:color-mix(in srgb,var(--green) 50%,var(--line))}.pyt-trace button.exception{border-color:var(--red);color:var(--red)}
.pyt-safety{padding:8px 12px;border-top:1px solid var(--line);color:var(--muted);font-size:10px;line-height:1.45}.pyt-safety b{color:var(--ink)}

.py-assessment{margin-top:18px;padding:16px;border:1px solid var(--line);border-radius:14px;background:var(--bg2)}.pya-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-bottom:13px;border-bottom:1px solid var(--line)}.pya-stat{display:grid;gap:2px;min-width:110px}.pya-stat span{color:var(--muted);font:9px "JetBrains Mono",monospace;text-transform:uppercase}.pya-stat strong{color:var(--ink);font:700 13px "JetBrains Mono",monospace}.pya-toolbar .pya-grow{flex:1}.pya-seed{display:flex;gap:6px;align-items:center}.pya-seed input{width:115px;padding:7px;font-size:11px;text-transform:uppercase}
.pya-card{max-width:820px;margin:15px auto 0;padding:18px;border:1px solid var(--line);border-radius:11px;background:var(--panel)}.pya-card.right{border-color:var(--green)}.pya-card.wrong{border-color:var(--red)}.pya-card header{padding:0;text-align:left;border:0;background:none}.pya-kicker{display:flex;justify-content:space-between;gap:8px;color:var(--amber);font:10px "JetBrains Mono",monospace;text-transform:uppercase}.pya-card h3{margin:9px 0 6px;font-size:18px}.pya-card p{margin:0;color:var(--muted);font-size:14px;line-height:1.6}.pya-snippet{margin:12px 0;padding:11px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);font:12px/1.6 "JetBrains Mono",monospace;white-space:pre-wrap}.pya-options{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:13px}.pya-option{display:flex;gap:8px;align-items:flex-start;padding:10px;border:1px solid var(--line);border-radius:8px;background:var(--bg2);color:var(--ink);cursor:pointer;text-align:left;font:12px/1.45 "Manrope",sans-serif}.pya-option i{display:inline-flex;flex:0 0 20px;height:20px;border:1px solid var(--line);border-radius:50%;align-items:center;justify-content:center;color:var(--muted);font:9px "JetBrains Mono",monospace}.pya-option:hover,.pya-option.selected{border-color:var(--cyan)}.pya-option.selected i{color:var(--cyan);border-color:var(--cyan)}.pya-option.correct{border-color:var(--green)}.pya-option.incorrect{border-color:var(--red)}.pya-option:disabled{cursor:default}.pya-feedback{display:none;margin-top:12px;padding:10px;border-left:3px solid var(--cyan);background:var(--bg2);color:var(--ink);font-size:13px;line-height:1.55}.pya-feedback.visible{display:block}.pya-feedback.good{border-color:var(--green)}.pya-feedback.bad{border-color:var(--red)}
.pya-nav{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:13px}.pya-nav span{min-width:130px;color:var(--muted);font:10px "JetBrains Mono",monospace;text-align:center}.pya-result{display:none;margin-top:15px;padding:15px;border:1px solid var(--line);border-radius:10px;background:var(--panel);color:var(--ink)}.pya-result.visible{display:block}.pya-result h3{margin:0 0 7px;color:var(--amber)}.pya-skill-grid{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.pya-skill{padding:5px 8px;border:1px solid var(--line);border-radius:999px;color:var(--muted);font:9px "JetBrains Mono",monospace}.pya-skill.ok{border-color:var(--green);color:var(--green)}.pya-skill.weak{border-color:var(--red);color:var(--red)}
.py-track-tabs{display:flex;gap:7px;flex-wrap:wrap;margin:13px 0}.py-track-tab{padding:7px 11px;border:1px solid var(--line);border-radius:999px;background:var(--panel);color:var(--muted);cursor:pointer;font:10px "JetBrains Mono",monospace}.py-track-tab.active{border-color:var(--cyan);color:var(--cyan)}
.py-challenge{margin-top:18px;padding:16px;border:1px solid var(--line);border-radius:12px;background:var(--panel)}.py-challenge-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.py-challenge-head h3{margin:0 0 5px}.py-challenge-head p{margin:0;color:var(--muted);font-size:13px;line-height:1.55}.py-challenge select{max-width:330px;padding:8px;border:1px solid var(--line);border-radius:7px;background:var(--bg2);color:var(--ink)}.py-test-results{display:grid;gap:6px;margin-top:10px}.py-test{display:flex;justify-content:space-between;gap:10px;padding:7px 9px;border:1px solid var(--line);border-radius:7px;background:var(--bg2);color:var(--muted);font-size:11px}.py-test.ok{border-color:var(--green);color:var(--green)}.py-test.bad{border-color:var(--red);color:var(--red)}.py-test b{font-family:"JetBrains Mono",monospace}

@media(max-width:900px){.py-route-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.py-theory-run{grid-template-columns:1fr}.pyt-grid{grid-template-columns:1fr}.pyt-editor-pane{border-right:0;border-bottom:1px solid var(--line)}}
@media(max-width:660px){.py-route-grid,.py-concept-grid,.py-mini-grid{grid-template-columns:1fr}.py-route-card{min-height:0}.pyt-head{align-items:flex-start;flex-direction:column}.pyt-grid{display:block}.pyt-editor{min-height:230px}.pyt-inputs{grid-template-columns:1fr}.pyt-input-block+.pyt-input-block{border-left:0;border-top:1px solid var(--line)}.pyt-controls .pyt-step-count{width:100%;margin-left:0}.pya-options{grid-template-columns:1fr}.pya-toolbar{align-items:stretch}.pya-stat{min-width:calc(50% - 8px)}.pya-seed{width:100%}.pya-seed input{flex:1}.py-challenge-head{flex-direction:column}.py-challenge select{width:100%;max-width:none}.py-rule-table{font-size:12px}.py-rule-table th,.py-rule-table td{padding:8px}.py-mini-code{border-right:0;border-bottom:1px solid var(--line)}.py-mini-head{flex-direction:column}.py-mini-controls span{width:100%;margin-left:0}.py-flow-hint-head{align-items:flex-start;flex-direction:column}.py-flow-hint ol{padding:9px}.py-flow-hint li{flex-basis:126px}}
@media(prefers-reduced-motion:reduce){.py-route-card,.pyt-button,.pya-option{transition:none}}
@media print{.python-tutor,.py-assessment,.py-challenge{display:none}.py-route-card{break-inside:avoid}}
