diff --git a/ui/builder.html b/ui/builder.html index 3e5a5bd..ed8f1cb 100644 --- a/ui/builder.html +++ b/ui/builder.html @@ -105,6 +105,11 @@ input,textarea,button,select{font-family:inherit} .npl-inp:disabled{background:var(--surface-alt);color:var(--muted)} .opt-hint{font-size:10px;color:var(--muted)} +/* ── 구분자 설정 바 ───────────────────────── */ +.sep-bar{background:var(--surface-alt);border:1px solid var(--border);border-radius:5px;padding:5px 8px;display:flex;flex-direction:column;gap:4px} +.sep-bar-row{display:flex;align-items:center;gap:5px} +.sep-bar-lbl{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);width:52px;flex-shrink:0} + /* ── 노드 설정 ────────────────────────────── */ .setting-row{display:flex;align-items:center;gap:5px;padding:3px 0} .setting-lbl{font-size:11px;color:var(--muted);width:54px;flex-shrink:0} @@ -278,7 +283,8 @@ const SEP_PRESETS = [ function uid(){ return Math.random().toString(36).slice(2,9) } function mkNode(mark='', content=''){ - return { id:uid(), mark, content, hidden:false, values:[], settings:{} }; + return { id:uid(), mark, content, hidden:false, values:[], settings:{}, + nextSep:'blank', childSep:'blank' }; } function mkListVal(names='', category=''){ return { id:uid(), type:'list', names, sep:' ', namesPerLine:0, category }; @@ -319,15 +325,22 @@ function save(){ try{ localStorage.setItem('ctstruct-v4', JSON.stringify(S)) }ca function load(){ try{ const raw=localStorage.getItem('ctstruct-v4'); - if(raw){ S=JSON.parse(raw); return; } - // try migrating old format + if(raw){ S=JSON.parse(raw); normalizeState(S); return; } const old=localStorage.getItem('ctstruct-builder'); if(old){ const o=JSON.parse(old); S=migrateOld(o); save(); return; } }catch(_){} - // default example S=buildExample(); } +function normalizeNode(n){ + if(n.nextSep===undefined) n.nextSep='blank'; + if(n.childSep===undefined) n.childSep='blank'; + for(const v of n.values||[]) if(v.type==='node') normalizeNode(v.node); +} +function normalizeState(s){ + for(const n of s.nodes||[]) normalizeNode(n); +} + function migrateOld(o){ const titleMark = o.titleMark ?? o.cfg?.titleMark ?? '✅'; const oldMarks = o.cfg?.marks ?? []; @@ -511,6 +524,7 @@ function renderNode(node, nested){ ${!node.hidden?`