<!-- RUBY-BACKUP · part 367 -->
         /* sync each layer's intaglio to its grow/shrink */
          var overlay = INTAGLIO_OVERLAYS[id];
          if(overlay){
            overlay.children.forEach(function(lw){
              try{
                var lr = lw.userData.layerRef;
                if(lr){
                  lw.position.copy(lr.position);
                  lw.rotation.copy(lr.rotation);
                  lw.scale.copy(lr.scale);
                }
              }catch(e){}
            });
          }
        }
      });
    }
  }catch(e){}
}
setInterval(function(){ try{ enforceAnchors(); }catch(e){} }, 100);
function showRubyHandles(obj){
  try{
    clearRubyHandles();
    if(!obj || !obj.isMesh) return;
    /* measure the block */
    var box = new THREE.Box3().setFromObject(obj);
    var size = new THREE.Vector3();
    box.getSize(size);
    var minDim = Math.min(size.x, size.y, size.z);
    /* too small — rubies would block it out, so no rubies */
    if(minDim < RUBY_MIN_SIZE) return;
    /* 8 corners */
    var min = box.min, max = box.max;
    var corners = [
      [min.x, min.y, min.z], [max.x, min.y, min.z],
      [min.x, max.y, min.z], [max.x, max.y, min.z],
      [min.x, min.y, max.z], [max.x, min.y, max.z],
      [min.x, max.y, max.z], [max.x, max.y, max.z]
    ];
    RUBY_HANDLES = new THREE.Group();
    var rubyGeo = new THREE.SphereGeometry(0.08, 12, 12);
    var rubyMat = new THREE.MeshStandardMaterial({
      color: 0xff0000, emissive: 0xff0000, emissiveIntensity: 1.5,
      roughness: 0.2, metalness: 0.8
    });
    corners.forEach(function(cp){
      var r = new THREE.Mesh(rubyGeo, rubyMat);
      r.position.set(cp[0], cp[1], cp[2]);
      r.userData.anchoredObj = obj;
      r.userData.isRubyHandle = true;
      RUBY_HANDLES.add(r);
    });
    scene.add(RUBY_HANDLES);
  }catch(e){}
}
function clearRubyHandles(){
  try{
    if(RUBY_HANDLES){
      scene.remove(RUBY_HANDLES);
      RUBY_HANDLES = null;
    }
  }catch(e){}
}
function isDescendantOf(obj, group){
  try{
    var p = obj;
    while(p){
      if(p === group) return true;
      p = p.parent;
    }
  }catch(e){}
  return false;
}
function tapToCrown(obj){
  try{
    /* activate crown mode if not already */
    if(typeof CROWN !== 'undefined' && !CROWN){
      if(typeof WALK !== 'undefined' && !WALK){
        if(typeof setWalk === 'function') setWalk(true);
      }
      CROWN = true;
      if(typeof glide !== 'undefined') glide = null;
    }
    /* lock eyes on the object */
    if(obj && typeof camera !== 'undefined' && camera){
      var wp = new THREE.Vector3();
      obj.getWorldPosition(wp);
      /* store the lock target */
      window._crownLockTarget = wp.clone();
      codeStatus('eyes locked');
    }
    /* show the pad for this object */
    /* find the root group */
    var root = obj;
    while(root.parent && root.parent !== scene) root = root.parent;
    showHandPad(root);
  }catch(e){}
}
/* crown lock — keep looking at the target */
var _origCrownUpdate = null;
function updateCrownLock(){
  try{
    if(typeof CROWN !== 'undefined' && CROWN && window._crownLockTarget){
      if(typeof camera !== 'undefined' && camera){
        camera.lookAt(window._crownLockTarget);
      }
    }
  }catch(e){}
}
/* === THE HAND PAD — tap an object in crown mode, shape it in your hand === */
var PAD_SELECTED = null;
var PAD_FOLLOW = false;
var PAD_DIST = 3;
var PAD_HEIGHT_OFF = 0;
var _padEl = null;
var _padPartList = null;

function showHandPad(obj){
  PAD_SELECTED = obj;
  hideHandPad();
  _padEl = document.createElement('div');
  _padEl.id = 'handpad';
  _padEl.style.cssText = 'position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10002;width:300px;background:rgba(12,10,6,0.95);border:2px solid #d8a920;border-radius:16px;padding:16px;color:#ffd700;font-family:Georgia,serif;box-shadow:0 0 30px rgba(216,169,32,0.3);';
  /* title */
  var title = document.createElement('div');
  title.textContent = (obj.name || 'object').substring(0, 20);
  title.style.cssText = 'font-weight:bold;font-size:16px;margin-bottom:12px;text-align:center;border-bottom:1px solid #8a6a1c;padding-bottom:8px;';
  _padEl.appendChild(title);
  /* UP/DOWN size buttons — press up to grow, down to shrink */
  var sizeRow = document.createElement('div');
  sizeRow.style.cssText = 'display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:15px 0;';
  var upBtn = document.createElement('button');
  upBtn.innerHTML = '&#9650;'; /* up triangle */
  upBtn.title = 'Grow — not allowed: only take away';
  upBtn.style.cssText = 'padding:20px;font-size:28px;background:#3a3a3a;color:#666;border:1px solid #555;border-radius:12px;font-weight:bold;cursor:not-allowed;opacity:0.4;';
  upBtn.disabled = true;
  var downBtn = document.createElement('button');
  downBtn.innerHTML = '&#9660;'; /* down triangle */
  downBtn.title = 'Shrink';
  downBtn.style.cssText = 'padding:20px;font-size:28px;background:#8a6a1c;color:#fff;border:none;border-radius:12px;fon