| import { IThemeRGB, IThemeVariables } from '../types'; |
|
|
| |
| |
| |
| function validateRGB(rgb: string): boolean { |
| if (!rgb) return true; |
| const rgbRegex = /^(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})$/; |
| const match = rgb.match(rgbRegex); |
|
|
| if (!match) return false; |
|
|
| |
| const [, r, g, b] = match; |
| return [r, g, b].every((val) => { |
| const num = parseInt(val, 10); |
| return num >= 0 && num <= 255; |
| }); |
| } |
|
|
| |
| |
| |
| function mapTheme(rgb: IThemeRGB): Partial<IThemeVariables> { |
| const variables: Partial<IThemeVariables> = {}; |
|
|
| |
| const mappings: Record<keyof IThemeRGB, keyof IThemeVariables> = { |
| 'rgb-text-primary': '--text-primary', |
| 'rgb-text-secondary': '--text-secondary', |
| 'rgb-text-secondary-alt': '--text-secondary-alt', |
| 'rgb-text-tertiary': '--text-tertiary', |
| 'rgb-text-warning': '--text-warning', |
| 'rgb-ring-primary': '--ring-primary', |
| 'rgb-header-primary': '--header-primary', |
| 'rgb-header-hover': '--header-hover', |
| 'rgb-header-button-hover': '--header-button-hover', |
| 'rgb-surface-active': '--surface-active', |
| 'rgb-surface-active-alt': '--surface-active-alt', |
| 'rgb-surface-hover': '--surface-hover', |
| 'rgb-surface-hover-alt': '--surface-hover-alt', |
| 'rgb-surface-primary': '--surface-primary', |
| 'rgb-surface-primary-alt': '--surface-primary-alt', |
| 'rgb-surface-primary-contrast': '--surface-primary-contrast', |
| 'rgb-surface-secondary': '--surface-secondary', |
| 'rgb-surface-secondary-alt': '--surface-secondary-alt', |
| 'rgb-surface-tertiary': '--surface-tertiary', |
| 'rgb-surface-tertiary-alt': '--surface-tertiary-alt', |
| 'rgb-surface-dialog': '--surface-dialog', |
| 'rgb-surface-submit': '--surface-submit', |
| 'rgb-surface-submit-hover': '--surface-submit-hover', |
| 'rgb-surface-destructive': '--surface-destructive', |
| 'rgb-surface-destructive-hover': '--surface-destructive-hover', |
| 'rgb-surface-chat': '--surface-chat', |
| 'rgb-border-light': '--border-light', |
| 'rgb-border-medium': '--border-medium', |
| 'rgb-border-medium-alt': '--border-medium-alt', |
| 'rgb-border-heavy': '--border-heavy', |
| 'rgb-border-xheavy': '--border-xheavy', |
| 'rgb-brand-purple': '--brand-purple', |
| 'rgb-presentation': '--presentation', |
|
|
| |
| 'rgb-background': '--background', |
| 'rgb-foreground': '--foreground', |
| 'rgb-primary': '--primary', |
| 'rgb-primary-foreground': '--primary-foreground', |
| 'rgb-secondary': '--secondary', |
| 'rgb-secondary-foreground': '--secondary-foreground', |
| 'rgb-muted': '--muted', |
| 'rgb-muted-foreground': '--muted-foreground', |
| 'rgb-accent': '--accent', |
| 'rgb-accent-foreground': '--accent-foreground', |
| 'rgb-destructive-foreground': '--destructive-foreground', |
| 'rgb-border': '--border', |
| 'rgb-input': '--input', |
| 'rgb-ring': '--ring', |
| 'rgb-card': '--card', |
| 'rgb-card-foreground': '--card-foreground', |
| }; |
|
|
| Object.entries(mappings).forEach(([rgbKey, cssVar]) => { |
| const value = rgb[rgbKey as keyof IThemeRGB]; |
| if (value) { |
| variables[cssVar] = value; |
| } |
| }); |
|
|
| return variables; |
| } |
|
|
| |
| |
| |
| |
| export default function applyTheme(themeRGB?: IThemeRGB) { |
| if (!themeRGB) return; |
|
|
| const themeObject = mapTheme(themeRGB); |
| const root = document.documentElement; |
|
|
| Object.entries(themeObject).forEach(([cssVar, value]) => { |
| if (!value) return; |
|
|
| const validation = validateRGB(value); |
| if (!validation) { |
| console.error(`Invalid RGB value for ${cssVar}: ${value}`); |
| return; |
| } |
|
|
| |
| |
| root.style.setProperty(cssVar, `rgb(${value})`); |
| }); |
| } |
|
|