diff --git a/ui/builder.html b/ui/builder.html index f96cc7a..61032cc 100644 --- a/ui/builder.html +++ b/ui/builder.html @@ -159,6 +159,41 @@ input,textarea,button,select{font-family:inherit} .mBtn.cancel{background:var(--surface);color:var(--muted);border-color:var(--border)} .mBtn.cancel:hover{background:var(--surface-alt)} .hsep{height:1px;background:var(--border);margin:10px 0} + +/* ── Step 2: 캔버스 빌더 레이아웃 ─────────── */ +#panel-builder{flex-direction:column} +.canvas-toolbar{background:var(--surface);border-bottom:1px solid var(--border);padding:8px 12px;display:flex;align-items:center;gap:8px;flex-shrink:0} +.canvas-toolbar .root-row{flex:1;margin:0;border:none;background:transparent;padding:0;box-shadow:none} +.canvas-toolbar .root-row:focus-within{border:none;background:transparent} +.builder-main{flex:1;display:flex;overflow:hidden} +.canvas-wrap{flex:1;overflow:auto;background:#eaecf2;position:relative} +.canvas-inner{position:relative} +.canvas-svg{position:absolute;top:0;left:0;pointer-events:none;overflow:visible} +/* 캔버스 노드 카드 */ +.cnode{position:absolute;width:164px;background:var(--surface);border:1.5px solid var(--border);border-radius:var(--r);box-shadow:var(--sh);cursor:pointer;transition:border-color .15s,box-shadow .15s;user-select:none} +.cnode:hover{border-color:var(--border-focus)} +.cnode.selected{border-color:var(--accent);box-shadow:0 0 0 3px rgba(79,110,247,.12)} +.cnode-head{display:flex;align-items:center;gap:5px;padding:7px 9px;background:var(--surface-alt);border-bottom:1px solid var(--border);border-radius:calc(var(--r) - 1.5px) calc(var(--r) - 1.5px) 0 0} +.cnode.selected .cnode-head{background:var(--accent-bg)} +.cnode-mark{font-size:14px;flex-shrink:0;line-height:1} +.cnode-name{font-size:12px;font-weight:500;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.cnode-foot{display:flex;align-items:center;padding:4px 8px;gap:4px;min-height:28px} +.cnode-vals{font-size:10px;color:var(--muted);flex:1} +.cnode-btns{display:flex;gap:2px;opacity:0;transition:opacity .1s} +.cnode:hover .cnode-btns,.cnode.selected .cnode-btns{opacity:1} +.cnode-btn{width:18px;height:18px;display:flex;align-items:center;justify-content:center;border-radius:3px;border:none;cursor:pointer;font-size:10px;background:transparent;color:var(--muted);transition:all .1s;padding:0;flex-shrink:0} +.cnode-btn:hover{background:var(--accent-bg);color:var(--accent)} +.cnode-btn.del:hover{background:var(--red-bg);color:var(--red)} +.canvas-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:var(--muted);pointer-events:none;line-height:1.8} +/* 우측 패널 */ +.right-panel{width:400px;min-width:260px;display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--border)} +.detail-panel{flex:1;overflow-y:auto;background:var(--surface);display:flex;flex-direction:column} +.detail-panel::-webkit-scrollbar{width:5px} +.detail-panel::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px} +.detail-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:12px;font-style:italic;text-align:center;padding:20px} +.detail-hdr-lbl{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);padding:7px 12px 6px;border-bottom:1px solid var(--border);background:var(--surface-alt);flex-shrink:0} +.detail-node-head{display:flex;align-items:center;gap:5px;padding:8px 10px;border-bottom:1px solid var(--border);background:var(--surface-alt);flex-shrink:0} +.detail-body{padding:10px;display:flex;flex-direction:column;gap:8px}
@@ -175,41 +210,50 @@ input,textarea,button,select{font-family:inherit}