@font-face{font-family:Inter;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/ui/Inter-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:400 800;font-display:swap;src:url(/fonts/ui/Inter-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/fonts/ui/JetBrainsMono-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/fonts/ui/JetBrainsMono-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}:root{--fl-cream:#faf8f4;--fl-ink:#1a2e2e;--fl-teal:#32a897;--fl-mint:#cfebe6;--fl-muted:#6a6860;--fl-border:#e2ddd6;--s1:#32a897;--s2:#36998f;--s3:#1c89bb;--s4:#296d96;--s5:#8c4e69;--s6:#953252;--accent-text:#1f6f63;--bg:var(--fl-cream);--code-bg:#f2eee7;--text:var(--fl-muted);--text-h:var(--fl-ink);--border:var(--fl-border);--accent:var(--fl-teal);--accent-bg:var(--fl-mint);--accent-border:#32a89773;--ok:#2f8f5b;--bad:#c2472f;--na:var(--fl-muted);--social-bg:#e2ddd680;--shadow:#1a2e2e1a 0 10px 15px -3px, #1a2e2e0d 0 4px 6px -2px;--sans:"Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Liberation Sans", Arial, sans-serif;--heading:var(--sans);--mono:"JetBrains Mono", ui-monospace, "SFMono-Regular", "Cascadia Mono", "DejaVu Sans Mono", "Liberation Mono", Consolas, monospace;font:400 18px/145% var(--sans);letter-spacing:-.01em;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}@media (width<=1024px){:root{font-size:16px}}@media (prefers-color-scheme:dark){:root{--bg:var(--fl-ink);--code-bg:#162727;--text:#9db3b0;--text-h:var(--fl-cream);--border:#2c4444;--accent:var(--fl-teal);--accent-text:#6fd0c1;--accent-bg:#32a89729;--accent-border:#32a89780;--ok:#58c184;--bad:#e88a72;--na:#7d938f;--social-bg:#2c444480;--shadow:#0006 0 10px 15px -3px, #00000040 0 4px 6px -2px}#social .button-icon{filter:invert()brightness(2)}}#root{text-align:center;border-inline:1px solid var(--border);box-sizing:border-box;flex-direction:column;width:1126px;max-width:100%;min-height:100svh;margin:0 auto;display:flex}body{margin:0}h1,h2{font-family:var(--heading);color:var(--text-h)}h1{letter-spacing:-.03em;margin:32px 0;font-size:56px;font-weight:800}@media (width<=1024px){h1{margin:20px 0;font-size:36px}}h2{letter-spacing:-.01em;margin:0 0 8px;font-size:24px;font-weight:600;line-height:118%}@media (width<=1024px){h2{font-size:20px}}p{margin:0}code,.counter{font-family:var(--mono);color:var(--text-h);border-radius:4px;display:inline-flex}code{background:var(--code-bg);padding:4px 8px;font-size:15px;line-height:135%}.viewer{text-align:left;flex-direction:column;gap:24px;padding:32px 24px 64px;display:flex}.viewer h1{margin:0 0 8px;line-height:1.1}.viewer .lede{max-width:62ch;margin:0}.parts{flex-wrap:wrap;align-items:flex-end;gap:24px;display:flex}.parts table{border-collapse:collapse;font:15px/1.5 var(--mono)}.parts th,.parts td{border-bottom:1px solid var(--border);text-align:left;padding:4px 16px 4px 0}.parts th{color:var(--text-h);font-weight:500}.parts .num{text-align:right;font-variant-numeric:tabular-nums}.parts button{font:600 16px/1 var(--sans);color:var(--accent-text);background:var(--accent-bg);border:2px solid var(--accent-border);cursor:pointer;border-radius:6px;padding:12px 28px;transition:background .2s}.parts button:hover{background:var(--accent-border)}.parts button:focus-visible{outline:2px solid var(--accent-text);outline-offset:2px}.preview-loading{min-height:220px;color:var(--text);background:var(--code-bg);border:1px solid var(--border);border-radius:6px;place-items:center;font-size:.9rem;display:grid}.sheet-figure{margin:0 0 1.25rem}.sheet-figure figcaption{color:var(--text);margin-top:.35rem;font-size:.85rem}.sheet{background:var(--code-bg);border:1px solid var(--border);border-radius:6px;width:100%;height:auto}.sheet .stock{fill:var(--bg);stroke:var(--border);stroke-width:2px}.sheet .usable{fill:none;stroke:var(--border);stroke-width:1.5px;stroke-dasharray:8 6}.sheet .panel{fill:var(--accent-bg);stroke:var(--accent);stroke-width:2px}.sheet .panel-label{font-family:var(--mono);fill:var(--text-h);text-anchor:middle;dominant-baseline:middle}.sheet .joint-mark{font:8px var(--mono);fill:var(--text);text-anchor:middle;dominant-baseline:middle;pointer-events:none}.sheet .sheet-grain line{stroke:var(--text);stroke-width:2px;marker-end:none}.sheet .sheet-grain text{font:12px var(--mono);fill:var(--text)}.hint{color:var(--text);font-style:italic}.hint.warning{color:var(--bad)}.report{flex-direction:column;gap:20px;display:flex}.report dl{flex-wrap:wrap;gap:40px;margin:0;display:flex}.report dt{font:500 12px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text)}.report dd{font:600 24px/1.2 var(--heading);color:var(--text-h);font-variant-numeric:tabular-nums;margin:2px 0 0}.legend{font:14px var(--sans);flex-wrap:wrap;gap:24px;margin:0;padding:0;list-style:none;display:flex}.legend li{align-items:center;gap:8px;display:flex}.legend span{border-radius:2px;width:20px;height:4px}.problems h2{font:600 16px/1.2 var(--heading);margin:0 0 8px}.problems ul{font:15px/1.6 var(--sans);margin:0;padding-left:20px}.problems strong{color:var(--text-h);font:500 14px var(--mono)}.app{text-align:left;flex-direction:column;flex:1;display:flex}.spectrum{height:14px;display:flex}.spectrum span{flex:1}.spectrum span:first-child{background:var(--s1)}.spectrum span:nth-child(2){background:var(--s2)}.spectrum span:nth-child(3){background:var(--s3)}.spectrum span:nth-child(4){background:var(--s4)}.spectrum span:nth-child(5){background:var(--s5)}.spectrum span:nth-child(6){background:var(--s6)}.keyline{background:var(--accent-bg);height:11px}.masthead{align-items:flex-start;gap:16px;padding:20px 24px 14px;display:flex}.fablab-mark{flex:none;margin-top:4px}.wordmark{font:800 28px/32px var(--heading);letter-spacing:-.02em;color:var(--text-h)}.tagline{font:500 10px/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--accent-text);margin-top:7px}.slogan{max-width:62ch;font:400 14px/1.55 var(--sans);color:var(--text);margin-top:10px}.colophon{border-top:1px solid var(--border);font:400 14px/1.6 var(--sans);color:var(--text);margin-top:auto;padding:28px 24px 32px}@media (width<=720px){.colophon{padding-bottom:76px}}.colophon .academy{font:500 11px/1.4 var(--mono);letter-spacing:.14em;text-transform:uppercase;margin-bottom:6px}.support{margin-bottom:18px}.support-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.support-label{font:500 11px/1.4 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--text);margin-right:2px}.support-link{border:1px solid var(--accent-border);font:600 13px/1 var(--sans);color:var(--accent-text);border-radius:999px;padding:7px 14px;text-decoration:none;transition:background .2s}.support-link:hover{background:var(--accent-bg)}.support-link:focus-visible{outline:2px solid var(--accent-text);outline-offset:2px}.support-creed{max-width:58ch;font:400 italic 13px/1.6 var(--sans);color:var(--text);margin-top:10px}.quiet-link{color:inherit;text-decoration:none}.quiet-link:focus-visible{outline:2px solid var(--accent-text);outline-offset:2px;border-radius:2px}.tabs{border-bottom:1px solid var(--border);gap:4px;padding:16px 24px 0;display:flex}.tabs button{font:500 16px/1 var(--sans);color:var(--text);cursor:pointer;background:0 0;border:1px solid #0000;border-bottom:none;border-radius:6px 6px 0 0;margin-bottom:-1px;padding:12px 20px}.tabs button:hover{color:var(--text-h)}.tabs button.active{color:var(--accent-text);background:var(--accent-bg);border-color:var(--border);border-bottom:1px solid var(--bg)}.tabs button:focus-visible{outline:2px solid var(--accent-text);outline-offset:-2px}.view{flex-direction:column;gap:24px;padding:32px 24px 64px;display:flex}.view h1{margin:0 0 8px;line-height:1.1}.view .lede{max-width:68ch;margin:0}.controls{flex-wrap:wrap;align-items:flex-end;gap:20px;display:flex}.controls.step{border-bottom:1px solid var(--border);margin-bottom:4px;padding-bottom:22px}.controls.step:has(>.section-body[hidden]){padding-bottom:8px}.controls .section-body{flex-wrap:wrap;flex-basis:100%;align-items:flex-end;gap:20px;display:flex}.controls .section-body[hidden]{display:none}.controls .step-label .section-toggle{width:100%;font:inherit;color:inherit;text-align:left;letter-spacing:inherit;text-transform:inherit;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:10px;padding:0;display:flex}.controls .step-label .section-toggle:hover{color:var(--accent)}.controls .step-label .section-caret{width:1em;color:var(--accent);font-size:11px;display:inline-block}.controls .fit-problems{flex-direction:column;flex-basis:100%;gap:6px;display:flex}.controls .fit-problems p{margin:0}.controls .drop-zone{border:1px dashed var(--border);background:var(--code-bg);border-radius:6px;flex-direction:column;flex-basis:100%;gap:8px;padding:14px;display:flex}.controls .drop-zone.over{border-color:var(--accent);background:var(--accent-bg)}.controls .drop-zone .hint{margin:0}.controls .drop-zone input[type=file]{font:inherit;color:var(--text-h);font-size:.9rem}.controls .hint.size{font:500 13px/1.4 var(--mono);color:var(--text);flex-basis:100%;margin:0;font-style:normal}.controls .control-group{flex-wrap:wrap;flex-basis:100%;align-items:flex-end;gap:20px;display:flex}.controls .step-label{font:600 12px/1 var(--mono);text-transform:uppercase;letter-spacing:.12em;color:var(--text);flex-basis:100%;margin:0}.controls label{font:500 12px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text);flex-direction:column;gap:6px;display:flex}.controls select,.controls input[type=number],.controls input[type=text]{font:15px var(--sans);border:1px solid var(--border);background:var(--bg);color:var(--text-h);border-radius:6px;padding:9px 12px}.controls input[type=number]{width:7em}.controls input[type=text]{width:11em}.controls label.checkbox{text-transform:none;letter-spacing:0;font:15px var(--sans);color:var(--text-h);flex-direction:row;align-items:center;gap:8px;padding-bottom:10px}.controls label.checkbox input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.controls button{font:600 16px/1 var(--sans);color:var(--accent-text);background:var(--accent-bg);border:2px solid var(--accent-border);cursor:pointer;border-radius:6px;padding:12px 28px}.controls button:hover:not(:disabled){background:var(--accent-border)}.controls button:disabled{opacity:.45;cursor:default}.controls button.stop{color:var(--text);border-color:var(--border);background:0 0}.controls button.stop:hover{background:var(--code-bg)}.controls button.secondary{font:500 14px/1 var(--sans);color:var(--text-h);background:var(--bg);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:10px 16px}.controls button.secondary:hover:not(:disabled){border-color:var(--accent-border);color:var(--accent-text)}.controls button.secondary:disabled{opacity:.45;cursor:default}.controls .working{font-style:normal;font-family:var(--mono);flex-direction:column;flex-basis:100%;gap:6px;font-size:13px;display:flex}.controls .working progress{width:100%;height:6px;accent-color:var(--accent)}.controls select:disabled,.controls input:disabled{opacity:.5;cursor:not-allowed}.problems ol.assembly{max-width:78ch;font:14px/1.5 var(--sans);flex-direction:column;gap:8px;margin:0;padding-left:22px;display:flex}.problems ul.assembly-warnings{flex-direction:column;gap:6px;max-width:78ch;margin:0 0 12px;padding:0;list-style:none;display:flex}.export-controls{flex-wrap:wrap;align-items:flex-end;gap:16px;display:flex}.export-controls label{font:500 12px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text);flex-direction:column;gap:6px;display:flex}.export-controls select,.export-controls input{font:15px var(--sans);border:1px solid var(--border);background:var(--bg);color:var(--text-h);border-radius:6px;padding:9px 12px}.export-controls input[type=number]{width:7em}.export-controls fieldset.group{min-width:0;border:0;border-left:1px solid var(--border);flex-direction:column;align-items:flex-start;gap:0;min-inline-size:0;margin:0;padding:0 0 0 16px;display:flex}.export-controls fieldset.group legend{float:left;width:100%;font:500 12px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text);padding:0}.export-controls fieldset.group label.check{padding-bottom:0}.export-controls label.check{color:var(--text-h);cursor:pointer;flex-direction:row;align-items:center;gap:8px;padding-bottom:11px}.export-controls label.check input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;padding:0}.export-controls label.check:has(input:disabled){opacity:.45;cursor:default}.export-controls button{font:600 15px/1 var(--sans);color:var(--accent-text);background:var(--accent-bg);border:2px solid var(--accent-border);cursor:pointer;border-radius:6px;padding:11px 22px}.export-controls button:hover{background:var(--accent-border)}.export-controls p{flex-basis:100%;margin:0}.export-controls .export-notes{flex-basis:100%}.export-controls .export-notes ul{flex-direction:column;gap:6px;margin:6px 0 0;padding:0;list-style:none;display:flex}.export-controls .export-notes li:before{content:"— "}.caption{font:14px var(--mono);color:var(--text);margin:-12px 0 0}.mesh-preview{background:var(--code-bg);border:1px solid var(--border);touch-action:none;cursor:grab;border-radius:6px;width:100%;display:block}.mesh-preview:active{cursor:grabbing}.strip{flex-wrap:wrap;align-items:flex-end;gap:12px;display:flex}.strip figure{width:96px;margin:0}.strip svg{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;width:96px;height:96px}.strip svg .panel{fill:var(--accent-bg);stroke:var(--accent);stroke-width:2px}.strip svg .crease{stroke:var(--accent);stroke-width:1.5px;stroke-dasharray:4 3;opacity:.6}.strip svg .seam{stroke:var(--text);stroke-width:1.5px;opacity:.35}.strip svg.shaded .panel{fill:var(--accent);stroke:var(--text-h);stroke-width:1.5px}.strip svg.shaded .crease{stroke:var(--text-h);opacity:.75}.strip svg.shaded .seam{stroke:var(--text-h);opacity:.7}.strip figcaption{font:11px/1.4 var(--mono);color:var(--text);flex-direction:column;margin-top:4px;display:flex}.strip figcaption span{font-variant-numeric:tabular-nums}.report-figures{flex-wrap:wrap;gap:40px;margin:0;display:flex}.report-figures dt{font:500 12px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text)}.report-figures dd{font:600 24px/1.2 var(--heading);color:var(--text-h);font-variant-numeric:tabular-nums;margin:2px 0 0}.hint.offer{max-width:62ch;line-height:1.5}button.link{font:inherit;color:var(--accent-text);text-underline-offset:3px;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal;text-decoration:underline}button.link:hover{color:var(--text-h)}.controls .working .harder{font-family:var(--sans);color:var(--accent-text)}.feedback-open,.feedback-panel{z-index:20;text-align:left;position:fixed;bottom:20px;right:20px}.feedback-open{font:600 15px/1 var(--sans);color:var(--accent-text);background:var(--accent-bg);border:1px solid var(--accent-border);box-shadow:var(--shadow);cursor:pointer;border-radius:999px;padding:12px 20px;transition:background .2s}.feedback-open:hover{background:var(--accent-border)}.feedback-panel{background:var(--bg);border:1px solid var(--border);width:360px;max-width:calc(100vw - 40px);max-height:calc(100svh - 40px);box-shadow:var(--shadow);border-radius:10px;padding:16px 18px 18px;overflow-y:auto}.feedback-panel header{justify-content:space-between;align-items:baseline;margin-bottom:12px;display:flex}.feedback-panel h2{margin:0;font-size:18px}.feedback-close{font:500 13px/1 var(--sans);color:var(--text);border:1px solid var(--border);cursor:pointer;background:0 0;border-radius:5px;padding:4px 8px}.feedback-panel form{flex-direction:column;gap:4px;display:flex}.feedback-panel label{font:500 11px/1.4 var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--accent-text);margin-top:8px}.feedback-panel select,.feedback-panel input,.feedback-panel textarea{font:400 15px/1.45 var(--sans);box-sizing:border-box;width:100%;color:var(--text-h);background:var(--code-bg);border:1px solid var(--border);border-radius:6px;padding:8px 10px}.feedback-panel textarea{resize:vertical;min-height:96px}.feedback-panel :is(select,input,textarea):focus-visible{outline:2px solid var(--accent);outline-offset:1px}.feedback-contact{gap:10px;display:flex}.feedback-contact>div{flex:1;min-width:0}.feedback-trap{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.feedback-panel footer{justify-content:space-between;align-items:center;gap:12px;margin-top:16px;display:flex}.feedback-count{font:400 12px/1.4 var(--mono);color:var(--text);font-variant-numeric:tabular-nums}.feedback-count.low{color:var(--bad)}.feedback-panel footer button{font:600 15px/1 var(--sans);color:var(--accent-text);background:var(--accent-bg);border:1px solid var(--accent-border);cursor:pointer;border-radius:6px;padding:10px 22px}.feedback-panel footer button:disabled{color:var(--na);background:var(--social-bg);border-color:var(--border);cursor:not-allowed}.feedback-error{color:var(--bad);margin:10px 0 0;font-size:14px}.feedback-done{font:600 16px/1.4 var(--sans);color:var(--text-h);margin:8px 0 4px}
