feat(website): add the project site and deploy it to GitHub Pages

A Vite + React + TypeScript + Tailwind v4 site under website/, built from
the soulseek-rs design system so the site and the TUI stay one product.
The colour tokens in src/index.css are the same values as
soulseek-rs/src/ui/styles.rs; change one, change both.

The hero is a working recreation of the TUI: it plays one scripted run and
then takes the keyboard, or lands on the resting state directly under
prefers-reduced-motion. Its sample data is invented or public domain, per
the tone-of-voice guardrail against naming copyrighted material.

Static output rather than an SPA shell. `bun run build` compiles the client,
compiles the same app for Node, then renders every route in src/lib/routes.ts
to its own file with that route's title, description and canonical URL. A
direct link to /install therefore answers 200 with real markup instead of
GitHub's 404 page. routes.ts is keyed into App.tsx by literal path, so adding
one without the other fails typecheck rather than shipping a page whose body
says "not found" under the right title.

Theme is resolved once by an inline script before first paint and adopted by
React through useSyncExternalStore, so there is no flash and no hydration
mismatch on the toggle. Light mode re-cuts the semantic hues darker: phosphor
and tape read on vinyl but wash out on manila.

CI and release skip website-only pushes, and Pages skips Rust-only ones. The
two Rust workflows share one paths-ignore list so they can only skip
together, which keeps the release ci-gate from polling for a run that was
never queued. That gate also now treats a cancelled CI as "keep waiting"
rather than a failure, since cancel-in-progress cancels the older SHA on
every back-to-back push.
This commit is contained in:
Michel de Graaf
2026-07-24 23:42:41 +02:00
parent 54feb3bc5a
commit 33bfc34dc8
58 changed files with 5239 additions and 1 deletions
+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160" viewBox="0 0 160 160" fill="none">
<g id="Favicon">
<rect width="160" height="160" rx="16" fill="#E8E1D6"></rect>
<path id="Letter S" d="M53.496 116.768C49.7413 116.768 46.4773 116.149 43.704 114.912C40.9307 113.675 38.6907 111.989 36.984 109.856L42.552 103.712C44.1733 105.504 45.944 106.827 47.864 107.68C49.8267 108.533 51.8107 108.96 53.816 108.96C56.12 108.96 57.8693 108.448 59.064 107.424C60.2587 106.4 60.856 104.928 60.856 103.008C60.856 101.429 60.3867 100.235 59.448 99.424C58.552 98.6133 57.016 98.0373 54.84 97.696L50.168 96.928C46.1573 96.2453 43.256 94.7733 41.464 92.512C39.672 90.208 38.776 87.4133 38.776 84.128C38.776 79.8187 40.184 76.4907 43 74.144C45.816 71.7547 49.7627 70.56 54.84 70.56C58.296 70.56 61.304 71.0933 63.864 72.16C66.424 73.2267 68.4933 74.6773 70.072 76.512L64.632 82.592C63.4373 81.2693 62.0293 80.2453 60.408 79.52C58.7867 78.752 56.952 78.368 54.904 78.368C50.5947 78.368 48.44 80.1387 48.44 83.68C48.44 85.216 48.9093 86.368 49.848 87.136C50.8293 87.904 52.408 88.48 54.584 88.864L59.256 89.696C62.8827 90.336 65.6773 91.7013 67.64 93.792C69.6027 95.8827 70.584 98.6987 70.584 102.24C70.584 104.331 70.2213 106.272 69.496 108.064C68.7707 109.813 67.6827 111.349 66.232 112.672C64.7813 113.952 62.9893 114.955 60.856 115.68C58.7653 116.405 56.312 116.768 53.496 116.768Z" fill="#14110F"></path>
<rect id="Cursor" x="91" y="48" width="31" height="72" rx="3" fill="#C1502E"></rect>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB