Spaces:
Running
Running
deploy(hf): sync szl-holdings/a11oy@main derived COPY set
Browse filesReusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy main.
Files: 871 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).
Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- static/3d/holographic.html +45 -15
static/3d/holographic.html
CHANGED
|
@@ -19,26 +19,55 @@
|
|
| 19 |
:root{--bg:#05070d;--panel:#0b121b;--line:#1b2734;--teal:#39d3c4;--gold:#e8c074;--cream:#eef3f6;--para:#9fb1bf;}
|
| 20 |
*{box-sizing:border-box}
|
| 21 |
html,body{margin:0;height:100%}
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
header{padding:10px 16px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#08101a,#05070d);
|
| 24 |
-
display:flex;align-items:center;gap:14px;flex-wrap:wrap}
|
| 25 |
h1{font-size:16px;margin:0;letter-spacing:.4px}
|
| 26 |
.badge{display:inline-block;font:10.5px ui-monospace,monospace;padding:2px 7px;border-radius:6px;
|
| 27 |
-
border:1px solid var(--line);color:var(--gold);background:#10171f}
|
| 28 |
#backend{color:var(--teal)}
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
| 30 |
.tab{font:11.5px ui-monospace,monospace;padding:6px 12px;border-radius:7px;border:1px solid var(--line);
|
| 31 |
-
background:#0a121b;color:var(--para);cursor:pointer;letter-spacing:.3px;transition:.12s}
|
| 32 |
.tab:hover{border-color:var(--teal);color:var(--cream)}
|
| 33 |
.tab[aria-selected="true"]{background:#12202b;color:var(--cream);border-color:var(--teal);box-shadow:0 0 0 1px var(--teal) inset}
|
| 34 |
-
#stage-wrap{position:relative;
|
| 35 |
#stage{position:absolute;inset:0}
|
| 36 |
-
#stage canvas{display:block;width:100%;height:100%}
|
| 37 |
#fallback{position:absolute;inset:0;display:none;align-items:center;justify-content:center;
|
| 38 |
text-align:center;color:var(--para);padding:24px;font:13px ui-monospace,monospace}
|
| 39 |
-
footer{
|
| 40 |
-
background:#070d15;color:var(--para);font:10.5px ui-monospace,monospace;letter-spacing:.3px;z-index:6
|
|
|
|
| 41 |
a{color:var(--teal);text-decoration:none}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
</style>
|
| 43 |
</head>
|
| 44 |
<body>
|
|
@@ -46,8 +75,8 @@
|
|
| 46 |
<h1>◇ Holographic Estate</h1>
|
| 47 |
<span class="badge" id="backend">renderer: …</span>
|
| 48 |
<button class="badge" id="gpu-toggle" title="Toggle WebGPU compute path (falls back to WebGL2 if the browser/driver can't provide a WebGPU device). WebGPU is not production-safe on all platforms — doctrine." style="cursor:pointer;background:#10171f">⚡ WebGPU: off</button>
|
| 49 |
-
<span class="badge">three r<span id="three-rev">…</span></span>
|
| 50 |
-
<span class="badge">0 runtime CDN</span>
|
| 51 |
<span class="badge">Λ = Conjecture 1</span>
|
| 52 |
<a href="/" style="margin-left:auto;font:11px ui-monospace,monospace">← a11oy</a>
|
| 53 |
</header>
|
|
@@ -120,9 +149,6 @@ const SURFACES = [
|
|
| 120 |
{ id: "router", title: "Router", mod: "/static/3d/surfaces/router.js" },
|
| 121 |
{ id: "anatomy", title: "Anatomy", mod: "/static/3d/surfaces/anatomy.js" },
|
| 122 |
{ id: "estate", title: "Estate", mod: "/static/3d/surfaces/estate.js" },
|
| 123 |
-
{ id: "muon", title: "Muon Orthogonalized-Momentum Optimizer", mod: "/static/3d/surfaces/muon.js" },
|
| 124 |
-
{ id: "specexec", title: "Tree Speculative Execution", mod: "/static/3d/surfaces/specexec.js" },
|
| 125 |
-
{ id: "nvfp4", title: "NVFP4 4-bit Training Format", mod: "/static/3d/surfaces/nvfp4.js" },
|
| 126 |
];
|
| 127 |
|
| 128 |
const stageEl = document.getElementById("stage");
|
|
@@ -232,7 +258,11 @@ SURFACES.forEach((s) => {
|
|
| 232 |
const b = document.createElement("button");
|
| 233 |
b.className = "tab"; b.textContent = s.title; b.dataset.id = s.id;
|
| 234 |
b.setAttribute("role", "tab"); b.setAttribute("aria-selected", "false");
|
| 235 |
-
b.addEventListener("click", () =>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 236 |
tabsEl.appendChild(b);
|
| 237 |
});
|
| 238 |
|
|
|
|
| 19 |
:root{--bg:#05070d;--panel:#0b121b;--line:#1b2734;--teal:#39d3c4;--gold:#e8c074;--cream:#eef3f6;--para:#9fb1bf;}
|
| 20 |
*{box-sizing:border-box}
|
| 21 |
html,body{margin:0;height:100%}
|
| 22 |
+
/* Flex column so the 3D stage always fills the space left over by the header +
|
| 23 |
+
tab strip, no matter how far they wrap. dvh (dynamic viewport height) tracks
|
| 24 |
+
the mobile address-bar collapse; svh/100vh are fallbacks for older engines. */
|
| 25 |
+
body{background:var(--bg);color:var(--cream);font:14px/1.5 ui-sans-serif,system-ui,Segoe UI,Roboto,Arial;
|
| 26 |
+
overflow:hidden;display:flex;flex-direction:column;height:100vh;height:100svh;height:100dvh}
|
| 27 |
header{padding:10px 16px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#08101a,#05070d);
|
| 28 |
+
display:flex;align-items:center;gap:14px;flex-wrap:wrap;flex:0 0 auto}
|
| 29 |
h1{font-size:16px;margin:0;letter-spacing:.4px}
|
| 30 |
.badge{display:inline-block;font:10.5px ui-monospace,monospace;padding:2px 7px;border-radius:6px;
|
| 31 |
+
border:1px solid var(--line);color:var(--gold);background:#10171f;white-space:nowrap}
|
| 32 |
#backend{color:var(--teal)}
|
| 33 |
+
/* Desktop: tabs wrap. Mobile (below): one horizontally-scrollable row so the
|
| 34 |
+
~50 tabs don't build a tall wall that shoves the 3D stage off-screen. */
|
| 35 |
+
.tabs{display:flex;gap:6px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);
|
| 36 |
+
background:#070d15;flex:0 0 auto}
|
| 37 |
.tab{font:11.5px ui-monospace,monospace;padding:6px 12px;border-radius:7px;border:1px solid var(--line);
|
| 38 |
+
background:#0a121b;color:var(--para);cursor:pointer;letter-spacing:.3px;transition:.12s;white-space:nowrap}
|
| 39 |
.tab:hover{border-color:var(--teal);color:var(--cream)}
|
| 40 |
.tab[aria-selected="true"]{background:#12202b;color:var(--cream);border-color:var(--teal);box-shadow:0 0 0 1px var(--teal) inset}
|
| 41 |
+
#stage-wrap{position:relative;flex:1 1 auto;min-height:0;width:100%}
|
| 42 |
#stage{position:absolute;inset:0}
|
| 43 |
+
#stage canvas{display:block;width:100%;height:100%;touch-action:none}
|
| 44 |
#fallback{position:absolute;inset:0;display:none;align-items:center;justify-content:center;
|
| 45 |
text-align:center;color:var(--para);padding:24px;font:13px ui-monospace,monospace}
|
| 46 |
+
footer{padding:6px 14px;border-top:1px solid var(--line);flex:0 0 auto;
|
| 47 |
+
background:#070d15;color:var(--para);font:10.5px ui-monospace,monospace;letter-spacing:.3px;z-index:6;
|
| 48 |
+
white-space:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
|
| 49 |
a{color:var(--teal);text-decoration:none}
|
| 50 |
+
|
| 51 |
+
/* ---- Mobile / touch (<=640px) ---------------------------------------- */
|
| 52 |
+
@media (max-width:640px){
|
| 53 |
+
header{padding:8px 12px;gap:8px}
|
| 54 |
+
h1{font-size:14px;flex:1 1 100%}
|
| 55 |
+
/* Keep only the essential badges visible; hide the noisier ones on small screens. */
|
| 56 |
+
header .badge{font-size:9.5px;padding:2px 6px}
|
| 57 |
+
#three-rev-badge,#cdn-badge{display:none}
|
| 58 |
+
/* Horizontal scroll strip for the tabs, with the active tab kept in view. */
|
| 59 |
+
.tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
|
| 60 |
+
padding:7px 10px;scrollbar-width:thin}
|
| 61 |
+
.tabs::-webkit-scrollbar{height:4px}
|
| 62 |
+
.tabs::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}
|
| 63 |
+
.tab{padding:7px 11px;font-size:11px;flex:0 0 auto}
|
| 64 |
+
footer{font-size:9px;padding:5px 10px}
|
| 65 |
+
/* Give the 3D stage a guaranteed usable share of the screen on phones. */
|
| 66 |
+
#stage-wrap{min-height:52vh}
|
| 67 |
+
}
|
| 68 |
+
@media (max-width:640px) and (orientation:landscape){
|
| 69 |
+
#stage-wrap{min-height:60vh}
|
| 70 |
+
}
|
| 71 |
</style>
|
| 72 |
</head>
|
| 73 |
<body>
|
|
|
|
| 75 |
<h1>◇ Holographic Estate</h1>
|
| 76 |
<span class="badge" id="backend">renderer: …</span>
|
| 77 |
<button class="badge" id="gpu-toggle" title="Toggle WebGPU compute path (falls back to WebGL2 if the browser/driver can't provide a WebGPU device). WebGPU is not production-safe on all platforms — doctrine." style="cursor:pointer;background:#10171f">⚡ WebGPU: off</button>
|
| 78 |
+
<span class="badge" id="three-rev-badge">three r<span id="three-rev">…</span></span>
|
| 79 |
+
<span class="badge" id="cdn-badge">0 runtime CDN</span>
|
| 80 |
<span class="badge">Λ = Conjecture 1</span>
|
| 81 |
<a href="/" style="margin-left:auto;font:11px ui-monospace,monospace">← a11oy</a>
|
| 82 |
</header>
|
|
|
|
| 149 |
{ id: "router", title: "Router", mod: "/static/3d/surfaces/router.js" },
|
| 150 |
{ id: "anatomy", title: "Anatomy", mod: "/static/3d/surfaces/anatomy.js" },
|
| 151 |
{ id: "estate", title: "Estate", mod: "/static/3d/surfaces/estate.js" },
|
|
|
|
|
|
|
|
|
|
| 152 |
];
|
| 153 |
|
| 154 |
const stageEl = document.getElementById("stage");
|
|
|
|
| 258 |
const b = document.createElement("button");
|
| 259 |
b.className = "tab"; b.textContent = s.title; b.dataset.id = s.id;
|
| 260 |
b.setAttribute("role", "tab"); b.setAttribute("aria-selected", "false");
|
| 261 |
+
b.addEventListener("click", () => {
|
| 262 |
+
selectSurface(s.id);
|
| 263 |
+
// On the mobile horizontal tab strip, keep the tapped tab in view.
|
| 264 |
+
try { b.scrollIntoView({ behavior: "smooth", inline: "center", block: "nearest" }); } catch (_) {}
|
| 265 |
+
});
|
| 266 |
tabsEl.appendChild(b);
|
| 267 |
});
|
| 268 |
|