@mar7th/march7th-ui 1.0.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/.idea/march7th-ui.iml +9 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/demo/march7th-components.js +204 -0
- package/demo/march7th-theme-preview.html +166 -0
- package/demo/march7th-theme.css +9 -0
- package/demo/march7th-theme.js +296 -0
- package/demo/march7th-tokens.css +327 -0
- package/demo/march7th-ui.css +431 -0
- package/package.json +13 -0
- package/src/index.html +166 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* March7th Theme Runtime
|
|
3
|
+
* Provides reusable light/dark/system mode and dynamic hue management.
|
|
4
|
+
*/
|
|
5
|
+
(function (global) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var MODE_LIGHT = "light";
|
|
9
|
+
var MODE_DARK = "dark";
|
|
10
|
+
var MODE_SYSTEM = "system";
|
|
11
|
+
|
|
12
|
+
var defaultOptions = {
|
|
13
|
+
defaultHue: 215,
|
|
14
|
+
defaultMode: MODE_SYSTEM,
|
|
15
|
+
storagePrefix: "m7-theme",
|
|
16
|
+
darkClass: "m7-dark",
|
|
17
|
+
transitionClass: "m7-theme-transitioning",
|
|
18
|
+
root: null,
|
|
19
|
+
applySystemColorScheme: true,
|
|
20
|
+
autoInit: true
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
var options = copy(defaultOptions);
|
|
24
|
+
var mediaQuery = null;
|
|
25
|
+
var mediaListener = null;
|
|
26
|
+
var initialized = false;
|
|
27
|
+
|
|
28
|
+
function copy(source) {
|
|
29
|
+
var target = {};
|
|
30
|
+
Object.keys(source).forEach(function (key) {
|
|
31
|
+
target[key] = source[key];
|
|
32
|
+
});
|
|
33
|
+
return target;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function assign(target) {
|
|
37
|
+
for (var i = 1; i < arguments.length; i += 1) {
|
|
38
|
+
var source = arguments[i] || {};
|
|
39
|
+
Object.keys(source).forEach(function (key) {
|
|
40
|
+
target[key] = source[key];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return target;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function getRoot() {
|
|
47
|
+
return options.root || global.document.documentElement;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function getStorageKey(key) {
|
|
51
|
+
return options.storagePrefix + ":" + key;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function canUseStorage() {
|
|
55
|
+
try {
|
|
56
|
+
var testKey = getStorageKey("__test__");
|
|
57
|
+
global.localStorage.setItem(testKey, "1");
|
|
58
|
+
global.localStorage.removeItem(testKey);
|
|
59
|
+
return true;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function readStorage(key) {
|
|
66
|
+
if (!canUseStorage()) return null;
|
|
67
|
+
return global.localStorage.getItem(getStorageKey(key));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function writeStorage(key, value) {
|
|
71
|
+
if (!canUseStorage()) return;
|
|
72
|
+
global.localStorage.setItem(getStorageKey(key), String(value));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function removeStorage(key) {
|
|
76
|
+
if (!canUseStorage()) return;
|
|
77
|
+
global.localStorage.removeItem(getStorageKey(key));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function supportsMatchMedia() {
|
|
81
|
+
return typeof global.matchMedia === "function";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function getSystemMode() {
|
|
85
|
+
if (!supportsMatchMedia()) return MODE_LIGHT;
|
|
86
|
+
return global.matchMedia("(prefers-color-scheme: dark)").matches ? MODE_DARK : MODE_LIGHT;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function normalizeMode(mode) {
|
|
90
|
+
if (mode === MODE_LIGHT || mode === MODE_DARK || mode === MODE_SYSTEM) {
|
|
91
|
+
return mode;
|
|
92
|
+
}
|
|
93
|
+
return options.defaultMode;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function resolveMode(mode) {
|
|
97
|
+
var normalizedMode = normalizeMode(mode);
|
|
98
|
+
return normalizedMode === MODE_SYSTEM ? getSystemMode() : normalizedMode;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function normalizeHue(hue) {
|
|
102
|
+
var nextHue = Number.parseInt(hue, 10);
|
|
103
|
+
if (Number.isNaN(nextHue)) nextHue = options.defaultHue;
|
|
104
|
+
nextHue = nextHue % 360;
|
|
105
|
+
if (nextHue < 0) nextHue += 360;
|
|
106
|
+
return nextHue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function getMode() {
|
|
110
|
+
return normalizeMode(readStorage("mode") || options.defaultMode);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getResolvedMode() {
|
|
114
|
+
return resolveMode(getMode());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getHue() {
|
|
118
|
+
var storedHue = readStorage("hue");
|
|
119
|
+
return normalizeHue(storedHue == null ? options.defaultHue : storedHue);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function dispatch(name, detail) {
|
|
123
|
+
if (typeof global.CustomEvent === "function") {
|
|
124
|
+
global.dispatchEvent(new CustomEvent(name, { detail: detail }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function withTransitionProtection(callback) {
|
|
129
|
+
var root = getRoot();
|
|
130
|
+
root.classList.add(options.transitionClass);
|
|
131
|
+
callback();
|
|
132
|
+
global.requestAnimationFrame(function () {
|
|
133
|
+
global.requestAnimationFrame(function () {
|
|
134
|
+
root.classList.remove(options.transitionClass);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function applyHue(hue, shouldDispatch) {
|
|
140
|
+
var normalizedHue = normalizeHue(hue);
|
|
141
|
+
var root = getRoot();
|
|
142
|
+
root.style.setProperty("--m7-hue", String(normalizedHue));
|
|
143
|
+
root.setAttribute("data-m7-hue", String(normalizedHue));
|
|
144
|
+
|
|
145
|
+
if (shouldDispatch) {
|
|
146
|
+
dispatch("march7th-hue-change", {
|
|
147
|
+
hue: normalizedHue,
|
|
148
|
+
mode: getMode(),
|
|
149
|
+
resolvedMode: getResolvedMode()
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function applyMode(mode, shouldDispatch) {
|
|
155
|
+
var normalizedMode = normalizeMode(mode);
|
|
156
|
+
var resolvedMode = resolveMode(normalizedMode);
|
|
157
|
+
var isDark = resolvedMode === MODE_DARK;
|
|
158
|
+
var root = getRoot();
|
|
159
|
+
|
|
160
|
+
root.classList.toggle(options.darkClass, isDark);
|
|
161
|
+
root.setAttribute("data-m7-mode", normalizedMode);
|
|
162
|
+
root.setAttribute("data-m7-resolved-mode", resolvedMode);
|
|
163
|
+
|
|
164
|
+
if (options.applySystemColorScheme) {
|
|
165
|
+
root.style.colorScheme = isDark ? "dark" : "light";
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (shouldDispatch) {
|
|
169
|
+
dispatch("march7th-theme-change", {
|
|
170
|
+
mode: normalizedMode,
|
|
171
|
+
resolvedMode: resolvedMode,
|
|
172
|
+
isDark: isDark,
|
|
173
|
+
hue: getHue()
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function setHue(hue) {
|
|
179
|
+
var normalizedHue = normalizeHue(hue);
|
|
180
|
+
writeStorage("hue", normalizedHue);
|
|
181
|
+
applyHue(normalizedHue, true);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function setMode(mode) {
|
|
185
|
+
var normalizedMode = normalizeMode(mode);
|
|
186
|
+
if (mode !== normalizedMode) {
|
|
187
|
+
throw new Error("Invalid March7th theme mode: " + mode);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
writeStorage("mode", normalizedMode);
|
|
191
|
+
withTransitionProtection(function () {
|
|
192
|
+
applyMode(normalizedMode, true);
|
|
193
|
+
});
|
|
194
|
+
setupSystemListener();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function cleanupSystemListener() {
|
|
198
|
+
if (!mediaQuery || !mediaListener) return;
|
|
199
|
+
|
|
200
|
+
if (typeof mediaQuery.removeEventListener === "function") {
|
|
201
|
+
mediaQuery.removeEventListener("change", mediaListener);
|
|
202
|
+
} else if (typeof mediaQuery.removeListener === "function") {
|
|
203
|
+
mediaQuery.removeListener(mediaListener);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
mediaQuery = null;
|
|
207
|
+
mediaListener = null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function setupSystemListener() {
|
|
211
|
+
cleanupSystemListener();
|
|
212
|
+
|
|
213
|
+
if (getMode() !== MODE_SYSTEM || !supportsMatchMedia()) return;
|
|
214
|
+
|
|
215
|
+
mediaQuery = global.matchMedia("(prefers-color-scheme: dark)");
|
|
216
|
+
mediaListener = function () {
|
|
217
|
+
withTransitionProtection(function () {
|
|
218
|
+
applyMode(MODE_SYSTEM, true);
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
if (typeof mediaQuery.addEventListener === "function") {
|
|
223
|
+
mediaQuery.addEventListener("change", mediaListener);
|
|
224
|
+
} else if (typeof mediaQuery.addListener === "function") {
|
|
225
|
+
mediaQuery.addListener(mediaListener);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function reset() {
|
|
230
|
+
removeStorage("mode");
|
|
231
|
+
removeStorage("hue");
|
|
232
|
+
withTransitionProtection(function () {
|
|
233
|
+
applyHue(options.defaultHue, true);
|
|
234
|
+
applyMode(options.defaultMode, true);
|
|
235
|
+
});
|
|
236
|
+
setupSystemListener();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function updateOptions(userOptions) {
|
|
240
|
+
options = assign(copy(defaultOptions), options, userOptions || {});
|
|
241
|
+
if (!options.root) options.root = global.document.documentElement;
|
|
242
|
+
options.defaultHue = normalizeHue(options.defaultHue);
|
|
243
|
+
options.defaultMode = normalizeMode(options.defaultMode);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function init(userOptions) {
|
|
247
|
+
updateOptions(userOptions);
|
|
248
|
+
applyHue(getHue(), false);
|
|
249
|
+
applyMode(getMode(), false);
|
|
250
|
+
setupSystemListener();
|
|
251
|
+
initialized = true;
|
|
252
|
+
|
|
253
|
+
dispatch("march7th-theme-ready", {
|
|
254
|
+
mode: getMode(),
|
|
255
|
+
resolvedMode: getResolvedMode(),
|
|
256
|
+
isDark: getResolvedMode() === MODE_DARK,
|
|
257
|
+
hue: getHue()
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function createInlineInitializer(userOptions) {
|
|
262
|
+
var config = assign(copy(defaultOptions), userOptions || {});
|
|
263
|
+
return "(function(){var p='" + config.storagePrefix + "';var d='" + config.defaultMode + "';var h='" + config.defaultHue + "';var m=localStorage.getItem(p+':mode')||d;var v=localStorage.getItem(p+':hue')||h;var r=m==='system'?(matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light'):m;document.documentElement.style.setProperty('--m7-hue',v);document.documentElement.classList.toggle('" + config.darkClass + "',r==='dark');document.documentElement.setAttribute('data-m7-mode',m);document.documentElement.setAttribute('data-m7-resolved-mode',r);})();";
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
var api = {
|
|
267
|
+
init: init,
|
|
268
|
+
setMode: setMode,
|
|
269
|
+
getMode: getMode,
|
|
270
|
+
getResolvedMode: getResolvedMode,
|
|
271
|
+
setHue: setHue,
|
|
272
|
+
getHue: getHue,
|
|
273
|
+
reset: reset,
|
|
274
|
+
createInlineInitializer: createInlineInitializer,
|
|
275
|
+
constants: {
|
|
276
|
+
MODE_LIGHT: MODE_LIGHT,
|
|
277
|
+
MODE_DARK: MODE_DARK,
|
|
278
|
+
MODE_SYSTEM: MODE_SYSTEM
|
|
279
|
+
},
|
|
280
|
+
get initialized() {
|
|
281
|
+
return initialized;
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
global.March7thTheme = api;
|
|
286
|
+
|
|
287
|
+
if (global.document && defaultOptions.autoInit) {
|
|
288
|
+
if (global.document.readyState === "loading") {
|
|
289
|
+
global.document.addEventListener("DOMContentLoaded", function () {
|
|
290
|
+
if (!initialized) init();
|
|
291
|
+
});
|
|
292
|
+
} else {
|
|
293
|
+
init();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
})(window);
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* March7th Design Tokens
|
|
3
|
+
* Pure CSS variables for colors, spacing, radius, shadows, blur, breakpoints and responsive tokens.
|
|
4
|
+
* Usage:
|
|
5
|
+
* <link rel="stylesheet" href="/theme/march7th-tokens.css">
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
:root {
|
|
9
|
+
color-scheme: light;
|
|
10
|
+
|
|
11
|
+
--m7-hue: 215; /* 基础色调值(蓝色系),用于动态计算其他颜色 */
|
|
12
|
+
--m7-radius-large: 1rem; /* 大圆角半径,用于卡片、按钮等大组件 */
|
|
13
|
+
--m7-content-delay: 150ms; /* 内容显示延迟,用于动画时序控制 */
|
|
14
|
+
|
|
15
|
+
--m7-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
16
|
+
--m7-ease-decelerate: cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
17
|
+
--m7-duration-fast: 150ms;
|
|
18
|
+
--m7-duration-normal: 200ms;
|
|
19
|
+
--m7-duration-medium: 300ms;
|
|
20
|
+
--m7-duration-slow: 400ms;
|
|
21
|
+
|
|
22
|
+
--m7-primary: #5b8def; /* 主品牌色/强调色,随 --m7-hue 动态变化 */
|
|
23
|
+
--m7-primary: oklch(0.70 0.14 var(--m7-hue)); /* 主品牌色/强调色,随 --m7-hue 动态变化 */
|
|
24
|
+
--m7-page-bg: #f1f4f8; /* 页面整体背景色 */
|
|
25
|
+
--m7-page-bg: oklch(0.95 0.01 var(--m7-hue)); /* 页面整体背景色 */
|
|
26
|
+
--m7-card-bg: #ffffff; /* 普通卡片背景色 */
|
|
27
|
+
--m7-card-bg-transparent: rgba(255, 255, 255, 0.8); /* 半透明卡片背景色,用于毛玻璃/壁纸场景 */
|
|
28
|
+
--m7-float-panel-bg: #ffffff; /* 浮动面板/弹出层背景色 */
|
|
29
|
+
|
|
30
|
+
--m7-btn-content: #3671ba; /* 常规按钮文字/图标颜色 */
|
|
31
|
+
--m7-btn-content: oklch(0.55 0.12 var(--m7-hue)); /* 常规按钮文字/图标颜色 */
|
|
32
|
+
--m7-btn-regular-bg: #eef4fb; /* 常规按钮默认背景色 */
|
|
33
|
+
--m7-btn-regular-bg: oklch(0.95 0.025 var(--m7-hue)); /* 常规按钮默认背景色 */
|
|
34
|
+
--m7-btn-regular-bg-hover: #dcebf8; /* 常规按钮悬停背景色 */
|
|
35
|
+
--m7-btn-regular-bg-hover: oklch(0.90 0.05 var(--m7-hue)); /* 常规按钮悬停背景色 */
|
|
36
|
+
--m7-btn-regular-bg-active: #c9def2; /* 常规按钮按下背景色 */
|
|
37
|
+
--m7-btn-regular-bg-active: oklch(0.85 0.08 var(--m7-hue)); /* 常规按钮按下背景色 */
|
|
38
|
+
--m7-btn-plain-bg-hover: var(--m7-btn-regular-bg); /* 朴素按钮悬停背景色 */
|
|
39
|
+
--m7-btn-plain-bg-active: oklch(0.98 0.01 var(--m7-hue)); /* 朴素按钮按下背景色 */
|
|
40
|
+
--m7-btn-card-bg-hover: oklch(0.98 0.005 var(--m7-hue)); /* 卡片内按钮悬停背景色 */
|
|
41
|
+
--m7-btn-card-bg-active: oklch(0.90 0.03 var(--m7-hue)); /* 卡片内按钮按下背景色 */
|
|
42
|
+
|
|
43
|
+
--m7-text: #1f2937; /* 默认正文文字颜色 */
|
|
44
|
+
--m7-text: oklch(0.25 0.02 var(--m7-hue)); /* 默认正文文字颜色 */
|
|
45
|
+
--m7-text-strong: rgba(0, 0, 0, 0.9); /* 强文本颜色,用于标题/重要内容 */
|
|
46
|
+
--m7-text-regular: rgba(0, 0, 0, 0.75); /* 常规文本颜色,用于正文 */
|
|
47
|
+
--m7-text-muted: rgba(0, 0, 0, 0.5); /* 弱化文本颜色,用于摘要/说明 */
|
|
48
|
+
--m7-text-subtle: rgba(0, 0, 0, 0.3); /* 极弱文本颜色,用于辅助提示 */
|
|
49
|
+
--m7-title-active: oklch(0.60 0.10 var(--m7-hue)); /* 激活标题/当前项文字颜色 */
|
|
50
|
+
--m7-content-meta: rgba(0, 0, 0, 0.7); /* 元信息文字颜色 */
|
|
51
|
+
|
|
52
|
+
--m7-line-divider: rgba(0, 0, 0, 0.08); /* 轻量分割线颜色 */
|
|
53
|
+
--m7-line-color: rgba(0, 0, 0, 0.1); /* 普通线条/边框颜色 */
|
|
54
|
+
--m7-meta-divider: rgba(0, 0, 0, 0.2); /* 元信息分隔线颜色 */
|
|
55
|
+
|
|
56
|
+
--m7-inline-code-bg: var(--m7-btn-regular-bg); /* 行内代码背景色 */
|
|
57
|
+
--m7-inline-code-color: var(--m7-btn-content); /* 行内代码文字颜色 */
|
|
58
|
+
--m7-selection-bg: oklch(0.90 0.05 var(--m7-hue)); /* 普通文本选中背景色 */
|
|
59
|
+
--m7-codeblock-selection: oklch(0.40 0.08 var(--m7-hue)); /* 代码块内文本选中背景色 */
|
|
60
|
+
--m7-codeblock-bg: #20242b; /* 代码块背景色 */
|
|
61
|
+
--m7-codeblock-bg: oklch(0.17 0.015 var(--m7-hue)); /* 代码块背景色 */
|
|
62
|
+
--m7-codeblock-topbar-bg: #3d4652; /* 代码块顶部栏背景色 */
|
|
63
|
+
--m7-codeblock-topbar-bg: oklch(0.30 0.02 var(--m7-hue)); /* 代码块顶部栏背景色 */
|
|
64
|
+
|
|
65
|
+
--m7-link-underline: oklch(0.93 0.04 var(--m7-hue)); /* 链接下划线颜色 */
|
|
66
|
+
--m7-link-hover: oklch(0.95 0.025 var(--m7-hue)); /* 链接悬停背景/装饰色 */
|
|
67
|
+
--m7-link-active: oklch(0.90 0.05 var(--m7-hue)); /* 链接按下背景/装饰色 */
|
|
68
|
+
|
|
69
|
+
--m7-license-block-bg: rgba(0, 0, 0, 0.03); /* 许可证/说明区块背景色 */
|
|
70
|
+
|
|
71
|
+
--m7-scrollbar-bg: rgba(0, 0, 0, 0.4); /* 滚动条默认颜色 */
|
|
72
|
+
--m7-scrollbar-bg-hover: rgba(0, 0, 0, 0.5); /* 滚动条悬停颜色 */
|
|
73
|
+
--m7-scrollbar-bg-active: rgba(0, 0, 0, 0.6); /* 滚动条按下颜色 */
|
|
74
|
+
|
|
75
|
+
--m7-admonitions-color-tip: oklch(0.70 0.14 180); /* Tip 提示块语义色:青色 */
|
|
76
|
+
--m7-admonitions-color-note: oklch(0.70 0.14 250); /* Note 备注块语义色:蓝色 */
|
|
77
|
+
--m7-admonitions-color-important: oklch(0.70 0.14 310); /* Important 重要块语义色:紫色 */
|
|
78
|
+
--m7-admonitions-color-warning: oklch(0.70 0.14 60); /* Warning 警告块语义色:黄色 */
|
|
79
|
+
--m7-admonitions-color-caution: oklch(0.60 0.20 25); /* Caution 谨慎块语义色:橙红色 */
|
|
80
|
+
|
|
81
|
+
--m7-accent-pink: oklch(0.78 0.13 345); /* 三月七辅助点缀色:粉色 */
|
|
82
|
+
--m7-accent-purple: oklch(0.72 0.12 285); /* 三月七辅助点缀色:紫色 */
|
|
83
|
+
--m7-accent-ice: oklch(0.86 0.08 205); /* 三月七辅助点缀色:冰蓝色 */
|
|
84
|
+
|
|
85
|
+
--m7-toc-badge-bg: oklch(0.90 0.045 var(--m7-hue)); /* 目录徽章背景色 */
|
|
86
|
+
--m7-toc-btn-hover: oklch(0.92 0.015 var(--m7-hue)); /* 目录按钮悬停背景色 */
|
|
87
|
+
--m7-toc-btn-active: oklch(0.90 0.015 var(--m7-hue)); /* 目录按钮按下背景色 */
|
|
88
|
+
--m7-toc-item-active: oklch(0.70 0.13 var(--m7-hue)); /* 目录当前项/激活项颜色 */
|
|
89
|
+
|
|
90
|
+
--m7-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); /* 小阴影颜色 */
|
|
91
|
+
--m7-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); /* 中等阴影颜色 */
|
|
92
|
+
--m7-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); /* 大阴影颜色 */
|
|
93
|
+
--m7-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1); /* 超大阴影颜色 */
|
|
94
|
+
|
|
95
|
+
--m7-color-selection-bar: linear-gradient( /* 主题色选择条渐变色带 */
|
|
96
|
+
to right,
|
|
97
|
+
oklch(0.80 0.10 0), /* 色相选择条:红色起点 */
|
|
98
|
+
oklch(0.80 0.10 30), /* 色相选择条:橙色 */
|
|
99
|
+
oklch(0.80 0.10 60), /* 色相选择条:黄色 */
|
|
100
|
+
oklch(0.80 0.10 90), /* 色相选择条:黄绿色 */
|
|
101
|
+
oklch(0.80 0.10 120), /* 色相选择条:绿色 */
|
|
102
|
+
oklch(0.80 0.10 150), /* 色相选择条:青绿色 */
|
|
103
|
+
oklch(0.80 0.10 180), /* 色相选择条:青色 */
|
|
104
|
+
oklch(0.80 0.10 210), /* 色相选择条:蓝青色 */
|
|
105
|
+
oklch(0.80 0.10 240), /* 色相选择条:蓝色 */
|
|
106
|
+
oklch(0.80 0.10 270), /* 色相选择条:蓝紫色 */
|
|
107
|
+
oklch(0.80 0.10 300), /* 色相选择条:紫色 */
|
|
108
|
+
oklch(0.80 0.10 330), /* 色相选择条:紫红色 */
|
|
109
|
+
oklch(0.80 0.10 360) /* 色相选择条:回到红色 */
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
:root.m7-dark {
|
|
114
|
+
color-scheme: dark;
|
|
115
|
+
|
|
116
|
+
--m7-primary: #7aa7ff; /* 主品牌色/强调色,随 --m7-hue 动态变化 */
|
|
117
|
+
--m7-primary: oklch(0.75 0.14 var(--m7-hue)); /* 主品牌色/强调色,随 --m7-hue 动态变化 */
|
|
118
|
+
--m7-page-bg: #151922; /* 页面整体背景色 */
|
|
119
|
+
--m7-page-bg: oklch(0.16 0.014 var(--m7-hue)); /* 页面整体背景色 */
|
|
120
|
+
--m7-card-bg: #242a33; /* 普通卡片背景色 */
|
|
121
|
+
--m7-card-bg: oklch(0.23 0.015 var(--m7-hue)); /* 普通卡片背景色 */
|
|
122
|
+
--m7-card-bg-transparent: rgba(23, 23, 23, 0.8); /* 半透明卡片背景色,用于毛玻璃/壁纸场景 */
|
|
123
|
+
--m7-float-panel-bg: oklch(0.19 0.015 var(--m7-hue)); /* 浮动面板/弹出层背景色 */
|
|
124
|
+
|
|
125
|
+
--m7-btn-content: oklch(0.75 0.10 var(--m7-hue)); /* 常规按钮文字/图标颜色 */
|
|
126
|
+
--m7-btn-regular-bg: oklch(0.33 0.035 var(--m7-hue)); /* 常规按钮默认背景色 */
|
|
127
|
+
--m7-btn-regular-bg-hover: oklch(0.38 0.04 var(--m7-hue)); /* 常规按钮悬停背景色 */
|
|
128
|
+
--m7-btn-regular-bg-active: oklch(0.43 0.045 var(--m7-hue)); /* 常规按钮按下背景色 */
|
|
129
|
+
--m7-btn-plain-bg-hover: var(--m7-btn-regular-bg); /* 朴素按钮悬停背景色 */
|
|
130
|
+
--m7-btn-plain-bg-active: oklch(0.28 0.025 var(--m7-hue)); /* 朴素按钮按下背景色 */
|
|
131
|
+
--m7-btn-card-bg-hover: oklch(0.27 0.018 var(--m7-hue)); /* 卡片内按钮悬停背景色 */
|
|
132
|
+
--m7-btn-card-bg-active: oklch(0.31 0.022 var(--m7-hue)); /* 卡片内按钮按下背景色 */
|
|
133
|
+
|
|
134
|
+
--m7-text: #e5e7eb; /* 默认正文文字颜色 */
|
|
135
|
+
--m7-text: oklch(0.92 0.01 var(--m7-hue)); /* 默认正文文字颜色 */
|
|
136
|
+
--m7-text-strong: rgba(255, 255, 255, 0.9); /* 强文本颜色,用于标题/重要内容 */
|
|
137
|
+
--m7-text-regular: rgba(255, 255, 255, 0.75); /* 常规文本颜色,用于正文 */
|
|
138
|
+
--m7-text-muted: rgba(255, 255, 255, 0.5); /* 弱化文本颜色,用于摘要/说明 */
|
|
139
|
+
--m7-text-subtle: rgba(255, 255, 255, 0.3); /* 极弱文本颜色,用于辅助提示 */
|
|
140
|
+
--m7-title-active: oklch(0.75 0.10 var(--m7-hue)); /* 激活标题/当前项文字颜色 */
|
|
141
|
+
--m7-content-meta: rgba(255, 255, 255, 0.6); /* 元信息文字颜色 */
|
|
142
|
+
|
|
143
|
+
--m7-line-divider: rgba(255, 255, 255, 0.08); /* 轻量分割线颜色 */
|
|
144
|
+
--m7-line-color: rgba(255, 255, 255, 0.1); /* 普通线条/边框颜色 */
|
|
145
|
+
--m7-meta-divider: rgba(255, 255, 255, 0.2); /* 元信息分隔线颜色 */
|
|
146
|
+
|
|
147
|
+
--m7-selection-bg: oklch(0.40 0.08 var(--m7-hue)); /* 普通文本选中背景色 */
|
|
148
|
+
--m7-codeblock-bg: oklch(0.17 0.015 var(--m7-hue)); /* 代码块背景色 */
|
|
149
|
+
--m7-codeblock-topbar-bg: oklch(0.12 0.015 var(--m7-hue)); /* 代码块顶部栏背景色 */
|
|
150
|
+
|
|
151
|
+
--m7-link-underline: oklch(0.40 0.08 var(--m7-hue)); /* 链接下划线颜色 */
|
|
152
|
+
--m7-link-hover: oklch(0.40 0.08 var(--m7-hue)); /* 链接悬停背景/装饰色 */
|
|
153
|
+
--m7-link-active: oklch(0.35 0.07 var(--m7-hue)); /* 链接按下背景/装饰色 */
|
|
154
|
+
|
|
155
|
+
--m7-license-block-bg: var(--m7-codeblock-bg); /* 许可证/说明区块背景色 */
|
|
156
|
+
|
|
157
|
+
--m7-scrollbar-bg: rgba(255, 255, 255, 0.4); /* 滚动条默认颜色 */
|
|
158
|
+
--m7-scrollbar-bg-hover: rgba(255, 255, 255, 0.5); /* 滚动条悬停颜色 */
|
|
159
|
+
--m7-scrollbar-bg-active: rgba(255, 255, 255, 0.6); /* 滚动条按下颜色 */
|
|
160
|
+
|
|
161
|
+
--m7-admonitions-color-tip: oklch(0.75 0.14 180); /* Tip 提示块语义色:青色 */
|
|
162
|
+
--m7-admonitions-color-note: oklch(0.75 0.14 250); /* Note 备注块语义色:蓝色 */
|
|
163
|
+
--m7-admonitions-color-important: oklch(0.75 0.14 310); /* Important 重要块语义色:紫色 */
|
|
164
|
+
--m7-admonitions-color-warning: oklch(0.75 0.14 60); /* Warning 警告块语义色:黄色 */
|
|
165
|
+
--m7-admonitions-color-caution: oklch(0.65 0.20 25); /* Caution 谨慎块语义色:橙红色 */
|
|
166
|
+
|
|
167
|
+
--m7-toc-badge-bg: var(--m7-btn-regular-bg); /* 目录徽章背景色 */
|
|
168
|
+
--m7-toc-btn-hover: oklch(0.22 0.02 var(--m7-hue)); /* 目录按钮悬停背景色 */
|
|
169
|
+
--m7-toc-btn-active: oklch(0.25 0.02 var(--m7-hue)); /* 目录按钮按下背景色 */
|
|
170
|
+
--m7-toc-item-active: oklch(0.70 0.12 var(--m7-hue)); /* 目录当前项/激活项颜色 */
|
|
171
|
+
|
|
172
|
+
--m7-color-selection-bar: linear-gradient( /* 主题色选择条渐变色带 */
|
|
173
|
+
to right,
|
|
174
|
+
oklch(0.70 0.10 0), /* 暗色选择条:红色起点 */
|
|
175
|
+
oklch(0.70 0.10 30), /* 暗色选择条:橙色 */
|
|
176
|
+
oklch(0.70 0.10 60), /* 暗色选择条:黄色 */
|
|
177
|
+
oklch(0.70 0.10 90), /* 暗色选择条:黄绿色 */
|
|
178
|
+
oklch(0.70 0.10 120), /* 暗色选择条:绿色 */
|
|
179
|
+
oklch(0.70 0.10 150), /* 暗色选择条:青绿色 */
|
|
180
|
+
oklch(0.70 0.10 180), /* 暗色选择条:青色 */
|
|
181
|
+
oklch(0.70 0.10 210), /* 暗色选择条:蓝青色 */
|
|
182
|
+
oklch(0.70 0.10 240), /* 暗色选择条:蓝色 */
|
|
183
|
+
oklch(0.70 0.10 270), /* 暗色选择条:蓝紫色 */
|
|
184
|
+
oklch(0.70 0.10 300), /* 暗色选择条:紫色 */
|
|
185
|
+
oklch(0.70 0.10 330), /* 暗色选择条:紫红色 */
|
|
186
|
+
oklch(0.70 0.10 360) /* 暗色选择条:回到红色 */
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* ===== March7th UI Design System Extension ===== */
|
|
191
|
+
:root {
|
|
192
|
+
--m7-breakpoint-xs: 320px; /* 超小屏幕断点 */
|
|
193
|
+
--m7-breakpoint-sm: 480px; /* 小屏幕断点 */
|
|
194
|
+
--m7-breakpoint-md: 768px; /* 平板断点 */
|
|
195
|
+
--m7-breakpoint-lg: 1024px; /* 桌面断点 */
|
|
196
|
+
--m7-breakpoint-xl: 1280px; /* 大桌面断点 */
|
|
197
|
+
--m7-breakpoint-2xl: 1536px; /* 超大桌面断点 */
|
|
198
|
+
|
|
199
|
+
--m7-container-xs: 100%; /* 超小屏容器宽度 */
|
|
200
|
+
--m7-container-sm: 100%; /* 小屏容器宽度 */
|
|
201
|
+
--m7-container-md: 100%; /* 平板容器宽度 */
|
|
202
|
+
--m7-container-lg: 1024px; /* 桌面容器最大宽度 */
|
|
203
|
+
--m7-container-xl: 1280px; /* 大桌面容器最大宽度 */
|
|
204
|
+
--m7-container-2xl: 1536px; /* 超大桌面容器最大宽度 */
|
|
205
|
+
--m7-container-width: var(--m7-container-sm); /* 当前响应式容器宽度 */
|
|
206
|
+
|
|
207
|
+
--m7-spacing-xs: 0.25rem; /* 4px 微小间距 */
|
|
208
|
+
--m7-spacing-sm: 0.5rem; /* 8px 小间距 */
|
|
209
|
+
--m7-spacing-md: 0.75rem; /* 12px 中等间距 */
|
|
210
|
+
--m7-spacing-lg: 1rem; /* 16px 大间距 */
|
|
211
|
+
--m7-spacing-xl: 1.25rem; /* 20px 超大间距 */
|
|
212
|
+
--m7-spacing-2xl: 1.5rem; /* 24px 2倍间距 */
|
|
213
|
+
--m7-spacing-3xl: 2rem; /* 32px 3倍间距 */
|
|
214
|
+
--m7-spacing-4xl: 2.5rem; /* 40px 4倍间距 */
|
|
215
|
+
--m7-spacing-5xl: 3rem; /* 48px 5倍间距 */
|
|
216
|
+
|
|
217
|
+
--m7-widget-gap-mobile: var(--m7-spacing-md); /* 移动端组件间距 */
|
|
218
|
+
--m7-widget-gap-tablet: var(--m7-spacing-lg); /* 平板端组件间距 */
|
|
219
|
+
--m7-widget-gap-desktop: var(--m7-spacing-xl); /* 桌面端组件间距 */
|
|
220
|
+
--m7-widget-gap: var(--m7-widget-gap-mobile); /* 当前响应式组件间距 */
|
|
221
|
+
|
|
222
|
+
--m7-sidebar-width-mobile: 100%; /* 移动端侧栏宽度 */
|
|
223
|
+
--m7-sidebar-width-tablet: 280px; /* 平板端侧栏宽度 */
|
|
224
|
+
--m7-sidebar-width-desktop: 320px; /* 桌面端侧栏宽度 */
|
|
225
|
+
--m7-sidebar-width: var(--m7-sidebar-width-mobile); /* 当前响应式侧栏宽度 */
|
|
226
|
+
|
|
227
|
+
--m7-radius-sm: 0.25rem; /* 小圆角 */
|
|
228
|
+
--m7-radius-md: 0.375rem; /* 中等圆角 */
|
|
229
|
+
--m7-radius-lg: 0.5rem; /* 大圆角 */
|
|
230
|
+
--m7-radius-xl: 0.75rem; /* 超大圆角 */
|
|
231
|
+
--m7-radius-2xl: 1rem; /* 2倍圆角 */
|
|
232
|
+
--m7-radius-3xl: 1.5rem; /* 3倍圆角 */
|
|
233
|
+
--m7-radius-full: 9999px; /* 胶囊/圆形圆角 */
|
|
234
|
+
|
|
235
|
+
--m7-ease-accelerate: cubic-bezier(0.55, 0.055, 0.675, 0.19); /* 加速缓动 */
|
|
236
|
+
--m7-ease-sharp: cubic-bezier(0.4, 0, 0.6, 1); /* 锐利缓动 */
|
|
237
|
+
--m7-duration-slower: 500ms; /* 更慢动画 */
|
|
238
|
+
--m7-delay-none: 0ms; /* 无延迟 */
|
|
239
|
+
--m7-delay-short: 50ms; /* 短延迟 */
|
|
240
|
+
--m7-delay-medium: 100ms; /* 中等延迟 */
|
|
241
|
+
--m7-delay-long: 150ms; /* 长延迟 */
|
|
242
|
+
--m7-delay-longer: 200ms; /* 更长延迟 */
|
|
243
|
+
|
|
244
|
+
--m7-opacity-0: 0; /* 完全透明 */
|
|
245
|
+
--m7-opacity-5: 0.05; /* 5% 透明度 */
|
|
246
|
+
--m7-opacity-10: 0.1; /* 10% 透明度 */
|
|
247
|
+
--m7-opacity-20: 0.2; /* 20% 透明度 */
|
|
248
|
+
--m7-opacity-25: 0.25; /* 25% 透明度 */
|
|
249
|
+
--m7-opacity-30: 0.3; /* 30% 透明度 */
|
|
250
|
+
--m7-opacity-40: 0.4; /* 40% 透明度 */
|
|
251
|
+
--m7-opacity-50: 0.5; /* 50% 透明度 */
|
|
252
|
+
--m7-opacity-55: 0.55; /* 55% 透明度 */
|
|
253
|
+
--m7-opacity-60: 0.6; /* 60% 透明度 */
|
|
254
|
+
--m7-opacity-70: 0.7; /* 70% 透明度 */
|
|
255
|
+
--m7-opacity-75: 0.75; /* 75% 透明度 */
|
|
256
|
+
--m7-opacity-80: 0.8; /* 80% 透明度 */
|
|
257
|
+
--m7-opacity-90: 0.9; /* 90% 透明度 */
|
|
258
|
+
--m7-opacity-95: 0.95; /* 95% 透明度 */
|
|
259
|
+
--m7-opacity-100: 1; /* 完全不透明 */
|
|
260
|
+
|
|
261
|
+
--m7-blur-sm: 4px; /* 轻微毛玻璃 */
|
|
262
|
+
--m7-blur-md: 8px; /* 中等毛玻璃 */
|
|
263
|
+
--m7-blur-lg: 12px; /* 大模糊 */
|
|
264
|
+
--m7-blur-xl: 16px; /* 超大模糊 */
|
|
265
|
+
--m7-blur-2xl: 20px; /* 导航/浮层毛玻璃 */
|
|
266
|
+
--m7-blur-3xl: 24px; /* 高强度模糊 */
|
|
267
|
+
|
|
268
|
+
--m7-translate-xs: 0.125rem; /* 2px 微小移动 */
|
|
269
|
+
--m7-translate-sm: 0.25rem; /* 4px 小移动 */
|
|
270
|
+
--m7-translate-md: 0.5rem; /* 8px 中等移动 */
|
|
271
|
+
--m7-translate-lg: 0.75rem; /* 12px 大移动 */
|
|
272
|
+
--m7-translate-xl: 1rem; /* 16px 超大移动 */
|
|
273
|
+
--m7-scale-95: 0.95; /* 点击缩小反馈 */
|
|
274
|
+
--m7-scale-98: 0.98; /* 轻微缩小反馈 */
|
|
275
|
+
--m7-scale-100: 1; /* 原始尺寸 */
|
|
276
|
+
--m7-scale-105: 1.05; /* 悬停放大反馈 */
|
|
277
|
+
--m7-scale-110: 1.1; /* 强调放大反馈 */
|
|
278
|
+
|
|
279
|
+
--m7-z-dropdown: 1000; /* 下拉菜单层级 */
|
|
280
|
+
--m7-z-sticky: 1020; /* 粘性元素层级 */
|
|
281
|
+
--m7-z-fixed: 1030; /* 固定元素层级 */
|
|
282
|
+
--m7-z-modal-backdrop: 1040; /* 模态遮罩层级 */
|
|
283
|
+
--m7-z-modal: 1050; /* 模态内容层级 */
|
|
284
|
+
--m7-z-popover: 1060; /* 弹出层层级 */
|
|
285
|
+
--m7-z-tooltip: 1070; /* 提示层级 */
|
|
286
|
+
--m7-z-toast: 1080; /* 消息提示层级 */
|
|
287
|
+
--m7-gpu-transform: translateZ(0); /* GPU 加速变换 */
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
:root.m7-dark {
|
|
291
|
+
--m7-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2); /* 暗色小阴影 */
|
|
292
|
+
--m7-shadow-md: 0 4px 8px rgba(0, 0, 0, 0.24); /* 暗色中阴影 */
|
|
293
|
+
--m7-shadow-lg: 0 12px 20px rgba(0, 0, 0, 0.28); /* 暗色大阴影 */
|
|
294
|
+
--m7-shadow-xl: 0 24px 40px rgba(0, 0, 0, 0.34); /* 暗色超大阴影 */
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
@media (max-width: 767px) {
|
|
298
|
+
:root {
|
|
299
|
+
--m7-container-width: var(--m7-container-sm); /* 移动端容器宽度 */
|
|
300
|
+
--m7-widget-gap: var(--m7-widget-gap-mobile); /* 移动端组件间距 */
|
|
301
|
+
--m7-sidebar-width: var(--m7-sidebar-width-mobile); /* 移动端侧栏宽度 */
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
@media (min-width: 768px) and (max-width: 1023px) {
|
|
306
|
+
:root {
|
|
307
|
+
--m7-container-width: var(--m7-container-md); /* 平板端容器宽度 */
|
|
308
|
+
--m7-widget-gap: var(--m7-widget-gap-tablet); /* 平板端组件间距 */
|
|
309
|
+
--m7-sidebar-width: var(--m7-sidebar-width-tablet); /* 平板端侧栏宽度 */
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
@media (min-width: 1024px) {
|
|
314
|
+
:root {
|
|
315
|
+
--m7-container-width: var(--m7-container-lg); /* 桌面端容器宽度 */
|
|
316
|
+
--m7-widget-gap: var(--m7-widget-gap-desktop); /* 桌面端组件间距 */
|
|
317
|
+
--m7-sidebar-width: var(--m7-sidebar-width-desktop); /* 桌面端侧栏宽度 */
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
@media (min-width: 1280px) {
|
|
322
|
+
:root { --m7-container-width: var(--m7-container-xl); /* 大桌面容器宽度 */ }
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
@media (min-width: 1536px) {
|
|
326
|
+
:root { --m7-container-width: var(--m7-container-2xl); /* 超大桌面容器宽度 */ }
|
|
327
|
+
}
|