Theme packs
A theme pack is a complete look that ships with Crewship. Packs appear in Settings → Appearance → Style under their category (the first is Gaming), can be picked per person, and can be set as the workspace default look. They use the same mechanism as the built-in styles, so Harbor and every other style keep working unchanged.Afterglow
Afterglow is a dark theme on a night-indigo ground with a sunset gradient and neon pink. The primary action is amber with dark ink, and page titles and big numbers use Big Shoulders Display in capitals. Everything else is set in Manrope. Both fonts are bundled with the app and the browser downloads them only while Afterglow is in use.- Dark only. A person on Light or System who picks Afterglow is moved to Dark, and Light and System are off while it is the style (the page says why and offers Switch to Harbor). Someone who is on Light in a workspace whose default is Afterglow sees Harbor until they switch to Dark.
- The Crewship sail stays blue. No pack sets a brand, logo or sail token, and Afterglow suggests the Blue accent. A test fails if a pack tries.
- Contrast. Every text colour is at least 4.5:1 on every surface it can sit on; icons, control borders, the focus ring and chart series are at least 3:1.
lib/theme-packs/__tests__/contrast.test.tsholds every pack to this. - Glow is decoration. A glow or gradient is never the only sign of a state: status is always also a word, an icon or a shape. The optional glow pulse stops under Reduce motion (the setting, and the operating system’s preference).
- Postcard tilt applies to overview cards only (the Dashboard’s attention tiles), never to rows in a list.
- Avatar. Afterglow names
voxel-botas its default avatar style. A build that does not have that style ignores the request (packAvatarStyleinlib/theme-packs).
Workspace default
An owner or admin can make the current look, including a pack, the workspace default under Settings → Appearance. Members who have not chosen their own style get it. The backend stores the style id as text and does not list styles, so adding a pack needs no backend release; a client that does not know the id shows Harbor.Adding a pack
One new file and one registry line.- Create
lib/theme-packs/<id>.tsexporting aThemePack(copyafterglow.ts). A pack declares:id(lowercase letters, digits, dashes, up to 32),name,category,blurb;schemes: the schemes it has a legible palette for. Define alighttoken set only if it stays legible; otherwise leave the pack dark-only (or light-only);tokensper scheme: the same custom properties the built-in styles set (surfaces, text, lines, primary action, chips, charts). A token a pack leaves out is Harbor’s;accent: the accent suggested when it is picked (useblueto keep the Crewship blue);- optional
displayFontandtextFont: files underpublic/fonts/<family>/with their OFL licence; - optional
avatarStyleslug, andmotion(flavour, glow pulse, postcard tilt).
- Add it to
PACKSinlib/theme-packs/index.ts. A new category goes inPACK_CATEGORIESintypes.tsandSTYLE_CATEGORIESinlib/theme/appearance-style.ts. - Regenerate the stylesheet:
UPDATE_PACKS_CSS=1 pnpm vitest run lib/theme-packs. This rewritesapp/styles/packs.generated.css; commit it. The test suite fails if it is out of date. - Run the tests. The registry test checks ids, the generated CSS, that the pack sets no brand, logo or sail token, and that its names carry no third-party trademark. The contrast test checks every token pair.