.hardware-demo{--demo-corner: 0;grid-column:2;margin:clamp(20px,3vw,28px) 0 0}.hardware-demo-frame{position:relative;line-height:0;outline:none}.hardware-demo-frame:focus-visible{outline:3px solid var(--accent-blue);outline-offset:-3px}.hardware-demo-static{display:block;width:100%;height:100%;object-fit:cover}.hardware-demo-error{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-6);min-height:120px;padding:var(--space-16) var(--space-8);text-align:center;line-height:1.4}.hardware-demo-error-msg{margin:0;color:var(--ink-mute);font-family:var(--font-body);font-size:14px;line-height:1.7}.hardware-demo-error-action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;border:none;background:none;padding:0;color:var(--ink-soft);font-family:var(--font-body);font-size:14px;text-decoration:underline;text-underline-offset:3px;cursor:pointer;transition:color var(--dur-fast) var(--ease)}.hardware-demo-error-action:hover{color:var(--ink)}.hardware-demo-error-action:focus-visible{outline:2px solid var(--accent-blue);outline-offset:2px}.hardware-demo-skeleton{position:relative;display:flex;align-items:center;justify-content:center;width:100%;min-height:clamp(160px,30vw,240px);border:1px solid var(--rule);background:var(--bone);overflow:hidden}.hardware-demo-skeleton-label{position:relative;z-index:1;color:var(--ink-mute);font-family:var(--font-body);font-size:14px;line-height:1.7}.hardware-demo-error-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-6)}.hardware-demo--impedance .hardware-demo-frame{width:min(1056px,100%);aspect-ratio:132 / 68}.hardware-demo--heatmap .hardware-demo-frame{width:min(320px,100%);aspect-ratio:1}.hardware-demo--vehicle .hardware-demo-frame{min-height:clamp(280px,42vw,420px)}.hardware-demo--robot .hardware-demo-frame{min-height:0}.hardware-demo--keychain .hardware-demo-frame{min-height:clamp(220px,36vw,340px)}.hardware-demo--impedance .hardware-demo-skeleton{width:min(1056px,100%);min-height:0;aspect-ratio:132 / 68}.hardware-demo--companion .hardware-demo-skeleton{position:absolute;inset:0;min-height:0}.hardware-demo--heatmap .hardware-demo-skeleton{aspect-ratio:1;min-height:0;width:min(320px,100%)}.hardware-demo--vehicle .hardware-demo-skeleton{min-height:clamp(280px,42vw,420px)}.hardware-demo--robot .hardware-demo-skeleton{min-height:clamp(220px,32vw,360px)}.hardware-demo--keychain .hardware-demo-skeleton{min-height:clamp(220px,36vw,340px)}.hardware-demo--impedance{width:fit-content;max-width:100%}.hardware-demo--impedance canvas{display:block;width:min(1056px,100%);height:auto;aspect-ratio:132 / 68;background:#000;image-rendering:pixelated;image-rendering:crisp-edges;touch-action:none;cursor:pointer}.hardware-demo--companion{width:min(640px,100%);max-width:100%}.hardware-demo--companion .hardware-demo-frame{container-type:inline-size;width:100%;aspect-ratio:4 / 3;overflow:hidden}.hardware-demo--companion figcaption{box-sizing:border-box}.hardware-demo--companion .kirby-viewport{display:block;width:320px;height:240px;transform-origin:top left;transform:scale(calc(100cqw/320px));image-rendering:pixelated;image-rendering:crisp-edges}.hardware-demo :is(.hardware-demo-frame,.hardware-demo-skeleton,.hardware-demo-error,.rtos-canvas-wrap,.rtos-row,.rtos-stepper,.robot-canvas-wrap,.robot-log,.robot-btn,.keychain-stage,.keychain-press,.keychain-chip,.rtos-canvas-wrap canvas){border-radius:var(--demo-corner)}@media(prefers-reduced-motion:reduce){.kirby-viewport *,.kirby-slide-enter,.kirby-slide-exit{animation-duration:.01ms!important;transition-duration:.01ms!important}}.project-page .page-main{width:min(1440px,calc(100% - 104px));max-width:none;padding-top:72px}.project-page .project-hero{row-gap:0}.project-page .project-hero>.project-hero-intro{grid-column:1;grid-row:1;align-self:end;padding:0}.project-page .project-hero-media{grid-column:2;grid-row:1 / 3;align-self:center}.project-page .project-hero>.project-attribution{grid-column:1;grid-row:2;align-self:start;order:0}.project-index svg,.project-continuation svg,.project-source-links svg{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.project-page .project-hero h1{line-height:1.02;text-wrap:balance;max-width:17ch;margin-bottom:26px}.project-page .project-hero .lead{font-size:17px;line-height:1.7;max-width:48ch;margin:0}.project-context{order:3;margin:20px 0 0;font-size:12px;line-height:1.6;color:var(--ink-soft)}.project-page .project-hero .metric-row{margin-top:12px}.project-page .project-hero .project-attribution{margin-top:30px;gap:16px 24px;border:0;background:none;box-shadow:none}.project-page .project-attribution>div{padding:14px 0 0;border:0;border-top:1px solid var(--rule);background:none}.project-page .project-attribution dt{font-size:11px;color:var(--ink-soft);margin-bottom:7px}.project-page .project-attribution dd{font-size:13px;line-height:1.7;max-width:60ch}.project-reading-layout{display:grid;grid-template-columns:minmax(170px,220px) minmax(0,800px);gap:clamp(40px,6vw,96px);align-items:start;width:min(1160px,100%);margin:32px auto 0}.project-index{position:sticky;top:calc(var(--header-offset) + 32px);min-width:0;padding-top:14px;border-top:1px solid var(--rule)}.project-index>summary{display:flex;align-items:center;justify-content:space-between;cursor:pointer;font-size:12px;font-weight:600;color:var(--ink);list-style:none;margin-bottom:14px;min-height:44px}.project-index>summary::-webkit-details-marker{display:none}.project-index>summary svg{display:block;width:16px;height:16px}.project-index[open]>summary svg{transform:rotate(180deg)}.project-index-current{display:none}.project-index nav{display:flex;flex-direction:column;gap:3px}.project-index a{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:44px;padding:8px 0;color:var(--ink-soft);text-decoration:none;font-size:12px;line-height:1.65}.project-index a svg{width:18px;height:18px;flex:none;opacity:0}.project-index a[aria-current],.project-index a:hover{color:var(--brand)}.project-index a[aria-current] svg{opacity:1}.project-page .project-writeup{min-width:0;max-width:none;width:100%;padding:0;margin:0}.project-page .writeup-section{display:block;padding:46px 0 58px;border-top:1px solid var(--rule-light);scroll-margin-top:calc(var(--header-offset) + 40px)}.project-page .project-writeup .writeup-section:first-child{padding-top:10px;border-top:0}.project-page .writeup-section h2{font-family:var(--font-display);font-weight:500;font-size:36px;line-height:1.12;letter-spacing:-.025em;margin:0 0 22px;text-wrap:balance}.project-page .writeup-section p,.project-page .writeup-section ul{font-size:17px;line-height:1.8;max-width:68ch;color:var(--ink-soft)}.project-page .writeup-section p+p{margin-top:18px}.project-page .writeup-section>.visual,.project-page .writeup-section>.video-embed,.project-page .writeup-section>.hardware-demo,.project-page .writeup-section>.pcb-viewer,.project-page .writeup-section>.spec-list{margin-top:30px}.project-page .writeup-section .visual{margin-inline:0}.project-page .writeup-section .visual:after{display:none}.project-page .writeup-section .visual>figcaption{position:static;width:auto;height:auto;margin:12px 0 0;padding:0;overflow:visible;clip:auto;clip-path:none;white-space:normal;font-size:12px;line-height:1.7;color:var(--ink-soft)}.project-page .writeup-section .visual--bare>figcaption{margin-top:18px}.project-page .writeup-section .visual>figcaption.sr-only{display:block}.project-continuation{width:min(1160px,100%);margin:80px auto 30px;padding-top:48px;border-top:1px solid var(--rule)}.project-continuation-heading{display:flex;align-items:baseline;justify-content:space-between;gap:30px;margin-bottom:32px}.project-continuation h2{font-family:var(--font-display);font-weight:500;font-size:48px;line-height:1.1;letter-spacing:-.03em;margin:0}.project-return{display:inline-flex;gap:12px;align-items:center;min-height:44px;color:var(--ink);font-size:12px;text-decoration:none}.project-return svg{width:18px;height:18px}.project-next{display:grid;grid-template-columns:224px minmax(0,1fr);gap:40px;align-items:center;text-decoration:none;color:var(--ink)}.project-next>picture{display:block;aspect-ratio:4 / 3;overflow:clip}.project-next img{display:block;width:100%;height:100%;object-fit:cover}.project-next h3{font-family:var(--font-display);font-weight:500;font-size:32px;line-height:1.1;letter-spacing:-.025em;margin:0 0 16px;text-wrap:balance}.project-next p{font-size:14px;line-height:1.8;color:var(--ink-soft);max-width:52ch;margin:0 0 20px}.project-next span{display:inline-flex;align-items:center;gap:24px;min-height:48px;border-bottom:1px solid currentColor;font-size:13px;font-weight:600}.project-next span svg{width:20px;height:20px}.project-source-links{display:flex;flex-wrap:wrap;gap:20px 36px;width:min(1160px,100%);margin:44px auto 0;padding:0;border:0}.project-source-links a{display:inline-flex;align-items:center;gap:14px;min-height:44px;border-bottom:1px solid currentColor;font-size:16px;font-weight:500;color:var(--brand);text-decoration:none}.project-source-links svg{width:18px;height:18px}.project-next:is(:hover,:focus-visible) span,.project-return:is(:hover,:focus-visible),.project-source-links a:is(:hover,:focus-visible){color:var(--brand)}.project-page .pcb-viewer figcaption a{display:inline-flex;align-items:center;min-height:44px}.project-page .pcb-viewer-status-actions .button{min-height:44px}.project-page .pcb-viewer-status--error{z-index:4}.pcb-load-facade.is-static-preview:after{display:none}.pcb-load-facade.is-static-preview .pcb-load-trigger{inset:auto 12px 8px auto;width:auto;height:auto;min-height:44px}.video-direct{display:inline-flex;align-items:center;min-height:44px;margin:12px 20px}html:not(.js) :is(.pcb-load-trigger,.pcb-viewer-toggle){display:none}.video-facade:not([data-video-mounted]){display:none}.video-embed:has([data-video-mounted]) .video-direct{display:none}.pcb-viewer:not(:has(kicanvas-embed)) .pcb-viewer-hint{display:none}.hardware-demo[data-demo-ready] .hardware-demo-static-caption{display:none}.hardware-demo:not([data-demo-ready]) figcaption>:not(.hardware-demo-static-caption){display:none}.project-page :focus-visible{outline:2px solid var(--brand);outline-offset:5px}@media(prefers-reduced-motion:no-preference){.project-next span svg{transition:transform .25s cubic-bezier(.16,1,.3,1)}.project-next:is(:hover,:focus-visible) span svg{transform:translate(5px)}.project-index>summary svg{transition:transform .26s cubic-bezier(.16,1,.3,1)}}@media(max-width:1100px){.project-page .page-main{width:calc(100% - 64px)}.project-reading-layout{grid-template-columns:170px minmax(0,1fr);gap:40px}}@media(max-width:900px){.project-page .project-hero{gap:28px}.project-page .project-hero>.project-hero-intro,.project-page .project-hero-media,.project-page .project-hero>.project-attribution{grid-column:1;grid-row:auto}.project-page .project-hero>.project-attribution{margin-top:0;grid-template-columns:repeat(2,minmax(0,1fr))}.project-page .project-hero>.project-attribution>div:last-child{grid-column:1 / -1}.project-reading-layout{display:block;margin-top:8px}.project-index{z-index:5;top:var(--header-offset);padding:0;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);background:var(--paper)}.project-index>summary{cursor:pointer;min-height:52px;margin:0;padding-block:12px}.project-index>summary svg{width:18px;height:18px}.project-index-current{display:block;min-width:0;margin-left:auto;padding-left:12px;font-weight:400;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-index[open] .project-index-current{visibility:hidden}.project-index nav{padding-bottom:14px;max-height:min(60svh,480px);overflow-y:auto}.project-page .project-writeup .writeup-section:first-child{padding-top:36px}.project-page .writeup-section{scroll-margin-top:calc(var(--header-offset) + 82px)}.project-next{gap:32px}.project-next{grid-template-columns:160px minmax(0,1fr)}.project-next h3{font-size:30px}}@media(max-width:620px){.project-page .page-main{width:calc(100% - 40px);padding-top:44px}.project-page .project-hero{gap:24px;padding-bottom:36px}.project-page .project-hero h1{font-size:44px;margin-bottom:22px}.project-page .project-hero .lead{font-size:16px}.project-page .project-hero .project-attribution{margin-top:0}.project-page .project-attribution dd{font-size:13px}.project-page .writeup-section{padding-block:36px 42px}.project-page .writeup-section h2{font-size:32px;margin-bottom:18px}.project-page .writeup-section p,.project-page .writeup-section ul{font-size:16px;line-height:1.8}.project-continuation{padding-top:32px;margin-top:52px}.project-continuation-heading{display:block;margin-bottom:24px}.project-continuation h2{font-size:38px}.project-return{margin-top:14px}.project-next{grid-template-columns:96px minmax(0,1fr);gap:20px;align-items:start}.project-next h3{font-size:26px;margin-bottom:14px}}@media print{.project-index,.project-source-links,.project-continuation{display:none!important}.project-reading-layout{display:block}.project-page .page-main{width:100%}.project-page .writeup-section{break-inside:auto}}.project-page .project-hero h1{font-size:clamp(44px,4.8vw,72px);font-weight:500;letter-spacing:-.035em}.project-page .project-hero-media{border:0;box-shadow:none}.project-flip-pending .project-hero>.project-attribution{opacity:0}.project-flip-running .project-hero>.project-attribution{animation:project-flip-copy .42s .14s cubic-bezier(.16,1,.3,1) both}.project-flip-continuation.project-flip-running .project-hero>.project-attribution{animation:project-continuation-copy .22s 80ms ease-out both}@media(prefers-reduced-motion:reduce){.project-flip-pending .project-hero>.project-attribution{opacity:1}.project-flip-running .project-hero>.project-attribution{animation:none}}.project-page .writeup-section h2{font-family:var(--font-display)}.project-page .writeup-section{padding-block:56px 64px}.project-page .writeup-section>p:first-of-type{color:var(--ink)}.project-page .writeup-section>.visual{margin-block:36px 30px;padding:0;border:0;background:transparent}.project-page .writeup-section .visual>figcaption{margin-top:14px;max-width:66ch}.project-page .writeup-section>.hardware-demo{margin-bottom:32px}.protocol-table-wrap{overscroll-behavior-x:contain;scrollbar-color:var(--stone) var(--paper)}.project-page .writeup-section .protocol-scroll-hint{display:none;font-size:12px;margin-top:12px}@media(max-width:620px){.project-page .writeup-section .protocol-scroll-hint{display:block}}.photo-aperture{position:relative;min-width:0;overflow:clip}.project-hero-media>.photo-aperture{height:100%}.photo-aperture>picture,.photo-aperture img{display:block;width:100%}.project-page .visual .photo-aperture img{height:auto;max-height:none;object-fit:contain}.photo-inspect{position:absolute;inset:0;display:flex;align-items:flex-end;justify-content:flex-end;text-decoration:none;color:var(--ink)}.photo-inspect>span{display:inline-flex;align-items:center;gap:9px;min-height:44px;margin:12px;padding:10px 12px;background:var(--paper);font-size:11px;line-height:1.3}.photo-inspect svg{display:block;flex:none;width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.pcb-load-trigger-label svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.pcb-load-trigger-label:after{content:none}.photo-inspect:is(:hover,:focus-visible)>span{color:var(--brand)}.project-page .photo-inspect:focus-visible{outline-offset:-4px}html:has(.photo-dialog[open]){overflow:hidden}.photo-dialog{width:calc(100% - 64px);max-width:1400px;height:calc(100svh - 64px);max-height:none;padding:64px 32px 24px;margin:auto;border:0;background:var(--paper);color:var(--ink);overflow:auto;overscroll-behavior:contain}.photo-dialog::backdrop{background:#101112d6}.photo-dialog figure{margin:0;height:100%;display:flex;flex-direction:column;gap:18px}.photo-dialog img{display:block;width:100%;min-height:0;flex:1;object-fit:contain}.photo-dialog-footer{display:flex;align-items:baseline;justify-content:space-between;gap:16px 40px;font-size:12px;line-height:1.7}.photo-dialog-footer figcaption{max-width:70ch}.photo-dialog-footer a{flex:none;color:var(--brand);min-height:44px;display:inline-flex;align-items:center;text-underline-offset:4px}.photo-dialog-close{position:absolute;top:12px;right:24px;min-height:44px;padding:8px 12px;border:0;background:transparent;color:var(--ink);font:500 13px var(--font-body);cursor:pointer}.photo-dialog-close:is(:hover,:focus-visible){color:var(--brand)}.photo-dialog-status{position:absolute;top:18px;left:32px;right:150px;margin:0;font-size:12px;line-height:1.7}.photo-dialog :focus-visible{outline:2px solid var(--brand);outline-offset:4px}.project-page .writeup-section>.context-walkthrough{padding:20px 0 0;scroll-margin-top:calc(var(--header-offset) + 24px)}.context-walkthrough [data-context-node] rect{transition:fill .24s cubic-bezier(.16,1,.3,1),stroke .24s cubic-bezier(.16,1,.3,1)}.context-walkthrough [data-context-node].is-current rect{fill:color-mix(in srgb,var(--brand) 10%,var(--paper))!important;stroke:var(--brand)!important;stroke-width:1.5}.context-walkthrough text[data-context-node].is-current{fill:var(--brand)!important;font-weight:600!important}.context-walkthrough [data-context-edge].is-current{stroke:var(--brand)!important;stroke-width:2}.context-walkthrough .ctx-switch--wide [data-context-edge].is-current{marker-end:url(#ctxArrowActive)}.context-walkthrough .ctx-switch--tall [data-context-edge].is-current{marker-end:url(#ctxArrowMActive)}.context-controls{margin-top:24px;padding-top:24px;border-top:1px solid var(--rule)}.context-controls[hidden]{display:none}.context-step{display:grid;grid-template-columns:68px minmax(0,1fr);column-gap:16px}.context-step [data-context-count]{grid-row:1 / 3;font-size:11px;color:var(--ink-soft);font-variant-numeric:tabular-nums;line-height:1.8;padding-top:2px}.context-step strong{font-weight:500;font-size:20px;line-height:1.3}.context-step [data-context-description]{margin-top:8px;min-height:3.6em;font-size:14px;color:var(--ink-soft);line-height:1.8;max-width:64ch}.context-actions{display:flex;align-items:center;gap:8px;margin-top:16px;padding-left:84px}.context-actions button{min-height:44px;padding:8px 12px;border:0;background:transparent;color:var(--ink);font:500 12px var(--font-body);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:14px}.context-actions [data-context-next]{min-width:130px;background:var(--brand);color:var(--paper)}.context-actions [data-context-reset]{margin-left:auto;font-weight:400}.context-actions button:disabled{color:var(--ink-soft);opacity:.5;cursor:default}.context-actions button:not(:disabled):hover{text-decoration:underline;text-underline-offset:4px}.context-actions svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}@media(prefers-reduced-motion:no-preference){.photo-inspect>span{transition:color .18s ease-out,transform .32s cubic-bezier(.16,1,.3,1)}.photo-inspect:is(:hover,:focus-visible)>span{transform:translateY(-3px)}}@media(prefers-reduced-motion:reduce){.context-walkthrough [data-context-node] rect{transition:none}}@media(max-width:620px){.project-page .writeup-section{padding-block:40px 48px}.photo-inspect>span{margin:8px}.photo-inspect>span>span{display:none}.photo-dialog{width:calc(100% - 24px);height:calc(100svh - 24px);padding:64px 16px 16px}.photo-dialog-footer{flex-direction:column;gap:4px}.photo-dialog-close{right:8px}.photo-dialog-status{left:16px}.context-step{grid-template-columns:54px minmax(0,1fr);column-gap:12px}.context-step strong{font-size:18px}.context-step [data-context-description]{min-height:7.2em}.context-actions{padding-left:0;gap:4px}.context-actions button{padding-inline:10px}.context-actions [data-context-next]{min-width:122px}}@media(max-width:900px){.project-page .writeup-section>.context-walkthrough{scroll-margin-top:calc(var(--header-offset) + 66px)}}@media print{.photo-inspect,.photo-dialog,.context-controls{display:none!important}}
