The room page gets a 2D / 3D switch (remembered per browser). The 3D view draws the floor's 600 mm tiles, each rack at its place, facing and real height (see-through while it has no place yet), and every server as a block on the rack's front over its units, coloured by state; the sleds of a multi-node chassis sit side by side, servers of unknown height are see-through. Drag turns, right or shift drag moves, wheel or pinch zooms, a double click brings a rack close; a click selects a rack (same address and side panel as the floor plan), and a click on a server of the selected rack opens the machine. The servers in the side panel's elevation now open their machine on the floor plan page too. The renderer outlives the 5 s re-render: its canvas moves into the new page and the scene is rebuilt only when racks, machines, the selection or the theme changed, so the camera stays where it was. Leaving the page frees the WebGL context. Racks are still placed in the 2D editor. three.js 0.160.0 (MIT) is vendored as web/vendor/three/three.module.min.js, taken from the npm tarball whose sha512 matched the registry's integrity field, and loaded with import() on first use: nothing is fetched from outside. rackElev's block placement is split out as rackBlocks so the elevation and the 3D fronts agree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>