<!-- SAGA-STAGING · part 52 -->
 toggle.classList.contains('on');
      // Turn off all block toggles (mutual exclusion)
      panel.querySelectorAll('[data-block]').forEach(function(t){ setToggle(t, false); });
      if(!isOn){
        setToggle(toggle, true);
        spawnBlock(toggle.getAttribute('data-block'));
        // Auto-reset after spawn
        setTimeout(function(){ setToggle(toggle, false); }, 500);
      }
      panel.style.display = 'none'; // close to see the block
    });
  });
  // Tool toggles
  panel.querySelectorAll('[data-tool]').forEach(function(toggle){
    toggle.addEventListener('click', function(){
      var tool = toggle.getAttribute('data-tool');
      var isOn = toggle.classList.contains('on');
      panel.querySelectorAll('[data-tool]').forEach(function(t){ setToggle(t, false); });
      if(tool === 'align'){
        autoAlign();
        panel.style.display = 'none';
        return;
      }
      if(tool === 'undo' && undoStack.length > 0){
        var last = undoStack.pop();
        if(last.action === 'add'){
          scene.remove(last.obj);
          var idx = placedBlocks.indexOf(last.obj);
          if(idx > -1) placedBlocks.splice(idx, 1);
        } else if(last.action === 'remove'){
          scene.add(last.obj);
          placedBlocks.push(last.obj);
        }
        status('Undone');
        return;
      }
      if(!isOn){
        setToggle(toggle, true);
        activeTool = tool;
        if(tool === 'duplicate' && selected){
          var copy = makeBlock(selected.userData.blockType);
          copy.position.copy(selected.position);
          copy.position.x += 10;
          copy.userData.creatorBlock = true;
          copy.userData.blockType = selected.userData.blockType;
          if(!wouldOverlap(copy)){
            scene.add(copy);
            placedBlocks.push(copy);
            undoStack.push({action:'add', obj:copy});
            status('Duplicated');
          } else {
            status('Cannot duplicate — would overlap');
          }
          panel.style.display = 'none';
        } else if(tool === 'delete' && selected){
          scene.remove(selected);
          var di = placedBlocks.indexOf(selected);
          if(di > -1) placedBlocks.splice(di, 1);
          undoStack.push({action:'remove', obj:selected});
          selected = null;
          status('Deleted');
          panel.style.display = 'none';
        } else if(tool === 'color' && selected){
          var colors = [0xffd700, 0x00ccff, 0xff4444, 0xffffff, 0x1a1a1a];
          selected.traverse(function(o){ if(o.isMesh) o.material.color.setHex(colors[Math.floor(Math.random()*colors.length)]); });
          status('Recolored');
          panel.style.display = 'none';
        } else {
          status('Tool: ' + tool + ' active — tap a block in the world');
          panel.style.display = 'none';
        }
      }
    });
  });
  panel.querySelector('#creator-close').addEventListener('click', function(){
    panel.style.display = 'none';
  });
  // Tap blocks in world
  var raycaster = new THREE.Raycaster();
  var mouse = new THREE.Vector2();
  document.addEventListener('click', function(e){
    if(panel.style.display === 'flex') return;
    if(!window._sagaCamera) return;
    /* THE TOUCH — only logged-in players engage blocks */
    if(typeof canTouch === "function" && !canTouch()){
      if(typeof say === "function") say("Halt! Who goes there? Log in to touch.");
      return;
    }
    var x = (e.clientX / window.innerWidth) * 2 - 1;
    var y = -(e.clientY / window.innerHeight) * 2 + 1;
    mouse.set(x, y);
    raycaster.setFromCamera(mouse, window._sagaCamera);
    var hits = raycaster.intersectObjects(placedBlocks, true);
    if(hits.length > 0){
      var obj = hits[0].object;
      while(obj.parent && !obj.userData.creatorBlock) obj = obj.parent;
      selected = obj;
      if(activeTool === 'move'){
        // Move with no-overlap check
        var oldX = selected.position.x;
        selected.position.x += 5;
        if(wouldOverlap(selected)){
          selected.position.x = oldX;
          if(typeof say === 'function') say('Blocked — would overlap');
        }
      } else if(activeTool === 'rotate'){
        selected.rotation.y += Math.PI/4;
      } else if(activeTool === 'scale'){
        selected.scale.multiplyScalar(1.2);
        if(wouldOverlap(selected)){
          selected.scale.multiplyScalar(1/1.2);
          if(typeof say === 'function') say('Blocked — would overlap');
        }
      } else {
        if(typeof say === 'function') say('Selected ' + (selected.userData.blockType || 'block'));
      }
    }
  });
  window.openCreator = function(){
    panel.style.display = 'flex';
    status('Flip a block switch to spawn it — nothing overlaps, Align 0-60 lines them up');
  };
  var menu = document.getElementById('playa2-menu');
  if(menu && !document.getElementById('menu-creator-btn')){
    var cb = document.createElement('button');
    cb.id = 'menu-creator-btn';
    cb.t