@font-face{font-family:D2Coding;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/D2Coding-Regular.woff2) format("woff2")}@font-face{font-family:D2Coding;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/D2Coding-Bold.woff2) format("woff2")}@font-face{font-family:Spec Mono Space;src:local("AppleSDGothicNeo-Regular"),local("Apple SD Gothic Neo"),local("MalgunGothic"),local("Malgun Gothic"),local("NotoSansKR-Regular"),local("ArialMT"),local("Arial"),local("Helvetica");unicode-range:u+0020}:root{--spec-ground:#e9ecea;--spec-paper:#f6f7f5;--spec-soft:#dce0dd;--spec-ink:#0d0f0e;--spec-body:#2b312f;--spec-muted:#5b6360;--spec-line:#c4cac6;--spec-line-strong:#79817d;--spec-inverse-bg:#0d0f0e;--spec-inverse-fg:#f6f7f5;--spec-focus:#2f6ff0;--spec-float-bg:rgba(246,247,245,0.9);--spec-float-border:#c4cac6;--spec-shadow-lift:0 18px 30px -18px rgba(13,15,14,0.35);--spec-holo-flat:linear-gradient(100deg,#ffb8e4,#a9deff 40%,#ffe08a 80%);--spec-font-display:"Chakra Petch","Arial Narrow","Helvetica Neue","Noto Sans KR",sans-serif;--spec-font-mono:"IBM Plex Mono","SFMono-Regular",Menlo,"Noto Sans KR",monospace;--spec-tracking-label:0.1em;--spec-tracking-label-ko:0.04em;--spec-tracking-heading:-0.04em;--spec-radius-pill:999px;--spec-ease:cubic-bezier(0.2,0.8,0.2,1);--spec-gutter:clamp(16px,4vw,56px);--blog-content-width:44rem;--blog-wide-width:72rem;--blog-header-top:14px;--blog-header-h:54px;--blog-font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Apple SD Gothic Neo","Pretendard","Noto Sans KR",sans-serif;--blog-font-mono:"D2Coding",ui-monospace,SFMono-Regular,"SF Mono",Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color-scheme:light}:root:lang(ko){--spec-font-mono:"Spec Mono Space","IBM Plex Mono","SFMono-Regular",Menlo,"Noto Sans KR",monospace}@media (prefers-color-scheme:dark){:root{--spec-ground:#0d0f0e;--spec-paper:#141716;--spec-soft:#1b1f1d;--spec-ink:#f6f7f5;--spec-body:#c9cecb;--spec-muted:#9aa19e;--spec-line:#2a2f2d;--spec-line-strong:#6b7470;--spec-inverse-bg:#f6f7f5;--spec-inverse-fg:#0d0f0e;--spec-focus:#6fa0ff;--spec-float-bg:rgba(20,23,22,0.82);--spec-float-border:rgba(255,255,255,0.14);--spec-shadow-lift:0 26px 64px rgba(0,0,0,0.55),inset 0 1px 0 rgba(255,255,255,0.12);color-scheme:dark}}*{box-sizing:border-box}html{scroll-behavior:smooth}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}body,html{margin:0;padding:0;background:var(--spec-ground);color:var(--spec-ink);font-family:var(--blog-font);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body{word-break:keep-all}::selection{background:var(--spec-inverse-bg);color:var(--spec-inverse-fg)}a{color:inherit}:focus-visible{outline:2px solid var(--spec-focus);outline-offset:3px}.blog-card-meta,.blog-footer-inner,.blog-index-meta,.blog-post-meta,.blog-toc-title{font-family:var(--spec-font-mono);font-size:11px;font-weight:400;letter-spacing:var(--spec-tracking-label);text-transform:uppercase;color:var(--spec-muted);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}:lang(ko) .blog-card-meta,:lang(ko) .blog-footer-inner,:lang(ko) .blog-index-meta,:lang(ko) .blog-post-meta,:lang(ko) .blog-toc-title{letter-spacing:var(--spec-tracking-label-ko)}.blog-card-category,.blog-post-category{display:inline-flex;align-items:center;padding:2px 8px;line-height:16px;border:1px solid var(--spec-line);border-radius:var(--spec-radius-pill);color:var(--spec-ink);font-weight:500;white-space:nowrap}.blog-header{position:-webkit-sticky;position:sticky;top:var(--blog-header-top);z-index:10;padding:0 var(--spec-gutter);margin-top:var(--blog-header-top);pointer-events:none}.blog-header-inner{pointer-events:auto;max-width:var(--blog-wide-width);margin:0 auto;height:var(--blog-header-h);padding:0 8px 0 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-radius:var(--spec-radius-pill);background:var(--spec-float-bg);border:1px solid var(--spec-float-border);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.blog-logo{gap:12px;white-space:nowrap}.blog-logo,.blog-logo-mark{display:inline-flex;align-items:center}.blog-logo-mark{text-decoration:none}.blog-logo img{height:26px;width:auto;display:block}.blog-logo .blog-divider{width:1px;height:18px;background:var(--spec-line)}.blog-logo .blog-label{font-family:var(--spec-font-mono);font-size:11px;font-weight:500;letter-spacing:var(--spec-tracking-label);text-transform:uppercase;color:var(--spec-ink);text-decoration:none}:lang(ko) .blog-logo .blog-label{letter-spacing:var(--spec-tracking-label-ko)}.blog-nav{display:flex;align-items:center;gap:4px;font-size:14px;white-space:nowrap;flex-shrink:0}.blog-nav a{display:inline-flex;align-items:center;min-height:38px;padding:0 12px;border-radius:var(--spec-radius-pill);color:var(--spec-muted);text-decoration:none;transition:color .15s ease}.blog-nav a:hover{color:var(--spec-ink)}.blog-nav a.blog-nav-cta{gap:6px;margin-left:6px;padding:0 16px;background:var(--spec-inverse-bg);color:var(--spec-inverse-fg);font-weight:700;transition:transform .15s var(--spec-ease)}.blog-nav a.blog-nav-cta:hover{color:var(--spec-inverse-fg);transform:translateY(-2px)}.blog-nav a.blog-nav-cta:active{transform:scale(.98)}.blog-main{max-width:calc(var(--blog-content-width) + 2 * var(--spec-gutter));margin:0 auto;padding:72px var(--spec-gutter) 112px;min-height:calc(100vh - 68px - 120px)}.blog-footer{border-top:1px solid var(--spec-line);padding:28px var(--spec-gutter) 44px}.blog-footer-inner{max-width:var(--blog-wide-width);margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px}.blog-footer-links{display:flex;gap:20px}.blog-footer a{color:var(--spec-muted);text-decoration:none}.blog-footer a:hover{color:var(--spec-ink)}.blog-main:has(.blog-index){max-width:calc(var(--blog-wide-width) + 2 * var(--spec-gutter))}.blog-index-head{margin:0 0 56px}.blog-index-meta{display:flex;justify-content:space-between;gap:16px;padding-bottom:14px;margin:0 0 40px;border-bottom:1px solid var(--spec-line)}.blog-index-meta b{color:var(--spec-ink);font-weight:500}.blog-index-count{font-family:var(--spec-font-display);font-weight:700;letter-spacing:.02em;color:var(--spec-ink)}.blog-index-title{font-size:clamp(40px,6vw,80px);font-weight:900;letter-spacing:-.055em;line-height:1.08;margin:0 0 20px;text-wrap:balance}.blog-holo-dot{margin-left:.06em;background:var(--spec-holo-flat);-webkit-background-clip:text;background-clip:text;color:transparent}.blog-index-lede{max-width:36em;margin:0;color:var(--spec-body);font-size:18px;line-height:1.6;text-wrap:pretty}.blog-index-empty{margin:0;color:var(--spec-muted);font-size:15px;line-height:1.6}.blog-index-empty a{color:var(--spec-ink);text-decoration:none;border-bottom:1.5px solid}.blog-card-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-gap:20px;gap:20px;margin-top:20px}.blog-card{position:relative;background:var(--spec-paper);border:1px solid var(--spec-line);transition:transform .35s var(--spec-ease),box-shadow .35s var(--spec-ease)}.blog-card:hover{transform:translateY(-5px);box-shadow:var(--spec-shadow-lift)}@media (prefers-reduced-motion:reduce){.blog-card,.blog-card-link:hover .blog-cover,.blog-card:hover,.blog-cover,.blog-nav a.blog-nav-cta,.blog-nav a.blog-nav-cta:active,.blog-nav a.blog-nav-cta:hover{transform:none;transition:none}}.blog-card-link{display:flex;flex-direction:column;height:100%;text-decoration:none;color:inherit}.blog-card-media{aspect-ratio:16/9;border-bottom:1px solid var(--spec-line);background:var(--spec-soft)}.blog-card-media,.blog-cover{position:relative;overflow:hidden}.blog-cover{container-type:inline-size;width:100%;height:100%;transition:transform .4s cubic-bezier(.2,.6,.2,1)}.blog-card-link:hover .blog-cover{transform:scale(1.03)}.blog-cover-grain{position:absolute;inset:0;background-repeat:repeat;opacity:.5;mix-blend-mode:soft-light;pointer-events:none}.blog-cover-inner{position:relative;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.blog-cover-logo{display:block;flex-shrink:0;width:auto;object-fit:contain}.blog-cover-title{font-weight:700;letter-spacing:-.02em}.blog-cover-summary,.blog-cover-title{margin:0;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.blog-post-cover-figure{margin:0 0 44px;border:1px solid var(--spec-line);overflow:hidden;aspect-ratio:1200/630}.blog-card-body{flex:1 1;display:flex;flex-direction:column;padding:18px 20px 22px}.blog-card-meta{display:flex;align-items:center;flex-wrap:wrap;gap:10px;min-height:22px;margin:0 0 14px}.blog-card-no{margin-left:auto;color:var(--spec-muted)}@media (max-width:360px){.blog-card-no{display:none}}.blog-card-title{margin:0 0 10px;font-size:20px;font-weight:800;letter-spacing:-.03em;line-height:1.36;text-wrap:pretty}.blog-card-desc{margin:0;color:var(--spec-body);font-size:14.5px;line-height:1.62;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden}.blog-card-featured .blog-card-link{display:grid;grid-template-columns:1.35fr 1fr;align-items:stretch}.blog-card-featured .blog-card-media{border-bottom:0;border-right:1px solid var(--spec-line)}.blog-card-featured .blog-card-body{justify-content:center;padding:36px 40px}.blog-card-featured .blog-card-title{font-size:32px;font-weight:900;line-height:1.22;letter-spacing:var(--spec-tracking-heading);margin-bottom:14px}.blog-card-featured .blog-card-desc{font-size:16px;-webkit-line-clamp:7;line-clamp:7}.blog-card-read{align-self:flex-start;margin-top:24px;font-size:15px;font-weight:700;border-bottom:1.5px solid;padding-bottom:1px}@media (min-width:721px){.blog-index:not(:has(.blog-card-grid)) .blog-card-featured .blog-card-media{aspect-ratio:4/3}}@media (max-width:1080px){.blog-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.blog-card-featured .blog-card-body{padding:28px}.blog-card-featured .blog-card-title{font-size:26px}}@media (max-width:720px){.blog-card-featured .blog-card-link{grid-template-columns:1fr}.blog-card-featured .blog-card-media{border-right:0;border-bottom:1px solid var(--spec-line)}.blog-card-featured .blog-card-body{padding:18px 20px 22px}.blog-card-featured .blog-card-title{font-size:24px}.blog-card-featured .blog-card-desc{font-size:15px}.blog-card-grid{grid-template-columns:1fr;gap:16px;margin-top:16px}}.blog-post-header{margin-bottom:36px}.blog-post-title{margin:0 0 20px;font-size:44px;font-weight:900;letter-spacing:-.05em;line-height:1.16;text-wrap:balance}.blog-post-meta{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:12px 0;border-top:1px solid var(--spec-line);border-bottom:1px solid var(--spec-line)}.blog-post-meta .sep{opacity:.5}.blog-toc{margin:0 0 44px;padding:14px 18px 16px;border:1px solid var(--spec-line);background:var(--spec-paper)}.blog-toc-title{margin:0 0 8px}.blog-toc-list{margin:0;padding:0;list-style:none;font-size:13.5px;line-height:1.5}.blog-toc-list li{margin:0}.blog-toc-list{--toc-indent:0px}.blog-toc-list li[data-level="2"]{--toc-indent:12px}.blog-toc-flat .blog-toc-list li[data-level="2"]{--toc-indent:0px}.blog-toc-list a{display:block;padding:5px 0 5px calc(var(--toc-indent) + var(--toc-gutter, 0px));color:var(--spec-muted);text-decoration:none;overflow-wrap:break-word;transition:color .15s ease}.blog-toc-list a:hover{color:var(--spec-ink)}.blog-toc-list a[aria-current=true]{color:var(--spec-ink);font-weight:700}@media (min-width:1280px){.blog-toc{position:fixed;top:calc(var(--blog-header-top) + var(--blog-header-h) + 72px);left:calc(50% + var(--blog-content-width) / 2 + 32px);width:15rem;max-height:calc(100vh - 200px);overflow-y:auto;overscroll-behavior:contain;margin:0;padding:0;border:0;border-left:1px solid var(--spec-line);background:none}.blog-toc-title{padding-left:16px}.blog-toc-list a{--toc-gutter:15px;margin-left:-1px;border-left:2px solid transparent}.blog-toc-list a[aria-current=true]{border-left-color:var(--spec-ink)}}.blog-translation-note{display:flex;gap:8px;align-items:center;margin-top:56px;font-size:13.5px;line-height:1.6;color:var(--spec-muted)}.blog-translation-note-icon{flex:none;color:var(--spec-muted)}.blog-translation-note p{margin:0}.blog-back{display:flex;align-items:center;gap:6px;margin-top:64px;padding-top:28px;border-top:1px solid var(--spec-line);font-size:15px;font-weight:700;color:var(--spec-ink);text-decoration:none}.blog-back span{border-bottom:1.5px solid transparent;transition:border-color .15s ease}.blog-back:hover span{border-bottom-color:currentColor}.blog-translation-note+.blog-back{margin-top:32px}.blog-prose{font-size:17px;line-height:1.8;color:var(--spec-body);overflow-wrap:break-word}.blog-prose>:first-child{margin-top:0}.blog-prose h2,.blog-prose h3,.blog-prose h4,.blog-prose h5,.blog-prose strong{color:var(--spec-ink)}.blog-prose h2{font-size:30px;font-weight:900;letter-spacing:var(--spec-tracking-heading);line-height:1.26;margin:72px 0 20px;text-wrap:balance}.blog-prose h3{font-size:22.5px;font-weight:800;letter-spacing:-.03em;line-height:1.32;margin:48px 0 14px;text-wrap:balance}.blog-prose h2,.blog-prose h3{scroll-margin-top:calc(var(--blog-header-top) + var(--blog-header-h) + 28px)}.blog-prose h4{font-size:18.5px;font-weight:700;letter-spacing:-.02em;margin:36px 0 12px}.blog-prose h5{font-size:16.5px;font-weight:700;margin:28px 0 10px}.blog-prose p{margin:0 0 20px}.blog-prose a{color:var(--spec-ink);font-weight:500;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1.5px;-webkit-text-decoration-color:var(--spec-line-strong);text-decoration-color:var(--spec-line-strong);transition:-webkit-text-decoration-color .15s ease;transition:text-decoration-color .15s ease;transition:text-decoration-color .15s ease,-webkit-text-decoration-color .15s ease}.blog-prose a:hover{-webkit-text-decoration-color:currentColor;text-decoration-color:currentColor}.blog-prose ol,.blog-prose ul{margin:0 0 20px;padding-left:24px}.blog-prose li{margin:6px 0}.blog-prose li::marker{color:var(--spec-muted)}.blog-prose ol>li::marker{font-family:var(--spec-font-mono);font-size:.88em}.blog-prose li>ol,.blog-prose li>ul{margin:6px 0}.blog-prose blockquote{margin:28px 0;padding:2px 0 2px 20px;border-left:2px solid var(--spec-ink);color:var(--spec-ink)}.blog-prose blockquote p:last-child{margin-bottom:0}.blog-prose hr{border:0;border-top:1px solid var(--spec-line);margin:48px 0}.blog-prose img,.blog-prose video{max-width:100%;height:auto;border:1px solid var(--spec-line);display:block;margin:32px 0}.blog-prose strong{font-weight:700}.blog-prose code{font-family:var(--blog-font-mono);font-size:.88em;font-feature-settings:none;font-variant-ligatures:none;background:var(--spec-soft);color:var(--spec-ink);padding:.15em .4em}.blog-prose pre{font-family:var(--blog-font-mono);font-size:13.5px;line-height:1.65;background:var(--spec-paper);border:1px solid var(--spec-line);padding:16px 18px;margin:28px 0;overflow-x:auto;word-break:normal}.blog-prose pre code{background:none;padding:0;font-size:inherit;color:inherit}.blog-prose pre:not(.blog-hl) code span{color:var(--shiki-light)}@media (prefers-color-scheme:dark){.blog-prose pre:not(.blog-hl) code span{color:var(--shiki-dark)}}.blog-prose pre.blog-hl{--hl-keyword:#7c3aed;--hl-string:#0a7d5a;--hl-comment:var(--spec-muted);--hl-name:var(--spec-ink);--hl-func:#1d4ed8;--hl-number:#b45309;--hl-punct:var(--spec-muted)}@media (prefers-color-scheme:dark){.blog-prose pre.blog-hl{--hl-keyword:#c4b5fd;--hl-string:#6ee7b7;--hl-comment:var(--spec-muted);--hl-func:#93c5fd;--hl-number:#fcd34d}}.blog-prose pre.blog-hl .k,.blog-prose pre.blog-hl .kc,.blog-prose pre.blog-hl .kd,.blog-prose pre.blog-hl .kn,.blog-prose pre.blog-hl .kr,.blog-prose pre.blog-hl .ow{color:var(--hl-keyword)}.blog-prose pre.blog-hl .s,.blog-prose pre.blog-hl .s1,.blog-prose pre.blog-hl .s2,.blog-prose pre.blog-hl .sb,.blog-prose pre.blog-hl .sd,.blog-prose pre.blog-hl .se,.blog-prose pre.blog-hl .si,.blog-prose pre.blog-hl .sr{color:var(--hl-string)}.blog-prose pre.blog-hl .c,.blog-prose pre.blog-hl .c1,.blog-prose pre.blog-hl .cm,.blog-prose pre.blog-hl .cp,.blog-prose pre.blog-hl .cs{color:var(--hl-comment);font-style:italic}.blog-prose pre.blog-hl .fm,.blog-prose pre.blog-hl .nd,.blog-prose pre.blog-hl .nf{color:var(--hl-func)}.blog-prose pre.blog-hl .nb,.blog-prose pre.blog-hl .nc,.blog-prose pre.blog-hl .nn,.blog-prose pre.blog-hl .nt{color:var(--hl-keyword)}.blog-prose pre.blog-hl .il,.blog-prose pre.blog-hl .m,.blog-prose pre.blog-hl .mf,.blog-prose pre.blog-hl .mh,.blog-prose pre.blog-hl .mi{color:var(--hl-number)}.blog-prose pre.blog-hl .o,.blog-prose pre.blog-hl .p{color:var(--hl-punct)}.blog-preview-banner{max-width:var(--blog-content-width);margin:0 auto 32px;padding:11px 16px;border:1px solid var(--spec-line);background:var(--spec-paper);color:var(--spec-muted);font-size:14px;text-align:center}.blog-preview-banner-error{color:#b91c1c}@media (prefers-color-scheme:dark){.blog-preview-banner-error{color:#fca5a5}}.blog-prose .blog-table-scroll,.blog-prose figure{overflow-x:auto;margin:28px 0}.blog-prose table{border-collapse:collapse;width:100%;font-size:15px}.blog-prose td,.blog-prose th{border:1px solid var(--spec-line);padding:9px 13px;text-align:left;vertical-align:top}.blog-prose td{background:var(--spec-paper)}.blog-prose th{background:var(--spec-soft);color:var(--spec-ink);font-weight:700}@media (max-width:640px){.blog-post-title{font-size:30px}.blog-main{padding-top:44px;padding-bottom:72px}.blog-index-head{margin-bottom:40px}.blog-index-meta{margin-bottom:28px}.blog-index-lede{font-size:16px}}@media (max-width:767px){.blog-nav a{min-height:44px;min-width:44px;justify-content:center}}@media (max-width:520px){.blog-header{padding:0 12px}.blog-header-inner{gap:8px;padding:0 6px 0 14px}.blog-logo .blog-divider,.blog-logo .blog-label{display:none}.blog-nav{gap:0}.blog-nav a{padding:0 8px}.blog-nav a.blog-nav-cta{margin-left:4px;padding:0 12px}}@media (max-width:380px){.blog-header{padding:0 10px}.blog-header-inner{padding-left:12px}.blog-logo img{height:22px}.blog-nav a{padding:0 6px}.blog-nav a.blog-nav-cta{margin-left:2px;padding:0 10px}.blog-nav a.blog-nav-cta svg{display:none}}