255 lines
6.6 KiB
TypeScript
255 lines
6.6 KiB
TypeScript
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}%`
|
|
}
|