@font-face{font-family:Wotfard;src:url(fonts/wotfard-regular.woff2) format('woff2');font-style:normal;font-weight:400;font-display:swap}
@font-face{font-family:DM Sans;src:url(fonts/dm-sans-latin.woff2) format('woff2');font-style:normal;font-weight:400 700;font-display:swap}
:root{color-scheme:light;--bg:#fff;--fg:#101217;--muted:#5e637c;--line:#e6e8ef;--blue:#4242fa;--sky:#a0d4ee;--sky-bottom:#7dc4e8;--cloud-far:#b1e1f5;--cloud:#dceef8;--accent:#e60067;--pill:#bde5f8;--rainbow-1:#ff1678;--rainbow-2:#f01996;--rainbow-3:#d11eaf;--rainbow-4:#b51ac8;--rainbow-5:#9220d9;--rainbow-6:#7020da;--rainbow-7:#4b21c5;--rainbow-8:#262ca9;--rainbow-9:#18327b;--rainbow-10:#163674}
:root[data-theme=dark]{color-scheme:dark;--bg:#0d0e17;--fg:#f5f5fc;--muted:#b8b8ce;--line:#2b2b40;--blue:#a69bff;--sky:#161b38;--sky-bottom:#232554;--cloud-far:#282943;--cloud:#1d2034;--accent:#ff4da1;--pill:#272b49;--rainbow-1:#ff406e;--rainbow-2:#ff753e;--rainbow-3:#ffba4b;--rainbow-4:#e9db49;--rainbow-5:#8bd271;--rainbow-6:#39bab5;--rainbow-7:#3884ef;--rainbow-8:#6e61f5;--rainbow-9:#a24de6;--rainbow-10:#cc58b5}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{overflow-x:clip;margin:0;background:var(--bg);color:var(--fg);font-family:'Wotfard',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}button,a{-webkit-tap-highlight-color:transparent}a{color:var(--blue);text-decoration:none}button{font:inherit;cursor:pointer}a:focus-visible,button:focus-visible,input:focus-visible{outline:2px solid var(--blue);outline-offset:5px}[hidden]{display:none!important}.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.site-header{position:relative;z-index:10}.blog-home .site-header{background:var(--sky)}.blog-header{max-width:1100px;height:112px;margin:auto;padding:32px 32px 16px;display:flex;align-items:center;gap:60px}.identity{font-size:24px;letter-spacing:-1px;font-weight:500;white-space:nowrap;line-height:36px;display:flex;align-items:center;gap:3px}.name-spark{width:21px;height:34px;fill:none;stroke:var(--muted);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;transition:transform .5s}.identity:hover .name-spark{transform:rotate(15deg);stroke:var(--blue)}.blog-nav{display:flex;align-items:center;gap:40px;font-size:16px}.blog-nav>a{color:var(--fg)}.blog-nav>a:hover{color:var(--blue)}.header-actions{margin-left:auto;display:flex;gap:24px;align-items:center}#theme-toggle,#language,.menu-toggle{border:0;background:none;color:var(--fg);padding:4px;display:inline-flex;align-items:center;justify-content:center;flex:none;height:32px}#theme-toggle{width:32px}#language{font-size:14px;min-width:32px}#theme-toggle svg,.menu-toggle svg{width:22px;height:22px}#theme-toggle .theme-icon--sun{display:none}html[data-theme=dark] #theme-toggle .theme-icon--moon{display:none}html[data-theme=dark] #theme-toggle .theme-icon--sun{display:block}.menu-toggle{display:none}#mobile-menu{padding:24px 24px 44px;background:var(--bg);position:absolute;top:80px;left:0;width:100%;box-shadow:0 16px 24px #0002}#mobile-menu a{display:block;font-size:27px;padding:12px;color:var(--fg)}
.scene{height:372px;position:relative;background:linear-gradient(var(--sky),var(--sky-bottom));isolation:isolate;overflow:hidden}.rainbow-art{position:absolute;left:calc(50% - 170px);top:-112px;width:1000px;height:520px;z-index:2}#rainbow-scene{width:100%;height:100%;display:block}.scene-portrait{position:absolute;z-index:4;width:132px;height:240px;left:calc(50% + 330px);top:130px;transform:translateX(-50%);pointer-events:none}.scene-portrait img{width:100%;height:100%;object-fit:contain;display:block}.clouds{position:absolute;width:100%;height:350px;bottom:0;left:0;z-index:3;pointer-events:none}.cloud-far{fill:var(--cloud-far)}.cloud-back{fill:var(--cloud)}.cloud-front{fill:var(--bg)}
/* Far clouds sit behind the rainbow, while the white foreground covers its base. */
.clouds{z-index:1}.clouds--front{z-index:3}.rainbow-tools{position:absolute;left:calc(50% + 405px);top:245px;z-index:6}.rainbow-settings{display:grid;place-items:center;width:34px;height:34px;border:0;background:none;color:var(--muted);opacity:0;transition:opacity .25s,transform .35s}.rainbow-settings svg{width:20px;height:20px}.scene:hover .rainbow-settings,.rainbow-settings:focus-visible,.rainbow-settings[aria-expanded=true]{opacity:.8}.rainbow-settings:hover{transform:rotate(35deg);opacity:1}#rainbow-controls{position:absolute;right:0;bottom:42px;width:230px;padding:20px;background:var(--bg);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 36px #0002;color:var(--fg);font-size:14px}#rainbow-controls strong{display:block;margin-bottom:16px;font-weight:600}#rainbow-controls label{display:block;color:var(--muted);font-size:13px}#rainbow-motion{width:100%;accent-color:var(--blue);margin:12px 0}#rainbow-reset{background:var(--pill);border:0;color:var(--fg);padding:5px 12px;border-radius:5px;font-size:13px}
.blog-layout{max-width:1100px;margin:-28px auto 0;padding:16px 32px 110px;display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:96px;position:relative;z-index:2;pointer-events:none}.blog-layout>*{pointer-events:auto}.section-label{font-size:16px;letter-spacing:2px;line-height:24px;font-weight:500;color:var(--accent);margin:0 0 36px}.post h3{font-size:22px;line-height:33px;font-weight:650;letter-spacing:-.35px;margin:0 0 14px}.post h3 a{color:var(--fg)}.post h3 a:hover{color:var(--blue)}.post p{margin:0 0 20px;font-size:16px;line-height:24px}.post .post-summary{color:var(--muted);font-size:17px;line-height:25.5px;font-weight:500;margin-top:-9px}.read-link{font-size:16px;font-weight:650;color:var(--fg);display:inline-flex;align-items:center;gap:8px}.read-link svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;opacity:0;transform:translateX(-6px);transition:opacity .2s,transform .2s}.read-link:hover{color:var(--blue)}.read-link:hover svg{opacity:1;transform:translateX(0)}.blog-aside{padding-top:96px}.blog-aside .section-label{margin-bottom:36px}.topic-pills{display:flex;flex-wrap:wrap;gap:8px}.topic-pills a{display:block;border-radius:7px;background:var(--pill);color:var(--fg);padding:6px 12px;font-size:14px;line-height:20px;transition:transform .2s}.topic-pills a:hover{transform:translateY(-2px);color:var(--blue)}.blog-aside section+section{margin-top:64px}.elsewhere a{display:flex;align-items:flex-start;gap:16px;color:var(--fg);margin:0 0 22px;font-weight:600;font-size:19px;line-height:28px}.elsewhere a>span:first-child{margin-left:-34px;width:18px;flex:none;font-size:24px;font-weight:400;transition:transform .2s}.elsewhere small{display:block;color:var(--muted);font-weight:400;font-size:14px;line-height:22px;margin-top:2px}.elsewhere a:hover{color:var(--blue)}.elsewhere a:hover>span:first-child{transform:translateX(5px)}
footer{max-width:1036px;margin:0 auto;padding:24px 0 40px;display:flex;justify-content:space-between;gap:20px;color:var(--muted);font-size:13px;border-top:1px solid var(--line)}footer a{color:inherit}.article-main{max-width:1100px;margin:auto;padding:40px 32px 96px}.article-main>*{max-width:686px}.back{display:inline-block;font-size:14px;margin-bottom:32px}.article-main .section-label{font-size:14px;margin-bottom:12px}.article-title{font-size:36px;font-weight:600;letter-spacing:-1px;line-height:1.5;margin:0 0 16px}.article-deck{font-size:19px;line-height:1.6;color:var(--muted);margin:0;padding-bottom:32px;border-bottom:1px solid var(--line)}.article-body{margin-top:42px;font-size:18px;line-height:27px}.article-body p{margin:0 0 22.5px}.source{padding-top:24px;border-top:1px solid var(--line);margin-top:40px;font-size:14px;color:var(--muted)}.source a{white-space:nowrap}.skip-link{position:absolute;top:-100px;left:20px;background:var(--bg);padding:8px;z-index:20}.skip-link:focus{top:8px}@keyframes character-arrive{from{opacity:0;translate:0 12px}to{opacity:1;translate:0 0}}
@media(max-width:1100px){.blog-header{gap:40px}.blog-nav{gap:28px}.scene-portrait{left:calc(50% + 240px)}.rainbow-tools{left:calc(50% + 315px)}.rainbow-art{left:calc(50% - 260px)}.blog-layout{gap:64px}footer{margin:0 32px}}
@media(max-width:800px){.scene-portrait{display:none}.blog-header{padding:16px;height:80px;gap:24px}.blog-nav{display:none}.header-actions{gap:20px}.menu-toggle{display:inline-flex}.scene{height:227px}.clouds{height:230px;bottom:0}.blog-layout{display:block;margin:0 auto;padding:16px 16px 72px}.blog-aside{padding-top:0;margin-top:64px;display:grid;grid-template-columns:1fr 1fr;gap:48px}.blog-aside section+section{margin-top:0}.elsewhere a>span:first-child{margin-left:0}.article-main{padding:36px 16px 64px}footer{margin:0 16px}.article-title{font-size:32px;line-height:1.4}.rainbow-art{top:-150px;left:calc(50% - 280px)}.rainbow-tools{top:150px;left:auto;right:24px}}
@media(max-width:767px){.rainbow-art,.rainbow-tools{display:none}.clouds{width:180%;left:-40%}}
@media(max-width:460px){.identity{font-size:24px}.header-actions{gap:14px}.name-spark{width:16px}.blog-aside{display:block}.blog-aside section+section{margin-top:48px}.section-label{font-size:15px}.post h3{font-size:22px}.article-title{font-size:30px}.article-deck{font-size:18px}.header-actions #language{font-size:12px;min-width:25px}.blog-header{gap:10px}}
@media(max-width:350px){.identity{font-size:21px}.header-actions{gap:7px}.name-spark{width:14px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}.rainbow-tools{display:none}}
@media print{.site-header,.scene,footer,.back,.skip-link{display:none}:root[data-theme=dark]{--bg:#fff;--fg:#101217;--muted:#5e637c;--line:#e5eaf0;--blue:#4242fa;--accent:#e60067;color-scheme:light}.article-main,.blog-layout{padding:0;max-width:none;display:block}.blog-aside{display:none}}
/* Rainbow controls stay outside the clipped landscape. */
#rainbow-controls{position:fixed;z-index:30;top:110px;bottom:auto;right:max(20px,calc((100vw - 1100px)/2 + 32px));width:304px;max-height:calc(100svh - 136px);overflow-y:auto;padding:24px;border-radius:13px;box-shadow:0 12px 44px #0e244329}
#rainbow-controls strong{font-size:18px;margin-bottom:22px}.rainbow-field{display:grid;grid-template-columns:1fr auto;align-items:center;gap:3px 12px;margin-bottom:14px}.rainbow-field output{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}.rainbow-field input[type=range]{grid-column:1/-1;width:100%;accent-color:var(--blue);margin:5px 0;height:18px}.rainbow-palette-field{display:flex;align-items:center;justify-content:space-between;margin:19px 0;gap:14px}#rainbow-palette{font:inherit;font-size:12px;color:var(--fg);background:var(--bg);border:1px solid var(--line);border-radius:5px;padding:6px;max-width:160px}
/* The snow mark is our own small signature. */
.name-spark{width:23px;height:30px;stroke:var(--blue);stroke-width:1.6;opacity:.75;transition:transform .6s cubic-bezier(.2,.8,.2,1),opacity .3s}.identity:hover .name-spark{transform:rotate(60deg);opacity:1}.name-spark .snow-tip{stroke-dasharray:8;stroke-dashoffset:0;transition:stroke-dashoffset .3s}.identity:hover .snow-tip{stroke-dashoffset:2}
.scene-portrait img,.footer-peek img{transition:filter .5s ease}.scene-portrait,.footer-peek{--shade:0}.scene-portrait::after,.footer-peek::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(115deg,transparent 20%,#08122e80);mask-image:var(--character-image);mask-position:center;mask-size:contain;mask-repeat:no-repeat;opacity:var(--shade);transition:opacity .5s}html[data-theme=dark] .scene-portrait,html[data-theme=dark] .footer-peek{--shade:1}html[data-theme=dark] .scene-portrait img,html[data-theme=dark] .footer-peek img{filter:brightness(.79) saturate(.78) drop-shadow(2px 5px 10px #06081733)}
/* Reading layout: sky heading, a comfortable text column, and a quiet sticky outline. */
:root{--article-sky:#c5eafa;--article-heading:#332457;--note:#edf8ff}:root[data-theme=dark]{--article-sky:#1c213c;--article-heading:#d6caff;--note:#1b253b}
.blog-article .site-header{background:var(--article-sky)}.blog-article .blog-header{height:96px;padding-top:16px;padding-bottom:16px}.article-hero{position:relative;background:var(--article-sky);padding-bottom:170px}.article-hero-inner{max-width:1100px;margin:auto;padding:44px 32px 0;position:relative;z-index:1}.article-hero .back{font-size:14px;margin:0 0 16px}.article-title{max-width:940px;font-size:36px;line-height:1.5;font-weight:500;letter-spacing:-.75px;margin:0 0 20px}.article-meta{font-size:16px;line-height:24px;color:var(--muted);margin:0}.article-meta a{color:var(--fg)}.article-hero>svg{width:100%;height:160px;position:absolute;bottom:-1px;left:0;pointer-events:none}.article-cloud-back{fill:var(--cloud-far)}.article-main{max-width:1100px;margin:0 auto;padding:80px 32px 48px;display:grid;grid-template-columns:minmax(0,686px) 250px;gap:100px;align-items:start}.article-main>*{max-width:none;min-width:0}.article-body{margin:0;font-size:18px;line-height:27px}.article-body p{margin:0 0 24px}.article-body h2{position:relative;scroll-margin-top:64px;font-size:30px;line-height:44px;font-weight:650;letter-spacing:-.6px;color:var(--article-heading);margin:64px 0 24px}.heading-anchor{position:absolute;left:-30px;font-weight:400;color:var(--blue);opacity:0;transition:opacity .2s}.article-body h2:hover .heading-anchor,.heading-anchor:focus-visible{opacity:1}.article-body p a,.article-body figcaption a{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}.article-sidebar{height:100%;position:relative}.article-toc{position:sticky;top:120px;font-size:15px;line-height:24px}.article-toc h2{font-size:15px;line-height:24px;letter-spacing:2px;font-weight:500;margin:0 0 16px;color:var(--fg)}.article-toc a{display:block;margin:0 0 12px;color:var(--muted);transition:color .2s}.article-toc a:hover,.article-toc a[aria-current=location]{color:var(--blue)}.article-figure{margin:32px -20px}.article-figure>a{display:block;background:#fff;border:1px solid var(--line);border-radius:9px;overflow:hidden}.article-figure img{width:100%;height:auto;display:block;transition:opacity .2s}.article-figure>a:hover img{opacity:.9}.article-figure figcaption{font-size:14px;line-height:22px;color:var(--muted);text-align:center;margin:14px 20px 0}.article-note{background:var(--note);border-left:3px solid var(--blue);border-radius:3px 8px 8px 3px;margin:36px -32px;padding:26px 32px;font-size:17px;line-height:27px}.article-note strong{display:block;font-weight:600;margin-bottom:8px}.article-note p:last-child{margin:0}.article-body blockquote{margin:28px 0;padding:8px 0 8px 24px;border-left:3px solid var(--pill);font-style:italic;color:var(--muted);font-size:20px;line-height:32px}.project-link{display:flex;justify-content:space-between;align-items:center;gap:20px;margin:28px 0 48px;padding:22px 24px;border:1px solid var(--line);border-radius:8px;transition:border-color .2s}.project-link:hover{border-color:var(--blue)}.project-link strong{display:block;color:var(--fg);font-size:21px;margin-bottom:4px}.project-link>span>span{display:block;font-size:14px;color:var(--muted);overflow-wrap:anywhere}.project-link>span:last-child{font-size:26px}.article-end{border-top:1px solid var(--line);padding-top:24px;color:var(--muted);font-size:14px;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between}.mobile-toc{display:none}
/* Original footer landscape and a scroll-responsive character. */
footer.site-footer{position:relative;isolation:isolate;overflow:clip;display:block;max-width:none;margin:48px 0 0;padding:0;border:0;background:linear-gradient(var(--sky),var(--sky-bottom));color:var(--fg);min-height:440px}.footer-cloud{position:absolute;top:-1px;left:0;width:100%;height:190px;z-index:2;pointer-events:none;fill:var(--bg)}.footer-peek{position:absolute;top:140px;left:max(48px,calc(50% - 485px));width:132px;height:240px;z-index:1;transform:translateY(var(--peek-offset,-226px)) rotate(180deg);will-change:transform;pointer-events:none}.footer-peek img{width:100%;height:100%;object-fit:contain;display:block}.footer-inner{max-width:1100px;margin:auto;padding:274px 32px 64px;display:flex;align-items:flex-start;gap:72px;position:relative;z-index:3}.footer-identity{margin-right:auto}.footer-home{display:inline-block;margin-top:10px;font-size:14px;color:var(--fg)}.site-footer .identity{color:var(--blue)}.footer-inner nav{display:grid;grid-template-columns:1fr 1fr;gap:18px 36px;font-size:15px;padding-top:6px}.footer-inner nav a:hover,.footer-home:hover{color:var(--blue)}.back-to-top{font-size:13px;padding-top:8px;white-space:nowrap;color:var(--fg)}
@media(max-width:1100px){.article-main{grid-template-columns:minmax(0,1fr) 210px;gap:64px}.article-figure{margin-left:0;margin-right:0}.article-note{margin-left:0;margin-right:0}.footer-inner{gap:36px}}
@media(max-width:900px){.article-main{display:block;max-width:750px}.article-sidebar{display:none}.mobile-toc{display:block;margin:32px 0;color:var(--muted);font-size:15px;border-bottom:1px solid var(--line);padding-bottom:20px}.mobile-toc summary{cursor:pointer;color:var(--fg)}.mobile-toc nav{display:grid;gap:12px;margin-top:18px}.footer-inner{gap:24px}.footer-inner nav{gap:16px 24px}}
@media(max-width:800px){.blog-article .blog-header{height:80px}.article-hero-inner{padding:32px 16px 0}.article-title{font-size:30px;line-height:1.4;letter-spacing:-.5px}.article-hero{padding-bottom:134px}.article-hero>svg{height:110px}.article-main{padding:44px 16px 32px}.article-body h2{font-size:26px;line-height:38px;margin-top:48px}.heading-anchor{position:static;display:inline-block;margin-right:8px;font-size:20px;opacity:.55}.article-note{padding:20px;font-size:17px}.footer-inner{padding:270px 24px 48px;flex-wrap:wrap}.back-to-top{margin-left:auto}.site-footer .identity{font-size:24px}#rainbow-controls{top:90px;right:20px;max-height:calc(100svh - 112px)}}
@media(max-width:563px){.footer-peek{display:none}.footer-cloud{height:105px}.footer-inner{padding:144px 16px 36px;display:grid;grid-template-columns:1fr auto;gap:32px 20px}.footer-identity{grid-column:1/-1}.footer-inner nav{gap:16px 28px}.back-to-top{font-size:12px}footer.site-footer{min-height:340px;margin-top:24px}.article-title{font-size:28px}.article-meta{font-size:14px}.article-figure figcaption{text-align:left;margin-left:0;margin-right:0}.article-note{margin-top:28px;margin-bottom:28px}.article-end{display:grid}}
@media(prefers-reduced-motion:reduce){.footer-peek{will-change:auto}.name-spark,.scene-portrait img,.footer-peek img{transition:none}.identity:hover .name-spark{transform:none}}
@media print{.article-hero{background:none;padding-bottom:0}.article-hero>svg,.article-sidebar,.mobile-toc,.site-footer{display:none!important}.article-main{display:block}.article-note{border:1px solid #ccc}.article-body h2{color:#111}.heading-anchor{display:none}}
/* Compact, functional tools with the site's own line icons. */
.header-actions{gap:17px}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:32px;padding:3px;border:0;background:none;color:var(--fg);border-radius:4px;flex:none;transition:color .2s,transform .2s}.icon-button svg{width:23px;height:23px}.icon-button:hover{color:var(--blue);transform:translateY(-1px)}#sound-toggle[aria-pressed=false] .sound-waves,#sound-toggle[aria-pressed=true] .sound-off{display:none}.mobile-social-links{display:flex;gap:20px;margin:20px 12px 0}#mobile-menu .mobile-social-links a{padding:0;width:28px;display:inline-flex}.footer-social-links{display:flex;gap:14px;margin:16px 0 8px}.site-footer .icon-button{color:var(--fg)}.footer-inner{padding-top:278px}.footer-inner .identity{font-size:24px}
#site-search{width:min(640px,calc(100vw - 32px));max-height:80svh;border:1px solid var(--line);border-radius:14px;background:var(--bg);color:var(--fg);padding:28px;box-shadow:0 20px 80px #0003;margin:12vh auto auto}#site-search::backdrop{background:#10152c77;backdrop-filter:blur(5px)}.search-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:20px}.search-heading h2{margin:0;font-size:24px;font-weight:500}#search-close{width:32px;height:32px;background:none;border:0;color:var(--muted);font-size:28px;line-height:1}#site-search-input{width:100%;font:inherit;font-size:18px;background:var(--note);color:var(--fg);border:1px solid var(--line);border-radius:7px;padding:13px 16px}#search-results{display:grid;gap:4px;max-height:45svh;overflow:auto;margin-top:16px}#search-results a{display:block;padding:14px 12px;border-radius:6px;color:var(--fg)}#search-results a:hover,#search-results a:focus-visible{background:var(--note)}#search-results strong{display:block;font-weight:600;font-size:17px;line-height:25px}#search-results p,#search-results small{display:block;margin:5px 0 0;color:var(--muted);font-size:14px;line-height:21px}.search-hint{display:flex;align-items:center;justify-content:space-between;margin:22px 0 0;color:var(--muted);font-size:12px}.search-hint kbd{border:1px solid var(--line);border-radius:4px;padding:2px 5px}#search-empty{color:var(--muted);font-size:15px}
@media(max-width:1100px){.header-actions>.social-tool{display:none}.header-actions{gap:18px}}
@media(max-width:800px){.header-actions{gap:13px}.footer-inner .footer-social-links{gap:14px}}
@media(max-width:460px){.header-actions{gap:7px}.header-actions #theme-toggle,.header-actions .menu-toggle,.header-actions .icon-button{width:28px;padding:3px}.identity{font-size:22px}.name-spark{width:20px}.blog-header{gap:12px}.header-actions #language{min-width:24px;padding:0;font-size:11px}#site-search{padding:20px;margin-top:8vh}.search-hint{gap:15px}.footer-inner{padding-top:144px}}
@media(max-width:350px){.identity{font-size:20px}.name-spark{width:17px}.header-actions{gap:4px}.blog-header{gap:8px}.header-actions svg{width:20px;height:20px}}
.footer-peek{top:40px}.footer-inner{padding-top:246px}#search-results .search-result>span{display:block;margin-top:5px;color:var(--muted);font-size:14px;line-height:21px}.article-hero-inner{padding-top:24px}.article-main{padding-top:65px}
@media(max-width:800px){.article-hero-inner{padding-top:32px}.article-main{padding-top:44px}}
@media(max-width:563px){.footer-inner{padding-top:144px}}
.footer-credit{max-width:1100px;margin:auto;padding:0 32px 40px;display:flex;flex-wrap:wrap;gap:8px 24px;font-size:14px;line-height:24px;color:var(--muted);position:relative;z-index:3}.footer-credit a{color:inherit;text-decoration:underline;text-underline-offset:4px}.footer-credit a:hover{color:var(--blue)}.article-body h2{font-size:32px;line-height:48px;font-weight:700;margin-top:48px;margin-bottom:32px}.article-toc{top:160px;font-size:16px}.article-toc h2{font-size:16px}.article-note{font-size:16px;line-height:24px}.blog-header{padding-top:40px;padding-bottom:8px}
@media(max-width:800px){.blog-header{padding:16px}.article-body h2{font-size:26px;line-height:38px}.footer-credit{padding:0 24px 32px}}
@media(max-width:563px){.footer-credit{padding:0 16px 28px;font-size:12px;gap:4px 12px}}
/* The final u/e in Yongxue become a small handwritten vertical ligature. */
.name-monogram{position:relative;display:inline-block;width:17px;height:28px;flex:none;overflow:visible;margin:0 2px 0 -2px;-webkit-text-stroke:0}
.name-monogram svg{position:absolute;display:block;overflow:visible;fill:none;stroke:var(--muted);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;transition:stroke 200ms;transform-origin:center}
.name-letter-u{left:0;top:-1px;width:16px;height:14px}
.name-letter-e{left:2px;bottom:-1px;width:16px;height:14px}
.identity:is(:hover,:focus-visible) .name-letter-u{animation:name-u-greeting 500ms ease-out}
.identity:is(:hover,:focus-visible) .name-letter-e{animation:name-e-greeting 500ms 55ms ease-out}
@keyframes name-u-greeting{0%,100%{transform:translateY(0) rotate(0)}40%{transform:translateY(-1.3px) rotate(-5deg)}70%{transform:translateY(.3px) rotate(2deg)}}
@keyframes name-e-greeting{0%,100%{transform:translateY(0) rotate(0)}40%{transform:translateY(1.3px) rotate(5deg)}70%{transform:translateY(-.3px) rotate(-2deg)}}
@media(max-width:460px){.name-monogram{width:16px;height:26px}.name-monogram svg{width:15px;height:13px}}
@media(max-width:350px){.name-monogram{width:15px;height:24px}.name-monogram svg{width:14px;height:12px}}
@media(prefers-reduced-motion:reduce){.name-monogram svg{transition:none;animation:none!important}}

/* The freely licensed Regular face is used throughout; light optical emphasis
   avoids the browser's much heavier synthetic bold at the reference sizes. */
.post h3,.read-link,.elsewhere a,.project-link strong,.search-result strong{font-weight:500;-webkit-text-stroke:.18px currentColor}.post h3{letter-spacing:0}.article-body h2{font-weight:500;-webkit-text-stroke:.3px currentColor}.article-note strong{font-weight:500;-webkit-text-stroke:.15px currentColor}
/* Reference console geometry: two instrument rows, switches, and an XY pad. */
#rainbow-controls.rainbow-console{--console-ink:#101419;position:fixed;left:max(16px,calc((100vw - 1100px)/2));right:auto;top:128px;width:620px;max-width:calc(100vw - 32px);max-height:calc(100svh - 148px);padding:4px;overflow:auto;border:0;border-radius:3px;background:#fff;color:var(--console-ink);box-shadow:0 12px 28px #14202a24,0 2px 5px #0003;font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;font-size:12px;line-height:18px;color-scheme:light;z-index:30}
.console-heading{display:flex;align-items:center;justify-content:space-between;height:52px;padding:0 12px;border-bottom:1px solid #c5c8d0}.console-heading h2{margin:0;font:700 20px/30px ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;letter-spacing:0}.console-heading #rainbow-close{background:none;border:0;color:#101419;padding:3px;width:28px;height:28px;display:grid;place-items:center}.console-heading svg{width:22px;height:22px;stroke:currentColor;stroke-width:1.7;fill:none}.console-grid{padding:12px;display:grid;grid-template-columns:1fr 1fr 216px;grid-template-rows:73px 73px 75px;gap:12px}.console-field{padding:4px;border:1px solid #c5c8d0;border-radius:6px;min-width:0;text-align:center;margin:0;display:flex;flex-direction:column;justify-content:space-between;gap:5px}.console-field>label,.console-field>span,.console-field>legend{font:500 16px/24px ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace!important;color:#101419!important}.console-density,.console-rows{grid-column:1/3}.console-operation{grid-column:1}.console-edges{grid-column:2}.console-operation,.console-edges{display:block;position:relative;padding-top:32px}.console-field>legend{float:left;position:absolute;top:4px;left:4px;width:calc(100% - 8px);padding:0}.console-segment{grid-column:3;grid-row:1/4}.console-rail{height:34px;position:relative;background:#14191f;border:1px solid #a6adb9;border-radius:3px;overflow:hidden;padding:0 5px}.console-rail::before{content:"";position:absolute;inset:3px 12px;background:repeating-linear-gradient(to right,#35414b 0 2px,transparent 2px calc(100% / 21));pointer-events:none}.console-rail--rows::before{background-size:calc(100% / 7) 100%;background-image:linear-gradient(to right,#35414b 2px,transparent 2px)}.console-rail::after{content:"";position:absolute;height:2px;left:2px;right:2px;top:15px;background:#35414b;box-shadow:0 -3px #14191f,0 3px #14191f;pointer-events:none}.console-rail input{position:relative;z-index:1;-webkit-appearance:none;appearance:none;width:100%;height:32px;margin:0;background:none;cursor:ew-resize;display:block}.console-rail input::-webkit-slider-runnable-track{height:32px;background:transparent}.console-rail input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:24px;height:24px;margin-top:4px;border-radius:50%;background:white;border:2px solid #14191f;box-shadow:0 0 0 2px #14191f}.console-rail input::-moz-range-track{height:32px;background:none}.console-rail input::-moz-range-thumb{width:20px;height:20px;border-radius:50%;background:#fff;border:2px solid #14191f;box-shadow:0 0 0 2px #14191f}.console-rail input:focus-visible{outline:0}.console-rail:focus-within{outline:2px solid #4242fa;outline-offset:2px}.console-toggle{display:flex;align-items:center;background:#14191f;border:1px solid #a6adb9;border-radius:3px;padding:4px;height:36px;gap:2px}.console-toggle label{position:relative;flex:1;min-width:0;cursor:pointer;display:flex}.console-toggle input{position:absolute;opacity:0;width:1px;height:1px}.console-toggle span{width:100%;padding:3px 0;border-radius:3px;color:#8aa1b8;font-size:14px;line-height:20px}.console-toggle input:checked+span{background:#343e47;color:#fff}.console-toggle input:focus-visible+span{outline:2px solid #aebeff;outline-offset:1px}
#rainbow-segment-pad{width:206px;height:206px;flex:none;position:relative;touch-action:none;overflow:hidden;cursor:crosshair;border:1px solid #a6adb9;border-radius:3px;background:#14191f;background-image:radial-gradient(circle,#34414a 1px,transparent 1.2px);background-size:20px 20px;background-position:12px 12px}.pad-crosshair{position:absolute;background:#35414b;pointer-events:none}.pad-crosshair--x{width:2px;top:2px;bottom:2px;left:50%}.pad-crosshair--y{height:2px;left:2px;right:2px;top:50%}#rainbow-segment-handle{position:absolute;width:24px;height:24px;padding:0;border:2px solid #14191f;border-radius:50%;background:#fff;box-shadow:0 0 0 2px #14191f;transform:translate(-50%,-50%);cursor:grab}#rainbow-segment-pad[data-dragging] #rainbow-segment-handle{cursor:grabbing}#rainbow-segment-handle:focus-visible{outline:2px solid #aebeff;outline-offset:3px}.console-bottom{border-top:1px solid #c5c8d0;display:flex;align-items:center;gap:24px;padding:12px}.console-bottom p{flex:1;margin:0;font-size:12px;line-height:18px}.console-bottom p strong{display:inline!important;font:700 12px/18px ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace!important;margin:0!important}.console-actions{width:204px;display:flex;gap:12px;flex:none}.console-action{width:96px;display:grid;gap:7px}.console-action>span{display:flex;align-items:center;gap:6px;white-space:nowrap;font-size:12px;line-height:16px}.console-action>span::before,.console-action>span::after{content:"";height:1px;background:#c5c8d0;flex:1}.console-action button,#rainbow-reset{height:36px;width:96px;border:0;border-bottom:3px solid #596671;border-left:2px solid #69747e;border-right:2px solid #788590;border-radius:6px 6px 3px 3px;background:linear-gradient(#d5dfe8,#bcc7d1);box-shadow:inset 0 2px 4px #ffffff60;position:relative;padding:0;font:inherit;color:#101419;transition:transform 80ms,filter 100ms;cursor:pointer}.console-action #rainbow-reset{background:linear-gradient(#fb2863,#d30739);border-color:#860422;border-left-color:#a80831;border-right-color:#a80831}.console-action button:hover{filter:brightness(1.04)}.console-action button:active,.console-action button.is-pressed{transform:translateY(2px);border-bottom-width:1px;box-shadow:inset 0 1px 4px #0002;filter:brightness(.95)}
/* The headline uses the available Regular with restrained optical thickening. */
.identity>span{-webkit-text-stroke:.55px currentColor}.blog-nav{font-weight:400;-webkit-text-stroke:0}.read-link .read-arrows{width:36px;height:12px;opacity:1;transform:none;stroke-width:1.5;overflow:visible}.read-arrow-first{opacity:0;transition:opacity 125ms}.post:hover .read-arrow-first,.read-link:focus-visible .read-arrow-first{opacity:1}.read-link:hover .read-arrows{transform:none}.read-arrow-extra{opacity:0;transition:opacity 125ms}.read-link:hover .read-arrow-extra--1,.read-link:focus-visible .read-arrow-extra--1{opacity:1;transition-duration:0ms;transition-delay:0ms}.read-link:hover .read-arrow-extra--2,.read-link:focus-visible .read-arrow-extra--2{opacity:.66;transition-duration:0ms;transition-delay:125ms}.read-link:hover .read-arrow-extra--3,.read-link:focus-visible .read-arrow-extra--3{opacity:.35;transition-duration:0ms;transition-delay:250ms}
@media(max-width:800px){#rainbow-controls.rainbow-console{top:90px;max-height:calc(100svh - 106px)}}
@media(max-width:640px){.console-grid{grid-template-columns:1fr 1fr;grid-template-rows:auto;gap:10px}.console-segment{grid-column:1/3;grid-row:auto;align-items:center}.console-bottom{flex-wrap:wrap}.console-bottom p{flex-basis:100%}.console-heading h2{font-size:17px}.console-actions{margin-left:auto}}
@media(prefers-reduced-motion:reduce){.read-link:hover .read-arrow-extra,.read-link:focus-visible .read-arrow-extra{transition-delay:0ms}.console-action button{transition:none}}
#rainbow-controls .console-toggle label{display:flex}#rainbow-controls .console-toggle span{display:block}
/* Theme lighting is rendered into two original assets, not a brightness filter.
   Only the expression regions are overlaid, so the body never shifts. */
.scene-portrait::after,.footer-peek::after{display:none}.scene-portrait .character-layer,.footer-peek .character-layer{position:absolute;inset:0;display:block;transition:opacity 400ms ease;pointer-events:none}.character-layer--day{z-index:2;opacity:1}.character-layer--night{z-index:1;opacity:1}html[data-theme=dark] .character-layer--day{opacity:0}.scene-portrait .character-layer img,.footer-peek .character-layer img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:none!important;transition:none}.scene-portrait .character-expression,.footer-peek .character-expression{opacity:0;z-index:1;mask-image:radial-gradient(ellipse 6.55% 3.48% at 37.28% 28.47%,#000 70%,transparent 100%),radial-gradient(ellipse 6.55% 3.48% at 60.20% 28.06%,#000 70%,transparent 100%),radial-gradient(ellipse 7.06% 3.20% at 49.37% 32.64%,#000 70%,transparent 100%)}.scene-portrait.is-happy .character-expression,.footer-peek.is-happy .character-expression{opacity:1}
@media(prefers-reduced-motion:reduce){.scene-portrait .character-layer,.footer-peek .character-layer{transition:none}}

.read-link:hover .read-arrow-first{transition-duration:0ms}.read-arrow-extra--1{transition-delay:0ms}.read-arrow-extra--2{transition-delay:125ms}.read-arrow-extra--3{transition-delay:250ms}

/* Separate real articles while retaining the open reading-list layout. */
.post + .post{margin-top:64px}
.post[id]{scroll-margin-top:112px}
