my website at ewancroft.uk

Theme System Documentation#

The color theme system is now centralized and easy to extend. All theme definitions are managed through a single configuration file.

Architecture#

  • /src/lib/config/themes.config.ts - Central theme configuration (add new themes here)
  • /src/lib/stores/colorTheme.ts - Theme state management
  • /src/lib/components/layout/ColorThemeToggle.svelte - Theme picker UI
  • /src/lib/styles/themes/*.css - Individual theme CSS files
  • /src/lib/styles/themes.css - Theme CSS imports

Adding a New Theme#

To add a new theme, follow these steps:

1. Add Theme Definition to Config#

Edit /src/lib/config/themes.config.ts and add your theme to the THEMES array:

{
  value: 'midnight',           // Unique identifier (used in CSS and localStorage)
  label: 'Midnight',           // Display name in dropdown
  description: 'Deep night',   // Short description
  color: 'oklch(20% 0.05 240)', // Preview color (shown in dropdown)
  category: 'cool'             // 'neutral' | 'warm' | 'cool' | 'vibrant'
}

2. Create Theme CSS File#

Create /src/lib/styles/themes/midnight.css with your color definitions:

/* ============================================================================
   MIDNIGHT THEME - Deep night
   Primary: Dark blue
   Secondary: Navy
   Accent: Steel
   Hue: 240° (blue)
   ============================================================================ */
[data-color-theme='midnight'] {
	/* Define your CSS custom properties here */
	--color-primary-500: oklch(20% 0.05 240);
	/* ... other color definitions ... */
}

3. Import Theme CSS#

Add the import to /src/lib/styles/themes.css:

@import './themes/midnight.css';

That's It!#

The theme will automatically:

  • ✅ Appear in the color theme dropdown
  • ✅ Be type-safe in TypeScript
  • ✅ Work with the theme switcher
  • ✅ Persist in localStorage

Configuration API#

THEMES#

Array of all available themes. Each theme has:

  • value: Unique identifier (string)
  • label: Display name (string)
  • description: Short description (string)
  • color: Preview color in OKLCH format (string)
  • category: Theme category (string)

ColorTheme#

TypeScript type automatically generated from theme values.

DEFAULT_THEME#

The default theme used when no preference is stored.

getThemesByCategory()#

Returns themes organized by category for UI rendering.

getTheme(value)#

Get a specific theme definition by its value.

Example: Adding Multiple Themes#

// In themes.config.ts
export const THEMES: readonly ThemeDefinition[] = [
	// ... existing themes ...

	// New themes
	{
		value: 'midnight',
		label: 'Midnight',
		description: 'Deep night',
		color: 'oklch(20% 0.05 240)',
		category: 'cool'
	},
	{
		value: 'sunrise',
		label: 'Sunrise',
		description: 'Morning glow',
		color: 'oklch(75% 0.15 50)',
		category: 'warm'
	}
] as const;

Then create midnight.css and sunrise.css in the themes folder, and import them in themes.css.