:root.ascii-mode,:root.ascii-mode[data-theme]{color-scheme:dark;--ascii-bg: #050811;--ascii-panel: rgba(10, 16, 30, 0.65);--ascii-ink: #dfe8f7;--ascii-muted: #94a3b8;--ascii-dim: #5e6e87;--ascii-faint: rgba(148, 163, 184, 0.16);--ascii-faint-solid: #232f46;--ascii-green: #7cf5c8;--ascii-cyan: #74c9ff;--ascii-amber: #ffbf66;--ascii-pink: #ff7cb9;--ascii-purple: #c8aaff;--ascii-line: rgba(124, 245, 200, 0.25);--ascii-font: "JetBrains Mono", "M PLUS 1 Code", ui-monospace, SFMono-Regular, Menlo, monospace;--page-bg: rgba(5, 8, 17, 0.85);--surface: var(--ascii-bg);--text: var(--ascii-ink);--muted: var(--ascii-muted);--border: var(--ascii-faint-solid);--tag-bg: rgba(124, 245, 200, 0.08);--link: var(--ascii-cyan);--link-hover: var(--ascii-green);--award: var(--ascii-amber);--font-sans: var(--ascii-font);--font-mono: var(--ascii-font);background:radial-gradient(ellipse 80% 50% at 50% -10%, rgba(116,201,255,0.1), transparent 70%),var(--ascii-bg)}.ascii-body{position:relative;min-height:100vh;overflow-x:clip;background:transparent;color:var(--ascii-ink);font-family:var(--ascii-font);font-size:14.5px;line-height:1.75;font-feature-settings:"calt" 0}.ascii-body ::selection{background:var(--ascii-green);color:var(--ascii-bg)}.ascii-body a,.ascii-body a:visited{color:var(--ascii-cyan);text-decoration:none;transition:color 0.16s ease, background-color 0.16s ease, border-color 0.16s ease}.ascii-body a:hover{color:var(--ascii-green);text-decoration:none}.ascii-body :focus-visible{outline:1px dashed var(--ascii-green);outline-offset:3px}.ascii-visually-hidden{position:absolute !important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.ascii-sky{position:fixed;inset:0;z-index:0;width:100%;height:100%;pointer-events:none}.ascii-crt{position:fixed;inset:0;z-index:40;pointer-events:none;background:radial-gradient(ellipse at center, transparent 62%, rgba(2,4,9,0.45) 100%)}.ascii-body .site-header{position:sticky;top:0;z-index:30;border-bottom:1px solid var(--ascii-faint);background:rgba(5,8,17,0.8);backdrop-filter:blur(12px)}.ascii-body .site-header .wrapper{max-width:1168px}.ascii-body .site-header .theme-toggle{display:none}.ascii-body .site-header .header-preferences{border-left:1px solid var(--ascii-faint)}.ascii-body .site-nav .trigger{gap:16px}.ascii-body .site-nav .page-link,.ascii-body .site-nav .page-link:visited{padding:4px 2px;color:var(--ascii-muted);font-size:0.875rem}.ascii-body .site-nav .page-link:hover,.ascii-body .site-nav .page-link:visited:hover{color:var(--ascii-ink)}.ascii-body .site-nav .page-link.is-current{padding-bottom:4px;border-bottom:2px solid var(--ascii-green);color:var(--ascii-green);font-weight:700}.ascii-body .language-switch summary{border-radius:6px}.ascii-body .language-switch summary:hover{background:rgba(255,255,255,0.05);color:var(--ascii-ink)}.ascii-body .language-options{border:1px solid var(--ascii-faint-solid);border-radius:8px;background:rgba(8,13,25,0.96);backdrop-filter:blur(12px)}.ascii-main{position:relative;z-index:1}.ascii-page{max-width:1120px;margin:0 auto;padding:40px 24px 96px}.ascii-dim{color:var(--ascii-dim)}.ascii-hero{margin-bottom:36px}.ascii-title{margin:0 0 20px;overflow-x:auto;scrollbar-width:none;font-size:inherit;font-weight:400}.ascii-title::-webkit-scrollbar{display:none}.ascii-banner{display:block;width:max-content;max-width:100%;margin:0;font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, "DejaVu Sans Mono", "Droid Sans Mono", monospace;font-size:clamp(5.5px, min(14px, calc((100vw - 48px) / 45.5)), 14px);line-height:1.05;white-space:pre;background:linear-gradient(100deg, var(--ascii-green) 0%, var(--ascii-cyan) 55%, var(--ascii-purple) 85%, var(--ascii-pink) 100%);-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 0 16px rgba(116,201,255,0.24))}.ascii-banner+.ascii-banner{margin-top:0.55em}.ascii-tagline-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 24px;margin-bottom:28px;padding-bottom:18px;border-bottom:1px solid var(--ascii-faint)}.ascii-tagline{margin:0;color:var(--ascii-muted);font-size:0.9375rem}.ascii-tagline strong{color:var(--ascii-ink);font-weight:700}.ascii-hero-links{display:flex;flex-wrap:wrap;gap:8px;font-size:0.8125rem}.ascii-hero-links .portfolio-link-icon{display:none}.ascii-hero-links .portfolio-link-item{color:var(--ascii-dim)}.ascii-globe{margin:0}.ascii-globe-stage{position:relative;aspect-ratio:16 / 9;max-height:500px;margin:0 auto;border:1px solid var(--ascii-faint);border-radius:10px 10px 0 0;background:radial-gradient(ellipse at 50% 50%, rgba(116,201,255,0.08), transparent 64%),rgba(6,10,20,0.65);backdrop-filter:blur(8px)}.ascii-globe-stage canvas{position:absolute;inset:0;width:100%;height:100%;cursor:grab;touch-action:pan-y}.ascii-globe-stage canvas.is-dragging{cursor:grabbing}.ascii-globe-stage canvas.is-pointing{cursor:pointer}.ascii-globe-stage canvas:focus-visible{outline-offset:-4px}.ascii-hud{position:absolute;inset:0;z-index:1;color:var(--ascii-muted);font-size:0.6875rem;line-height:1.55;letter-spacing:0.05em;pointer-events:none}.ascii-hud>span{position:absolute}.ascii-hud-tag{color:var(--ascii-ink);font-weight:700}.ascii-hud-pin{color:var(--ascii-pink)}.ascii-hud-tl{top:14px;left:16px}.ascii-hud-tr{top:14px;right:16px;text-align:right;font-variant-numeric:tabular-nums}.ascii-hud-bl{bottom:14px;left:16px}.ascii-hud-br{right:16px;bottom:14px;max-width:min(60%, 420px);color:var(--ascii-green);text-align:right}.ascii-globe-legend{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 20px;padding:9px 16px;border:1px solid var(--ascii-faint);border-top:0;border-radius:0 0 10px 10px;background:rgba(7,12,24,0.72);color:var(--ascii-muted);font-size:0.72rem}.ascii-legend-item{display:inline-flex;align-items:center;gap:6px}.ascii-legend-item::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--legend-color, var(--ascii-cyan))}.ascii-jump{position:sticky;top:calc(var(--site-header-height, 56px) + 8px);z-index:25;margin:0 0 56px;padding:6px 10px;border:1px solid var(--ascii-faint);border-radius:8px;background:rgba(6,10,20,0.8);backdrop-filter:blur(12px)}.ascii-jump-list{display:flex;align-items:center;gap:4px;overflow-x:auto;scrollbar-width:none}.ascii-jump-list::-webkit-scrollbar{display:none}.ascii-jump-link,.ascii-jump-link:visited{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:5px;color:var(--ascii-muted);font-size:0.78rem;white-space:nowrap}.ascii-jump-link:hover,.ascii-jump-link:visited:hover{background:rgba(255,255,255,0.05);color:var(--ascii-ink)}.ascii-jump-link.is-active,.ascii-jump-link:visited.is-active{background:rgba(124,245,200,0.12);color:var(--ascii-green);font-weight:700}.ascii-jump-link.is-active .ascii-jump-num,.ascii-jump-link:visited.is-active .ascii-jump-num{color:var(--ascii-green)}.ascii-jump-num{color:var(--ascii-dim);font-size:0.7rem;font-variant-numeric:tabular-nums}.ascii-section{margin:0 0 76px;scroll-margin-top:calc(var(--site-header-height, 56px) + 60px);transition:opacity 0.55s ease, transform 0.55s ease}.ascii-section.is-armed{opacity:0;transform:translateY(16px)}.ascii-section.is-armed.is-visible{opacity:1;transform:none}.ascii-section-head{margin-bottom:24px}.ascii-heading{display:flex;align-items:baseline;gap:0.65em;margin:0;color:var(--ascii-ink);font-size:clamp(1.25rem, 2.5vw, 1.55rem);font-weight:700;line-height:1.35;letter-spacing:0.02em}.ascii-heading::after{content:"";flex:1 1 auto;min-width:1.5em;border-bottom:1px dashed var(--ascii-line);transform:translateY(-0.3em)}.ascii-heading-index{color:var(--ascii-green);font-size:0.75em;font-variant-numeric:tabular-nums}.ascii-heading-index::after{content:" /";color:var(--ascii-dim)}.ascii-heading-count{order:1;color:var(--ascii-dim);font-size:0.68em;font-weight:400;font-variant-numeric:tabular-nums}.ascii-subheading{display:flex;align-items:baseline;gap:0.45em;margin:28px 0 12px;color:var(--ascii-amber);font-size:0.9375rem;font-weight:700}.ascii-subheading-count{color:var(--ascii-dim);font-size:0.8rem;font-weight:400}.ascii-item-title{color:var(--ascii-ink);font-weight:700}.ascii-role{color:var(--ascii-cyan)}.ascii-meta{color:var(--ascii-muted);font-size:0.8125rem}.ascii-desc{color:#b8c7de;font-size:0.9rem}.ascii-award{display:inline-flex;align-items:center;gap:0.3em;width:fit-content;color:var(--ascii-amber);font-size:0.84rem;font-weight:700}.ascii-award a,.ascii-award a:visited{color:var(--ascii-amber)}.ascii-award a:hover{color:#ffe0a8;text-decoration:underline}.ascii-stats{display:inline-flex;flex-wrap:wrap;gap:6px;font-size:0.78rem}.ascii-stats span{padding:1px 8px;border:1px solid rgba(124,245,200,0.22);border-radius:999px;background:rgba(124,245,200,0.06);color:var(--ascii-green)}.ascii-links{display:inline-flex;flex-wrap:wrap;gap:6px;margin:0;font-size:0.8rem}.ascii-links .portfolio-link-icon{display:none}.ascii-links .portfolio-link-item{display:inline-flex;margin-right:0;color:var(--ascii-dim)}.ascii-links .portfolio-link{color:var(--ascii-cyan)}.ascii-links .portfolio-link:hover{color:var(--ascii-green)}.ascii-lead{margin:0;color:var(--ascii-muted)}.ascii-whoami{display:grid;grid-template-columns:220px minmax(0, 1fr);gap:36px;align-items:start}.ascii-whoami-body{display:flex;flex-direction:column;gap:18px;min-width:0}.ascii-facts{margin:0}.ascii-facts>div{display:grid;grid-template-columns:7.5em minmax(0, 1fr);gap:1em;padding:7px 0;border-bottom:1px dashed var(--ascii-faint)}.ascii-facts dt{color:var(--ascii-cyan)}.ascii-facts dt::after{content:" :";color:var(--ascii-dim)}.ascii-facts dd{margin:0}.ascii-facts dd strong{color:#ffffff}.ascii-bio{margin:0;padding-left:1em;border-left:2px solid var(--ascii-green);color:#c5d2e8}[data-ascii-image]{position:relative;margin:0;overflow:hidden;background:#020409}[data-ascii-image] img{display:block;width:100%;height:auto}[data-ascii-image] canvas{display:block;width:100%;height:100%}[data-ascii-image].is-ascii img{position:absolute;inset:0;height:100%;object-fit:cover;opacity:0;transition:opacity 0.3s ease}[data-ascii-image].is-ascii:hover img{opacity:0.94}.ascii-image-badge{position:absolute;right:8px;bottom:8px;z-index:3;padding:2px 7px;border:1px solid rgba(124,245,200,0.25);border-radius:4px;background:rgba(4,7,14,0.8);backdrop-filter:blur(4px);color:var(--ascii-green);font-size:0.625rem;letter-spacing:0.05em;pointer-events:none;transition:opacity 0.25s ease}[data-ascii-image]:hover .ascii-image-badge{opacity:0}.ascii-portrait{border:1px solid var(--ascii-faint);border-radius:6px}.ascii-portrait::before,.ascii-portrait::after{position:absolute;z-index:2;color:var(--ascii-green);font-size:0.75rem;line-height:1;pointer-events:none}.ascii-portrait::before{content:"┌";top:5px;left:5px}.ascii-portrait::after{content:"┘";right:5px;bottom:5px}.ascii-keywords{display:flex;flex-wrap:wrap;gap:10px;margin:0;padding:0;list-style:none}.ascii-keywords li{display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border:1px dashed var(--ascii-line);border-radius:6px;background:rgba(10,16,30,0.45)}.ascii-keyword-idx{color:var(--ascii-dim);font-size:0.72rem;font-variant-numeric:tabular-nums}.ascii-keyword-label{color:var(--ascii-green);font-weight:700}.ascii-publications{margin:0;padding:0;list-style:none}.ascii-publications>li{display:grid;grid-template-columns:3.5ch minmax(0, 1fr);gap:0.75em;padding:14px 0;border-bottom:1px dashed var(--ascii-faint)}.ascii-publications u{color:var(--ascii-green);text-decoration:none;border-bottom:1px solid currentColor}.ascii-pub-body{display:flex;flex-direction:column;gap:0.25em;min-width:0}.ascii-pub-foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:2px}.ascii-index{color:var(--ascii-amber);font-variant-numeric:tabular-nums}.ascii-authors{color:#c2cfe3;font-size:0.875rem}.ascii-tree{margin:0;padding:0 0 0 0.5ch;list-style:none}.ascii-tree>li{position:relative;display:flex;flex-direction:column;gap:0.25em;padding:0 0 1.4em 2.4em}.ascii-tree>li::before{content:"";position:absolute;top:0;bottom:0;left:0;border-left:1px solid var(--ascii-faint-solid)}.ascii-tree>li::after{content:"";position:absolute;top:0.875em;left:0;width:1.75em;border-top:1px solid var(--ascii-faint-solid);transition:border-color 0.2s ease}.ascii-tree>li:last-child{padding-bottom:0}.ascii-tree>li:last-child::before{bottom:auto;height:0.875em}.ascii-tree>li:hover::after{border-color:var(--ascii-green)}.ascii-tree-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 16px}.ascii-tree-head>.ascii-item-title::before{content:"◆ ";color:var(--ascii-green);font-size:0.7em;vertical-align:0.15em}.ascii-tree-foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:2px}.ascii-oss-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px}.ascii-oss-head>.ascii-item-title::before{content:"◆ ";color:var(--ascii-green);font-size:0.7em;vertical-align:0.15em}.ascii-stars{color:var(--ascii-amber);font-size:0.8rem;font-variant-numeric:tabular-nums}.ascii-oss-items{margin:6px 0 0;padding:0;font-size:0.8125rem;list-style:none}.ascii-oss-items li{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:3px 0}.ascii-status{display:inline-block;min-width:7ch;color:var(--ascii-dim);font-size:0.75rem}.ascii-status::before{content:"["}.ascii-status::after{content:"]"}.ascii-status--merged{color:var(--ascii-green)}.ascii-status--open{color:var(--ascii-cyan)}.ascii-oss-ref{font-variant-numeric:tabular-nums}.ascii-oss-item-title{color:#c5d2e8}.ascii-products-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px 24px;margin-bottom:24px}.ascii-filter{display:flex;flex-wrap:wrap;gap:6px}.ascii-filter[hidden]{display:none}.ascii-filter button{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border:1px solid var(--ascii-faint);border-radius:999px;background:rgba(10,16,30,0.55);color:var(--ascii-muted);font-family:var(--ascii-font);font-size:0.78rem;line-height:1.35;cursor:pointer;transition:border-color 0.16s ease, background-color 0.16s ease, color 0.16s ease}.ascii-filter button:hover{border-color:var(--ascii-cyan);color:var(--ascii-ink)}.ascii-filter button[aria-pressed="true"]{border-color:rgba(124,245,200,0.45);background:rgba(124,245,200,0.14);color:var(--ascii-green);font-weight:700}.ascii-filter-count{color:var(--ascii-dim);font-size:0.72rem;font-variant-numeric:tabular-nums}button[aria-pressed="true"] .ascii-filter-count{color:var(--ascii-green)}.ascii-products{display:grid;grid-template-columns:repeat(auto-fill, minmax(min(100%, 320px), 1fr));gap:22px}.ascii-card{display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--ascii-faint);border-radius:8px;background:var(--ascii-panel);backdrop-filter:blur(8px);scroll-margin-top:calc(var(--site-header-height, 56px) + 60px);transition:border-color 0.22s ease, box-shadow 0.22s ease, transform 0.22s ease}.ascii-card[hidden]{display:none}.ascii-card:hover,.ascii-card:focus-within,.ascii-card:target{border-color:var(--ascii-line);box-shadow:0 12px 32px rgba(0,0,0,0.4);transform:translateY(-2px)}.ascii-card-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 14px;border-bottom:1px dashed var(--ascii-faint);color:var(--ascii-dim);font-size:0.75rem;font-variant-numeric:tabular-nums}.ascii-card-id{color:var(--ascii-amber);font-weight:700}.ascii-card-thumb{aspect-ratio:16 / 9;border-bottom:1px dashed var(--ascii-faint)}.ascii-card-thumb img{height:100%;object-fit:cover}.ascii-card:hover .ascii-card-thumb.is-ascii img{opacity:0.96}.ascii-card-body{display:flex;flex:1 1 auto;flex-direction:column;gap:10px;padding:16px 18px 18px}.ascii-card-body .ascii-desc,.ascii-card-body .ascii-meta,.ascii-card-body .ascii-award{margin:0}.ascii-card-body .ascii-desc{font-size:0.825rem;line-height:1.68}.ascii-card-title{margin:0;font-size:1.0625rem;font-weight:700;line-height:1.45}.ascii-card-title a,.ascii-card-title a:visited{color:var(--ascii-ink)}.ascii-card-title a:hover{color:var(--ascii-green)}.ascii-tags{display:flex;flex-wrap:wrap;gap:4px 10px;margin:2px 0 0;padding:0;color:var(--ascii-green);font-size:0.74rem;list-style:none}.ascii-tags li::before{content:"#";color:var(--ascii-dim)}.ascii-card-links{margin-top:auto;padding-top:10px;border-top:1px dashed var(--ascii-faint)}.ascii-exit{padding-top:28px;border-top:1px dashed var(--ascii-faint);font-size:0.84rem}.ascii-exit p{margin:0}.ascii-exit-inner{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 24px}.ascii-button,.ascii-button:visited{display:inline-flex;align-items:center;gap:6px;color:var(--ascii-green)}.ascii-button:hover,.ascii-button:visited:hover{text-decoration:underline}@media (prefers-reduced-motion: reduce){.ascii-section.is-armed{opacity:1;transform:none;transition:none}.ascii-card:hover{transform:none}}@media screen and (max-width: 720px){.ascii-body{font-size:13.75px}.ascii-body .language-switch summary span{display:none}.ascii-page{padding:24px 16px 64px}.ascii-banner{font-size:calc((100vw - 32px) / 45.5)}.ascii-globe-stage{aspect-ratio:1 / 1.02}.ascii-hud{font-size:0.6rem}.ascii-hud-tl{top:10px;left:10px}.ascii-hud-tr{top:10px;right:10px}.ascii-hud-bl{bottom:10px;left:10px}.ascii-hud-br{right:10px;bottom:10px}.ascii-jump{margin-bottom:40px}.ascii-section{margin-bottom:56px}.ascii-whoami{grid-template-columns:minmax(0, 1fr);gap:20px}.ascii-portrait{max-width:240px}.ascii-facts>div{grid-template-columns:minmax(0, 1fr);gap:2px}}
