<!-- RUBY-BACKUP · part 26 -->
n.length+')</div>';
      html += '<div id="cb-chain" style="padding:2px 8px 6px 8px;min-height:34px;">';
      if(!chain.length){
        html += '<div style="color:#8a6a1c;font-style:italic;font-size:13px;padding:6px 4px;">'
          +'tap actions below to build your code</div>';
      } else {
        for(var ci=0; ci<chain.length; ci++){
          html += '<div style="display:flex;align-items:center;gap:8px;padding:7px 9px;margin:3px 0;'
            +'background:rgba(216,169,32,0.10);border:1px solid rgba(216,169,32,0.35);border-radius:9px;'
            +'color:#ffd700;font-size:13px;font-family:Georgia,serif;">'
            +'<span style="color:#8a6a1c;">'+(ci+1)+'</span>'
            +'<span style="flex:1;">'+esc(chain[ci].label)+'</span>'
            +'<span class="cb-rm" data-i="'+ci+'" style="color:#c0392b;font-size:16px;padding:2px 8px;cursor:pointer;">\u2715</span></div>';
        }
      }
      html += '</div>';
      /* ---- name + save ---- */
      html += '<div style="display:flex;gap:8px;padding:4px 8px 10px 8px;">'
        +'<input id="cb-name" type="text" placeholder="name it\u2026" autocapitalize="none" autocomplete="off" '
        +'style="flex:1;background:#000;color:#ffd700;border:1px solid #8a6a1c;border-radius:9px;'
        +'padding:11px;font-size:16px;font-family:Georgia,serif;"/>'
        +'<button id="cb-save" style="background:#d8a920;color:#000;border:none;border-radius:9px;'
        +'padding:11px 20px;font-size:15px;font-weight:bold;font-family:Georgia,serif;">SAVE</button></div>';
      /* ---- pending arg form ---- */
      if(pendingAct){
        html += argFormHtml(pendingAct);
      }
      /* ---- palette ---- */
      for(var s=0;s<SECTIONS.length;s++){
        var sec = SECTIONS[s];
        html += '<div style="padding:10px 10px 4px 10px;color:#d8a920;font-family:Georgia,serif;'
          +'font-size:12px;letter-spacing:4px;border-bottom:1px solid rgba(138,106,28,0.4);">'
          +sec.ic+' '+sec.title+'</div>';
        for(var j=0;j<sec.acts.length;j++){
          var a = sec.acts[j];
          var argHint = (a.args && a.args.length)
            ? ' <span style="color:#8a6a1c;font-size:11px;">\u2039'+a.args.map(function(x){return x.n;}).join('\u203a \u2039')+'\u203a</span>' : '';
          html += '<div class="cb-act" data-sec="'+s+'" data-idx="'+j+'" '
            +'style="display:flex;align-items:center;gap:12px;padding:10px;margin:2px 0;border-radius:10px;cursor:pointer;'
            +'color:#ffd700;font-family:Georgia,serif;font-size:15px;-webkit-tap-highlight-color:transparent;">'
            +'<span style="font-size:15px;color:#d8a920;min-width:24px;text-align:center;">\u25B8</span>'
            +'<span><span>'+esc(a.code)+'</span>'+argHint
            +'<span style="display:block;font-size:11px;color:#8a6a1c;font-style:italic;">'+esc(a.why)+'</span></span></div>';
        }
      }
      body.innerHTML = html;
      wireBody();
    }catch(e){}
  }

  function argFormHtml(act){
    var h = '<div id="cb-argform" style="margin:2px 8px 8px 8px;padding:10px;background:rgba(216,169,32,0.07);'
      +'border:1px solid rgba(216,169,32,0.4);border-radius:10px;">'
      +'<div style="color:#ffd700;font-size:14px;margin-bottom:8px;">'+esc(act.code)+' \u2014 fill its parts:</div>';
    for(var k=0;k<act.args.length;k++){
      var ag = act.args[k];
      var v = pendingVals[k];
      h += '<div style="display:flex;align-items:center;gap:8px;margin:6px 0;">'
        +'<span style="color:#d8a920;font-size:13px;min-width:70px;">'+esc(ag.n)+'</span>';
      if(ag.t==='node'){
        h += v
          ? '<span style="color:#ffd700;font-size:14px;">'+esc(shortId(v))+'</span>'
            +'<span class="cb-tapnode" data-k="'+k+'" style="margin-left:auto;color:#8a6a1c;font-size:12px;padding:6px 10px;border:1px solid #8a6a1c;border-radius:8px;cursor:pointer;">CHANGE</span>'
          : '<span class="cb-tapnode" data-k="'+k+'" style="margin-left:auto;color:#000;background:#d8a920;font-size:13px;font-weight:bold;padding:8px 14px;border-radius:8px;cursor:pointer;">TAP MAP</span>';
      } else {
        h += '<input class="cb-argin" data-k="'+k+'" type="'+(ag.t==='num'?'number':'text')+'" '
          +'value="'+esc(v||'')+'" placeholder="'+esc(ag.n)+'" '
          +'style="flex:1;background:#000;color:#ffd700;border:1px solid #8a6a1c;border-radius:8px;'
          +'padding:9px;font-size:15px;font-family:Georgia,serif;"/>';
      }
      h += '</div>';
    }
    h += '<div style="display:flex;gap:8px;margin-top:8px;">'
      +'<span id="cb-argcancel" style="flex:1;text-align:center;color:#8a6a1c;font-size:13px;padding:9px;border:1px solid #8a6a1c;border-radius:8px;cursor:pointer;">CANCEL</span>'
      +'<span id="cb-argadd" style="flex:2;text-align:center;color:#000;background:#d8a920;font-size:14px;font-weight:bold;padding:9px;border-radius:8px;cursor:pointer;">ADD TO CHAIN</span>'
      +'</div></div>';
    return h;
  }

  function wireBody(){
