@done-coding/admin-core 0.11.0 → 0.12.1
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/es/bridge/index.mjs +51 -45
- package/es/bridge/theme/index.mjs +88 -74
- package/es/components/app-layout/AppLayout.vue.mjs +2 -2
- package/es/components/app-layout/AppLayout.vue2.mjs +49 -45
- package/es/components/app-layout/AppTheme.vue.mjs +3 -3
- package/es/components/app-layout/AppTheme.vue2.mjs +15 -15
- package/es/components/display/ActionBtn.vue.mjs +22 -19
- package/es/components/display/TabsMain.vue.mjs +5 -5
- package/es/components/form/FormMain.vue.mjs +1 -1
- package/es/components/form/FormMain.vue2.mjs +1 -0
- package/es/components/list-page/ListPage.vue.mjs +2 -2
- package/es/components/list-page/ListPage.vue2.mjs +2 -2
- package/es/components/menu/MenuItemSub.vue.mjs +10 -9
- package/es/components/menu/MenuTree.vue.mjs +1 -0
- package/es/components/modal/ConfirmModal.vue.mjs +3 -3
- package/es/components/modal/ConfirmModal.vue2.mjs +15 -15
- package/es/components/modal/DetailModal.vue.mjs +18 -17
- package/es/components/panel/PanelMain.vue.mjs +2 -2
- package/es/components/panel/PanelMain.vue2.mjs +21 -18
- package/es/components/table/TableMain.vue.mjs +2 -2
- package/es/components/table/TableMain.vue2.mjs +48 -48
- package/es/hooks/use-admin-theme-apply.mjs +210 -40
- package/es/index.mjs +88 -85
- package/es/style.css +1 -1
- package/es/utils/theme-scale.mjs +30 -23
- package/package.json +6 -4
- package/types/bridge/index.d.ts +26 -2
- package/types/bridge/theme/index.d.ts +1 -1
- package/types/bridge/theme/types.d.ts +78 -0
- package/types/components/app-layout/AppLayout.vue.d.ts +1 -1
- package/types/components/app-layout/types.d.ts +1 -1
- package/types/hooks/use-admin-theme-apply.d.ts +18 -1
- package/types/utils/theme-scale.d.ts +10 -0
package/es/bridge/index.mjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { computed as s } from "vue";
|
|
2
2
|
import { createStorageWithNamespace as L } from "./storage.mjs";
|
|
3
|
-
import { createUseState as
|
|
4
|
-
import { createGenerateRouteMetaRawTree as
|
|
3
|
+
import { createUseState as l } from "./state.mjs";
|
|
4
|
+
import { createGenerateRouteMetaRawTree as Y } from "./route.mjs";
|
|
5
5
|
import { createBridgeConfigHook as B } from "./config-hook.mjs";
|
|
6
6
|
import { createBridgePluginHost as D } from "./plugin.mjs";
|
|
7
|
-
import { createBridgeThemeHook as
|
|
8
|
-
import { ADMIN_BRIDGE_KEY as
|
|
7
|
+
import { createBridgeThemeHook as S } from "./theme/index.mjs";
|
|
8
|
+
import { ADMIN_BRIDGE_KEY as k } from "../inject/key.mjs";
|
|
9
9
|
function v(e) {
|
|
10
10
|
const g = e.APP_CACHE_CONFIG.namespace;
|
|
11
11
|
let P;
|
|
12
12
|
g === "" ? (console.error(
|
|
13
13
|
"[adminBridge] APP_CACHE_CONFIG.namespace 为空,已兜底为 'ADMIN_CORE'"
|
|
14
14
|
), P = "ADMIN_CORE") : P = g, Object.freeze(e);
|
|
15
|
-
const
|
|
15
|
+
const f = L(P), N = e.routes, h = e.getUserInfoInitFn, m = e.userInfoAccess, d = l(P), U = Y(
|
|
16
16
|
e.APP_ROUTER_META_DEFAULT_CONFIG
|
|
17
|
-
),
|
|
17
|
+
), C = {
|
|
18
18
|
// 核内默认宽 0:默认 shell 渲染 AppAside 但不可见、经典 1:1 无右间隙;app/preset 加宽启用。
|
|
19
19
|
width: 0,
|
|
20
20
|
...e.APP_LAYOUT_ASIDE_CONFIG
|
|
21
|
-
},
|
|
21
|
+
}, u = {
|
|
22
22
|
size: 0,
|
|
23
23
|
...e.APP_LAYOUT_GAP_CONFIG
|
|
24
24
|
}, A = B({
|
|
@@ -27,7 +27,7 @@ function v(e) {
|
|
|
27
27
|
APP_LAYOUT_HEADER_CONFIG: e.APP_LAYOUT_HEADER_CONFIG,
|
|
28
28
|
APP_LAYOUT_FOOTER_CONFIG: e.APP_LAYOUT_FOOTER_CONFIG,
|
|
29
29
|
APP_LAYOUT_SIDEBAR_CONFIG: e.APP_LAYOUT_SIDEBAR_CONFIG,
|
|
30
|
-
APP_LAYOUT_ASIDE_CONFIG:
|
|
30
|
+
APP_LAYOUT_ASIDE_CONFIG: C,
|
|
31
31
|
APP_LAYOUT_BREADCRUMB_CONFIG: e.APP_LAYOUT_BREADCRUMB_CONFIG,
|
|
32
32
|
APP_LAYOUT_BODY_CONFIG: e.APP_LAYOUT_BODY_CONFIG,
|
|
33
33
|
// viewport 边框:app 可整体不传 / 传部分字段,与核内默认四边 0 浅合并补全
|
|
@@ -39,8 +39,8 @@ function v(e) {
|
|
|
39
39
|
paddingLeft: 0,
|
|
40
40
|
...e.APP_LAYOUT_VIEWPORT_CONFIG
|
|
41
41
|
},
|
|
42
|
-
APP_LAYOUT_GAP_CONFIG:
|
|
43
|
-
}),
|
|
42
|
+
APP_LAYOUT_GAP_CONFIG: u
|
|
43
|
+
}), _ = S({
|
|
44
44
|
initConfig: e.APP_THEME_CONFIG,
|
|
45
45
|
update: A.update,
|
|
46
46
|
// 布局基线快照(preset 切换基线复位 + 叠加用)。六组布局 config init 值浅快照——
|
|
@@ -49,7 +49,7 @@ function v(e) {
|
|
|
49
49
|
header: { ...e.APP_LAYOUT_HEADER_CONFIG },
|
|
50
50
|
footer: { ...e.APP_LAYOUT_FOOTER_CONFIG },
|
|
51
51
|
sidebar: { ...e.APP_LAYOUT_SIDEBAR_CONFIG },
|
|
52
|
-
aside: { ...
|
|
52
|
+
aside: { ...C },
|
|
53
53
|
breadcrumb: { ...e.APP_LAYOUT_BREADCRUMB_CONFIG },
|
|
54
54
|
body: { ...e.APP_LAYOUT_BODY_CONFIG },
|
|
55
55
|
viewport: {
|
|
@@ -59,47 +59,48 @@ function v(e) {
|
|
|
59
59
|
paddingLeft: 0,
|
|
60
60
|
...e.APP_LAYOUT_VIEWPORT_CONFIG
|
|
61
61
|
},
|
|
62
|
-
gap: { ...
|
|
62
|
+
gap: { ...u }
|
|
63
63
|
},
|
|
64
|
-
storage:
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
storage: f,
|
|
65
|
+
defaultMode: e.defaultThemeMode
|
|
66
|
+
}), G = s(
|
|
67
|
+
() => _.themeIsDark.value ? A.roTheme.dark : A.roTheme.light
|
|
67
68
|
);
|
|
68
|
-
let O, n,
|
|
69
|
-
const
|
|
69
|
+
let O, o, n, T, I, i, a, F;
|
|
70
|
+
const t = (r) => `admin bridge: ${r} 未注册`, R = D(), E = {
|
|
70
71
|
register(r) {
|
|
71
|
-
r.getToken && (O = r.getToken), r.goToLogin && (
|
|
72
|
+
r.getToken && (O = r.getToken), r.goToLogin && (o = r.goToLogin), r.refreshToken && (n = r.refreshToken), r.refreshAuth && (T = r.refreshAuth), r.loginApi && (I = r.loginApi), r.logoutApi && (i = r.logoutApi), r.getUserInfoApi && (a = r.getUserInfoApi), r.refreshTokenApi && (F = r.refreshTokenApi);
|
|
72
73
|
},
|
|
73
74
|
// 已注册返回 undefined 是合法业务态不 throw
|
|
74
75
|
// v3 终锁 Δ8b:零参 facade(BR-1 ③ 终裁——core 对 UserInfo 不透明 + 拦截器无 info 源)
|
|
75
76
|
getToken() {
|
|
76
|
-
if (!O) throw new Error(
|
|
77
|
+
if (!O) throw new Error(t("getToken"));
|
|
77
78
|
return O();
|
|
78
79
|
},
|
|
79
80
|
goToLogin() {
|
|
80
|
-
if (!
|
|
81
|
-
|
|
81
|
+
if (!o) throw new Error(t("goToLogin"));
|
|
82
|
+
o();
|
|
82
83
|
},
|
|
83
84
|
// 异步对:未注册才返回 rejected Promise(既有降级语义保留)。
|
|
84
85
|
refreshToken() {
|
|
85
|
-
return
|
|
86
|
-
}) : Promise.reject(new Error(
|
|
86
|
+
return n ? n().then(() => {
|
|
87
|
+
}) : Promise.reject(new Error(t("refreshToken")));
|
|
87
88
|
},
|
|
88
89
|
refreshAuth() {
|
|
89
|
-
return
|
|
90
|
-
}) : Promise.reject(new Error(
|
|
90
|
+
return T ? T().then(() => {
|
|
91
|
+
}) : Promise.reject(new Error(t("refreshAuth")));
|
|
91
92
|
},
|
|
92
93
|
getStorage() {
|
|
93
|
-
return
|
|
94
|
+
return f;
|
|
94
95
|
},
|
|
95
96
|
getRoutes() {
|
|
96
|
-
return
|
|
97
|
+
return N;
|
|
97
98
|
},
|
|
98
99
|
getUserInfoInitFn() {
|
|
99
|
-
return
|
|
100
|
+
return h;
|
|
100
101
|
},
|
|
101
|
-
useState:
|
|
102
|
-
generateRouteMetaRawTree:
|
|
102
|
+
useState: d,
|
|
103
|
+
generateRouteMetaRawTree: U,
|
|
103
104
|
// ============ #2.5 期 12 readonly 属性值挂载(per ADR-1 sibling pattern 复用 useState / generateRouteMetaRawTree) ============
|
|
104
105
|
// 插件系统一期:本期 7 字段(BASE_INFO / 5 布局子 / THEME)+ APP_LAYOUT_CONFIG
|
|
105
106
|
// 改挂 configHook 的 readonly(reactive()) 响应式只读视图——经 bridge.update 跟随。
|
|
@@ -197,49 +198,54 @@ function v(e) {
|
|
|
197
198
|
*/
|
|
198
199
|
APP_THEME_CONFIG: A.roTheme,
|
|
199
200
|
/** 主题模块(架构反转:风格切换真相源在 bridge;插件经 theme.add 注册风格) */
|
|
200
|
-
theme:
|
|
201
|
+
theme: _.theme,
|
|
201
202
|
/** 当前风格名(响应式只读真相源) */
|
|
202
|
-
themeStyle:
|
|
203
|
+
themeStyle: _.themeStyle,
|
|
203
204
|
/** 明暗模式三态真相源(亮/暗/跟随系统) */
|
|
204
|
-
themeMode:
|
|
205
|
+
themeMode: _.themeMode,
|
|
205
206
|
/** 是否暗色(响应式只读派生;appStore / 挂值 composable 读此) */
|
|
206
|
-
themeIsDark:
|
|
207
|
+
themeIsDark: _.themeIsDark,
|
|
207
208
|
/** 当前 preset 的 layout 运行时维度(AppLayout 直读 shell + 分流意图) */
|
|
208
|
-
themeLayout:
|
|
209
|
+
themeLayout: _.themeLayout,
|
|
210
|
+
/** 当前密度档 / 动效档(节奏真相源;useAdminThemeApply 消费,明暗无关) */
|
|
211
|
+
themeDensity: _.themeDensity,
|
|
212
|
+
themeMotion: _.themeMotion,
|
|
209
213
|
/** 当前生效 JS 主题色(输出 B;MenuTree/布局直读、appStore.theme 转发) */
|
|
210
|
-
themeColors:
|
|
214
|
+
themeColors: G,
|
|
215
|
+
/** 是否显示内置风格切换下拉(AppTheme ElSelect);init 静态值,缺省 true(亮暗恒显) */
|
|
216
|
+
showThemeStyleSwitcher: e.showThemeStyleSwitcher ?? !0,
|
|
211
217
|
/** 用户信息字段访问器集(第一宪法:业务注入 get/set 读写 token/refreshToken/permission) */
|
|
212
|
-
userInfoAccess:
|
|
218
|
+
userInfoAccess: m,
|
|
213
219
|
// 插件系统一期:update(REQ-1)+ install(REQ-9)挂载。
|
|
214
220
|
// install 箭头函数闭包引用 bridgeInstance([MUST NOT] 用 this——strict
|
|
215
221
|
// noImplicitThis);provide 整 bridge 自身;零单例([MUST NOT] globalThis/模块级缓存)。
|
|
216
222
|
update: A.update,
|
|
217
|
-
use: (r, c) =>
|
|
223
|
+
use: (r, c) => R.use({
|
|
218
224
|
bridge: E,
|
|
219
225
|
update: A.update,
|
|
220
226
|
plugin: r,
|
|
221
227
|
options: c
|
|
222
228
|
}),
|
|
223
|
-
install: (r) => (r.provide(
|
|
229
|
+
install: (r) => (r.provide(k, E), r),
|
|
224
230
|
// 异步对:未注册返回 rejected 原生 Error(#4a-2 per-method 降级)
|
|
225
231
|
loginApi(r) {
|
|
226
|
-
return
|
|
232
|
+
return I ? I(r) : Promise.reject(new Error(t("loginApi")));
|
|
227
233
|
},
|
|
228
234
|
logoutApi() {
|
|
229
|
-
return i ? i() : Promise.reject(new Error(
|
|
235
|
+
return i ? i() : Promise.reject(new Error(t("logoutApi")));
|
|
230
236
|
},
|
|
231
237
|
getUserInfoApi() {
|
|
232
|
-
return
|
|
238
|
+
return a ? a() : Promise.reject(new Error(t("getUserInfoApi")));
|
|
233
239
|
},
|
|
234
240
|
refreshTokenApi(r) {
|
|
235
|
-
return
|
|
241
|
+
return F ? F(r) : Promise.reject(new Error(t("refreshTokenApi")));
|
|
236
242
|
}
|
|
237
243
|
};
|
|
238
244
|
return E;
|
|
239
245
|
}
|
|
240
246
|
export {
|
|
241
247
|
v as createAdminBridge,
|
|
242
|
-
|
|
248
|
+
Y as createGenerateRouteMetaRawTree,
|
|
243
249
|
L as createStorageWithNamespace,
|
|
244
|
-
|
|
250
|
+
l as createUseState
|
|
245
251
|
};
|
|
@@ -1,103 +1,117 @@
|
|
|
1
|
-
import { ref as
|
|
2
|
-
import { readPersist as
|
|
3
|
-
import { readSystemPrefersDark as
|
|
4
|
-
const l = "default",
|
|
5
|
-
light: { ...
|
|
6
|
-
dark: { ...
|
|
1
|
+
import { ref as r, computed as J, readonly as A, markRaw as j } from "vue";
|
|
2
|
+
import { readPersist as q, DEFAULT_STORAGE_KEY as Q } from "./persist.mjs";
|
|
3
|
+
import { readSystemPrefersDark as X, watchSystemPrefersDark as Z } from "./system-dark.mjs";
|
|
4
|
+
const l = "default", $ = "light", ee = "默认", S = "cozy", y = "standard", te = (o) => ({
|
|
5
|
+
light: { ...o.light },
|
|
6
|
+
dark: { ...o.dark }
|
|
7
7
|
});
|
|
8
|
-
function
|
|
9
|
-
var
|
|
10
|
-
const
|
|
11
|
-
() =>
|
|
8
|
+
function re(o) {
|
|
9
|
+
var k;
|
|
10
|
+
const g = o.storageKey ?? Q, _ = /* @__PURE__ */ new Map(), O = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map(), d = r(l), c = r(o.defaultMode ?? $), m = r(X()), R = J(
|
|
11
|
+
() => c.value === "system" ? m.value : c.value === "dark"
|
|
12
12
|
);
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
Z((e) => {
|
|
14
|
+
m.value = e;
|
|
15
15
|
});
|
|
16
|
-
const
|
|
16
|
+
const I = r({
|
|
17
17
|
shell: void 0,
|
|
18
18
|
extractLevel1ToHeader: !1
|
|
19
|
-
}),
|
|
20
|
-
let
|
|
21
|
-
const a =
|
|
22
|
-
a && (typeof a.themeStyle == "string" && a.themeStyle && (
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
}), u = r(S), P = r(y), E = r([]), f = r({}), v = r({});
|
|
20
|
+
let p = l;
|
|
21
|
+
const a = q(o.storage, g);
|
|
22
|
+
a && (typeof a.themeStyle == "string" && a.themeStyle && (p = a.themeStyle), a.themeMode === "light" || a.themeMode === "dark" || a.themeMode === "system" ? c.value = a.themeMode : typeof a.themeIsDark == "boolean" && (c.value = a.themeIsDark ? "dark" : "light"));
|
|
23
|
+
const F = () => {
|
|
24
|
+
o.storage.setItem(
|
|
25
|
+
g,
|
|
26
26
|
JSON.stringify({
|
|
27
|
-
themeStyle:
|
|
28
|
-
themeMode:
|
|
27
|
+
themeStyle: d.value,
|
|
28
|
+
themeMode: c.value
|
|
29
29
|
})
|
|
30
30
|
);
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
const t =
|
|
37
|
-
t && (
|
|
38
|
-
shell: e != null && e.shell ?
|
|
31
|
+
}, M = () => {
|
|
32
|
+
E.value = Array.from(_.keys());
|
|
33
|
+
}, B = (e) => {
|
|
34
|
+
o.update("APP_THEME_CONFIG", { light: e.light, dark: e.dark });
|
|
35
|
+
}, w = (e) => {
|
|
36
|
+
const t = o.layoutBaseline;
|
|
37
|
+
t && (o.update("APP_LAYOUT_HEADER_CONFIG", { ...t.header }), o.update("APP_LAYOUT_FOOTER_CONFIG", { ...t.footer }), o.update("APP_LAYOUT_SIDEBAR_CONFIG", { ...t.sidebar }), o.update("APP_LAYOUT_ASIDE_CONFIG", { ...t.aside }), o.update("APP_LAYOUT_BREADCRUMB_CONFIG", { ...t.breadcrumb }), o.update("APP_LAYOUT_BODY_CONFIG", { ...t.body }), o.update("APP_LAYOUT_VIEWPORT_CONFIG", { ...t.viewport }), o.update("APP_LAYOUT_GAP_CONFIG", { ...t.gap })), e && (e.header && o.update("APP_LAYOUT_HEADER_CONFIG", e.header), e.footer && o.update("APP_LAYOUT_FOOTER_CONFIG", e.footer), e.sidebar && o.update("APP_LAYOUT_SIDEBAR_CONFIG", e.sidebar), e.aside && o.update("APP_LAYOUT_ASIDE_CONFIG", e.aside), e.breadcrumb && o.update("APP_LAYOUT_BREADCRUMB_CONFIG", e.breadcrumb), e.body && o.update("APP_LAYOUT_BODY_CONFIG", e.body), e.viewport && o.update("APP_LAYOUT_VIEWPORT_CONFIG", e.viewport), e.gap && o.update("APP_LAYOUT_GAP_CONFIG", e.gap)), I.value = {
|
|
38
|
+
shell: e != null && e.shell ? j(e.shell) : void 0,
|
|
39
39
|
extractLevel1ToHeader: (e == null ? void 0 : e.extractLevel1ToHeader) ?? !1
|
|
40
40
|
};
|
|
41
|
-
},
|
|
41
|
+
}, L = (e, t) => {
|
|
42
42
|
if (e)
|
|
43
43
|
try {
|
|
44
44
|
e({ id: t });
|
|
45
|
-
} catch (
|
|
46
|
-
console.warn("[admin-theme] lifecycle hook error",
|
|
45
|
+
} catch (s) {
|
|
46
|
+
console.warn("[admin-theme] lifecycle hook error", s);
|
|
47
47
|
}
|
|
48
|
-
},
|
|
49
|
-
var
|
|
50
|
-
const t =
|
|
51
|
-
if (!
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
}, T = (e) => {
|
|
49
|
+
var G, N;
|
|
50
|
+
const t = _.get(e), s = t ? e : l, Y = t ?? _.get(l);
|
|
51
|
+
if (!Y) return;
|
|
52
|
+
const D = d.value;
|
|
53
|
+
if (D === s) return;
|
|
54
|
+
L((G = i.get(D)) == null ? void 0 : G.onDeactivate, D), B(Y), w(O.get(s));
|
|
55
|
+
const n = h.get(s);
|
|
56
|
+
u.value = (n == null ? void 0 : n.density) ?? S, P.value = (n == null ? void 0 : n.motion) ?? y, d.value = s, L((N = i.get(s)) == null ? void 0 : N.onActivate, s), F();
|
|
57
|
+
}, U = (e) => {
|
|
58
|
+
c.value = e, F();
|
|
59
|
+
}, H = (e) => {
|
|
60
|
+
U(e ? "dark" : "light");
|
|
61
|
+
}, x = (e) => {
|
|
62
|
+
u.value = e;
|
|
63
|
+
}, K = (e) => {
|
|
64
|
+
P.value = e;
|
|
65
|
+
}, C = (e, t) => {
|
|
66
|
+
_.set(e, te(t.config)), t.layout ? O.set(e, t.layout) : O.delete(e), t.onActivate || t.onDeactivate ? i.set(e, {
|
|
60
67
|
onActivate: t.onActivate,
|
|
61
68
|
onDeactivate: t.onDeactivate
|
|
62
|
-
}) : i.delete(e),
|
|
63
|
-
|
|
69
|
+
}) : i.delete(e), t.density || t.motion ? h.set(e, {
|
|
70
|
+
density: t.density,
|
|
71
|
+
motion: t.motion
|
|
72
|
+
}) : h.delete(e), f.value = { ...f.value, [e]: t.label ?? e }, t.description !== void 0 && (v.value = {
|
|
73
|
+
...v.value,
|
|
64
74
|
[e]: t.description
|
|
65
|
-
}),
|
|
66
|
-
},
|
|
67
|
-
if (e === l || !
|
|
68
|
-
h.delete(e);
|
|
69
|
-
const t = { ...
|
|
70
|
-
delete t[e],
|
|
71
|
-
const
|
|
72
|
-
delete
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
config:
|
|
76
|
-
label:
|
|
75
|
+
}), M(), e === p && d.value !== p && T(e);
|
|
76
|
+
}, V = (e) => {
|
|
77
|
+
if (e === l || !_.delete(e)) return;
|
|
78
|
+
O.delete(e), h.delete(e);
|
|
79
|
+
const t = { ...f.value };
|
|
80
|
+
delete t[e], f.value = t;
|
|
81
|
+
const s = { ...v.value };
|
|
82
|
+
delete s[e], v.value = s, M(), d.value === e && T(l), i.delete(e);
|
|
83
|
+
}, W = (e) => f.value[e] ?? e, z = (e) => v.value[e];
|
|
84
|
+
C(l, {
|
|
85
|
+
config: o.initConfig,
|
|
86
|
+
label: ee,
|
|
77
87
|
description: {
|
|
78
88
|
suitable: "常规中后台:左 sidebar 主导航 + 顶 header,表单 / 列表密集型管理应用。",
|
|
79
89
|
unsuitable: "需沉浸式边框 / 右侧上下文面板 / 一级模块横向切换的应用(宜用带布局变更的 preset)。"
|
|
80
90
|
}
|
|
81
91
|
});
|
|
82
|
-
const
|
|
83
|
-
return
|
|
92
|
+
const b = d.value;
|
|
93
|
+
return L((k = i.get(b)) == null ? void 0 : k.onActivate, b), {
|
|
84
94
|
theme: {
|
|
85
|
-
add:
|
|
86
|
-
remove:
|
|
87
|
-
setStyle:
|
|
88
|
-
setMode:
|
|
89
|
-
setDark:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
add: C,
|
|
96
|
+
remove: V,
|
|
97
|
+
setStyle: T,
|
|
98
|
+
setMode: U,
|
|
99
|
+
setDark: H,
|
|
100
|
+
setDensity: x,
|
|
101
|
+
setMotion: K,
|
|
102
|
+
list: A(E),
|
|
103
|
+
labelOf: W,
|
|
104
|
+
descriptionOf: z
|
|
93
105
|
},
|
|
94
|
-
themeStyle:
|
|
95
|
-
themeMode:
|
|
106
|
+
themeStyle: A(d),
|
|
107
|
+
themeMode: A(c),
|
|
96
108
|
// themeIsDark 为 computed(已只读),直接返回;与 DeepReadonly<Ref<boolean>> 契约相容。
|
|
97
|
-
themeIsDark:
|
|
98
|
-
themeLayout:
|
|
109
|
+
themeIsDark: R,
|
|
110
|
+
themeLayout: A(I),
|
|
111
|
+
themeDensity: A(u),
|
|
112
|
+
themeMotion: A(P)
|
|
99
113
|
};
|
|
100
114
|
}
|
|
101
115
|
export {
|
|
102
|
-
|
|
116
|
+
re as createBridgeThemeHook
|
|
103
117
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./AppLayout.vue2.mjs";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
-
const
|
|
4
|
+
const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-452f511b"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
f as default
|
|
7
7
|
};
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { defineComponent as F,
|
|
2
|
-
import { ElWatermark as
|
|
1
|
+
import { defineComponent as F, computed as o, provide as m, markRaw as H, watch as v, openBlock as s, createElementBlock as g, normalizeClass as O, createVNode as p, unref as a, withCtx as n, createBlock as f, resolveDynamicComponent as S, createSlots as I, normalizeStyle as D, createCommentVNode as Y, renderList as x, renderSlot as G } from "vue";
|
|
2
|
+
import { ElWatermark as $ } from "element-plus";
|
|
3
3
|
import { useRoute as N, useRouter as U } from "vue-router";
|
|
4
4
|
import z from "./AppBody.vue.mjs";
|
|
5
5
|
import K from "./AppShell.vue.mjs";
|
|
6
6
|
import V from "../modal/ModalShelf.vue.mjs";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
7
|
+
import { themeScaleToRgba as W } from "../../utils/theme-scale.mjs";
|
|
8
|
+
import { APP_LAYOUT_BRIDGE_KEY as j, APP_LAYOUT_APP_STORE_KEY as q, APP_LAYOUT_USER_STORE_KEY as J } from "../../inject/key.mjs";
|
|
9
|
+
import { useAdminThemeApply as Q } from "../../hooks/use-admin-theme-apply.mjs";
|
|
10
|
+
import { useAdminViewportApply as X } from "../../hooks/use-admin-viewport-apply.mjs";
|
|
11
|
+
import { flatRouteMetaResolveRaw as Z } from "../../utils/router.mjs";
|
|
12
|
+
import { useMenusDataDispatch as ee } from "../../hooks/menus-dispatch.mjs";
|
|
13
|
+
const ce = /* @__PURE__ */ F({
|
|
13
14
|
__name: "AppLayout",
|
|
14
15
|
props: {
|
|
15
16
|
adminBridge: {},
|
|
@@ -19,46 +20,49 @@ const me = /* @__PURE__ */ F({
|
|
|
19
20
|
sidebarAboveHeader: { type: Boolean, default: !1 }
|
|
20
21
|
},
|
|
21
22
|
setup(u) {
|
|
22
|
-
const e = u, _ = {
|
|
23
|
-
color:
|
|
23
|
+
const e = u, _ = o(() => ({
|
|
24
|
+
color: W(e.adminBridge.themeColors.value.baseColor, 0.12),
|
|
24
25
|
fontSize: 12
|
|
25
|
-
};
|
|
26
|
-
m(
|
|
26
|
+
}));
|
|
27
|
+
m(j, e.adminBridge), m(q, e.appStore), m(J, e.userStore), Q({
|
|
27
28
|
getThemeConfig: () => e.adminBridge.APP_THEME_CONFIG,
|
|
28
|
-
getThemeIsDark: () => e.adminBridge.themeIsDark.value
|
|
29
|
-
|
|
29
|
+
getThemeIsDark: () => e.adminBridge.themeIsDark.value,
|
|
30
|
+
// 节奏挂值(density/motion):喂新响应式源给同一挂值钩子,注入独立 admin-core-rhythm <style>
|
|
31
|
+
getThemeDensity: () => e.adminBridge.themeDensity.value,
|
|
32
|
+
getThemeMotion: () => e.adminBridge.themeMotion.value
|
|
33
|
+
}), X({
|
|
30
34
|
getViewportConfig: () => e.adminBridge.APP_LAYOUT_VIEWPORT_CONFIG,
|
|
31
35
|
getGapConfig: () => e.adminBridge.APP_LAYOUT_GAP_CONFIG
|
|
32
36
|
});
|
|
33
|
-
const d =
|
|
37
|
+
const d = o(() => e.adminBridge.generateRouteMetaRawTree(
|
|
34
38
|
e.adminBridge.getRoutes(),
|
|
35
39
|
{
|
|
36
40
|
parentPath: "",
|
|
37
|
-
filterFn: (t, i,
|
|
41
|
+
filterFn: (t, i, r) => t.checkPermission ? t.menuShow && e.userStore.havePermissionByKey(t.permissionKey) : t.menuShow && (!r || i),
|
|
38
42
|
sortFn: (t, i) => t.menuSort - i.menuSort
|
|
39
43
|
}
|
|
40
|
-
)), l =
|
|
44
|
+
)), l = o(() => Z(d.value)), {
|
|
41
45
|
sidebarMenus: c,
|
|
42
46
|
headerMenus: A,
|
|
43
47
|
activeMenu: M,
|
|
44
|
-
activeModuleMenu:
|
|
45
|
-
needRedirectToFirstChildMenu:
|
|
46
|
-
} =
|
|
48
|
+
activeModuleMenu: y,
|
|
49
|
+
needRedirectToFirstChildMenu: w
|
|
50
|
+
} = ee({
|
|
47
51
|
getMenus: () => d.value,
|
|
48
52
|
getMenuFlatList: () => l.value,
|
|
49
53
|
// 分流意图**纯归布局**(preset.layout.extractLevel1ToHeader,经 themeLayout 暴露):
|
|
50
54
|
// true 时 1 级路由模块提取到 header(headerMenus 才有内容)、sidebar 显模块下子菜单;
|
|
51
55
|
// 缺省 false → 经典布局(全菜单在 sidebar、headerMenus 空)。appStore 不再持此意图。
|
|
52
56
|
getExtractLevel1ToHeader: () => e.adminBridge.themeLayout.value.extractLevel1ToHeader
|
|
53
|
-
}), b = H(K),
|
|
57
|
+
}), b = H(K), B = o(
|
|
54
58
|
() => e.adminBridge.themeLayout.value.shell ?? b
|
|
55
|
-
),
|
|
59
|
+
), L = [
|
|
56
60
|
"brand",
|
|
57
61
|
"userEntry",
|
|
58
62
|
"settings",
|
|
59
63
|
"themeSwitcher",
|
|
60
64
|
"aside"
|
|
61
|
-
],
|
|
65
|
+
], C = o(() => e.userStore.isLogin), h = o(() => e.appStore.showHeader), P = o(() => e.appStore.showSidebar), T = o(() => ({
|
|
62
66
|
position: "fixed",
|
|
63
67
|
top: "0",
|
|
64
68
|
left: "0",
|
|
@@ -67,7 +71,7 @@ const me = /* @__PURE__ */ F({
|
|
|
67
71
|
background: e.adminBridge.themeColors.value.bodyColor,
|
|
68
72
|
zIndex: 1,
|
|
69
73
|
pointerEvents: "none"
|
|
70
|
-
})),
|
|
74
|
+
})), R = o(() => e.appStore.showAside);
|
|
71
75
|
v(
|
|
72
76
|
() => c.value.length,
|
|
73
77
|
(t) => {
|
|
@@ -77,59 +81,59 @@ const me = /* @__PURE__ */ F({
|
|
|
77
81
|
immediate: !0
|
|
78
82
|
}
|
|
79
83
|
);
|
|
80
|
-
const
|
|
84
|
+
const E = N(), k = U();
|
|
81
85
|
return v(
|
|
82
|
-
|
|
86
|
+
w,
|
|
83
87
|
(t) => {
|
|
84
|
-
t && (console.log(`${
|
|
88
|
+
t && (console.log(`${E.path}需要重定向到${t.path}`), k.replace(t.path));
|
|
85
89
|
},
|
|
86
90
|
{
|
|
87
91
|
immediate: !0
|
|
88
92
|
}
|
|
89
|
-
), (t, i) => (s(),
|
|
93
|
+
), (t, i) => (s(), g("div", {
|
|
90
94
|
class: O(["app-layout", {
|
|
91
|
-
"app-layout_noLogin": !
|
|
95
|
+
"app-layout_noLogin": !C.value
|
|
92
96
|
}])
|
|
93
97
|
}, [
|
|
94
|
-
p(a(
|
|
98
|
+
p(a($), {
|
|
95
99
|
content: u.watermarkContent,
|
|
96
|
-
font: _,
|
|
100
|
+
font: _.value,
|
|
97
101
|
zIndex: 1e4
|
|
98
102
|
}, {
|
|
99
103
|
default: n(() => [
|
|
100
104
|
p(a(V), { level: "app" }, {
|
|
101
105
|
default: n(() => [
|
|
102
|
-
(s(),
|
|
106
|
+
(s(), f(S(B.value), {
|
|
103
107
|
menus: d.value,
|
|
104
108
|
menuFlatList: l.value,
|
|
105
109
|
sidebarMenus: a(c),
|
|
106
110
|
headerMenus: a(A),
|
|
107
111
|
activeMenu: a(M),
|
|
108
|
-
activeModuleMenu: a(
|
|
112
|
+
activeModuleMenu: a(y),
|
|
109
113
|
showHeader: h.value,
|
|
110
|
-
showSidebar:
|
|
111
|
-
showAside:
|
|
114
|
+
showSidebar: P.value,
|
|
115
|
+
showAside: R.value,
|
|
112
116
|
sidebarAboveHeader: u.sidebarAboveHeader
|
|
113
117
|
}, I({
|
|
114
|
-
default: n(({ Footer:
|
|
118
|
+
default: n(({ Footer: r }) => [
|
|
115
119
|
p(z, { menuFlatList: l.value }, {
|
|
116
120
|
footer: n(() => [
|
|
117
|
-
(s(),
|
|
121
|
+
(s(), f(S(r)))
|
|
118
122
|
]),
|
|
119
123
|
_: 2
|
|
120
124
|
}, 1032, ["menuFlatList"]),
|
|
121
|
-
h.value ? (s(),
|
|
125
|
+
h.value ? (s(), g("div", {
|
|
122
126
|
key: 0,
|
|
123
127
|
class: "app-header-gap-cover",
|
|
124
|
-
style:
|
|
125
|
-
}, null, 4)) :
|
|
128
|
+
style: D(T.value)
|
|
129
|
+
}, null, 4)) : Y("", !0)
|
|
126
130
|
]),
|
|
127
131
|
_: 2
|
|
128
132
|
}, [
|
|
129
|
-
|
|
130
|
-
name:
|
|
133
|
+
x(L, (r) => ({
|
|
134
|
+
name: r,
|
|
131
135
|
fn: n(() => [
|
|
132
|
-
|
|
136
|
+
G(t.$slots, r, {}, void 0, !0)
|
|
133
137
|
])
|
|
134
138
|
}))
|
|
135
139
|
]), 1032, ["menus", "menuFlatList", "sidebarMenus", "headerMenus", "activeMenu", "activeModuleMenu", "showHeader", "showSidebar", "showAside", "sidebarAboveHeader"]))
|
|
@@ -138,10 +142,10 @@ const me = /* @__PURE__ */ F({
|
|
|
138
142
|
})
|
|
139
143
|
]),
|
|
140
144
|
_: 3
|
|
141
|
-
}, 8, ["content"])
|
|
145
|
+
}, 8, ["content", "font"])
|
|
142
146
|
], 2));
|
|
143
147
|
}
|
|
144
148
|
});
|
|
145
149
|
export {
|
|
146
|
-
|
|
150
|
+
ce as default
|
|
147
151
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./AppTheme.vue2.mjs";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import
|
|
4
|
-
const
|
|
3
|
+
import e from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
+
const m = /* @__PURE__ */ e(o, [["__scopeId", "data-v-e4f0fe3b"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
m as default
|
|
7
7
|
};
|