:root{color-scheme:dark;--bg:#000;--surface:#070707;--line:rgba(255,255,255,.11);--ink:#fff;--muted:#a6a6a6;--accent:#ececec;--pad:clamp(20px,5vw,56px);--ln:var(--line);--ln2:rgba(255,255,255,.22);--f-lat:'IBM Plex Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;--f-ko:'IBM Plex Sans KR','IBM Plex Sans',-apple-system,sans-serif;--f-mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,monospace;--sans:var(--f-ko);--mono:var(--f-mono)}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.55 var(--sans);-webkit-font-smoothing:antialiased}
button,input,summary{font:inherit}
button{cursor:pointer;color:inherit}
button:focus-visible,input:focus-visible,summary:focus-visible,canvas:focus-visible,a:focus-visible{outline:2px solid var(--accent);outline-offset:5px}
a{color:inherit}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}

/* Shared Studio Penumbra identity, taken from the homepage. */
.site-header{position:sticky;top:0;z-index:30;background:rgba(0,0,0,.92);border-bottom:1px solid var(--ln);backdrop-filter:blur(16px)}
.site-nav{height:76px;display:flex;align-items:center;justify-content:space-between;gap:24px}
.site-nav a,.portfolio-section a,.portfolio-footer a{color:inherit;text-decoration:none}
.wordmark{display:flex;align-items:center;gap:13px;flex-shrink:0;font:500 15px/1.25 var(--f-lat);letter-spacing:.13em}
.wordmark small{display:block;font:9px/1.7 var(--f-mono);letter-spacing:.24em;color:#8f8f8f}
.brand-orbit{position:relative;display:block;flex-shrink:0;width:22px;height:22px;transform:rotate(-28deg)}
.brand-orbit svg{position:absolute;left:-7px;top:-3px;display:block;width:36px;height:28px;overflow:visible}
.site-links{display:flex;align-items:center;gap:clamp(18px,2.3vw,30px)}
.site-links>a{position:relative;display:flex;align-items:center;min-height:44px;font:400 13px var(--f-lat);white-space:nowrap;color:#a6a6a6;transition:color .2s}
.site-links>a:hover,.site-links>a[aria-current]{color:#fff}
.site-links>a[data-section]::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:#fff;transform:scaleX(0);transform-origin:left;transition:transform .25s}
.site-links>a[aria-current]::after{transform:scaleX(1)}
.site-links>.nav-cv{border-left:1px solid var(--ln2);padding-left:22px;gap:12px;color:#ececec;font-family:var(--f-mono);font-size:12px}
.nav-number,.nav-korean,.menu-toggle{display:none}
.skip-link{position:fixed;top:12px;left:16px;z-index:50;background:white;color:black;padding:10px 16px;transform:translateY(-160%)}
.skip-link:focus{transform:none}
a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid #eee;outline-offset:5px}
@media(max-width:1199px){
 .site-nav{height:66px}
 .menu-toggle{display:flex;align-items:center;gap:13px;min-height:44px;padding:8px 0 8px 12px;background:none;border:0;color:#d9d9d9;font:12px var(--f-ko);cursor:pointer}
 .menu-toggle-icon{position:relative;display:block;width:20px;height:12px;border-top:1px solid;border-bottom:1px solid;transition:transform .2s}
 .menu-open .menu-toggle-icon{height:1px;border-bottom:0;transform:rotate(45deg)}
 .menu-open .menu-toggle-icon::after{content:'';position:absolute;inset:-1px 0 0;border-top:1px solid;transform:rotate(90deg)}
 .site-links{position:absolute;top:100%;left:0;right:0;background:#070707;border-bottom:1px solid #333;display:none;padding:20px var(--pad) 30px;max-height:calc(100dvh - 66px);overflow-y:auto}
 .menu-open .site-links{display:block}
 .site-links>a{display:grid;grid-template-columns:28px 1fr auto;gap:12px;padding:16px 0;font-size:23px;border-bottom:1px solid var(--ln);white-space:normal}
 .site-links>a[data-section]::after{display:none}
 .site-links>a[aria-current] .nav-number{color:#fff}
 .nav-number{display:block;font:12px var(--f-mono);color:#666}
 .nav-korean{display:block;font:12px var(--f-ko);color:#8f8f8f}
 .site-links>.nav-cv{display:flex;justify-content:space-between;border:0;padding:20px 0 0;margin-left:40px;font-size:13px}
}
.site-links[hidden]{display:none}
html{scroll-padding-top:95px}
body{font-weight:300;word-break:keep-all;overflow-wrap:break-word}
.nav-wrap{width:100%;max-width:1200px;margin:auto;padding-inline:var(--pad)}
.site-nav .wordmark{font-size:15px;font-weight:500;letter-spacing:.13em}
.site-nav .wordmark small{font-size:9px}
.site-links>a{font-size:14px}
.nav-number,.nav-korean{font-size:12px}
.site-header a{border-radius:0}
.portfolio-footer{max-width:1680px;margin:auto;padding:25px var(--pad) 34px;border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:20px;color:#8f8f8f;font:12px/1.7 var(--f-mono)}
.portfolio-footer a{text-decoration:none;color:#bfbfbf}
.portfolio-footer a:hover{color:white}
@media(max-width:1199px){.site-nav{height:66px}.site-links>a{font-size:22px}.site-links .nav-korean{font-size:12px}.site-links>.nav-cv{margin-left:40px}}
@media(max-width:760px){.portfolio-footer{flex-direction:column;gap:9px;padding-inline:20px}}
@media(prefers-reduced-motion:reduce){*{transition:none!important}}

/* Interior Lab. Built on lab-kit.css: the stage and the inspector are two rounded surfaces instead of
   one ruled frame; views and shader files are pill wells, switches are pills, readings over the render
   are chips. The frame stays in the gray wedge; colour lives in the render and the face legend. */
.shell{margin:auto}
.workspace{--view-height:clamp(520px,calc(100svh - 190px),900px);display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px}
.workspace.code-open{grid-template-columns:minmax(0,1fr) 440px}

/* ---------- stage ---------- */
.stage{position:relative;min-width:0;height:var(--view-height);overflow:hidden;border-radius:var(--lk-radius);background:var(--k0)}
canvas{display:block;width:100%;height:100%;cursor:grab;touch-action:none}
canvas:active{cursor:grabbing}
.stage-top{position:absolute;top:16px;left:16px;right:16px;z-index:1;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;pointer-events:none}
.stage-label,.status,.stage-bottom span,.legend{border-radius:999px;background:rgb(0 0 0 / .72);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.stage-label{display:inline-block;padding:4px 12px;border-radius:14px!important;color:var(--k8);font:400 12px/20px var(--mono);letter-spacing:.08em}
.stage-actions{display:flex;align-items:center;gap:8px}
.status{display:flex;align-items:center;gap:8px;min-height:28px;padding:0 12px;color:var(--k8);font-size:12px;font-weight:400}
.status i{width:6px;height:6px;border-radius:50%;background:var(--k10)}
.tour-toggle{flex-shrink:0;min-height:32px;padding:0 14px;border:0;border-radius:999px;background:rgb(0 0 0 / .72);color:var(--k9);font:12px var(--mono);letter-spacing:.04em;white-space:nowrap;pointer-events:auto;cursor:pointer;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.tour-toggle:hover{background:var(--k2);color:var(--k10)}
.tour-toggle[aria-pressed="true"]{background:var(--k10);color:var(--k0)}
.tour-toggle[hidden]{display:none}
.legend{position:absolute;top:56px;left:16px;display:none;flex-wrap:wrap;gap:6px 14px;padding:6px 14px;color:var(--k9);font-size:12px}
.legend.visible{display:flex}
.legend i{display:inline-block;width:8px;height:8px;margin-right:6px;border-radius:50%;background:var(--c)}
.stage-bottom{position:absolute;bottom:16px;left:16px;right:16px;display:flex;align-items:center;justify-content:space-between;gap:12px;pointer-events:none}
.stage-bottom span{padding:6px 14px;color:var(--k8);font-size:12px;font-weight:400}
.stage-bottom .coordinates{color:var(--k9);font:12px var(--mono)}
.error{position:absolute;inset:0;display:grid;place-content:center;gap:12px;padding:36px;background:var(--k1);text-align:center}
.error[hidden]{display:none}
.error h2{margin:0;color:var(--k9);font-size:20px;font-weight:400}
.error p{max-width:36ch;margin:0 auto;color:var(--k6);font-size:14px}
.error button{justify-self:center;min-height:40px;padding:0 18px;border:0;border-radius:999px;background:var(--k2);color:var(--k9);font-size:14px}
.error button:hover{background:var(--k3);color:var(--k10)}

/* ---------- inspector ---------- */
.inspector{display:flex;flex-direction:column;min-width:0;height:var(--view-height);overflow:hidden;border-radius:var(--lk-radius);background:var(--k1)}
.inspector-tabs{display:flex;flex-shrink:0;gap:2px;margin:16px 16px 0;padding:3px;border-radius:999px;background:var(--k0)}
.inspector-tabs button{display:flex;flex:1;align-items:center;justify-content:center;gap:8px;min-height:36px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--k6);font-size:14px;font-weight:400;white-space:nowrap}
.inspector-tabs button:hover{color:var(--k10)}
.inspector-tabs button[aria-selected=true]{background:var(--k10);color:var(--k0);font-weight:500}
.code-symbol{color:inherit;font:12px var(--mono);opacity:.7}
.panel{flex:1;min-height:0;overflow:auto;padding:20px}
.panel[hidden],.source-panel[hidden]{display:none}
.panel-title{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px}
.panel-title h2{margin:0;color:var(--k9);font-size:16px;font-weight:500}
.panel-title span{color:var(--k5);font:12px var(--mono)}
.section-label{display:block;margin-bottom:12px;color:var(--k5);font:400 12px var(--mono);letter-spacing:.1em}
.section{margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid var(--k2)}
.light-choices{display:flex;gap:2px;padding:3px;border-radius:999px;background:var(--k0)}
.light-choices button{flex:1;min-height:34px;padding:0;border:0;border-radius:999px;background:transparent;color:var(--k6);font-size:14px}
.light-choices button:hover{color:var(--k10)}
.light-choices button[aria-pressed=true]{background:var(--k10);color:var(--k0)}
.control{margin-top:16px}
.control:first-of-type{margin-top:0}
.control label{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:2px;color:var(--k6);font-size:14px;font-weight:300}
.control output{color:var(--k10);font:14px var(--mono)}
.control .ends{display:flex;justify-content:space-between;color:var(--k5);font-size:12px}
.toggle-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:16px 0 0;color:var(--k8);font-size:14px;font-weight:300}
.toggle{position:relative;flex-shrink:0;width:40px;height:24px;padding:0;border:0;border-radius:999px;background:var(--k3);transition:background-color .15s}
.toggle::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:var(--k7);transition:transform .15s,background-color .15s}
.toggle[aria-checked=true]{background:var(--k10)}
.toggle[aria-checked=true]::after{background:var(--k0);transform:translateX(16px)}
.actions{display:grid;gap:8px}
.action{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:40px;padding:0 16px;border:0;border-radius:999px;background:var(--k2);color:var(--k9);font-size:14px;font-weight:400;text-align:left}
.action:hover{background:var(--k3);color:var(--k10)}
.action span{color:var(--k6)}
.action:disabled{opacity:.45;cursor:default}
.action:disabled:hover{background:var(--k2)}
.action[aria-pressed=true]{background:var(--k10);color:var(--k0)}
.action[aria-pressed=true] span{color:var(--k3)}
.layout-note{margin:0 4px 4px;color:var(--k5);font-size:12px;line-height:1.7}
.text-button{justify-self:start;min-height:32px;padding:0 4px;border:0;background:none;color:var(--k6);font-size:14px;text-align:left;text-decoration:underline;text-underline-offset:4px}
.text-button:hover{color:var(--k10)}
.text-button[aria-pressed=true]{color:var(--k10)}

/* Shader source. */
.source-panel{display:flex;flex:1;flex-direction:column;min-height:0;padding:20px 0 0}
.source-heading{padding:0 20px}
.source-heading h2{margin:0;color:var(--k9);font-size:16px;font-weight:500}
.source-heading p{margin:6px 0 16px;color:var(--k5);font-size:12px;line-height:1.7}
.shader-files{display:flex;gap:2px;margin:0 20px;padding:3px;border-radius:999px;background:var(--k0)}
.shader-files button{flex:1;min-height:34px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--k6);font:12px var(--mono)}
.shader-files button:hover{color:var(--k10)}
.shader-files button[aria-pressed=true]{background:var(--k10);color:var(--k0)}
.source-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px 8px 20px}
.source-meta{color:var(--k5);font:12px var(--mono)}
.source-actions{display:flex;gap:4px}
.source-actions button{min-height:32px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--k8);font-size:14px}
.source-actions button:hover{background:var(--k2);color:var(--k10)}
.code-scroll{flex:1;min-height:200px;margin:0 12px;padding:12px 0;overflow:auto;border-radius:var(--lk-radius-m);background:var(--k0);tab-size:2;scrollbar-color:var(--k3) transparent;overscroll-behavior:contain}
.code-scroll code{display:block;width:max-content;min-width:100%;color:var(--k7);font:12px/1.8 var(--mono);white-space:pre;word-break:normal;overflow-wrap:normal}
.code-line{position:relative;display:block;min-height:1.8em;padding:0 20px 0 52px}
.code-line::before{content:attr(data-line);position:absolute;left:0;width:36px;color:var(--k4);font-weight:400;text-align:right;user-select:none}
.code-line:hover{background:var(--k1)}
.tok-comment{color:var(--k5);font-style:italic}
.tok-keyword{color:var(--k10);font-weight:500}
.tok-type{color:var(--k8)}
.tok-number{color:var(--k7)}
.source-status{min-height:40px;padding:10px 20px;color:var(--k5);font-size:12px;line-height:1.6}

/* ---------- below the workspace ---------- */
.caption{display:flex;justify-content:space-between;gap:20px;padding:16px 4px 24px;color:var(--k5);font:12px/1.7 var(--mono)}
.caption strong{color:var(--k9);font:400 14px var(--f-ko)}
.shell > details{margin-bottom:24px;padding:4px 24px 12px;border-radius:var(--lk-radius);background:var(--k1)}
.shell > details summary{display:flex;align-items:center;gap:10px;min-height:52px;color:var(--k6);font-size:14px;list-style:none;cursor:pointer}
.shell > details summary::-webkit-details-marker{display:none}
.shell > details summary::before{content:"";flex-shrink:0;width:6px;height:6px;margin:0 2px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg);transition:transform .15s}
.shell > details[open] summary::before{transform:rotate(45deg)}
.shell > details summary:hover{color:var(--k10)}
.notes{max-width:780px;padding:4px 0 0;color:var(--k6);font-size:14px;line-height:1.85}
.notes p{margin:0 0 12px}
.notes code{font:12px var(--mono)}

/* ---------- smaller screens ---------- */
@media(min-width:1500px){.workspace{grid-template-columns:minmax(0,1fr) 320px}.panel{padding:24px}}
@media(max-width:1200px) and (min-width:761px){.workspace.code-open{grid-template-columns:minmax(0,1fr) 360px}}
@media(max-width:1050px){.workspace{grid-template-columns:minmax(0,1fr) 280px}.stage-bottom .coordinates{display:none}}
@media(max-width:1050px) and (min-width:761px){.workspace.code-open{grid-template-columns:minmax(0,1fr) 320px}.panel{padding:20px 16px}.source-heading{padding-inline:16px}.shader-files{margin-inline:16px}}
@media(max-width:760px){
 .workspace,.workspace.code-open{--view-height:420px;grid-template-columns:1fr}
 .stage{border-radius:18px}
 .inspector{height:auto}
 .panel{display:grid;grid-template-columns:1fr 1fr;gap:0 20px;overflow:visible}
 .panel-title{grid-column:1/-1}
 .section{margin:0 0 20px}
 .actions{grid-column:1/-1;align-self:start}
 .source-panel{flex:none;height:560px}
 .code-scroll{min-height:240px}
 .stage-top{top:12px;left:12px;right:12px}
 .stage-bottom{bottom:12px;left:12px;right:12px}
 .stage-top .status{display:none}
 .legend{left:12px}
 .caption{display:block}
 .caption span{display:block}
 .shell > details{padding:4px 20px 12px;border-radius:18px}
}
@media(max-width:380px){.workspace{--view-height:360px}.panel{grid-template-columns:1fr}.panel-title{grid-column:auto}}
