:root{
  --bg:#0b0b0c;--panel:#141415;--panel2:#1a1a1c;--card:#171718;--line:#2a2a2d;--line2:#38383c;--txt:#f2f2f3;--mut:#8b8b92;--mut2:#5f5f66;
  --blue:#4d7dff;--c-text:#4f8cff;--c-image:#a77bff;--c-video:#34d399;--c-audio:#ffa24c;--red:#ff5d6c;
  --r:14px;--ease:cubic-bezier(.2,.8,.2,1);
}
*{box-sizing:border-box;margin:0}
[hidden]{display:none!important}
html,body{height:100%;background:var(--bg);color:var(--txt);font:14px/1.4 Inter,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased;overflow:hidden}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
button:disabled{opacity:.35;cursor:default}
input,textarea{font:inherit;color:inherit}
a{cursor:pointer}
.ic{flex:none;display:block}
kbd{font:11px Inter,sans-serif;color:var(--mut);background:#222225;border:1px solid var(--line);border-radius:5px;padding:1px 6px}
#app{height:100%}
.loading{height:100%;display:grid;place-items:center}
.gen-spin{width:26px;height:26px;border-radius:50%;border:2.5px solid #333;border-top-color:#8da2ff;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.muted{color:var(--mut);padding:18px 4px}
::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:#333;border-radius:8px}::-webkit-scrollbar-track{background:transparent}

/* buttons / inputs */
.btn{padding:9px 16px;border-radius:10px;font-weight:600;background:#26262a}
.btn.primary{background:#fff;color:#000}.btn.ghost{background:transparent;border:1px solid var(--line)}.btn.danger{background:var(--red);color:#fff}
.input{width:100%;background:#0f0f10;border:1px solid var(--line);border-radius:10px;padding:9px 12px;outline:0}
.input:focus{border-color:var(--blue)}
.x{width:28px;height:28px;border-radius:8px;display:grid;place-items:center;color:var(--mut)}.x:hover{background:#252528;color:#fff}

/* toast / popovers / modals */
#toasts{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);z-index:1000;display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{background:#242427;border:1px solid var(--line2);padding:10px 16px;border-radius:12px;box-shadow:0 8px 30px #0008;transition:.3s;animation:tin .25s var(--ease)}
.toast.err{border-color:#7a2a33;color:#ffb3bb}.toast.warn{border-color:#6b5a1f}.toast.out{opacity:0;transform:translateY(8px)}
@keyframes tin{from{opacity:0;transform:translateY(10px)}}
.pop{position:fixed;z-index:500;animation:pin .12s var(--ease)}
@keyframes pin{from{opacity:0;transform:translateY(3px) scale(.98)}}
.menu{min-width:190px;background:#1b1b1e;border:1px solid var(--line2);border-radius:12px;padding:5px;box-shadow:0 14px 40px #000a}
.menu-item{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border-radius:8px;text-align:left;font-size:13px}
.menu-item span{flex:1}.menu-item:hover{background:#2a2a2e}.menu-item.danger{color:#ff8b97}.menu-item.active{color:#fff;background:#25252a}
.menu-sep{height:1px;background:var(--line);margin:5px 4px}
.modal-back{position:fixed;inset:0;background:#000a;display:grid;place-items:center;z-index:600;animation:pin .15s}
.modal{background:#171719;border:1px solid var(--line2);border-radius:16px;padding:22px;width:min(400px,92vw);max-height:84vh;overflow:auto}
.modal.wide{width:min(680px,94vw)}
.modal h3{font-size:16px;margin-bottom:10px}.modal p{color:var(--mut);margin-bottom:16px}.modal .input{margin:6px 0 16px}
.modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.modal-head h3{margin:0}
.modal-actions{display:flex;justify-content:flex-end;gap:8px}
.keys{width:100%;border-collapse:collapse}.keys td{padding:9px 4px;border-bottom:1px solid var(--line)}.keys td:last-child{text-align:right}
.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}
.asset{position:relative;aspect-ratio:1;border-radius:12px;overflow:hidden;background:#101011;border:1px solid var(--line);display:grid;place-items:center}
.asset:hover{border-color:var(--blue)}.asset img{width:100%;height:100%;object-fit:cover}.asset span{position:absolute;left:6px;bottom:6px;font-size:11px;background:#000a;padding:1px 7px;border-radius:6px}
.hist-list{display:flex;flex-direction:column;gap:4px}.hrow{display:flex;gap:12px;align-items:center;padding:8px;border-radius:10px;text-align:left}
.hrow:hover{background:#222226}.hrow>span:nth-child(2){flex:1;min-width:0}.hrow b{display:block;font-size:13px}.hrow small{color:var(--mut);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hrow time{color:var(--mut2);font-size:12px}.hth{width:46px;height:46px;border-radius:9px;overflow:hidden;background:#101011;display:grid;place-items:center;flex:none}.hth img{width:100%;height:100%;object-fit:cover}
.lightbox{position:fixed;inset:0;z-index:700;background:#000d;display:flex;align-items:center;justify-content:center;gap:16px}
.lb-media{max-width:80vw;max-height:86vh;display:flex;align-items:center;justify-content:center;position:relative}
.lb-media .media{max-width:80vw;max-height:86vh;border-radius:12px}.lb-media .text-out{max-width:600px;background:#171719;padding:20px;border-radius:12px;white-space:pre-wrap}
.lb-x{position:absolute;top:18px;right:18px}.lb-nav{width:44px;height:44px;border-radius:50%;background:#222;display:grid;place-items:center}.lb-nav:hover{background:#333}
.lb-media .mock-play{display:none}

/* ================= DASHBOARD ================= */
.dash{display:flex;height:100%}
.side{width:244px;flex:none;padding:18px 14px;display:flex;flex-direction:column;gap:6px;overflow:auto}
.brand{display:flex;align-items:center;gap:10px;padding:4px 10px 12px;font-size:22px;font-weight:700;letter-spacing:-.5px}
.logo{width:32px;height:32px;border-radius:9px;background:linear-gradient(135deg,#6b7bff,#a77bff);display:grid;place-items:center}
.create{display:flex;align-items:center;gap:12px;padding:6px 8px;border-radius:12px;font-weight:600;margin-bottom:10px}
.create span{width:32px;height:32px;border-radius:10px;background:#ff4d9e;display:grid;place-items:center}
.create:hover{background:#18181a}
.side nav{display:flex;flex-direction:column;gap:2px}
.side nav a{display:flex;gap:12px;align-items:center;padding:9px 12px;border-radius:10px;color:#d6d6da;font-size:14px}
.side nav a:hover{background:#18181a}.side nav a.act{background:#232326;color:#fff}
.side hr{border:0;border-top:1px solid var(--line);margin:12px 8px}
.side-foot{margin-top:auto;display:flex;gap:6px;padding:10px;color:var(--mut);justify-content:space-between}
.dmain{flex:1;min-width:0;margin:10px 10px 10px 0;background:#101011;border-radius:22px;border:1px solid #1c1c1e;padding:20px 26px;overflow:auto}
.dtop{display:flex;align-items:center;gap:16px;margin-bottom:14px}
.proj{display:flex;gap:9px;align-items:center;color:#ccc;font-size:13px}.dot{width:13px;height:13px;border-radius:4px;background:#ffc93c;display:inline-block}
.banner{margin:0 auto;display:flex;gap:12px;align-items:center;background:#161618;border:1px solid var(--line);border-radius:999px;padding:7px 16px;font-size:13px}
.banner .new{font-size:11px;background:#2a1f3a;color:#e5a8ff;padding:2px 8px;border-radius:6px}.banner em{color:var(--mut);font-style:normal}
.dtr{display:flex;gap:10px;align-items:center}
.share-btn{display:flex;align-items:center;gap:7px;background:#f4f4f5;color:#111;font-weight:600;padding:8px 16px;border-radius:10px;font-size:13px}
.share-btn:hover{background:#fff}
.avatar{width:32px;height:32px;border-radius:50%;background:#6a35d6;display:grid;place-items:center;font-weight:600;font-size:13px;box-shadow:0 0 0 2px #151516,0 0 0 3px #7a5cff}
h1{font-size:46px;letter-spacing:-1.5px;margin:8px 0 6px}
.sub{color:var(--mut);margin-bottom:22px}
.hint-bar{display:inline-flex;align-items:center;gap:12px;background:#151517;border:1px solid var(--line);border-radius:14px;padding:10px 14px;margin-bottom:28px}
.hb-ic{width:34px;height:34px;border-radius:50%;background:#222;display:grid;place-items:center;color:#c9b8ff}
.hint-bar i{width:1px;height:18px;background:var(--line)}.see{color:var(--mut)}.see:hover{color:#fff}
.tabs-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px;gap:12px;flex-wrap:wrap}
.tabs,.tools{display:flex;gap:6px;align-items:center}
.tabs button{display:flex;gap:8px;align-items:center;padding:9px 16px;border-radius:12px;color:var(--mut);font-weight:500}
.tabs button.on{background:#25252a;color:#fff}.tabs button:hover{color:#fff}
.tools button{display:flex;gap:7px;align-items:center;padding:9px 14px;border-radius:10px;background:#1d1d20;font-size:13px;font-weight:500}
.tools .newspace{background:#fff;color:#000;font-weight:600}.tools button:hover{filter:brightness(1.15)}
.tools .sq{padding:9px 10px}.sbox{display:flex;align-items:center;gap:6px}.sbox input{background:#18181a;border:1px solid var(--line);border-radius:10px;padding:8px 12px;outline:0;width:180px}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:16px}
.cards.list{grid-template-columns:1fr}.cards.list .card{display:grid;grid-template-columns:150px 1fr auto;align-items:center}.cards.list .th{aspect-ratio:auto;height:90px}
.card{background:#171719;border:1px solid #202023;border-radius:18px;overflow:hidden;cursor:pointer;transition:.18s;position:relative}
.card:hover{border-color:#3a3a42;transform:translateY(-2px)}
.card .th{aspect-ratio:3/2;background:#111112;position:relative;display:grid;place-items:center;overflow:hidden;background-image:radial-gradient(#26262a 1px,transparent 1px);background-size:16px 16px}
.th svg{width:100%;height:100%}.th-empty{color:#444}
.tpl .use{position:absolute;bottom:10px;right:10px;background:#fff;color:#000;font-weight:600;font-size:12px;padding:6px 12px;border-radius:8px;opacity:0;transition:.15s}.tpl:hover .use{opacity:1}
.card .meta{display:flex;justify-content:space-between;gap:10px;padding:12px 14px 4px;font-size:13px}
.card .meta b{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card time{color:var(--mut2);font-size:12px;white-space:nowrap}
.card .foot{display:flex;justify-content:space-between;align-items:center;padding:4px 14px 12px;color:var(--mut)}
.card .foot small{color:var(--mut);font-size:12px}.status{display:flex;align-items:center;gap:6px;font-size:12px}.status em{font-style:normal}
.more{width:30px;height:28px;border-radius:8px;display:grid;place-items:center;color:var(--mut)}.more:hover{background:#2a2a2e;color:#fff}
.d-empty{grid-column:1/-1;display:flex;flex-direction:column;align-items:center;gap:8px;padding:70px 0;color:var(--mut)}.d-empty b{color:#ddd;font-size:15px}

/* ================= EDITOR ================= */
.editor{position:relative;height:100%;display:flex;flex-direction:column;background:var(--bg)}
.topbar{height:62px;flex:none;display:flex;align-items:center;justify-content:space-between;padding:0 22px;gap:16px;z-index:20}
.crumb{display:flex;align-items:center;gap:10px;color:#bbb;font-size:13px;min-width:0}
.crumb .dot{width:14px;height:14px}.crumb a:hover{color:#fff}.crumb .ci{color:var(--mut)}
.space-name{font-weight:500;color:#e8e8ea;padding:4px 6px;border-radius:7px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.space-name:hover{background:#1d1d20}
.save-state{font-size:11px;color:var(--mut2);margin-left:6px}.save-state[data-s=error]{color:var(--red)}.save-state[data-s=saved]{opacity:.7}
.tb-btn{height:36px;border-radius:10px;display:grid;place-items:center;color:#ddd}.tb-btn.sq{width:36px;background:#18181a;border:1px solid #232326}.tb-btn:hover{background:#242427}
.tb-right{display:flex;align-items:center;gap:10px}
.pill{display:flex;gap:8px;align-items:center;background:#18181a;border:1px solid var(--line);border-radius:10px;height:36px;padding:0 14px;font-size:13px;font-weight:500}.pill:hover{background:#242427;border-color:var(--line2)}
.canvas{position:relative;flex:1;margin:0 12px 12px;border:1px solid #1d1d20;border-radius:20px;overflow:hidden;outline:0;background:#0e0e0f radial-gradient(#26262a 1.2px,transparent 1.2px);background-size:24px 24px;touch-action:none;cursor:default}
.canvas[data-tool=hand]{cursor:grab}.canvas.panning{cursor:grabbing!important}.canvas[data-tool=cut]{cursor:crosshair}
.world{position:absolute;left:0;top:0;transform-origin:0 0;width:0;height:0}
.edges{position:absolute;left:0;top:0;overflow:visible;z-index:1;pointer-events:none}
.nodes{position:absolute;left:0;top:0;z-index:2}
.edge .line{fill:none;stroke-width:2.2;stroke-linecap:round;opacity:.85;transition:opacity .15s}
.edge .hit{fill:none;stroke:transparent;stroke-width:18;pointer-events:stroke;cursor:pointer}
.edge:hover .line,.edge .line.sel{opacity:1;stroke-width:3}
.edge .line.batch{stroke-dasharray:3 6}
.edge .line.flowing{stroke-dasharray:8 8;animation:flow .6s linear infinite}
.edges .line.temp{stroke-width:2.4;stroke-dasharray:2 6;opacity:.95;pointer-events:none}
@keyframes flow{to{stroke-dashoffset:-16}}
.edge-tool{position:absolute;z-index:6;transform:translate(-50%,-50%)}
.edge-tool button{width:30px;height:30px;border-radius:50%;background:#26262a;border:1px solid var(--line2);display:grid;place-items:center;transform:scale(calc(1/var(--z,1)));box-shadow:0 4px 14px #0009}
.edge-tool button:hover{background:var(--red);border-color:var(--red)}
.marquee{position:absolute;border:1px solid var(--blue);background:#4d7dff1c;border-radius:4px;pointer-events:none;z-index:9}
.cutline{position:absolute;width:10px;height:10px;border-radius:50%;background:#ff5d6c;pointer-events:none;z-index:9}
.drop-hint{position:absolute;inset:14px;border:2px dashed var(--blue);border-radius:18px;background:#4d7dff14;display:flex;flex-direction:column;gap:10px;align-items:center;justify-content:center;pointer-events:none;z-index:8;color:#bcd}
.hide-ui .topbar,.hide-ui .ltool,.hide-ui .bl{display:none}

/* toolbars */
.ltool{position:absolute;left:26px;top:50%;transform:translateY(-50%);z-index:15;display:flex;flex-direction:column;gap:10px;align-items:center}
.lt-group{display:flex;flex-direction:column;gap:2px;padding:6px;background:#161617;border:1px solid #232326;border-radius:18px;box-shadow:0 10px 30px #0006}
.lt{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;color:#a0a0a8;position:relative}
.lt:hover:not(:disabled){background:#242427;color:#fff}.lt.on{background:#2c2c30;color:#fff}
.lt.accent{width:42px;height:42px;background:#18181a;border:1px solid #2b2b2f;color:#fff;border-radius:14px}.lt.accent:hover{background:#26262a}
.lt.auto em{position:absolute;left:50%;bottom:-6px;transform:translateX(-50%);font:600 8px Inter;color:#6fe0a4;font-style:normal;background:#161617;padding:0 2px}
.lt.auto:not(.on) em{color:var(--mut2)}
.bl{position:absolute;left:26px;bottom:26px;z-index:15}
.pager{display:flex;align-items:center;gap:9px;background:#161617;border:1px solid #232326;border-radius:12px;padding:9px 14px;font-size:13px}.pager:hover{background:#202023}
.br{position:absolute;right:26px;bottom:26px;z-index:15;display:flex;gap:8px;align-items:center}
.br-btn{display:flex;align-items:center;gap:8px;background:#161617;border:1px solid #232326;border-radius:12px;height:38px;padding:0 13px;font-size:13px;color:#d0d0d4}
.br-btn.sq{width:38px;padding:0;justify-content:center}.br-btn:hover{background:#202023}.br-btn.on{background:#2b2b30}
.br-btn.zoom{min-width:78px;justify-content:space-between}
.minimap{position:absolute;right:26px;bottom:76px;z-index:14;width:220px;height:150px;background:#121213ee;border:1px solid #2a2a2d;border-radius:14px;box-shadow:0 10px 30px #0008;cursor:pointer}

/* ================= NODES ================= */
.node{position:absolute;color:var(--txt);user-select:none}
.node.top{z-index:5}.node:hover{z-index:4}.node.nt-group{z-index:0}
.node-title{display:flex;align-items:center;gap:6px;height:24px;padding:0 4px;font-size:11px;font-weight:600;color:#cfcfd4;cursor:grab;white-space:nowrap}
.node-title .ti{color:var(--mut)}.node-title .tt{overflow:hidden;text-overflow:ellipsis}
.card{position:relative;background:var(--card);border:1px solid var(--line);border-radius:18px}
.node.selected .card,.node.selected .note,.node.selected .group-frame{border-color:var(--blue);box-shadow:0 0 0 1px var(--blue),0 12px 40px #0007}
.node:hover .card{border-color:#3a3a40}.node.selected:hover .card{border-color:var(--blue)}
.gen .preview{position:relative;overflow:hidden;background:#101011;border-radius:17px;display:flex;align-items:center;justify-content:center}
.gen.empty .preview{min-height:236px}
.gen.has-media .preview{border-radius:17px 17px 0 0}
.node:not(.selected) .gen.has-media .controls{display:none}
.node:not(.selected) .gen.has-media .preview{border-radius:17px}
.node.selected .gen.has-media .controls{position:static;background:none;padding:10px 12px 12px}
.node.selected .gen.has-media .preview{border-radius:17px 17px 0 0}
.gen .controls{position:absolute;left:0;right:0;bottom:0;padding:10px 12px 12px;display:flex;flex-direction:column;gap:8px;background:linear-gradient(transparent,#171718 38%)}
.gen.empty .controls{border-radius:0 0 17px 17px}
.gen.compact .controls{position:static;background:none;display:flex!important}
.gen.compact.empty .preview{min-height:64px}
.gen.compact.has-media .preview{min-height:80px;aspect-ratio:auto!important}
.node:not(.selected) .gen.compact.has-media .controls{display:none!important}
.empty-ph{color:#3a3a40}
.media{display:block;width:100%;height:100%;object-fit:cover}
.mock-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;background:#000a;display:grid;place-items:center;pointer-events:none;border:1px solid #fff3}
.text-out{padding:14px;font-size:13px;line-height:1.5;max-height:240px;overflow:auto;width:100%;white-space:pre-wrap;user-select:text;color:#e6e6ea}
.audio-out{width:100%;padding:14px;display:flex;flex-direction:column;gap:10px}.audio-out audio{width:100%;height:34px}
.wave{display:flex;align-items:center;gap:3px;height:48px}.wave i{flex:1;background:linear-gradient(var(--c-audio),#ff6a3c);border-radius:2px;opacity:.85}
.gen-state{position:absolute;left:18px;bottom:16px;right:70px;display:flex;flex-direction:column;align-items:flex-start;gap:5px;color:#c9c9ce;font-size:12px;text-align:left}
.gen-time{color:#6c6c74;font-size:11px;min-height:14px}
.gen .preview .run-btn.stop{position:absolute;right:14px;bottom:12px;margin:0;width:34px;height:34px;border-radius:50%;z-index:3;background:#fff;color:#000}
.node.st-running .gen .controls,.node.st-pending .gen .controls{display:none!important}
.node.st-running .gen .preview,.node.st-pending .gen .preview{aspect-ratio:auto!important;min-height:250px;background:#0a0a0a;border-radius:17px;align-items:flex-end;justify-content:flex-start}
.err-banner{position:absolute;left:8px;right:8px;top:8px;display:flex;gap:8px;align-items:flex-start;background:#3a1519ee;border:1px solid #7a2a33;color:#ffb3bb;border-radius:10px;padding:8px 10px;font-size:12px;z-index:2}
.hist{position:absolute;left:50%;bottom:8px;transform:translateX(-50%);display:flex;align-items:center;gap:4px;background:#000b;border-radius:999px;padding:3px 6px;font-size:11px;z-index:2}
.hist button{width:22px;height:22px;display:grid;place-items:center;border-radius:50%}.hist button:hover:not(:disabled){background:#fff2}
.node.st-running .card::before,.node.st-running .card::after,.node.st-pending .card::before,.node.st-pending .card::after{content:"";position:absolute;inset:-1px;border-radius:19px;padding:2px;background:conic-gradient(from var(--a,0deg),transparent 0deg,transparent 190deg,#2f6bff 235deg,#17c8d8 280deg,#3ee08f 322deg,#b6ffd9 345deg,transparent 360deg);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;animation:rot 2.6s linear infinite;pointer-events:none;z-index:4}
.node.st-running .card::after,.node.st-pending .card::after{inset:-5px;padding:6px;border-radius:23px;filter:blur(9px);opacity:.85}
.node.st-pending .card::before,.node.st-pending .card::after{opacity:.55}
@property --a{syntax:'<angle>';inherits:false;initial-value:0deg}
@keyframes rot{to{--a:360deg}}
.node.st-failed .card{border-color:#7a2a33}
.node.st-completed .card{animation:done .9s ease-out}
@keyframes done{0%{box-shadow:0 0 0 0 #34d39988}100%{box-shadow:0 0 0 14px #34d39900}}

/* generator controls */
.refs{display:flex;gap:6px;align-items:center}
.mini-add{width:26px;height:26px;border-radius:50%;background:#26262a;display:grid;place-items:center;color:#bbb}.mini-add:hover{background:#34343a;color:#fff}
.thumb{width:26px;height:26px;border-radius:7px;overflow:hidden;border:1px solid #3a3a40;display:block}.thumb img{width:100%;height:100%;object-fit:cover;display:block}
.prompt{width:100%;resize:none;background:transparent;border:0;outline:0;font-size:12px;line-height:1.5;color:#e8e8ea;min-height:44px;max-height:90px;user-select:text;overflow:auto}
.prompt::placeholder{color:#6a6a72}
.conn-text{display:flex;gap:6px;align-items:flex-start;font-size:11px;color:#7da4ff;background:#4f8cff14;border-radius:8px;padding:5px 8px;max-height:46px;overflow:hidden}
.conn-text span{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.conn-text .ic{margin-top:2px}
.node:not(.selected) .srow,.node:not(.selected) .refs{display:none}
.node:not(.selected) .gen.empty .refs{display:flex}
.node:not(.selected) .gen.empty .controls .seg{display:none}
.srow{display:flex;align-items:center;gap:6px 6px;flex-wrap:wrap;font-size:11px}.srow.wrapr{flex-wrap:wrap}
.chip{display:flex;align-items:center;gap:5px;height:26px;padding:0 8px;border-radius:8px;background:#232326;font-size:11px;font-weight:500;color:#d6d6da;white-space:nowrap}
.chip:hover{background:#2f2f34}.chip span{max-width:84px;overflow:hidden;text-overflow:ellipsis}
.stepper{display:flex;align-items:center;gap:2px;height:26px;color:#9a9aa2;font-size:11px}
.stepper button{width:18px;height:22px;display:grid;place-items:center;border-radius:5px}.stepper button:hover{background:#2a2a2e;color:#fff}
.icon-btn{width:26px;height:26px;border-radius:8px;display:grid;place-items:center;color:#9a9aa2}.icon-btn:hover{background:#2a2a2e;color:#fff}
.run-btn{margin-left:auto;height:30px;min-width:30px;padding:0 9px;border-radius:999px;background:#f2f2f4;color:#111;display:flex;align-items:center;gap:5px;justify-content:center;font-size:11px}
.run-btn:hover{background:#fff;transform:scale(1.05)}.run-btn.stop{background:#fff;padding:0}.run-btn b{font-weight:700}
.toggle{display:flex;align-items:center;gap:5px;cursor:pointer;color:#9a9aa2;font-size:11px}.toggle input{display:none}
.toggle i{width:24px;height:14px;border-radius:9px;background:#38383d;position:relative;transition:.15s}.toggle i::after{content:"";position:absolute;left:2px;top:2px;width:10px;height:10px;border-radius:50%;background:#fff;transition:.15s}
.toggle input:checked+i{background:#4d7dff}.toggle input:checked+i::after{left:12px}
.seg{display:flex;background:#101011;border-radius:9px;padding:2px}.seg button{padding:4px 10px;border-radius:7px;font-size:11px;color:var(--mut)}.seg button.on{background:#2c2c30;color:#fff}
.slider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--mut);flex:1;min-width:120px}.slider input{flex:1;accent-color:#4d7dff}

/* ports */
.port{position:absolute;width:28px;height:28px;border-radius:50%;background:#1d1d20;border:1.5px solid #33333a;display:grid;place-items:center;color:#8b8b95;cursor:crosshair;z-index:3;transition:transform .12s,background .12s,border-color .12s}
.port.in{left:-22px}.port.out{left:calc(100% - 6px)}
.port:hover,.port.hot{transform:scale(1.18);color:#fff}
.port.on,.port:hover{border-color:currentColor}
.port.t-image{--pc:var(--c-image)}.port.t-text{--pc:var(--c-text)}.port.t-video{--pc:var(--c-video)}.port.t-audio{--pc:var(--c-audio)}
.port.on{color:var(--pc);background:#1d1d20}.port:hover{color:var(--pc);border-color:var(--pc)}
.port.can-drop{border-color:var(--pc);color:var(--pc);box-shadow:0 0 0 4px color-mix(in srgb,var(--pc) 22%,transparent);animation:pulse 1s infinite}
.port.hot{background:var(--pc);color:#fff;border-color:var(--pc);box-shadow:0 0 0 6px color-mix(in srgb,var(--pc) 30%,transparent)}
.port.dim{opacity:.25}
@keyframes pulse{50%{box-shadow:0 0 0 7px color-mix(in srgb,var(--pc) 8%,transparent)}}
.port::after{content:attr(data-label);position:absolute;top:50%;transform:translateY(-50%);background:#26262a;border:1px solid var(--line2);color:#fff;font-size:10px;font-weight:600;white-space:nowrap;padding:3px 8px;border-radius:7px;opacity:0;pointer-events:none;transition:.12s;transform-origin:center}
.port.in::after{right:36px}.port.out::after{left:36px}
.port:hover::after{opacity:1}.canvas.connecting .port::after{display:none}

/* action bar */
.abar{position:absolute;left:0;bottom:calc(100% + 8px);display:none;align-items:center;gap:2px;padding:4px;background:#1a1a1c;border:1px solid var(--line2);border-radius:12px;box-shadow:0 8px 26px #000a;z-index:9;white-space:nowrap;cursor:default}
.node.single .abar{display:flex}
.abar button{height:28px;min-width:28px;border-radius:8px;display:grid;place-items:center;color:#c9c9ce}
.abar button:hover{background:#2c2c30;color:#fff}
.abar .split{display:flex;background:#24242a;border-radius:8px}.abar .split button:first-child{min-width:30px;border-radius:8px 0 0 8px}.abar .split button:last-child{min-width:22px;border-radius:0 8px 8px 0;border-left:1px solid #111}
.abar .sep{width:1px;height:18px;background:var(--line);margin:0 3px}

/* simple nodes */
.textcard{min-height:150px;display:flex;flex-direction:column}
.text-area{flex:1;width:100%;min-height:130px;resize:vertical;background:transparent;border:0;outline:0;padding:14px;color:#ececee;font-size:13px;line-height:1.55;user-select:text}
.text-tools,.node .note .text-tools{display:none;gap:6px;padding:0 12px 10px}.node.selected .text-tools{display:flex}
.sw{width:16px;height:16px;border-radius:50%;border:1px solid #fff3}.sw.on{outline:2px solid #fff;outline-offset:1px}
.listcard{padding:10px}.list-body{display:flex;flex-direction:column;gap:6px}
.list-row{display:flex;align-items:center;gap:8px}.list-row input[type=checkbox]{accent-color:#4d7dff;width:15px;height:15px}
.li-text{flex:1;min-width:0;background:#101011;border:1px solid var(--line);border-radius:9px;padding:7px 10px;outline:0;font-size:12px}.li-text:focus{border-color:var(--blue)}
.list-row .x{width:22px;height:22px}
.add-item{margin-top:8px;display:flex;gap:6px;align-items:center;color:var(--mut);font-size:12px;padding:6px 4px}.add-item:hover{color:#fff}
.media-card{overflow:hidden}.media-card .preview{position:relative;display:block}.media-card .media{height:auto}
.dropzone{min-height:190px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--mut);text-align:center;font-size:12px;cursor:pointer;border-radius:17px}
.dropzone b{color:#ddd;font-size:14px}.dropzone:hover{background:#1c1c1f;color:#bbb}
.note{border-radius:6px;min-height:170px;display:flex;flex-direction:column;color:#201a00;box-shadow:0 10px 24px #0006;border:2px solid transparent}
.note textarea{flex:1;min-height:140px;width:100%;resize:none;background:transparent;border:0;outline:0;padding:14px;color:#2b2200;font-size:14px;line-height:1.4;font-weight:500;user-select:text}
.note textarea::placeholder{color:#2b220077}
.group-frame{position:absolute;inset:0;border:1.5px dashed #3a3a42;background:#ffffff06;border-radius:18px;pointer-events:none}
.group-head{pointer-events:auto;height:34px;padding:6px 10px;cursor:grab}
.group-label{background:transparent;border:0;outline:0;font-weight:600;font-size:13px;color:#cfcfd4;width:70%;pointer-events:auto}
.resize{position:absolute;right:0;bottom:0;width:22px;height:22px;cursor:nwse-resize;pointer-events:auto;background:linear-gradient(135deg,transparent 50%,#555 50%,#555 56%,transparent 56%,transparent 70%,#555 70%,#555 76%,transparent 76%);border-radius:0 0 18px 0}
.node.nt-group{pointer-events:none}.node.nt-group .group-head,.node.nt-group .resize,.node.nt-group .abar{pointer-events:auto}
.node.nt-group.selected .group-frame{border-style:solid}

/* model picker / advanced */
.mpick{width:260px;background:#1b1b1e;border:1px solid var(--line2);border-radius:14px;padding:8px;box-shadow:0 14px 40px #000a}
.mp-search{display:flex;align-items:center;gap:8px;padding:6px 8px;color:var(--mut);border-bottom:1px solid var(--line);margin-bottom:6px}.mp-search input{flex:1;background:none;border:0;outline:0;color:#fff;font-size:13px}
.mp-list{max-height:260px;overflow:auto;display:flex;flex-direction:column;gap:1px}
.mp-item{display:flex;align-items:center;gap:10px;padding:8px;border-radius:9px;font-size:13px;text-align:left}.mp-item span:nth-child(2){flex:1}
.mp-item:hover,.mp-item.cur{background:#28282d}.mp-ic{width:24px;height:24px;border-radius:7px;background:#1f3a2f;color:#7be0b0;display:grid;place-items:center;font-weight:700;font-size:12px}
.mp-item em{font-style:normal;font-size:10px;background:#3a2a14;color:#ffbd66;padding:1px 7px;border-radius:5px}.mp-item small{color:var(--mut2)}
.adv{width:280px;background:#1b1b1e;border:1px solid var(--line2);border-radius:14px;padding:14px;display:flex;flex-direction:column;gap:12px;font-size:12px;color:var(--mut);box-shadow:0 14px 40px #000a}
.adv label{display:flex;flex-direction:column;gap:6px}.adv .input{margin:0;font-size:12px}.adv textarea{resize:vertical}

/* spotlight */
.spot-back{position:fixed;inset:0;z-index:400;display:flex;justify-content:center;align-items:flex-start;padding-top:9vh;background:#0004}
.spot{width:340px;max-height:78vh;display:flex;flex-direction:column;background:#161618f2;backdrop-filter:blur(14px);border:1px solid var(--line2);border-radius:20px;box-shadow:0 24px 70px #000b;overflow:hidden;animation:pin .15s var(--ease)}
.spot-search{display:flex;gap:10px;align-items:center;padding:16px 18px 10px;color:var(--mut)}
.spot-search input{flex:1;background:none;border:0;outline:0;font-size:19px;font-weight:500;color:#fff}.spot-search input::placeholder{color:#55555c}
.spot-tabs{display:flex;gap:6px;padding:4px 14px 10px;overflow-x:auto;scrollbar-width:none;flex:none}.spot-tabs::-webkit-scrollbar{display:none}
.spot-tabs button{padding:5px 12px;border-radius:999px;background:#232326;font-size:12px;font-weight:500;color:#c8c8cd;white-space:nowrap}.spot-tabs button.on{background:#fff;color:#000}
.spot-list{overflow:auto;padding:0 8px 8px;flex:1;min-height:120px}
.spot-sec{font-size:10px;letter-spacing:.08em;color:var(--mut2);text-transform:uppercase;padding:12px 10px 5px}
.spot-item{display:flex;align-items:center;gap:12px;padding:7px 10px;border-radius:11px;cursor:pointer}
.spot-item.sel{background:#26262b}.spot-item b{display:block;font-size:13px;font-weight:500}.spot-item small{color:#5f5f66;font-size:11px}.spot-item .pin{margin-left:auto;color:#9a9aa2}
.si{width:34px;height:34px;border-radius:10px;background:#222226;display:grid;place-items:center;color:#aaa;flex:none}
.si.c-image{background:#241f3a;color:#b497ff}.si.c-video{background:#17302a;color:#4fe0a6}.si.c-text{background:#1b2640;color:#7ba7ff}.si.c-audio{background:#3a2916;color:#ffb066}
.spot-empty{padding:30px;text-align:center;color:var(--mut)}
.spot-foot{display:flex;gap:14px;padding:9px 14px;border-top:1px solid var(--line);font-size:11px;color:var(--mut2)}
.spot-tip{position:fixed;z-index:401;width:280px;background:#171719;border:1px solid var(--line2);border-radius:16px;padding:12px;box-shadow:0 18px 50px #000a;display:none;pointer-events:none}
.spot-tip .tip-art{height:120px;border-radius:10px;background:linear-gradient(135deg,#1c2238,#2a1c3a);display:grid;place-items:center;color:#8f9bff;margin-bottom:12px}
.spot-tip b{display:flex;gap:7px;align-items:center;font-size:13px;margin-bottom:5px}.spot-tip p{color:var(--mut);font-size:12px;line-height:1.5;margin-bottom:10px}
.tags{display:flex;gap:5px;flex-wrap:wrap}.tags span{font-size:10px;background:#26262a;padding:3px 8px;border-radius:6px;color:#c7c7cc}
.tags .pt.t-text{color:var(--c-text)}.tags .pt.t-image{color:var(--c-image)}.tags .pt.t-video{color:var(--c-video)}.tags .pt.t-audio{color:var(--c-audio)}
@media (max-width:900px){.side{display:none}.banner{display:none}.spot-tip{display:none!important}.lt-group{padding:3px}.topbar .pill{display:none}}
.node.st-running.selected .card,.node.st-pending.selected .card{border-color:#34343a;box-shadow:none}
