:root{color-scheme:light;--bg: oklch(97.7% .006 85);--fg: oklch(24% .016 252);--fg-muted: oklch(49% .016 250);--fg-subtle: oklch(72% .01 250);--accent: oklch(52% .22 265);--accent-soft: oklch(95% .04 265);--support: oklch(47% .11 265);--support-soft: oklch(95% .025 265);--support-border: oklch(86% .05 265);--border: oklch(89% .008 85);--code-bg: oklch(95% .01 82);--font-sans: "Outfit", system-ui, -apple-system, sans-serif;--font-serif: "IBM Plex Serif", "Iowan Old Style", "Baskerville", "STSong", serif;--font-display: "IBM Plex Serif", "Georgia", "STSong", serif;--font-mono: "JetBrains Mono", "Fira Code", "Courier New", monospace;--text-xs: .75rem;--text-sm: .875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 1.875rem;--content-width: 700px;--media-width: 980px;--caption-pad: .75rem;--media-max-height: min(560px, 65vh);--max-width: var(--media-width);--ease-out-quart: cubic-bezier(.25, 1, .5, 1);--ease-out-expo: cubic-bezier(.16, 1, .3, 1);--duration-fast: .16s;--duration-medium: .36s}html.dark{color-scheme:dark;--bg: oklch(18.5% .01 252);--fg: oklch(95% .007 88);--fg-muted: oklch(77% .012 88);--fg-subtle: oklch(56% .01 88);--accent: oklch(68% .16 222);--accent-soft: oklch(27% .07 258);--support: oklch(63% .09 240);--support-soft: oklch(25% .04 255);--support-border: oklch(37% .06 252);--border: oklch(29% .01 250);--code-bg: oklch(25% .01 250)}*,*:before,*:after{box-sizing:border-box}html{font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body{background-color:var(--bg)}:focus:not(:focus-visible){outline:none}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}body{font-family:var(--font-sans);font-size:var(--text-base);line-height:1.75;background-color:var(--bg);color:var(--fg);margin:0;transition:background-color .15s,color .15s}body:before{content:"";position:fixed;inset:0;pointer-events:none;z-index:-1;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.22'/%3E%3C/svg%3E");background-size:300px 300px;mix-blend-mode:overlay;opacity:.28}html.dark body:before{opacity:.12}.site-wrap{width:min(100%,var(--media-width));margin:0 auto;padding:0 1.25rem;position:relative}h1,h2,h3,h4,h5,h6{font-family:var(--font-sans);font-weight:600;letter-spacing:0;line-height:1.25;color:var(--fg);margin-top:2rem;margin-bottom:1rem}h1{font-size:var(--text-3xl);font-weight:700}h2{font-size:var(--text-2xl)}h3{font-size:var(--text-xl)}h4,h5,h6{font-size:var(--text-lg)}p{margin-top:0;margin-bottom:1rem}a{color:inherit;text-decoration:none}img{max-width:100%;height:auto}.prose{max-width:var(--content-width);margin:0 auto;font-size:var(--text-base);line-height:1.85;overflow-wrap:anywhere;hanging-punctuation:allow-end;text-align:justify;text-spacing-trim:trim-start}.prose p{margin-bottom:1.85rem}.prose a{color:var(--accent);text-decoration:none;background-image:linear-gradient(currentColor,currentColor);background-position:50% 100%;background-repeat:no-repeat;background-size:0% 1.5px;transition:background-size .3s var(--ease-out-quart)}.prose a:hover{background-size:100% 1.5px}.prose strong{font-weight:600}.prose em{font-style:italic}.prose blockquote{position:relative;margin:2rem 0;padding:.875rem 1.5rem;color:var(--fg-muted);background:color-mix(in oklab,var(--support-soft) 16%,transparent);border-radius:.5rem}.prose blockquote:before{content:"“";position:absolute;top:.2rem;left:.6rem;font-family:var(--font-serif);font-size:1.75rem;line-height:1;color:color-mix(in oklab,var(--support) 45%,transparent);pointer-events:none}.prose blockquote>:last-child{margin-bottom:0}.prose h2{font-size:var(--text-2xl);margin-top:3.5rem;margin-bottom:1.25rem;color:color-mix(in oklab,var(--accent) 72%,var(--fg));overflow-wrap:anywhere}.prose h3{font-size:var(--text-xl);margin-top:2.5rem;margin-bottom:1rem;color:color-mix(in oklab,var(--support) 65%,var(--fg));overflow-wrap:anywhere}.prose h4{font-size:var(--text-lg);margin-top:2rem;margin-bottom:.75rem}.prose img,.prose picture{display:block;max-width:100%;height:auto}.prose img{border-radius:4px}.prose picture img{width:100%}.prose>img,.prose>picture{margin:2rem auto}.media-figure{position:relative;max-width:min(var(--content-width),calc(100vw - 2.5rem));min-width:min(160px,100%);margin:2.5rem auto 2.75rem}.media-figure:not(.livephoto){width:fit-content}.media-figure.livephoto{width:100%}.media-figure img,.media-figure picture,.media-figure video{min-width:0;max-width:100%}.media-figure picture{display:block}.media-figure img{max-height:var(--media-max-height);width:auto;height:auto;min-width:80px;margin:0 auto;display:block;background:var(--code-bg);opacity:1;transition:opacity .6s var(--ease-out-quart)}.media-figure img[data-astro-image]{opacity:.65}.media-figure img[data-astro-image].is-loaded{opacity:1}.media-figure figcaption{position:absolute;top:var(--caption-pad);left:var(--caption-pad);max-width:calc(100% - var(--caption-pad) * 2);padding:.35rem .65rem;color:var(--bg);font-family:var(--font-sans);font-size:var(--text-xs);line-height:1.45;border-radius:6px;overflow-wrap:anywhere;z-index:1;background:color-mix(in oklab,var(--fg) 72%,transparent);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);border:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background-color .2s ease}.media-figure figcaption:hover{background:color-mix(in oklab,var(--fg) 85%,transparent)}.media-figure.livephoto{overflow:visible;background:transparent}.livephoto-frame{position:relative;min-width:0;overflow:hidden;border-radius:4px;background:var(--code-bg)}.livephoto-frame picture,.livephoto-frame picture img,.livephoto-frame .livephoto-video{display:block;width:100%;height:100%;object-fit:cover}.media-figure.livephoto .livephoto-video{max-width:100%}.prose ul,.prose ol{padding-left:1.5rem;margin-bottom:1.5rem}.prose li{margin-bottom:.375rem}.prose li>ul,.prose li>ol{margin-top:.375rem;margin-bottom:0}.prose hr{border:none;border-top:1px solid var(--border);margin:3rem 0}.prose pre{background:var(--code-bg);border:1px solid var(--border);border-radius:6px;padding:1rem;overflow-x:auto;max-width:100%;margin-bottom:1.5rem;font-family:var(--font-mono);font-size:var(--text-sm);line-height:1.6}.prose code{font-family:var(--font-mono);font-size:.875em;background:var(--code-bg);border:1px solid var(--border);padding:.125em .375em;border-radius:3px}.prose pre code{background:none;border:none;padding:0;font-size:inherit;max-width:100%}.prose table{width:100%;max-width:100%;border-collapse:collapse;margin-bottom:1.5rem;font-size:var(--text-sm);display:block;overflow-x:auto}.prose th{border-bottom:1px solid var(--border);padding:.5rem .75rem;text-align:left;font-weight:600}.prose td{border-bottom:1px solid var(--border);padding:.5rem .75rem}#reading-progress{position:fixed;top:0;left:0;width:100%;height:2px;background:var(--accent);transform:scaleX(0);transform-origin:left;z-index:100;will-change:transform}.code-wrapper{position:relative}.copy-btn{position:absolute;top:.5rem;right:.5rem;padding:.25rem;background:transparent;border:1px solid var(--border);border-radius:4px;color:var(--fg-subtle);cursor:pointer;opacity:0;transition:opacity .15s,color .15s,background-color .15s;display:flex;align-items:center;justify-content:center;line-height:1;transform:translateY(-2px);transition:opacity var(--duration-fast) ease,color var(--duration-fast) ease,background-color var(--duration-fast) ease,transform var(--duration-fast) ease}.code-wrapper:hover .copy-btn{opacity:1;transform:translateY(0)}.copy-btn:hover{color:var(--fg);background-color:color-mix(in oklab,var(--support-soft) 72%,var(--border))}.copy-btn:after{content:attr(data-copied-label);position:absolute;right:calc(100% + .45rem);top:50%;transform:translateY(-50%) translate(4px);opacity:0;color:var(--accent);font-size:var(--text-xs);font-family:var(--font-mono);white-space:nowrap;pointer-events:none;transition:opacity var(--duration-fast) ease,transform var(--duration-fast) ease}.copy-btn.copied{color:var(--accent);opacity:1;transform:translateY(0)}.copy-btn.copied:after{opacity:1;transform:translateY(-50%) translate(0)}.prose a[href^=http]:not([href*="blog.rosuh.me"]):not(:has(>img)):after{content:"↗";font-size:.65em;margin-left:.15em;opacity:.55;vertical-align:super;line-height:1;white-space:nowrap}.katex-display{border:1px solid var(--border);overflow:auto hidden;padding:1rem;border-radius:4px;margin-bottom:1.5rem}.toc-aside{position:fixed;top:6rem;left:calc(50% + var(--content-width) / 2 + 2rem);width:180px;max-height:calc(100vh - 8rem);overflow-y:auto;padding:.5rem 0;display:none;font-size:var(--text-xs);line-height:1.5;z-index:50}@media(min-width:1180px){.toc-aside{display:block}}.toc-title{font-weight:600;font-size:var(--text-xs);color:var(--fg-muted);margin-bottom:.5rem;padding:0 .5rem;text-transform:uppercase;letter-spacing:.05em}.toc-list{list-style:none;padding:0;margin:0}.toc-item{margin:0}.toc-item--h3{padding-left:.75rem}.toc-link{display:block;padding:.25rem .5rem;color:var(--fg-muted);text-decoration:none;border-radius:4px;transition:color .15s,background-color .15s}.toc-link:hover{color:var(--fg);background:color-mix(in oklab,var(--bg) 50%,transparent)}.toc-link.is-active{color:var(--accent);background:color-mix(in oklab,var(--accent-soft) 40%,transparent);font-weight:500}.toc-trigger{position:fixed;left:1rem;bottom:1rem;z-index:120;display:none;align-items:center;gap:.4rem;padding:.55rem .95rem;font-family:var(--font-sans);font-size:.8rem;font-weight:500;color:var(--bg);background:color-mix(in oklab,var(--fg) 80%,transparent);backdrop-filter:blur(16px) saturate(140%);-webkit-backdrop-filter:blur(16px) saturate(140%);border:none;border-radius:9999px;cursor:pointer;box-shadow:0 4px 20px -4px color-mix(in oklab,var(--fg) 30%,transparent);transition:transform .2s var(--ease-out-quart),background-color .2s ease}.toc-trigger:hover{transform:scale(1.05);background:color-mix(in oklab,var(--fg) 92%,transparent)}.toc-trigger:active{transform:scale(.96)}.toc-mobile{position:fixed;inset:0;z-index:130;display:flex;justify-content:flex-end;opacity:0;pointer-events:none;transition:opacity .25s ease}.toc-mobile.is-open{opacity:1;pointer-events:auto}.toc-mobile__backdrop{position:absolute;inset:0;background:color-mix(in oklab,var(--fg) 35%,transparent);backdrop-filter:blur(2px) saturate(120%);-webkit-backdrop-filter:blur(2px) saturate(120%);cursor:pointer}.toc-mobile__panel{position:relative;width:280px;max-width:80vw;height:100%;background:var(--bg);border-left:1px solid var(--border);padding:1.25rem 1.25rem 1.5rem;transform:translate(100%);transition:transform .35s var(--ease-out-expo);overflow-y:auto;-webkit-overflow-scrolling:touch}.toc-mobile.is-open .toc-mobile__panel{transform:translate(0)}.toc-mobile__close{position:absolute;top:.85rem;right:.85rem;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;color:var(--fg-muted);background:none;border:none;border-radius:8px;cursor:pointer;transition:color .15s ease,background-color .15s ease}.toc-mobile__close:hover{color:var(--fg);background:var(--code-bg)}@media(max-width:1179px){.toc-trigger{display:flex}}@media(min-width:1180px){.toc-mobile{display:none!important}}@media(hover:hover){.media-figure:not(.livephoto):after{content:"⤢";position:absolute;bottom:.75rem;right:.75rem;width:1.75rem;height:1.75rem;display:flex;align-items:center;justify-content:center;font-size:.9rem;color:var(--bg);background:color-mix(in oklab,var(--fg) 55%,transparent);border-radius:6px;opacity:0;transition:opacity .2s ease;pointer-events:none;z-index:2}.media-figure:not(.livephoto):hover:after{opacity:1}}@media(hover:none){.media-figure:not(.livephoto):after{content:"⤢";position:absolute;bottom:.75rem;right:.75rem;width:1.75rem;height:1.75rem;display:flex;align-items:center;justify-content:center;font-size:.9rem;color:var(--bg);background:color-mix(in oklab,var(--fg) 40%,transparent);border-radius:6px;opacity:.55;pointer-events:none;z-index:2}}html.dark .media-figure figcaption{background:color-mix(in oklab,var(--fg) 85%,transparent);backdrop-filter:none;-webkit-backdrop-filter:none}.back-to-top{position:fixed;right:1rem;bottom:1rem;z-index:120;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;padding:0;color:var(--bg);background:color-mix(in oklab,var(--fg) 80%,transparent);backdrop-filter:blur(16px) saturate(140%);-webkit-backdrop-filter:blur(16px) saturate(140%);border:none;border-radius:50%;cursor:pointer;opacity:0;transform:translateY(.5rem);pointer-events:none;box-shadow:0 4px 20px -4px color-mix(in oklab,var(--fg) 30%,transparent);transition:opacity .25s ease,transform .25s var(--ease-out-quart),background-color .2s ease}.back-to-top.is-visible{opacity:1;transform:translateY(0);pointer-events:auto}.back-to-top:hover{background:color-mix(in oklab,var(--fg) 92%,transparent)}.back-to-top:active{transform:scale(.92)}@media(max-width:640px){.prose h2{font-size:var(--text-lg)}.prose h3{font-size:var(--text-base)}.toc-trigger,.back-to-top{backdrop-filter:none;-webkit-backdrop-filter:none}.media-figure:not(.livephoto){width:auto;max-width:calc(100vw - 2.5rem);margin:2rem auto 2.25rem}.media-figure.livephoto{width:100%;max-width:calc(100vw - 2.5rem);margin:2rem auto 2.25rem}.media-figure{--media-max-height: min(480px, 58vh)}.media-figure figcaption{--caption-pad: .5rem;white-space:normal}}@media(prefers-reduced-motion:reduce){.copy-btn,.copy-btn:after{transition:none}}.theme-toggle[data-astro-cid-cn3pouft]{background:color-mix(in srgb,var(--bg) 88%,var(--accent) 12%);border:1px solid var(--border);cursor:pointer;padding:0;width:2.75rem;height:2.75rem;color:var(--fg-muted);display:flex;align-items:center;justify-content:center;transition:color .15s,border-color .15s,background-color .15s;border-radius:999px;overflow:hidden;position:relative}.theme-toggle[data-astro-cid-cn3pouft]:hover{color:var(--fg);border-color:color-mix(in srgb,var(--accent) 22%,var(--border))}.dark .theme-toggle[data-astro-cid-cn3pouft]{background:color-mix(in oklab,var(--bg) 91%,var(--support-soft) 9%);border-color:color-mix(in oklab,var(--support-border) 62%,var(--border));color:color-mix(in oklab,var(--support) 38%,var(--fg-muted))}.dark .theme-toggle[data-astro-cid-cn3pouft]:hover{color:var(--fg);border-color:color-mix(in oklab,var(--support) 22%,var(--border));background:color-mix(in oklab,var(--bg) 88%,var(--support-soft) 12%)}.theme-toggle[data-astro-cid-cn3pouft]:focus-visible{outline-offset:3px}.theme-toggle[data-astro-cid-cn3pouft]:after{content:"";position:absolute;inset:0;border-radius:inherit;background:color-mix(in srgb,var(--accent) 16%,transparent);opacity:0;transform:scale(.72);transition:opacity var(--duration-fast) ease,transform var(--duration-medium) var(--ease-out-quart)}.theme-toggle[data-astro-cid-cn3pouft].is-toggling:after{opacity:1;transform:scale(1.2)}.sun-icon[data-astro-cid-cn3pouft],.moon-icon[data-astro-cid-cn3pouft]{position:absolute;z-index:1;transition:opacity var(--duration-fast) ease,transform var(--duration-medium) var(--ease-out-quart)}.sun-icon[data-astro-cid-cn3pouft]{opacity:0;transform:rotate(-24deg) scale(.72)}.moon-icon[data-astro-cid-cn3pouft],.dark .sun-icon[data-astro-cid-cn3pouft]{opacity:1;transform:rotate(0) scale(1)}.dark .moon-icon[data-astro-cid-cn3pouft]{opacity:0;transform:rotate(24deg) scale(.72)}@media(prefers-reduced-motion:reduce){.theme-toggle[data-astro-cid-cn3pouft]:after,.sun-icon[data-astro-cid-cn3pouft],.moon-icon[data-astro-cid-cn3pouft]{transition:none}}#bamboo-shadow[data-astro-cid-ef6kjn6g]{position:fixed;top:0;right:0;width:65vw;height:100vh;pointer-events:none;z-index:1;overflow:visible;opacity:.9}.bamboo-moonlight[data-astro-cid-ef6kjn6g]{position:absolute;pointer-events:none;opacity:0;top:-5%;right:-5%;width:70vw;height:80vh;background:radial-gradient(ellipse 70% 50% at 100% 0%,rgba(230,245,255,.8) 0%,rgba(200,220,250,.4) 30%,rgba(165,195,230,.15) 60%,transparent 85%);mix-blend-mode:soft-light;filter:blur(60px);transform:translateZ(0)}#bamboo-svg[data-astro-cid-ef6kjn6g]{position:absolute;top:0;right:0;width:100%;height:100%;z-index:1;opacity:.18;mix-blend-mode:multiply;filter:blur(4px)}#bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article]{width:100vw}#bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.08;filter:blur(2px)}html.dark #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.06;mix-blend-mode:soft-light}html.dark .bamboo-moonlight[data-astro-cid-ef6kjn6g]{opacity:.55}html.dark #bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.038}html.dark #bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] .bamboo-moonlight[data-astro-cid-ef6kjn6g]{opacity:.4}@media(max-width:640px){#bamboo-shadow[data-astro-cid-ef6kjn6g]{width:85vw;opacity:.85}#bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article]{width:55vw}#bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.12;filter:blur(3px)}#bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.065}.bamboo-moonlight[data-astro-cid-ef6kjn6g]{width:80vw;height:70vh;filter:blur(40px)}html.dark #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.05}html.dark #bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] #bamboo-svg[data-astro-cid-ef6kjn6g]{opacity:.03}html.dark .bamboo-moonlight[data-astro-cid-ef6kjn6g]{opacity:.4}html.dark #bamboo-shadow[data-astro-cid-ef6kjn6g][data-page-kind=article] .bamboo-moonlight[data-astro-cid-ef6kjn6g]{opacity:.28}}@media(prefers-reduced-motion:reduce){#bamboo-svg[data-astro-cid-ef6kjn6g]{filter:blur(2px)}}.skip-link[data-astro-cid-sckkx6r4]{position:fixed;top:.75rem;left:50%;transform:translate(-50%,-150%);z-index:1000;padding:.5rem 1rem;background:var(--accent);color:#fff;font-family:var(--font-sans);font-size:var(--text-sm);text-decoration:none;border-radius:999px;transition:transform .18s ease}.skip-link[data-astro-cid-sckkx6r4]:focus,.skip-link[data-astro-cid-sckkx6r4]:focus-visible{transform:translate(-50%);outline:2px solid var(--fg);outline-offset:2px}.site-header[data-astro-cid-sckkx6r4]{padding:1.25rem 0 1rem;display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.site-logo[data-astro-cid-sckkx6r4]{font-size:var(--text-sm);font-weight:500;font-family:var(--font-display);color:var(--fg);letter-spacing:-.01em;transition:color .15s}.site-logo[data-astro-cid-sckkx6r4]:hover{color:var(--fg-muted)}.site-footer[data-astro-cid-sckkx6r4]{padding:2.5rem 0 2rem;color:var(--fg-subtle);font-size:var(--text-sm)}.site-footer[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4]{color:var(--fg-subtle);text-decoration:underline;text-decoration-color:var(--border);text-underline-offset:3px;transition:color .15s}.site-footer[data-astro-cid-sckkx6r4] a[data-astro-cid-sckkx6r4]:hover{color:var(--fg-muted)}.livephoto{position:relative;margin:0;overflow:hidden;border-radius:4px;background:var(--code-bg)}.livephoto picture,.livephoto picture img,.livephoto-video{display:block;width:100%;height:100%;object-fit:cover}.livephoto-video{position:absolute;inset:0;opacity:0;transition:opacity .18s ease-out;pointer-events:none}.livephoto[data-state=playing] picture{opacity:0;transition:opacity .18s ease-out}.livephoto[data-state=playing] .livephoto-video{opacity:1}.livephoto-badge{position:absolute;top:12px;left:12px;display:inline-flex;align-items:center;gap:6px;padding:4px 10px 4px 8px;border:0;border-radius:999px;background:#00000073;backdrop-filter:blur(8px) saturate(1.4);-webkit-backdrop-filter:blur(8px) saturate(1.4);color:#fff;font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;cursor:pointer;user-select:none}html.dark .livephoto-badge{background:#ffffff1f;color:var(--bg)}.livephoto-badge:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.livephoto[data-state=playing] .livephoto-dot{animation:livephoto-pulse 1.4s ease-in-out infinite}@keyframes livephoto-pulse{0%,to{opacity:1}50%{opacity:.3}}@media(prefers-reduced-motion:reduce){.livephoto[data-state=playing] picture,.livephoto-video{transition:none}.livephoto[data-state=playing] .livephoto-dot{animation:none}}
