<!-- SOLID CITY · part 2870 -->
oxGeometry(1.5, 0.03, 1.0), 0, 1.71, -0.2, -0.28);
  st.add(new T.CylinderGeometry(0.02, 0.02, 0.55, 6), 0.42, 1.98, -0.48, 0.5);          // gooseneck microphone
  gd.add(new T.SphereGeometry(0.06, 10, 8), 0.42, 2.24, -0.34);
  var grp = new T.Group(); grp.name = 'podium-all-we-can-do'; grp.position.set(POS.x, Y, POS.z); grp.rotation.y = FACE;
  grp.add(st.mesh(stone)); grp.add(gd.mesh(gold)); grp.add(rd.mesh(red));
  var pl = new T.Mesh(new T.PlaneGeometry(1.16, 0.435), curve(new T.MeshBasicMaterial({ map: plaqueTex() }))); pl.position.set(0, 1.06, 0.152); grp.add(pl);
  // a small gold-lit banner pole behind the lectern (reads from the arrival point)
  var bp = new Merge(); bp.add(new T.CylinderGeometry(0.05, 0.06, 4.2, 8), -1.2, 2.1, -1.0); bp.add(new T.SphereGeometry(0.11, 10, 8), -1.2, 4.25, -1.0); grp.add(bp.mesh(gold));
  var ban = new T.Mesh(new T.PlaneGeometry(0.9, 1.6), curve(new T.MeshBasicMaterial({ map: plaqueTexVertical(), side: T.DoubleSide }))); ban.position.set(-0.72, 3.25, -1.0); grp.add(ban);
  A.world.add(grp); D.group = grp;
}
function plaqueTexVertical() {
  var c = document.createElement('canvas'); c.width = 256; c.height = 448; var g = c.getContext('2d');
  g.fillStyle = '#8a0c1c'; g.fillRect(0, 0, 256, 448); g.strokeStyle = '#e8c36a'; g.lineWidth = 6; g.strokeRect(10, 10, 236, 428);
  g.fillStyle = '#ffd27a'; g.textAlign = 'center'; g.font = '700 46px Georgia, serif'; ['ALL', 'THAT', 'WE', 'CAN', 'DO!'].forEach(function (w, i) { g.fillText(w, 128, 90 + i * 70); });
  var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; return t;
}
function solids() {
  var hw = 0.75, hd = 0.62, c = Math.cos(FACE), s = Math.sin(FACE), ex = Math.abs(c) * hw + Math.abs(s) * hd, ez = Math.abs(s) * hw + Math.abs(c) * hd;
  var cx = POS.x - Math.sin(FACE) * 0.25, cz = POS.z - Math.cos(FACE) * 0.25;
  A.solids.push({ x0: cx - ex, x1: cx + ex, z0: cz - ez, z1: cz + ez, y0: Y, y1: Y + 2.3, podium: true });
  var bx = POS.x + (-1.2) * Math.cos(FACE) + (-1.0) * Math.sin(FACE), bz = POS.z - (-1.2) * Math.sin(FACE) + (-1.0) * Math.cos(FACE);
  A.solids.push({ x0: bx - 0.2, x1: bx + 0.2, z0: bz - 0.2, z1: bz + 0.2, y0: Y, y1: Y + 4.4, podium: true });
}
function stop() {
  var H = window.CityHyper; if (!H || !H.pois || H.pois.some(function (p) { return p.id === 'podium'; })) return;
  H.pois.splice(2, 0, { id: 'podium', name: 'ALL THAT WE CAN DO! podium', short: 'ALL WE CAN DO', x: POS.x, z: POS.z, stand: { x: READ.x, z: READ.z }, act: 'podium',
    alias: 'podium all that we can do features feature list everything catalog speaker lectern what can i do help',
    text: 'The speaker\u2019s podium in the Forum Plaza: every real feature of Solid City and epistles, the University course catalog and the Beauty Log, in one list. Walk up and tap READ.' });
  if (H.regrid) H.regrid();
}
function watchCap() {
  var W = window.CityWatch; if (!W || !W.routes || !W.routes.campus || W.routes.campus._podium) return;
  var orig = W.routes.campus.build; W.routes.campus._podium = true;
  W.routes.campus.build = function () { var w = orig.apply(this, arguments); w.unshift({ x: POS.x - 26, z: POS.z + 30, y: Y + 40, v: 100, cap: { cap: 'ALL THAT WE CAN DO!', sub: 'Forum Plaza \u00b7 the speaker\u2019s podium: every feature, every course, the Beauty Log' } }); return w; };
}
function init() { D.state = 'loading'; try { solids(); build(); stop(); watchCap(); D.state = 'ready'; arrive(); } catch (e) { D.state = 'failed'; try { console.warn('[city] podium skipped:', e && e.message); } catch (x) {} } }
function update(dt) { if (D.state === 'idle') { if (A.isBuilt && !A.isBuilt()) return; D.wait -= dt; if (D.wait <= 0) init(); } }
function actHere(x, z) { return D.state === 'ready' && (Math.hypot(x - READ.x, z - READ.z) < 3.4 || Math.hypot(x - POS.x, z - POS.z) < 3.2); }
function radar(g, blip, fl) { if (D.state === 'ready' && !fl) blip(POS.x, POS.z, '#ffd27a', 3, 'DO!'); }
function arrive() {
  if (new URLSearchParams(location.search).get('to') !== 'podium') return;
  (function wait() { var boot = $('sc-boot'); if ((boot && !boot.hidden) || S.mode !== 'walk') return setTimeout(wait, 500);
    S.p.x = READ.x + Math.sin(FACE) * 2.5; S.p.z = READ.z + Math.cos(FACE) * 2.5; S.p.y = A.groundAt(S.p.x, S.p.z); S.camYaw = FACE; open('features'); })();
}

/* ---------------- the glass panel ---------------- */
var P = null, body = null;
function css() {
  if ($('pd-css')) return; var st = document.createElement('style'); st.id = 'pd-css';
  st.textContent = '#pd-panel{position:absolute;z-index:23;right:calc(12px + env(safe-area-inset-right));top:calc(110px + env(safe-area-inset-top));bottom:16px;width:min(460px,calc(100vw - 24px));box-sizing:border-box;display:flex;flex-direction:column;' +
    'background:rgba(10,6,10,.72);-webkit-backdrop-filter:blur(14px) saturate(1.3);backdrop-filter:blur(14px) saturate(1.3);border:1px solid rgba(232,195,106,.75);border-radius:18px;box-shadow:0 12px 44px #000c,inset 0 