.code-diagram[data-astro-cid-rgjxrjow]{border:1px solid var(--line);background:color-mix(in srgb, var(--text) 4%, transparent);margin:1.8rem 0;padding:1rem}.code-diagram__host[data-astro-cid-rgjxrjow]{min-height:20rem;color:var(--text);place-items:center;display:grid}.code-diagram__host[data-astro-cid-rgjxrjow] .portfolio-architecture-canvas{--react-draw-accent:var(--accent,var(--text));--react-draw-background:transparent;--react-draw-edge:#a6a6ae;--react-draw-edge-width:1.5px;--react-draw-grid:color-mix(in srgb, var(--line) 55%, transparent);--react-draw-muted:var(--muted);--react-draw-node-background:var(--card,var(--bg));--react-draw-node-border:var(--line);--react-draw-node-color:var(--text);--react-draw-radius:12px;border:0;border-radius:0;width:100%;font-family:inherit}.code-diagram__host[data-astro-cid-rgjxrjow] .react-draw__default-node{white-space:pre-line;box-shadow:none;padding:10px 12px;font-family:inherit;font-size:12px;font-weight:600}.code-diagram__host[data-astro-cid-rgjxrjow] .portfolio-diagram-card{box-sizing:border-box;color:#18181b;text-align:center;background:#f1f1f3;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;width:clamp(190px,62vw,260px);min-height:102px;padding:18px 22px;display:flex}.code-diagram__host[data-astro-cid-rgjxrjow] .portfolio-diagram-card span{letter-spacing:.05em;margin-bottom:8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:11px;color:#71717a!important}.code-diagram__host[data-astro-cid-rgjxrjow] .portfolio-diagram-card strong{font-size:20px;line-height:1.1;color:#18181b!important}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--client .portfolio-diagram-card{color:#fff;background:#19191c}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--client .portfolio-diagram-card span{color:#c9c9cf!important}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--client .portfolio-diagram-card strong{color:#fff!important}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--cloudflare .portfolio-diagram-card,.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--oci .portfolio-diagram-card{color:#3f5d88;background:#e8eef9}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--cloudflare .portfolio-diagram-card strong,.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--oci .portfolio-diagram-card strong{color:#3f5d88!important}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--envoy .portfolio-diagram-card{color:#4f5584;background:#ecebf7}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--envoy .portfolio-diagram-card strong{color:#4f5584!important}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--service .portfolio-diagram-card{background:#f0f0f3}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--pod .portfolio-diagram-card{color:#756248;background:#f7ead2}.code-diagram__host[data-astro-cid-rgjxrjow] .diagram-node--pod .portfolio-diagram-card strong{color:#756248!important}.code-diagram__note[data-astro-cid-rgjxrjow]{color:var(--muted);text-align:center;margin:.8rem 0 0!important;font-size:.62rem!important;line-height:1.5!important}@media (width<=560px){.code-diagram[data-astro-cid-rgjxrjow]{margin-left:-.25rem;margin-right:-.25rem;padding:.8rem}.code-diagram__host[data-astro-cid-rgjxrjow]{place-items:start;min-height:34rem}}.spek-button{color:var(--text);font:inherit;letter-spacing:.08em;text-transform:uppercase;text-decoration:underline;text-decoration-color:color-mix(in srgb, currentColor 35%, transparent);text-underline-offset:.25em;cursor:pointer;background:0 0;border:0;align-items:center;gap:.4rem;padding:.42rem .66rem;font-size:.6rem;font-weight:700;line-height:1;transition:color .18s,background .18s;display:inline-flex}.spek-button:hover,.spek-button:focus-visible{color:var(--bg,var(--deep,#0c1210));background:var(--accent,var(--acid,var(--aqua)))}.spek-button[aria-busy=true]{opacity:.65;cursor:wait}.spek-auto-actions{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.spek-auto-actions--header{margin-top:1.25rem}.spek-auto-actions--end{margin-top:1rem}.post-body h2,.post-body h3{scroll-margin-top:2rem}.section-link-button{color:currentColor;width:1em;height:1em;font:inherit;vertical-align:-.08em;opacity:.45;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin-left:.35em;padding:0;line-height:1;transition:opacity .18s,color .18s;display:inline-flex}.section-link-button svg{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round;width:68%;height:68%}.section-link-button:hover,.section-link-button:focus-visible{opacity:1}.section-link-button:focus-visible{outline-offset:.16em;outline:2px solid}.section-link-button[data-copied=true]{color:var(--accent,var(--acid,var(--aqua,currentColor)));opacity:1}.article-toc:not([data-toc-ready=true]){display:none}.article-toc__panel{color:var(--text);background:var(--portfolio-blog-glass-background,color-mix(in srgb, var(--bg,var(--deep,#0c1210)) 94%, transparent));backdrop-filter:none}.article-toc__panel>p{color:var(--text);letter-spacing:.08em;text-transform:uppercase;margin:0 0 .8rem;font-size:.64rem;font-weight:700}.article-toc ol{gap:.55rem;margin:0;padding:0;list-style:none;display:grid}.article-toc .article-toc__sublist{gap:.4rem;margin:.5rem 0 0 .7rem}.article-toc a{color:var(--muted);font-size:.7rem;line-height:1.35;text-decoration:none;transition:color .18s,transform .18s;display:block}.article-toc a:hover,.article-toc a:focus-visible,.article-toc a[aria-current=location]{color:var(--text)}.article-toc a[aria-current=location]{font-weight:700;transform:translate(.2rem)}.article-toc [data-toc-level="3"]>a{font-size:.64rem}.article-toc .article-toc__panel a,.article-toc .article-toc__panel [data-toc-level="3"]>a{font-size:1rem!important}.article-toc__chevron{border-top:2px solid;border-left:2px solid;flex:none;width:.52rem;height:.52rem;transition:transform .18s;transform:translateY(.12rem)rotate(45deg)}.article-toc[data-open=true] .article-toc__chevron{transform:translateY(-.12rem)rotate(225deg)}@media (width>=1200px){.article-toc{top:auto;right:auto;bottom:var(--article-toc-bottom,1.5rem);left:var(--article-toc-left,calc(50% + 414px));z-index:40;width:min(260px, calc(100vw - var(--article-toc-left,calc(50% + 414px)) - 1.5rem));min-width:0;position:fixed}.article-toc__toggle{width:100%;min-height:2.75rem;color:var(--text);background:var(--portfolio-blog-glass-background,var(--bg,var(--deep,#0c1210)));backdrop-filter:none;font:inherit;letter-spacing:.08em;text-align:left;text-transform:uppercase;cursor:pointer;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:.75rem;padding:.7rem .8rem;font-size:.64rem;font-weight:700;display:grid}.article-toc__current{display:none}.article-toc__panel{background:var(--portfolio-blog-glass-background,var(--bg,var(--deep,#0c1210)));backdrop-filter:none;scrollbar-width:none;width:100%;max-height:min(70svh,36rem);box-shadow:none;border:0;padding:1rem;display:none;position:absolute;bottom:calc(100% + .5rem);left:0;right:0;overflow-y:auto}.article-toc[data-open=true] .article-toc__panel{display:block}.article-toc__panel>p{display:none}.article-toc__panel::-webkit-scrollbar{display:none}}@media (width>=901px) and (width<=1199px){body[data-page=blog-article] .content-frame__content{padding-bottom:6rem}.article-toc{right:max(1rem, env(safe-area-inset-right));bottom:max(1rem, env(safe-area-inset-bottom));left:max(1rem, env(safe-area-inset-left));z-index:40;width:auto;max-width:none;position:fixed}.article-toc__toggle{width:100%;min-height:2.65rem;color:var(--text);background:var(--portfolio-blog-glass-background,var(--bg,var(--deep,#0c1210)));backdrop-filter:none;font:inherit;cursor:pointer;border:0;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:.75rem;padding:.7rem .9rem;font-size:.68rem;font-weight:700;display:grid}.article-toc__current{opacity:.72;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:500;overflow:hidden}.article-toc__panel{background:var(--portfolio-blog-glass-background,var(--bg,var(--deep,#0c1210)));width:100%;max-height:min(65svh,32rem);box-shadow:none;border:0;padding:1rem;display:none;position:absolute;bottom:calc(100% + .55rem);left:0;right:0;overflow-y:auto}.article-toc[data-open=true] .article-toc__panel{display:block}.article-toc a{padding:.15rem 0;font-size:.78rem}.article-toc [data-toc-level="3"]>a{font-size:.72rem}}@media (width<=900px){body[data-page=blog-article] .content-frame__content{padding-bottom:max(1.5rem, env(safe-area-inset-bottom))}.spek-button{font-size:.72rem}.article-toc{display:none!important}}@media (prefers-reduced-motion:reduce){.section-link-button,.article-toc a,.article-toc__chevron{transition:none}}.seven-tv-widget .portfolio-seven-tv{border:1px solid var(--line);background:color-mix(in srgb, var(--text) 4%, transparent);gap:.5rem;margin:1.7rem 0;padding:1rem 1.1rem;display:grid}.seven-tv-widget .portfolio-seven-tv__message{color:var(--text);margin:0}.seven-tv-widget .portfolio-seven-tv small{color:var(--muted);font-size:.65rem}.seven-tv-widget [data-7tv-emote]{max-width:none}:root{--react-draw-background:#f8fafc;--react-draw-grid:#dbe3ee;--react-draw-node-background:#fff;--react-draw-node-border:#94a3b8;--react-draw-node-color:#0f172a;--react-draw-accent:#2563eb;--react-draw-edge:#64748b;--react-draw-edge-width:2px;--react-draw-muted:#475569;--react-draw-radius:12px}.react-draw{min-width:0;color:var(--react-draw-node-color);background-color:var(--react-draw-background);background-image:radial-gradient(var(--react-draw-grid) .75px, transparent .75px);border:1px solid var(--react-draw-grid);background-size:16px 16px;border-radius:12px;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;position:relative;overflow:hidden}.react-draw__canvas{touch-action:none;user-select:none;display:block}.react-draw__node{cursor:pointer;outline:none;transition:transform .28s cubic-bezier(.2,.8,.2,1),opacity .16s}.react-draw__node--dragging{cursor:grabbing;transition:none}.react-draw__node--spawn,.react-draw__edge-spawn{animation:react-draw-spawn-fade var(--react-draw-spawn-duration) ease-out both;animation-delay:var(--react-draw-spawn-delay)}.react-draw__node--spawn-scale>foreignObject{transform-box:fill-box;transform-origin:50%;animation:react-draw-spawn-scale var(--react-draw-spawn-duration) cubic-bezier(.22, 1, .36, 1) both;animation-delay:var(--react-draw-spawn-delay)}.react-draw__node--spawn-slide-up>foreignObject{transform-box:fill-box;animation:react-draw-spawn-slide-up var(--react-draw-spawn-duration) cubic-bezier(.22, 1, .36, 1) both;animation-delay:var(--react-draw-spawn-delay)}.react-draw__node--disabled{cursor:default;opacity:.5}.react-draw__node-content{box-sizing:border-box;display:inline-block;overflow:visible}.react-draw__default-node{box-sizing:border-box;width:100%;min-width:120px;height:100%;min-height:48px;color:var(--react-draw-node-color);text-align:center;background:var(--react-draw-node-background);border:1.5px solid var(--react-draw-node-border);border-radius:var(--react-draw-radius);justify-content:center;align-items:center;padding:14px 20px;font-size:14px;font-weight:650;line-height:1.25;display:flex;box-shadow:0 1px 2px #0f172a14,0 8px 24px #0f172a0f}.react-draw__node--auto-size .react-draw__default-node{width:max-content;height:auto}.react-draw__node--rectangle .react-draw__default-node{border-radius:0}.react-draw__node--ellipse .react-draw__default-node{border-radius:999px}.react-draw__node--selected .react-draw__default-node,.react-draw__node:focus-visible .react-draw__default-node{border-color:var(--react-draw-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--react-draw-accent) 18%, transparent)}.react-draw__port{fill:var(--react-draw-node-background);stroke:var(--react-draw-accent);stroke-width:2px}.react-draw__edge{fill:none;stroke:var(--react-draw-edge);stroke-linecap:round;stroke-linejoin:round;stroke-width:var(--react-draw-edge-width);vector-effect:non-scaling-stroke}.react-draw__edge-hit-area{fill:none;stroke:#0000;stroke-width:14px;cursor:pointer;vector-effect:non-scaling-stroke}.react-draw__edge--selected{stroke:var(--react-draw-accent);stroke-width:calc(var(--react-draw-edge-width) + 1px)}.react-draw__edge--disabled{opacity:.4}.react-draw__edge-label{fill:var(--react-draw-muted);stroke:var(--react-draw-background);stroke-width:5px;paint-order:stroke;font-size:12px;font-weight:600}.react-draw__arrow{fill:var(--react-draw-edge);stroke:none}.react-draw__edge--draw{stroke-dasharray:1;animation:.5s ease-out both react-draw-path}.react-draw__edge--flow{stroke-dasharray:8 6;animation:.8s linear infinite react-draw-flow}.react-draw__edge--pulse{animation:1.4s ease-in-out infinite react-draw-pulse}.react-draw__error{z-index:2;color:#991b1b;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;max-width:min(420px,100% - 24px);padding:10px 12px;font-size:13px;position:absolute;bottom:12px;right:12px}@keyframes react-draw-path{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}@keyframes react-draw-flow{to{stroke-dashoffset:-14px}}@keyframes react-draw-pulse{50%{opacity:.35}}@keyframes react-draw-spawn-fade{0%{opacity:0;visibility:hidden}to{opacity:1;visibility:visible}}@keyframes react-draw-spawn-scale{0%{transform:scale(.72)}to{transform:scale(1)}}@keyframes react-draw-spawn-slide-up{0%{transform:translateY(18px)}to{transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.react-draw__node,.react-draw__edge,.react-draw__edge-spawn,.react-draw__node--spawn>foreignObject{transition:none;animation:none}}.portfolio-code-block{border:1px solid var(--line);background:color-mix(in srgb, var(--text) 4%, var(--bg));margin:1.75rem 0;overflow:hidden}.portfolio-code-block figcaption{border-bottom:1px solid var(--line);letter-spacing:.08em;text-transform:uppercase;padding:.55rem .85rem;font-weight:600;color:var(--muted)!important;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace!important;font-size:.68rem!important}.portfolio-code-block .portfolio-editor-code{tab-size:2;background:0 0;margin:0;padding:1rem}.portfolio-code-block code,.portfolio-code-block .token{color:var(--code-text,#24292f)!important}.portfolio-code-block .token.comment,.portfolio-code-block .token.prolog,.portfolio-code-block .token.doctype,.portfolio-code-block .token.cdata{font-style:italic;color:var(--code-comment,#6e7781)!important}.portfolio-code-block .token.punctuation{color:var(--code-punctuation,#57606a)!important}.portfolio-code-block .token.property,.portfolio-code-block .token.tag,.portfolio-code-block .token.boolean,.portfolio-code-block .token.number,.portfolio-code-block .token.constant,.portfolio-code-block .token.symbol,.portfolio-code-block .token.deleted{color:var(--code-red,#cf222e)!important}.portfolio-code-block .token.selector,.portfolio-code-block .token.attr-name,.portfolio-code-block .token.string,.portfolio-code-block .token.char,.portfolio-code-block .token.builtin,.portfolio-code-block .token.inserted{color:var(--code-green,#116329)!important}.portfolio-code-block .token.operator,.portfolio-code-block .token.entity,.portfolio-code-block .token.url,.portfolio-code-block .language-css .token.string,.portfolio-code-block .style .token.string{color:var(--code-cyan,#0550ae)!important}.portfolio-code-block .token.atrule,.portfolio-code-block .token.attr-value,.portfolio-code-block .token.keyword{color:var(--code-purple,#8250df)!important}.portfolio-code-block .token.function,.portfolio-code-block .token.class-name{color:var(--code-blue,#0550ae)!important}.portfolio-code-block .token.regex,.portfolio-code-block .token.important,.portfolio-code-block .token.variable{color:var(--code-orange,#953800)!important}html[data-theme=dark] .portfolio-code-block{--code-text:#e6edf3;--code-comment:#8b949e;--code-punctuation:#c9d1d9;--code-red:#ff7b72;--code-green:#7ee787;--code-cyan:#a5d6ff;--code-purple:#d2a8ff;--code-blue:#79c0ff;--code-orange:#ffa657}@media (prefers-color-scheme:dark){html:not([data-theme]) .portfolio-code-block{--code-text:#e6edf3;--code-comment:#8b949e;--code-punctuation:#c9d1d9;--code-red:#ff7b72;--code-green:#7ee787;--code-cyan:#a5d6ff;--code-purple:#d2a8ff;--code-blue:#79c0ff;--code-orange:#ffa657}}.blog-dev-edit{top:max(1rem, env(safe-area-inset-top));right:max(1rem, env(safe-area-inset-right));z-index:100;border:1px solid color-mix(in srgb, var(--text) 20%, transparent);background:var(--bg,#fff);color:var(--text,#111);border-radius:999px;align-items:center;gap:.45rem;padding:.65rem .9rem;font-size:.85rem;line-height:1;text-decoration:none;display:inline-flex;position:fixed;box-shadow:0 2px 10px #00000014}.blog-dev-edit:hover{border-color:currentColor}.blog-dev-edit:focus-visible{outline-offset:3px;outline:2px solid}body[data-portfolio-editor=active] .blog-dev-edit{display:none}body[data-portfolio-editor=active] main#main{padding-inline:0}[data-article-view-only][hidden],body[data-portfolio-editor=active] .article-toc{display:none!important}.post{width:100%;margin:0 auto;padding-bottom:2rem}.post--editing{padding-bottom:0}.post--editing>.post-header{display:none}.post-header{width:100%;margin-inline:0;padding-bottom:0}body main#main .post-title{letter-spacing:-.035em;text-wrap:initial;text-wrap-mode:wrap;text-wrap-style:auto;width:100%;max-width:none;margin:0;font-size:clamp(1.45rem,3vw,2.15rem);line-height:1.1}.standfirst{max-width:none;color:var(--muted);margin:.8rem 0 0;font-size:.88rem;line-height:1.6}.post-meta{color:var(--muted);font-family:var(--font);letter-spacing:0;text-transform:none;flex-wrap:wrap;align-items:center;gap:.7rem 1.5rem;margin-top:1rem;font-size:1rem;line-height:1.4;display:flex}.post-meta time,.post-header .spek-button{font-family:var(--font);font-size:1rem!important}.post-header .spek-button{border-bottom:1px solid color-mix(in srgb, currentColor 35%, transparent);letter-spacing:0;text-transform:none;gap:.65rem;padding:.2rem 0 .15rem;font-weight:600;text-decoration:none}.post-body{padding-top:0}.post-body:not(.post-body--editing) [data-article-view]>section{padding:clamp(.65rem,1.5vh,1rem) 0}.post-body:not(.post-body--editing) [data-article-view]>section:first-child{padding-top:clamp(2rem,5vw,3rem)}.post-body:not(.post-body--editing) [data-article-view]>section>:first-child{margin-top:0}.post-body:not(.post-body--editing) [data-article-view]>section>:last-child{margin-bottom:0}.post-body:not(.post-body--editing) [data-article-view]>section:has([data-rich-text-renderer]):has(+section .portfolio-code-block){padding-bottom:0}.post-body:not(.post-body--editing) [data-article-view]>section:has([data-rich-text-renderer])+section:has(.portfolio-code-block){padding-top:0}.post-body h2{letter-spacing:-.025em;max-width:none;margin:0 0 .9rem;font-size:clamp(1.25rem,2.5vw,1.6rem);font-weight:500;line-height:1.15}.post-body :is(h1,h2){margin-block:clamp(2rem,5vw,3rem) .9rem}.post-body:not(.post-body--editing) [data-rich-text-renderer]>:is(h1,h2,h3):empty,.post-body:not(.post-body--editing) [data-rich-text-renderer]>:is(h1,h2,h3):has(>br:only-child){display:none}.post-body [data-rich-text-renderer]>:is(h1,h2):first-child{margin-top:0}.post-body h3{letter-spacing:-.015em;max-width:none;margin:1.8rem 0 .75rem;font-size:clamp(1rem,2vw,1.2rem);font-weight:600;line-height:1.25}.post-body p{color:var(--muted);margin:0;font-size:clamp(.88rem,1.4vw,1rem);line-height:1.78}.post-body p+p{margin-top:1.25rem}code{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.86em}p code{color:var(--text);background:color-mix(in srgb, var(--text) 5%, transparent);padding:.12em .32em}pre{color:var(--text);background:color-mix(in srgb, var(--text) 5%, transparent);margin:1.5rem 0;padding:1.2rem;font-size:.75rem;line-height:1.65;overflow-x:auto}pre code{font-size:inherit}.callout{background:color-mix(in srgb, var(--text) 4%, transparent);margin:1.7rem 0 0;padding:1rem 1.1rem}.callout span{color:var(--text);letter-spacing:.1em;text-transform:uppercase;margin-bottom:.35rem;font-size:.62rem;font-weight:600;display:block}.callout p{font-size:.86rem}.post-body section>h2,.post-body section>h3,.post-body section>p,.post-body section>pre,.post-body section>.callout{width:100%;margin-left:0;margin-right:0}.post-footer{padding-top:clamp(2.5rem,6vw,4rem)}.post-footer hr{border:0;border-top:1px solid color-mix(in srgb, var(--text) 22%, transparent);margin:0}.post-footer p{color:var(--muted);margin:1.25rem 0 0;font-size:clamp(.88rem,1.4vw,1rem);line-height:1.6}.post-footer__heart{color:#d64b4b}@media (width<=900px){body[data-portfolio-editor=active] .content-frame__viewport,body[data-portfolio-editor=active] .content-frame__content{padding-top:0}}@media (width<=620px){.post{padding-bottom:1rem}.post-header{padding-bottom:0}body main#main .post-title{font-size:clamp(1.55rem,8vw,1.9rem)}.standfirst{font-size:.9rem;line-height:1.65}.post-meta{line-height:1.45}.post-body:not(.post-body--editing) [data-article-view]>section{padding:1.6rem 0}.post-body:not(.post-body--editing) [data-article-view]>section:first-child{padding-top:2rem}.post-body h2{text-wrap:pretty;font-size:clamp(1.25rem,6.5vw,1.5rem)}.post-body p{font-size:.9rem;line-height:1.72}pre{margin-left:-.25rem;margin-right:-.25rem;padding:1rem .8rem;font-size:.67rem}.callout span{font-size:.7rem}}
