@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/2c55a0e60120577a-s.03ez25a9g3i0n.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/9c72aa0f40e4eef8-s.3i9rha7jpxn0q.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/ad66f9afd8947f86-s.2o7ko1d-5m1xu.woff2)format("woff2");unicode-range:U+1F??}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/5476f68d60460930-s.1ee5w62fj497l.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/2bbe8d2671613f1f-s.1way2z9fj6cig.woff2)format("woff2");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:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/1bffadaabf893a1e-s.0szrwpqb9mkwe.woff2)format("woff2");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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/83afe278b6a6bb3c-s.p.45535valc9rzk.woff2)format("woff2");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:Inter Fallback;src:local(Arial);ascent-override:90.44%;descent-override:22.52%;line-gap-override:0.0%;size-adjust:107.12%}.mm1AIW_className{font-family:Inter,Inter Fallback;font-style:normal}.mm1AIW_variable{--font-inter:"Inter", "Inter Fallback"}
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-mono:var(--font-mono);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.rounded{border-radius:.25rem}.underline{text-decoration-line:underline}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}@font-face{font-family:IBM Plex Sans Arabic;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/ibm-plex-sans-arabic-arabic-400-normal.woff2)format("woff2");unicode-range:U+6??,U+750-77F,U+870-88E,U+890-891,U+897-8E1,U+8E3-8FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC}@font-face{font-family:IBM Plex Sans Arabic;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/ibm-plex-sans-arabic-arabic-600-normal.woff2)format("woff2");unicode-range:U+6??,U+750-77F,U+870-88E,U+890-891,U+897-8E1,U+8E3-8FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC}@font-face{font-family:IBM Plex Sans Arabic;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/ibm-plex-sans-arabic-arabic-700-normal.woff2)format("woff2");unicode-range:U+6??,U+750-77F,U+870-88E,U+890-891,U+897-8E1,U+8E3-8FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC}:root{--bg:#fff;--ink:#1a1a1a;--ink-soft:#4a4a4a;--ink-faint:#6b6b6b;--line:#e5e5e5;--link:#1a5fb4;--link-hover:#c2410c;--figure-bg:#f6f7f9;--surface:#fff;--surface-2:#f4f4f5;--line-2:#d4d4d8;--line-strong:#d4d4d8;--accent:#1a5fb4;--accent-ink:#1a5fb4;--accent-dim:#eef3fb;--accent-wash:#eef3fb;--warm:#b45309;--warm-ink:#9a4508;--bg-2:#f6f7f9;--shadow:0 1px 2px #0000000f;--shadow-lift:0 4px 16px #0000001f;--font-body:var(--font-inter,"Inter"), system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-display:var(--font-body);--font-mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--fs-h1:2.1rem;--fs-h2:1.3rem;--fs-h3:1.05rem;--fs-sm:.9rem;--fs-xs:.8rem;--sp-1:.25rem;--sp-2:.5rem;--sp-3:.75rem;--sp-4:1rem;--sp-5:1.5rem;--sp-6:2rem;--sp-7:3rem;--sp-8:4rem;--r-sm:4px;--r-md:6px;--r-lg:8px;--r-pill:999px;--maxw:880px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#111214;--ink:#e8e8e8;--ink-soft:#b4b4b4;--ink-faint:#9a9a9a;--line:#2a2b2e;--link:#7cacf8;--link-hover:#fdba74;--surface:#17181b;--surface-2:#1f2024;--line-2:#34353a;--line-strong:#34353a;--on-link:#0b1220;--accent:#7cacf8;--accent-ink:#7cacf8;--accent-dim:#1b2433;--accent-wash:#1b2433;--bg-2:#17181b;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--bg:#111214;--ink:#e8e8e8;--ink-soft:#b4b4b4;--ink-faint:#9a9a9a;--line:#2a2b2e;--link:#7cacf8;--link-hover:#fdba74;--surface:#17181b;--surface-2:#1f2024;--line-2:#34353a;--line-strong:#34353a;--on-link:#0b1220;--accent:#7cacf8;--accent-ink:#7cacf8;--accent-dim:#1b2433;--accent-wash:#1b2433;--bg-2:#17181b;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:before,:after{box-sizing:border-box}[hidden]{display:none!important}html{-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--ink);font-family:var(--font-body);-webkit-font-smoothing:antialiased;margin:0;font-size:16px;line-height:1.6}h1,h2,h3,h4{color:var(--ink);margin:0;font-weight:700;line-height:1.25}p{margin:0}img{max-width:100%;display:block}a{color:var(--link);text-decoration:none}a:hover{color:var(--link-hover);text-underline-offset:2px;text-decoration:underline}:focus-visible{outline:2px solid var(--link);outline-offset:2px;border-radius:2px}ul,ol{margin:0;padding:0}.skip-link{background:var(--ink);color:var(--bg);z-index:10;inset-inline-start:-999px;padding:6px 12px;position:absolute;top:8px}.skip-link:focus{inset-inline-start:8px}.page{max-width:var(--maxw);margin:0 auto;padding:0 24px}@media (max-width:480px){.page{padding:0 18px}}.topbar{border-bottom:1px solid var(--line)}.topbar__inner{max-width:var(--maxw);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 20px;margin:0 auto;padding:14px 24px;display:flex}.topbar__name{color:var(--ink);font-weight:700}.topbar__name:hover{color:var(--ink);text-decoration:none}.topbar__nav{font-size:var(--fs-sm);flex-wrap:wrap;gap:4px 18px;display:flex}.topbar__nav a{color:var(--ink-soft);padding:6px 0}.topbar__nav a:hover{color:var(--link-hover)}.topbar__nav a[aria-current=page]{color:var(--ink);font-weight:600}@media (max-width:480px){.topbar__inner{padding:10px 18px}.topbar__nav{gap:2px 14px}}.intro{grid-template-columns:minmax(0,1fr) 190px;align-items:center;gap:40px;padding:48px 0 40px;display:grid}.intro__name{font-size:var(--fs-h1);letter-spacing:-.02em}.intro__role{color:var(--ink-soft);margin-top:6px;font-size:1.05rem}.intro__bio{gap:12px;margin-top:18px;display:grid}.intro__links{margin-top:20px}.intro__links a{padding:4px 0;font-weight:500;display:inline-block}.sep{color:var(--ink-faint);margin:0 .55em}.intro__photo{object-fit:cover;border-radius:50%;width:190px;height:190px}@media (max-width:640px){.intro{grid-template-columns:1fr;gap:20px;padding:32px 0 28px}.intro__photo{order:-1;width:120px;height:120px}.intro__name{font-size:1.75rem}}.section{border-top:1px solid var(--line);padding:32px 0 8px;scroll-margin-top:8px}.section__title{font-size:var(--fs-h2);margin-bottom:18px}.subhead{font-size:var(--fs-h3);margin:4px 0;font-weight:600}.subnote{color:var(--ink-faint);font-size:var(--fs-sm);margin-bottom:18px}.timeline{gap:22px;margin-bottom:24px;list-style:none;display:grid}.trow{grid-template-columns:160px minmax(0,1fr);gap:2px 24px;display:grid}.trow__date{color:var(--ink-faint);font-size:var(--fs-sm);white-space:nowrap;font-variant-numeric:tabular-nums;padding-top:2px}.trow__title{font-size:1rem;font-weight:600}.trow__org{color:var(--ink-soft);font-weight:400}.trow__text{color:var(--ink-soft);margin-top:2px}@media (max-width:560px){.trow{grid-template-columns:1fr}}.more{margin-top:4px}.more>summary{cursor:pointer;color:var(--link);font-size:var(--fs-sm);padding:4px 0;list-style:none;display:inline-block}.more>summary::-webkit-details-marker{display:none}.more>summary:after{content:"+";margin-inline-start:.3em}.more[open]>summary:after{content:"−"}.more>summary:hover{color:var(--link-hover)}.more__body{color:var(--ink-soft);gap:10px;margin-top:6px;font-size:.95rem;display:grid}.bullets{gap:4px;padding-inline-start:1.1rem;display:grid}.more__label{color:var(--ink);font-weight:600;font-size:var(--fs-sm)}.projects{gap:30px;margin-bottom:32px;list-style:none;display:grid}.prow{grid-template-columns:200px minmax(0,1fr);align-items:start;gap:24px;display:grid}.prow__fig{border-radius:var(--r-md);background:var(--figure-bg);border:1px solid var(--line);aspect-ratio:16/9;overflow:hidden}.prow__fig img{object-fit:cover;width:100%;height:100%}.prow__title{font-size:1.02rem;font-weight:600;line-height:1.35}.prow__title a{color:var(--ink)}.prow__title a:hover{color:var(--link-hover)}.prow__sub{color:var(--ink-soft);font-weight:400}.prow__meta{color:var(--ink-faint);font-size:var(--fs-sm);margin-top:2px;font-style:italic}.prow__links{font-size:var(--fs-sm);margin-top:2px}.prow__summary{margin-top:6px}@media (max-width:600px){.prow{grid-template-columns:1fr;gap:10px}.prow__fig{max-width:340px}}.datelist{gap:10px;margin-bottom:24px;list-style:none;display:grid}.datelist li{grid-template-columns:160px minmax(0,1fr);gap:0 24px;display:grid}.datelist__date{color:var(--ink-faint);font-size:var(--fs-sm);font-variant-numeric:tabular-nums;padding-top:2px}@media (max-width:560px){.datelist li{grid-template-columns:1fr}}.kv{gap:10px;margin-bottom:24px;display:grid}.kv__row{grid-template-columns:160px minmax(0,1fr);gap:2px 24px;display:grid}.kv__key{font-size:.95rem;font-weight:600}.kv__val{color:var(--ink-soft)}@media (max-width:560px){.kv__row{grid-template-columns:1fr}}.plainlist{gap:6px;margin-bottom:24px;padding-inline-start:1.1rem;display:grid}.pagehead{padding:40px 0 24px}.pagehead__title{letter-spacing:-.02em;font-size:1.8rem}.pagehead__lead{color:var(--ink-soft);max-width:64ch;margin-top:8px}.notes{margin-bottom:40px;list-style:none}.note{border-top:1px solid var(--line);gap:8px;padding:22px 0;scroll-margin-top:16px;display:grid}.note:target .note__title{color:var(--link-hover)}.note__date{color:var(--ink-faint);font-size:var(--fs-sm)}.note__title{font-size:1.08rem}.note p{color:var(--ink-soft)}.note__k{color:var(--ink);font-weight:600}.note__tags{color:var(--ink-faint);font-size:var(--fs-sm)}.footer{border-top:1px solid var(--line);margin-top:24px}.footer__inner{max-width:var(--maxw);color:var(--ink-faint);font-size:var(--fs-sm);flex-wrap:wrap;justify-content:space-between;gap:6px 20px;margin:0 auto;padding:20px 24px 40px;display:flex}.notice{border:1px solid var(--line-2);border-inline-start:3px solid var(--warm);border-radius:var(--r-md);gap:8px;margin:16px 0;padding:16px;display:grid}.notice__title{font-weight:700}.notice__body,.notice__meta{color:var(--ink-soft);font-size:var(--fs-sm)}.btn{border-radius:var(--r-md);border:1px solid var(--line-2);background:var(--surface);color:var(--ink);font:inherit;font-size:var(--fs-sm);cursor:pointer;align-items:center;gap:6px;padding:8px 14px;font-weight:600;display:inline-flex}.btn:hover{border-color:var(--ink-faint);color:var(--ink);text-decoration:none}.btn--accent{background:var(--link);border-color:var(--link);color:#fff}.btn--ghost{background:0 0}@media print{.topbar,.footer,.skip-link,.more>summary{display:none}.more:not([open])>.more__body{display:grid}a{color:#000}}@media (pointer:coarse){.topbar__name,.topbar__nav a,.intro__links a,.prow__links a,.prow__title a,.datelist a,.subnote a,.note__tags a,.more>summary{align-items:center;min-height:40px;padding-top:0;padding-bottom:0;display:inline-flex}.more{margin-top:0}.prow__links,.prow__title{line-height:1.2}.topbar__nav a,.intro__links a,.prow__links a{justify-content:center;min-width:40px}}@media (max-width:560px){.topbar__name{display:none}.topbar__inner{padding:4px 12px}.topbar__nav{flex-wrap:nowrap;justify-content:space-between;gap:0;width:100%;font-size:.88rem}.topbar__nav a{white-space:nowrap;padding-left:4px;padding-right:4px}}.topbar{z-index:20;background:var(--bg);position:sticky;top:0}@supports (color:color-mix(in lab, red, red)){.topbar{background:color-mix(in srgb, var(--bg) 92%, transparent)}}.topbar{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.topbar__nav a.is-active{color:var(--ink);box-shadow:inset 0 -2px 0 var(--link);font-weight:600}.section{scroll-margin-top:76px}.note{scroll-margin-top:72px}@media (max-width:560px){.section{scroll-margin-top:56px}}.role{padding-bottom:4px}.role__head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:2px 16px;display:flex}.role__title{font-size:1.05rem;font-weight:700}.role__date{color:var(--ink-faint);font-size:var(--fs-sm);white-space:nowrap;font-variant-numeric:tabular-nums}.role__org{color:var(--ink-soft);margin-top:2px}.role__org a{font-weight:600}.role__points{color:var(--ink);margin-top:8px}.role__points li::marker{color:var(--ink-faint)}.role__text{color:var(--ink-soft);margin-top:6px}.timeline .role+.role{border-top:1px dashed var(--line);padding-top:20px}@media (max-width:560px){.role__head{flex-direction:column}}.prow__links a{font-weight:600}.prow__private{color:var(--ink-faint);font-style:italic}.topbar{background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}.topbar__nav a:hover,.topbar__nav a.is-active{text-decoration:none}@media (pointer:coarse){.role__org a{padding:11px 0;display:inline}}.intro{scroll-margin-top:200px}.prow__more{font-size:var(--fs-sm);margin-top:6px}.prow__more a{font-weight:600}.crumbs{font-size:var(--fs-sm);color:var(--ink-faint);padding:28px 0 0}.crumbs a{color:var(--ink-soft)}.phead{padding:14px 0 24px}.phead__title{letter-spacing:-.02em;font-size:2rem}.phead__sub{color:var(--ink-soft);margin-top:4px;font-size:1.15rem}.phead__meta{color:var(--ink-faint);font-size:var(--fs-sm);margin-top:8px;font-style:italic}.phead__tagline{margin-top:14px;font-size:1.05rem}.phead__links{flex-wrap:wrap;gap:10px;margin-top:18px;display:flex}.phead__links .btn{text-decoration:none}.btn--accent:hover{color:#fff;background:var(--link-hover);border-color:var(--link-hover)}.phero{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--figure-bg);margin:0 0 8px;overflow:hidden}.phero img{width:100%;height:auto}.psec{border-top:1px solid var(--line);margin-top:24px;padding:28px 0 4px}.psec__title{font-size:var(--fs-h2);margin-bottom:14px}.prose{gap:12px;max-width:70ch;display:grid}.pquestion{color:var(--ink-soft);max-width:70ch;font-size:1.05rem;font-style:italic}.psec .bullets{gap:8px;max-width:75ch}.steps{counter-reset:step;gap:14px;list-style:none;display:grid}.steps li{counter-increment:step;grid-template-columns:34px minmax(0,1fr);column-gap:12px;display:grid}.steps li:before{content:counter(step);width:28px;height:28px;font-size:var(--fs-sm);color:var(--link);border:1.5px solid var(--link);border-radius:50%;grid-row:span 2;place-items:center;font-weight:700;display:grid}.steps__title{font-weight:600}.steps li p:last-child{color:var(--ink-soft)}.examples{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.example{align-content:start;gap:8px;margin:0;display:grid}.example--io{grid-column:1/-1}.example__img,.example__video{border:1px solid var(--line);border-radius:var(--r-md);background:var(--figure-bg);display:block;position:relative;overflow:hidden}.example__img img,.example__video img{width:100%;height:auto}.example__video{aspect-ratio:16/9}.example__video img{object-fit:cover;height:100%}.example__play{color:#fff;background:#000000a6;border-radius:50%;place-items:center;width:64px;height:64px;margin:auto;padding-left:4px;font-size:1.5rem;display:grid;position:absolute;inset:0}.example__video:hover .example__play{background:#c2410c}.pkeywords{color:var(--ink-soft);font-size:var(--fs-sm);line-height:1.7}.example figcaption{color:var(--ink-soft);font-size:var(--fs-sm)}.io{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.io__box{border:1px solid var(--line);border-radius:var(--r-md);background:var(--figure-bg);padding:12px 14px}:root .io__box{color:#1a1a1a}.io__label{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em;color:#6b6b6b;margin-bottom:4px;font-weight:700}.io__text{white-space:pre-wrap;font-family:var(--font-mono);font-size:.88rem}@media (max-width:640px){.examples,.io{grid-template-columns:1fr}}.tech{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;list-style:none;display:grid}.tech__item{border:1px solid var(--line);border-radius:var(--r-md);grid-template-columns:34px minmax(0,1fr);align-items:center;gap:10px;padding:10px 12px;display:grid}.tech__logo{object-fit:contain;justify-self:center;width:26px;height:26px}.tech__logo--text{background:var(--surface-2);width:28px;height:28px;color:var(--ink-soft);text-transform:uppercase;border-radius:6px;place-items:center;font-size:.72rem;font-weight:700;display:grid}.tech__name{font-size:.95rem;font-weight:600}.tech__name a{color:var(--ink)}.tech__name a:hover{color:var(--link-hover)}.tech__role{color:var(--ink-faint);font-size:var(--fs-sm);line-height:1.35}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .tech__logo--dark{filter:brightness(0)invert()}}:root[data-theme=dark] .tech__logo--dark{filter:brightness(0)invert()}.pnav{border-top:1px solid var(--line);font-size:var(--fs-sm);grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;margin:40px 0 8px;padding-top:20px;display:grid}.pnav a{gap:2px;font-weight:600;display:grid}.pnav__label{color:var(--ink-faint);font-weight:400}.pnav__next{text-align:end}.pnav__all{text-align:center}@media (max-width:480px){.pnav{grid-template-columns:1fr 1fr}.pnav__all{order:3;grid-column:1/-1}}.contact__note{color:var(--ink-faint)}@media (pointer:coarse){.crumbs a,.pnav a,.footer a,.kv__val a,.plainlist a,.example figcaption a{padding:10px 0}.prow__more a,.footer a,.crumbs a,.tech__name a,.example figcaption a,.pnav a,.kv__val a,.plainlist a,.subnote a{align-items:center;min-width:32px;min-height:40px;padding-top:0;padding-bottom:0;display:inline-flex}.footer__inner span{flex-wrap:wrap;align-items:center;gap:0 4px;display:inline-flex}}.tech__logo--text{font-size:.75rem}:root{--accent-2:#c2410c;--live:#16a34a;--ease:cubic-bezier(.2, .7, .2, 1)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--accent-2:#fdba74;--live:#4ade80}}:root[data-theme=dark]{--accent-2:#fdba74;--live:#4ade80}html{scroll-behavior:smooth}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.icon{vertical-align:-.125em;flex:none;width:1em;height:1em}.icon--title{width:1.05em;height:1.05em;color:var(--link);vertical-align:-.15em;transition:transform .35s var(--ease);margin-inline-end:.5em}.section__title:hover .icon--title,.psec__title:hover .icon--title{transform:rotate(-10deg)scale(1.12)}.icon--key{width:1em;height:1em;color:var(--ink-faint);vertical-align:-.15em;margin-inline-end:.45em}.btn .icon{width:1.05em;height:1.05em}.topbar:before{content:"";background:linear-gradient(90deg, var(--link), #7c3aed, var(--accent-2), var(--link));background-size:300% 100%;height:3px;animation:4.5s ease-out hue-slide;position:absolute;inset:0 0 auto}@keyframes hue-slide{to{background-position:300% 0}}.intro__live{vertical-align:.08em;background:var(--live);width:.55em;height:.55em;box-shadow:0 0 0 0 var(--live);border-radius:50%;margin-inline-end:.55em;display:inline-block}@supports (color:color-mix(in lab, red, red)){.intro__live{box-shadow:0 0 0 0 color-mix(in srgb, var(--live) 60%, transparent)}}.intro__live{animation:2.4s ease-out 2 pulse}@keyframes pulse{50%{opacity:.5}}.typed{font-family:var(--font-mono);color:var(--link);min-height:1.6em;margin-top:10px;font-size:.95rem}.typed:empty{display:none}.typed__caret{vertical-align:-.2em;opacity:.7;background:currentColor;width:.55em;height:1.1em;margin-inline-start:2px;animation:1.05s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.intro__visual{aspect-ratio:320/230;justify-self:end;width:320px;position:relative}.intro__net{position:absolute;inset:0}.intro__photowrap{aspect-ratio:1;background:conic-gradient(from 210deg, var(--link), #7c3aed, var(--accent-2), var(--link));width:61.875%;box-shadow:0 10px 30px -14px var(--link);border-radius:50%;padding:4px;position:absolute;top:6.957%;left:39.375%}@supports (color:color-mix(in lab, red, red)){.intro__photowrap{box-shadow:0 10px 30px -14px color-mix(in srgb, var(--link) 60%, transparent)}}.intro__photowrap .intro__photo{border:3px solid var(--bg);width:100%;height:100%}.net{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.net--sym{display:none}.net__edge{stroke:var(--line);stroke-width:1px}.net__pulse{stroke:var(--link);stroke-width:1.6px;stroke-linecap:round;opacity:.95}.net__pulse--b{stroke:var(--accent-2);stroke-width:1.4px;opacity:.85}.net__node{fill:var(--bg);stroke:var(--link)}@supports (color:color-mix(in lab, red, red)){.net__node{stroke:color-mix(in srgb, var(--link) 55%, var(--line))}}.net__node{stroke-width:1.5px}.net__glow{fill:var(--link);opacity:0;transform-box:fill-box;transform-origin:50%}.net__glow--b{fill:var(--accent-2)}.intro{grid-template-columns:minmax(0,1fr) 320px;gap:32px}@media (max-width:860px){.intro{grid-template-columns:minmax(0,1fr) 260px;gap:24px}.intro__visual{width:260px}}@media (max-width:640px){.intro{text-align:center;grid-template-columns:1fr;gap:14px;padding:24px 0 28px}.intro__visual{aspect-ratio:360/230;order:-1;justify-self:center;width:min(340px,100%)}.intro__photowrap{width:55%;padding:3px;left:22.5%}.net--wide{display:none}.net--sym{display:block}.intro__name{font-size:1.85rem}.intro__bio{text-align:start;margin-top:16px}.intro__links.ilinks{justify-content:center}}[dir=rtl] .intro__visual .net--wide{transform:scaleX(-1)}[dir=rtl] .intro__photowrap{left:auto;right:39.375%}@media (max-width:640px){[dir=rtl] .intro__photowrap{right:22.5%}}.timeline.has-rail:after{content:"";width:2px;position:absolute;inset-inline-start:19px}@media (max-width:560px){.timeline.has-rail:after{inset-inline-start:15px}}.icon--title{box-sizing:content-box;background:var(--accent-dim);vertical-align:-.35em;border-radius:50%;width:1em;height:1em;padding:6px}.loss{vertical-align:-2px;width:42px;height:14px;margin-inline-end:8px;overflow:visible}.loss path{fill:none;stroke:var(--link);stroke-width:1.6px;stroke-linecap:round;stroke-dasharray:1;stroke-dashoffset:1px;animation:draw 2.4s var(--ease) .4s forwards}@keyframes draw{to{stroke-dashoffset:0}}@media (prefers-reduced-motion:reduce){.loss path{stroke-dashoffset:0}}.ilinks{flex-wrap:wrap;gap:6px 10px;display:flex}.ilink{border:1px solid var(--line);border-radius:var(--r-pill);color:var(--ink);font-weight:500;font-size:var(--fs-sm);transition:border-color .2s, color .2s, transform .2s var(--ease), background-color .2s;align-items:center;gap:.45em;display:inline-flex;padding:6px 12px!important}.ilink .icon{color:var(--link);transition:transform .3s var(--ease)}.ilink:hover{color:var(--link);border-color:var(--link);background:var(--accent-dim);text-decoration:none;transform:translateY(-2px)}.ilink:hover .icon{transform:scale(1.15)rotate(-6deg)}.prose a,.bullets a,.role__org a,.datelist a,.subnote a,.prow__links a,.prow__more a,.kv__val a,.contact__note a{transition:background-size .25s var(--ease), color .2s;background:linear-gradient(currentColor,currentColor) 0 100%/0 1px no-repeat}.prose a:hover,.bullets a:hover,.role__org a:hover,.datelist a:hover,.subnote a:hover,.prow__links a:hover,.prow__more a:hover,.kv__val a:hover{background-size:100% 1px;text-decoration:none}.prow__more a .arr,.subnote a{transition:letter-spacing .2s}.timeline{position:relative}.role--rail{min-height:40px;padding-inline-start:58px;position:relative}.timeline.has-rail:before{content:"";background:linear-gradient(var(--line), var(--line));inset-inline-start:19px;width:2px;position:absolute;top:8px;bottom:8px}.role__mark{background:var(--bg);border:1px solid var(--line);width:40px;height:40px;color:var(--link);letter-spacing:.02em;transition:transform .3s var(--ease), border-color .3s;inset-inline-start:0;border-radius:10px;place-items:center;font-size:.74rem;font-weight:700;display:grid;position:absolute;top:0;box-shadow:0 1px 2px #0000000d}.role__mark img{object-fit:contain;width:22px;height:22px}.role--rail:hover .role__mark{border-color:var(--link);transform:scale(1.08)rotate(-4deg)}.role--current .role__mark:after{content:"";background:var(--live);border:2px solid var(--bg);inset-inline-end:-3px;border-radius:50%;width:10px;height:10px;animation:2.4s ease-out 2 pulse;position:absolute;top:-3px}.timeline .role--rail+.role--rail{border-top:0;padding-top:0}.timeline.has-rail{gap:26px}@media (max-width:560px){.role--rail{padding-inline-start:46px}.role__mark{border-radius:8px;width:32px;height:32px;font-size:.66rem}.role__mark img{width:18px;height:18px}.timeline.has-rail:before{inset-inline-start:15px}}.ti{white-space:nowrap;align-items:center;gap:5px;display:inline-flex}.ti__logo{object-fit:contain;width:16px;height:16px;transition:transform .3s var(--ease)}.ti:hover .ti__logo{transform:translateY(-2px)scale(1.15)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .ti__logo.tech__logo--dark,:root:not([data-theme=light]) .role__mark .tech__logo--dark{filter:brightness(0)invert()}}:root[data-theme=dark] .ti__logo.tech__logo--dark,:root[data-theme=dark] .role__mark .tech__logo--dark{filter:brightness(0)invert()}.prow__stack{color:var(--ink-soft);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:.84rem;display:flex}.phead__stack{align-items:center;margin-top:14px;font-size:.9rem}.phead__stacklabel{color:var(--ink-faint);font-weight:600;font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.06em}.prow__fig,.phero{transition:transform .35s var(--ease), box-shadow .35s var(--ease);will-change:transform}.prow:hover .prow__fig{box-shadow:0 10px 24px -10px #00000040}.prow__title a{transition:color .2s}.prow__more a:after{content:" "}.tech__item{transition:transform .25s var(--ease), border-color .25s, box-shadow .25s}.tech__item:hover{border-color:var(--link);transform:translateY(-3px)}@supports (color:color-mix(in lab, red, red)){.tech__item:hover{border-color:color-mix(in srgb, var(--link) 45%, var(--line))}}.tech__item:hover{box-shadow:0 8px 20px -12px #0000004d}.tech__item:hover .tech__logo{animation:hop .5s var(--ease)}@keyframes hop{40%{transform:translateY(-4px)rotate(-6deg)}}.steps,.steps li{position:relative}.steps li:not(:last-child):after{content:"";background:var(--link);inset-inline-start:13px;width:2px;position:absolute;top:32px;bottom:-14px}@supports (color:color-mix(in lab, red, red)){.steps li:not(:last-child):after{background:color-mix(in srgb, var(--link) 25%, transparent)}}.steps li:before{background:var(--bg);z-index:1;transition:background-color .25s,color .25s;position:relative}.steps li:hover:before{background:var(--link);color:var(--bg)}.example__play{transition:transform .25s var(--ease), background-color .25s;padding-left:0;font-size:0}.example__play:before{content:"";border:11px solid #0000;border-left:18px solid #fff;border-right-width:0;width:0;height:0;margin-left:5px}.example__video:hover .example__play{transform:scale(1.1)}.example__img img,.example__video img{transition:transform .5s var(--ease)}.example__img:hover img,.example__video:hover img{transform:scale(1.03)}.btn{transition:transform .2s var(--ease), background-color .2s, border-color .2s, box-shadow .2s}.btn:hover{transform:translateY(-2px);box-shadow:0 6px 14px -8px #00000059}.filter{flex-wrap:wrap;align-items:center;gap:8px;margin:-4px 0 24px;display:flex}.filter:empty{display:none}.filter__label{color:var(--ink-faint);font-size:var(--fs-sm);margin-inline-end:2px}.filter__btn{font:inherit;font-size:var(--fs-sm);border-radius:var(--r-pill);border:1px solid var(--line);color:var(--ink-soft);cursor:pointer;transition:background-color .2s var(--ease), border-color .2s var(--ease), color .2s var(--ease);background:0 0;align-items:center;gap:8px;padding:6px 12px;font-weight:500;display:inline-flex}.filter__btn:hover{border-color:var(--link);color:var(--link)}.filter__btn[aria-pressed=true]{background:var(--ink);border-color:var(--ink);color:var(--bg)}.filter__count{font-size:var(--fs-xs);opacity:.7;font-variant-numeric:tabular-nums}@media (pointer:coarse){.filter__btn,.ilink{min-height:40px}}.totop{z-index:30;border:1px solid var(--line);background:var(--bg);width:44px;height:44px;color:var(--ink);cursor:pointer;opacity:0;pointer-events:none;transition:opacity .25s, transform .25s var(--ease), color .2s, border-color .2s;inset-inline-end:20px;border-radius:50%;place-items:center;display:grid;position:fixed;bottom:20px;transform:translateY(12px);box-shadow:0 6px 18px -8px #00000059}.totop .icon{width:20px;height:20px}.totop.is-shown{opacity:1;pointer-events:auto;transform:none}.totop:hover{color:var(--link);border-color:var(--link);transform:translateY(-3px)}.progress{z-index:40;background:var(--link);transform-origin:0;height:3px;position:fixed;top:0;left:0;right:0;transform:scaleX(0)}.motion .reveal{opacity:0;transition:opacity .6s var(--ease) var(--reveal-delay,0s), transform .6s var(--ease) var(--reveal-delay,0s);transform:translateY(14px)}.motion .reveal.is-in{opacity:1;transform:none}.motion .prow__fig.reveal.is-in,.motion .phero.reveal.is-in{transform:none}@media print{.totop,.progress,.typed,.filter{display:none}.motion .reveal{opacity:1;transform:none}.topbar:before{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.intro__links.ilinks .ilink,.ilinks .ilink{gap:.5em;display:inline-flex}@media (max-width:640px){.typed{min-height:3.2em;font-size:.88rem}.ilinks{gap:8px}.ilinks .ilink{padding:5px 11px!important}}.skills__ideas{color:var(--ink-soft)}.skills__tools{color:var(--ink);flex-wrap:wrap;gap:6px 16px;margin-top:6px;font-size:.95rem;font-weight:500;display:flex}.kv__val .skills__tools:first-child{margin-top:0}@media (max-width:420px){.ilinks{gap:6px}.ilinks .ilink{gap:.4em;font-size:.84rem;padding:5px 9px!important}}@media (pointer:coarse){.note a,.prow a,.role a,.psec a,.tech a,.example a{min-height:42px}}.role__mark{letter-spacing:-.02em;font-size:12px}@media (max-width:560px){.role--rail{padding-inline-start:50px}.role__mark{width:38px;height:38px;font-size:12px}.timeline.has-rail:before,.timeline.has-rail:after{inset-inline-start:18px}}@media (pointer:coarse){.plainlist a{align-items:center;min-height:42px;display:inline-flex}.bullets a{padding-block:10px;display:inline}}.timeline.has-rail:after{height:var(--sig,0px);opacity:1;background:linear-gradient(to bottom, var(--link), var(--link));animation:none;top:8px;bottom:auto}@supports (color:color-mix(in lab, red, red)){.timeline.has-rail:after{background:linear-gradient(to bottom, color-mix(in srgb, var(--link) 15%, transparent), var(--link))}}.timeline.has-rail:after{border-radius:2px}.rail__dot{background:var(--link);pointer-events:none;width:10px;height:10px;transform:translate(-50%, calc(var(--sig,0px) - 50%));opacity:0;box-shadow:0 0 0 4px var(--link), 0 0 14px 2px var(--link);inset-inline-start:20px;border-radius:50%;transition:opacity .3s;position:absolute;top:8px}@supports (color:color-mix(in lab, red, red)){.rail__dot{box-shadow:0 0 0 4px color-mix(in srgb, var(--link) 20%, transparent), 0 0 14px 2px color-mix(in srgb, var(--link) 55%, transparent)}}.timeline.is-flowing .rail__dot{opacity:1}.role__mark{transition:transform .3s var(--ease), border-color .4s, box-shadow .4s, color .4s}.role--rail.is-lit .role__mark{border-color:var(--link);box-shadow:0 0 0 3px var(--accent-dim), 0 4px 14px -6px var(--link)}@supports (color:color-mix(in lab, red, red)){.role--rail.is-lit .role__mark{box-shadow:0 0 0 3px var(--accent-dim), 0 4px 14px -6px color-mix(in srgb, var(--link) 60%, transparent)}}@media (max-width:560px){.rail__dot{inset-inline-start:19px}}.role__mark{z-index:2}.topbar__tools{align-items:center;gap:8px;margin-inline-start:auto;display:flex}.langs{border:1px solid var(--line);border-radius:var(--r-pill);background:var(--bg);align-items:center;padding:2px;display:inline-flex}.langs a{border-radius:var(--r-pill);letter-spacing:.02em;min-width:34px;color:var(--ink-soft);justify-content:center;align-items:center;padding:3px 9px;font-size:.78rem;font-weight:600;line-height:1.4;transition:background-color .2s,color .2s;display:inline-flex}.langs a:hover{color:var(--link);text-decoration:none}.langs a[aria-current=true]{background:var(--ink);color:var(--bg)}.langs a[lang=ar]{font-family:"IBM Plex Sans Arabic", var(--font-body);letter-spacing:0;font-size:.86rem}.themebtn{border:1px solid var(--line);background:var(--bg);width:34px;height:34px;color:var(--ink-soft);cursor:pointer;transition:border-color .2s, color .2s, transform .25s var(--ease);border-radius:50%;place-items:center;padding:0;display:grid}.themebtn:hover{color:var(--link);border-color:var(--link);transform:rotate(-12deg)}.themebtn .icon{width:18px;height:18px}.themebtn .icon--sun{display:none}:root[data-theme=dark] .themebtn .icon--sun{display:block}:root[data-theme=dark] .themebtn .icon--moon{display:none}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .themebtn .icon--sun{display:block}:root:not([data-theme=light]) .themebtn .icon--moon{display:none}}@media (max-width:560px){.topbar__inner{row-gap:2px;padding:4px 12px 6px}.topbar__nav{order:1}.topbar__tools{order:2;justify-content:center;gap:10px;width:100%}.langs a{min-width:32px;padding:2px 8px}.themebtn{width:30px;height:30px}}@media (pointer:coarse){.langs a,.themebtn{min-height:34px}}:root[data-theme=dark] .prow__fig img,:root[data-theme=dark] .phero img,:root[data-theme=dark] .example__img img{filter:brightness(.88)contrast(1.02)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .prow__fig img,:root:not([data-theme=light]) .phero img,:root:not([data-theme=light]) .example__img img{filter:brightness(.88)contrast(1.02)}}html[lang=ar]{--font-body:"IBM Plex Sans Arabic", var(--font-inter,"Inter"), system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans Arabic", Arial, sans-serif}html[lang=ar] body{line-height:1.8}html[lang=ar] h1,html[lang=ar] h2,html[lang=ar] h3,html[lang=ar] .intro__name,html[lang=ar] .pagehead__title,html[lang=ar] .phead__title{letter-spacing:0;line-height:1.45}html[lang=ar] .phead__stacklabel,html[lang=ar] .io__label{letter-spacing:0}html[lang=ar] .prow__meta,html[lang=ar] .phead__meta{font-style:normal}.io__text,.mono,code,pre{text-align:start;direction:ltr;unicode-bidi:isolate}[dir=rtl] .io__text{text-align:left}.typed,.note__tags,.pkeywords,.prow__stack,.phead__stack,.skills__tools{unicode-bidi:plaintext}[dir=rtl] .progress{transform-origin:100%}[dir=rtl] .rail__dot{transform:translate(50%, calc(var(--sig,0px) - 50%))}[dir=rtl] .themebtn:hover{transform:rotate(12deg)}[dir=rtl] .section__title:hover .icon--title,[dir=rtl] .psec__title:hover .icon--title{transform:rotate(10deg)scale(1.12)}html[lang=ar] .typed{font-family:var(--font-body);font-size:1rem}.prose code,.bullets code,.steps code,figcaption code{font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--line);white-space:nowrap;border-radius:4px;padding:.08em .35em;font-size:.86em}@media (max-width:560px){.footer__inner{text-align:center;justify-content:center;padding:20px 18px 36px}.footer__inner span{justify-content:center}}.phero a{cursor:zoom-in;display:block}@media (pointer:coarse){.plainlist--text a{min-height:0;padding-block:10px;display:inline}}.menubtn{display:none}@media (max-width:720px){.js .topbar__inner{flex-wrap:wrap;align-items:center;gap:0;padding:8px 16px}.js .topbar__name{white-space:nowrap;align-items:center;min-height:40px;margin-inline-end:auto;padding:0;font-size:1rem;display:inline-flex}.js .topbar__tools{display:contents}.js .themebtn{order:1;width:40px;height:40px}.js .menubtn{border:1px solid var(--line);background:var(--bg);width:40px;height:40px;color:var(--ink);cursor:pointer;border-radius:50%;order:2;place-items:center;margin-inline-start:8px;padding:0;transition:border-color .2s,color .2s;display:grid}.js .menubtn:hover,.js .topbar.is-open .menubtn{border-color:var(--link);color:var(--link)}.menubtn__bars,.menubtn__bars:before,.menubtn__bars:after{width:18px;height:2px;transition:transform .25s var(--ease), opacity .2s, background-color .2s;background:currentColor;border-radius:2px;display:block}.menubtn__bars{position:relative}.menubtn__bars:before,.menubtn__bars:after{content:"";position:absolute;inset-inline-start:0}.menubtn__bars:before{transform:translateY(-6px)}.menubtn__bars:after{transform:translateY(6px)}.topbar.is-open .menubtn__bars{background:0 0}.topbar.is-open .menubtn__bars:before{transform:rotate(45deg)}.topbar.is-open .menubtn__bars:after{transform:rotate(-45deg)}.js .topbar__nav{border-top:1px solid var(--line);flex-flow:column;order:3;gap:0;width:100%;margin-top:10px;font-size:1rem;display:none}.js .topbar__nav a{border-bottom:1px solid var(--line);white-space:normal;padding:13px 4px;display:block}.js .topbar__nav a.is-active{box-shadow:inset 3px 0 0 var(--link);color:var(--link);padding-inline-start:14px}[dir=rtl].js .topbar__nav a.is-active{box-shadow:inset -3px 0 0 var(--link)}.js .langs{order:4;margin:14px 0 12px;display:none}.js .langs a{min-width:56px;min-height:38px;padding:4px 14px;font-size:.85rem}.js .topbar.is-open .topbar__nav{animation:menu-in .22s var(--ease);display:flex}.js .topbar.is-open .langs{animation:menu-in .22s var(--ease);display:inline-flex}}@keyframes menu-in{0%{opacity:0;transform:translateY(-6px)}}.net__edge--dead{stroke-dasharray:3 4;opacity:.55}.net__node--dead{fill:var(--bg);stroke:var(--ink-faint);stroke-dasharray:2 2}.net__out{transform-box:fill-box;transform-origin:50%}.net__outring{fill:var(--bg);stroke:var(--link);stroke-width:2.5px}.net__outicon{fill:none;stroke:var(--link);stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round}.net__outlabel{fill:var(--link);font:700 28px var(--font-body);letter-spacing:-.02em}.pagehead--visual{grid-template-columns:minmax(0,1fr) 280px;align-items:center;gap:12px 32px;display:grid}.pagehead--visual>:not(.cnet){grid-column:1}.cnet{grid-area:1/2/span 3;margin:0}.cnet .net,.nfnet .net{width:100%;height:auto;position:static}.cnet .net{aspect-ratio:280/150}.cnet figcaption,.nfnet figcaption{text-align:center;color:var(--ink-faint);font-size:var(--fs-sm);margin-top:6px}@media (max-width:640px){.pagehead--visual{grid-template-columns:1fr}.cnet{grid-area:auto/1;justify-self:center;width:min(280px,100%);margin-top:8px}}.nfnet{width:min(360px,100%);margin:28px auto 0}.nfnet .net{aspect-ratio:320/170}.section__lead{color:var(--ink-soft);max-width:64ch;margin:-8px 0 18px}.build{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin:0;padding:0;list-style:none;display:grid}.build__card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);transition:border-color .25s, transform .25s var(--ease), box-shadow .25s;align-items:flex-start;gap:14px;padding:16px 18px;display:flex;position:relative}.build__card.has-link:hover{border-color:var(--link)}@supports (color:color-mix(in lab, red, red)){.build__card.has-link:hover{border-color:color-mix(in srgb, var(--link) 55%, var(--line))}}.build__card.has-link:hover{box-shadow:0 10px 24px -16px var(--link);transform:translateY(-2px)}@supports (color:color-mix(in lab, red, red)){.build__card.has-link:hover{box-shadow:0 10px 24px -16px color-mix(in srgb, var(--link) 60%, transparent)}}.build__icon{background:var(--accent-dim);width:40px;height:40px;color:var(--link);border-radius:50%;flex:none;place-items:center;display:grid}.build__icon .icon{width:20px;height:20px}.build__body{min-width:0}.build__name{font-size:1.05rem}.build__link{color:var(--ink)}.build__link:after{content:"";border-radius:inherit;position:absolute;inset:0}.build__link:hover{color:var(--link);text-decoration:none}.build__card.has-link:hover .build__link{color:var(--link)}.build__line{color:var(--ink-soft);font-size:var(--fs-sm);margin-top:4px;line-height:1.55}.build__stack{color:var(--ink-faint);unicode-bidi:plaintext;margin-top:8px;font-size:.8rem}@media (max-width:640px){.build{grid-template-columns:1fr}}.hero__links{flex-wrap:wrap;align-items:center;gap:10px 12px;margin-top:22px;display:flex}.btn--lg{border-radius:var(--r-pill);padding:10px 18px;font-weight:600}.hero__quiet{font-size:var(--fs-sm);flex-wrap:wrap;gap:4px 16px;margin-inline-start:6px;display:flex}.hlink{color:var(--ink-soft);align-items:center;gap:.4em;font-weight:500;display:inline-flex}.hlink:hover{color:var(--link);text-decoration:none}@media (max-width:640px){.hero__links{justify-content:center}.hero__quiet{margin-inline-start:0;justify-content:center;width:100%;margin-top:4px}}@media (pointer:coarse){.hlink{min-height:40px}}.pmetrics{flex-wrap:wrap;gap:8px;margin:14px 0 0;padding:0;list-style:none;display:flex}.pmetrics li{border-radius:var(--r-pill);background:var(--accent-dim);color:var(--ink);border:1px solid var(--link);unicode-bidi:plaintext;padding:4px 12px;font-size:.85rem;font-weight:600}@supports (color:color-mix(in lab, red, red)){.pmetrics li{border:1px solid color-mix(in srgb, var(--link) 22%, transparent)}}.role__more{margin-top:6px}.role__more>summary{cursor:pointer;color:var(--link);font-size:var(--fs-sm);align-items:center;gap:4px;font-weight:600;list-style:none;display:inline-flex}.role__more>summary::-webkit-details-marker{display:none}.role__more>summary .icon{transition:transform .25s var(--ease)}.role__more[open]>summary .icon{transform:rotate(180deg)}.role__more>.bullets{margin-top:8px}@media (pointer:coarse){.role__more>summary{min-height:40px}}@media print{.role__more>.bullets{display:grid}}.examples>.example:only-child{grid-column:1/-1}.btn--accent,.btn--accent:hover{color:var(--on-link,#fff)}picture{display:contents}main:focus{outline:none}.net.is-playing .net__pulse{animation:net-pulse var(--d) cubic-bezier(.4, 0, .6, 1) var(--t0) both}.net.is-playing .net__glow{animation:net-glow var(--d) linear var(--t0) both}.net.is-playing .net__out{animation:net-out var(--d) linear var(--t0) both}@keyframes net-pulse{0%{stroke-dashoffset:.14px}to{stroke-dashoffset:-1px}}@keyframes net-glow{0%{opacity:0;transform:scale(1)}25%{opacity:1;transform:scale(1.3)}to{opacity:0;transform:scale(1)}}@keyframes net-out{0%,to{transform:scale(1)}25%{transform:scale(1.05)}}.net__pulse{stroke-dashoffset:.14px}.cnet--quiet{opacity:.9}.cnet--quiet .net{aspect-ratio:280/150}@media (max-width:640px){.cnet--quiet{display:none}}.rail__dot{list-style:none}h3.kv__key{font-size:.95rem;font-weight:600;line-height:1.6}.typed.is-done .typed__caret{opacity:.7;animation:none}.crumbs ol{flex-wrap:wrap;gap:0;list-style:none;display:flex}.crumbs li+li:not(.visually-hidden):before{content:"/";color:var(--ink-faint);margin:0 .55em}.example__media{background:var(--figure-bg);width:100%;height:auto;display:block}.intro__role{text-wrap:pretty}.pagehead__title,.phead__title,.intro__name,.section__title{text-wrap:balance}.loop{position:relative}.loop__btn{color:#fff;cursor:pointer;width:36px;height:36px;transition:background-color .2s, transform .2s var(--ease);inset-inline-end:8px;background:#111214ad;border:1px solid #ffffff59;border-radius:50%;place-items:center;padding:0;display:grid;position:absolute;bottom:8px}.loop__btn:hover{background:var(--link-hover);transform:scale(1.06)}.loop__btn .icon{width:16px;height:16px}.loop__btn:focus-visible{outline-offset:2px;box-shadow:0 0 0 4px var(--link);outline:2px solid #fff}@media (pointer:coarse){.loop__btn{width:44px;height:44px}}.nf-langs{color:var(--ink-soft);font-size:var(--fs-sm);text-align:center;margin:8px 0 32px;padding:0;list-style:none}.nf-langs li[lang=ar]{font-family:"IBM Plex Sans Arabic", var(--font-body)}.pagehead__lead a,.plainlist--text a,.nf-langs a,.prose a,.bullets a{text-underline-offset:2px;text-decoration:underline;text-decoration-thickness:1px}.subnote a{min-height:24px;padding-block:2px;display:inline-block}.filter__count{opacity:1;color:var(--ink-faint)}.filter__btn[aria-pressed=true] .filter__count{color:inherit}.typed.is-done .typed__caret{animation:none}a,button,summary{touch-action:manipulation}.cf-top{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:8px 20px;display:flex}.cf-subnav{border:1px solid var(--line);border-radius:var(--r-pill);font-size:var(--fs-sm);gap:4px;padding:3px;display:flex}.cf-subnav a{border-radius:var(--r-pill);color:var(--ink-soft);padding:4px 14px}.cf-subnav a:hover{color:var(--link);text-decoration:none}.cf-subnav a[aria-current=page]{background:var(--accent-dim);color:var(--ink);font-weight:600}@media (pointer:coarse){.cf-subnav a{align-items:center;min-height:40px;display:inline-flex}}.cf-hero{padding:26px 0 22px}.cf-hero__brand{align-items:center;gap:16px;display:flex}.cf-hero__logowrap{flex:none;width:64px;height:64px;display:block}.cf-hero__logo{border-radius:14px;width:64px;height:64px}.cf-top .crumbs li{align-items:center;display:inline-flex}.cf-hero__title{font-size:2.3rem}.cf-hero__kind{color:var(--ink-faint);font-weight:600;font-size:var(--fs-sm)}.cf-hero__tagline{letter-spacing:-.01em;text-wrap:balance;margin-top:18px;font-size:1.45rem;font-weight:700;line-height:1.3}.cf-hero__value{color:var(--ink-soft);max-width:62ch;margin-top:6px;font-size:1.08rem}.cf-install{margin-top:20px}.cf-hero__alt{color:var(--ink-faint);font-size:var(--fs-sm);margin-top:10px}.cf-badges{flex-wrap:wrap;gap:8px;margin:16px 0 0;padding:0;list-style:none;display:flex}.cf-badges li{border-radius:var(--r-pill);background:var(--accent-dim);border:1px solid var(--link);padding:3px 12px}@supports (color:color-mix(in lab, red, red)){.cf-badges li{border:1px solid color-mix(in srgb, var(--link) 22%, transparent)}}.cf-badges li{font-size:.85rem;font-weight:600}.cf-hero code,.cf-feature code,.cf-qa code,.cf-how code,.cf-fig code,.cf-releases code,.cf-prose code,.cf-hero__alt code{font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--line);border-radius:4px;padding:.08em .35em;font-size:.86em}.cf-shot{border:1px solid var(--line);border-radius:var(--r-md);background:var(--figure-bg);display:block;overflow:hidden}.cf-shot img{width:100%;height:auto}.cf-shot a{cursor:zoom-in;display:block}.cf-shot__dark{display:none!important}:root[data-theme=dark] .cf-shot__dark{display:block!important}:root[data-theme=dark] .cf-shot__light{display:none!important}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .cf-shot__dark{display:block!important}:root:not([data-theme=light]) .cf-shot__light{display:none!important}}.cf-herofig{margin:0}.cf-herofig .cf-shot{border-radius:var(--r-lg);box-shadow:0 18px 40px -28px #00000073}.cf-herofig figcaption,.cf-fig figcaption{color:var(--ink-soft);font-size:var(--fs-sm);margin-top:8px}.cf-fig__title{color:var(--ink)}.cf-points{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin:28px 0 4px;padding:0;list-style:none;display:grid}.cf-point{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);align-items:flex-start;gap:12px;padding:16px;display:flex}.cf-point__title{margin-bottom:4px;font-size:1rem}.cf-point p{color:var(--ink-soft);font-size:var(--fs-sm);line-height:1.55}@media (max-width:760px){.cf-points{grid-template-columns:1fr}}.cf-lead{margin-top:-4px}.cf-how{grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;padding:0;list-style:none;display:grid;position:relative}.cf-how__step{flex-direction:column;gap:6px;display:flex;position:relative}.cf-how__n{width:30px;height:30px;font-weight:700;font-size:var(--fs-sm);color:var(--link);border:1.5px solid var(--link);background:var(--bg);z-index:1;border-radius:50%;place-items:center;display:grid;position:relative}.cf-how__step:not(:last-child):after{content:"";background:var(--link);top:15px;height:2px;position:absolute;inset-inline:38px -12px}@supports (color:color-mix(in lab, red, red)){.cf-how__step:not(:last-child):after{background:color-mix(in srgb, var(--link) 25%, transparent)}}.cf-how__title{margin-top:4px;font-size:1.05rem}.cf-how__text{color:var(--ink-soft);font-size:var(--fs-sm);flex:1}.cf-how .cf-shot{aspect-ratio:4/3;margin-top:6px}.cf-how .cf-shot img{object-fit:cover;object-position:top center;height:100%}.cf-how .cf-shot a{height:100%}@media (max-width:720px){.cf-how{grid-template-columns:1fr;gap:28px}.cf-how__step:not(:last-child):after{display:none}.cf-how .cf-shot{aspect-ratio:auto;max-width:420px}.cf-how .cf-shot img{height:auto}}.cf-gallery{align-items:start}.cf-features{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px 28px;padding:0;list-style:none;display:grid}.cf-feature{align-items:flex-start;gap:12px;display:flex}.cf-feature__icon{border-radius:var(--r-md);background:var(--accent-dim);width:34px;height:34px;color:var(--link);flex:none;place-items:center;display:grid}.cf-feature__icon .icon{width:18px;height:18px}.cf-feature__title{flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:1rem;display:flex}.cf-feature p{color:var(--ink-soft);font-size:var(--fs-sm);margin-top:2px;line-height:1.55}.cf-new{border-radius:var(--r-pill);color:var(--warm-ink);background:var(--warm);padding:1px 8px;font-size:.72rem;font-weight:700}@supports (color:color-mix(in lab, red, red)){.cf-new{background:color-mix(in srgb, var(--warm) 14%, transparent)}}.cf-new{border:1px solid var(--warm)}@supports (color:color-mix(in lab, red, red)){.cf-new{border:1px solid color-mix(in srgb, var(--warm) 35%, transparent)}}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .cf-new{color:#fdba74}}:root[data-theme=dark] .cf-new{color:#fdba74}@media (max-width:640px){.cf-features{grid-template-columns:1fr}}.cf-sec .steps{margin-bottom:18px}.cf-faq{border-top:1px solid var(--line);display:grid}.cf-qa{border-bottom:1px solid var(--line)}.cf-qa>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;padding:12px 0;font-weight:600;list-style:none;display:flex}.cf-qa>summary::-webkit-details-marker{display:none}.cf-qa>summary:hover{color:var(--link)}.cf-qa>summary .icon{color:var(--ink-faint);transition:transform .25s var(--ease);flex:none}.cf-qa[open]>summary .icon{transform:rotate(180deg)}.cf-qa>p{color:var(--ink-soft);max-width:72ch;padding:0 0 14px}.cf-qa a,.cf-prose a,.cf-how a,.cf-hero__alt a{text-underline-offset:2px;text-decoration:underline;text-decoration-thickness:1px}@media print{.cf-qa>p{display:block}}.cf-releases{gap:16px;padding:0;list-style:none;display:grid}.cf-releases__v{align-items:baseline;gap:10px;margin-bottom:4px;display:flex}.cf-releases__date{color:var(--ink-faint);font-size:var(--fs-sm)}.cf-help{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg-2);margin:32px 0 8px;padding:18px 20px}.cf-help__title{margin-bottom:4px;font-size:1rem}.cf-help .sep{color:var(--ink-faint)}@media (pointer:coarse){.cf-help a{padding-block:10px;display:inline-block}}.cf-pagehead{padding-top:22px}.cf-contact{gap:14px;display:grid}.cf-contact .kv{margin-bottom:0}.cf-muted{color:var(--ink-faint);font-size:var(--fs-sm)}.cf-updated{margin-top:10px}.cf-note{border-radius:var(--r-md);background:var(--bg-2);border:1px solid var(--line);color:var(--ink-soft);font-size:var(--fs-sm);align-items:flex-start;gap:8px;margin-top:16px;padding:10px 14px;display:flex}.cf-note .icon{color:var(--warm);flex:none;margin-top:3px}.cf-prose{max-width:70ch;color:var(--ink-soft)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
