:root{--ink: #1c2330;--muted: #6b7686;--line: #d9dee6;--bg: #f4f6f9;--accent: #1f6feb;--danger: #c62828;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;color:var(--ink)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}html,body{overscroll-behavior:none}body{background:var(--bg)}#root{display:flex;flex-direction:column}h1,h2,h3{margin:.8em 0 .4em}h3{font-size:1rem}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}input,select,button,.button{font:inherit;padding:6px 10px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--ink)}button,.button{cursor:pointer;white-space:nowrap}button:hover:not(:disabled),.button:hover{background:#eef2f7;text-decoration:none}button:disabled{opacity:.5;cursor:default}.primary{background:var(--accent);border-color:var(--accent);color:#fff}.primary:hover:not(:disabled){background:#1a5fd0}.link{border:0;background:none;padding:0;color:var(--accent)}.link:hover:not(:disabled){background:none;text-decoration:underline}.danger{color:var(--danger)}.muted{color:var(--muted)}.error{color:var(--danger);background:#fdecea;border:1px solid #f5c6c2;border-radius:6px;padding:8px 12px}.notice{background:#fff8e1;border:1px solid #f0d98a;border-radius:6px;padding:8px 12px;margin:4px 0}.empty{color:var(--muted);padding:24px 0}.spacer{flex:1}.top{display:flex;align-items:center;gap:16px;padding:10px 20px;background:#fff;border-bottom:1px solid var(--line)}.brand{font-weight:700;font-size:1.15rem;color:var(--ink)}.page{padding:16px 20px;width:100%;max-width:1400px;margin:0 auto}.page.narrow{max-width:900px}.drop-everywhere{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:flex;align-items:center;justify-content:center;pointer-events:none;outline:3px dashed var(--accent);outline-offset:-10px;background:#1f6feb14;color:var(--accent);font-size:20px;font-weight:600}.bar{display:flex;align-items:center;gap:8px;margin:8px 0}.bar.wrap{flex-wrap:wrap}.crumbs{font-size:1rem}.login{margin:12vh auto;width:320px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:24px;display:flex;flex-direction:column;gap:12px}.login label,.field{display:flex;flex-direction:column;gap:4px;font-size:.9rem;color:var(--muted)}.login input,.field input,.field select{color:var(--ink)}.grid{list-style:none;padding:0;margin:12px 0;display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:14px}.card{background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px;display:flex;flex-direction:column;gap:6px}.thumb{height:130px;border-radius:6px;background:#000;display:flex;align-items:center;justify-content:center;overflow:hidden}.thumb img{max-width:100%;max-height:100%}.thumb.folder{background:#e8eef7 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23809bc4' d='M3 5h6l2 2h10v12H3z'/%3E%3C/svg%3E") center / 64px no-repeat}.thumb.marker{background:#e7f3ea;color:#2e6b3f;font-weight:600}.card .name{font-weight:600;color:var(--ink);overflow-wrap:anywhere}.card .actions{display:flex;gap:12px;font-size:.85rem}.chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:10px 0}.chip{display:inline-flex;align-items:center;gap:4px}.drawing{background:#fff;border:1px solid var(--line);border-radius:8px;padding:8px}.drawing svg{width:100%;max-height:62vh;display:block}table{border-collapse:collapse;width:100%;background:#fff}th,td{border:1px solid var(--line);padding:6px 10px;text-align:left}th{background:#f0f3f7;font-weight:600}table.sizes input{width:100%;min-width:3.5em;padding:4px 6px}.picker{background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px 14px}.picker ul{list-style:none;margin:8px 0 0;padding:0;max-height:220px;overflow:auto}.picker li{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 0;border-top:1px solid var(--line)}.order{background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px 14px;margin-bottom:10px}.order header{display:flex;align-items:baseline;gap:10px;margin-bottom:8px}.fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin:10px 0}.fields .wide{grid-column:1 / -1;margin:0}.editor{flex:1;min-height:0;display:flex;flex-direction:column;padding:4px 16px 12px}.workspace{flex:1;min-height:0;display:flex;gap:12px}.workspace>svg,.workspace .stage>svg{flex:1;min-width:0;background:#dfe4ea;border:1px solid var(--line);border-radius:8px;touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none}.workspace .canvas{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;gap:6px}.workspace .stage{flex:1;min-height:0;position:relative;display:flex}.workspace .stage>svg{min-height:0}.status{display:flex;gap:16px;align-items:baseline;font-size:12px;padding:0 4px;white-space:nowrap;overflow:hidden}.status .coords{font-variant-numeric:tabular-nums;min-width:170px}.status .muted{overflow:hidden;text-overflow:ellipsis}.pattern .fence{fill:#0057b814;stroke:var(--accent);stroke-dasharray:4 3;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .snap-mark circle{fill:none;stroke:#e65100;stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .snap-mark text{fill:#e65100}.editor .crumbs{white-space:nowrap}.pattern .element path{fill:none;stroke:#6a1b9a;stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .element circle{fill:transparent;stroke:none;cursor:pointer}.pattern .element.picked path{stroke:var(--accent);stroke-width:3.5}.pattern .element path.grab{stroke:transparent;stroke-width:14;pointer-events:stroke}.pattern .preview{fill:none;stroke:#6a1b9a;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .preview-point{fill:#6a1b9a;pointer-events:none}.pattern.tool-point,.pattern.tool-line,.pattern.tool-rect,.pattern.tool-curve,.pattern.tool-arc3,.pattern.tool-arcCenter,.pattern.tool-twoDistances,.pattern.tool-cut{cursor:crosshair}.pattern.tool-move .active .fill{pointer-events:fill;cursor:move}.workspace aside{width:330px;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:8px;padding:4px 14px 14px}dl{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;margin:0}dt{color:var(--muted)}dd{margin:0;font-weight:600}dd.bad{color:var(--danger)}dd.good{color:#2e7d32}.fabric{fill:#fff;stroke:#8a94a3;vector-effect:non-scaling-stroke}.end{stroke:var(--accent);stroke-dasharray:6 4;vector-effect:non-scaling-stroke}.piece{cursor:move}.piece path{fill:#cfe3ff;stroke:#1c2330;stroke-width:1;vector-effect:non-scaling-stroke}.piece.waiting path{fill:#f3e9c6}.piece.conflict path{fill:#ffc9c4;stroke:var(--danger);stroke-width:2}.piece.selected path{stroke:var(--accent);stroke-width:3}.piece .grain{stroke:#5b6b82;vector-effect:non-scaling-stroke}.piece text{fill:#1c2330;pointer-events:none}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#141c2873;display:flex;align-items:flex-start;justify-content:center;padding:6vh 16px;overflow:auto}.dialog{background:var(--bg);border-radius:10px;padding:8px 20px 16px;width:560px;max-width:100%}.dialog.wide{width:860px}button.on{background:#dbe8ff;border-color:var(--accent)}.fields.tight{grid-template-columns:1fr 1fr;gap:8px;margin:6px 0}.fields.tight input{width:100%}tr.base th,tr.base td{background:#f7f9fc}.pattern .other path{fill:#eef1f5;stroke:#8a94a3;vector-effect:non-scaling-stroke;cursor:pointer}.pattern .other text,.pattern text{fill:#5b6b82;pointer-events:none}.pattern .active .fill{fill:#fff;stroke:none;pointer-events:none}.pattern .active .size{fill:none;stroke-width:1;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .seam{fill:none;stroke:#2e7d32;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .hit{fill:none;stroke:#1c2330;stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .grab,.pattern .other path.grab{fill:none;stroke:transparent;stroke-width:16;vector-effect:non-scaling-stroke;pointer-events:stroke;cursor:pointer}.pattern .other path.hit{fill:none;stroke-width:1}.pattern .hit.picked{stroke:var(--accent);stroke-width:4}.pattern path.hit.measured-0,button.group-0.on{stroke:#e65100;stroke-width:5;border-color:#e65100}.pattern path.hit.measured-1,button.group-1.on{stroke:#6a1b9a;stroke-width:5;border-color:#6a1b9a}.pattern.tool-insert .active .grab,.pattern.tool-notch .active .grab,.pattern.tool-pass .active .grab{cursor:crosshair}.pattern .grain{stroke:#0057b8;stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none}.pattern .handle{fill:#fff;stroke:#1c2330;stroke-width:1.5;vector-effect:non-scaling-stroke;cursor:move}.pattern .handle.picked{fill:var(--accent)}.pattern .handle.grain-end{stroke:#0057b8}.pattern .handle.pass{stroke:#6a1b9a;stroke-width:1.2}.pattern .notch path{fill:none;stroke:#c62828;stroke-width:2;vector-effect:non-scaling-stroke}.pattern .notch circle{fill:#c62828;fill-opacity:.15;stroke:none;cursor:move}.pattern .notch.picked circle{fill-opacity:.5}.workspace aside table.sizes{font-size:12px}.workspace aside table.sizes th,.workspace aside table.sizes td{padding:4px 5px}.icon{width:20px;height:20px;flex:none;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.icon-only{display:inline-flex;align-items:center;justify-content:center;padding:6px 8px}.button.icon-only{color:var(--ink)}.tag{font-size:12px;font-weight:600;padding:2px 8px;border-radius:4px;background:#e8ecf2;color:#33415a;white-space:nowrap}.tag.warn{background:#fff3d6;color:#6b4a00}.joined{display:inline-flex}.joined>*{border-radius:0;margin-left:-1px}.joined>:first-child{border-radius:6px 0 0 6px;margin-left:0}.joined>:last-child{border-radius:0 6px 6px 0}.editor-top{gap:8px 10px}.toolrail{width:184px;flex:none;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:8px;padding:2px 6px 8px}.toolrail h3{margin:10px 6px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.toolrail button{display:flex;align-items:center;gap:10px;width:100%;height:36px;padding:0 6px;border-color:transparent;background:none;text-align:left}.toolrail button span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.toolrail button.on{background:#dbe8ff;border-color:var(--accent);color:#174ea6;font-weight:600}kbd{font:11px ui-monospace,SFMono-Regular,Menlo,monospace;padding:1px 5px;border:1px solid var(--line);border-radius:4px;background:#fff;color:var(--muted)}.toolhint{display:flex;align-items:flex-start;gap:10px;margin:0;padding:8px 12px;background:#fff;border:1px solid var(--line);border-radius:8px}.toolhint .icon{color:var(--accent)}.legend{position:absolute;left:10px;bottom:10px;max-width:calc(100% - 20px);display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:5px 8px;background:#fff;border:1px solid var(--line);border-radius:8px;font-size:12px}.legend .chip{margin-right:4px}.legend .size{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border:1px solid var(--line);border-radius:6px;background:#fff}.legend .size i{width:14px;height:3px;background:var(--ink)}.legend .size.base{font-weight:600;background:#f0f3f7}.legend .size.off{color:var(--muted);text-decoration:line-through}.legend .size.off i{opacity:.3}.tabs{display:flex;margin:0 -14px 4px;border-bottom:1px solid var(--line);position:sticky;top:-4px;background:#fff;z-index:1}.tabs button{flex:1;padding:10px 0;border:0;border-bottom:3px solid transparent;border-radius:0;background:none}.tabs button.on{background:none;border-bottom-color:var(--accent);color:#174ea6;font-weight:600}.shortcuts{display:block}.shortcuts>div{display:grid;grid-template-columns:130px 1fr;gap:12px;padding:4px 0;border-top:1px solid var(--line)}.shortcuts dd{font-weight:400}.metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;margin-bottom:8px;background:var(--line);border:1px solid var(--line);border-radius:8px;overflow:hidden}.metrics>*{display:flex;flex-direction:column;gap:2px;padding:6px 12px;background:#fff;border:0;border-radius:0;text-align:left;white-space:normal}.metrics span{font-size:12px;color:var(--muted)}.metrics .good strong{color:#2e7d32}.metrics .bad,.metrics .bad:hover:not(:disabled){background:#fdecea;color:#8c1d18}.metrics .bad span{color:inherit}.ruler line{stroke:#5b6b82;vector-effect:non-scaling-stroke}.ruler text{fill:#5b6b82;pointer-events:none}.tray{display:flex;align-items:center;gap:12px;min-height:78px;padding:6px 10px;background:#fff;border:1px solid var(--line);border-radius:8px}.tray-title{display:flex;flex-direction:column;flex:none;max-width:190px;font-size:12px}.tray-title strong{font-size:14px}.tray-items{flex:1;min-width:0;display:flex;gap:6px;overflow-x:auto;padding-bottom:2px}.tray-items button{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 8px;background:#fbf5df;border-color:#d8c88c;font-size:11px;cursor:grab;touch-action:none}.tray-items button.on{border-color:var(--accent);background:#dbe8ff}.tray-items svg{width:56px;height:40px}.tray-items path{fill:#f3e9c6;stroke:#1c2330;vector-effect:non-scaling-stroke}.pad{display:grid;grid-template-columns:repeat(3,38px);grid-template-rows:repeat(2,36px);gap:4px}.stack{flex:1;display:flex;flex-direction:column;gap:4px}.stack button{display:flex;align-items:center;justify-content:space-between;gap:8px}.with-icon{display:inline-flex;align-items:center;gap:8px}.drive-head h1{margin:0;font-size:1.5rem}.drive-head .where{min-width:0}.dropzone{display:flex;align-items:center;gap:10px;margin:10px 0;padding:10px 14px;border:1.5px dashed #9fb4d6;border-radius:8px;background:#eef3fb;color:#33415a}.dropzone .icon{color:var(--accent)}.search{flex:1 1 240px;max-width:420px}.pill{border-radius:999px}.pill.on{color:#174ea6;font-weight:600}h2.section{margin:16px 0 0;font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.grid.folders{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));margin-top:8px}.grid{margin-top:8px}.card{position:relative}.card.row{flex-direction:row;align-items:center;padding:6px 6px 6px 12px}.card.row .name{flex:1;min-width:0}.card.row .name .icon{color:#5f7fb3;fill:#c9d8f0}.card .about{display:flex;align-items:flex-start;gap:6px}.card .about>div{flex:1;min-width:0}.card .meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:4px 0 0;font-size:12px;color:var(--muted)}.tag.pattern{background:#e3edff;color:#174ea6}.tag.marker{background:#dcefe1;color:#1f5a30}.thumb.marker .icon{width:56px;height:56px;stroke-width:1.2}.more{flex:none;border-color:transparent;background:none}.more .icon{stroke-width:3}.menu{position:absolute;z-index:5;top:calc(100% - 6px);right:6px;min-width:190px;padding:6px;display:flex;flex-direction:column;background:#fff;border:1px solid #c5ccd8;border-radius:10px;box-shadow:0 8px 24px #1c233029}.menu>*{padding:8px 10px;border:0;border-radius:6px;background:none;color:var(--ink);text-align:left;font:inherit;cursor:pointer}.menu>*:hover{background:#eef2f7;text-decoration:none}.menu .danger{color:var(--danger)}.dialog.small{width:420px}.primary.destructive,.primary.destructive:hover:not(:disabled){background:var(--danger);border-color:var(--danger)}.wizard{display:flex;flex-wrap:wrap;align-items:flex-start;gap:20px}.wizard .steps{flex:999 1 560px;min-width:0;display:flex;flex-direction:column;gap:14px}.panel{background:#fff;border:1px solid var(--line);border-radius:10px;padding:14px 18px 16px}.panel h2{display:flex;align-items:center;gap:10px;margin:0 0 10px;font-size:1.15rem}.panel .picker,.panel .order{border:1px solid var(--line)}.step{width:26px;height:26px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1.5px solid var(--muted);color:var(--muted);font-size:13px}.step.done{background:#1f5a30;border-color:#1f5a30;color:#fff}.step .icon{width:15px;height:15px;stroke-width:3}.chosen{list-style:none;margin:0 0 10px;padding:0;display:flex;flex-wrap:wrap;gap:8px}.chosen li{flex:1 1 260px;display:flex;align-items:center;gap:10px;padding:6px;border:1px solid var(--line);border-radius:8px}.chosen img{width:48px;height:40px;object-fit:contain;background:#000;border-radius:4px}.chosen li>span{flex:1;min-width:0}.chosen .icon-only{border-color:transparent}.summary{flex:1 1 300px;display:flex;flex-direction:column;gap:12px;position:sticky;top:12px}.summary dd{text-align:right}.summary .notice ul{margin:4px 0 0;padding-left:18px}.summary .primary{padding:10px;font-weight:600}.choices{border:0;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px}.choices legend{padding:0;margin-bottom:4px;font-size:.9rem;color:var(--muted)}.choices label{display:flex;align-items:flex-start;gap:10px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--muted);cursor:pointer}.choices label strong{color:var(--ink)}.choices label.on{border-color:var(--accent);background:#e9f1ff;color:#33415a}.choices input{padding:0;margin:3px 0 0}.viewer .part{cursor:pointer}.viewer .base{fill:#fff;stroke:none}.viewer .size{fill:none;stroke-width:1;vector-effect:non-scaling-stroke}.viewer .outline{fill:none;stroke:#1c2330;stroke-width:1.5;vector-effect:non-scaling-stroke}.viewer .part.on .base{fill:#e3edff}.viewer .part.on .outline{stroke:var(--accent);stroke-width:3}.viewer .notch{fill:none;stroke:#c62828;stroke-width:2;vector-effect:non-scaling-stroke}.viewer .grain{stroke:#0057b8;stroke-width:1.5;vector-effect:non-scaling-stroke}.viewer text{fill:#5b6b82;pointer-events:none}.viewer .part.on text{fill:#174ea6;font-weight:600}.viewer .dimension path{fill:none;stroke:var(--accent);vector-effect:non-scaling-stroke}.viewer .dimension text{fill:#174ea6}.legend.right{left:auto;right:10px;top:10px;bottom:auto;padding:0;gap:0;border:0;background:none;align-items:stretch;font-size:inherit}.workspace aside.wide{width:420px}table.pieces td,table.pieces th{white-space:nowrap}table.pieces tbody tr{cursor:pointer}table.pieces tbody tr:hover td{background:#f4f7fb}table.pieces tbody tr.on td{background:#e3edff}table.pieces tbody tr.on .link{font-weight:600}table.pieces td:nth-child(n+3),table.pieces th:nth-child(n+3){text-align:right;font-variant-numeric:tabular-nums}.versions{list-style:none;margin:8px 0 0;padding:0}.versions li{display:flex;align-items:center;gap:8px;padding:6px 6px 6px 10px;border:1px solid transparent;border-bottom-color:var(--line)}.versions li.on{border-color:var(--accent);border-radius:8px;background:#e9f1ff}.versions .link{flex:1;min-width:0;display:flex;flex-direction:column;text-align:left;color:var(--ink);white-space:normal}.versions .link:hover:not(:disabled){text-decoration:none}.versions .muted{font-size:12px}
