<!-- SOLID CITY · part 1998 -->
's riders do. */
export function createSpaceRiderMesh(T) {
  var g = new T.Group(); g.name = 'space-rider';
  var titanium = new T.MeshLambertMaterial({ color: 0x232c3d });
  var silver = new T.MeshLambertMaterial({ color: 0x9aa4b5 });
  var gold = new T.MeshLambertMaterial({ color: 0xd8a833, emissive: 0x332200 });
  var glow = new T.MeshBasicMaterial({ color: 0x2affd8 });
  function box(w, h, d, mat, x, y, z) {
    var m = new T.Mesh(new T.BoxGeometry(w, h, d), mat); m.position.set(x, y, z); g.add(m); return m;
  }
  function ring(r, tube, mat, z) {
    var m = new T.Mesh(new T.TorusGeometry(r, tube, 10, 28), mat);
    m.rotation.y = Math.PI / 2; // the torus is born in the XY plane; turn it into the YZ plane — a wheel that rolls along +z
    m.position.set(0, r, z); g.add(m); return m;
  }
  ring(0.34, 0.045, silver, 0.58);               // front ring
  ring(0.34, 0.045, silver, -0.58);              // rear ring
  ring(0.26, 0.016, glow, 0.58);                 // front heart-glow
  ring(0.26, 0.016, glow, -0.58);                // rear heart-glow
  box(0.10, 0.07, 1.30, titanium, 0, 0.40, 0);   // the spine
  box(0.34, 0.03, 0.42, titanium, 0, 0.20, -0.05); // the foot deck
  box(0.05, 0.02, 0.42, gold, -0.16, 0.215, -0.05); // gold trim on the deck
  box(0.05, 0.02, 0.42, gold, 0.16, 0.215, -0.05);
  var column = box(0.06, 0.85, 0.06, silver, 0, 0.80, 0.52); // the steering column
  column.rotation.x = -0.16;
  box(0.44, 0.05, 0.05, titanium, 0, 1.24, 0.45);  // the bar
  var jewel = new T.Mesh(new T.OctahedronGeometry(0.05), gold);
  jewel.position.set(0, 1.24, 0.52); g.add(jewel); // the bar jewel
  g.userData.parts = { glow: glow };
  return g;
}

/* ---------------- the rack it waits on ---------------- */
export function createFleetRack(T, labelTex, name, sub) {
  var g = new T.Group(); g.name = 'fleet-rack';
  var stone = new T.MeshLambertMaterial({ color: 0x8f96a3 });
  var dark = new T.MeshLambertMaterial({ color: 0x232c3d });
  var gold = new T.MeshLambertMaterial({ color: 0xd8a833, emissive: 0x332200 });
  function box(w, h, d, mat, x, y, z) {
    var m = new T.Mesh(new T.BoxGeometry(w, h, d), mat); m.position.set(x, y, z); g.add(m); return m;
  }
  box(2.4, 0.18, 1.4, dark, 0, 0.09, 0);                  // the plinth
  box(2.5, 0.04, 1.5, gold, 0, 0.20, 0);                  // its gold lip
  box(0.09, 1.15, 0.09, stone, -1.05, 0.75, -0.55);      // plate posts
  box(0.09, 1.15, 0.09, stone, 1.05, 0.75, -0.55);
  var plate = new T.Mesh(new T.PlaneGeometry(2.2, 0.55),
    new T.MeshBasicMaterial({ map: labelTex(name || 'HOVER BOARD', sub || 'THE FLEET · EST. 2026'), side: T.DoubleSide }));
  plate.position.set(0, 1.32, -0.55); g.add(plate);
  var jewel = new T.Mesh(new T.OctahedronGeometry(0.09), gold);
  jewel.position.set(0, 1.78, -0.55); g.add(jewel);
  g.userData.parts = { jewel: jewel };
  return g;
}


===== FILE: public/city/fleet/index.html =====
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1">
  <meta name="color-scheme" content="light dark">
  <link rel="icon" href="data:,">
  <title>Fleet Control</title>
  <style>
    :root{
      color-scheme:light dark;
      --ink:#eef7f6;--muted:#93aaa8;--panel:#071211;--panel2:#0c1e1c;--line:#25413d;
      --gold:#ffc952;--gold2:#9b6911;--teal:#38e3d1;--teal2:#087d75;--danger:#ff6969;--ok:#71f0ac;
      --void:#020706;--glass:rgba(5,17,16,.92);--button:#142a27;--shadow:rgba(0,0,0,.5)
    }
    @media(prefers-color-scheme:light){:root{--ink:#f5fffd;--muted:#a1b7b3;--panel:#071412;--panel2:#0d211e;--line:#31534d;--void:#020807;--glass:rgba(6,20,18,.94);--button:#17322e}}
    *{box-sizing:border-box}
    html,body{margin:0;min-height:100%;background:var(--void);color:var(--ink);font-family:"Aptos","Trebuchet MS",system-ui,sans-serif;overflow-x:hidden}
    body{min-height:100svh;touch-action:manipulation;-webkit-user-select:none;user-select:none}
    button,select{font:inherit;color:inherit}
    button{border:0;cursor:pointer}
    .topbar{min-height:64px;display:flex;align-items:center;gap:12px;padding:max(10px,env(safe-area-inset-top)) 14px 10px;background:#06100f;border-bottom:1px solid var(--line);position:relative;z-index:5}
    .mission{min-width:0;flex:1}
    .mission strong{display:block;font:700 14px/1.15 "Arial Narrow","Aptos Narrow",sans-serif;letter-spacing:.08em;text-transform:uppercase}
    .mission small{display:block;color:var(--muted);font-size:12px;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    .mode{appearance:none;background:var(--button);border:1px solid var(--line);border-radius:8px;padding:10px 30px 10px 11px;font-weight:800;font-size:12px;background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 14px) 16px,calc(100% - 9px) 16px;background-si