/* 无限画布 */
.canvas-page{display:grid;grid-template-rows:auto minmax(0,1fr);gap:10px;height:calc(100vh - var(--top) - 28px);min-height:520px}
.canvas-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px;border:1px solid var(--border);border-radius:14px;background:var(--card)}
.canvas-toolbar .cv-title{width:200px;min-width:120px}
.canvas-toolbar .spacer{flex:1;min-width:8px}
.cv-add-group{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cv-add-group>span{color:var(--faint);font-size:11px}
.cv-add{height:32px;padding:0 10px;border:1px dashed var(--border-strong);border-radius:9px;background:var(--card-2);color:var(--dim);font-size:12px;cursor:pointer}
.cv-add:hover{color:var(--text);border-color:rgba(var(--primary-rgb),.6)}
.canvas-stage{position:relative;overflow:hidden;border:1px solid var(--border);border-radius:16px;background:var(--bg-soft);touch-action:none;cursor:grab}
.canvas-stage.panning{cursor:grabbing}
.canvas-world{position:absolute;left:0;top:0;width:0;height:0;transform-origin:0 0}
.canvas-stage::before{content:"";position:absolute;inset:0;pointer-events:none;background-image:radial-gradient(rgba(255,255,255,.09) 1px,transparent 1px);background-size:24px 24px;opacity:.7}
[data-theme="light"] .canvas-stage::before{background-image:radial-gradient(rgba(20,24,40,.13) 1px,transparent 1px)}
.canvas-edges{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}
.canvas-edges path{fill:none;stroke:rgba(var(--primary-rgb),.75);stroke-width:2.5}
.canvas-edges path.hit{stroke:transparent;stroke-width:16;pointer-events:stroke;cursor:pointer}
.cv-node{position:absolute;width:280px;border:1px solid var(--border-strong);border-radius:14px;background:var(--card);box-shadow:0 10px 26px rgba(0,0,0,.28);color:var(--text);user-select:none}
.cv-node.on{border-color:rgba(var(--primary-rgb),.85);box-shadow:0 0 0 2px rgba(var(--primary-rgb),.2),0 12px 30px rgba(0,0,0,.3)}
.cv-node-head{display:flex;align-items:center;gap:8px;padding:9px 10px;border-bottom:1px solid var(--border);cursor:move}
.cv-node-head b{flex:1;min-width:0;font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cv-node-head .cv-close{border:0;background:none;color:var(--faint);cursor:pointer;font-size:13px;padding:2px 4px}
.cv-node-head .cv-close:hover{color:#fca5a5}
.cv-node-body{padding:10px;display:grid;gap:8px}
.cv-node-body .field{margin:0}
.cv-node-body label{display:block;margin-bottom:4px;color:var(--faint);font-size:10.5px}
.cv-node-body .input,.cv-node-body .select{width:100%;height:34px;padding:0 9px;border:1px solid var(--border);border-radius:8px;background:var(--card-2);color:var(--text);font-size:12px}
.cv-node-body textarea.input{height:auto;min-height:70px;padding:8px 9px;line-height:1.5;resize:vertical}
.cv-node-foot{display:flex;align-items:center;gap:8px;padding:0 10px 10px}
.cv-node-foot .cv-status{flex:1;min-width:0;color:var(--faint);font-size:10.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cv-node-foot .btn{height:30px;padding:0 12px;font-size:11.5px}
.cv-port{position:absolute;top:50%;width:14px;height:14px;margin-top:-7px;border:2px solid var(--primary);border-radius:50%;background:var(--card);cursor:crosshair}
.cv-port.in{left:-8px}
.cv-port.out{right:-8px}
.cv-node-media{width:100%;border-radius:9px;background:#0d1018;display:block;max-height:220px;object-fit:contain}
.cv-empty-media{display:grid;place-items:center;height:110px;border:1px dashed var(--border);border-radius:9px;color:var(--faint);font-size:11px}
.cv-hint{position:absolute;left:14px;bottom:12px;z-index:5;padding:6px 10px;border-radius:9px;background:rgba(0,0,0,.5);color:rgba(255,255,255,.75);font-size:11px;pointer-events:none}
.cv-zoom{display:flex;align-items:center;gap:6px}
.cv-zoom button{width:30px;height:30px;border:1px solid var(--border);border-radius:8px;background:var(--card-2);color:var(--dim);cursor:pointer}
.cv-board-list{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cv-board-list button{height:28px;padding:0 10px;border:1px solid var(--border);border-radius:8px;background:var(--card-2);color:var(--dim);font-size:11px;cursor:pointer}
.cv-board-list button.on{border-color:rgba(var(--primary-rgb),.7);color:var(--text);background:rgba(var(--primary-rgb),.14)}
@media(max-width:760px){
  .canvas-page{height:calc(100vh - var(--top) - 76px);min-height:420px}
  .canvas-toolbar{padding:8px;gap:6px}
  .canvas-toolbar .cv-title{width:100%}
  .cv-node{width:250px}
  .cv-add{height:30px;padding:0 8px;font-size:11.5px}
}
/* 2026-09-29 白天模式：画布操作提示可读性 */
[data-theme="light"] .cv-hint{background:rgba(0,0,0,.66);color:#fff}
