┌─ package managers ─┐
$ npm install glyphcss$ npm install @glyphcss/react$ npm install @glyphcss/vue┌─ cdn ─┐
<script type="module" src="https://esm.sh/glyphcss/elements"></script>┌────────────────────┐ ┌─────────────────┐ ┌────────────────────┐ ┌─▶ Rasterise polygons │───▶ Encode text │──▶ <pre> │ │ │ cols × rows grid │ │ or colour spans │ │ one write / render │ ┌─────────────────┐ ┌────────────────┐ │ └────────────────────┘ └─────────────────┘ └────────────────────┘ │ Mesh / geometry │──▶ Scene + camera ├─┤ └─────────────────┘ └────────────────┘ │ ┌────────────────────┐ ┌──────────────────┐ └─▶ Project 3D anchors │──▶ DOM hotspots │ │ same camera │ │ position + depth │ └────────────────────┘ └──────────────────┘
┌──────────┐ │ Mesh / │ │ geometry │ └──────────┘ │ │ ┌───────▼────────┐ │ Scene + camera │ └───────┬────────┘ │ ┌────────┴─────────┐ │ │ ┌──────▼──────┐ │ │ Rasterise │ ┌──────▼──────┐ │ polygons │ │ Project 3D │ │ cols × rows │ │ anchors │ │ grid │ │ same camera │ └─────────────┘ └─────────────┘ │ │ │ ┌┘ │ │ ┌──────▼──────┐ ┌──────▼───────┐ │ Encode text │ │ DOM hotspots │ │ or colour │ │ position + │ │ spans │ │ depth │ └─────────────┘ └──────────────┘ │ │ ┌──────▼──────┐ │ <pre> │ │ one write / │ │ render │ └─────────────┘
>glyphcss loads OBJ, glTF, GLB, STL, and VOX mesh files. The rasteriser projects polygons through the scene camera, fills a cols × rows character grid, and encodes text or colour spans. Each render writes one string per <pre>: textContent for plain text, or innerHTML for colour. Detail layers get their own <pre>. There are no per-polygon DOM nodes and no matrix3d.
>Interactivity is opt-in and sparse: drop a <GlyphHotspot>at any 3D anchor and glyphcss positions a DOM element over the cell projected through the same camera. Real DOM events, real :hover styles, real role="button"accessibility — without one DOM node per polygon. Rendering is demand-driven; controls and animation request new renders.
>glyphcss provides custom elements (<glyph-scene>, <glyph-mesh>), an imperative createGlyphScene API, and optional React / Vue bindings. Use whichever entry point fits your stack.
<script type="module" src="https://esm.sh/glyphcss/elements"></script>
<glyph-camera rot-x="23" zoom="1.3">
<glyph-scene>
<glyph-orbit-controls drag wheel></glyph-orbit-controls>
<glyph-mesh geometry="dodecahedron">
<glyph-hotspot at="0,1,0"></glyph-hotspot>
</glyph-mesh>
</glyph-scene>
</glyph-camera>import { GlyphCamera, GlyphScene, GlyphOrbitControls, GlyphMesh, GlyphHotspot } from "@glyphcss/react";
export function App() {
return (
<GlyphCamera rotX={23} zoom={1.3}>
<GlyphScene>
<GlyphOrbitControls drag wheel />
<GlyphMesh geometry="dodecahedron">
<GlyphHotspot at={[0, 1.2, 0]} onClick={() => alert("vertex")} />
</GlyphMesh>
</GlyphScene>
</GlyphCamera>
);
}<template>
<GlyphCamera :rot-x="23" :zoom="1.3">
<GlyphScene>
<GlyphOrbitControls drag wheel />
<GlyphMesh geometry="dodecahedron">
<GlyphHotspot :at="[0, 1.2, 0]" @click="onVertex" />
</GlyphMesh>
</GlyphScene>
</GlyphCamera>
</template>
<script setup lang="ts">
import { GlyphCamera, GlyphScene, GlyphOrbitControls, GlyphMesh, GlyphHotspot } from "@glyphcss/vue";
function onVertex() { alert("vertex"); }
</script>