<!-- SOLID CITY · part 32 -->
performance.now() / 700) * 0.03; };
  aura.onBeforeRender = function () { const t = performance.now() / 1000; auraMat.opacity = 0.42 + 0.18 * Math.sin(t * 2); aura.rotation.z = t * 0.4; };

  g.userData = {
    kind: 'citizen-avatar', id: 'kingplaya', name: 'King Playa',
    limbs: limbs, emblem: sigil, glowMat: glowMat, bodyMat: bodyMat, cape: cape, aura: aura,
    height: 2.28, headTop: 1.96, tagY: 2.75, bubbleY: 3.45,
    pieces: allPieces,
    checkLaw: function (min) { min = min || MINIMUM; return allPieces.filter(function (p) { return p.min < min - 1e-6; }); },
    dispose: function () { [bodyGeo, glowGeo, armGeo, legGeo, capeGeo, sigG, auraG].forEach(function (x) { x.dispose(); }); [bodyMat, glowMat, sigMat, auraMat].forEach(function (m) { m.dispose(); }); sigTex.dispose(); }
  };
  return g;
}
export default createKingPlayaAvatar;


===== FILE: public/city/axiom/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, user-scalable=no">
<title>AXIOM — The Living Frontier</title>
<style>
:root{color-scheme:dark;--gold:#d8aa48;--cyan:#23c7d9;--ink:#e8f3f5;--mut:#8fa6b0;--panel:rgba(6,14,20,.88)}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%;background:#04070c;color:var(--ink);font-family:"Aptos","Segoe UI",system-ui,sans-serif;overflow:hidden}
#stage{position:fixed;inset:0}
#stage canvas{display:block}
/* top HUD */
#topbar{position:fixed;top:0;left:0;right:0;display:flex;align-items:center;gap:10px;padding:10px 12px;pointer-events:none;z-index:5}
#stormbox{background:var(--panel);border:1px solid #263a45;padding:6px 10px;min-width:120px}
#stormbox .t{font:800 10px monospace;letter-spacing:.08em;color:var(--mut)}
#stormtime{font:800 20px monospace;color:var(--gold)}
#stormbarwrap{height:5px;background:#101f29;margin-top:4px}
#stormbar{height:100%;width:100%;background:var(--gold);transition:width .3s}
#sysbars{display:flex;gap:6px}
.sysbar{background:var(--panel);border:1px solid #263a45;padding:4px 8px;font:800 10px monospace;letter-spacing:.06em}
#pausebtn{margin-left:auto;pointer-events:auto;width:44px;height:44px;background:var(--panel);border:1px solid var(--gold);color:var(--gold);font:900 16px monospace;cursor:pointer}
/* ownership chips */
#chips{position:fixed;top:74px;right:10px;display:flex;flex-direction:column;gap:6px;z-index:5;pointer-events:none}
.chip{background:var(--panel);border:1px solid #263a45;border-left:4px solid var(--cyan);padding:6px 9px;font:800 10px monospace;min-width:150px}
.chip .who{display:block;color:var(--cyan);letter-spacing:.08em}
.chip.you{border-left-color:#51d39b}.chip.you .who{color:#51d39b}
.chip .dmg{letter-spacing:.06em}
/* event feed */
#feed{position:fixed;left:10px;bottom:120px;list-style:none;margin:0;padding:0;z-index:5;pointer-events:none;max-width:min(330px,60vw);font-size:11px}
#feed li{background:rgba(4,12,18,.72);border-left:3px solid var(--cyan);margin-top:4px;padding:5px 8px;color:#d9f7fa}
#feed li b{color:var(--gold)}
#feed li:nth-child(n+7){opacity:.55}
/* prompt + repair */
#prompt{position:fixed;left:50%;bottom:170px;transform:translateX(-50%);background:var(--panel);border:1px solid var(--gold);color:var(--ink);padding:8px 14px;font:800 12px monospace;letter-spacing:.05em;display:none;z-index:6;pointer-events:none;text-align:center;max-width:86vw}
#repairwrap{position:fixed;left:50%;bottom:120px;transform:translateX(-50%);width:min(300px,70vw);display:none;z-index:6;pointer-events:none}
#repairwrap .bar{height:8px;background:#101f29;border:1px solid var(--gold)}
#repairprog{height:100%;width:0;background:#51d39b}
#repairbtn{position:fixed;left:50%;bottom:34px;transform:translateX(-50%);width:min(280px,64vw);height:64px;border-radius:32px;border:2px solid #51d39b;background:rgba(20,60,44,.92);color:#eafff3;font:900 15px monospace;letter-spacing:.1em;display:none;z-index:6;cursor:pointer;touch-action:none;user-select:none;-webkit-user-select:none}
#repairbtn:active{background:rgba(40,110,80,.95)}
/* joystick */
#joy{position:fixed;width:120px;height:120px;border:2px solid rgba(216,170,72,.5);border-radius:50%;display:none;z-index:6;pointer-events:none}
#joyknob{position:absolute;left:50%;top:50%;width:52px;height:52px;margin:-26px 0 0 -26px;border-radius:50%;background:rgba(216,170,72,.55)}
#flash{position:fixed;inset:0;background:#ff5b3c;opacity:0;pointer-events:none;transition:opacity .25s;z-index:4}
/* overlays */
.overlay{position:fixed;inset:0;background:rgba(2,6,10,.9);display:flex;align-items:center;justify-content:center;z-index:20;padding:16px}
.card{width:min(560px,94vw);max-height:92vh;overflow:auto;background:#0a141c;border:1px solid var(--gold);padding:22px}
.card h1{margin:0 0 4px;font-family:Georgia,serif;color:var(--gold);letter-spacing:.06em;font-size:26px}
.card h2{margin:0 0 12px;font:800 11px monospace;letter-spacin