<!-- RUBY-BACKUP · part 310 -->
utton>'
        + '<button data-brush="sharpen" style="sculptbtn">⚡ Sharpen</button>'
        + '<button data-brush="bend" style="sculptbtn">🌀 Bend</button>'
        + '</div>'
        + '<div style="display:flex;gap:8px;justify-content:center;align-items:center;">'
        + '<span style="color:#888;font-size:11px;">POWER</span>'
        + '<input id="sculptPower" type="range" min="0.05" max="1" step="0.05" value="0.3" style="flex:1;accent-color:#ffd700;">'
        + '</div>'
        + '<div style="display:flex;gap:8px;justify-content:center;">'
        + '<button id="sculptApply" style="flex:1;background:#ffd700;color:#111;border:none;border-radius:8px;padding:12px;font-size:16px;cursor:pointer;font-weight:bold;">Apply</button>'
        + '<button id="sculptClose" style="background:#333;color:#fff;border:none;border-radius:8px;padding:12px 20px;font-size:16px;cursor:pointer;">X</button>'
        + '</div>';
      var st = document.createElement('style');
      st.textContent = '[data-brush]{background:#1a1a1a;color:#ffd700;border:1px solid #ffd700;border-radius:8px;padding:12px 16px;font-size:14px;cursor:pointer;} [data-brush].active{background:#ffd700;color:#111;}';
      document.head.appendChild(st);
      document.body.appendChild(sm);
      sm.querySelectorAll('[data-brush]').forEach(function(b){
        b.onclick = function(){
          sm.querySelectorAll('[data-brush]').forEach(function(x){ x.classList.remove('active'); });
          b.classList.add('active');
          _sculptBrush = b.getAttribute('data-brush');
        };
      });
      var _smb = sm.querySelector('[data-brush="smooth"]'); if(_smb) _smb.classList.add('active');
      document.getElementById('sculptPower').oninput = function(){ _sculptIntensity = parseFloat(this.value); };
      document.getElementById('sculptApply').onclick = function(){ applySculpt(); };
      document.getElementById('sculptClose').onclick = function(){ toggleSculptMode(); };
    }else{
      sm.style.display = 'flex';
    }
    codeStatus('sculpt mode — ' + _sculptBrush);
  }else if(sm){
    sm.style.display = 'none';
    codeStatus('sculpt closed');
  }
}
function applySculpt(){
  try{
    var target = window._highlighted || window._selectedBlock;
    if(!target){ codeStatus('no block selected'); return; }
    var brush = _sculptBrush;
    var power = _sculptIntensity;
    // snapshot for undo
    var snapshots = [];
    target.traverse(function(m){
      if(m.isMesh && m.geometry && m.geometry.attributes && m.geometry.attributes.position){
        var pos = m.geometry.attributes.position;
        var orig = new Float32Array(pos.array);
        snapshots.push({mesh:m, orig:orig});
        var norm = m.geometry.attributes.normal;
        for(var i=0; i<pos.count; i++){
          var nx = norm ? norm.getX(i) : 0, ny = norm ? norm.getY(i) : 1, nz = norm ? norm.getZ(i) : 0;
          var px = pos.getX(i), py = pos.getY(i), pz = pos.getZ(i);
          if(brush==='smooth'){
            // pull toward center (smooth)
            pos.setXYZ(i, px - nx*power*0.1, py - ny*power*0.1, pz - nz*power*0.1);
          }else if(brush==='sharpen'){
            // push along normal (sharpen)
            pos.setXYZ(i, px + nx*power*0.2, py + ny*power*0.2, pz + nz*power*0.2);
          }else if(brush==='bend'){
            // curve: displace by sine of position
            var bend = Math.sin(px*2 + py*2) * power * 0.3;
            pos.setXYZ(i, px + nx*bend, py + ny*bend, pz + nz*bend);
          }
        }
        pos.needsUpdate = true;
        m.geometry.computeVertexNormals();
      }
    });
    pushCommand({
      name: 'sculpt ' + brush,
      execute: function(){
        // re-apply is complex; store the result
        snapshots.forEach(function(s){
          var pos = s.mesh.geometry.attributes.position;
          // this is a simplified redo — full redo would need the delta
          pos.needsUpdate = true;
        });
      },
      undo: function(){
        snapshots.forEach(function(s){
          var pos = s.mesh.geometry.attributes.position;
          pos.array.set(s.orig);
          pos.needsUpdate = true;
          s.mesh.geometry.computeVertexNormals();
        });
      }
    });
    codeStatus('sculpted: ' + brush);
  }catch(e){ codeStatus('sculpt failed'); }
}
/* TRIM & CALIBRATE MODE — Playa 2.0 spec, 0.13 precision */
var _trimOpen = false;
var TRIM_STEP = 0.13;
function toggleTrimMode(){
  _trimOpen = !_trimOpen;
  var tm = document.getElementById('trimPanel');
  if(_trimOpen){
    var target = window._highlighted || window._selectedBlock;
    if(!target){ codeStatus('tap a block first, then trim'); _trimOpen = false; return; }
    if(!tm){
      tm = document.createElement('div');
      tm.id = 'trimPanel';
      tm.style.cssText = 'position:fixed;bottom:80px;left:50%;transform:translateX(-50%);z-index:15000;background:rgba(10,8,4,0.92);border:2px solid #ffd700;border-radius:16px;padding:12px;display:flex;flex-directi