/* ============================================================
   NEXUS · Game Dev Planner  —  Theme
   ============================================================ */
:root{
  --bg:#0a0c12;
  --bg-2:#0e111a;
  --panel:#11141f;
  --panel-2:#161a28;
  --panel-3:#1b2030;
  --stroke:#232838;
  --stroke-soft:#1a1e2b;
  --text:#e8ebf5;
  --text-dim:#9aa3bd;
  --text-faint:#5e667e;
  --accent:#6c8cff;
  --accent-2:#a06bff;
  --accent-glow:rgba(108,140,255,.55);
  --good:#3ddc97;
  --warn:#ffcc66;
  --bad:#ff6b7d;
  --radius:16px;
  --radius-sm:11px;
  --shadow:0 18px 50px -12px rgba(0,0,0,.7);
  --ease:cubic-bezier(.22,.61,.36,1);
  --ease-bounce:cubic-bezier(.34,1.56,.64,1);
}

*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:'Inter',system-ui,sans-serif;
  background:radial-gradient(1200px 800px at 75% -10%,#141a2e 0%,var(--bg) 55%);
  color:var(--text);
  overflow:hidden;
  -webkit-font-smoothing:antialiased;
  user-select:none;
  height:100vh;
}
.app-shell{
  display:grid;
  grid-template-columns:216px 1fr 320px;
  grid-template-rows:60px 1fr;
  grid-template-areas:
    "top top top"
    "tool stage insp";
  height:100vh;
}
/* screens default to a layout display, so [hidden] needs an explicit override */
.app-shell[hidden],.auth-screen[hidden],.dash[hidden]{display:none}
::selection{background:var(--accent-glow);color:#fff}

button{font-family:inherit;cursor:pointer;color:inherit;border:none;background:none}
svg{width:1em;height:1em}

/* ============================================================
   TOP BAR
   ============================================================ */
.topbar{
  grid-area:top;
  display:flex;align-items:center;gap:18px;
  padding:0 18px;
  background:linear-gradient(180deg,rgba(20,25,42,.85),rgba(14,17,26,.7));
  backdrop-filter:blur(18px);
  border-bottom:1px solid var(--stroke);
  z-index:30;
}
.brand{display:flex;align-items:center;gap:12px;padding-right:6px}
.brand-logo{
  width:38px;height:38px;border-radius:11px;
  display:grid;place-items:center;font-size:22px;color:#fff;
  background:linear-gradient(135deg,var(--accent),var(--accent-2));
  box-shadow:0 6px 20px -4px var(--accent-glow);
  animation:logoFloat 5s var(--ease) infinite;
}
@keyframes logoFloat{0%,100%{transform:translateY(0) rotate(0)}50%{transform:translateY(-3px) rotate(-3deg)}}
.brand-text{display:flex;flex-direction:column;line-height:1.05}
.brand-name{font-family:'Space Grotesk';font-weight:700;font-size:18px;letter-spacing:.5px;
  background:linear-gradient(90deg,#fff,#c8d2ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.brand-sub{font-size:10.5px;color:var(--text-faint);letter-spacing:1.5px;text-transform:uppercase}

.board-switch{display:flex;align-items:center;gap:7px;flex:1;overflow-x:auto;scrollbar-width:none;padding:4px 0}
.board-switch::-webkit-scrollbar{display:none}
.board-tab{
  display:flex;align-items:center;gap:8px;
  padding:8px 14px;border-radius:11px;
  font-size:13px;font-weight:600;white-space:nowrap;
  color:var(--text-dim);
  background:var(--panel-2);
  border:1px solid var(--stroke-soft);
  transition:all .25s var(--ease);
  position:relative;
}
.board-tab:hover{color:var(--text);transform:translateY(-1px);border-color:var(--stroke)}
.board-tab.active{
  color:#fff;
  background:linear-gradient(135deg,rgba(108,140,255,.22),rgba(160,107,255,.16));
  border-color:transparent;
  box-shadow:0 0 0 1px var(--accent-glow),0 8px 22px -10px var(--accent-glow);
}
.board-tab .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;box-shadow:0 0 8px currentColor}
.board-tab .tab-x{opacity:0;font-size:15px;margin-left:-2px;width:0;transition:all .2s;color:var(--text-faint)}
.board-tab:hover .tab-x{opacity:.7;width:14px}
.board-tab .tab-x:hover{color:var(--bad)}
.board-tab-name{outline:none}
.board-tab-name[contenteditable]{cursor:text}

.topbar-actions{display:flex;align-items:center;gap:8px}
.divider-v{width:1px;height:24px;background:var(--stroke)}

.btn{
  display:inline-flex;align-items:center;gap:7px;
  padding:9px 14px;border-radius:11px;font-size:13px;font-weight:600;
  transition:all .22s var(--ease);
}
.btn svg{font-size:17px}
.btn.ghost{background:var(--panel-2);border:1px solid var(--stroke-soft);color:var(--text-dim)}
.btn.ghost:hover{color:#fff;border-color:var(--stroke);transform:translateY(-1px);box-shadow:var(--shadow)}
.btn.icon{padding:9px;width:38px;justify-content:center}
.btn.primary{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;box-shadow:0 6px 18px -6px var(--accent-glow)}
.btn.primary:hover{transform:translateY(-1px);box-shadow:0 10px 26px -6px var(--accent-glow)}
.btn:disabled{opacity:.32;pointer-events:none}

/* ============================================================
   LEFT TOOLBAR
   ============================================================ */
.toolbar{
  grid-area:tool;
  display:flex;flex-direction:column;align-items:center;gap:8px;
  padding:14px 10px;
  background:linear-gradient(180deg,var(--panel),var(--bg-2));
  border-right:1px solid var(--stroke);
  z-index:20;
}
.tool{
  width:54px;height:54px;border-radius:14px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  font-size:9.5px;font-weight:600;letter-spacing:.3px;
  color:var(--text-dim);
  background:var(--panel-2);
  border:1px solid var(--stroke-soft);
  transition:all .25s var(--ease);
  position:relative;overflow:hidden;
}
.tool svg{font-size:20px;transition:transform .3s var(--ease-bounce)}
.tool::before{content:"";position:absolute;inset:0;background:linear-gradient(135deg,var(--accent),var(--accent-2));opacity:0;transition:opacity .25s}
.tool:hover{color:#fff;border-color:transparent;transform:translateY(-2px) scale(1.03);box-shadow:var(--shadow)}
.tool:hover::before{opacity:.16}
.tool:hover svg{transform:scale(1.18) rotate(-4deg)}
.tool:active{transform:translateY(0) scale(.96)}
.tool.dragging-new{box-shadow:0 0 0 2px var(--accent),0 12px 30px -8px var(--accent-glow)}
.tool span,.tool svg{position:relative;z-index:1}
.tool-spacer{flex:1}

/* ============================================================
   STAGE / CANVAS
   ============================================================ */
.stage{
  grid-area:stage;position:relative;overflow:hidden;
  background:var(--bg);cursor:default;
}
.stage.panning{cursor:grabbing}
.stage.space-down{cursor:grab}

.grid-bg{
  position:absolute;inset:-200%;
  background-image:
    radial-gradient(circle,rgba(255,255,255,.05) 1.2px,transparent 1.2px),
    radial-gradient(circle,rgba(108,140,255,.07) 1.2px,transparent 1.2px);
  background-size:32px 32px,160px 160px;
  background-position:0 0,0 0;
  pointer-events:none;
  will-change:transform,background-position;
}

/* wires sit BEHIND the nodes for a clean look (no lines drawn over node content).
   While drawing a connection the wires are made click-through (.stage.linking)
   so the drop lands on the target node. */
.wires{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;z-index:1}
.stage.linking .wire,.stage.linking .wire-hit,.stage.linking .wire-preview{pointer-events:none}
.wire{fill:none;stroke-width:3;stroke-linecap:round;transition:stroke-width .2s;cursor:pointer;pointer-events:stroke}
.wire.hl{stroke-width:4.5}
.wire-hit{fill:none;stroke:transparent;stroke-width:18;pointer-events:stroke;cursor:pointer}
.wire-flow{stroke-dasharray:2 14;animation:flow 1s linear infinite}
@keyframes flow{to{stroke-dashoffset:-16}}
.wire-preview{stroke-dasharray:6 6;opacity:.8;animation:none}
.wire-del{cursor:pointer;pointer-events:all;animation:ctxIn .15s var(--ease)}
.wire-del circle{transition:fill .15s}
.wire-del:hover circle{fill:#ff6b7d}
.wire-del:hover path{stroke:#fff}

.world{position:absolute;top:0;left:0;transform-origin:0 0;z-index:2;will-change:transform}

/* ---- Nodes ---- */
.node{
  position:absolute;
  min-width:180px;max-width:560px;
  border-radius:var(--radius);
  background:linear-gradient(180deg,var(--panel-2),var(--panel));
  border:1px solid var(--stroke);
  box-shadow:var(--shadow);
  transition:box-shadow .25s var(--ease),border-color .2s,transform .12s var(--ease);
  animation:nodeIn .4s var(--ease-bounce) backwards;
  overflow:visible;
}
@keyframes nodeIn{from{opacity:0;transform:scale(.9) translateY(8px)}to{opacity:1;transform:scale(1)}}
/* skip the spawn animation on remote sync / live edits (no constant flashing) */
.node.no-spawn,.comment.no-spawn{animation:none}
/* smooth glide for remotely-moved elements (turned off during local dragging) */
.world.glide .node{transition:left .09s linear,top .09s linear,width .09s linear,box-shadow .25s var(--ease),border-color .2s,transform .12s var(--ease)}
.world.glide .comment{transition:left .09s linear,top .09s linear,width .09s linear,height .09s linear}
.world.glide .node.dragging,.world.glide .comment.dragging{transition:none}
.node:hover{border-color:color-mix(in srgb,var(--nodecolor,#6c8cff) 55%,var(--stroke))}
.node.selected{
  border-color:var(--nodecolor,var(--accent));
  box-shadow:0 0 0 2px var(--nodecolor,var(--accent)),0 0 30px -4px var(--nodecolor,var(--accent-glow)),var(--shadow);
}
.node.dragging{transition:none;cursor:grabbing;z-index:999!important;transform:scale(1.015)}

.node-head{
  display:flex;align-items:center;gap:9px;
  padding:11px 13px;
  border-radius:var(--radius) var(--radius) 0 0;
  background:linear-gradient(180deg,color-mix(in srgb,var(--nodecolor,#6c8cff) 30%,transparent),transparent);
  border-bottom:1px solid var(--stroke-soft);
  cursor:grab;position:relative;
}
.node-head::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:var(--radius) 0 0 0;
  background:var(--nodecolor,var(--accent));box-shadow:0 0 12px var(--nodecolor,var(--accent-glow));
}
.node-ico{
  width:26px;height:26px;border-radius:8px;display:grid;place-items:center;font-size:15px;flex-shrink:0;
  background:color-mix(in srgb,var(--nodecolor,#6c8cff) 22%,transparent);
  color:var(--nodecolor,var(--accent));
}
.node-title{
  flex:1;font-weight:700;font-size:13.5px;color:var(--text);
  font-family:'Space Grotesk';outline:none;border-radius:6px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.node-title[contenteditable]{cursor:text}
.node-title:focus{overflow:visible;white-space:normal}
.node-body{padding:11px 13px;font-size:12.5px;line-height:1.55;color:var(--text-dim)}
.node-text{outline:none;min-height:18px;white-space:pre-wrap;word-break:break-word}
.node-text:empty::before{content:"Text eingeben…";color:var(--text-faint)}
.node-text[contenteditable]{cursor:text}

.node-img{display:block;width:100%;border-radius:0 0 var(--radius) var(--radius);object-fit:cover;max-height:280px;cursor:grab;-webkit-user-drag:none;user-select:none}
.node.dragging .node-img{cursor:grabbing}
.node.type-image .node-body{padding:0}
.node.type-image .node-img-wrap{position:relative}
.node-img-empty{
  padding:30px 16px;text-align:center;color:var(--text-faint);font-size:12px;
  border:1.5px dashed var(--stroke);border-radius:10px;margin:11px 13px;cursor:pointer;
  transition:all .2s;
}
.node-img-empty:hover{border-color:var(--accent);color:var(--accent);background:rgba(108,140,255,.05)}

/* task extras */
.task-meta{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}
.chip{
  display:inline-flex;align-items:center;gap:5px;
  padding:4px 9px;border-radius:20px;font-size:10.5px;font-weight:600;
  background:var(--panel-3);border:1px solid var(--stroke-soft);
}
.chip .av{width:16px;height:16px;border-radius:50%;display:grid;place-items:center;font-size:8px;font-weight:700;color:#fff}
.chip.status-todo{color:var(--text-dim)}
.chip.status-doing{color:var(--warn);background:color-mix(in srgb,var(--warn) 14%,var(--panel-3));border-color:color-mix(in srgb,var(--warn) 30%,transparent)}
.chip.status-done{color:var(--good);background:color-mix(in srgb,var(--good) 14%,var(--panel-3));border-color:color-mix(in srgb,var(--good) 30%,transparent)}
.progress{height:5px;border-radius:3px;background:var(--panel-3);overflow:hidden;margin-top:10px}
.progress>i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,var(--nodecolor,var(--accent)),var(--accent-2));transition:width .5s var(--ease)}

/* ---- Pins (UE5 blueprint connectors) ---- */
.pin{
  position:absolute;width:15px;height:15px;border-radius:50%;
  top:50%;transform:translateY(-50%);
  background:var(--bg);border:2.5px solid var(--nodecolor,var(--accent));
  cursor:crosshair;z-index:5;transition:all .18s var(--ease-bounce);
}
.pin::after{content:"";position:absolute;inset:2px;border-radius:50%;background:var(--nodecolor,var(--accent));transform:scale(0);transition:transform .18s}
.pin:hover{transform:translateY(-50%) scale(1.4);box-shadow:0 0 12px var(--nodecolor,var(--accent-glow))}
.pin:hover::after{transform:scale(1)}
.pin.pin-out{right:-8px}
.pin.pin-in{left:-8px}
.pin.linkable{transform:translateY(-50%) scale(1.5);box-shadow:0 0 14px var(--good)}
.pin.linkable::after{transform:scale(1);background:var(--good)}

/* ---- Comment box (UE5 style) ---- */
.comment{
  position:absolute;border-radius:14px;
  background:color-mix(in srgb,var(--nodecolor,#6c8cff) 9%,transparent);
  border:1.5px solid color-mix(in srgb,var(--nodecolor,#6c8cff) 45%,transparent);
  z-index:0;animation:nodeIn .4s var(--ease-bounce) backwards;
  transition:box-shadow .2s,border-color .2s;
}
.comment:hover{border-color:var(--nodecolor,var(--accent))}
.comment.selected{box-shadow:0 0 0 2px var(--nodecolor,var(--accent)),0 0 30px -6px var(--nodecolor,var(--accent-glow))}
.comment.dragging{transition:none}
.comment-head{
  display:flex;align-items:center;gap:7px;padding:7px 12px;cursor:grab;
  background:color-mix(in srgb,var(--nodecolor,#6c8cff) 22%,transparent);
  border-radius:13px 13px 0 0;font-family:'Space Grotesk';font-weight:700;font-size:13px;
  color:color-mix(in srgb,var(--nodecolor,#fff) 92%,#fff);
}
.comment-head svg{font-size:15px;opacity:.8}
.comment-title{outline:none;flex:1}
.comment-rz{position:absolute;right:0;bottom:0;width:20px;height:20px;cursor:nwse-resize;z-index:6}
.comment-rz::after{content:"";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid var(--nodecolor,var(--accent));border-bottom:2px solid var(--nodecolor,var(--accent));opacity:.6}

/* resize handle for nodes */
.node-rz{position:absolute;right:-2px;bottom:-2px;width:16px;height:16px;cursor:nwse-resize;z-index:6;opacity:0;transition:opacity .2s}
.node:hover .node-rz{opacity:.5}
.node-rz:hover{opacity:1}
.node-rz::after{content:"";position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--text-dim);border-bottom:2px solid var(--text-dim)}

/* ============================================================
   HINT + ZOOM
   ============================================================ */
.hint{
  position:absolute;left:16px;bottom:14px;z-index:10;
  font-size:11px;color:var(--text-faint);
  background:rgba(14,17,26,.7);backdrop-filter:blur(10px);
  padding:8px 13px;border-radius:10px;border:1px solid var(--stroke-soft);
  pointer-events:none;animation:fadeUp .6s var(--ease) .3s backwards;
}
.hint kbd{
  font-family:'JetBrains Mono';font-size:10px;background:var(--panel-3);
  padding:1px 6px;border-radius:5px;border:1px solid var(--stroke);color:var(--text-dim);
}
@keyframes fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1}}

.zoombar{
  position:absolute;right:16px;bottom:14px;z-index:10;
  display:flex;align-items:center;gap:4px;
  background:rgba(14,17,26,.75);backdrop-filter:blur(10px);
  padding:5px;border-radius:12px;border:1px solid var(--stroke-soft);
}
.zoombar button{width:30px;height:30px;border-radius:8px;font-size:18px;font-weight:600;color:var(--text-dim);transition:all .2s}
.zoombar button:hover{background:var(--panel-3);color:#fff}
.zoombar span{font-size:12px;font-weight:600;width:46px;text-align:center;font-family:'JetBrains Mono';color:var(--text-dim)}

/* ============================================================
   INSPECTOR
   ============================================================ */
.inspector{
  grid-area:insp;
  background:linear-gradient(180deg,var(--panel),var(--bg-2));
  border-left:1px solid var(--stroke);
  overflow-y:auto;z-index:20;
}
.inspector::-webkit-scrollbar{width:8px}
.inspector::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}
.insp-empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;color:var(--text-faint);text-align:center;padding:24px}
.insp-empty-ico{font-size:38px;opacity:.4}
.insp-empty p{font-size:13px;line-height:1.6}

.insp-body{padding:18px;animation:fadeUp .3s var(--ease)}
.insp-sec{margin-bottom:22px}
.insp-sec-title{font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:var(--text-faint);margin-bottom:11px;display:flex;align-items:center;gap:7px}
.insp-sec-title::after{content:"";flex:1;height:1px;background:var(--stroke-soft)}

.field{margin-bottom:13px}
.field label{display:block;font-size:11.5px;font-weight:600;color:var(--text-dim);margin-bottom:6px}
.field input[type=text],.field input[type=password],.field input[type=email],.field textarea,.field select{
  width:100%;padding:10px 12px;border-radius:10px;font-family:inherit;font-size:13px;
  background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);
  transition:all .2s;resize:vertical;
}
.field textarea{min-height:80px;line-height:1.5}
.field input:focus,.field textarea:focus,.field select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.field select{cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239aa3bd' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;background-size:16px;padding-right:34px}

/* color picker grid */
.swatches{display:flex;flex-wrap:wrap;gap:8px}
.swatch{
  width:30px;height:30px;border-radius:9px;cursor:pointer;position:relative;
  transition:transform .18s var(--ease-bounce);border:2px solid transparent;
}
.swatch:hover{transform:scale(1.15)}
.swatch.active{border-color:#fff;box-shadow:0 0 0 2px var(--bg),0 0 14px -2px currentColor}
.swatch.active::after{content:"✓";position:absolute;inset:0;display:grid;place-items:center;color:#fff;font-size:13px;font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.5)}
.swatch.custom-sw{display:grid;place-items:center;background:var(--panel-3);border:1.5px solid var(--stroke);overflow:hidden}
.swatch.custom-sw input{position:absolute;inset:-8px;opacity:0;cursor:pointer;width:200%;height:200%}
.swatch.custom-sw svg{font-size:15px;color:var(--text-dim);pointer-events:none}

.seg{display:flex;gap:6px;background:var(--panel-2);padding:4px;border-radius:11px;border:1px solid var(--stroke)}
.seg button{flex:1;padding:8px;border-radius:8px;font-size:12px;font-weight:600;color:var(--text-dim);transition:all .2s}
.seg button.active{background:var(--accent);color:#fff;box-shadow:0 4px 12px -4px var(--accent-glow)}
.seg button:not(.active):hover{color:var(--text);background:var(--panel-3)}

.insp-del{
  width:100%;padding:11px;border-radius:11px;font-weight:600;font-size:13px;
  color:var(--bad);background:color-mix(in srgb,var(--bad) 10%,transparent);
  border:1px solid color-mix(in srgb,var(--bad) 30%,transparent);transition:all .2s;
  display:flex;align-items:center;justify-content:center;gap:8px;
}
.insp-del:hover{background:var(--bad);color:#fff}

.insp-meta{font-size:11px;color:var(--text-faint);font-family:'JetBrains Mono';margin-top:4px}
.grad-preview{height:10px;border-radius:6px;margin:12px 0 8px;box-shadow:0 0 14px -4px var(--accent-glow)}
.grad-ends{display:flex;justify-content:space-between;font-size:11px;color:var(--text-dim)}
.grad-ends span{display:flex;align-items:center;gap:6px}
.grad-ends i{width:12px;height:12px;border-radius:4px;display:inline-block}

/* ============================================================
   CONTEXT MENU
   ============================================================ */
.ctxmenu{
  position:fixed;z-index:100;min-width:180px;
  background:var(--panel-2);border:1px solid var(--stroke);border-radius:12px;
  box-shadow:var(--shadow);padding:6px;
  animation:ctxIn .15s var(--ease);
}
@keyframes ctxIn{from{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1}}
.ctx-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:8px;font-size:13px;color:var(--text-dim);cursor:pointer;transition:all .15s}
.ctx-item svg{font-size:16px}
.ctx-item:hover{background:var(--panel-3);color:#fff}
.ctx-item.danger:hover{background:var(--bad);color:#fff}
.ctx-sep{height:1px;background:var(--stroke-soft);margin:5px 8px}

/* toast */
.toast{
  position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(20px);
  background:var(--panel-2);border:1px solid var(--stroke);border-radius:12px;
  padding:12px 20px;font-size:13px;font-weight:600;color:var(--text);
  box-shadow:var(--shadow);z-index:200;opacity:0;transition:all .35s var(--ease-bounce);
  display:flex;align-items:center;gap:10px;
}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast .t-ico{color:var(--accent);font-size:18px}

/* ============================================================
   LIVE DOT + PEER CURSORS
   ============================================================ */
.live-dot{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.4);transition:all .3s}
.live-dot.active{background:var(--good);box-shadow:0 0 0 0 var(--good);animation:pulse 1.6s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(61,220,151,.6)}70%{box-shadow:0 0 0 7px rgba(61,220,151,0)}100%{box-shadow:0 0 0 0 rgba(61,220,151,0)}}

.marquee{position:absolute;z-index:40;border:1.5px solid var(--accent);border-radius:6px;
  background:rgba(108,140,255,.12);pointer-events:none;box-shadow:0 0 0 1px rgba(108,140,255,.25) inset}

.cursors-layer{position:absolute;inset:0;pointer-events:none;z-index:50}
/* positioned via transform (translate) so it glides smoothly between updates */
.peer-cursor{position:absolute;top:0;left:0;transition:transform .12s linear;will-change:transform;display:flex;align-items:flex-start;gap:0}
.peer-cursor svg{font-size:22px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.5))}
.peer-cursor span{margin-top:14px;margin-left:-4px;font-size:10.5px;font-weight:700;color:#fff;background:var(--cc);padding:2px 7px;border-radius:8px;white-space:nowrap;box-shadow:0 2px 8px rgba(0,0,0,.4)}
/* actively editing/dragging -> subtle ring + glow on the label */
.peer-cursor.busy span{box-shadow:0 0 0 2px color-mix(in srgb,var(--cc) 70%,#fff),0 2px 10px rgba(0,0,0,.45)}
.peer-cursor.busy svg{animation:cursorBusy 1.1s ease-in-out infinite}
@keyframes cursorBusy{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}

/* ============================================================
   MODAL
   ============================================================ */
.modal-wrap{position:fixed;inset:0;z-index:300;display:grid;place-items:center;padding:20px;
  background:rgba(5,7,12,.6);backdrop-filter:blur(8px);animation:fadeUp .2s var(--ease)}
.modal-wrap[hidden]{display:none}   /* class display:grid would otherwise override [hidden] */
.modal{width:100%;max-width:480px;max-height:90vh;overflow-y:auto;
  background:linear-gradient(180deg,var(--panel-2),var(--panel));
  border:1px solid var(--stroke);border-radius:20px;box-shadow:var(--shadow);
  animation:nodeIn .3s var(--ease-bounce)}
.modal::-webkit-scrollbar{width:8px}.modal::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid var(--stroke-soft)}
.modal-title{display:flex;align-items:center;gap:10px;font-family:'Space Grotesk';font-weight:700;font-size:17px}
.modal-title svg{font-size:22px;color:var(--accent)}
.modal-x{width:32px;height:32px;border-radius:9px;font-size:22px;color:var(--text-dim);transition:all .2s}
.modal-x:hover{background:var(--panel-3);color:#fff}
.modal-body{padding:20px}

.status-row{display:flex;align-items:center;gap:10px;margin-bottom:18px}
.status-pill{display:inline-flex;align-items:center;gap:8px;padding:7px 13px;border-radius:20px;font-size:12.5px;border:1px solid var(--stroke)}
.status-pill i{width:8px;height:8px;border-radius:50%;background:currentColor}
.status-pill.off{color:var(--text-faint)}
.status-pill.on{color:var(--good);background:color-mix(in srgb,var(--good) 12%,transparent);border-color:color-mix(in srgb,var(--good) 30%,transparent)}
.status-pill.err{color:var(--bad);background:color-mix(in srgb,var(--bad) 12%,transparent);border-color:color-mix(in srgb,var(--bad) 30%,transparent)}
.status-peers{font-size:12px;color:var(--text-dim)}

.copy-row{display:flex;gap:8px}
.copy-row input{flex:1;font-family:'JetBrains Mono';font-size:11.5px}
.hint-text{font-size:11.5px;color:var(--text-faint);margin-top:7px;line-height:1.5}
.hint-text code,.warn-text code{font-family:'JetBrains Mono';background:var(--panel-3);padding:1px 5px;border-radius:5px;font-size:10.5px;color:var(--accent)}
.warn-text{font-size:11.5px;color:var(--warn);margin-top:10px;line-height:1.5}

.howto{margin-bottom:16px;background:var(--panel);border:1px solid var(--stroke-soft);border-radius:12px;overflow:hidden}
.howto summary{padding:12px 14px;cursor:pointer;font-size:12.5px;font-weight:600;color:var(--text-dim);list-style:none}
.howto summary::-webkit-details-marker{display:none}
.howto summary:hover{color:#fff}
.howto[open] summary{border-bottom:1px solid var(--stroke-soft);color:#fff}
.howto ol{margin:12px 16px 8px 30px;font-size:12px;line-height:1.7;color:var(--text-dim)}
.howto ol b{color:var(--text)}
.howto .warn-text{margin:0 14px 14px}
#cfgInput{font-family:'JetBrains Mono';font-size:11px;min-height:96px}

@media (max-width:1000px){
  .app-shell{grid-template-columns:190px 1fr;grid-template-areas:"top top" "tool stage"}
  .inspector{position:fixed;right:0;top:60px;bottom:0;width:320px;transform:translateX(100%);transition:transform .3s var(--ease);box-shadow:var(--shadow)}
  .inspector.open{transform:translateX(0)}
}

/* ============================================================
   AUTH SCREEN
   ============================================================ */
.auth-screen{position:fixed;inset:0;z-index:400;display:grid;place-items:center;padding:24px;overflow:auto}
.auth-bg{position:absolute;inset:0;z-index:-1;
  background:
    radial-gradient(700px 500px at 20% 10%,rgba(108,140,255,.16),transparent 60%),
    radial-gradient(600px 500px at 85% 90%,rgba(160,107,255,.14),transparent 60%);
  pointer-events:none}
.auth-card{width:100%;max-width:400px;background:linear-gradient(180deg,var(--panel-2),var(--panel));
  border:1px solid var(--stroke);border-radius:22px;box-shadow:var(--shadow);padding:30px 28px;
  animation:nodeIn .35s var(--ease-bounce)}
.auth-brand{display:flex;align-items:center;gap:14px;margin-bottom:22px}
.auth-brand .brand-logo{width:48px;height:48px;border-radius:13px}
.auth-tabs{display:flex;gap:6px;background:var(--panel);padding:5px;border-radius:13px;border:1px solid var(--stroke-soft);margin-bottom:20px}
.auth-tab{flex:1;padding:10px;border-radius:9px;font-size:13.5px;font-weight:600;color:var(--text-dim);transition:all .2s}
.auth-tab.active{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;box-shadow:0 6px 16px -6px var(--accent-glow)}
.auth-form .field input{width:100%;padding:11px 13px;border-radius:11px;font-family:inherit;font-size:14px;
  background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);transition:all .2s}
.auth-form .field input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.auth-submit{width:100%;justify-content:center;padding:12px;font-size:14px;margin-top:6px}
.auth-error{background:color-mix(in srgb,var(--bad) 12%,transparent);border:1px solid color-mix(in srgb,var(--bad) 35%,transparent);
  color:var(--bad);font-size:12.5px;padding:9px 12px;border-radius:10px;margin-bottom:12px}
.auth-foot{margin-top:18px;text-align:center;font-size:13px;color:var(--text-dim)}
.auth-foot a{color:var(--accent);text-decoration:none;font-weight:600}
.auth-foot a:hover{text-decoration:underline}

/* ============================================================
   DASHBOARD
   ============================================================ */
.dash{position:fixed;inset:0;z-index:200;display:flex;flex-direction:column;overflow:hidden}
.dash-top{display:flex;align-items:center;justify-content:space-between;padding:0 24px;height:64px;
  background:linear-gradient(180deg,rgba(20,25,42,.85),rgba(14,17,26,.7));backdrop-filter:blur(18px);
  border-bottom:1px solid var(--stroke);flex-shrink:0}
.dash-user{display:flex;align-items:center;gap:12px}
.badge{background:var(--bad);color:#fff;font-size:10px;font-weight:700;border-radius:9px;padding:1px 6px;margin-left:2px}
.user-chip{display:flex;align-items:center;gap:9px;padding:5px 6px 5px 5px;border-radius:30px;background:var(--panel-2);border:1px solid var(--stroke-soft);cursor:pointer;transition:border-color .2s}
.user-chip:hover{border-color:var(--stroke)}
.avatar{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-size:13px;font-weight:700;color:#fff;flex-shrink:0}
.user-name{font-size:13px;font-weight:600;max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.user-logout{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;color:var(--text-dim);transition:all .2s}
.user-logout:hover{background:var(--panel-3);color:var(--bad)}

.dash-main{flex:1;overflow-y:auto;padding:32px 40px 60px;max-width:1200px;width:100%;margin:0 auto}
.dash-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:26px}
.dash-head h1{font-family:'Space Grotesk';font-size:26px;font-weight:700}
.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:18px}
.project-card{position:relative;background:linear-gradient(180deg,var(--panel-2),var(--panel));
  border:1px solid var(--stroke);border-radius:16px;padding:18px;cursor:pointer;min-height:130px;
  display:flex;flex-direction:column;transition:all .22s var(--ease);animation:fadeUp .3s var(--ease) backwards}
.project-card:hover{transform:translateY(-3px);border-color:color-mix(in srgb,var(--accent) 45%,var(--stroke));box-shadow:var(--shadow)}
.pc-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.pc-badge{font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;padding:3px 8px;border-radius:7px;
  color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,transparent)}
.pc-badge.shared{color:var(--good);background:color-mix(in srgb,var(--good) 14%,transparent)}
.pc-menu{width:26px;height:26px;border-radius:7px;color:var(--text-dim);font-size:18px;line-height:1;transition:all .2s}
.pc-menu:hover{background:var(--panel-3);color:#fff}
.pc-name{font-family:'Space Grotesk';font-weight:700;font-size:17px;margin-bottom:6px;word-break:break-word}
.pc-meta{font-size:12px;color:var(--text-faint);margin-top:auto}
.pc-menu-pop{position:absolute;top:42px;right:14px;z-index:5;background:var(--panel-2);border:1px solid var(--stroke);
  border-radius:11px;box-shadow:var(--shadow);padding:5px;min-width:140px;animation:ctxIn .15s var(--ease)}
.pc-menu-pop button{display:block;width:100%;text-align:left;padding:8px 11px;border-radius:7px;font-size:13px;color:var(--text-dim);transition:all .15s}
.pc-menu-pop button:hover{background:var(--panel-3);color:#fff}
.pc-menu-pop button.danger:hover{background:var(--bad);color:#fff}
.dash-empty{text-align:center;color:var(--text-faint);font-size:14px;padding:60px 20px;line-height:1.6}

/* ============================================================
   PEOPLE LISTS (friends + members + invite)
   ============================================================ */
.people-list{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}
.person{display:flex;align-items:center;gap:11px;padding:9px 11px;border-radius:12px;background:var(--panel-2);border:1px solid var(--stroke-soft)}
.person .avatar{width:34px;height:34px;font-size:14px}
.person-info{flex:1;display:flex;flex-direction:column;min-width:0}
.person-info b{font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.person-info small{font-size:11.5px;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.person-actions{display:flex;gap:6px;align-items:center;flex-shrink:0}
.person-actions .muted{font-size:11.5px;color:var(--text-faint)}
.mini{padding:6px 11px;border-radius:8px;font-size:12px;font-weight:600;background:var(--panel-3);border:1px solid var(--stroke);color:var(--text-dim);transition:all .18s}
.mini:hover{color:#fff;border-color:var(--stroke)}
.mini.primary{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;border-color:transparent}
.mini.primary:hover{box-shadow:0 4px 12px -4px var(--accent-glow)}
.mini.danger{color:var(--bad);border-color:color-mix(in srgb,var(--bad) 30%,transparent)}
.mini.danger:hover{background:var(--bad);color:#fff}
.mini:disabled{opacity:.5;pointer-events:none}

/* ============================================================
   PRESENCE STACK (topbar avatars)
   ============================================================ */
.presence-stack{display:flex;align-items:center;padding-left:6px}
.pres-av{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;color:#fff;
  border:2px solid var(--panel);margin-left:-8px;box-shadow:0 2px 6px rgba(0,0,0,.4)}
.pres-av:first-child{margin-left:0}

/* ============================================================
   NOTIFICATION TOASTS (top-right, Fortnite-style slide-in)
   ============================================================ */
.notif-layer{position:fixed;top:16px;right:16px;z-index:500;display:flex;flex-direction:column;gap:10px;pointer-events:none;max-width:340px;width:calc(100vw - 32px)}
.notif{pointer-events:auto;display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:14px;cursor:pointer;
  background:linear-gradient(180deg,var(--panel-2),var(--panel));border:1px solid var(--stroke);
  border-left:3px solid var(--nc,var(--accent));box-shadow:var(--shadow);
  transform:translateX(120%);opacity:0;transition:transform .38s var(--ease-bounce),opacity .38s var(--ease)}
.notif.show{transform:translateX(0);opacity:1}
.notif.hide{transform:translateX(120%);opacity:0}
.notif-av{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;font-size:15px;font-weight:700;color:#fff;flex-shrink:0;box-shadow:0 2px 8px rgba(0,0,0,.35)}
.notif-ico{width:36px;height:36px;border-radius:11px;display:grid;place-items:center;flex-shrink:0;font-size:20px;color:var(--nc,var(--accent));background:color-mix(in srgb,var(--nc,var(--accent)) 16%,transparent)}
.notif-ico svg{width:1em;height:1em}
.notif-text{display:flex;flex-direction:column;min-width:0;gap:1px}
.notif-text b{font-size:13px;font-weight:700;line-height:1.3}
.notif-text span{font-size:11.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.notif.has-actions{align-items:flex-start}
.notif.has-actions .notif-av,.notif.has-actions .notif-ico{margin-top:1px}
.notif-actions{display:flex;gap:7px;margin-top:8px}
.notif-btn{padding:6px 13px;border-radius:8px;font-size:12px;font-weight:600;background:var(--panel-3);border:1px solid var(--stroke);color:var(--text-dim);transition:all .16s}
.notif-btn:hover{color:#fff;border-color:var(--stroke);transform:translateY(-1px)}
.notif-btn.primary{background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;border-color:transparent}

/* ============================================================
   STYLED DIALOGS (prompt / confirm) — replace native popups
   ============================================================ */
.ui-modal{max-width:430px}
.ui-actions{display:flex;gap:10px;justify-content:flex-end;padding:4px 20px 20px}
.ui-actions .btn{padding:10px 18px}
.ui-msg{font-size:13.5px;color:var(--text-dim);line-height:1.6}
.ui-input{width:100%;padding:11px 13px;border-radius:11px;font-family:inherit;font-size:14px;background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);transition:all .2s}
.ui-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.btn.ui-danger{background:var(--bad);color:#fff;box-shadow:0 6px 16px -6px color-mix(in srgb,var(--bad) 60%,transparent)}
.btn.ui-danger:hover{filter:brightness(1.08);transform:translateY(-1px)}

/* ============================================================
   FRIEND CODE
   ============================================================ */
.code-display{font-family:'JetBrains Mono';font-size:17px;font-weight:600;letter-spacing:4px;text-align:center;color:var(--accent);background:var(--panel)!important;cursor:default}
#addFriendCode{font-family:'JetBrains Mono';letter-spacing:2px;text-transform:uppercase}
.copy-row .btn{flex-shrink:0}

/* ============================================================
   ALIGNMENT / SNAP GUIDES
   ============================================================ */
.guide-layer{position:absolute;inset:0;pointer-events:none;z-index:60}
.snap-guide{position:absolute;background:#ff4d8d;pointer-events:none}
.snap-guide.v{top:-20000px;height:40000px;width:1px;box-shadow:0 0 5px rgba(255,77,141,.8)}
.snap-guide.h{left:-20000px;width:40000px;height:1px;box-shadow:0 0 5px rgba(255,77,141,.8)}

/* ============================================================
   READ-ONLY (viewer) MODE
   ============================================================ */
.ro-badge{display:inline-flex;align-items:center;gap:6px;padding:7px 11px;border-radius:9px;font-size:12px;font-weight:600;
  color:var(--warn);background:color-mix(in srgb,var(--warn) 13%,transparent);border:1px solid color-mix(in srgb,var(--warn) 30%,transparent)}
.ro-badge svg{font-size:15px}
.app-shell.readonly .toolbar,
.app-shell.readonly #undoBtn,
.app-shell.readonly #redoBtn,
.app-shell.readonly #addBoardBtn,
.app-shell.readonly #importBtn,
.app-shell.readonly .insp-body{opacity:.4;pointer-events:none}
.app-shell.readonly .node-rz,
.app-shell.readonly .comment-rz,
.app-shell.readonly .pin{display:none}

/* ============================================================
   ROLES (share modal)
   ============================================================ */
.role-tag{font-weight:600}
.role-tag.role-owner{color:var(--accent)}
.role-tag.role-editor{color:var(--good)}
.role-tag.role-viewer{color:var(--text-faint)}
.role-sel{padding:5px 8px;border-radius:8px;font-size:11.5px;background:var(--panel-3);border:1px solid var(--stroke);color:var(--text-dim);font-family:inherit;cursor:pointer}

/* ============================================================
   PROJECT CHAT
   ============================================================ */
.chat-btn{position:relative}
.chat-btn.active{color:#fff;border-color:var(--stroke)}
.dot-badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;display:grid;place-items:center;
  font-size:9px;font-weight:700;border-radius:8px;background:var(--bad);color:#fff;margin:0}
.chat-panel{position:fixed;right:16px;bottom:16px;z-index:120;width:340px;max-width:calc(100vw - 32px);
  height:440px;max-height:calc(100vh - 96px);display:flex;flex-direction:column;
  background:linear-gradient(180deg,var(--panel-2),var(--panel));border:1px solid var(--stroke);
  border-radius:16px;box-shadow:var(--shadow);overflow:hidden;animation:nodeIn .25s var(--ease-bounce)}
.chat-panel[hidden]{display:none}
.chat-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--stroke-soft)}
.chat-title{display:flex;align-items:center;gap:8px;font-family:'Space Grotesk';font-weight:700;font-size:14px}
.chat-title svg{font-size:18px;color:var(--accent)}
.chat-messages{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}
.chat-messages::-webkit-scrollbar{width:7px}.chat-messages::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}
.chat-msg{display:flex;gap:9px;align-items:flex-start}
.chat-msg.grouped{margin-top:-7px}
.chat-msg.grouped .chat-bub{margin-left:39px}
.chat-av{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:700;color:#fff;flex-shrink:0}
.chat-bub{flex:1;min-width:0}
.chat-meta{display:flex;align-items:baseline;gap:7px;margin-bottom:2px}
.chat-meta b{font-size:12.5px;font-weight:700}
.chat-meta span{font-size:10px;color:var(--text-faint)}
.chat-text{font-size:13px;line-height:1.45;color:var(--text);word-break:break-word;white-space:pre-wrap}
.chat-input-row{display:flex;gap:8px;padding:12px;border-top:1px solid var(--stroke-soft)}
.chat-input-row input{flex:1;padding:10px 12px;border-radius:10px;background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);font-family:inherit;font-size:13px}
.chat-input-row input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.btn.primary.icon{width:40px;padding:0;justify-content:center;flex-shrink:0}

/* ============================================================
   GRID TOGGLE
   ============================================================ */
.stage.no-grid .grid-bg{display:none}
.grid-toggle svg{font-size:17px}
.grid-toggle.active{color:var(--accent)}
.zb-sep{width:1px;height:18px;background:var(--stroke);margin:0 3px}

/* ============================================================
   AVATARS WITH PHOTO
   ============================================================ */
.avatar.has-img,.pres-av.has-img,.profile-av.has-img{background-size:cover;background-position:center;color:transparent;font-size:0}

/* ============================================================
   PROFILE MODAL (avatar / password / danger)
   ============================================================ */
.profile-av-row{display:flex;align-items:center;gap:16px;margin-bottom:18px}
.profile-av{width:64px;height:64px;border-radius:50%;font-size:26px;flex-shrink:0;display:grid;place-items:center;color:#fff;font-weight:700}
.profile-av-actions{display:flex;flex-direction:column;gap:7px}
.profile-av-actions .btn{padding:7px 12px;font-size:12.5px}

/* ============================================================
   NOTIFICATION BELL + HISTORY
   ============================================================ */
.bell-wrap{position:relative}
.bell-btn.active,#bellBtn.active{color:#fff;border-color:var(--stroke)}
.bell-panel{position:absolute;top:48px;right:0;z-index:150;width:340px;max-width:calc(100vw - 32px);
  background:linear-gradient(180deg,var(--panel-2),var(--panel));border:1px solid var(--stroke);
  border-radius:14px;box-shadow:var(--shadow);overflow:hidden;animation:ctxIn .15s var(--ease)}
.bell-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--stroke-soft);font-size:13.5px}
.bell-clear{font-size:11.5px;color:var(--accent);font-weight:600}
.bell-clear:hover{text-decoration:underline}
.bell-list{max-height:380px;overflow-y:auto}
.bell-list::-webkit-scrollbar{width:7px}.bell-list::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}
.bell-empty{padding:26px 16px;text-align:center;color:var(--text-faint);font-size:12.5px}
.bell-item{display:flex;gap:11px;align-items:center;padding:11px 14px;cursor:pointer;border-bottom:1px solid var(--stroke-soft);transition:background .15s;position:relative}
.bell-item:hover{background:var(--panel-3)}
.bell-item.unread{background:color-mix(in srgb,var(--accent) 7%,transparent)}
.bell-item.unread::before{content:"";position:absolute;left:5px;top:50%;transform:translateY(-50%);width:5px;height:5px;border-radius:50%;background:var(--accent)}
.bell-ico{width:32px;height:32px;border-radius:9px;flex-shrink:0;display:grid;place-items:center;color:var(--accent);background:color-mix(in srgb,var(--accent) 15%,transparent)}
.bell-ico svg{width:1em;height:1em;font-size:17px}
.bell-text{font-size:12.5px;line-height:1.4;color:var(--text-dim)}
.bell-text b{color:var(--text);font-weight:600}
.bell-text small{display:block;font-size:10.5px;color:var(--text-faint);margin-top:2px}

/* editors can't manage boards */
.app-shell.no-boards #addBoardBtn{display:none}
.role-tag.role-admin{color:var(--accent-2)}

/* create-menu header */
.ctx-head{font-size:10px;font-weight:700;letter-spacing:1.2px;text-transform:uppercase;color:var(--text-faint);padding:7px 11px 4px}

/* ============================================================
   CUSTOM COLOUR PICKER
   ============================================================ */
.color-pop{position:fixed;z-index:600;width:214px;padding:12px;border-radius:14px;
  background:var(--panel-2);border:1px solid var(--stroke);box-shadow:var(--shadow);animation:ctxIn .14s var(--ease)}
.cp-sv{position:relative;width:100%;height:130px;border-radius:9px;cursor:crosshair;margin-bottom:10px;overflow:hidden;touch-action:none}
.cp-sv-thumb{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid #fff;transform:translate(-50%,-50%);box-shadow:0 0 0 1px rgba(0,0,0,.45);pointer-events:none}
.cp-bottom{display:flex;gap:10px}
.cp-hue{position:relative;width:16px;height:80px;border-radius:8px;cursor:pointer;flex-shrink:0;touch-action:none;
  background:linear-gradient(to bottom,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}
.cp-hue-thumb{position:absolute;left:-2px;width:20px;height:6px;border-radius:3px;border:2px solid #fff;transform:translateY(-50%);box-shadow:0 0 0 1px rgba(0,0,0,.45);pointer-events:none}
.cp-row{flex:1;display:flex;flex-direction:column;gap:9px}
.cp-preview{width:100%;height:30px;border-radius:7px;border:1px solid var(--stroke)}
.cp-hex{width:100%;padding:7px 8px;border-radius:7px;background:var(--panel);border:1px solid var(--stroke);color:var(--text);font-family:'JetBrains Mono';font-size:12px;text-align:center}
.cp-hex:focus{outline:none;border-color:var(--accent)}

/* ============================================================
   AVATAR CROP DIALOG
   ============================================================ */
.crop-modal{max-width:340px}
.crop-stage{position:relative;margin:0 auto 14px;border-radius:14px;overflow:hidden;background:#000;cursor:grab;touch-action:none;border:1px solid var(--stroke)}
.crop-stage:active{cursor:grabbing}
.crop-stage::after{content:"";position:absolute;inset:0;border-radius:50%;box-shadow:0 0 0 2000px rgba(10,12,18,.5);pointer-events:none}
.crop-img{position:absolute;top:0;left:0;user-select:none;-webkit-user-drag:none;max-width:none}
.crop-zoom{display:flex;align-items:center;gap:11px;color:var(--text-dim)}
.crop-zoom svg{font-size:18px;flex-shrink:0}
.crop-zoom input{flex:1}

/* ============================================================
   COLLAPSIBLE LEFT TOOLBAR
   ============================================================ */
.toolbar{transition:transform .28s var(--ease)}
.tool-collapse{height:34px;min-height:0}
.tool-collapse svg{font-size:18px}
.app-shell.tools-collapsed{grid-template-columns:0 1fr 320px}
.app-shell.tools-collapsed .toolbar{transform:translateX(-100%);pointer-events:none}
.tools-reopen{position:fixed;left:14px;bottom:62px;z-index:40;width:42px;height:42px;border-radius:13px;
  background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;display:grid;place-items:center;
  box-shadow:0 8px 22px -6px var(--accent-glow);transition:transform .2s var(--ease);animation:fadeUp .25s var(--ease)}
.tools-reopen:hover{transform:translateY(-2px)}
.tools-reopen[hidden]{display:none}
@media (max-width:1000px){ .app-shell.tools-collapsed{grid-template-columns:0 1fr} }

/* ============================================================
   NODE REACTIONS (like / dislike)
   ============================================================ */
.node-react{display:flex;gap:3px;padding:2px 9px 9px;opacity:.45;transition:opacity .2s}
.node:hover .node-react,.node-react.has-votes{opacity:1}
.react{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:8px;font-size:11px;font-weight:600;position:relative;
  background:transparent;border:1px solid transparent;color:var(--text-faint);
  transition:transform .18s var(--ease-bounce),color .15s,background .15s}
.react svg{font-size:14px}
.react:hover{color:var(--text);background:var(--panel-3)}
.react.like.on{color:var(--good);background:color-mix(in srgb,var(--good) 14%,transparent)}
.react.dislike.on{color:var(--bad);background:color-mix(in srgb,var(--bad) 14%,transparent)}
.react.pop{animation:reactPop .42s var(--ease-bounce)}
@keyframes reactPop{0%{transform:scale(1)}35%{transform:scale(1.28)}100%{transform:scale(1)}}
.react-burst{position:absolute;left:50%;top:-2px;pointer-events:none;font-size:15px;animation:reactBurst .7s var(--ease) forwards}
@keyframes reactBurst{0%{opacity:0;transform:translate(-50%,4px) scale(.6)}25%{opacity:1}100%{opacity:0;transform:translate(-50%,-26px) scale(1.25)}}
.app-shell.readonly .react{pointer-events:none}

/* ============================================================
   LEFT SIDE PANEL (tools + board outline / navigator)
   ============================================================ */
.sidepanel{align-items:stretch;padding:12px 10px;gap:11px;overflow:hidden}
.sp-add{display:grid;grid-template-columns:1fr 1fr;gap:7px;flex-shrink:0}
.sp-tool{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px 4px;border-radius:11px;
  font-size:10px;font-weight:600;color:var(--text-dim);background:var(--panel-2);border:1px solid var(--stroke-soft);transition:all .2s var(--ease)}
.sp-tool svg{font-size:18px}
.sp-tool:hover{color:#fff;border-color:transparent;transform:translateY(-1px);box-shadow:var(--shadow);
  background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 30%,var(--panel-2)),color-mix(in srgb,var(--accent-2) 24%,var(--panel-2)))}
.sp-outline-head{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:700;letter-spacing:1.2px;
  text-transform:uppercase;color:var(--text-faint);padding:2px 4px 0;flex-shrink:0}
.sp-count{background:var(--panel-3);color:var(--text-dim);border-radius:8px;padding:1px 7px;font-size:10px;letter-spacing:0}
.sp-outline{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:3px;padding-right:2px;min-height:0}
.sp-outline::-webkit-scrollbar{width:7px}.sp-outline::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}
.ol-empty{color:var(--text-faint);font-size:11.5px;line-height:1.55;text-align:center;padding:24px 8px}
.ol-item{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:9px;cursor:pointer;border:1px solid transparent;transition:background .15s,border-color .15s}
.ol-item:hover{background:var(--panel-2)}
.ol-item.sel{background:color-mix(in srgb,var(--oc) 16%,transparent);border-color:color-mix(in srgb,var(--oc) 45%,transparent)}
.ol-ico{width:24px;height:24px;border-radius:7px;flex-shrink:0;display:grid;place-items:center;font-size:14px;color:var(--oc);background:color-mix(in srgb,var(--oc) 18%,transparent)}
.ol-ico svg{width:1em;height:1em}
.ol-title{font-size:12.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ol-item:hover .ol-title,.ol-item.sel .ol-title{color:var(--text)}
.sp-foot{display:flex;gap:6px;flex-shrink:0}
.sp-foot-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:8px;border-radius:9px;font-size:11.5px;font-weight:600;
  color:var(--text-dim);background:var(--panel-2);border:1px solid var(--stroke-soft);transition:all .18s}
.sp-foot-btn svg{font-size:16px}
.sp-foot-btn:hover{color:#fff;border-color:var(--stroke)}
.sp-foot-btn.icon{flex:0 0 38px;padding:8px 0}

/* outline tree (boards -> nodes) */
.ol-board{margin-bottom:1px}
.ol-bhead{display:flex;align-items:center;gap:7px;padding:6px 7px;border-radius:8px;cursor:pointer;transition:background .15s}
.ol-bhead:hover{background:var(--panel-2)}
.ol-chev{font-size:14px;color:var(--text-faint);transition:transform .18s var(--ease);flex-shrink:0}
.ol-chev.open{transform:rotate(90deg)}
.ol-bdot{width:8px;height:8px;border-radius:50%;flex-shrink:0;box-shadow:0 0 6px currentColor}
.ol-bname{flex:1;font-size:12px;font-weight:600;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ol-board.active .ol-bname{color:var(--text)}
.ol-bcount{font-size:10px;color:var(--text-faint);background:var(--panel-3);border-radius:7px;padding:0 6px}
.ol-children{padding-left:13px;margin-left:7px;border-left:1px solid var(--stroke-soft)}
.ol-children[hidden]{display:none}
.ol-empty-sm{font-size:11px;color:var(--text-faint);padding:4px 9px}

/* outline: connection sub-tree chevrons — big, easy click target */
.ol-chev.sm{font-size:13px;width:24px;height:24px;display:inline-grid;place-items:center;cursor:pointer;border-radius:6px;flex-shrink:0;margin:-4px 0 -4px -6px}
.ol-chev.sm:hover{color:var(--text);background:var(--panel-3)}
.ol-chev-sp{width:18px;flex-shrink:0}
.ol-node>.ol-children{padding-left:11px;margin-left:9px}
