<!-- SOLID CITY · part 2869 -->
ok sightline and the spawn. Gold-engraved plaque; collision; no-build zone (forge-core.js);
   radar "DO!"; Hyper stop "ALL THAT WE CAN DO! podium" (READ); ?to=podium.
   READ opens a portrait-first glass panel built from ONE data file, /city/features.json (only real, working features), plus
   the University course catalog (/city/curriculum.json) and the Beauty Log catalog (/api/beauty?brief=1): three cross-linked tabs.
   Everything is put on screen escaped (textContent / esc). */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, T = A.T, S = A.S, Y = A.CITY_Y, curve = A.curve || function (m) { return m; };
var POS = { x: -6, z: 60 }, FACE = Math.atan2(6 - POS.x, 62 - POS.z);   // the lectern faces the arrival point
var READ = { x: POS.x + Math.sin(FACE) * 2.9, z: POS.z + Math.cos(FACE) * 2.9 };
var FEAT_URL = '/city/features.json?v=20261010b', CUR_URL = '/city/curriculum.json';
var D = { state: 'idle', wait: 1.6, feat: null, cur: null, beauty: null, tab: 'features' };
function $(id) { return document.getElementById(id); }
function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]; }); }
function getJSON(u, nc) { return fetch(u, { credentials: 'same-origin', cache: nc ? 'no-store' : 'default' }).then(function (r) { if (!r.ok) throw new Error(u + ' ' + r.status); return r.json(); }); }

/* ---------------- the podium ---------------- */
function Merge() { this.g = []; }
Merge.prototype.add = function (geo, x, y, z, rx, ry, rz) { var g = geo.index ? geo.toNonIndexed() : geo.clone(); geo.dispose(); g.applyMatrix4(new T.Matrix4().compose(new T.Vector3(x, y, z), new T.Quaternion().setFromEuler(new T.Euler(rx || 0, ry || 0, rz || 0)), new T.Vector3(1, 1, 1))); this.g.push(g); };
Merge.prototype.mesh = function (mat) {
  var n = 0; this.g.forEach(function (p) { n += p.attributes.position.count; }); var P = new Float32Array(n * 3), N = new Float32Array(n * 3), o = 0;
  this.g.forEach(function (p) { var c = p.attributes.position.count; P.set(p.attributes.position.array, o * 3); N.set(p.attributes.normal.array, o * 3); o += c; p.dispose(); });
  var g = new T.BufferGeometry(); g.setAttribute('position', new T.BufferAttribute(P, 3)); g.setAttribute('normal', new T.BufferAttribute(N, 3)); g.computeBoundingSphere(); return new T.Mesh(g, mat);
};
function plaqueTex() {   // gold intaglio plaque: hatched ground, double rule, engraved title
  var W = 1024, H = 384, c = document.createElement('canvas'); c.width = W; c.height = H; var g = c.getContext('2d');
  g.fillStyle = '#070506'; g.fillRect(0, 0, W, H);
  g.strokeStyle = 'rgba(217,171,70,0.16)'; g.lineWidth = 1; for (var i = -H; i < W; i += 5) { g.beginPath(); g.moveTo(i, H); g.lineTo(i + H, 0); g.stroke(); }
  g.strokeStyle = '#d9ab46'; g.lineWidth = 6; g.strokeRect(12, 12, W - 24, H - 24); g.lineWidth = 2; g.strokeRect(28, 28, W - 56, H - 56);
  for (var k = 0; k < 4; k++) { var cx = k % 2 ? W - 52 : 52, cy = k > 1 ? H - 52 : 52; g.beginPath(); g.arc(cx, cy, 10, 0, Math.PI * 2); g.stroke(); }
  g.textAlign = 'center'; g.textBaseline = 'middle'; g.font = '700 96px Georgia, serif';
  var grd = g.createLinearGradient(0, 120, 0, 220); grd.addColorStop(0, '#fff0b8'); grd.addColorStop(0.5, '#e8c36a'); grd.addColorStop(1, '#a87b26');
  g.fillStyle = '#3a2608'; g.fillText('ALL THAT WE', W / 2 + 3, 138); g.fillText('CAN DO!', W / 2 + 3, 248);   // engraved shadow
  g.fillStyle = grd; g.fillText('ALL THAT WE', W / 2, 135); g.fillText('CAN DO!', W / 2, 245);
  g.font = '600 26px Georgia, serif'; g.fillStyle = '#c9a24c'; g.fillText('\u2756  SOLID CITY \u00b7 WALK UP AND READ  \u2756', W / 2, 320);
  var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; t.anisotropy = 4; return t;
}
function build() {
  var stone = curve(new T.MeshLambertMaterial({ color: 0x0c090b })), gold = curve(new T.MeshLambertMaterial({ color: 0xd9ab46, emissive: 0x4a3208 })), red = curve(new T.MeshLambertMaterial({ color: 0x8a0c1c, emissive: 0x2a0306 }));
  var st = new Merge(), gd = new Merge(), rd = new Merge();
  st.add(new T.CylinderGeometry(2.5, 2.7, 0.18, 40), 0, 0.09, 0);                      // dais
  rd.add(new T.CylinderGeometry(2.2, 2.2, 0.04, 40), 0, 0.2, 0);                        // red carpet disc
  gd.add(new T.TorusGeometry(2.55, 0.05, 4, 56), 0, 0.19, 0, Math.PI / 2);
  st.add(new T.BoxGeometry(1.5, 0.22, 1.1), 0, 0.33, -0.15);                            // step
  st.add(new T.BoxGeometry(1.25, 1.25, 0.8), 0, 1.06, -0.25);                           // lectern body
  gd.add(new T.BoxGeometry(1.33, 0.06, 0.88), 0, 0.46, -0.25); gd.add(new T.BoxGeometry(1.33, 0.06, 0.88), 0, 1.66, -0.25);
  [-0.64, 0.64].forEach(function (x) { gd.add(new T.BoxGeometry(0.05, 1.2, 0.05), x, 1.06, 0.16); });
  st.add(new T.BoxGeometry(1.45, 0.08, 0.95), 0, 1.75, -0.2, -0.28);                    // slanted reading top
  gd.add(new T.B