Implement createModPlayer with a TDD-first ModPlayer contract
(idle/loading/playing/paused/unavailable), wired into App and
TrackerPanel. Uses chiptune3@0.8.7, loaded lazily via a deep
import (the package ships no main/exports field). Adds two Vite
fixes needed for the nested worklet asset to actually load: copy
libopenmpt.worklet.js next to the built worklet chunk, and
exclude chiptune3 from dep pre-bundling so dev mode resolves the
same sibling file.
Ships public/music/ride.mod: "11th-hour" by TDK, CC BY 4.0, from
The Mod Archive (modarchive.org, module ID 67104). Credited in
the HUD scroller text.
Add a Vite plugin that renders bio, links and greetings from the
Task 2 content modules into the raw served index.html at build
time, so non-JS clients (Mastodon's rel=me verifier included) see
real content and the mastodon.saillant.cc/@clement rel=me anchor.
Hide the fallback for sighted users once the 3D demo boots, but
keep it in the accessibility tree. Add @types/node so tsc can
type-check the node:fs import in the new test.
Establish initial project structure for LE BUS (clement.saillant.cc),
a demoscene-style personal identity hub built with Vite, React, and
react-three-fiber.
Changes:
- Add package.json with dependencies (React 19, Three.js,
react-three/fiber, zustand, playwright for e2e)
- Add tsconfig.json with ES2022 target and react-jsx support
- Add vite.config.ts with React plugin
- Add minimal index.html, src/main.tsx, and src/style.css
- Add README.md with usage commands
- Add .gitignore (node_modules, dist, test artifacts, .DS_Store)
- Generate package-lock.json via npm install
Note: chiptune3 removed from dependencies (not on npm registry;
will be isolated behind src/audio/modPlayer.ts in Task 11 with mocks).
Build and test harness verified:
- npm run build succeeds → dist/index.html created
- npx vitest run --passWithNoTests exits 0