|
@@ -99,9 +99,56 @@ export const generateThemeCSSVar = (token: GlobalToken, prefix: string): string
|
|
|
return `--${prefix}-${kebabCase(key)}:${value}${/(size|width|radius|margin|screen|padding)/gi.test(key) ? 'px' : ''}`;
|
|
|
});
|
|
|
|
|
|
+ cssVar.push(...getColorGradientCSSVar(token.colorPrimary, `${prefix}-color-primary`));
|
|
|
+
|
|
|
return `:root{${cssVar.join(';')}}`;
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * 根据十六进制值颜色生成透明度为 5%~95% 对应颜色的 css var
|
|
|
+ */
|
|
|
+export const getColorGradientCSSVar = (color: string, prefix: string): string[] => {
|
|
|
+ const rgb = hexToRgb(color);
|
|
|
+
|
|
|
+ if (!rgb) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ const cssVar: string[] = [];
|
|
|
+ const { r, g, b } = rgb;
|
|
|
+
|
|
|
+ for (let i = 5; i <= 95; i += 5) {
|
|
|
+ cssVar.push(`--${prefix}-opacity-${i}:rgba(${r}, ${g}, ${b}, ${i / 100})`);
|
|
|
+ }
|
|
|
+
|
|
|
+ return cssVar;
|
|
|
+};
|
|
|
+
|
|
|
+export const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {
|
|
|
+ const cleanedHex = hex.replace(/^#/, '');
|
|
|
+
|
|
|
+ if (cleanedHex.length !== 3 && cleanedHex.length !== 6) {
|
|
|
+ console.error('Invalid hex color value');
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ let extendedHex = cleanedHex;
|
|
|
+
|
|
|
+ // 将 3 位十六进制扩展为 6 位(例如 #abc -> #aabbcc)
|
|
|
+ if (cleanedHex.length === 3) {
|
|
|
+ extendedHex = cleanedHex
|
|
|
+ .split('')
|
|
|
+ .map((char) => char + char)
|
|
|
+ .join('');
|
|
|
+ }
|
|
|
+
|
|
|
+ const r = parseInt(extendedHex.slice(0, 2), 16);
|
|
|
+ const g = parseInt(extendedHex.slice(2, 4), 16);
|
|
|
+ const b = parseInt(extendedHex.slice(4, 6), 16);
|
|
|
+
|
|
|
+ return { r, g, b };
|
|
|
+};
|
|
|
+
|
|
|
export const addUnit = (val: number, unit: string = 'px'): string => {
|
|
|
return val + unit;
|
|
|
};
|