Skip to content

Theme Generation

Generate complete WCAG-compliant themes from a single brand color — the fastest way to ship multi-theme support.

Generate a Theme Pair

ts
import { generateThemePair } from 'vue-multiple-themes'

const [light, dark] = generateThemePair('#7c3aed')
// light.colors.primary, light.colors.background, etc.
// dark.colors.primary, dark.colors.background, etc.

// Use directly:
app.use(VueMultipleThemesPlugin, {
  themes: generateThemePair('#7c3aed'),
  defaultTheme: 'light',
})

Generate Light or Dark Individually

ts
import { generateLightTheme, generateDarkTheme } from 'vue-multiple-themes'

const light = generateLightTheme('#3b82f6', {
  name: 'brand-light',
  label: 'Brand Light',
})

const dark = generateDarkTheme('#3b82f6', {
  name: 'brand-dark',
  label: 'Brand Dark',
  saturationBias: 5, // more colorful dark surfaces
})

Generate from a Full Palette

ts
import { generateThemeFromPalette } from 'vue-multiple-themes'

const theme = generateThemeFromPalette(
  {
    primary: '#7c3aed',
    secondary: '#ec4899',
    accent: '#f59e0b',
  },
  'light', // or 'dark'
  { name: 'my-brand', label: 'My Brand' },
)

Seasonal / Mood Themes

ts
import { generateSeasonalThemes } from 'vue-multiple-themes'

const [springLight, springDark] = generateSeasonalThemes('spring')
// Also: 'summer', 'autumn', 'winter', 'midnight', 'neon', 'pastel'

WCAG Compliance

All generated themes automatically ensure:

  • Text on background meets WCAG AA (4.5:1 contrast ratio)
  • TextInverse on primary is readable (auto-selected white or dark)
  • Muted text meets WCAG AA for large text (3:1 ratio)

You can verify with:

ts
import { checkContrast } from 'vue-multiple-themes'

const report = checkContrast('#7c3aed', '#ffffff')
console.log(report)
// { ratio: 5.98, aa: true, aaLarge: true, aaa: false, aaaLarge: true }

Color Scale Generator

Generate Tailwind-style color scales from any base color:

ts
import { generateColorScale } from 'vue-multiple-themes'

const scale = generateColorScale('#3b82f6')
// { 50: '#...', 100: '#...', ..., 900: '#...', 950: '#...' }

Released under the MIT License.