Files
cashier_app/uni_modules/lime-style/token/useThemeVars.uts
2025-12-03 10:13:55 +08:00

123 lines
3.1 KiB
Plaintext

// @ts-nocheck
import { isDarkMode } from './useThemeMode'
import type { SeedToken } from './interface';
import { genFontMapToken } from './genFontMapToken';
import { genSizeMapToken } from './genSizeMapToken';
import { genColorMapToken as genLightColorMapToken } from './light';
import { genColorMapToken as genDarkColorMapToken } from './dark';
import { computed, reactive } from 'vue'; // 或相应的响应式系统
// #ifndef UNI-APP-X
export type VueApp = any
export type UTSJSONObject = Record<string, any>
const UTSJSONObject = Object
// #endif
// 内部存储的 tokens
type LimeTokens = {
light : UTSJSONObject
dark : UTSJSONObject
}
// 默认的基础 token
const DEFAULT_SEED_TOKEN : SeedToken = {
primaryColor: '#3283ff'
};
export const themeTokenMaps = reactive<LimeTokens>({
light: {},
dark: {},
})
// 初始化默认 tokens
function initDefaultTokens() {
// Light 主题颜色
const lightColors = {
white: '#fff',
gray1: '#f3f3f3',
gray2: '#eeeeee',
gray3: '#e7e7e7',
gray4: '#dcdcdc',
gray5: '#c5c5c5',
gray6: '#a6a6a6',
gray7: '#8b8b8b',
gray8: '#777777',
gray9: '#5e5e5e',
gray10: '#4b4b4b',
gray11: '#383838',
gray12: '#2c2c2c',
gray13: '#242424',
gray14: '#181818',
black: '#000',
...genLightColorMapToken(DEFAULT_SEED_TOKEN)
};
// Dark 主题颜色
const darkColors = {
white: '#000', // 在暗黑模式下反转
gray1: '#181818',
gray2: '#242424',
gray3: '#2c2c2c',
gray4: '#383838',
gray5: '#4b4b4b',
gray6: '#5e5e5e',
gray7: '#777777',
gray8: '#8b8b8b',
gray9: '#a6a6a6',
gray10: '#c5c5c5',
gray11: '#dcdcdc',
gray12: '#e7e7e7',
gray13: '#eeeeee',
gray14: '#f3f3f3',
black: '#fff', // 在暗黑模式下反转
...genDarkColorMapToken(DEFAULT_SEED_TOKEN)
};
themeTokenMaps.light = UTSJSONObject.assign({}, lightColors, lightColors)
themeTokenMaps.dark = UTSJSONObject.assign({}, darkColors, darkColors)
}
initDefaultTokens();
// 导出的 themeTokens 是计算属性,自动返回当前主题的 tokens
export const themeTokens = computed(():UTSJSONObject => {
return isDarkMode.value ? themeTokenMaps.dark : themeTokenMaps.light;
});
export function useThemeToken(token : SeedToken | null = null) {
if (token != null) {
const lightColors = genLightColorMapToken(token!);
const darkColors = genDarkColorMapToken(token!);
// 只有在提供了相关属性时才重新生成 fonts 和 sizes
const fonts = genFontMapToken(token!.fontSize)
const sizes = genSizeMapToken(token!.sizeUnit, token.sizeStep)
themeTokenMaps.light = UTSJSONObject.assign({}, themeTokenMaps.light, lightColors, fonts, sizes)
themeTokenMaps.dark = UTSJSONObject.assign({}, themeTokenMaps.dark, darkColors, fonts, sizes)
}
}
export function useThemeVars(options : UTSJSONObject | null = null) {
if (options != null) {
const currentTheme = isDarkMode.value ? themeTokenMaps.dark : themeTokenMaps.light;
// #ifdef UNI-APP-X && APP
options.toMap().forEach((value, key) => {
currentTheme.set(key, value);
});
// #endif
// #ifndef UNI-APP-X && APP
Object.entries(options).forEach(([key, value]) => {
// currentTheme.set(key, value);
currentTheme[key] = value
});
// #endif
}
}