Files
awesome-app/lib/themes.ts

255 lines
6.6 KiB
TypeScript
Raw Normal View History

2025-10-25 16:09:02 +02:00
export interface ColorPalette {
id: string
name: string
description: string
colors: {
primary: string
primaryLight: string
primaryDark: string
secondary: string
secondaryLight: string
secondaryDark: string
accent: string
accentLight: string
accentDark: string
}
gradient: string
}
export const colorPalettes: ColorPalette[] = [
{
id: 'awesome',
name: 'Awesome Purple',
description: 'Our signature purple, pink, and gold theme',
colors: {
primary: '#DA22FF',
primaryLight: '#E855FF',
primaryDark: '#9733EE',
secondary: '#FF69B4',
secondaryLight: '#FFB6D9',
secondaryDark: '#FF1493',
accent: '#FFD700',
accentLight: '#FFE44D',
accentDark: '#FFC700',
},
gradient: 'linear-gradient(135deg, #DA22FF 0%, #9733EE 50%, #FFD700 100%)',
},
{
id: 'royal',
name: 'Royal Violet',
description: 'Deep purple with regal blue and silver accents',
colors: {
primary: '#7C3AED',
primaryLight: '#A78BFA',
primaryDark: '#5B21B6',
secondary: '#6366F1',
secondaryLight: '#818CF8',
secondaryDark: '#4F46E5',
accent: '#94A3B8',
accentLight: '#CBD5E1',
accentDark: '#64748B',
},
gradient: 'linear-gradient(135deg, #7C3AED 0%, #6366F1 50%, #94A3B8 100%)',
},
{
id: 'cosmic',
name: 'Cosmic Purple',
description: 'Deep space purple with cyan and magenta',
colors: {
primary: '#8B5CF6',
primaryLight: '#A78BFA',
primaryDark: '#6D28D9',
secondary: '#EC4899',
secondaryLight: '#F472B6',
secondaryDark: '#DB2777',
accent: '#06B6D4',
accentLight: '#22D3EE',
accentDark: '#0891B2',
},
gradient: 'linear-gradient(135deg, #8B5CF6 0%, #EC4899 50%, #06B6D4 100%)',
},
{
id: 'sunset',
name: 'Purple Sunset',
description: 'Warm purple with orange and coral tones',
colors: {
primary: '#A855F7',
primaryLight: '#C084FC',
primaryDark: '#7E22CE',
secondary: '#F97316',
secondaryLight: '#FB923C',
secondaryDark: '#EA580C',
accent: '#FB7185',
accentLight: '#FDA4AF',
accentDark: '#F43F5E',
},
gradient: 'linear-gradient(135deg, #A855F7 0%, #F97316 50%, #FB7185 100%)',
},
{
id: 'lavender',
name: 'Lavender Dreams',
description: 'Soft purple with pastel pink and mint',
colors: {
primary: '#C084FC',
primaryLight: '#D8B4FE',
primaryDark: '#A855F7',
secondary: '#F9A8D4',
secondaryLight: '#FBC8E7',
secondaryDark: '#F472B6',
accent: '#86EFAC',
accentLight: '#BBF7D0',
accentDark: '#4ADE80',
},
gradient: 'linear-gradient(135deg, #C084FC 0%, #F9A8D4 50%, #86EFAC 100%)',
},
{
id: 'neon',
name: 'Neon Purple',
description: 'Electric purple with bright neon accents',
colors: {
primary: '#D946EF',
primaryLight: '#E879F9',
primaryDark: '#C026D3',
secondary: '#F0ABFC',
secondaryLight: '#F5D0FE',
secondaryDark: '#E879F9',
accent: '#22D3EE',
accentLight: '#67E8F9',
accentDark: '#06B6D4',
},
gradient: 'linear-gradient(135deg, #D946EF 0%, #F0ABFC 50%, #22D3EE 100%)',
},
{
id: 'galaxy',
name: 'Galaxy Purple',
description: 'Deep cosmic purple with star-like shimmer',
colors: {
primary: '#6D28D9',
primaryLight: '#8B5CF6',
primaryDark: '#5B21B6',
secondary: '#7C3AED',
secondaryLight: '#A78BFA',
secondaryDark: '#6D28D9',
accent: '#FBBF24',
accentLight: '#FCD34D',
accentDark: '#F59E0B',
},
gradient: 'linear-gradient(135deg, #6D28D9 0%, #7C3AED 50%, #FBBF24 100%)',
},
{
id: 'berry',
name: 'Berry Blast',
description: 'Rich purple with berry and wine tones',
colors: {
primary: '#9333EA',
primaryLight: '#A855F7',
primaryDark: '#7E22CE',
secondary: '#BE123C',
secondaryLight: '#E11D48',
secondaryDark: '#9F1239',
accent: '#FB923C',
accentLight: '#FDBA74',
accentDark: '#F97316',
},
gradient: 'linear-gradient(135deg, #9333EA 0%, #BE123C 50%, #FB923C 100%)',
},
]
export type ThemeMode = 'light' | 'dark'
export interface ThemeConfig {
mode: ThemeMode
palette: string
}
export function getThemeVariables(palette: ColorPalette, mode: ThemeMode) {
const isDark = mode === 'dark'
return {
// Base colors
background: isDark ? '0 0% 3.9%' : '0 0% 100%',
foreground: isDark ? '0 0% 98%' : '0 0% 3.9%',
// Card
card: isDark ? '0 0% 3.9%' : '0 0% 100%',
cardForeground: isDark ? '0 0% 98%' : '0 0% 3.9%',
// Popover
popover: isDark ? '0 0% 3.9%' : '0 0% 100%',
popoverForeground: isDark ? '0 0% 98%' : '0 0% 3.9%',
// Primary (from palette)
primary: palette.colors.primary,
primaryLight: palette.colors.primaryLight,
primaryDark: palette.colors.primaryDark,
primaryForeground: isDark ? '0 0% 9%' : '0 0% 98%',
// Secondary (from palette)
secondary: palette.colors.secondary,
secondaryLight: palette.colors.secondaryLight,
secondaryDark: palette.colors.secondaryDark,
secondaryForeground: isDark ? '0 0% 98%' : '0 0% 9%',
// Accent (from palette)
accent: palette.colors.accent,
accentLight: palette.colors.accentLight,
accentDark: palette.colors.accentDark,
accentForeground: isDark ? '0 0% 98%' : '0 0% 9%',
// Muted
muted: isDark ? '0 0% 14.9%' : '0 0% 96.1%',
mutedForeground: isDark ? '0 0% 63.9%' : '0 0% 45.1%',
// Destructive
destructive: isDark ? '0 62.8% 30.6%' : '0 84.2% 60.2%',
destructiveForeground: '0 0% 98%',
// Border
border: isDark ? '0 0% 14.9%' : '0 0% 89.8%',
input: isDark ? '0 0% 14.9%' : '0 0% 89.8%',
ring: palette.colors.primary,
// Gradient
gradient: palette.gradient,
}
}
export function hexToHsl(hex: string): string {
// Remove the hash if present
hex = hex.replace(/^#/, '')
// Parse the hex values
const r = parseInt(hex.substring(0, 2), 16) / 255
const g = parseInt(hex.substring(2, 4), 16) / 255
const b = parseInt(hex.substring(4, 6), 16) / 255
const max = Math.max(r, g, b)
const min = Math.min(r, g, b)
let h = 0
let s = 0
const l = (max + min) / 2
if (max !== min) {
const d = max - min
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
switch (max) {
case r:
h = ((g - b) / d + (g < b ? 6 : 0)) / 6
break
case g:
h = ((b - r) / d + 2) / 6
break
case b:
h = ((r - g) / d + 4) / 6
break
}
}
h = Math.round(h * 360)
s = Math.round(s * 100)
const lightness = Math.round(l * 100)
return `${h} ${s}% ${lightness}%`
}