:root{--bg: #05050b;--surface: rgba(255, 255, 255, .04);--surface-strong: rgba(255, 255, 255, .08);--line: rgba(255, 255, 255, .1);--line-strong: rgba(255, 255, 255, .18);--text: #f3f3f8;--muted: #a3a3b8;--dim: #6f6f85;--accent: #a99bff;--accent-2: #5fd6ff;--radius: 20px;--font: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Noto Sans KR", "Segoe UI", sans-serif;--mono: "SF Mono", ui-monospace, Menlo, Consolas, monospace;color-scheme:dark}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;min-height:100vh;background:var(--bg);color:var(--text);font-family:var(--font);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;word-break:keep-all;overflow-wrap:break-word}a{color:inherit;text-decoration:none}img{max-width:100%}:focus-visible{outline:2px solid var(--accent-2);outline-offset:3px;border-radius:8px}.site-nav{position:fixed;inset:0 0 auto;z-index:10001;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px clamp(16px,4vw,40px);pointer-events:none}.site-nav>*{pointer-events:auto}body[data-route=projects] .site-nav{background:linear-gradient(180deg,#05050beb,#05050bb3 70%,#05050b00);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.brand{font-weight:700;font-size:17px;letter-spacing:-.02em}.brand span{color:var(--dim);font-weight:500}.tabs{display:flex;gap:4px;padding:4px;border-radius:999px;background:#0e0e188c;border:1px solid var(--line);backdrop-filter:blur(16px) saturate(140%);-webkit-backdrop-filter:blur(16px) saturate(140%)}.tabs a{padding:7px 16px;border-radius:999px;font-size:14px;font-weight:600;color:var(--muted);transition:color .2s,background-color .2s}.tabs a:hover{color:var(--text)}.tabs a.is-active{color:#0b0b14;background:var(--text)}.container{width:min(1120px,100%);margin-inline:auto;padding-inline:clamp(16px,4vw,40px)}.container.narrow{width:min(820px,100%)}.eyebrow{margin:0 0 12px;font-size:13px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--accent)}@media (prefers-reduced-motion: reduce){*,*:before,*:after{transition:none!important;animation:none!important}}.home{position:relative;min-height:100vh;min-height:100svh;display:grid;place-items:center;padding:96px clamp(16px,4vw,40px) 40px}.fluid-bg{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;background-color:#05050b}.fluid-fallback{position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(6% 8% at 44% 58%,rgba(170,230,255,.85),transparent 70%),radial-gradient(22% 28% at 44% 58%,rgba(40,140,255,.55),transparent 75%),radial-gradient(55% 60% at 30% 75%,rgba(20,80,230,.35),transparent 75%),#02040c}.fluid-bg{z-index:0}#view>canvas{z-index:1!important}.home-inner{position:relative;z-index:2;width:min(580px,100%);display:grid;gap:18px;justify-items:center}.intro-card{width:100%;padding:clamp(24px,5vw,40px);border-radius:32px;background-color:#100e1e38;border:1px solid rgba(255,255,255,.16)}.intro-card:not([data-mirage-dom=hide]){background-color:#14122461;backdrop-filter:blur(28px) saturate(150%);-webkit-backdrop-filter:blur(28px) saturate(150%)}.intro-head{display:flex;align-items:center;gap:14px;margin-bottom:26px}.avatar{flex:none;display:grid;place-items:center;width:52px;height:52px;border-radius:16px;font-weight:700;font-size:17px;color:#fff;object-fit:cover;background-image:linear-gradient(135deg,#7c5cff,#22c3ee)}.intro-name{margin:0;font-size:18px;font-weight:700;line-height:1.3}.intro-name span{margin-left:4px;font-size:14px;font-weight:500;color:#c9c9da}.intro-role{margin:2px 0 0;font-size:14px;color:#b8b8cc}.intro-headline{margin:0 0 16px;font-size:clamp(26px,5vw,36px);line-height:1.32;letter-spacing:-.02em;font-weight:700}.intro-headline em{font-style:normal;color:#c3b8ff}.intro-bio{margin:0 0 22px;font-size:15px;line-height:1.7;color:#d4d4e2}.intro-highlights{display:grid;gap:8px;margin:0 0 22px;padding:0;list-style:none}.intro-highlights li{position:relative;padding-left:18px;font-size:14px;color:#dcdcea}.intro-highlights li:before{content:"";position:absolute;left:2px;top:.62em;width:6px;height:6px;border-radius:50%;background-color:#8fe3ff}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 28px;padding:0;list-style:none}.chips li{padding:4px 11px;border-radius:999px;font-size:12.5px;font-weight:600;color:#e8e8f4;background-color:#ffffff17;border:1px solid rgba(255,255,255,.12)}.intro-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px}.intro-links{display:flex;flex-wrap:wrap;gap:8px}.link-pill{display:inline-flex;align-items:center;gap:6px;padding:8px 13px;border-radius:12px;font-size:13.5px;font-weight:600;color:#f0f0f8;background-color:#ffffff12;border:1px solid rgba(255,255,255,.12)}.intro-cta{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:12px;font-size:14px;font-weight:700;color:#0b0b14;background-color:#f3f3f8}.link-pill,.intro-cta{transition:background-color .2s,border-color .2s,transform .2s}.link-pill:hover{background-color:#ffffff24;border-color:#ffffff3d}.intro-cta:hover{transform:translateY(-1px)}.home-hint{margin:0;font-size:12.5px;color:#ffffff80;text-align:center}.is-fallback .home-hint{display:none}@media (max-width: 480px){.intro-footer{flex-direction:column;align-items:stretch}.intro-cta{justify-content:center}}.projects-page{position:relative;min-height:100vh;padding:120px 0 96px;overflow:hidden}.page-glow{--a1: #6a4bff;--a2: #1aa8ff;position:absolute;inset:-20% -10% auto;height:720px;pointer-events:none;background:radial-gradient(40% 50% at 25% 30%,color-mix(in srgb,var(--a1) 40%,transparent),transparent 70%),radial-gradient(35% 45% at 75% 20%,color-mix(in srgb,var(--a2) 30%,transparent),transparent 70%);filter:blur(40px);opacity:.7}.projects-page .container{position:relative}.page-head{margin-bottom:48px}.page-head h1{margin:0 0 12px;font-size:clamp(34px,6vw,52px);line-height:1.15;letter-spacing:-.03em}.lead{margin:0;max-width:620px;font-size:17px;color:var(--muted)}.empty{color:var(--muted)}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,320px),1fr));gap:20px}.project-card{--a1: #7c5cff;--a2: #22d3ee;position:relative;display:flex;flex-direction:column;border-radius:24px;overflow:hidden;background:var(--surface);border:1px solid var(--line);transition:transform .35s cubic-bezier(.2,.8,.2,1),border-color .35s,background-color .35s}.project-card:hover{transform:translateY(-4px);border-color:var(--line-strong);background:var(--surface-strong)}.project-cover{position:relative;aspect-ratio:16 / 9;display:grid;place-items:center;overflow:hidden;background:radial-gradient(60% 80% at 20% 20%,color-mix(in srgb,var(--a1) 85%,transparent),transparent 70%),radial-gradient(60% 80% at 85% 90%,color-mix(in srgb,var(--a2) 75%,transparent),transparent 70%),#0c0c16}.project-cover img{width:100%;height:100%;object-fit:cover}.cover-mark{font-size:72px;font-weight:800;letter-spacing:-.04em;color:#ffffffe6;mix-blend-mode:overlay}.project-body{flex:1;padding:22px 24px 26px}.project-meta{margin:0 0 6px;font-size:13px;color:var(--dim)}.project-body h2{margin:0 0 8px;font-size:21px;letter-spacing:-.02em;line-height:1.3}.project-summary{margin:0 0 16px;font-size:15px;color:var(--muted)}.project-arrow{position:absolute;top:16px;right:16px;display:grid;place-items:center;width:36px;height:36px;border-radius:50%;color:#fff;background:#00000059;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);opacity:0;transform:translate(-6px);transition:opacity .3s,transform .3s}.project-card:hover .project-arrow,.project-card:focus-visible .project-arrow{opacity:1;transform:none}.tags{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.tags li{padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;color:var(--muted);background:var(--surface-strong)}.project-section+.project-section{margin-top:64px}.section-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;margin-bottom:20px}.section-head h2{margin:0;font-size:22px;letter-spacing:-.02em}.section-head p{margin:0;font-size:14px;color:var(--dim)}.project-list{display:grid;gap:10px}.project-row{--a1: #7c5cff;--a2: #22d3ee;display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:16px;padding:14px 18px;border-radius:16px;background:var(--surface);border:1px solid var(--line);transition:background-color .25s,border-color .25s}.project-row:hover{background:var(--surface-strong);border-color:var(--line-strong)}.row-mark{display:grid;place-items:center;width:40px;height:40px;border-radius:12px;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--a1),var(--a2))}.row-body{display:grid;gap:2px;min-width:0}.row-title{font-weight:700;font-size:16px}.row-summary{font-size:14px;color:var(--muted)}.row-meta{font-size:13px;color:var(--dim);white-space:nowrap}.row-arrow{display:grid;color:var(--dim);transition:transform .25s,color .25s}.project-row:hover .row-arrow{color:var(--text);transform:translate(3px)}@media (max-width: 640px){.project-row{grid-template-columns:auto 1fr auto}.row-meta{display:none}}.back-link{display:inline-flex;align-items:center;gap:6px;margin-bottom:32px;font-size:14px;color:var(--muted)}.back-link:hover{color:var(--text)}.detail-head{padding-bottom:36px;margin-bottom:40px;border-bottom:1px solid var(--line)}.detail-head .eyebrow{color:color-mix(in srgb,var(--a1) 55%,white)}.detail-head h1{margin:0 0 14px;font-size:clamp(32px,6vw,48px);line-height:1.18;letter-spacing:-.03em}.detail-head .lead{margin-bottom:20px}.detail-links{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px}.button{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:12px;font-size:14px;font-weight:600;background:var(--surface-strong);border:1px solid var(--line);transition:background-color .2s,border-color .2s}.button:hover{background:#ffffff1f;border-color:var(--line-strong)}.button svg{width:14px;height:14px;opacity:.7}.detail-pager{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:72px;padding-top:32px;border-top:1px solid var(--line)}.detail-pager a{display:grid;gap:2px;padding:16px 18px;border-radius:16px;font-weight:600;background:var(--surface);border:1px solid var(--line)}.detail-pager a:hover{border-color:var(--line-strong)}.detail-pager a.next{text-align:right}.detail-pager small{font-size:12px;font-weight:500;color:var(--dim)}.prose{font-size:16.5px;line-height:1.8;color:#d6d6e3}.prose>:first-child{margin-top:0}.prose h2,.prose h3,.prose h4{color:var(--text);letter-spacing:-.02em;line-height:1.35}.prose h2{margin:64px 0 18px;font-size:27px}.prose h3{margin:40px 0 12px;font-size:20px}.prose h4{margin:28px 0 8px;font-size:17px}.prose p,.prose ul,.prose ol{margin:0 0 18px}.prose ul,.prose ol{padding-left:1.3em}.prose li+li{margin-top:6px}.prose strong{color:var(--text)}.prose a{color:var(--accent-2);text-decoration:underline;text-underline-offset:3px;text-decoration-color:#5fd6ff66}.prose hr{margin:48px 0;border:0;border-top:1px solid var(--line)}.prose img,.prose video{display:block;max-width:100%;border-radius:16px;border:1px solid var(--line)}.prose blockquote{margin:0 0 18px;padding:14px 18px;border-left:3px solid var(--accent);border-radius:0 12px 12px 0;background:var(--surface);color:var(--muted)}.prose blockquote>:last-child{margin-bottom:0}.prose :not(pre)>code{padding:2px 6px;border-radius:6px;font-family:var(--mono);font-size:.88em;color:#e6ddff;background:#a99bff1f}.prose pre{margin:0 0 22px;padding:0;border-radius:14px;border:1px solid var(--line);background:#0b0b14;overflow-x:auto}.prose pre code.hljs,.prose pre code{display:block;padding:18px 20px;font-family:var(--mono);font-size:13.5px;line-height:1.65;background:transparent}.prose table{display:block;width:max-content;max-width:100%;margin:0 0 22px;overflow-x:auto;border-collapse:collapse;font-size:14.5px}.prose th,.prose td{padding:9px 14px;border:1px solid var(--line);text-align:left;vertical-align:top}.prose th{color:var(--text);background:var(--surface-strong)}.prose details{margin:0 0 14px;border-radius:16px;border:1px solid var(--line);background:var(--surface)}.prose details>summary{padding:16px 20px;font-weight:700;font-size:17px;color:var(--text);cursor:pointer;list-style:none}.prose details>summary::-webkit-details-marker{display:none}.prose details>summary:before{content:"▸";display:inline-block;margin-right:10px;color:var(--dim);transition:transform .2s}.prose details[open]>summary:before{transform:rotate(90deg)}.prose details>:not(summary){margin-inline:20px}.prose details>:last-child{margin-bottom:20px}.prose details h3:first-of-type{margin-top:8px}.callout{margin:0 0 22px;padding:16px 20px;border-radius:14px;border:1px solid rgba(169,155,255,.28);background:#a99bff14;color:var(--text)}.callout.warn{border-color:#ff80804d;background:#ff6e6e12;color:#ffc9c9}.callout>:last-child{margin-bottom:0}.problem,.solution{margin:0 0 14px;padding:14px 18px;border-radius:12px}.problem{border-left:3px solid #ff6b6b;background:#ff6b6b12}.solution{border-left:3px solid #4dabf7;background:#4dabf712}.problem>:last-child,.solution>:last-child{margin-bottom:0}.steps{counter-reset:step;list-style:none;padding:0!important}.steps>li{counter-increment:step;position:relative;padding:0 0 0 48px;margin:0 0 26px!important}.steps>li:before{content:counter(step);position:absolute;left:0;top:2px;display:grid;place-items:center;width:30px;height:30px;border-radius:50%;font-size:14px;font-weight:700;color:#0b0b14;background:linear-gradient(135deg,var(--accent),var(--accent-2))}.steps>li>strong:first-child{display:block;margin-bottom:4px;font-size:17px}.grid-2{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:14px;margin:0 0 22px}.grid-2>*{margin:0;padding:16px 18px;border-radius:14px;border:1px solid var(--line);background:var(--surface)}.grid-2 h4{margin:0 0 6px}.grid-2 p{margin:0;font-size:15px}.figure-placeholder{display:grid;place-items:center;min-height:180px;margin:0 0 22px;padding:20px;border-radius:16px;border:1px dashed var(--line-strong);color:var(--dim);font-size:14px;text-align:center}.video-embed{position:relative;aspect-ratio:16 / 9;margin:0 0 22px;border-radius:16px;overflow:hidden;border:1px solid var(--line);background:#000}.video-embed.is-vertical{aspect-ratio:9 / 16;width:min(100%,340px);margin-inline:auto}.video-embed iframe{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;border:0}.prose figure{margin:0 0 22px}.prose figure img{width:100%}.prose figcaption{margin-top:8px;font-size:13px;color:var(--dim);text-align:center}.prose .narrow-figure{max-width:420px;margin-inline:auto}.img-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:12px;margin:0 0 22px}.img-grid>img,.img-grid figure,.prose figure>.video-embed,.prose figure>.img-grid{margin:0}.img-grid img{width:100%;height:100%;object-fit:cover}.img-grid-tall img{aspect-ratio:3 / 4;object-fit:contain;background:#0b0b14}.video-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:14px;max-width:560px;margin:0 auto 22px}.video-grid figure{margin:0}.video-grid video{width:100%;background:#000}.demo-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:12px;margin:0 0 32px}.prose a.demo-card{display:flex;flex-direction:column;gap:6px;padding:20px;border-radius:18px;border:1px solid var(--line);background:var(--surface);color:var(--text);text-decoration:none;transition:transform .3s cubic-bezier(.2,.8,.2,1),border-color .3s,background-color .3s}.prose a.demo-card:hover{transform:translateY(-3px);border-color:var(--line-strong);background-color:var(--surface-strong)}.prose a.demo-card.is-main{border-color:#5fd6ff59;background:radial-gradient(120% 90% at 0% 0%,rgba(124,92,255,.24),transparent 60%),radial-gradient(100% 80% at 100% 100%,rgba(34,211,238,.18),transparent 60%),var(--surface)}.prose a.demo-card.is-main:hover{border-color:#5fd6ffa6}.demo-badge{align-self:flex-start;margin-bottom:4px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.08em;color:var(--muted);background:var(--surface-strong)}.is-main .demo-badge{color:#0b0b14;background:linear-gradient(135deg,var(--accent),var(--accent-2))}.demo-title{font-size:20px;font-weight:800;line-height:1.25;letter-spacing:-.02em}.demo-desc{font-size:14.5px;line-height:1.55;color:var(--muted)}.demo-cta{margin-top:auto;padding-top:12px;font-size:14px;font-weight:700;color:var(--accent-2);transition:transform .2s}.demo-card:not(.is-main) .demo-cta{color:var(--text)}.prose a.demo-card:hover .demo-cta{transform:translate(3px)}@media (max-width: 720px){.demo-grid{grid-template-columns:1fr}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
  Theme: GitHub Dark
  Description: Dark theme as seen on github.com
  Author: github.com
  Maintainer: @Hirse
  Updated: 2021-05-15

  Outdated base version: https://github.com/primer/github-syntax-dark
  Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
