/* ============================================================
   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;
  /* claim all touch gestures so the browser doesn't scroll/zoom the page instead of
     firing clean pointer events (pan / pinch-zoom are handled in JS) */
  touch-action:none;overscroll-behavior:none;
}
/* genuinely scrollable content inside a note keeps native touch scrolling.
   NOTE: the contenteditable title/text are intentionally NOT listed here — they need
   touch-action:none so a drag over them moves the note instead of selecting text
   (tap-to-edit still works). */
.stage textarea,.stage input,.stage .ideas-list{touch-action:auto}
.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.hover{stroke-width:5;filter:url(#glow) brightness(1.35)}
.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}
/* reroute waypoints (UE5-style draggable dots on a wire) */
.wire-pt-g{cursor:grab}
.wire-pt-g:active{cursor:grabbing}
.wire-pt-hit{fill:transparent;pointer-events:all}            /* large invisible grab area */
.wire-pt{fill:#11141f;stroke:var(--accent);stroke-width:2.5;pointer-events:none;transition:fill .12s}
.wire-pt-g:hover .wire-pt{fill:var(--accent)}
.wire-pt-g.on .wire-pt{fill:var(--accent);stroke:#fff;stroke-width:2}
.stage.linking .wire-pt-g{pointer-events:none}

.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}
/* invisible enlarged hit-area so the small pin dot is easy to grab */
.pin::before{content:"";position:absolute;inset:-12px;border-radius:50%}
.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)}

/* node link chips */
.node-links{display:flex;flex-wrap:wrap;gap:6px;padding:0 12px 10px}
.node-link{display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:3px 9px;
  border-radius:8px;font-size:11.5px;font-weight:600;text-decoration:none;cursor:pointer;
  color:var(--nodecolor,var(--accent));background:color-mix(in srgb,var(--nodecolor,#6c8cff) 14%,transparent);
  border:1px solid color-mix(in srgb,var(--nodecolor,#6c8cff) 32%,transparent);transition:filter .15s}
.node-link:hover{filter:brightness(1.25)}
.node-link svg{flex:none}
.node-link span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* inspector multi-link editor */
.link-edit{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.link-edit:empty{margin-bottom:0}
.link-row{display:flex;gap:7px;align-items:center}
.link-row input{flex:1;min-width:0}
.link-rm{flex:none;width:30px;height:30px;padding:0;display:flex;align-items:center;justify-content:center;font-size:17px;line-height:1;border-radius:9px}
.link-add,.sub-add{display:inline-flex;align-items:center;gap:6px}
.link-add svg,.sub-add svg{flex:none}

/* ---- generic small avatar (dropdowns, ideas, online list) ---- */
.av{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700;color:#fff;flex:none;background-size:cover;background-position:center}
.av.has-img{color:transparent}

/* ---- task: subtasks on the node ---- */
.task-subs{display:flex;flex-direction:column;gap:5px;margin-top:9px}
.subtask{display:flex;align-items:flex-start;gap:7px;font-size:12px;color:var(--text-dim);cursor:default;line-height:1.4}
.subtask input{margin-top:1px;width:14px;height:14px;accent-color:var(--accent);cursor:pointer;flex:none}
.subtask input:disabled{cursor:not-allowed}
.subtask.done span{text-decoration:line-through;opacity:.55}
.react.idea.has{color:var(--accent)}

/* ---- inspector: assignee dropdown ---- */
.member-dd{position:relative}
.dd-btn{width:100%;display:flex;align-items:center;gap:8px;padding:9px 11px;border-radius:10px;font-family:inherit;font-size:13px;
  background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);cursor:pointer;transition:all .2s}
.dd-btn:hover{border-color:var(--stroke)}
.dd-caret{margin-left:auto;flex:none;opacity:.6}
.dd-ph{color:var(--text-faint)}
.dd-menu{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:30;max-height:260px;overflow:auto;
  background:var(--panel-1,var(--panel-2));border:1px solid var(--stroke);border-radius:12px;padding:6px;box-shadow:var(--shadow,0 12px 30px -10px rgba(0,0,0,.5))}
.dd-opt{display:flex;align-items:center;gap:9px;padding:8px 9px;border-radius:9px;font-size:13px;color:var(--text-dim);cursor:pointer}
.dd-opt:hover{background:var(--panel-3);color:#fff}
.dd-opt.sel{background:color-mix(in srgb,var(--accent) 16%,transparent);color:#fff}
.dd-opt small{margin-left:auto;font-size:10.5px;opacity:.5}
.dd-empty{padding:8px 9px;font-size:12px;color:var(--text-faint)}

/* ---- inspector: subtask editor ---- */
.sub-edit{display:flex;flex-direction:column;gap:7px;margin-bottom:10px}
.sub-edit:empty{margin-bottom:0}
.sub-row{display:flex;gap:7px;align-items:center}
.sub-row input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;flex:none}
.sub-row .sub-text{flex:1;min-width:0}
.insp-prog{height:7px;border-radius:4px;background:var(--panel-3);overflow:hidden}
.insp-prog i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--accent-2));transition:width .25s}
.lock-hint{font-weight:600;color:var(--text-faint)}
.seg.locked{opacity:.5}

/* ---- per-node ideas popover ---- */
/* per-note ideas panel — rendered INSIDE the note card so it pans/zooms with the note and
   sits in the .world layer (under the toolbars) instead of floating over the whole UI. */
.idea-panel{display:flex;flex-direction:column;max-height:300px;overflow:hidden;
  border-top:1px solid var(--stroke-soft);border-radius:0 0 var(--radius) var(--radius);
  background:color-mix(in srgb,var(--nodecolor,#6c8cff) 6%,transparent);animation:ideaGrow .2s var(--ease)}
@keyframes ideaGrow{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.idea-head{display:flex;align-items:center;gap:8px;padding:11px 13px;border-bottom:1px solid var(--stroke-soft);font-size:13px;color:var(--text)}
.idea-head svg{width:16px;height:16px;color:var(--accent)}
.idea-head .idea-count{margin-left:2px;font-size:11px;color:var(--text-faint)}
.idea-x{margin-left:auto;font-size:18px;line-height:1;color:var(--text-dim);background:none;cursor:pointer}
.idea-x:hover{color:#fff}
.idea-list{flex:1;overflow:auto;padding:10px 12px;display:flex;flex-direction:column;gap:11px}
.idea-item{display:flex;gap:9px}
.idea-body{flex:1;min-width:0}
.idea-meta{display:flex;align-items:baseline;gap:7px}
.idea-meta b{font-size:12.5px;color:var(--text)}
.idea-meta time{font-size:10.5px;color:var(--text-faint)}
.idea-body p{margin:2px 0 0;font-size:12.5px;color:var(--text-dim);line-height:1.45;word-break:break-word;white-space:pre-wrap}
.idea-empty{font-size:12.5px;color:var(--text-faint);text-align:center;padding:14px 4px}
.idea-input{display:flex;gap:7px;padding:10px 12px;border-top:1px solid var(--stroke-soft);align-items:flex-end}
.idea-input textarea{flex:1;min-width:0;resize:none;padding:8px 10px;border-radius:9px;font-family:inherit;font-size:12.5px;
  background:var(--panel-2);border:1px solid var(--stroke);color:var(--text)}
.idea-input textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}

/* ---- "who is online" panel ---- */
.online-panel{position:fixed;z-index:1000;width:240px;max-height:320px;overflow:auto;padding:7px;
  background:var(--panel-1,var(--panel-2));border:1px solid var(--stroke);border-radius:13px;box-shadow:0 16px 40px -12px rgba(0,0,0,.6)}
.online-head{font-size:10.5px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--text-faint);padding:6px 9px 9px}
.online-row{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:9px;font-size:13px;color:var(--text-dim)}
.online-row:hover{background:var(--panel-3)}
.online-dot{width:8px;height:8px;border-radius:50%;background:var(--good);flex:none;box-shadow:0 0 8px var(--good)}
.online-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.online-name small{color:var(--text-faint)}

/* editor-row inputs (link & subtask rows live outside .field -> style them to match) */
.link-row input[type=url],.sub-row .sub-text{width:100%;min-width:0;padding:9px 11px;border-radius:9px;font-family:inherit;font-size:13px;
  background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);transition:all .18s}
.link-row input[type=url]:focus,.sub-row .sub-text:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.sub-row input[type=checkbox]{appearance:none;-webkit-appearance:none;width:18px;height:18px;border-radius:6px;border:1.5px solid var(--stroke);background:var(--panel-2);cursor:pointer;position:relative;transition:all .15s;flex:none}
.sub-row input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}
.sub-row input[type=checkbox]:checked::after{content:"";position:absolute;left:5px;top:2px;width:4px;height:8px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}

/* polish on-node subtasks to match the card */
.subtask input[type=checkbox]{appearance:none;-webkit-appearance:none;width:15px;height:15px;border-radius:5px;border:1.5px solid var(--stroke);background:transparent;position:relative;transition:all .15s}
.subtask input[type=checkbox]:checked{background:var(--nodecolor,var(--accent));border-color:var(--nodecolor,var(--accent))}
.subtask input[type=checkbox]:checked::after{content:"";position:absolute;left:4px;top:1px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}

/* like / dislike on individual ideas */
.idea-acts{display:flex;gap:6px;margin-top:7px}
.idea-vote{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:7px;font-size:11px;font-weight:600;color:var(--text-faint);cursor:pointer;transition:all .15s}
.idea-vote svg{width:13px;height:13px}
.idea-vote:hover{background:var(--panel-3);color:var(--text)}
.idea-vote.like.on{color:var(--good);background:color-mix(in srgb,var(--good) 14%,transparent)}
.idea-vote.dislike.on{color:var(--bad);background:color-mix(in srgb,var(--bad) 14%,transparent)}

/* keyboard-shortcut hint in context menus */
.ctx-key{margin-left:auto;padding-left:18px;font-size:10.5px;opacity:.5;font-weight:600;letter-spacing:.02em}

/* ---- 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}

/* Touch devices have no hover: reveal hover-gated affordances on the selected node so
   resize/react stay reachable, and give pins + resize a larger tap target. */
@media (hover:none){
  .node.selected .node-rz{opacity:.55;width:24px;height:24px}
  .node.selected .node-react{opacity:1}
  .node.selected .pin{transform:translateY(-50%) scale(1.35)}
  .node.selected .pin::after{transform:scale(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 input[type=url],.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[hidden]{display:none}   /* class display:inline-flex would otherwise override [hidden] -> badge always visible */
.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,
.app-shell.no-boards #importBtn{display:none}   /* import = wholesale board replace -> owner/admin only */
.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}

/* ============================================================
   KALENDER  (Termine/Deadlines + Session-Journal pro Projekt)
   ============================================================ */
#calBtn{position:relative}
.cal-modal{max-width:880px;display:flex;flex-direction:column;overflow:hidden}
.cal-body{display:flex;min-height:0;flex:1}
.cal-left{flex:1.05;padding:18px 20px;border-right:1px solid var(--stroke-soft);overflow-y:auto}
.cal-right{flex:1;padding:18px 20px;min-width:0;overflow-y:auto}
.cal-left::-webkit-scrollbar,.cal-right::-webkit-scrollbar{width:8px}
.cal-left::-webkit-scrollbar-thumb,.cal-right::-webkit-scrollbar-thumb{background:var(--stroke);border-radius:4px}

.cal-nav{display:flex;align-items:center;gap:8px;margin-bottom:14px}
.cal-month{flex:1;font-family:'Space Grotesk';font-weight:700;font-size:15.5px}
.cal-nav-btn{width:30px;height:30px;border-radius:9px;font-size:18px;color:var(--text-dim);background:var(--panel-2);border:1px solid var(--stroke-soft);display:grid;place-items:center;transition:all .18s}
.cal-nav-btn:hover{color:#fff;border-color:var(--stroke);background:var(--panel-3)}
.cal-today-btn{padding:6px 12px;border-radius:9px;font-size:12px;font-weight:600;color:var(--text-dim);background:var(--panel-2);border:1px solid var(--stroke-soft);transition:all .18s}
.cal-today-btn:hover{color:#fff;border-color:var(--accent)}

.cal-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;margin-bottom:6px}
.cal-weekdays span{text-align:center;font-size:10.5px;font-weight:700;letter-spacing:.5px;color:var(--text-faint);text-transform:uppercase}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.cal-cell{position:relative;aspect-ratio:1;border-radius:10px;background:var(--panel-2);border:1px solid var(--stroke-soft);
  display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:6px 2px 2px;cursor:pointer;transition:all .15s}
.cal-cell:hover{border-color:var(--stroke);background:var(--panel-3);transform:translateY(-1px)}
.cal-cell.empty{background:transparent;border:none;pointer-events:none}
.cal-num{font-size:12.5px;font-weight:600;color:var(--text-dim)}
.cal-cell.today .cal-num{color:var(--accent)}
.cal-cell.today{border-color:color-mix(in srgb,var(--accent) 45%,transparent)}
.cal-cell.sel{background:color-mix(in srgb,var(--accent) 16%,var(--panel-2));border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-glow)}
.cal-cell.sel .cal-num{color:#fff}
.cal-cell.has-session::after{content:"";position:absolute;top:5px;right:5px;width:5px;height:5px;border-radius:50%;background:var(--good);box-shadow:0 0 6px var(--good)}
.cal-dots{display:flex;flex-wrap:wrap;gap:3px;justify-content:center;align-items:center;margin-top:auto;padding-bottom:2px;min-height:8px}
.cal-dot{width:6px;height:6px;border-radius:50%}
.cal-more{font-size:9px;font-weight:700;color:var(--text-faint)}

.cal-legend{display:flex;flex-wrap:wrap;gap:12px;margin-top:16px;font-size:11px;color:var(--text-dim)}
.cal-legend span{display:inline-flex;align-items:center;gap:6px}
.cal-legend i{width:8px;height:8px;border-radius:50%}

.cal-day-head{font-family:'Space Grotesk';font-weight:700;font-size:14.5px;margin-bottom:14px;color:var(--text)}
.cal-ev-list{display:flex;flex-direction:column;gap:7px}
.cal-empty-hint{font-size:12px;color:var(--text-faint);padding:4px 0 2px}
.cal-ev{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:11px;background:var(--panel-2);border:1px solid var(--stroke-soft)}
.cal-ev-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}
.cal-ev-title{flex:1;font-size:13px;font-weight:500;color:var(--text);min-width:0;outline:none;border-radius:5px;padding:1px 3px}
.cal-ev-title[contenteditable]:focus{box-shadow:0 0 0 2px var(--accent-glow);background:var(--panel-3)}
.cal-ev-type{font-size:10.5px;font-weight:700;flex-shrink:0;letter-spacing:.3px}
.cal-ev.done .cal-ev-title{text-decoration:line-through;color:var(--text-faint)}
.cal-ev-check{width:22px;height:22px;flex-shrink:0;border-radius:7px;border:1.5px solid var(--stroke);color:var(--good);font-size:14px;display:grid;place-items:center;transition:all .15s;background:transparent}
.cal-ev-check:hover{border-color:var(--good)}
.cal-ev.done .cal-ev-check{background:var(--good);border-color:var(--good);color:#08130d}
.cal-ev-del{width:22px;height:22px;flex-shrink:0;border-radius:7px;color:var(--text-faint);font-size:17px;line-height:1;display:grid;place-items:center;transition:all .15s}
.cal-ev-del:hover{color:var(--bad);background:color-mix(in srgb,var(--bad) 14%,transparent)}

.cal-add{display:flex;gap:6px;margin:11px 0 4px}
.cal-add input{flex:1;min-width:0;padding:9px 11px;border-radius:10px;background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);font-family:inherit;font-size:12.5px}
.cal-add input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.cal-add select{padding:9px 26px 9px 10px;border-radius:10px;background:var(--panel-2);border:1px solid var(--stroke);color:var(--text-dim);font-family:inherit;font-size:12px;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 8px center;background-size:14px}
.cal-add select:focus{outline:none;border-color:var(--accent)}
.cal-add .mini{flex-shrink:0;font-size:16px;padding:0 12px}

.cal-session{margin-top:20px}
.cal-lbl{display:block;font-size:11.5px;font-weight:600;color:var(--text-dim);margin:11px 0 5px}
.cal-ta{width:100%;padding:9px 11px;border-radius:10px;background:var(--panel-2);border:1px solid var(--stroke);color:var(--text);font-family:inherit;font-size:12.5px;line-height:1.5;resize:vertical;min-height:44px}
.cal-ta:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow)}
.cal-ta[readonly]{opacity:.7;cursor:default}

@media (max-width:720px){
  .cal-body{flex-direction:column}
  .cal-left{border-right:none;border-bottom:1px solid var(--stroke-soft)}
}

/* While a full-screen overlay (calendar) is open, its backdrop-filter blurs the whole
   canvas. Pausing the canvas' perpetual animations keeps that blurred backdrop static
   so the compositor caches it once instead of re-rasterising every frame -> no lag while
   typing/scrolling in the modal. Invisible: the animations sit behind an 8px blur. */
body.overlay-blur .wire-flow,
body.overlay-blur .brand-logo,
body.overlay-blur .live-dot,
body.overlay-blur .grid-bg{animation:none}
