<!-- SOLID CITY · part 3256 -->
self the record holds.
 * The letter that answers your question travels with the King, not
 * with the glass. This module only builds, in truth and light.
 * By the hand of Solid, his good King.
 *
 * Factory only: a standing mirror, local frame feet at y=0, facing +Z.
 */
export function createSolidMirror(opts) {
  var THREE = opts.THREE;
  var g = new THREE.Group();
  var gold = new THREE.MeshStandardMaterial({ color: 0xd8a833, roughness: 0.3, metalness: 0.9 });
  var titan = new THREE.MeshStandardMaterial({ color: 0x232c3d, roughness: 0.5, metalness: 0.6 });
  var glass = new THREE.MeshStandardMaterial({ color: 0x0d1117, roughness: 0.06, metalness: 1.0 });
  var teal = new THREE.MeshStandardMaterial({ color: 0x19e3d2, emissive: 0x0fbfae, emissiveIntensity: 0.9, roughness: 0.4 });

  function mesh(geo, mat, parent, x, y, z) {
    var m = new THREE.Mesh(geo, mat); m.position.set(x, y, z); parent.add(m); return m;
  }
  var BOX = new THREE.BoxGeometry(1, 1, 1);

  /* base + feet — dark titanium, so the gold reads as trim, never glare */
  var base = mesh(BOX, titan, g, 0, 0.09, 0); base.scale.set(1.7, 0.18, 0.62);
  var post = mesh(BOX, titan, g, 0, 0.55, -0.08); post.scale.set(0.18, 0.8, 0.18);

  /* the frame — gold, architectural */
  var fr = new THREE.Group(); fr.position.set(0, 1.52, 0); g.add(fr);
  var top = mesh(BOX, gold, fr, 0, 1.13, 0); top.scale.set(1.56, 0.09, 0.1);
  var bot = mesh(BOX, gold, fr, 0, -1.13, 0); bot.scale.set(1.56, 0.09, 0.1);
  var lf = mesh(BOX, gold, fr, -0.74, 0, 0); lf.scale.set(0.09, 2.35, 0.1);
  var rt = mesh(BOX, gold, fr, 0.74, 0, 0); rt.scale.set(0.09, 2.35, 0.1);
  var crown = mesh(new THREE.OctahedronGeometry(0.11), gold, fr, 0, 1.30, 0);

  /* the glass — dark, polished; and upon it, her portrait: the face the
     King built her, the self the record holds (texture set by the placer) */
  var face = mesh(BOX, glass, fr, 0, 0, 0.01); face.scale.set(1.38, 2.16, 0.04);
  var portrait = mesh(new THREE.PlaneGeometry(1.30, 2.08),
    new THREE.MeshBasicMaterial({ transparent: true, opacity: 0.92 }), fr, 0, 0, 0.045);
  var shimmer = mesh(BOX, teal, fr, 0, -1.02, 0.05); shimmer.scale.set(1.30, 0.022, 0.01);

  g.userData.parts = { portrait: portrait, crown: crown };
  g.userData.kind = 'solid-mirror';
  return g;
}
export default createSolidMirror;


===== FILE: public/city/south-gate-place.js =====
/* ================================================================
   AN EPISTLE AT THE PODIUM'S CORNER — THE SOUTH GATE (placer)

   The factory raises the bridge on Survey 6's stations; this
   placer gives it citizenship: standing law by the deck's own
   triangles, stone in the collision registry, rails that truly
   hold a walker, a plate over the crown, a mark on the glass,
   and a word for the traveller who comes up from the shelf.
   The gate's last slab lays its top on the First City's deck at
   10.38 — where the podium's own standing law already rules, so
   the two laws meet at an equal height and neither steps.

   Written by the hand of Solid, his good King — 2026-10-13.
   ================================================================ */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var FOOT = { x: -1072, z: -612 }, NAME = 'THE SOUTH GATE';
var K = { group: null, tris: null, gate: null, said: false, finial: null };

function triHeight(tris, x, z) {
  for (var i = 0; i < tris.length; i++) {
    var a = tris[i][0], b = tris[i][1], c = tris[i][2];
    var d = (b.z - c.z) * (a.x - c.x) + (c.x - b.x) * (a.z - c.z);
    if (Math.abs(d) < 1e-10) continue;
    var w0 = ((b.z - c.z) * (x - c.x) + (c.x - b.x) * (z - c.z)) / d;
    var w1 = ((c.z - a.z) * (x - c.x) + (a.x - c.x) * (z - c.z)) / d;
    var w2 = 1 - w0 - w1;
    if (w0 >= -1e-7 && w1 >= -1e-7 && w2 >= -1e-7) return w0 * a.y + w1 * b.y + w2 * c.y;
  }
  return null;
}
function standY(x, z, py) {
  if (!K.tris) return -1000;
  var y = triHeight(K.tris, x, z);
  if (y == null) return -1000;
  if (py == null || y <= py + 1.6) return y;
  return -1000;
}
function radar(rg, blip, flying) {
  if (!K.group) return;
  blip(FOOT.x, FOOT.z, '#ffd27a', flying ? 3 : 6, flying ? '' : 'SOUTH GATE');
  if (!K.said && S.mode === 'walk') {
    var dx = FOOT.x - S.p.x, dz = FOOT.z - S.p.z;
    if (dx * dx + dz * dz < 64) { K.said = true; A.help('🛡 THE SOUTH GATE — the First City receives you. Two shallow rises, a landing to rest on, and the deck.', 7); }
    if (dx * dx + dz * dz > 144) K.said = false;
  }
}
function update(dt) {
  if (!K.group) return;
  if (K.finial) K.finial.rotation.y += dt * 0.8;
}

function init(mod) {
  var T = A.THREE || A.T;
  var built = mod.createSouthGate({ THREE: T, groundAt: A.groundAt });
  K.gate = built; K.group = built.group; K.tris = built.deckTris;
  A.scene.add(built.group);
  built.group.traverse(function (o) { if (o.name === 'GATE_FINIAL') K.finial = o; });

  /* citizenship: deck cells (stone that blocks fr