-
-
Notifications
You must be signed in to change notification settings - Fork 0
2.3 theming
wiki[bot] edited this page Aug 8, 2026
·
2 revisions
3F has a deliberately strong visual identity: the dashboard ships a catalogue of 10 game-inspired themes, each a complete color harmony rather than a reskin.
| Key | Name |
|---|---|
gothic |
Gothic |
pragmata |
Pragmata |
souls |
Dark Souls |
residentevil |
Resident Evil |
cyberpunk |
Cyberpunk 2077 |
baldursgate |
Baldur's Gate |
stellar |
Stellar Blade |
deathspace |
Dead Space |
wuchang |
Wuchang |
nioh |
Nioh |
The default theme is stellar (DEFAULT_THEME in stores/theme.ts).
- Themes are applied declaratively:
document.documentElementcarriesdata-theme="<key>"and adata-theme-mode(light/dark) attribute. All colors resolve from CSS design tokens scoped to these attributes — components never hardcode palette values. - The
themePinia store (src/stores/theme.ts) owns the catalogue, persistence, and application:initTheme()restores the stored choice on boot (before first paint, fromApp.vue'sonBeforeMount),applyTheme()switches at runtime with no reload. - The selector UI is
components/app/app-theme-selector/AppThemeSelector.vuein the app header.
Styling convention across the codebase: semantic tokens first, Tailwind v4 for layout/spacing. Theme palettes define token values; components consume tokens, so a new theme is a new token set, not a code change. Scoped CSS holds component-specific rules; @apply is avoided in favor of plain CSS against tokens.
- Pick a harmony (backgrounds, surfaces, accents, text, states) and add the key to the catalogue in
stores/theme.ts. - Define its token set under
[data-theme="<key>"](and, where it differs,[data-theme-mode]). - Add/refresh a story for
AppThemeSelectorso the visual state is covered.
That is the entire cost of a new identity — tokens do the rest.