MuseMVP Docs
Theme and Layout

Theme Modes and Tokens

Configure light/dark/system mode, token variables, and theme switch behavior in the current MuseMVP implementation.

This guide focuses on the current theme implementation in MuseMVP: mode switching (light / dark / system) plus CSS token customization.

Capability Overview

CapabilityCurrent behavior
Theme modesControlled by config.ui.enabledThemes
Default modeControlled by config.ui.defaultTheme
Theme providernext-themes, mounted in src/modules/html-document/Document.tsx
Token sourcesrc/app/globals.css and src/app/styles/theme.css
UI switcherColorThemeSwitcherNoCustomTheme used in app layouts

Scope

The current system is a stable "mode switch + token variables" setup. It does not include a built-in multi-brand preset library.

Quick Configuration

Set allowed modes

Update enabledThemes and defaultTheme in src/config/index.ts.

// src/config/index.ts
ui: {
  enabledThemes: ["light", "dark", "system"],
  defaultTheme: "dark",
}

Update core tokens

Update shared and dark-mode tokens in src/app/globals.css.

/* src/app/globals.css */
:root {
  --background: oklch(...);
  --foreground: oklch(...);
  --primary: oklch(...);
}

.dark {
  --background: oklch(...);
  --foreground: oklch(...);
  --primary: oklch(...);
}

Add product-specific tokens when needed

Place additional design tokens in src/app/styles/theme.css (for example --success, --highlight) and consume them in components.

Mode Option Reference

ModeMeaning
lightAlways uses light palette
darkAlways uses dark palette
systemFollows OS/browser color-scheme preference

Common Pitfalls

Import order matters

src/app/main.css imports theme.css first and globals.css second.
If the same variable exists in both files, globals.css wins.

Default mode must be enabled

Keep defaultTheme included in enabledThemes.
Example: if defaultTheme is dark, enabledThemes should still include dark.

Landing visual tokens

Default landing look is warm terracotta primary on a warm gray canvas, not a hard-edged theme.

TokenDefaultWhere
--radius0.875remsrc/app/globals.css (:root and .dark). @theme inline keeps the +4px radius ladder.
--primaryterracotta / clay orange (oklch(0.55 0.14 42) in light)src/app/globals.css
Shadowssoft multi-layer, not blur: 3px hard edgessrc/app/globals.css
.landing-gridfaint 72px grid with a radial masksrc/app/main.css

Style-only rounded-none on landing cards is gone. Signed-in settings headers and panels (SettingsShell, SettingsPanelItem) use rounded-xl to match the shell. Keep rounded-none on control seams such as data-table, calendar, input-group, and toggle-group.

On this page