@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/Programming-Tutorials/_astro/bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/Programming-Tutorials/_astro/bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/Programming-Tutorials/_astro/bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Sans Variable;font-style:normal;font-display:swap;font-weight:400 700;src:url(/Programming-Tutorials/_astro/instrument-sans-latin-ext-wght-normal.B5bTHO_g.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Instrument Sans Variable;font-style:normal;font-display:swap;font-weight:400 700;src:url(/Programming-Tutorials/_astro/instrument-sans-latin-wght-normal.BbzFLZTg.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Commit Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/Programming-Tutorials/_astro/commit-mono-latin-400-normal.wzhe4RuD.woff2)format("woff2"),url(/Programming-Tutorials/_astro/commit-mono-latin-400-normal.s0S3qwFW.woff)format("woff")}@font-face{font-family:Commit Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/Programming-Tutorials/_astro/commit-mono-latin-700-normal.DU8mrtj2.woff2)format("woff2"),url(/Programming-Tutorials/_astro/commit-mono-latin-700-normal.1-GU0IUE.woff)format("woff")}:root{color-scheme:light;--font-display:"Bricolage Grotesque Variable", "Instrument Sans Variable", system-ui, sans-serif;--font-text:"Instrument Sans Variable", system-ui, -apple-system, "Segoe UI", sans-serif;--font-code:"Commit Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--bg:#fafbfd;--bg-raised:#fff;--bg-sunk:#f0f3f8;--ink:#0e1726;--ink-2:#3b4559;--ink-3:#566175;--rule:#dfe4ec;--rule-strong:#7c8799;--accent:#1f4fd8;--accent-hover:#1639a6;--accent-bg:#e3eafc;--on-accent:#fff;--teal:#0b6b63;--teal-bg:#dcf0ed;--ok:#1a6b3a;--warn:#8a5a00;--warn-bg:#f7ecd0;--danger:#a1262b;--danger-bg:#f8e0df;--tip-bg:#e1f1e6;--code-bg:#f0f3f8;--code-ink:#1b2434;--focus:#b45309;--step--1:.8125rem;--step-0:1.0625rem;--step-1:1.275rem;--step-2:1.53rem;--step-3:clamp(1.75rem, 1.4rem + 1.2vw, 2.1rem);--step-4:clamp(2.1rem, 1.5rem + 2.4vw, 3rem);--step-5:clamp(2.6rem, 1.4rem + 5vw, 4.6rem);--s-1:.25rem;--s-2:.5rem;--s-3:.75rem;--s-4:1rem;--s-5:1.5rem;--s-6:2rem;--s-7:3rem;--s-8:4.5rem;--s-9:6.5rem;--gutter:1rem;--header-h:3.5rem;--measure:68ch;--radius:6px}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--bg:#0b111c;--bg-raised:#121a29;--bg-sunk:#0f1624;--ink:#e6ebf4;--ink-2:#bcc6d6;--ink-3:#8f9bb0;--rule:#243049;--rule-strong:#6a7790;--accent:#86a5ff;--accent-hover:#b0c4ff;--accent-bg:#172447;--on-accent:#06122e;--teal:#5fd0c4;--teal-bg:#11302d;--ok:#7bd197;--warn:#e8be5f;--warn-bg:#35290e;--danger:#ff9a9d;--danger-bg:#3d1c1d;--tip-bg:#14301f;--code-bg:#0f1624;--code-ink:#dbe3f1;--focus:#fbbf24}}:root[data-theme=dark]{color-scheme:dark;--bg:#0b111c;--bg-raised:#121a29;--bg-sunk:#0f1624;--ink:#e6ebf4;--ink-2:#bcc6d6;--ink-3:#8f9bb0;--rule:#243049;--rule-strong:#6a7790;--accent:#86a5ff;--accent-hover:#b0c4ff;--accent-bg:#172447;--on-accent:#06122e;--teal:#5fd0c4;--teal-bg:#11302d;--ok:#7bd197;--warn:#e8be5f;--warn-bg:#35290e;--danger:#ff9a9d;--danger-bg:#3d1c1d;--tip-bg:#14301f;--code-bg:#0f1624;--code-ink:#dbe3f1;--focus:#fbbf24}@media (width>=40rem){:root{--gutter:1.5rem}}@media (width>=64rem){:root{--gutter:2rem}}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padding-top:calc(var(--header-h) + var(--s-5));scroll-behavior:smooth}body{background:var(--bg);color:var(--ink);font-family:var(--font-text);font-size:var(--step-0);font-feature-settings:"ss01", "kern";overflow-wrap:break-word;flex-direction:column;min-height:100dvh;margin:0;line-height:1.65;display:flex}main{flex:1 0 auto}img,svg{max-width:100%;display:block}h1,h2,h3,h4{font-family:var(--font-display);letter-spacing:-.015em;text-wrap:balance;margin:0;font-weight:580;line-height:1.15}p{margin:0}ul,ol{margin:0;padding:0}button,input,select{font:inherit;color:inherit}hr{border:0;border-top:1px solid var(--rule);margin:var(--s-6) 0}a{color:var(--accent);text-underline-offset:.18em;text-decoration-thickness:1px}a:hover{color:var(--accent-hover);text-decoration-thickness:2px}:focus-visible{outline:3px solid var(--focus);outline-offset:2px;border-radius:2px}::selection{background:var(--accent);color:var(--on-accent)}.visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;position:absolute!important}.skip-link{left:var(--s-3);z-index:100;background:var(--ink);color:var(--bg);padding:var(--s-3) var(--s-4);border-radius:var(--radius);font-weight:600;text-decoration:none;position:absolute;top:-4rem}.skip-link:focus{top:var(--s-3);color:var(--bg)}.wrap{width:100%;max-width:78rem;padding-inline:var(--gutter);margin-inline:auto}.eyebrow{font-size:var(--step--1);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);font-weight:600}.site-header{z-index:50;background:color-mix(in srgb, var(--bg) 94%, transparent);border-bottom:1px solid var(--rule);backdrop-filter:saturate(1.1)blur(6px);position:sticky;top:0}.site-header .wrap{align-items:center;gap:var(--s-4);min-height:var(--header-h);display:flex}.brand{font-family:var(--font-display);letter-spacing:-.02em;color:var(--ink);align-items:center;gap:.35em;min-height:44px;font-size:1.2rem;font-weight:640;text-decoration:none;display:inline-flex}.brand:hover{color:var(--ink)}.brand-mark{color:var(--accent);font-family:var(--font-code);font-weight:700}.nav{gap:var(--s-1);align-items:center;margin-left:auto;display:flex}.nav a{color:var(--ink-2);padding:0 var(--s-3);border-radius:var(--radius);align-items:center;min-height:44px;font-size:.95rem;font-weight:500;text-decoration:none;display:inline-flex}.nav a:hover{color:var(--ink);background:var(--bg-sunk)}.nav a[aria-current=page]{color:var(--ink);box-shadow:inset 0 -2px 0 var(--accent);border-radius:0}.theme-toggle{appearance:none;border:1px solid var(--rule-strong);border-radius:var(--radius);cursor:pointer;width:44px;height:44px;color:var(--ink-2);background:0 0;place-items:center;display:inline-grid}.theme-toggle:hover{color:var(--ink);background:var(--bg-sunk)}.theme-toggle svg{width:20px;height:20px}.theme-toggle .i-sun{display:none}:root[data-theme=dark] .theme-toggle .i-sun{display:block}:root[data-theme=dark] .theme-toggle .i-moon{display:none}@media (width<=36rem){.nav a{padding:0 var(--s-2);font-size:.9rem}.brand-name-long{display:none}}.site-footer{margin-top:var(--s-9);border-top:1px solid var(--rule);padding-block:var(--s-6);color:var(--ink-3);font-size:.9rem}.site-footer .wrap{gap:var(--s-3) var(--s-6);flex-wrap:wrap;justify-content:space-between;display:flex}.site-footer a{color:var(--ink-2)}.btn{align-items:center;gap:var(--s-2);min-height:44px;padding:0 var(--s-5);border-radius:var(--radius);border:1px solid var(--ink);background:var(--ink);color:var(--bg);cursor:pointer;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.btn-quiet{color:var(--ink);border-color:var(--rule-strong);background:0 0}.btn-quiet:hover{background:var(--bg-sunk);border-color:var(--ink);color:var(--ink)}.badge{font-size:var(--step--1);border:1px solid var(--rule-strong);color:var(--ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:.4em;padding:.35rem .6rem;font-weight:600;line-height:1;display:inline-flex}.pips{gap:2px;display:inline-flex}.pips i{border:1px solid;border-radius:1px;width:5px;height:10px;display:block}.pips i.on{background:currentColor}.status{font-size:var(--step--1);font-weight:600}.status:before{content:"";border:1.5px solid;border-radius:50%;width:.55em;height:.55em;margin-right:.45em;display:inline-block}.status[data-status=in-progress]:before{background:linear-gradient(90deg,currentColor 50%,#0000 50%)}.status[data-status=complete]:before{background:currentColor}.status[data-status=planned]{color:var(--ink-3)}.status[data-status=in-progress]{color:var(--warn)}.status[data-status=complete]{color:var(--ok)}.hero{padding-block:var(--s-7) var(--s-8);border-bottom:1px solid var(--rule)}.hero-grid{gap:var(--s-7);display:grid}.hero h1{font-size:var(--step-5);letter-spacing:-.035em;max-width:14ch;font-weight:560;line-height:1.02}.hero h1 em{color:var(--accent);font-style:normal}.hero .lede{margin-top:var(--s-5);font-size:var(--step-1);color:var(--ink-2);max-width:36rem;line-height:1.55}.hero-actions{margin-top:var(--s-6);gap:var(--s-3);flex-wrap:wrap;display:flex}.specimen{min-width:0}.specimen figcaption{margin-top:var(--s-3);font-size:var(--step--1);color:var(--ink-3);max-width:42ch}@media (width>=62rem){.hero{padding-block:var(--s-9) var(--s-9)}.hero-grid{align-items:end;gap:var(--s-8);grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr)}}.section{padding-block:var(--s-8) 0}.section-head{gap:var(--s-2);margin-bottom:var(--s-6);max-width:40rem;display:grid}.section-head h2{font-size:var(--step-3)}.section-head p{color:var(--ink-2)}.path{counter-reset:lvl;border-top:1px solid var(--rule);list-style:none}.path li{counter-increment:lvl;gap:var(--s-1) var(--s-4);padding-block:var(--s-5);border-bottom:1px solid var(--rule);grid-template-columns:3rem 1fr;display:grid}.path li:before{content:counter(lvl, decimal-leading-zero);font-family:var(--font-display);font-size:var(--step-3);color:var(--accent);grid-row:span 2;font-weight:500;line-height:1}.path h3{font-size:var(--step-2)}.path p{color:var(--ink-2);max-width:46ch}@media (width>=50rem){.path li{grid-template-columns:5rem 14rem 1fr;align-items:baseline}.path li:before{grid-row:auto}}.picker{border-top:1px solid var(--rule);grid-template-columns:repeat(auto-fill,minmax(min(100%,15rem),1fr));gap:0;list-style:none;display:grid}.picker li{border-bottom:1px solid var(--rule)}.picker a{justify-content:space-between;align-items:baseline;gap:var(--s-3);padding:var(--s-3) var(--s-2);min-height:48px;color:var(--ink);font-weight:560;text-decoration:none;display:flex}.picker a:hover{background:var(--bg-sunk);color:var(--ink)}.picker a:hover .name{text-decoration:underline;text-decoration-color:var(--accent);text-decoration-thickness:2px}.page-head{padding-block:var(--s-7) var(--s-6);border-bottom:1px solid var(--rule)}.page-head h1{font-size:var(--step-4);letter-spacing:-.025em}.page-head .lede{margin-top:var(--s-3);color:var(--ink-2);font-size:var(--step-1);max-width:40rem;line-height:1.5}.meta-row{gap:var(--s-2) var(--s-5);margin-top:var(--s-5);color:var(--ink-2);flex-wrap:wrap;font-size:.95rem;display:flex}.meta-row dt{color:var(--ink-3);display:inline}.meta-row dd{color:var(--ink);margin:0 0 0 .35em;font-weight:560;display:inline}.meta-row div{display:block}.crumbs{font-size:var(--step--1);color:var(--ink-3);margin-bottom:var(--s-4)}.crumbs ol{gap:var(--s-1) var(--s-2);flex-wrap:wrap;list-style:none;display:flex}.crumbs li+li:before{content:"/";margin-right:var(--s-2);color:var(--rule-strong)}.crumbs a{color:var(--ink-2)}.filters{gap:var(--s-3);padding-block:var(--s-5);top:var(--header-h);background:var(--bg);z-index:20;border-bottom:1px solid var(--rule);grid-template-columns:1fr;display:none;position:sticky}.js .filters{display:grid}@media (width>=40rem){.filters{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr)}}.field{gap:var(--s-1);display:grid}.field label{font-size:var(--step--1);color:var(--ink-2);font-weight:600}.field input,.field select{min-height:44px;padding:0 var(--s-3);background:var(--bg-raised);border:1px solid var(--rule-strong);border-radius:var(--radius);width:100%}.field input:hover,.field select:hover{border-color:var(--ink)}.result-count{color:var(--ink-2);padding-block:var(--s-3);min-height:3rem;font-size:.95rem}.tier-group{margin-top:var(--s-6)}.tier-group>header{align-items:baseline;gap:var(--s-1) var(--s-4);padding-bottom:var(--s-3);border-bottom:1px solid var(--rule);flex-wrap:wrap;display:flex}.tier-group h2{font-size:var(--step-2)}.tier-group header p{color:var(--ink-3);font-size:.95rem}.lang-list{list-style:none}.lang-list li{border-bottom:1px solid var(--rule);content-visibility:auto;contain-intrinsic-size:auto 4.5rem}.lang-list li[hidden],.tier-group[hidden]{display:none}.lang-row{gap:var(--s-1) var(--s-4);padding:var(--s-3) var(--s-2);color:var(--ink);align-items:baseline;text-decoration:none;display:grid}.lang-row:hover{background:var(--bg-sunk);color:var(--ink)}.lang-row .name{font-size:1.1rem;font-weight:600}.lang-row:hover .name{text-decoration:underline;text-decoration-color:var(--accent);text-decoration-thickness:2px}.lang-row .summary{color:var(--ink-2);font-size:.95rem}.lang-row .tags{color:var(--ink-3);font-size:var(--step--1)}@media (width>=50rem){.lang-row{grid-template-columns:11rem minmax(0,1fr) 12rem 7rem}.lang-row .status{text-align:right}}.lang-list li,.lang-row{scroll-margin-top:calc(var(--header-h) + 12rem)}.az{padding-top:var(--s-3)}.az ul{flex-wrap:wrap;gap:2px;list-style:none;display:flex}.az li{display:block}.az a,.az li>span{min-width:2rem;min-height:2rem;font-size:var(--step--1);font-variant-numeric:tabular-nums;border-radius:var(--radius);place-items:center;font-weight:600;display:grid}.az a{color:var(--accent);text-decoration:none}.az a:hover{background:var(--bg-sunk)}.az a.off{color:var(--ink-3);font-weight:400}.az li>span{color:var(--ink-3);opacity:.55;font-weight:400}.overview{gap:var(--s-7);padding-top:var(--s-6);padding-bottom:var(--s-8);max-width:var(--measure);margin-inline:0;display:grid}.facts{border-top:1px solid var(--rule);gap:0;display:grid}.facts>div{gap:var(--s-1) var(--s-4);padding:var(--s-3) 0;border-bottom:1px solid var(--rule);display:grid}@media (width>=40rem){.facts>div{grid-template-columns:10rem minmax(0,1fr)}}.facts dt{color:var(--ink-3);font-size:.95rem}.facts dd{margin:0;font-weight:560}.not-yet{border-left:4px solid var(--rule-strong);padding-left:var(--s-4)}.not-yet h2{font-size:var(--step-1);margin-bottom:var(--s-2)}.not-yet p{color:var(--ink-2)}.curriculum{gap:var(--s-8);padding-top:var(--s-7);display:grid}.level-block{gap:var(--s-5);display:grid}.level-block>header{align-items:baseline;gap:var(--s-2) var(--s-4);border-bottom:1px solid var(--rule);padding-bottom:var(--s-3);flex-wrap:wrap;display:flex}.level-block h2{font-size:var(--step-3)}.level-block header p{color:var(--ink-3)}.module{gap:var(--s-3);display:grid}@media (width>=56rem){.module{gap:var(--s-6);grid-template-columns:14rem minmax(0,1fr)}}.module h3{font-size:var(--step-1);position:relative}.lesson-list{border-top:1px solid var(--rule);list-style:none}.lesson-list li{border-bottom:1px solid var(--rule)}.lesson-list a{gap:var(--s-1) var(--s-4);padding:var(--s-3) var(--s-2);color:var(--ink);grid-template-columns:1fr auto;text-decoration:none;display:grid}.lesson-list a:hover{background:var(--bg-sunk);color:var(--ink)}.lesson-list .t{font-weight:600}.lesson-list a:hover .t{text-decoration:underline;text-decoration-color:var(--accent)}.lesson-list .d{color:var(--ink-2);grid-column:1/-1;font-size:.95rem}.lesson-list .m{color:var(--ink-3);font-size:var(--step--1);white-space:nowrap}.empty{color:var(--ink-3);border:1px dashed var(--rule-strong);border-radius:var(--radius);padding:var(--s-4)}.lesson-shell{gap:var(--s-5);padding-block:var(--s-5) 0;grid-template-columns:minmax(0,1fr);display:grid}@media (width>=60rem){.lesson-shell{gap:var(--s-7);padding-block:var(--s-6) 0;grid-template-columns:17rem minmax(0,1fr)}}@media (width>=80rem){.lesson-shell{grid-template-columns:17rem minmax(0,1fr) 14.5rem}}.sidebar-wrap{min-width:0}.sidebar-toggle{display:block}.sidebar-toggle>summary{cursor:pointer;min-height:44px;padding:0 var(--s-4);border:1px solid var(--rule-strong);border-radius:var(--radius);justify-content:space-between;align-items:center;font-weight:600;list-style:none;display:flex}.sidebar-toggle>summary::-webkit-details-marker{display:none}.sidebar-toggle>summary:after{content:"";border-bottom:2px solid;border-right:2px solid;width:.5rem;height:.5rem;margin-top:-.2rem;transition:transform .15s;transform:rotate(45deg)}.sidebar-toggle[open]>summary:after{margin-top:.2rem;transform:rotate(225deg)}.sidebar-toggle[open]>summary{margin-bottom:var(--s-3)}@media (width>=60rem){.sidebar-wrap{top:calc(var(--header-h) + var(--s-5));max-height:calc(100dvh - var(--header-h) - var(--s-6));overscroll-behavior:contain;padding-right:var(--s-2);align-self:start;position:sticky;overflow-y:auto}.sidebar-toggle>summary{display:none}}.sidebar{font-size:.9375rem}.sidebar .sb-lang{font-family:var(--font-display);font-size:var(--step-1);color:var(--ink);margin-bottom:var(--s-4);font-weight:600;text-decoration:none;display:block}.sidebar summary{cursor:pointer;align-items:center;gap:var(--s-2);list-style:none;display:flex}.sidebar summary::-webkit-details-marker{display:none}.sidebar summary:before{content:"";border-bottom:1.5px solid;border-right:1.5px solid;flex:none;width:.4rem;height:.4rem;transition:transform .12s;transform:rotate(-45deg)}.sidebar details[open]>summary:before{transform:rotate(45deg)}.sidebar summary:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:3px}.sidebar .sb-level{margin-top:var(--s-4)}.sidebar .sb-level>summary{font-size:var(--step--1);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);min-height:32px;font-weight:600}.sidebar .sb-level[open]>summary{color:var(--ink-2)}.sidebar .sb-module{margin-top:var(--s-1)}.sidebar .sb-module>summary{color:var(--ink);padding-block:var(--s-2);min-height:36px;font-size:.9375rem;font-weight:600;line-height:1.3}.sidebar .sb-module>ol{margin-bottom:var(--s-2)}.sidebar ol{border-left:1px solid var(--rule);list-style:none}.sidebar li a{padding:var(--s-2) var(--s-3);color:var(--ink-2);border-left:2px solid #0000;min-height:36px;margin-left:-1px;line-height:1.35;text-decoration:none;display:block}.sidebar li a:hover{color:var(--ink);border-left-color:var(--rule-strong)}.sidebar li a[aria-current=page]{color:var(--ink);border-left-color:var(--accent);background:var(--bg-sunk);font-weight:600}.lesson-main{min-width:0}.lesson-head{padding-bottom:var(--s-4);border-bottom:1px solid var(--rule);margin-bottom:var(--s-5);max-width:var(--measure)}.lesson-head .crumbs{margin-bottom:var(--s-2)}.lesson-head h1{font-size:var(--step-4);letter-spacing:-.025em}.lesson-head .lede{margin-top:var(--s-2);color:var(--ink-2);font-size:var(--step-1);line-height:1.5}.lesson-meta{align-items:center;gap:0 var(--s-3);margin-top:var(--s-2);font-size:var(--step--1);color:var(--ink-3);flex-wrap:wrap;display:flex}.lesson-meta>*+:before{content:"·";margin-right:var(--s-3)}.level-compact{color:var(--ink-2);align-items:center;gap:.4em;font-weight:600;display:inline-flex}.builds-on{margin-top:var(--s-3);font-size:var(--step--1);color:var(--ink-3)}.builds-on ul{list-style:none;display:inline}.builds-on li{display:inline}.builds-on li+li:before{content:", "}.objectives{margin-top:var(--s-2);color:var(--ink-2);font-size:.95rem}.objectives summary{cursor:pointer;min-height:44px;color:var(--ink-2);align-items:center;font-weight:600;display:flex}.objectives ul{border-left:2px solid var(--teal);padding:0 0 var(--s-2) var(--s-5)}.objectives li+li{margin-top:var(--s-1)}.prose{max-width:var(--measure)}.prose>*+*{margin-top:1.15em}.prose h2{font-size:var(--step-3);margin-top:2.2em;padding-top:.2em;position:relative}.prose h3{font-size:var(--step-2);margin-top:1.9em}.prose h4{font-size:var(--step-1);margin-top:1.6em}.prose h2+*,.prose h3+*{margin-top:.7em}.prose ul,.prose ol{padding-left:1.4em}.prose li+li{margin-top:.4em}.prose li::marker{color:var(--ink-3)}.prose strong{font-weight:640}.prose :not(pre)>code{font-family:var(--font-code);background:var(--bg-sunk);border:1px solid var(--rule);color:var(--code-ink);overflow-wrap:anywhere;border-radius:4px;padding:.08em .35em;font-size:.86em}.prose blockquote{padding-left:var(--s-4);border-left:3px solid var(--rule-strong);color:var(--ink-2);font-family:var(--font-display);font-size:var(--step-1);margin-inline:0}.prose table{border-collapse:collapse;width:100%;font-size:.95rem;display:block;overflow-x:auto}.prose th,.prose td{text-align:left;padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--rule);vertical-align:top}.prose th{border-bottom-color:var(--ink);font-weight:600}.prose .expressive-code{margin-block:1.4em}.prose kbd{font-family:var(--font-code);border:1px solid var(--rule-strong);background:var(--bg-raised);border-bottom-width:2px;border-radius:4px;padding:.05em .4em;font-size:.82em}.prose img{border-radius:var(--radius);height:auto}.anchor{color:var(--ink-3);opacity:0;margin-left:.35em;font-weight:400;text-decoration:none}.prose h2:hover .anchor,.prose h3:hover .anchor,.anchor:focus-visible{opacity:1}@media (hover:none){.anchor{opacity:.6}}.toc-wrap{min-width:0}.toc{font-size:.875rem}.toc h2{font-family:var(--font-text);font-size:var(--step--1);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);margin-bottom:var(--s-3);font-weight:600}.toc ol{border-left:1px solid var(--rule);list-style:none}.toc a{padding:var(--s-1) var(--s-3);color:var(--ink-3);border-left:2px solid #0000;min-height:28px;margin-left:-1px;line-height:1.35;text-decoration:none;display:block}.toc a:hover{color:var(--ink)}.toc a[aria-current=true]{color:var(--ink);border-left-color:var(--accent);font-weight:560}.toc li.h3 a{padding-left:var(--s-5)}.toc-mobile{max-width:var(--measure);margin-bottom:var(--s-5)}.toc-mobile>summary{cursor:pointer;min-height:44px;color:var(--ink-2);align-items:center;font-size:.95rem;font-weight:600;display:flex}@media (width>=80rem){.toc-wrap{top:calc(var(--header-h) + var(--s-5));max-height:calc(100dvh - var(--header-h) - var(--s-6));align-self:start;position:sticky;overflow-y:auto}.toc-mobile{display:none}}@media (width<=79.99rem){.toc-wrap{display:none}}.pager{gap:var(--s-3);margin-top:var(--s-8);max-width:var(--measure);display:grid}@media (width>=40rem){.pager{grid-template-columns:1fr 1fr}}.pager a{gap:var(--s-1);padding:var(--s-4) var(--s-5);border:1px solid var(--rule-strong);border-radius:var(--radius);color:var(--ink);min-height:44px;text-decoration:none;display:grid}.pager a:hover{border-color:var(--ink);background:var(--bg-sunk);color:var(--ink)}.pager .dir{font-size:var(--step--1);color:var(--ink-3);letter-spacing:.06em;text-transform:uppercase;font-weight:600}.pager .ttl{font-family:var(--font-display);font-size:var(--step-1);font-weight:580}.pager .next{text-align:right;grid-column:2}@media (width<=39.99rem){.pager .next{text-align:left;grid-column:auto}}.pager .end-card{gap:var(--s-1);padding:var(--s-4) var(--s-5);border:1px solid var(--accent);border-radius:var(--radius);background:var(--accent-bg);display:grid}.pager .end-card .end-links{gap:var(--s-1) var(--s-4);flex-wrap:wrap;justify-content:flex-end;display:flex}.pager .end-card .end-links a{min-height:44px;color:var(--accent);border:0;align-items:center;padding:0;text-decoration:underline;display:inline-flex}.pager .end-card .end-links a:hover{color:var(--accent-hover);background:0 0}@media (width<=39.99rem){.pager .end-card .end-links{justify-content:flex-start}}.since{font-family:var(--font-code);color:var(--teal);background:var(--teal-bg);border:1px solid color-mix(in srgb, var(--teal) 40%, transparent);vertical-align:.12em;white-space:nowrap;border-radius:4px;align-items:center;padding:.28em .55em;font-size:.78em;font-weight:700;line-height:1;display:inline-flex}.callout{--c:var(--teal);--c-bg:var(--teal-bg);border-left:4px solid var(--c);background:var(--c-bg);border-radius:0 var(--radius) var(--radius) 0;padding:var(--s-4) var(--s-5)}.callout[data-type=tip]{--c:var(--ok);--c-bg:var(--tip-bg)}.callout[data-type=warning]{--c:var(--warn);--c-bg:var(--warn-bg)}.callout[data-type=danger]{--c:var(--danger);--c-bg:var(--danger-bg)}.callout-title{align-items:center;gap:var(--s-2);letter-spacing:.08em;text-transform:uppercase;color:var(--c);margin-bottom:var(--s-2);font-size:.8125rem;font-weight:700;display:flex}.callout-title svg{flex:none;width:18px;height:18px}.callout-body>*+*{margin-top:.7em}.exercise{border:1px solid var(--ink);border-radius:var(--radius);background:var(--bg-raised);overflow:hidden}.exercise-head{align-items:baseline;gap:var(--s-1) var(--s-3);padding:var(--s-3) var(--s-5);background:var(--ink);color:var(--bg);flex-wrap:wrap;display:flex}.exercise-head .label{letter-spacing:.1em;text-transform:uppercase;font-size:.75rem;font-weight:700}.exercise-head .ttl{font-family:var(--font-display);font-weight:580;font-size:var(--step-1)}.exercise-body{padding:var(--s-4) var(--s-5) var(--s-5)}.exercise-body>*+*{margin-top:.9em}.solution{border-top:1px dashed var(--rule-strong)}.solution>summary{cursor:pointer;min-height:44px;color:var(--accent);padding-top:var(--s-2);align-items:center;font-weight:600;list-style:none;display:flex}.solution>summary::-webkit-details-marker{display:none}.solution>summary:before{content:"+";font-family:var(--font-code);width:1.2em}.solution[open]>summary:before{content:"−"}.solution>div{padding-top:var(--s-2)}.solution>div>*+*{margin-top:.9em}.tabs [role=tablist]{gap:var(--s-1);border-bottom:1px solid var(--rule-strong);scrollbar-width:thin;display:flex;overflow-x:auto}.tabs [role=tab]{appearance:none;cursor:pointer;min-height:44px;padding:0 var(--s-4);color:var(--ink-3);white-space:nowrap;background:0 0;border:0;border-bottom:3px solid #0000;margin-bottom:-1px;font-weight:600}.tabs [role=tab]:hover{color:var(--ink)}.tabs [role=tab][aria-selected=true]{color:var(--ink);border-bottom-color:var(--accent)}.tabs [role=tabpanel]{padding-top:var(--s-4)}.tabs [role=tabpanel]>*+*{margin-top:.9em}.tab-fallback{font-family:var(--font-text);margin-bottom:var(--s-2);font-size:1rem;font-weight:700}.tabs.is-enhanced .tab-fallback,.tabs [role=tabpanel][hidden]{display:none}.expressive-code{font-size:1rem}.expressive-code .frame pre{padding-block:.4rem}.expressive-code .frame.ec-output{--code-background:transparent;background:color-mix(in srgb, var(--accent-bg) 60%, var(--bg));border-left:3px solid var(--accent);border-radius:0 var(--radius) var(--radius) 0}.expressive-code .frame.ec-output pre{border:0;border-radius:0}.ec-output-label{font-family:var(--font-text);letter-spacing:.09em;text-transform:uppercase;color:var(--ink-2);padding:.45rem 1.1rem 0;font-size:.6875rem;font-weight:600;display:block}.expressive-code .frame.ec-output .copy{display:none}.level-jump{margin-top:var(--s-4)}.level-jump ul{gap:var(--s-1) var(--s-5);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.level-jump a{padding-block:.4rem;font-weight:560;display:inline-block}.level-jump .n{color:var(--ink-3);font-variant-numeric:tabular-nums;margin-left:.2em;font-weight:500}.level-block h2{scroll-margin-top:var(--s-6)}.prose,.lesson-main{overflow-wrap:break-word}.expressive-code,.expressive-code .frame{max-width:100%}.expressive-code pre{-webkit-overflow-scrolling:touch;max-width:100%}@media (width<=30rem){.prose .expressive-code{--ec-codeFontSize:.8125rem;--ec-codePadInl:.8rem}.ec-output-label{padding-inline:.8rem}}.nf{padding-block:var(--s-9)}.nf .big{font-family:var(--font-display);color:var(--accent);letter-spacing:-.04em;font-size:clamp(5rem,22vw,12rem);font-weight:400;line-height:.9}.nf h1{font-size:var(--step-3);margin-top:var(--s-4)}.nf p{margin-top:var(--s-3);color:var(--ink-2);max-width:36rem}.note-plain{margin-top:var(--s-5);color:var(--ink-2);max-width:44rem}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@media print{.site-header,.site-footer,.sidebar-wrap,.toc-wrap,.pager,.skip-link{display:none!important}}
