<!-- SOLID CITY · part 2073 -->
  g.strokeStyle='#d8a833';g.lineWidth=5;g.strokeRect(7,7,498,114);
  g.fillStyle='#e8c86a';g.textAlign='center';g.textBaseline='middle';
  g.font='bold 46px Georgia,serif';g.fillText(text,256,66);
  var t=new T.CanvasTexture(c);t.encoding=T.sRGBEncoding;t.anisotropy=4;return t;
}
function quietMarker(T,text){
  var grp=new T.Group();
  var stone=new T.Mesh(new T.BoxGeometry(4.4,0.6,2.2),new T.MeshLambertMaterial({color:0x1e2228}));
  stone.position.y=0.65;stone.rotation.x=-0.45;grp.add(stone);
  var face=new T.Mesh(new T.PlaneGeometry(4.0,1.0),new T.MeshBasicMaterial({map:textPlate(T,text)}));
  face.position.set(0,0.88,0.52);face.rotation.x=-0.45;grp.add(face);
  var base=new T.Mesh(new T.BoxGeometry(4.6,0.3,2.4),new T.MeshLambertMaterial({color:0x14171c}));
  base.position.y=0.15;grp.add(base);
  return grp;
}
function facadeTex(T){
  var c=document.createElement('canvas');c.width=128;c.height=256;
  var g=c.getContext('2d');
  var gr=g.createLinearGradient(0,0,0,256);
  gr.addColorStop(0,'#8fb8dd');gr.addColorStop(0.5,'#6a9ac8');gr.addColorStop(1,'#4a76a8');
  g.fillStyle=gr;g.fillRect(0,0,128,256);
  g.fillStyle='rgba(18,34,58,0.6)';
  for(var y=6;y<256;y+=14)for(var x=4;x<128;x+=12){ g.fillRect(x,y,8,9); }
  g.fillStyle='rgba(255,255,255,0.22)';
  for(var y2=6;y2<256;y2+=14)for(var x2=4;x2<128;x2+=12){ g.fillRect(x2,y2,8,2); }
  var t=new T.CanvasTexture(c);t.encoding=T.sRGBEncoding;
  t.wrapS=t.wrapT=T.RepeatWrapping;return t;
}
function portholeTex(T){
  var c=document.createElement('canvas');c.width=c.height=128;
  var g=c.getContext('2d');
  var gr=g.createRadialGradient(64,64,4,64,64,64);
  gr.addColorStop(0,'#fff8e8');gr.addColorStop(0.25,'#f2c86a');
  gr.addColorStop(0.5,'#9a6ae8');gr.addColorStop(0.75,'#4a6ae8');gr.addColorStop(1,'#1a1a3a');
  g.fillStyle=gr;g.beginPath();g.arc(64,64,64,0,7);g.fill();
  g.strokeStyle='#f2c86a';g.lineWidth=3;
  for(var r=12;r<64;r+=13){ g.beginPath();g.arc(64,64,r,0,7);g.stroke(); }
  var t=new T.CanvasTexture(c);t.encoding=T.sRGBEncoding;return t;
}

export function createAnnex(o){
  var T=o.THREE, P=o.position||{x:0,y:0,z:0};
  var root=new T.Group(); root.name='hyper-annex'; root.position.set(P.x,P.y,P.z);
  var foot=[]; var elevators=[]; var standFloors=[]; var portholeMeshes=[]; var floorLamps=[];
  var R=mulberry(777);

  /* ============ UNIFIED PALETTE (strict) ============ */
  var titanium=new T.MeshLambertMaterial({color:0x232c3d});            // dark titanium
  var titaniumDeep=new T.MeshLambertMaterial({color:0x161b24});        // deep titanium
  var silver=new T.MeshLambertMaterial({color:0x9aa4b5});              // brushed silver
  var silverLight=new T.MeshLambertMaterial({color:0xc8ccd4});         // light silver
  var gold=new T.MeshLambertMaterial({color:0xd8a833,emissive:0x3a2408,emissiveIntensity:0.6}); // restrained gold
  var goldTrim=new T.MeshBasicMaterial({color:0xd8a833});
  var glass=new T.MeshLambertMaterial({map:facadeTex(T),emissive:0x14263c,emissiveIntensity:0.4}); // facade glass
  var winGlass=new T.MeshLambertMaterial({color:0x9fc4e0,transparent:true,opacity:0.45}); // window glass
  var doorGlassM=new T.MeshLambertMaterial({color:0xbcd8ea,transparent:true,opacity:0.35});
  var stoneFloor=new T.MeshLambertMaterial({color:0x5e646e});          // lobby stone
  var medallionM=new T.MeshLambertMaterial({color:0x6e747e});
  var wallInt=new T.MeshLambertMaterial({color:0xcfc9bd});             // warm interior wall
  var ceilM=new T.MeshLambertMaterial({color:0xe8e2d4});
  var woodDark=new T.MeshLambertMaterial({color:0x5a3d24});
  var sofaM=new T.MeshLambertMaterial({color:0x3d5a78});
  var leafM=new T.MeshLambertMaterial({color:0x2e6a34});
  var warmLight=new T.MeshBasicMaterial({color:0xffe8a0});
  var steelOld=new T.MeshLambertMaterial({color:0x3a4048});

  function box(w,h,d,mat,x,y,z){
    var m=new T.Mesh(new T.BoxGeometry(w,h,d),mat);
    m.position.set(x,y,z); root.add(m); return m;
  }
  function solid(x,z,w,d,y0,y1){ foot.push([x,z,w,d,y0,y1,0]); }

  /* ============ REUSABLE COMPONENT: finished column ============ */
  // plinth + silver shaft + gold reveal + capital. Total height h.
  function finishedColumn(x,z,h){
    var g=new T.Group(); g.position.set(x,0,z); root.add(g);
    function cbox(w,h2,d,mat,y){ var m=new T.Mesh(new T.BoxGeometry(w,h2,d),mat); m.position.y=y; g.add(m); return m; }
    cbox(2.0,0.8,2.0,titaniumDeep,0.4);                       // plinth
    var shaft=new T.Mesh(new T.CylinderGeometry(0.85,0.95,h-2.2,12),silver);
    shaft.position.y=0.8+(h-2.2)/2; g.add(shaft);            // shaft
    var rev=new T.Mesh(new T.CylinderGeometry(0.92,0.92,0.18,12),gold);
    rev.position.y=h-1.3; g.add(rev);                        // gold reveal
    cbox(1.7,0.7,1.7,titanium,h-0.65);                        // capital
    cbox(2.0,0.25,2.0,titaniumDeep,h-0.12);                   // abacus
    solid(x,z,2.0,2.0,0,h);
  }

  /* ============ REUSABLE COMPONENT: door frame ============ *