f42402611706980ade9b05214591f069ba162950
Context: the ride passed 4 stops (boot, identities, electron fou, greetings) but rendered no content at any of them. Approach: shared StopPanel component places a pole, a yellow sign with the stop title, and a drei Html transform panel anchored beside the road via stopAnchor(); each stop composes it with its own content module. Changes: - StopPanel.tsx: pole + sign + Html panel, panel--active class driven by useRide selector on the active stop id - StopBoot.tsx: avatar art, name, tagline, bio lines - StopIdentities.tsx: identity links list - StopElectronFou.tsx: music blurb + pulsing tube amp with VU needles animated via useFrame - StopGreetings.tsx: greetings list + ride-again reset button - Stops.tsx: mounts the four stop components - style.css: .panel styling, active glow, sign buttons/links - App.tsx: mount <Stops /> in the Canvas, drop the placeholder Impact: the ride now has readable, interactive content at every stop; build (tsc -b + vite build) and full vitest suite (12/12) pass.
clement.saillant.cc — LE BUS
Demoscene-style personal identity hub: a bus driving across a giant PCB. Spec: docs/superpowers/specs/2026-07-09-clement-saillant-cc-design.md
npm run dev— dev servernpm test— unit tests (vitest)npm run e2e— smoke tests (playwright)npm run build— static build in dist/
Description
Languages
TypeScript
91.9%
CSS
5%
HTML
2.3%
Dockerfile
0.8%