@yh-ui/theme 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/component-theme.cjs +69 -0
- package/dist/component-theme.d.ts +269 -0
- package/dist/component-theme.mjs +54 -0
- package/dist/index.cjs +38 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.mjs +3 -0
- package/dist/styles/components.css +589 -0
- package/dist/styles/index.css +584 -0
- package/dist/styles/mixins/mixins.css +451 -0
- package/dist/styles/reset.css +129 -0
- package/dist/styles/variables.css +451 -0
- package/dist/theme.cjs +1261 -0
- package/dist/theme.d.ts +313 -0
- package/dist/theme.mjs +1200 -0
- package/dist/tokens/index.cjs +244 -0
- package/dist/tokens/index.d.ts +458 -0
- package/dist/tokens/index.mjs +238 -0
- package/package.json +52 -0
- package/src/styles/components.scss +9 -0
- package/src/styles/index.scss +8 -0
- package/src/styles/mixins/mixins.scss +96 -0
- package/src/styles/reset.scss +131 -0
- package/src/styles/variables.scss +513 -0
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YH-UI Theme Configuration
|
|
3
|
+
* 主题配置系统 - 业内领先级别
|
|
4
|
+
* @description 提供主题切换、自定义主题色、持久化、响应式主题等功能
|
|
5
|
+
*/
|
|
6
|
+
import type { App, InjectionKey } from 'vue';
|
|
7
|
+
/** 主题色配置 */
|
|
8
|
+
export interface ThemeColors {
|
|
9
|
+
primary?: string;
|
|
10
|
+
success?: string;
|
|
11
|
+
warning?: string;
|
|
12
|
+
danger?: string;
|
|
13
|
+
info?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 预设主题 */
|
|
16
|
+
export type PresetTheme = 'default' | 'dark' | 'blue' | 'green' | 'purple' | 'orange' | 'rose' | 'amber' | 'teal' | 'indigo' | 'slate' | 'zinc';
|
|
17
|
+
/** 响应式断点 */
|
|
18
|
+
export type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
|
|
19
|
+
/** 响应式主题配置 */
|
|
20
|
+
export type ResponsiveTheme = Partial<Record<Breakpoint, Partial<ThemeOptions>>>;
|
|
21
|
+
/** 主题配置选项 */
|
|
22
|
+
export interface ThemeOptions {
|
|
23
|
+
/** 预设主题 */
|
|
24
|
+
preset?: PresetTheme;
|
|
25
|
+
/** 自定义颜色 */
|
|
26
|
+
colors?: ThemeColors;
|
|
27
|
+
/** 是否暗色模式 */
|
|
28
|
+
dark?: boolean;
|
|
29
|
+
/** CSS 变量作用域(默认 :root) */
|
|
30
|
+
scope?: string | HTMLElement;
|
|
31
|
+
/** 是否持久化到 localStorage */
|
|
32
|
+
persist?: boolean;
|
|
33
|
+
/** 持久化 key */
|
|
34
|
+
persistKey?: string;
|
|
35
|
+
/** 响应式主题配置 */
|
|
36
|
+
responsive?: ResponsiveTheme;
|
|
37
|
+
/** 圆角配置 */
|
|
38
|
+
radius?: 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
39
|
+
/** 是否启用系统主题跟随 */
|
|
40
|
+
followSystem?: boolean;
|
|
41
|
+
/** 颜色算法 */
|
|
42
|
+
algorithm?: 'default' | 'vibrant' | 'muted' | 'pastel';
|
|
43
|
+
}
|
|
44
|
+
/** 主题状态快照 */
|
|
45
|
+
export interface ThemeSnapshot {
|
|
46
|
+
preset: PresetTheme;
|
|
47
|
+
colors: ThemeColors;
|
|
48
|
+
dark: boolean;
|
|
49
|
+
radius: string;
|
|
50
|
+
algorithm: string;
|
|
51
|
+
density: ThemeDensity;
|
|
52
|
+
timestamp: number;
|
|
53
|
+
version: string;
|
|
54
|
+
name?: string;
|
|
55
|
+
author?: string;
|
|
56
|
+
}
|
|
57
|
+
/** 颜色算法类型 */
|
|
58
|
+
export type ColorAlgorithm = 'default' | 'vibrant' | 'muted' | 'pastel';
|
|
59
|
+
/** 紧凑度/密度类型 */
|
|
60
|
+
export type ThemeDensity = 'comfortable' | 'compact' | 'dense';
|
|
61
|
+
/** 组件级主题覆盖 */
|
|
62
|
+
export interface ComponentThemeOverride {
|
|
63
|
+
[componentName: string]: Record<string, string>;
|
|
64
|
+
}
|
|
65
|
+
/** 色盲友好模式 */
|
|
66
|
+
export type ColorBlindMode = 'none' | 'protanopia' | 'deuteranopia' | 'tritanopia' | 'achromatopsia';
|
|
67
|
+
/** 完整主题配置 */
|
|
68
|
+
export interface FullThemeConfig extends ThemeOptions {
|
|
69
|
+
/** 主题名称 */
|
|
70
|
+
name?: string;
|
|
71
|
+
/** 主题作者 */
|
|
72
|
+
author?: string;
|
|
73
|
+
/** 紧凑度 */
|
|
74
|
+
density?: ThemeDensity;
|
|
75
|
+
/** 色盲模式 */
|
|
76
|
+
colorBlindMode?: ColorBlindMode;
|
|
77
|
+
/** 组件级覆盖 */
|
|
78
|
+
components?: ComponentThemeOverride;
|
|
79
|
+
/** 主题切换动画 */
|
|
80
|
+
transition?: boolean | {
|
|
81
|
+
duration?: number;
|
|
82
|
+
timing?: string;
|
|
83
|
+
};
|
|
84
|
+
/** 继承的主题 */
|
|
85
|
+
extends?: PresetTheme | FullThemeConfig;
|
|
86
|
+
}
|
|
87
|
+
declare const presetThemes: Record<PresetTheme, ThemeColors>;
|
|
88
|
+
/** HEX 转 RGB */
|
|
89
|
+
declare function hexToRgb(hex: string): {
|
|
90
|
+
r: number;
|
|
91
|
+
g: number;
|
|
92
|
+
b: number;
|
|
93
|
+
} | null;
|
|
94
|
+
/** RGB 转 HEX */
|
|
95
|
+
declare function rgbToHex(r: number, g: number, b: number): string;
|
|
96
|
+
/** RGB 转 HSL */
|
|
97
|
+
declare function rgbToHsl(r: number, g: number, b: number): {
|
|
98
|
+
h: number;
|
|
99
|
+
s: number;
|
|
100
|
+
l: number;
|
|
101
|
+
};
|
|
102
|
+
/** HSL 转 RGB */
|
|
103
|
+
declare function hslToRgb(h: number, s: number, l: number): {
|
|
104
|
+
r: number;
|
|
105
|
+
g: number;
|
|
106
|
+
b: number;
|
|
107
|
+
};
|
|
108
|
+
/** 计算相对亮度 (WCAG 2.1) */
|
|
109
|
+
declare function getRelativeLuminance(r: number, g: number, b: number): number;
|
|
110
|
+
/** 计算对比度 (WCAG 2.1) */
|
|
111
|
+
declare function getContrastRatio(color1: string, color2: string): number;
|
|
112
|
+
/** 确保颜色对比度达到 WCAG AA 标准 (4.5:1) */
|
|
113
|
+
declare function ensureContrast(foreground: string, background: string, minRatio?: number): string;
|
|
114
|
+
/** 混合两种颜色 */
|
|
115
|
+
declare function mixColor(color1: string, color2: string, weight: number): string;
|
|
116
|
+
/** 调整颜色饱和度 */
|
|
117
|
+
declare function adjustSaturation(color: string, amount: number): string;
|
|
118
|
+
/** 调整颜色亮度 */
|
|
119
|
+
declare function adjustLightness(color: string, amount: number): string;
|
|
120
|
+
declare const breakpoints: Record<Breakpoint, number>;
|
|
121
|
+
declare const densityConfig: Record<ThemeDensity, Record<string, string>>;
|
|
122
|
+
declare const colorBlindPalettes: Record<ColorBlindMode, Record<string, string>>;
|
|
123
|
+
/** 获取互补色 */
|
|
124
|
+
declare function getComplementaryColor(hex: string): string;
|
|
125
|
+
/** 获取类似色 (三等分) */
|
|
126
|
+
declare function getAnalogousColors(hex: string): [string, string];
|
|
127
|
+
/** 获取三角色 */
|
|
128
|
+
declare function getTriadicColors(hex: string): [string, string];
|
|
129
|
+
/** 从主色自动生成完整调色板 */
|
|
130
|
+
declare function generatePaletteFromPrimary(primaryColor: string): ThemeColors;
|
|
131
|
+
export declare class ThemeManager {
|
|
132
|
+
private currentTheme;
|
|
133
|
+
private customColors;
|
|
134
|
+
private isDark;
|
|
135
|
+
private targetEl;
|
|
136
|
+
private persistKey;
|
|
137
|
+
private algorithm;
|
|
138
|
+
private responsiveConfig;
|
|
139
|
+
private currentBreakpoint;
|
|
140
|
+
private resizeHandler;
|
|
141
|
+
private systemDarkQuery;
|
|
142
|
+
private systemDarkHandler;
|
|
143
|
+
private followSystem;
|
|
144
|
+
private currentDensity;
|
|
145
|
+
private colorBlindMode;
|
|
146
|
+
private componentOverrides;
|
|
147
|
+
private transitionEnabled;
|
|
148
|
+
private transitionConfig;
|
|
149
|
+
private themeHistory;
|
|
150
|
+
private maxHistoryLength;
|
|
151
|
+
readonly state: {
|
|
152
|
+
theme: PresetTheme;
|
|
153
|
+
dark: boolean;
|
|
154
|
+
colors: {
|
|
155
|
+
primary?: string | undefined;
|
|
156
|
+
success?: string | undefined;
|
|
157
|
+
warning?: string | undefined;
|
|
158
|
+
danger?: string | undefined;
|
|
159
|
+
info?: string | undefined;
|
|
160
|
+
};
|
|
161
|
+
breakpoint: Breakpoint;
|
|
162
|
+
density: ThemeDensity;
|
|
163
|
+
colorBlindMode: ColorBlindMode;
|
|
164
|
+
};
|
|
165
|
+
constructor(options?: ThemeOptions);
|
|
166
|
+
/** 初始化主题 */
|
|
167
|
+
initTheme(options?: ThemeOptions): void;
|
|
168
|
+
/** 应用主题 */
|
|
169
|
+
apply(options: ThemeOptions): void;
|
|
170
|
+
/** 设置预设主题 */
|
|
171
|
+
setPreset(preset: PresetTheme): void;
|
|
172
|
+
/** 设置自定义颜色 */
|
|
173
|
+
setColors(colors: ThemeColors): void;
|
|
174
|
+
/** 设置主色 */
|
|
175
|
+
setPrimaryColor(color: string): void;
|
|
176
|
+
/** 设置主题色 (别名) */
|
|
177
|
+
setThemeColor(color: string): void;
|
|
178
|
+
/** 设置预设主题 (别名) */
|
|
179
|
+
setThemePreset(preset: PresetTheme): void;
|
|
180
|
+
/** 设置颜色算法 */
|
|
181
|
+
setAlgorithm(algorithm: ColorAlgorithm): void;
|
|
182
|
+
/** 设置暗色模式 */
|
|
183
|
+
setDarkMode(dark: boolean): void;
|
|
184
|
+
/** 切换暗色模式 */
|
|
185
|
+
toggleDarkMode(): boolean;
|
|
186
|
+
/** 启用系统主题跟随 */
|
|
187
|
+
enableSystemFollow(): void;
|
|
188
|
+
/** 禁用系统主题跟随 */
|
|
189
|
+
disableSystemFollow(): void;
|
|
190
|
+
/** 设置响应式主题 */
|
|
191
|
+
setResponsiveTheme(config: ResponsiveTheme): void;
|
|
192
|
+
/** 应用响应式主题 */
|
|
193
|
+
private applyResponsiveTheme;
|
|
194
|
+
/** 获取当前是否暗色模式 */
|
|
195
|
+
get dark(): boolean;
|
|
196
|
+
/** 获取当前主题 */
|
|
197
|
+
get theme(): PresetTheme;
|
|
198
|
+
/** 获取所有可用预设 */
|
|
199
|
+
get presets(): PresetTheme[];
|
|
200
|
+
/** 获取当前断点 */
|
|
201
|
+
get breakpoint(): Breakpoint;
|
|
202
|
+
/** 应用颜色到 CSS 变量 */
|
|
203
|
+
private applyColors;
|
|
204
|
+
/** 获取当前主题的 CSS 变量对象 */
|
|
205
|
+
getThemeStyles(colors?: ThemeColors): Record<string, string>;
|
|
206
|
+
/** 获取 CSS 变量值 */
|
|
207
|
+
getCssVar(name: string): string;
|
|
208
|
+
/** 设置 CSS 变量值 */
|
|
209
|
+
setCssVar(name: string, value: string): void;
|
|
210
|
+
/** 应用所有设计令牌 */
|
|
211
|
+
private applyTokens;
|
|
212
|
+
/** 保存到存储 */
|
|
213
|
+
private saveToStorage;
|
|
214
|
+
/** 从存储恢复 */
|
|
215
|
+
private restoreFromStorage;
|
|
216
|
+
/** 导出主题配置 */
|
|
217
|
+
exportTheme(options?: {
|
|
218
|
+
name?: string;
|
|
219
|
+
author?: string;
|
|
220
|
+
}): string;
|
|
221
|
+
/** 导入主题配置 */
|
|
222
|
+
importTheme(json: string): boolean;
|
|
223
|
+
/** 导出为纯 CSS */
|
|
224
|
+
exportAsCss(): string;
|
|
225
|
+
/** 重置为默认主题 */
|
|
226
|
+
reset(): void;
|
|
227
|
+
/** 设置密度 */
|
|
228
|
+
setDensity(density: ThemeDensity): void;
|
|
229
|
+
/** 获取当前密度 */
|
|
230
|
+
get density(): ThemeDensity;
|
|
231
|
+
/** 设置色盲友好模式 */
|
|
232
|
+
setColorBlindMode(mode: ColorBlindMode): void;
|
|
233
|
+
/** 获取当前色盲模式 */
|
|
234
|
+
get colorBlind(): ColorBlindMode;
|
|
235
|
+
/** 设置组件级主题覆盖 */
|
|
236
|
+
setComponentTheme(componentName: string, overrides: Record<string, string>): void;
|
|
237
|
+
/** 获取组件主题覆盖 */
|
|
238
|
+
getComponentTheme(componentName: string): Record<string, string>;
|
|
239
|
+
/** 清除组件级覆盖 */
|
|
240
|
+
clearComponentTheme(componentName: string): void;
|
|
241
|
+
/** 启用主题切换动画 */
|
|
242
|
+
enableTransition(config?: {
|
|
243
|
+
duration?: number;
|
|
244
|
+
timing?: string;
|
|
245
|
+
}): void;
|
|
246
|
+
/** 禁用主题切换动画 */
|
|
247
|
+
disableTransition(): void;
|
|
248
|
+
/** 创建继承主题 */
|
|
249
|
+
createTheme(config: FullThemeConfig): ThemeSnapshot;
|
|
250
|
+
/** 应用完整主题配置 */
|
|
251
|
+
applyFullConfig(config: FullThemeConfig): void;
|
|
252
|
+
/** 保存当前状态到历史 */
|
|
253
|
+
private pushHistory;
|
|
254
|
+
/** 撤销到上一个主题状态 */
|
|
255
|
+
undo(): boolean;
|
|
256
|
+
/** 获取主题历史 */
|
|
257
|
+
getHistory(): ThemeSnapshot[];
|
|
258
|
+
/** 清除主题历史 */
|
|
259
|
+
clearHistory(): void;
|
|
260
|
+
/** 从主色生成完整调色板 */
|
|
261
|
+
generateFromPrimary(primaryColor: string): ThemeColors;
|
|
262
|
+
/** 应用从主色生成的调色板 */
|
|
263
|
+
applyFromPrimary(primaryColor: string): void;
|
|
264
|
+
/** 获取互补色 */
|
|
265
|
+
getComplementary(hex: string): string;
|
|
266
|
+
/** 获取类似色 */
|
|
267
|
+
getAnalogous(hex: string): [string, string];
|
|
268
|
+
/** 获取三角色 */
|
|
269
|
+
getTriadic(hex: string): [string, string];
|
|
270
|
+
/** 设置响应式变量 (根据断点自动切换) */
|
|
271
|
+
setResponsiveVar(name: string, values: Partial<Record<Breakpoint, string>>): void;
|
|
272
|
+
/** 销毁 */
|
|
273
|
+
destroy(): void;
|
|
274
|
+
}
|
|
275
|
+
export declare function useTheme(): ThemeManager;
|
|
276
|
+
export declare function setThemeColor(color: string): void;
|
|
277
|
+
export declare function toggleDarkMode(): boolean;
|
|
278
|
+
export declare function setThemePreset(preset: PresetTheme): void;
|
|
279
|
+
export declare function initTheme(options?: ThemeOptions): ThemeManager;
|
|
280
|
+
/** Vue Composition API Hook - 获取主题变量 */
|
|
281
|
+
export declare function useThemeVars(): {
|
|
282
|
+
getCssVar: (name: string) => string;
|
|
283
|
+
setCssVar: (name: string, value: string) => void;
|
|
284
|
+
theme: import("vue").Ref<PresetTheme, PresetTheme>;
|
|
285
|
+
dark: import("vue").Ref<boolean, boolean>;
|
|
286
|
+
colors: import("vue").Ref<{
|
|
287
|
+
primary?: string | undefined;
|
|
288
|
+
success?: string | undefined;
|
|
289
|
+
warning?: string | undefined;
|
|
290
|
+
danger?: string | undefined;
|
|
291
|
+
info?: string | undefined;
|
|
292
|
+
}, {
|
|
293
|
+
primary?: string | undefined;
|
|
294
|
+
success?: string | undefined;
|
|
295
|
+
warning?: string | undefined;
|
|
296
|
+
danger?: string | undefined;
|
|
297
|
+
info?: string | undefined;
|
|
298
|
+
}>;
|
|
299
|
+
breakpoint: import("vue").Ref<Breakpoint, Breakpoint>;
|
|
300
|
+
density: import("vue").Ref<ThemeDensity, ThemeDensity>;
|
|
301
|
+
colorBlindMode: import("vue").Ref<ColorBlindMode, ColorBlindMode>;
|
|
302
|
+
};
|
|
303
|
+
/** 检查颜色对比度是否符合 WCAG 标准 */
|
|
304
|
+
export declare function checkContrast(foreground: string, background: string, level?: 'AA' | 'AAA'): boolean;
|
|
305
|
+
/** 获取合适的文字颜色 */
|
|
306
|
+
export declare function getTextColorForBackground(background: string): string;
|
|
307
|
+
export declare const THEME_INJECTION_KEY: InjectionKey<ThemeManager>;
|
|
308
|
+
export declare const ThemePlugin: {
|
|
309
|
+
install(app: App, options?: ThemeOptions): void;
|
|
310
|
+
};
|
|
311
|
+
export default ThemePlugin;
|
|
312
|
+
export { hexToRgb, rgbToHex, rgbToHsl, hslToRgb, mixColor, adjustSaturation, adjustLightness, getContrastRatio, ensureContrast, getRelativeLuminance, getComplementaryColor, getAnalogousColors, getTriadicColors, generatePaletteFromPrimary };
|
|
313
|
+
export { presetThemes, breakpoints, densityConfig, colorBlindPalettes };
|