:root{--bg: #e4e8eb;--panel: #f4f6f7;--panel-2: #eceff1;--ink: #18222a;--ink-2: #4a5763;--ink-3: #7b8792;--rule: #d2d8dd;--dykem: #1e3d8a;--dykem-2: #2a4fa6;--navy: #10234f;--scribe: #eef3fa;--amber: #f2a900;--amber-ink: #8a5d00;--red: #c63a2f;--green: #2c7a4d;--card: rgba(250, 251, 252, .94);--shadow: 0 1px 2px rgba(16, 24, 32, .08), 0 6px 20px rgba(16, 24, 32, .1);--sans: "Barlow", system-ui, sans-serif;--cond: "Barlow Condensed", "Barlow", system-ui, sans-serif;color-scheme:light}*{box-sizing:border-box}html,body{margin:0;height:100%}body{background:var(--bg);color:var(--ink);font:400 14px/1.45 var(--sans);-webkit-font-smoothing:antialiased}button,input,select{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--dykem-2);outline-offset:2px}.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}#app{height:100vh;display:grid;min-width:960px;grid-template-rows:44px 1fr auto}.top{display:flex;align-items:center;gap:16px;padding:0 12px 0 16px;background:var(--ink);color:#e9eef2}.brand{display:flex;align-items:center;gap:9px;font:600 16px/1 var(--sans);letter-spacing:.01em}.brand svg{width:24px;height:17px;fill:none;stroke:var(--amber);stroke-width:2.6;stroke-linejoin:round;stroke-linecap:round}.partpick select{appearance:none;background:transparent url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5 L6 7.5 L9 4.5' fill='none' stroke='%239eabb6' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat right 6px center / 12px;border:1px solid transparent;border-radius:5px;color:#fff;font-weight:500;padding:4px 24px 4px 8px;width:auto}.partpick select:hover{border-color:#3a4853}.partpick select option,.partpick select optgroup{color:var(--ink);background:#fff}.top-right{margin-left:auto;display:flex;align-items:center;gap:8px;font-size:13.5px}.top-right .open{cursor:pointer;border:1px solid #5d6d79;border-radius:5px;padding:4px 11px;color:#fff}.top-right .open:hover{border-color:var(--amber)}.top-right .open:focus-within{outline:2px solid var(--amber);outline-offset:2px}.top-right .sep{width:1px;height:18px;background:#3a4853;margin:0 4px}.ghost{background:transparent;border:0;color:#c3ccd4;border-radius:5px;padding:4px 8px}.ghost:hover:not(:disabled){color:#fff;background:#ffffff12}.ghost:disabled{opacity:.35;cursor:default}.linkish{background:none;border:0;color:#9eabb6;text-decoration:underline;text-underline-offset:3px;padding:0}.linkish:hover{color:#fff}.linkish.dark{color:var(--ink-2)}.linkish.dark:hover{color:var(--ink)}.stage{position:relative;min-height:0;overflow:hidden;background:radial-gradient(120% 90% at 50% 35%,#f4f6f7,#e1e6ea 68%,#d4dade)}.view{position:absolute;inset:0}.view3d canvas{display:block}.stage[data-mode=flat] .hud.br .tool{display:none}.legend{position:absolute;right:16px;bottom:14px;display:flex;align-items:center;gap:6px;font-size:12.5px;color:#b8c7e6;pointer-events:none;z-index:1;transition:opacity .4s ease}.stage[data-mode=bent] .legend{opacity:0}.lg{display:inline-block;width:18px;height:0;border-top:2px solid var(--scribe);margin-left:8px}.lg.down{border-top-style:dashed}.lg.die{height:9px;border:0;background:#f2a90073}.labels{position:absolute;inset:0;pointer-events:none}.chip3d{position:absolute;left:0;top:0;pointer-events:auto;font:600 12px/1 var(--cond);padding:3px 6px;border-radius:4px;border:1px solid rgba(24,34,42,.25);background:#ffffffdb;color:var(--ink)}.chip3d.on{background:var(--amber);border-color:var(--amber-ink)}.chip3d.hov:not(.on){background:#fff;border-color:var(--dykem-2);box-shadow:0 0 0 2px #2a4fa640}.hitlabel{position:absolute;left:0;top:0;pointer-events:none;font:600 12.5px/1 var(--sans);color:#fff;background:var(--red);padding:5px 8px;border-radius:4px;white-space:nowrap;box-shadow:0 2px 8px #00000040}.hitlabel:after{content:"";position:absolute;left:50%;bottom:-5px;margin-left:-5px;border:5px solid transparent;border-bottom:0;border-top-color:var(--red)}.flatmode .chip3d{background:#10234fe0;border-color:#eef3fa73;color:var(--scribe);white-space:pre}.flatmode .chip3d.on{background:var(--amber);border-color:var(--amber);color:var(--ink)}.flatmode .chip3d.hov:not(.on){background:var(--dykem-2);border-color:var(--scribe)}.flatdom{position:absolute;inset:0;pointer-events:none;z-index:2}.flatdom>*{position:absolute;left:0;top:0}.fdim{font:500 13px/1 var(--cond);color:#a9b9dc;white-space:nowrap}.fdim.v{transform-origin:0 50%}.fdot{width:10px;height:10px;border-radius:50%;border:1.5px solid #fff;pointer-events:auto}.fdot.error{background:#ff6a5c}.fdot.warn{background:var(--amber)}.fhandle{width:32px;height:9px;border-radius:5px;pointer-events:auto;cursor:ns-resize;touch-action:none;background:var(--scribe);border:1.5px solid var(--dykem);box-shadow:0 1px 3px #0000004d}.fhandle:hover,.dragging-handle .fhandle{background:var(--amber)}.dragging-handle,.dragging-handle *{cursor:ns-resize!important}.hud{position:absolute;z-index:5;pointer-events:none}.hud>*{pointer-events:auto}.hud.tl{left:12px;top:12px;width:280px;display:grid;gap:8px;max-height:calc(100% - 24px);overflow-y:auto;scrollbar-width:thin}.hud.tr{right:12px;top:12px;display:grid;gap:6px;justify-items:end}#statusbar{display:flex;gap:8px;align-items:center}.hud .view-controls{display:flex;gap:6px}.hud .view-nav{display:grid;justify-items:center;gap:2px}.stage[data-mode=flat] .view-nav{display:none}.viewcube{display:block;width:92px;height:92px;touch-action:none}.cubebar{display:flex;gap:4px}.cubebtn{display:grid;place-items:center;height:24px;min-width:24px;padding:0 7px;border:1px solid var(--rule);border-radius:5px;background:var(--card);color:var(--ink);font-size:11.5px;box-shadow:0 1px 2px #0000000d}.cubebtn svg{width:14px;height:14px}.cubebtn:hover{background:#fff}.view3d canvas{touch-action:none}.pivot{position:absolute;left:0;top:0;width:10px;height:10px;border-radius:50%;pointer-events:none;z-index:4;background:#3d7bf2;box-shadow:0 0 0 2px #fff,0 0 0 3px #14285059}.hud.bl{left:14px;bottom:12px}.hud.br{right:12px;bottom:12px;display:flex;gap:6px}.tool{border:1px solid var(--rule);background:var(--card);border-radius:5px;padding:4px 10px;font-size:13px;white-space:nowrap;box-shadow:0 1px 2px #0000000d}.tool:hover{background:#fff}.tool[aria-pressed=true]{background:var(--ink);color:#fff;border-color:var(--ink)}.card{background:var(--card);border-radius:8px;box-shadow:var(--shadow);backdrop-filter:blur(6px);position:relative}.card-head{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:0;background:transparent;text-align:left;padding:9px 12px;border-radius:8px}.card-head b{display:block;font-weight:600;font-size:14px}.card-head small{display:block;color:var(--ink-2);font-size:12.5px}.card-head .chev{width:12px;height:12px;fill:none;stroke:var(--ink-3);stroke-width:1.6;transition:transform .15s;flex:none}.card-head[aria-expanded=true] .chev{transform:rotate(180deg)}.card-head:hover{background:#fff9}.card-body{padding:2px 12px 12px;border-top:1px solid var(--rule)}.inspector{padding:11px 12px 12px;border-left:3px solid var(--amber)}.inspector h3{margin:0 24px 6px 0;font:600 15px/1.25 var(--sans)}.inspector h3 .sub{font-weight:400;color:var(--ink-2);font-size:13px;display:block}.close{position:absolute;top:6px;right:6px;border:0;background:transparent;color:var(--ink-3);font-size:20px;line-height:1;padding:2px 7px;border-radius:4px}.close:hover{color:var(--ink);background:var(--panel-2)}select{width:100%;padding:6px 8px;border:1px solid var(--rule);border-radius:6px;background:#fff}.thick{display:flex;flex-wrap:wrap;gap:4px}.thick button{font:500 13.5px/1 var(--cond);padding:5px 6px;border:1px solid var(--rule);background:#fff;border-radius:5px;min-width:40px}.thick button.on{background:var(--ink);color:#fff;border-color:var(--ink)}.specs{display:grid;grid-template-columns:1fr 1fr;gap:4px 12px;margin:6px 0}.specs div{display:flex;justify-content:space-between;border-bottom:1px dotted var(--rule);padding-bottom:2px}.specs dt{color:var(--ink-2);font-size:12.5px}.specs dd{margin:0;font:600 13.5px/1.4 var(--cond)}.field{display:grid;grid-template-columns:74px 1fr auto;align-items:center;gap:8px;margin:8px 0}.field>span{color:var(--ink-2);font-size:13px}.field em{font-style:normal;color:var(--ink-3);font-size:12px}.field output{font:600 18px/1 var(--cond);min-width:40px;text-align:right}.field input[type=number]{width:100%;padding:5px 7px;border:1px solid var(--rule);border-radius:5px;background:#fff;font:500 15px/1 var(--cond)}.field input[type=range]{width:100%;accent-color:var(--ink)}.field select,.field .seg,.field .thick{grid-column:2 / span 2}.xy{display:grid;grid-template-columns:1fr 1fr;gap:6px;grid-column:2 / span 2}.seg{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden;background:#fff}.seg button{flex:1;border:0;background:transparent;padding:5px 6px;font-size:13px;display:inline-flex;align-items:center;justify-content:center;gap:5px}.seg button+button{border-left:1px solid var(--rule)}.seg button.on{background:var(--ink);color:#fff}.seg svg{width:20px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.row-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.row-actions button{border:1px solid var(--rule);background:#fff;border-radius:5px;padding:4px 9px;font-size:12.5px}.row-actions button:hover{border-color:var(--ink-3)}.add{margin-top:8px;color:var(--ink-2);font-size:13px}.add button{border:1px dashed var(--ink-3);background:transparent;border-radius:4px;padding:1px 7px;font-size:13px}.add button:hover{border-style:solid;background:#fff}.hint{margin:6px 0 0;color:var(--ink-2);font-size:12.5px}.confirmrow{margin-top:10px;padding:9px;border-radius:6px;background:#fff7e0;border:1px solid #f0d58a;display:grid;gap:7px;font-size:13px}.confirmrow button{justify-self:start;border:0;background:var(--ink);color:#fff;border-radius:4px;padding:4px 11px}.pill{display:inline-flex;align-items:center;gap:8px;border:0;border-radius:999px;padding:7px 14px 7px 12px;background:var(--card);box-shadow:var(--shadow);font-weight:600;font-size:14px}.pill .dot{width:9px;height:9px;border-radius:50%;background:var(--ink-3);flex:none}.pill small{font-weight:400;color:var(--ink-2);margin-left:4px;font-size:12.5px}.pill.blocked{color:var(--red)}.pill.blocked .dot{background:var(--red)}.pill.ready{color:var(--green)}.pill.ready .dot{background:var(--green)}.pill.busy{color:var(--ink-3)}.pill:hover{background:#fff}.primary{padding:8px 14px;border:0;border-radius:6px;background:var(--green);color:#fff;font-weight:600}.primary:hover{filter:brightness(1.08)}.primary:disabled{background:#b9c2c9;cursor:not-allowed}.getprice{box-shadow:var(--shadow);border-radius:999px;padding:8px 16px}.drawer{position:absolute;top:0;right:0;bottom:0;width:360px;z-index:6;background:var(--panel);box-shadow:-8px 0 28px #10182029;overflow-y:auto;padding:14px 16px 18px}.drawer[hidden]{display:none}.drawer-head{display:flex;align-items:center;justify-content:space-between}.drawer-head h2{margin:0;font:600 19px/1.2 var(--sans)}.drawer .close{position:static}.drawer h3{margin:18px 0 8px;font:600 14px/1.2 var(--sans)}.path{list-style:none;margin:12px 0 4px;padding:0;display:grid;gap:6px}.path li{display:grid;grid-template-columns:18px 70px 1fr;align-items:center;gap:8px;font-size:13px}.path .tick{width:16px;height:16px;border-radius:50%;border:1.5px solid var(--ink-3);position:relative}.path li.done .tick{background:var(--green);border-color:var(--green)}.path li.done .tick:after{content:"";position:absolute;left:4.5px;top:1.5px;width:4px;height:8px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}.path b{font-weight:600}.path span:last-child{color:var(--ink-2)}.path li:not(.done) span:last-child{color:var(--red)}.issues{list-style:none;margin:0;padding:0;display:grid;gap:6px}.issue{border:1px solid var(--rule);background:#fff;border-radius:6px;position:relative}.issue:before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:0 2px 2px 0}.issue.error:before{background:var(--red)}.issue.warn:before{background:var(--amber)}.issue:hover{border-color:var(--ink-3)}.issue-main{width:100%;text-align:left;border:0;background:transparent;padding:8px 10px 9px 12px;display:grid;gap:3px}.issue b{font-weight:600;font-size:13.5px}.issue-main span{color:var(--ink-2);font-size:12.5px}.fixbtns{display:flex;flex-wrap:wrap;gap:6px;padding:0 10px 10px 12px}.fixbtns button{border:1px solid var(--ink);background:var(--ink);color:#fff;border-radius:4px;padding:4px 9px;font-size:12.5px;font-weight:500}.fixbtns button+button{background:#fff;color:var(--ink)}.fixbtns button:hover{filter:brightness(1.15)}.fixes{margin:0;padding-left:18px;color:var(--ink-2);font-size:13px;display:grid;gap:4px}.fixes li::marker{color:var(--green)}.fixes .link{cursor:pointer;text-decoration:underline dotted;text-underline-offset:3px}.hist{list-style:none;margin:0;padding:0;font-size:13px}.hist button{width:100%;text-align:left;border:0;background:transparent;padding:3px 6px;border-radius:4px;color:var(--ink-2)}.hist button:hover{background:var(--panel-2)}.hist button.on{color:var(--ink);font-weight:600;background:var(--panel-2)}.hist button.future{color:var(--ink-3);text-decoration:line-through}.drawer .perf{margin:16px 0 0;color:var(--ink-3);font:500 12px/1.4 var(--cond)}.exactbadge{font-size:12.5px;color:var(--ink-2);background:var(--card);border-radius:999px;padding:4px 10px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;cursor:default;box-shadow:0 1px 2px #0000000f}.exactbadge:empty{display:none}.exactbadge:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--ink-3)}.exactbadge.running:before{background:var(--amber);animation:pulse 1s ease-in-out infinite}.exactbadge.done:before{background:var(--green)}.exactbadge.failed{color:var(--red)}.exactbadge.failed:before{background:var(--red)}@keyframes pulse{50%{opacity:.3}}.stage[data-mode=flat] .exactbadge{display:none}.timeline{display:flex;align-items:center;gap:12px;padding:10px 14px;background:var(--panel);border-top:1px solid var(--rule);min-height:64px}.play{flex:none;display:grid;place-items:center;width:34px;height:34px;border:0;border-radius:50%;background:var(--ink);color:#fff}.play svg{width:12px;height:12px;fill:currentColor;margin-left:2px}.play:hover{background:#2b3843}.tl-track{position:relative;flex:1;min-width:0;display:flex;align-items:center;gap:0;padding:8px 0;cursor:pointer;touch-action:none;user-select:none}.tl-rail{position:absolute;top:50%;height:4px;margin-top:-2px;background:var(--rule);border-radius:2px;pointer-events:none}.tl-fill{position:absolute;top:0;bottom:0;background:var(--dykem-2);border-radius:2px}.tl-steps{list-style:none;margin:0;padding:0;display:flex;flex:1;justify-content:space-evenly;gap:6px;min-width:0;position:relative}.tl-end{position:relative;z-index:1;flex:none;border:1px solid var(--rule);background:#fff;border-radius:999px;padding:4px 12px;font-size:13px;font-weight:600;color:var(--ink-2)}.tl-end.on{background:var(--dykem-2);border-color:var(--dykem-2);color:#fff}.tl-base{position:relative;z-index:1;border:1px solid var(--rule);background:#fff;border-radius:6px;padding:4px 10px;font:600 14px/1 var(--cond);white-space:nowrap;color:var(--ink);box-shadow:inset 3px 0 0 var(--dykem-2)}.tl-base:hover{border-color:var(--ink-3)}.tl-base.on{border-color:var(--amber);box-shadow:inset 3px 0 0 var(--dykem-2),0 0 0 2px var(--amber)}.tl-step{position:relative;z-index:1;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--rule);background:#fff;border-radius:6px;padding:3px 9px 3px 3px;font:600 14px/1 var(--cond);white-space:nowrap}.tl-step .n{display:inline-grid;place-items:center;width:19px;height:19px;border-radius:4px;background:var(--panel-2);font-size:12.5px;color:var(--ink-2)}.tl-step .a{display:inline-flex;align-items:center;gap:2px;font-weight:500;color:var(--ink-2)}.tl-step .a svg{width:10px;height:10px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.tl-step .a svg.down{transform:rotate(180deg)}.tl-step.done .n{background:var(--dykem-2);color:#fff}.tl-step.doing .n{background:#9fb3e0;color:#fff}.tl-step:hover{border-color:var(--ink-3)}.tl-step[draggable=true]{cursor:grab}.tl-step.dragging{opacity:.55;cursor:grabbing}.tl-step.drop-target{outline:2px solid var(--dykem-2);outline-offset:2px}.tl-step.on{border-color:var(--amber);box-shadow:0 0 0 2px var(--amber)}.tl-step.un{border-style:dashed;border-color:var(--amber-ink)}.tl-step.un:after{content:"?";position:absolute;top:-7px;right:-6px;width:15px;height:15px;border-radius:50%;background:var(--amber);color:var(--ink);font:700 11px/15px var(--sans);text-align:center}.tl-step.err{border-color:var(--red)}.tl-step.err:after{content:"!";position:absolute;top:-7px;right:-6px;width:15px;height:15px;border-radius:50%;background:var(--red);color:#fff;font:700 11px/15px var(--sans);text-align:center}.tl-step.warn{border-color:var(--amber)}.tl-knob{position:absolute;top:50%;z-index:2;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;background:#fff;border:3px solid var(--dykem-2);box-shadow:0 1px 4px #00000040;cursor:grab;pointer-events:none}.tl-knob:focus-visible{outline-offset:3px}.tl-track:active .tl-knob{cursor:grabbing}.tl-side{flex:none;display:grid;justify-items:end;gap:4px;font-size:13px}.tl-order{display:flex;align-items:center;gap:8px;color:var(--ink-2)}.tl-order select{font:inherit;color:var(--ink)}.warnlink{color:var(--amber-ink)!important}.tl-empty{color:var(--ink-2);font-size:13.5px;padding:6px 4px}.toast{position:fixed;left:50%;bottom:84px;transform:translate(-50%);background:var(--ink);color:#fff;padding:10px 16px;border-radius:6px;font-size:13.5px;z-index:70;width:max-content;max-width:min(560px,calc(100vw - 32px));display:grid;gap:3px;box-shadow:0 8px 24px #00000040}.toast b{font-weight:600}.toast span{color:#d6dde3;line-height:1.45}.toast.sticky{padding-right:40px;border-left:4px solid var(--red)}.toast button{position:absolute;top:6px;right:8px;border:0;background:transparent;color:#fff;font-size:20px;line-height:1;padding:2px 6px;border-radius:4px}.toast button:hover{background:#ffffff1f}body.dropping:after{content:"Drop a DXF flat pattern or a STEP model to open it";position:fixed;inset:12px;border:2px dashed var(--amber);border-radius:12px;background:#10234fb8;color:#fff;display:grid;place-items:center;font:600 22px/1 var(--sans);z-index:40;pointer-events:none}.intro{position:fixed;inset:0;z-index:60;display:grid;place-items:center;padding:24px;background:#10234fd1;backdrop-filter:blur(3px)}.intro[hidden],.sheet[hidden]{display:none}.intro-card{width:min(640px,100%);background:var(--panel);border-radius:10px;padding:28px 32px 26px;box-shadow:0 24px 60px #00000059}.intro-art svg{width:160px;height:64px;display:block;margin-bottom:8px}.intro-art .flat{fill:none;stroke:var(--dykem-2);stroke-width:7;stroke-linecap:round;stroke-linejoin:round}.intro-art circle{fill:var(--amber)}.intro h1{margin:0 0 10px;font:600 26px/1.15 var(--sans);max-width:30ch}.intro p{margin:0 0 14px;color:var(--ink-2);max-width:62ch}.intro-points{margin:0 0 22px;padding-left:18px;display:grid;gap:6px;color:var(--ink-2);font-size:13.5px;max-width:64ch}.intro-points b{color:var(--ink)}.intro-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.intro-actions .primary{padding:10px 18px}.secondary{display:inline-block;cursor:pointer;border:1px solid var(--ink);border-radius:6px;padding:9px 16px;background:#fff;color:var(--ink);font-weight:600}.secondary:hover{background:var(--panel-2)}.secondary:focus-within{outline:2px solid var(--dykem-2);outline-offset:2px}.sheet{position:fixed;inset:0;z-index:55;display:grid;place-items:center;padding:24px;background:#18222a73}.sheet-card{width:min(520px,100%);background:var(--panel);border-radius:10px;padding:24px 26px;box-shadow:0 20px 50px #0000004d}.sheet-card h2{margin:0;font:600 21px/1.2 var(--sans)}.sheet-card .sub{margin:4px 0 16px;color:var(--ink-2);font-size:13.5px}.qgrid{margin:0;display:grid;gap:0;border-top:1px solid var(--rule)}.qgrid div{display:grid;grid-template-columns:130px 1fr;gap:12px;padding:7px 0;border-bottom:1px solid var(--rule)}.qgrid dt{color:var(--ink-2);font-size:13px}.qgrid dd{margin:0;font:500 15px/1.35 var(--cond)}.note{color:var(--ink-3);font-size:12.5px;margin:14px 0 16px}.sheet-actions{display:flex;justify-content:flex-end;gap:8px}.sheet-actions .primary{padding:8px 18px}.sheet-actions .secondary{padding:7px 14px}.smallscreen{display:none}@media (max-width: 900px){body:not(.small-ok) .smallscreen{display:grid;align-content:center;gap:14px;position:fixed;inset:0;z-index:80;padding:28px 24px;background:var(--ink);color:#e9eef2}body:not(.small-ok) .intro{display:none}body:not(.small-ok) #app{display:none}.smallscreen h1{margin:0;font:600 26px/1.15 var(--sans);color:#fff;max-width:22ch}.smallscreen p{margin:0;color:#b9c4cd;max-width:46ch}.smallscreen .secondary{justify-self:start;background:transparent;color:#fff;border-color:#5d6d79}body.small-ok{overflow:auto}}@media (prefers-reduced-motion: reduce){*{transition:none!important;animation:none!important}}
