<!-- SOLID CITY · part 2124 -->
olid(-W/2,0,t,D,0,H);
  box(t,H,D,M.wall, W/2,H/2,0); solid(W/2,0,t,D,0,H);
  var segW=(W-doorW)/2;
  box(segW,H,t,M.glass, -(doorW/2+segW/2),H/2,D/2); solid(-(doorW/2+segW/2),D/2,segW,t,0,H);
  box(segW,H,t,M.glass, (doorW/2+segW/2),H/2,D/2); solid((doorW/2+segW/2),D/2,segW,t,0,H);
  box(doorW,1.4,t,M.glass, 0,H-0.7,D/2);
  box(0.5,H,t+0.35,M.gold, -doorW/2,H/2,D/2);
  box(0.5,H,t+0.35,M.gold, doorW/2,H/2,D/2);
  box(doorW+0.6,0.5,t+0.35,M.gold, 0,H-0.25,D/2);
  // sign (gold letters)
  var sign=new T.Mesh(new T.PlaneGeometry(13,3.2),
    new T.MeshBasicMaterial({map:M.sign(o.name)}));
  sign.position.set(0,H+2.4,D/2+0.5); g.add(sign);
  // awning
  var awn=box(W*0.92,0.22,3.6,M.awn, 0,H-1.4,D/2+1.9); awn.rotation.x=0.28;
  // ceiling light strips
  [-4.5,4.5].forEach(function(lx){ box(3.2,0.14,1.1,M.strip, lx,H-0.12,0); });
  // trade fit-out
  o.fit(box, solid, M);
  root.add(g);
  return g;
}
// ---- fixture kit (shared) ----
function fxShelf(box,solid,M,x,z,w,prods){
  var d=1.1;
  box(w,2.6,0.18,M.shelf, x,1.3,z-d/2);
  [0.7,1.45,2.2].forEach(function(sy){
    box(w,0.12,d,M.shelf, x,sy,z);
    var n=Math.max(2,Math.floor(w/1.6));
    for(var i=0;i<n;i++){
      var px=x-w/2+0.8+i*(w-1.6)/(n-1);
      box(1.1,0.55,0.85,prods[(i+((x*7)|0))%prods.length], px,sy+0.34,z);
    }
  });
  solid(x,z,w,d,0,2.6);
}
function fxCounter(box,solid,M,x,z,w){
  box(w,1.1,1.6,M.counter, x,0.55,z);
  box(w+0.3,0.14,1.9,M.gold, x,1.16,z);
  box(0.9,0.5,0.7,M.register, x+w/2-1.2,1.45,z); // register
  solid(x,z,w,1.6,0,1.2);
}
function buildRetailRow(T, root, foot, o) {
  var R=o.R;
  // materials
  var M={
    gold:o.gold,
    wall:new T.MeshLambertMaterial({color:0x2e3238}),
    floor:new T.MeshLambertMaterial({color:0x3d4149}),
    ceil:new T.MeshLambertMaterial({color:0x22262c}),
    glass:new T.MeshLambertMaterial({color:0x9fc4e8,transparent:true,opacity:0.4}),
    awn:new T.MeshLambertMaterial({color:0x8a2a3a}),
    strip:new T.MeshBasicMaterial({color:0xffe8c0}),
    shelf:new T.MeshLambertMaterial({color:0x5a4028}),
    counter:new T.MeshLambertMaterial({color:0x3a3f47}),
    register:new T.MeshLambertMaterial({color:0x1a1c20}),
    table:new T.MeshLambertMaterial({color:0x8a6a48}),
    chair:new T.MeshLambertMaterial({color:0x6a4a3a}),
    rackBar:new T.MeshLambertMaterial({color:0xb0b6be}),
    caseGlass:new T.MeshLambertMaterial({color:0xcfe4f8,transparent:true,opacity:0.3}),
    glowA:new T.MeshBasicMaterial({color:0x7ad8ff}),
    glowB:new T.MeshBasicMaterial({color:0xffb86a}),
    sign:function(name){
      var c=document.createElement('canvas');c.width=512;c.height=128;
      var x2=c.getContext('2d');
      x2.fillStyle='#14161a';x2.fillRect(0,0,512,128);
      x2.strokeStyle='#d8aa48';x2.lineWidth=4;x2.strokeRect(6,6,500,116);
      x2.fillStyle='#e8c86a';x2.textAlign='center';x2.textBaseline='middle';
      var fs=name.length>14?34:44;
      x2.font='bold '+fs+'px Georgia,serif';x2.fillText(name,256,66);
      var t=new T.CanvasTexture(c);t.encoding=T.sRGBEncoding;t.anisotropy=4;return t;
    }
  };
  var prodCols=[0xc84a4a,0x4a8ac8,0x4ac86a,0xc8a44a,0x8a4ac8,0x4ac8c8].map(function(c){
    return new T.MeshLambertMaterial({color:c});
  });
  var bookCols=[0x8a2a2a,0x2a4a8a,0x2a6a3a,0x8a6a2a,0x5a2a8a,0x2a8a7a].map(function(c){
    return new T.MeshLambertMaterial({color:c});
  });
  var clothCols=[0xd84a6a,0x4a7ad8,0x4ad88a,0xe8c86a,0x9a5ad8,0x5ad8d8].map(function(c){
    return new T.MeshLambertMaterial({color:c});
  });
  var foodCols=[0xe86a3a,0x7ad83a,0xe8d83a,0xd83a5a,0x3ad88a].map(function(c){
    return new T.MeshLambertMaterial({color:c});
  });
  var goldCols=[0xd8aa48,0xf2d88a,0xb8862a].map(function(c){
    return new T.MeshLambertMaterial({color:c,emissive:0x4a2e08,emissiveIntensity:0.5});
  });

  // local helpers that need box/solid — defined per store via fit()
  function tableSet(bx,sl,x,z){
    var tm=new T.Mesh(new T.CylinderGeometry(1.1,1.1,0.14,10),M.table);
    // fallback: use bx for top
    bx(2.2,0.14,2.2,M.table, x,0.85,z);
    bx(0.25,0.85,0.25,M.table, x,0.42,z);
    [[-1.6,0],[1.6,0],[0,-1.6],[0,1.6]].forEach(function(p){
      bx(0.9,0.9,0.9,M.chair, x+p[0],0.45,z+p[1]);
      sl(x+p[0],z+p[1],0.9,0.9,0,0.9);
    });
    sl(x,z,2.2,2.2,0,0.9);
  }
  function rack(bx,sl,x,z){
    bx(0.18,1.7,0.18,M.rackBar, x-1.5,0.85,z);
    bx(0.18,1.7,0.18,M.rackBar, x+1.5,0.85,z);
    bx(3.2,0.12,0.12,M.rackBar, x,1.65,z);
    for(var i=0;i<5;i++){
      var px=x-1.2+i*0.6;
      bx(0.45,0.9,0.25,clothCols[i%clothCols.length], px,1.1,z);
    }
    sl(x,z,3.4,0.6,0,1.7);
  }
  function produceStand(bx,sl,x,z,w){
    bx(w,0.9,2.2,M.table, x,0.45,z);
    for(var i=0;i<Math.floor(w/1.4);i++){
      var px=x-w/2+0.7+i*1.4;
      var s=new T.Mesh(new T.SphereGeometry(0.32,8,6),foodCols[i%foodCols.length]);
      // use bx with a box approx (sphere needs mesh) — do small boxes
      bx(0.55,0.5,0.55,foodCols[i%foodCols.length], px,1.15,z-0.4);
      bx(0.55,0.5,0.5