<!-- SOLID CITY · part 2125 -->
5,foodCols[(i+2)%foodCols.length], px,1.15,z+0.4);
    }
    sl(x,z,w,2.2,0,1.4);
  }
  function jewelryCase(bx,sl,x,z,w){
    bx(w,1.0,1.4,M.counter, x,0.5,z);
    bx(w,0.9,1.2,M.caseGlass, x,1.45,z);
    for(var i=0;i<3;i++){
      var px=x-w/2+1+i*(w-2)/2;
      bx(0.5,0.35,0.5,goldCols[i%3], px,1.2,z);
    }
    sl(x,z,w,1.4,0,1.9);
  }
  function flowerStand(bx,sl,x,z){
    bx(1.2,1.0,1.2,M.counter, x,0.5,z);
    var cols=[0xe84a7a,0xe8e84a,0xd84ad8,0xff8a5a];
    for(var i=0;i<4;i++){
      var a=i*Math.PI/2;
      bx(0.5,0.5,0.5,new T.MeshLambertMaterial({color:cols[i]}), x+Math.cos(a)*0.35,1.25,z+Math.sin(a)*0.35);
    }
    bx(0.12,0.5,0.12,M.shelf, x,1.0,z);
    sl(x,z,1.2,1.2,0,1.5);
  }

  var stores=[
    {x:-139,z:-10,ry:-Math.PI/2,name:'THE GOLDEN CRUMB',fit:function(bx,sl){
      fxCounter(bx,sl,M,-4,-4.5,8);
      for(var i=0;i<3;i++) bx(1.6,0.5,1.0,foodCols[i%5], -6+i*2,1.45,-4.5); // pastries on counter
      tableSet(bx,sl,3,-2); tableSet(bx,sl,3,3); tableSet(bx,sl,-2,2);
      fxShelf(bx,sl,M,-6,4.5,5,prodCols);
    }},
    {x:-139,z:15,ry:-Math.PI/2,name:'THREAD & TIDE',fit:function(bx,sl){
      rack(bx,sl,-5,-3); rack(bx,sl,0,-3); rack(bx,sl,5,-3);
      rack(bx,sl,-5,2); rack(bx,sl,5,2);
      fxShelf(bx,sl,M,0,4.5,6,clothCols);
      fxCounter(bx,sl,M,5.5,4.5,4);
    }},
    {x:-93.5,z:35.5,ry:0,name:'VOLT & CIRCUIT',fit:function(bx,sl){
      [-5,0,5].forEach(function(px){
        bx(4,0.9,2,M.counter, px,0.45,0);
        for(var i=0;i<3;i++) bx(0.7,0.12,0.5,i%2?M.glowA:M.glowB, px-1.2+i*1.2,1.0,0);
        sl(px,0,4,2,0,1.0);
      });
      bx(10,3,0.3,M.glowA, 0,3.5,-6.5); // screen wall
      fxCounter(bx,sl,M,0,4.8,6);
    }},
    {x:-120,z:-28.5,ry:Math.PI,name:'HARVEST ROW',fit:function(bx,sl){
      produceStand(bx,sl,-4,-2,6); produceStand(bx,sl,4,-2,6);
      produceStand(bx,sl,0,2.5,8);
      fxShelf(bx,sl,M,-6,4.8,4,prodCols);
      fxCounter(bx,sl,M,6,4.8,4);
    }},
    {x:-95,z:-28.5,ry:Math.PI,name:'THE GILDED CASE',fit:function(bx,sl){
      jewelryCase(bx,sl,-4,0,6); jewelryCase(bx,sl,3.5,0,6);
      bx(3,0.14,1,M.strip, 0,6.5,0);
      fxCounter(bx,sl,M,0,5,5);
    }},
    {x:-18,z:130,ry:Math.PI,name:'SALT & SMOKE',fit:function(bx,sl){
      fxCounter(bx,sl,M,0,-4.5,10);
      for(var i=0;i<4;i++) bx(1.2,0.4,0.8,foodCols[(i+1)%5], -3.5+i*2.2,1.4,-4.5);
      tableSet(bx,sl,-4,2); tableSet(bx,sl,4,2);
      bx(8,2.5,0.4,M.shelf, 0,3,-6.5); // kitchen back
    }},
    {x:7,z:130,ry:Math.PI,name:'THE LENS',fit:function(bx,sl){
      [-4,0,4].forEach(function(px){
        bx(3,2.2,0.9,M.shelf, px,1.1,-4);
        bx(0.9,0.6,0.6,M.register, px,2.35,-4);
        var lens=new T.Mesh(new T.CylinderGeometry(0.22,0.22,0.3,10),M.glowA);
        // cylinder via box approx
        bx(0.44,0.44,0.3,M.glowA, px,2.35,-3.5);
        sl(px,-4,3,0.9,0,2.2);
      });
      bx(6,3,0.25,M.glowB, 0,3.5,5); // poster wall near front
      fxCounter(bx,sl,M,-5,4.5,4);
    }},
    {x:60,z:75,ry:0,name:'PETAL & STONE',fit:function(bx,sl){
      flowerStand(bx,sl,-5,-2); flowerStand(bx,sl,0,-2); flowerStand(bx,sl,5,-2);
      flowerStand(bx,sl,-2.5,2); flowerStand(bx,sl,2.5,2);
      fxCounter(bx,sl,M,0,5,6);
    }},
    {x:82,z:75,ry:0,name:'THE DEEP CUT',fit:function(bx,sl){
      [-4,0,4].forEach(function(px){
        bx(1.1,0.7,1.1,M.chair, px,0.35,0);
        bx(1.1,1.0,0.18,M.caseGlass, px,1.9,-0.8); // mirror
        bx(0.9,0.25,0.9,M.chair, px,0.85,0);
        sl(px,0,1.2,1.2,0,1.0);
      });
      bx(8,2.4,0.3,M.caseGlass, 0,2.8,-6.5); // mirror wall
      fxCounter(bx,sl,M,5.5,4.5,4);
    }},
    {x:104,z:75,ry:0,name:'COPPER KETTLE',fit:function(bx,sl){
      [[-4,-2],[0,-2],[4,-2],[-2,2],[2,2]].forEach(function(p){
        bx(1.6,0.35,1.6,M.table, p[0],0.18,p[1]);
        bx(0.7,0.5,0.7,M.chair, p[0],0.25,p[1]+1.2);
        sl(p[0],p[1],1.6,2.4,0,0.5);
      });
      fxCounter(bx,sl,M,0,5,8);
      for(var i=0;i<4;i++) bx(0.4,0.5,0.4,M.register, -3+i*2,1.45,5); // kettles
      fxShelf(bx,sl,M,-6,-5,4,prodCols);
    }},
    {x:126,z:75,ry:0,name:'INK & IRON',fit:function(bx,sl){
      fxShelf(bx,sl,M,-5,-4,6,bookCols); fxShelf(bx,sl,M,2,-4,6,prodCols);
      bx(5,0.9,2.4,M.table, 0,0.45,1.5);
      for(var i=0;i<4;i++) bx(0.8,0.25,1.1,bookCols[i%6], -1.8+i*1.2,1.0,1.5);
      sl(0,1.5,5,2.4,0,1.1);
      fxCounter(bx,sl,M,5.5,4.5,4);
    }},
    {x:-30,z:110,ry:0,name:'THE QUIET PAGE',fit:function(bx,sl){
      [-6,-2,2,6].forEach(function(px){ fxShelf(bx,sl,M,px,-3,3,bookCols); });
      tableSet(bx,sl,0,3);
      fxCounter(bx,sl,M,-5.5,4.5,4);
    }}
  ];
  stores.forEach(function(s){ buildStore(T, root, foot, M, s); });

  // ---- shopping street furniture: benches + planters along the east row ----
  var benchM=new T.MeshLambertMaterial({color:0x6a5a40});
  var leafM=new T.MeshLambertMaterial({color:0x2e6a34});
  [48,70,92,114].forEach(function(bx){
    var b=new T.Mesh(new T.BoxGeometry(3,0.5,1.2),benchM);
    b.position.set(bx,0.6,62);