2026-07-03 01:33:52 +04:00
|
|
|
import { ThemeConfig } from '../../shared/models/config';
|
|
|
|
|
import { ThemeCssVariables } from '../tokens/theme-css-variable.model';
|
|
|
|
|
import { THEME_VARIABLE_MAP } from '../tokens/theme-variable-map';
|
|
|
|
|
|
|
|
|
|
export function mapThemeConfigToCssVariables(theme: ThemeConfig): ThemeCssVariables {
|
2026-07-09 02:29:12 +04:00
|
|
|
const spacingScale = Array.isArray(theme.spacing.scale) && theme.spacing.scale.length > 0
|
|
|
|
|
? theme.spacing.scale
|
|
|
|
|
: [0.25, 0.5, 1, 1.5, 2];
|
|
|
|
|
|
|
|
|
|
const spacingValues = spacingScale
|
|
|
|
|
.slice(0, 5)
|
|
|
|
|
.map(multiplier => `${Math.max(0, Number(multiplier) || 0) * theme.spacing.unit}px`);
|
|
|
|
|
|
|
|
|
|
while (spacingValues.length < 5) {
|
|
|
|
|
spacingValues.push(`${theme.spacing.unit}px`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-03 01:33:52 +04:00
|
|
|
const vars: ThemeCssVariables = {
|
|
|
|
|
[THEME_VARIABLE_MAP.primary]: theme.palette.primary,
|
|
|
|
|
[THEME_VARIABLE_MAP.secondary]: theme.palette.secondary,
|
|
|
|
|
[THEME_VARIABLE_MAP.accent]: theme.palette.accent,
|
|
|
|
|
[THEME_VARIABLE_MAP.success]: theme.palette.success,
|
|
|
|
|
[THEME_VARIABLE_MAP.warning]: theme.palette.warning,
|
|
|
|
|
[THEME_VARIABLE_MAP.danger]: theme.palette.danger,
|
|
|
|
|
[THEME_VARIABLE_MAP.info]: theme.palette.info,
|
|
|
|
|
[THEME_VARIABLE_MAP.textPrimary]: theme.palette.textPrimary,
|
|
|
|
|
[THEME_VARIABLE_MAP.textSecondary]: theme.palette.textSecondary,
|
|
|
|
|
[THEME_VARIABLE_MAP.backgroundPrimary]: theme.palette.backgroundPrimary,
|
|
|
|
|
[THEME_VARIABLE_MAP.backgroundSecondary]: theme.palette.backgroundSecondary,
|
|
|
|
|
[THEME_VARIABLE_MAP.border]: theme.palette.border,
|
2026-07-09 02:29:12 +04:00
|
|
|
[THEME_VARIABLE_MAP.spaceXs]: spacingValues[0],
|
|
|
|
|
[THEME_VARIABLE_MAP.spaceSm]: spacingValues[1],
|
|
|
|
|
[THEME_VARIABLE_MAP.spaceMd]: spacingValues[2],
|
|
|
|
|
[THEME_VARIABLE_MAP.spaceLg]: spacingValues[3],
|
|
|
|
|
[THEME_VARIABLE_MAP.spaceXl]: spacingValues[4],
|
|
|
|
|
[THEME_VARIABLE_MAP.transitionFast]: '120ms ease',
|
|
|
|
|
[THEME_VARIABLE_MAP.transitionNormal]: '180ms ease',
|
|
|
|
|
[THEME_VARIABLE_MAP.transitionSlow]: '300ms ease',
|
2026-07-03 01:33:52 +04:00
|
|
|
'--app-font-family': theme.typography.primaryFontFamily,
|
|
|
|
|
'--app-font-size': `${theme.typography.baseFontSize}px`,
|
|
|
|
|
'--app-spacing-unit': `${theme.spacing.unit}px`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(theme.borderRadiusScale)) {
|
|
|
|
|
vars[`--radius-${key}`] = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(theme.shadows)) {
|
|
|
|
|
vars[`--shadow-${key}`] = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return vars;
|
|
|
|
|
}
|