<!-- SAGA-STAGING · part 51 -->
row"><span>⬛ Cube</span><div class="ctoggle" data-block="cube"></div></div>' +
    '<div class="cswitch-row"><span>⏳ V-Core</span><div class="ctoggle" data-block="hourglass"></div></div>' +
    '<div class="cswitch-row"><span>🗼 Pylon</span><div class="ctoggle" data-block="pylon"></div></div>' +
    '<div class="cswitch-row"><span>🔺 Tetra</span><div class="ctoggle" data-block="tetra"></div></div>' +
    '<div class="cswitch-row"><span>🔼 Pyramid</span><div class="ctoggle" data-block="pyramid"></div></div>' +
    '</div>' +
    // Tools (toggles)
    '<div style="flex:1;padding:8px;overflow-y:auto;">' +
    '<h3 style="font-size:12px;margin:0 0 8px 0;">TOOLS</h3>' +
    '<div class="cswitch-row"><span>👆 Select</span><div class="ctoggle" data-tool="select"></div></div>' +
    '<div class="cswitch-row"><span>✥ Move</span><div class="ctoggle" data-tool="move"></div></div>' +
    '<div class="cswitch-row"><span>🔄 Rotate</span><div class="ctoggle" data-tool="rotate"></div></div>' +
    '<div class="cswitch-row"><span>⤢ Scale</span><div class="ctoggle" data-tool="scale"></div></div>' +
    '<div class="cswitch-row"><span>📋 Duplicate</span><div class="ctoggle" data-tool="duplicate"></div></div>' +
    '<div class="cswitch-row"><span>🎨 Color</span><div class="ctoggle" data-tool="color"></div></div>' +
    '<div class="cswitch-row"><span>📐 Align 0-60</span><div class="ctoggle" data-tool="align"></div></div>' +
    '<div class="cswitch-row"><span>🗑 Delete</span><div class="ctoggle" data-tool="delete"></div></div>' +
    '<div class="cswitch-row"><span>↩ Undo</span><div class="ctoggle" data-tool="undo"></div></div>' +
    '<div id="creator-status" style="margin-top:12px;padding:12px;border:1px solid #ffd700;border-radius:8px;min-height:40px;font-size:13px;">Flip a block switch to spawn it</div>' +
    '</div></div>';
  document.body.appendChild(panel);
  var undoStack = [];
  var selected = null;
  var activeTool = 'select';
  var placedBlocks = [];
  function status(msg){ var el = document.getElementById('creator-status'); if(el) el.textContent = msg; }
  // NO OVERLAP: check bounding boxes
  function wouldOverlap(newObj){
    var newBox = new THREE.Box3().setFromObject(newObj);
    for(var i=0; i<placedBlocks.length; i++){
      var existingBox = new THREE.Box3().setFromObject(placedBlocks[i]);
      if(newBox.intersectsBox(existingBox)) return true;
    }
    return false;
  }
  function makeBlock(type){
    var g = new THREE.Group();
    if(type === 'cube'){
      g.add(new THREE.Mesh(new THREE.BoxGeometry(4,4,4), goldMat.clone()));
    } else if(type === 'hourglass'){
      var t = new THREE.Mesh(new THREE.ConeGeometry(2,3,4), goldMat.clone()); t.rotation.x = Math.PI; t.position.y = 1.5; g.add(t);
      var b = new THREE.Mesh(new THREE.ConeGeometry(2,3,4), goldMat.clone()); b.position.y = -1.5; g.add(b);
    } else if(type === 'pylon'){
      g.add(new THREE.Mesh(new THREE.CylinderGeometry(1,1.5,8,8), marbleMat.clone()));
    } else if(type === 'tetra'){
      g.add(new THREE.Mesh(new THREE.TetrahedronGeometry(3), cyanMat.clone()));
    } else if(type === 'pyramid'){
      var p1 = new THREE.Mesh(new THREE.ConeGeometry(3,2,4), goldMat.clone()); p1.position.y = 1; g.add(p1);
      var p2 = new THREE.Mesh(new THREE.ConeGeometry(2,1.5,4), marbleMat.clone()); p2.position.y = 2.75; g.add(p2);
    }
    g.traverse(function(o){ if(o.isMesh) o.castShadow = true; });
    return g;
  }
  // AUTO-ALIGN 60-300+: start at 60, 10 units apart, extends past 300 if needed
  function autoAlign(){
    placedBlocks.forEach(function(b, i){
      var x = 60 + (i * 10);
      b.position.x = x;
      b.position.z = 0;
    });
    var endX = 60 + ((placedBlocks.length - 1) * 10);
    status('Aligned 60-' + endX + ': ' + placedBlocks.length + ' blocks in a straight line');
  }
  window._unfoldAll = autoAlign; // exposed for gold wall button
  function spawnBlock(type){
    var b = makeBlock(type);
    var px = 0, pz = 0;
    if(window._sagaCamera){ px = window._sagaCamera.position.x; pz = window._sagaCamera.position.z; }
    // Try to place without overlap (spiral out if needed)
    b.position.set(px + 20, 10, pz + 20);
    b.userData.creatorBlock = true;
    b.userData.blockType = type;
    var attempts = 0;
    while(wouldOverlap(b) && attempts < 20){
      attempts++;
      b.position.x += 8;
      b.position.z += 8;
    }
    if(wouldOverlap(b)){
      status('Cannot place — no space (overlap prevented)');
      return;
    }
    scene.add(b);
    placedBlocks.push(b);
    undoStack.push({action:'add', obj:b});
    selected = b;
    status('Spawned ' + type + ' (' + placedBlocks.length + ' total)');
  }
  // Toggle switches
  function setToggle(el, on){
    if(on) el.classList.add('on');
    else el.classList.remove('on');
  }
  // Block toggles (flip ON to spawn)
  panel.querySelectorAll('[data-block]').forEach(function(toggle){
    toggle.addEventListener('click', function(){
      var isOn =