:root{--bg: #0c1220;--panel: #141b30;--panel-2: #1c2440;--line: #2b3457;--text: #f5f7fb;--text-dim: #aab3cf;--accent: #6d93ff;--accent-2: #5eead4;--danger: #f9438a;--on-accent: #071022;--viewport: #070a13;--accent-wash: rgba(109, 147, 255, .1);--accent-glow: rgba(109, 147, 255, .06);--danger-wash: rgba(249, 67, 138, .12);--danger-border: rgba(249, 67, 138, .4);--danger-text: #ffb3d1;--mono: "IBM Plex Mono", "SF Mono", "Consolas", "Menlo", monospace;--sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--heading: "Outfit", -apple-system, "Segoe UI", sans-serif;--radius-sm: 0px;--radius-md: 1px;--radius-lg: 2px;--radius-2xl: 3px}*{box-sizing:border-box}html,body{height:100%;margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:13px}#app{display:grid;grid-template-columns:340px 1fr;grid-template-rows:8px 64px 1fr 8px;height:100%}.accent-stripe{grid-column:1/3;background:linear-gradient(90deg,#7c3aed,#4c5fd7,#0d9488)}header{grid-column:1/3;display:flex;align-items:center;gap:10px;padding:0 20px;background:var(--panel);border-bottom:1px solid var(--line)}header h1{font-family:var(--heading);font-size:18px;font-weight:600;margin:0;letter-spacing:.2px}header .version-tag{font-family:var(--mono);font-size:10px;color:var(--text-dim);border:1px solid var(--line);border-radius:10px;padding:1px 7px;text-decoration:none}header .version-tag:hover{color:var(--text);border-color:var(--text-dim)}header .sub{color:var(--text-dim);font-size:11px;margin-left:2px}header .spacer{flex:1}header .stat{font-family:var(--mono);font-size:11px;color:var(--text-dim);margin-left:14px}#left{background:var(--panel);border-right:1px solid var(--line);overflow-y:auto;padding:14px}#right{position:relative;background:var(--viewport);overflow:hidden;background-image:linear-gradient(var(--accent-glow) 1px,transparent 1px),linear-gradient(90deg,var(--accent-glow) 1px,transparent 1px);background-size:24px 24px}#canvas-host{position:absolute;top:0;right:0;bottom:0;left:0}#viewport-hud{position:absolute;top:12px;left:12px;font-family:var(--mono);font-size:11px;color:var(--text-dim);background:#0c1220b8;padding:6px 10px;border-radius:var(--radius-lg);border:1px solid var(--line);pointer-events:none;line-height:1.5}#warnings{position:absolute;bottom:12px;left:12px;right:12px;max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:4px;pointer-events:none}.warn-pill{pointer-events:auto;background:var(--danger-wash);border:1px solid var(--danger-border);color:var(--danger-text);padding:6px 10px;border-radius:var(--radius-lg);font-size:11.5px;max-width:520px}.warn-pill.info{background:var(--accent-wash);border-color:var(--accent);color:var(--text-dim)}details.sec{margin-bottom:18px}details.sec>summary{font-family:var(--heading);font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);margin:0 0 8px;font-weight:700;display:flex;align-items:center;gap:6px;cursor:pointer;list-style:none;-webkit-user-select:none;user-select:none}details.sec>summary::-webkit-details-marker{display:none}details.sec>summary:before{content:"▸";font-size:9px;transition:transform .15s ease}details.sec[open]>summary:before{transform:rotate(90deg)}details.sec>summary:after{content:"";flex:1;height:1px;background:var(--line)}.row{display:flex;align-items:center;gap:8px;margin-bottom:7px}.row label{flex:0 0 auto;color:var(--text-dim);font-size:12px;min-width:82px}.row .field{flex:1}input[type=number],input[type=text],select{width:100%;background:var(--panel-2);border:1px solid var(--line);color:var(--text);padding:5px 7px;border-radius:var(--radius-md);font-family:var(--mono);font-size:12px;outline:none}input[type=number]:focus,input[type=text]:focus,select:focus{border-color:var(--accent)}input[type=range]{width:100%;accent-color:var(--accent)}.field.pair{display:flex;align-items:center;gap:8px}.field.pair input[type=range]{flex:1;width:auto}.field.pair input[type=number]{width:64px;flex:0 0 auto}input[type=checkbox]{accent-color:var(--accent);width:14px;height:14px}.btn{background:var(--panel-2);border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:var(--radius-lg);font-size:12px;cursor:pointer;font-family:var(--sans);transition:border-color .12s}.btn:hover{border-color:var(--accent)}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600}.btn.primary:hover{filter:brightness(1.08)}.btn.small{padding:3px 8px;font-size:11px}.btn.full{width:100%}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-row{display:flex;gap:6px}#dropzone{border:1.5px dashed var(--line);border-radius:var(--radius-2xl);padding:18px 10px;text-align:center;color:var(--text-dim);cursor:pointer;font-size:12px;transition:.12s}#dropzone:hover,#dropzone.drag{border-color:var(--accent);color:var(--accent);background:var(--accent-glow)}#dropzone .fname{color:var(--text);font-family:var(--mono);font-size:11px;margin-top:4px;word-break:break-all}.shape-picker{display:flex;align-items:center;gap:8px;margin-bottom:10px}.shape-picker select{flex:1;padding:8px;font-size:12.5px;font-family:var(--sans)}.shape-thumb{width:44px;height:44px;flex:0 0 auto;border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--panel-2);display:flex;align-items:center;justify-content:center}.shape-thumb svg{width:30px;height:30px;display:block}.shape-thumb svg .fill{fill:var(--accent-wash);stroke:var(--accent);stroke-width:1.6}.shape-thumb svg .line{fill:none;stroke:var(--accent);stroke-width:1.6}.color-list{display:flex;flex-direction:column;gap:6px}.color-row{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-lg);padding:7px 8px;transition:border-color .1s,opacity .1s}.color-row.dragging{opacity:.45}.color-row.drop-target{border-color:var(--accent);background:var(--accent-wash)}.color-row .top{border-radius:var(--radius-md)}.asm-summary{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-lg);padding:8px 10px;margin-bottom:8px}.asm-sum-row{display:flex;align-items:center;gap:8px;font-size:12px;padding:2px 0;color:var(--text)}.asm-sum-row .ok{color:var(--accent);font-weight:700;width:12px;text-align:center}.asm-adv{margin-bottom:8px}.asm-adv>summary{cursor:pointer;color:var(--text-dim);font-size:11px;list-style:none;-webkit-user-select:none;user-select:none;padding:2px 0}.asm-adv>summary:before{content:"▸ "}.asm-adv[open]>summary:before{content:"▾ "}.color-row .top{display:flex;align-items:center;gap:7px}.swatch{width:16px;height:16px;border-radius:var(--radius-sm);border:1px solid rgba(255,255,255,.15);flex:0 0 auto}.color-row .hex{font-family:var(--mono);font-size:11px;color:var(--text-dim)}.color-row .area{margin-left:auto;font-family:var(--mono);font-size:10.5px;color:var(--text-dim)}.color-row .depth-row{display:flex;align-items:center;gap:6px;margin-top:6px}.color-row .depth-row input{width:64px;flex:none}.color-row .depth-row label{color:var(--text-dim);font-size:11px}.color-row .preset{font-size:10.5px;color:var(--text-dim);margin-left:auto}.empty-hint{color:var(--text-dim);font-size:12px;padding:10px 2px;line-height:1.5}.slot-count{font-family:var(--mono);font-size:11px;color:var(--accent-2);margin-top:6px}.base-color-swatches{display:flex;flex-wrap:wrap;gap:4px}.base-swatch{width:20px;height:20px;border:1px solid var(--line);border-radius:var(--radius-sm);cursor:pointer;padding:0}.base-swatch:hover{border-color:var(--accent)}.base-swatch.selected{outline:2px solid var(--accent);outline-offset:1px}#loading-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#070a13b3;display:none;align-items:center;justify-content:center;flex-direction:column;gap:10px;font-size:12px;color:var(--text-dim);z-index:5}.spinner{width:26px;height:26px;border-radius:50%;border:2px solid var(--line);border-top-color:var(--accent);animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}::-webkit-scrollbar-track{background:transparent}.hint{color:var(--text-dim);font-size:11px;line-height:1.5;margin-top:4px}a{color:var(--accent)}
