:root{--py:#3572a5;--py-d:#2a5a87;--py-l:#5a9fd4;--sql:#e48c00;--sql-d:#b86e00;--sql-l:#f5a623;--bg:#0a0e17;--panel:#141b2d;--ink:#e7edf7;--muted:#8a97b0;--line:#232f47;--head:#1a2338;--green:#35e0a1;--red:#f87171;--card2:#1a2338;--violet:#a78bfa;--radius:14px;--ed-bg:#1e1e1e;--ed-txt:#d4d4d4;--ed-gutter:#6a737d;--fw-bg:var(--bg);--fw-surface:var(--panel);--fw-surface-2:var(--card2);--fw-text:var(--ink);--fw-muted:var(--muted);--fw-border:var(--line);--fw-accent:var(--green);--fw-accent-contrast:#06301f;--fw-radius:12px;--fw-danger:var(--red);--fw-success:var(--green)}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);margin:0;font-family:Segoe UI,system-ui,-apple-system,sans-serif;line-height:1.55}.hd{background:var(--panel);border-bottom:1px solid var(--line);z-index:100;justify-content:space-between;align-items:center;height:60px;padding:0 1.2rem;display:flex;position:sticky;top:0}.brand{align-items:center;gap:.6rem;font-size:1.05rem;font-weight:800;display:flex}.logo-py{background:var(--py);color:#fff;border-radius:9px;place-items:center;width:34px;height:34px;font-size:14px;font-weight:900;display:grid}.logo-sql{background:var(--sql);color:#fff;border-radius:9px;place-items:center;width:34px;height:34px;font-size:11px;font-weight:900;display:grid}.hd-right{align-items:center;gap:.9rem;display:flex}.xp-badge{background:var(--head);border:1px solid var(--line);color:var(--green);border-radius:20px;padding:.35rem .8rem;font-size:.8rem;font-weight:700}.avatar{background:var(--green);color:#06301f;cursor:pointer;border:none;border-radius:50%;width:34px;height:34px;font-weight:800}nav.tabs{background:var(--panel);border-bottom:1px solid var(--line);scrollbar-width:none;z-index:99;gap:4px;padding:6px 12px;display:flex;position:sticky;top:60px;overflow-x:auto}nav.tabs::-webkit-scrollbar{display:none}nav.tabs button{font:inherit;color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:9px;padding:.55rem .9rem;font-size:.85rem;font-weight:600;transition:all .15s}nav.tabs button:hover{color:var(--ink);background:#ffffff0d}nav.tabs button.active{color:#fff;background:#1e2330}nav.tabs button.active.py{background:var(--py)}nav.tabs button.active.sql{background:var(--sql)}nav.tabs button.active.joey{color:#fff;background:#be185d}nav.tabs button.active.prog{background:var(--green);color:#06301f}.wrap{max-width:960px;margin:0 auto;padding:1.4rem}h1.page{margin:0 0 .2rem;font-size:1.5rem}.section{margin:0 0 .3rem;font-size:1.15rem;font-weight:800}.sub{color:var(--muted);margin-bottom:1rem;font-size:.86rem}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:1.1rem;padding:1.2rem}.card-pad{padding:1.2rem}.row{flex-wrap:wrap;align-items:center;gap:.7rem;display:flex}.btn{cursor:pointer;border:none;border-radius:9px;align-items:center;gap:.4rem;padding:.6rem 1.1rem;font-family:inherit;font-size:.85rem;font-weight:700;transition:all .15s;display:inline-flex}.btn-run{background:var(--green);color:#06301f}.btn-py{background:var(--py);color:#fff}.btn-sql{background:var(--sql);color:#fff}.btn-ghost{color:var(--ink);border:1px solid var(--line);background:0 0}.btn-ghost:hover{border-color:var(--green)}.btn:disabled{opacity:.5;cursor:default}.track-grid{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1rem;display:grid}.track-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;padding:1.4rem;transition:all .15s}.track-card:hover{transform:translateY(-3px)}.track-card.py:hover{border-color:var(--py)}.track-card.sql:hover{border-color:var(--sql)}.track-card h3{margin:.6rem 0 .3rem;font-size:1.1rem}.track-card p{color:var(--muted);margin:0;font-size:.82rem}.bar{background:var(--head);border-radius:8px;height:8px;margin-top:.8rem;overflow:hidden}.bar i{border-radius:8px;height:100%;display:block}.py-fill{background:var(--py)}.sql-fill{background:var(--sql)}.green-fill{background:var(--green)}.stats-row{text-align:center;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:1rem;display:grid}.stat-box .num{color:var(--green);font-size:1.8rem;font-weight:800}.stat-box span{color:var(--muted);font-size:.75rem}.mod-item{background:var(--panel);border:1px solid var(--line);cursor:pointer;border-radius:12px;align-items:center;gap:.9rem;margin-bottom:.6rem;padding:.9rem 1rem;transition:all .15s;display:flex}.mod-item:hover{border-color:var(--py-l)}.mod-item.sql-mod:hover{border-color:var(--sql-l)}.mod-num{border-radius:8px;flex:none;place-items:center;width:30px;height:30px;font-size:.85rem;font-weight:800;display:grid}.py-num{color:var(--py-l);background:#3572a540}.sql-num{color:var(--sql-l);background:#e48c0038}.mod-info{flex:1;min-width:0}.mod-info b{font-size:.95rem}.mod-info p{color:var(--muted);margin:.15rem 0 0;font-size:.8rem}.badge-todo{background:var(--head);color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:20px;padding:.2rem .6rem;font-size:.72rem}.badge-done{color:var(--green);white-space:nowrap;background:#35e0a126;border:1px solid #35e0a166;border-radius:20px;padding:.2rem .6rem;font-size:.72rem}.theory{font-size:.92rem;line-height:1.7}.theory h3{color:var(--green);margin:.4rem 0}.theory code{background:var(--head);color:var(--sql-l);border-radius:5px;padding:.1rem .4rem;font-family:Consolas,monospace;font-size:.86em}pre.code-demo{background:var(--ed-bg);color:var(--ed-txt);border-radius:10px;margin:.8rem 0;padding:.9rem 1rem;font-family:Consolas,Fira Code,monospace;font-size:.84rem;line-height:1.6;overflow-x:auto}pre.code-demo .kw{color:#9cdcfe}pre.code-demo .kw2{color:#c586c0}pre.code-demo .fn{color:#dcdcaa}pre.code-demo .st{color:#ce9178}pre.code-demo .cm{color:#6a9955;font-style:italic}pre.code-demo .num{color:#b5cea8}.editor{background:var(--ed-bg);border:1px solid #2a2a2a;border-radius:10px;font-family:Consolas,Fira Code,Courier New,monospace;font-size:13.5px;line-height:21px;display:flex;overflow:hidden}.editor .gutter{color:var(--ed-gutter);text-align:right;-webkit-user-select:none;user-select:none;white-space:pre;background:var(--ed-bg);font-variant-numeric:tabular-nums;flex:none;padding:12px 10px 12px 14px}.editor .code-area{flex:1;position:relative;overflow-x:auto}.editor .hl,.editor textarea{font-family:inherit;font-size:inherit;line-height:inherit;white-space:pre;tab-size:4;border:0;width:100%;min-width:max-content;margin:0;padding:12px 14px 12px 6px}.editor .hl{color:var(--ed-txt);pointer-events:none;min-height:90px}.editor textarea{color:#0000;caret-color:#fff;resize:none;background:0 0;outline:none;height:100%;position:absolute;top:0;left:0;overflow:hidden}.editor .t-kw{color:#569cd6}.editor .t-fn{color:#dcdcaa}.editor .t-st{color:#ce9178}.editor .t-num{color:#b5cea8}.editor .t-cm{color:#6a9955;font-style:italic}.run-bar{align-items:center;gap:.6rem;margin:.7rem 0;display:flex}.run-status{color:#9a9a9a;margin-left:auto;font-family:Consolas,monospace;font-size:.72rem}.run-status.ok{color:#4ec9b0}.run-status.ko{color:#f48771}.term{background:#1e1e1e;border:1px solid #2a2a2a;border-radius:10px;overflow:hidden}.term-head{letter-spacing:.6px;color:#9a9a9a;text-transform:uppercase;background:#252526;padding:6px 14px;font-size:.66rem}.term-body{color:#ccc;white-space:pre-wrap;min-height:20px;max-height:260px;padding:10px 14px;font-family:Consolas,monospace;font-size:13px;line-height:1.55;overflow:auto}.term-body .err{color:#f48771}.term-empty{color:#5a5a5a;font-style:italic}.grid-wrap{border:1px solid #2a2a2a;border-radius:10px;max-height:340px;overflow:auto}table.res-grid{border-collapse:collapse;width:100%;font-family:Consolas,monospace;font-size:12.5px}table.res-grid th{color:#dcdcaa;text-align:left;white-space:nowrap;background:#2d2d2d;border:1px solid #111;padding:6px 14px;font-weight:600;position:sticky;top:0}table.res-grid td{color:#d4d4d4;white-space:nowrap;border:1px solid #2a2a2a;padding:5px 14px}table.res-grid tr:nth-child(2n) td{background:#232323}table.res-grid td.num{color:#b5cea8;text-align:right}table.res-grid td.nul{color:#666;font-style:italic}.xp-feedback{margin-top:.6rem;font-weight:700;display:none}.xp-feedback.ok{color:var(--green);display:block}.xp-feedback.ko{color:var(--red);display:block}.sb-tables,.schema-tables{flex-wrap:wrap;gap:8px;display:flex}.sb-table{background:var(--head);border:1px solid var(--line);cursor:pointer;font:inherit;text-align:left;border-radius:9px;flex-direction:column;gap:1px;padding:8px 12px;transition:all .15s;display:flex}.sb-table:hover{border-color:var(--sql)}.sb-table b{color:var(--sql-l);font-family:Consolas,monospace;font-size:13px}.sb-table span{color:var(--muted);font-family:Consolas,monospace;font-size:10.5px}.opt{text-align:left;border:2px solid var(--line);background:var(--card2);width:100%;color:var(--ink);cursor:pointer;border-radius:10px;margin-bottom:.5rem;padding:.75rem 1rem;font-family:inherit;font-size:.9rem;font-weight:600;display:block}.opt:hover{border-color:var(--green)}.opt.correct{border-color:var(--green);color:var(--green);background:#35e0a129}.opt.wrong{border-color:var(--red);color:#fca5a5;background:#f8717129}.opt.dim{opacity:.5}.synth-pre{background:var(--ed-bg);color:var(--ed-txt);white-space:pre;border-radius:10px;padding:1rem 1.2rem;font-family:Consolas,monospace;font-size:.82rem;line-height:1.65;overflow-x:auto}.synth-pre .t-kw{color:#569cd6}.synth-pre .t-fn{color:#dcdcaa}.synth-pre .t-st{color:#ce9178}.synth-pre .t-num{color:#b5cea8}.synth-pre .t-cm{color:#6a9955;font-style:italic}.chip{border:1px solid var(--line);background:var(--head);color:var(--muted);cursor:pointer;border-radius:18px;align-items:center;gap:5px;padding:.35rem .7rem;font-size:.78rem;font-weight:600;display:inline-flex}.chip.active{color:var(--ink);border-color:var(--green)}.diff{border-radius:6px;padding:.1rem .5rem;font-size:.7rem;font-weight:800}.diff.facile{color:var(--green);background:#35e0a12e}.diff.moyen{color:var(--sql-l);background:#e48c0033}.diff.difficile{color:var(--red);background:#f871712e}@media (width<=620px){.wrap{padding:1rem}}
