:root{--bg:#15181c;--bg-elev:#1d2126;--bg-elev2:#252a31;--bg-input:#111417;--border:#323840;--border-strong:#46505b;--text:#e6e8eb;--text-dim:#9aa3ad;--text-faint:#6b7480;--accent:#d6a467;--accent-strong:#e8b77a;--accent-ink:#1a1408;--focus:#7cb7ff;--ok:#5fbf8f;--warn:#e3b341;--err:#ef6b6b;--info:#6aa8e8;--edge-band:#e8813a;--edge-none:#4f5964;--edge-unresolved:#e04f9a;--radius:6px;--radius-sm:4px;--shadow:0 8px 28px #00000059;--font:"Inter", "Segoe UI", system-ui, -apple-system, sans-serif;--mono:"JetBrains Mono", "Cascadia Mono", ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light]{--bg:#eef0f2;--bg-elev:#fff;--bg-elev2:#f4f5f7;--bg-input:#fff;--border:#d5d9de;--border-strong:#b6bdc5;--text:#1c2025;--text-dim:#56606b;--text-faint:#87909a;--accent:#a8702f;--accent-strong:#8d5c22;--accent-ink:#fff;--focus:#1f6fd1;--shadow:0 8px 28px #141e2826;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:13px/1.45 var(--font);-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--focus);outline-offset:1px}a{color:var(--accent)}h1,h2,h3{margin:0;font-weight:600}h1{font-size:20px}h2{font-size:15px}h3{text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-size:12px}.btn{border:1px solid var(--border);background:var(--bg-elev2);border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;height:30px;padding:0 12px;transition:background .12s,border-color .12s;display:inline-flex}.btn:hover:not(:disabled){border-color:var(--border-strong);background:var(--bg-elev)}.btn:disabled{opacity:.45;cursor:default}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);font-weight:600}.btn.primary:hover:not(:disabled){background:var(--accent-strong)}.btn.danger{color:var(--err)}.btn.ghost{background:0 0;border-color:#0000}.btn.ghost:hover:not(:disabled){background:var(--bg-elev2)}.btn.icon{justify-content:center;width:30px;padding:0}.btn.on{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent);color:var(--accent-strong)}.btn.sm{height:24px;padding:0 8px;font-size:12px}.field{flex-direction:column;gap:4px;margin-bottom:12px;display:flex}.field>span{color:var(--text-dim);font-size:12px}.input,select.input{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);min-width:0;height:30px;padding:0 8px}.input:focus{border-color:var(--focus);outline:none}.input.invalid{border-color:var(--err)}.num{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);align-items:stretch;height:26px;display:flex}.num:focus-within{border-color:var(--focus)}.num.invalid{border-color:var(--err)}.num input{min-width:0;font-family:var(--mono);text-align:right;background:0 0;border:0;outline:none;flex:1;padding:0 6px;font-size:12px}.num .unit{color:var(--text-faint);border-left:1px solid var(--border);align-items:center;padding:0 6px;font-size:11px;display:flex}.prop-row{grid-template-columns:1fr 112px;align-items:center;gap:8px;min-height:30px;display:grid}.prop-row>label{color:var(--text-dim);font-size:12px}.prop-row select.input{height:26px;font-size:12px}.prop-group{border-bottom:1px solid var(--border);padding:10px 12px}.prop-group h3{margin-bottom:8px}.badge{letter-spacing:.04em;background:var(--bg-elev2);border:1px solid var(--border);height:18px;color:var(--text-dim);border-radius:9px;align-items:center;padding:0 6px;font-size:10px;font-weight:700;display:inline-flex}.badge.demo{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 50%, transparent)}.badge.err{color:var(--err)}.badge.warn{color:var(--warn)}.card{background:var(--bg-elev);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}.error-text{color:var(--err);margin:8px 0;font-size:12px}.ok-text{color:var(--ok);margin:8px 0;font-size:12px}.muted{color:var(--text-dim)}.faint{color:var(--text-faint)}.mono{font-family:var(--mono)}.auth-page{background:radial-gradient(1200px 600px at 20% -10%, color-mix(in srgb, var(--accent) 14%, transparent), transparent), var(--bg);place-items:center;min-height:100%;padding:24px 16px;display:grid}.auth-card{width:min(380px,100%);padding:28px}.auth-card .brand{align-items:center;gap:10px;margin-bottom:22px;display:flex}.auth-card .btn.primary{justify-content:center;width:100%;height:36px}.topbar{background:var(--bg-elev);border-bottom:1px solid var(--border);align-items:center;gap:8px;min-width:0;height:44px;padding:0 12px;display:flex;overflow-x:auto}.topbar .brand{align-items:center;gap:8px;margin-right:8px;font-weight:600;display:flex}.topbar .spacer{flex:1}.sep{background:var(--border);width:1px;height:20px;margin:0 4px}.dash{max-width:1200px;margin:0 auto;padding:24px 16px}.dash-head{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:16px;display:flex}.tabs{background:var(--bg-elev);border:1px solid var(--border);border-radius:var(--radius);gap:2px;padding:2px;display:flex}.tabs button{border-radius:var(--radius-sm);cursor:pointer;color:var(--text-dim);background:0 0;border:0;padding:4px 12px}.tabs button.on{background:var(--bg-elev2);color:var(--text)}.proj-grid{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;display:grid}.proj-card{box-shadow:none;flex-direction:column;transition:border-color .12s;display:flex;overflow:hidden}.proj-card:hover{border-color:var(--border-strong)}.proj-thumb{background:linear-gradient(160deg, var(--bg-elev2), var(--bg));cursor:pointer;border-bottom:1px solid var(--border);place-items:center;height:140px;display:grid}.proj-body{flex-direction:column;gap:4px;padding:10px 12px;display:flex}.proj-title{align-items:center;gap:6px;font-weight:600;display:flex}.proj-meta{color:var(--text-faint);justify-content:space-between;font-size:11px;display:flex}.proj-actions{flex-wrap:wrap;gap:4px;padding:0 8px 10px;display:flex}.modal-backdrop{z-index:50;background:#00000080;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.modal{width:min(460px,100%);padding:20px}.modal h2{margin-bottom:12px}.modal .actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.editor{grid-template-rows:44px 38px 1fr;grid-template-columns:minmax(0,1fr);height:100%;display:grid}.toolbar{background:var(--bg-elev);border-bottom:1px solid var(--border);align-items:center;gap:4px;padding:0 8px;display:flex;overflow-x:auto}.workspace{grid-template-rows:1fr 220px;grid-template-columns:240px minmax(0,1fr) 300px;min-height:0;display:grid}.panel{background:var(--bg-elev);min-height:0;overflow:auto}.panel-left{border-right:1px solid var(--border);grid-row:1/3}.panel-right{border-left:1px solid var(--border);grid-area:1/3/3}.panel-bottom{border-top:1px solid var(--border);flex-direction:column;grid-column:2;display:flex}.panel-head{border-bottom:1px solid var(--border);background:var(--bg-elev);z-index:1;justify-content:space-between;align-items:center;height:32px;padding:0 12px;display:flex;position:sticky;top:0}.viewport{background:#101316;min-height:0;position:relative}.viewport canvas{display:block}.viewport-overlay{pointer-events:none;color:var(--text-dim);align-items:center;gap:8px;font-size:11px;display:flex;position:absolute;bottom:10px;left:10px}.legend{background:color-mix(in srgb, var(--bg-elev) 85%, transparent);border:1px solid var(--border);border-radius:var(--radius-sm);gap:10px;padding:4px 8px;display:flex}.legend i{vertical-align:middle;border-radius:2px;width:10px;height:4px;margin-right:4px;display:inline-block}.part-label{font:10px var(--mono);color:#fff;pointer-events:none;white-space:nowrap;background:#0009;border-radius:3px;padding:1px 4px}.tree{margin:0;padding:4px 0;list-style:none}.tree li>button{text-align:left;cursor:pointer;width:100%;color:var(--text);background:0 0;border:0;align-items:center;gap:6px;padding:4px 12px;display:flex}.tree li>button:hover{background:var(--bg-elev2)}.tree li>button.sel{background:color-mix(in srgb, var(--accent) 20%, transparent)}.tree .sub li>button{color:var(--text-dim);padding-left:28px;font-size:12px}.tree .flag{color:var(--text-faint);margin-left:auto;font-size:11px}.bottom-tabs{border-bottom:1px solid var(--border);align-items:flex-end;gap:2px;height:32px;padding:0 8px;display:flex}.bottom-tabs button{cursor:pointer;height:28px;color:var(--text-dim);background:0 0;border:0;border-bottom:2px solid #0000;padding:0 12px}.bottom-tabs button.on{color:var(--text);border-bottom-color:var(--accent)}.bottom-body{flex:1;overflow:auto}table.grid{border-collapse:collapse;width:100%;font-size:12px}table.grid th,table.grid td{border-bottom:1px solid var(--border);text-align:left;white-space:nowrap;padding:4px 8px}table.grid th{background:var(--bg-elev2);color:var(--text-dim);font-weight:600;position:sticky;top:0}table.grid td.n{text-align:right;font-family:var(--mono)}table.grid tr.click{cursor:pointer}table.grid tr.click:hover td{background:var(--bg-elev2)}.sev{border-radius:50%;width:8px;height:8px;margin-right:6px;display:inline-block}.sev.error{background:var(--err)}.sev.warning{background:var(--warn)}.sev.info{background:var(--info)}.save-state{color:var(--text-dim);align-items:center;gap:6px;padding:0 8px;font-size:12px;display:flex}.save-state .dot{background:var(--text-faint);border-radius:50%;width:8px;height:8px}.save-state.saved .dot{background:var(--ok)}.save-state.dirty .dot,.save-state.saving .dot{background:var(--warn)}.save-state.offline .dot,.save-state.conflict .dot,.save-state.error .dot{background:var(--err)}.save-state.conflict,.save-state.error,.save-state.offline{color:var(--err)}.edge-diagram text{font:10px var(--mono);fill:var(--text-dim)}.edge-row{grid-template-columns:30px 1fr 96px;align-items:center;gap:6px;padding:3px 0;display:grid}.edge-row .reason{color:var(--text-faint);grid-column:2/4;font-size:11px}.dropdown{position:relative}.dropdown-menu{z-index:20;min-width:220px;padding:4px;position:absolute;top:34px;left:0}.dropdown-menu button{text-align:left;border-radius:var(--radius-sm);cursor:pointer;background:0 0;border:0;width:100%;padding:6px 10px;display:block}.dropdown-menu button:hover{background:var(--bg-elev2)}@media (width<=900px){.workspace{grid-template-rows:50vh auto auto auto;grid-template-columns:minmax(0,1fr)}.panel-left,.panel-right,.panel-bottom{border:0;border-top:1px solid var(--border);grid-area:auto;max-height:none}.viewport{grid-row:1}.panel-bottom{min-height:220px}.editor{height:auto;min-height:100%}}.lib-item{border-radius:var(--radius-sm);align-items:center;gap:8px;padding:5px 4px;display:flex}.lib-item:hover{background:var(--bg-elev2)}.lib-item img,.lib-thumb{border-radius:var(--radius-sm);object-fit:cover;background:linear-gradient(160deg, var(--bg-elev2), var(--bg));border:1px solid var(--border);flex:none;width:40px;height:40px}.lib-name{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.panel-tabs{border-bottom:1px solid var(--border);background:var(--bg-elev);z-index:1;display:flex;position:sticky;top:0}.panel-tabs button{cursor:pointer;height:32px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;background:0 0;border:0;border-bottom:2px solid #0000;flex:1;font-size:12px}.panel-tabs button.on{color:var(--text);border-bottom-color:var(--accent)}.modal.wide{width:min(760px,100%);max-height:calc(100vh - 32px);overflow:auto}.diff-table td{font-family:var(--mono);font-size:11px}.param-grid{grid-template-columns:22px 1fr 96px 96px 96px;align-items:center;gap:4px 8px;font-size:12px;display:grid}.param-grid .head{color:var(--text-faint);font-size:11px}.case-ok{color:var(--ok)}.case-err{color:var(--err)}.chips{flex-wrap:wrap;gap:4px;display:flex}.link-swatch{vertical-align:middle;border-top:2px dashed;width:16px;height:0;margin-right:4px;display:inline-block}.link-swatch.equal{border-color:#4fc3f7}.link-swatch.offset{border-color:#ffa94d}.dash table.grid{align-self:start}.pin-btn{z-index:5;background:color-mix(in srgb, var(--bg-elev) 92%, transparent);color:#ff8ae6;cursor:pointer;white-space:nowrap;height:26px;box-shadow:var(--shadow);border:1px solid #ff4fd8;border-radius:13px;padding:0 10px;font-size:12px;position:absolute}.pin-btn:hover{color:#1a0716;background:#ff4fd8}.num{position:relative}.num-preview{background:var(--accent);color:var(--accent-ink);pointer-events:none;z-index:2;border-radius:3px;padding:1px 6px;font-size:11px;position:absolute;bottom:calc(100% + 2px);right:0}.flip-bar{z-index:5;background:color-mix(in srgb, var(--bg-elev) 90%, transparent);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:8px;gap:3px;padding:3px;position:absolute}.flip-btn{cursor:pointer;height:28px;font:600 11px var(--mono);background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:2px;padding:0 6px 0 4px;display:inline-flex}.flip-btn:hover{background:color-mix(in srgb, currentColor 14%, transparent);border-color:currentColor}.vp-actions{z-index:6;pointer-events:none;flex-direction:column;align-items:flex-end;gap:8px;display:flex;position:absolute;top:10px;right:10px}.vp-card{--card:var(--warn);pointer-events:auto;border:1.5px solid var(--card);border-radius:var(--radius);background:color-mix(in srgb, var(--bg-elev) 92%, var(--card));box-shadow:var(--shadow), 0 0 0 0 color-mix(in srgb, var(--card) 60%, transparent);border-left-width:4px;align-items:center;gap:12px;padding:8px 8px 8px 12px;font-size:12px;animation:.26s cubic-bezier(.2,.9,.3,1.25) both vp-card-in,1.4s ease-out .26s 2 vp-card-ping;display:flex}.vp-card-link{--card:var(--info)}.vp-card-text{flex-direction:column;line-height:1.3;display:flex}.vp-card-text strong{color:var(--card);font-weight:600}.vp-card-text span{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;max-width:220px;overflow:hidden}@keyframes vp-card-in{0%{opacity:0;transform:translate(18px)scale(.94)}to{opacity:1;transform:none}}@keyframes vp-card-ping{0%{box-shadow:var(--shadow), 0 0 0 0 color-mix(in srgb, var(--card) 60%, transparent)}to{box-shadow:var(--shadow), 0 0 0 10px color-mix(in srgb, var(--card) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.vp-card{animation:none}}.vp-actions[hidden]{display:none}.tree .tree-rename{min-width:0;height:22px;font-size:inherit;flex:1;padding:0 6px}.tree li>button.drop{background:color-mix(in srgb, var(--info) 22%, transparent);box-shadow:inset 0 0 0 1.5px var(--info)}.tree li>button.dragging{opacity:.45}.tree .sub li>button[draggable=true]{cursor:grab}
