@done-coding/admin-core 0.10.0 → 0.10.1-alpha.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.
Files changed (46) hide show
  1. package/es/bridge/config-hook.mjs +32 -26
  2. package/es/bridge/index.mjs +129 -83
  3. package/es/bridge/theme/index.mjs +103 -0
  4. package/es/bridge/theme/persist.mjs +14 -0
  5. package/es/bridge/theme/system-dark.mjs +11 -0
  6. package/es/components/app-layout/AppAside.vue.mjs +7 -0
  7. package/es/components/app-layout/AppAside.vue2.mjs +22 -0
  8. package/es/components/app-layout/AppFooter.vue.mjs +2 -2
  9. package/es/components/app-layout/AppHeader.vue.mjs +2 -2
  10. package/es/components/app-layout/AppHeader.vue2.mjs +35 -41
  11. package/es/components/app-layout/AppLayout.vue.mjs +2 -2
  12. package/es/components/app-layout/AppLayout.vue2.mjs +106 -88
  13. package/es/components/app-layout/AppShell.vue.mjs +60 -0
  14. package/es/components/app-layout/AppShell.vue2.mjs +4 -0
  15. package/es/components/app-layout/AppSidebar.vue.mjs +2 -2
  16. package/es/components/app-layout/AppSidebar.vue2.mjs +44 -47
  17. package/es/components/app-layout/AppTheme.vue.mjs +2 -2
  18. package/es/components/app-layout/AppTheme.vue2.mjs +55 -25
  19. package/es/components/app-layout/viewport.mjs +5 -0
  20. package/es/components/form/FormItemNestForm.vue.mjs +1 -1
  21. package/es/components/form/FormItemNestFormList.vue.mjs +1 -1
  22. package/es/components/form/FormSearch.vue.mjs +2 -2
  23. package/es/components/form/FormSearch.vue2.mjs +1 -1
  24. package/es/hooks/use-admin-theme-apply.mjs +16 -15
  25. package/es/hooks/use-admin-viewport-apply.mjs +29 -17
  26. package/es/index.mjs +182 -175
  27. package/es/store/app.mjs +133 -77
  28. package/es/style.css +1 -1
  29. package/package.json +2 -2
  30. package/types/bridge/config-hook.d.ts +10 -2
  31. package/types/bridge/index.d.ts +105 -5
  32. package/types/bridge/theme/index.d.ts +10 -0
  33. package/types/bridge/theme/persist.d.ts +23 -0
  34. package/types/bridge/theme/system-dark.d.ts +14 -0
  35. package/types/bridge/theme/types.d.ts +258 -0
  36. package/types/components/app-layout/AppAside.vue.d.ts +21 -0
  37. package/types/components/app-layout/AppLayout.vue.d.ts +2 -7
  38. package/types/components/app-layout/AppShell.vue.d.ts +27 -0
  39. package/types/components/app-layout/index.d.ts +4 -1
  40. package/types/components/app-layout/types.d.ts +117 -1
  41. package/types/components/app-layout/viewport.d.ts +30 -0
  42. package/types/hooks/use-admin-viewport-apply.d.ts +6 -1
  43. package/types/store/app.d.ts +24 -83
  44. package/types/types/route.d.ts +2 -0
  45. package/es/bridge/theme.mjs +0 -65
  46. package/types/bridge/theme.d.ts +0 -85
@@ -1,37 +1,43 @@
1
- import { reactive as e, readonly as r } from "vue";
2
- function s(o) {
3
- const c = e(o.APP_BASE_INFO), _ = e(o.APP_LAYOUT_HEADER_CONFIG), A = e(o.APP_LAYOUT_FOOTER_CONFIG), O = e(o.APP_LAYOUT_SIDEBAR_CONFIG), P = e(o.APP_LAYOUT_BREADCRUMB_CONFIG), t = e(o.APP_LAYOUT_BODY_CONFIG), a = e(o.APP_LAYOUT_VIEWPORT_CONFIG), I = e(o.APP_THEME_CONFIG), F = {
4
- APP_BASE_INFO: c,
5
- APP_LAYOUT_HEADER_CONFIG: _,
6
- APP_LAYOUT_FOOTER_CONFIG: A,
1
+ import { reactive as e, readonly as _ } from "vue";
2
+ function U(A) {
3
+ const F = e(A.APP_BASE_INFO), r = e(A.APP_LAYOUT_HEADER_CONFIG), o = e(A.APP_LAYOUT_FOOTER_CONFIG), O = e(A.APP_LAYOUT_SIDEBAR_CONFIG), P = e(A.APP_LAYOUT_ASIDE_CONFIG), a = e(A.APP_LAYOUT_BREADCRUMB_CONFIG), t = e(A.APP_LAYOUT_BODY_CONFIG), c = e(A.APP_LAYOUT_VIEWPORT_CONFIG), I = e(A.APP_LAYOUT_GAP_CONFIG), T = e(A.APP_THEME_CONFIG), G = {
4
+ APP_BASE_INFO: F,
5
+ APP_LAYOUT_HEADER_CONFIG: r,
6
+ APP_LAYOUT_FOOTER_CONFIG: o,
7
7
  APP_LAYOUT_SIDEBAR_CONFIG: O,
8
- APP_LAYOUT_BREADCRUMB_CONFIG: P,
8
+ APP_LAYOUT_ASIDE_CONFIG: P,
9
+ APP_LAYOUT_BREADCRUMB_CONFIG: a,
9
10
  APP_LAYOUT_BODY_CONFIG: t,
10
- APP_LAYOUT_VIEWPORT_CONFIG: a,
11
- APP_THEME_CONFIG: I
12
- }, T = e({
13
- header: _,
14
- footer: A,
11
+ APP_LAYOUT_VIEWPORT_CONFIG: c,
12
+ APP_LAYOUT_GAP_CONFIG: I,
13
+ APP_THEME_CONFIG: T
14
+ }, s = e({
15
+ header: r,
16
+ footer: o,
15
17
  sidebar: O,
16
- breadcrumb: P,
18
+ aside: P,
19
+ breadcrumb: a,
17
20
  body: t,
18
- viewport: a
21
+ viewport: c,
22
+ gap: I
19
23
  });
20
24
  return {
21
- update: (E, B) => {
22
- Object.assign(F[E], B);
25
+ update: (C, E) => {
26
+ Object.assign(G[C], E);
23
27
  },
24
- roBaseInfo: r(c),
25
- roHeader: r(_),
26
- roFooter: r(A),
27
- roSidebar: r(O),
28
- roBreadcrumb: r(P),
29
- roBody: r(t),
30
- roViewport: r(a),
31
- roTheme: r(I),
32
- roLayout: r(T)
28
+ roBaseInfo: _(F),
29
+ roHeader: _(r),
30
+ roFooter: _(o),
31
+ roSidebar: _(O),
32
+ roAside: _(P),
33
+ roBreadcrumb: _(a),
34
+ roBody: _(t),
35
+ roViewport: _(c),
36
+ roGap: _(I),
37
+ roTheme: _(T),
38
+ roLayout: _(s)
33
39
  };
34
40
  }
35
41
  export {
36
- s as createBridgeConfigHook
42
+ U as createBridgeConfigHook
37
43
  };
@@ -1,27 +1,35 @@
1
- import { computed as h } from "vue";
2
- import { createStorageWithNamespace as G } from "./storage.mjs";
3
- import { createUseState as d } from "./state.mjs";
1
+ import { computed as s } from "vue";
2
+ import { createStorageWithNamespace as L } from "./storage.mjs";
3
+ import { createUseState as Y } from "./state.mjs";
4
4
  import { createGenerateRouteMetaRawTree as l } from "./route.mjs";
5
- import { createBridgeConfigHook as L } from "./config-hook.mjs";
6
- import { createBridgePluginHost as B } from "./plugin.mjs";
7
- import { createBridgeThemeHook as k } from "./theme.mjs";
8
- import { ADMIN_BRIDGE_KEY as Y } from "../inject/key.mjs";
9
- function V(r) {
10
- const F = r.APP_CACHE_CONFIG.namespace;
11
- let _;
12
- F === "" ? (console.error(
5
+ import { createBridgeConfigHook as B } from "./config-hook.mjs";
6
+ import { createBridgePluginHost as D } from "./plugin.mjs";
7
+ import { createBridgeThemeHook as k } from "./theme/index.mjs";
8
+ import { ADMIN_BRIDGE_KEY as H } from "../inject/key.mjs";
9
+ function v(e) {
10
+ const g = e.APP_CACHE_CONFIG.namespace;
11
+ let P;
12
+ g === "" ? (console.error(
13
13
  "[adminBridge] APP_CACHE_CONFIG.namespace 为空,已兜底为 'ADMIN_CORE'"
14
- ), _ = "ADMIN_CORE") : _ = F, Object.freeze(r);
15
- const a = G(_), u = r.routes, C = r.getUserInfoInitFn, N = r.userInfoAccess, m = d(_), s = l(
16
- r.APP_ROUTER_META_DEFAULT_CONFIG
17
- ), t = L({
18
- APP_BASE_INFO: r.APP_BASE_INFO,
19
- APP_THEME_CONFIG: r.APP_THEME_CONFIG,
20
- APP_LAYOUT_HEADER_CONFIG: r.APP_LAYOUT_HEADER_CONFIG,
21
- APP_LAYOUT_FOOTER_CONFIG: r.APP_LAYOUT_FOOTER_CONFIG,
22
- APP_LAYOUT_SIDEBAR_CONFIG: r.APP_LAYOUT_SIDEBAR_CONFIG,
23
- APP_LAYOUT_BREADCRUMB_CONFIG: r.APP_LAYOUT_BREADCRUMB_CONFIG,
24
- APP_LAYOUT_BODY_CONFIG: r.APP_LAYOUT_BODY_CONFIG,
14
+ ), P = "ADMIN_CORE") : P = g, Object.freeze(e);
15
+ const C = L(P), u = e.routes, U = e.getUserInfoInitFn, d = e.userInfoAccess, G = Y(P), m = l(
16
+ e.APP_ROUTER_META_DEFAULT_CONFIG
17
+ ), f = {
18
+ // 核内默认宽 0:默认 shell 渲染 AppAside 但不可见、经典 1:1 无右间隙;app/preset 加宽启用。
19
+ width: 0,
20
+ ...e.APP_LAYOUT_ASIDE_CONFIG
21
+ }, N = {
22
+ size: 0,
23
+ ...e.APP_LAYOUT_GAP_CONFIG
24
+ }, A = B({
25
+ APP_BASE_INFO: e.APP_BASE_INFO,
26
+ APP_THEME_CONFIG: e.APP_THEME_CONFIG,
27
+ APP_LAYOUT_HEADER_CONFIG: e.APP_LAYOUT_HEADER_CONFIG,
28
+ APP_LAYOUT_FOOTER_CONFIG: e.APP_LAYOUT_FOOTER_CONFIG,
29
+ APP_LAYOUT_SIDEBAR_CONFIG: e.APP_LAYOUT_SIDEBAR_CONFIG,
30
+ APP_LAYOUT_ASIDE_CONFIG: f,
31
+ APP_LAYOUT_BREADCRUMB_CONFIG: e.APP_LAYOUT_BREADCRUMB_CONFIG,
32
+ APP_LAYOUT_BODY_CONFIG: e.APP_LAYOUT_BODY_CONFIG,
25
33
  // viewport 边框:app 可整体不传 / 传部分字段,与核内默认四边 0 浅合并补全
26
34
  // (config-hook reactive 入参 [MUST] 全字段非 undefined,故此处合并而非透传)。
27
35
  APP_LAYOUT_VIEWPORT_CONFIG: {
@@ -29,50 +37,69 @@ function V(r) {
29
37
  paddingRight: 0,
30
38
  paddingBottom: 0,
31
39
  paddingLeft: 0,
32
- ...r.APP_LAYOUT_VIEWPORT_CONFIG
33
- }
34
- }), P = k({
35
- initConfig: r.APP_THEME_CONFIG,
36
- update: t.update,
37
- storage: a
38
- }), c = h(
39
- () => P.themeIsDark.value ? t.roTheme.dark : t.roTheme.light
40
+ ...e.APP_LAYOUT_VIEWPORT_CONFIG
41
+ },
42
+ APP_LAYOUT_GAP_CONFIG: N
43
+ }), t = k({
44
+ initConfig: e.APP_THEME_CONFIG,
45
+ update: A.update,
46
+ // 布局基线快照(preset 切换基线复位 + 叠加用)。六组布局 config init 值浅快照——
47
+ // viewport 取已合并核内默认四边 0 的完整值(与 configHook 入参口径一致)。
48
+ layoutBaseline: {
49
+ header: { ...e.APP_LAYOUT_HEADER_CONFIG },
50
+ footer: { ...e.APP_LAYOUT_FOOTER_CONFIG },
51
+ sidebar: { ...e.APP_LAYOUT_SIDEBAR_CONFIG },
52
+ aside: { ...f },
53
+ breadcrumb: { ...e.APP_LAYOUT_BREADCRUMB_CONFIG },
54
+ body: { ...e.APP_LAYOUT_BODY_CONFIG },
55
+ viewport: {
56
+ paddingTop: 0,
57
+ paddingRight: 0,
58
+ paddingBottom: 0,
59
+ paddingLeft: 0,
60
+ ...e.APP_LAYOUT_VIEWPORT_CONFIG
61
+ },
62
+ gap: { ...N }
63
+ },
64
+ storage: C
65
+ }), R = s(
66
+ () => t.themeIsDark.value ? A.roTheme.dark : A.roTheme.light
40
67
  );
41
- let n, o, O, T, I, i, E, f;
42
- const A = (e) => `admin bridge: ${e} 未注册`, R = B(), g = {
43
- register(e) {
44
- e.getToken && (n = e.getToken), e.goToLogin && (o = e.goToLogin), e.refreshToken && (O = e.refreshToken), e.refreshAuth && (T = e.refreshAuth), e.loginApi && (I = e.loginApi), e.logoutApi && (i = e.logoutApi), e.getUserInfoApi && (E = e.getUserInfoApi), e.refreshTokenApi && (f = e.refreshTokenApi);
68
+ let O, n, o, I, T, i, F, a;
69
+ const _ = (r) => `admin bridge: ${r} 未注册`, h = D(), E = {
70
+ register(r) {
71
+ r.getToken && (O = r.getToken), r.goToLogin && (n = r.goToLogin), r.refreshToken && (o = r.refreshToken), r.refreshAuth && (I = r.refreshAuth), r.loginApi && (T = r.loginApi), r.logoutApi && (i = r.logoutApi), r.getUserInfoApi && (F = r.getUserInfoApi), r.refreshTokenApi && (a = r.refreshTokenApi);
45
72
  },
46
73
  // 已注册返回 undefined 是合法业务态不 throw
47
74
  // v3 终锁 Δ8b:零参 facade(BR-1 ③ 终裁——core 对 UserInfo 不透明 + 拦截器无 info 源)
48
75
  getToken() {
49
- if (!n) throw new Error(A("getToken"));
50
- return n();
76
+ if (!O) throw new Error(_("getToken"));
77
+ return O();
51
78
  },
52
79
  goToLogin() {
53
- if (!o) throw new Error(A("goToLogin"));
54
- o();
80
+ if (!n) throw new Error(_("goToLogin"));
81
+ n();
55
82
  },
56
83
  // 异步对:未注册才返回 rejected Promise(既有降级语义保留)。
57
84
  refreshToken() {
58
- return O ? O().then(() => {
59
- }) : Promise.reject(new Error(A("refreshToken")));
85
+ return o ? o().then(() => {
86
+ }) : Promise.reject(new Error(_("refreshToken")));
60
87
  },
61
88
  refreshAuth() {
62
- return T ? T().then(() => {
63
- }) : Promise.reject(new Error(A("refreshAuth")));
89
+ return I ? I().then(() => {
90
+ }) : Promise.reject(new Error(_("refreshAuth")));
64
91
  },
65
92
  getStorage() {
66
- return a;
93
+ return C;
67
94
  },
68
95
  getRoutes() {
69
96
  return u;
70
97
  },
71
98
  getUserInfoInitFn() {
72
- return C;
99
+ return U;
73
100
  },
74
- useState: m,
75
- generateRouteMetaRawTree: s,
101
+ useState: G,
102
+ generateRouteMetaRawTree: m,
76
103
  // ============ #2.5 期 12 readonly 属性值挂载(per ADR-1 sibling pattern 复用 useState / generateRouteMetaRawTree) ============
77
104
  // 插件系统一期:本期 7 字段(BASE_INFO / 5 布局子 / THEME)+ APP_LAYOUT_CONFIG
78
105
  // 改挂 configHook 的 readonly(reactive()) 响应式只读视图——经 bridge.update 跟随。
@@ -83,25 +110,25 @@ function V(r) {
83
110
  * 更新后本属性自动跟随。[SHOULD] 在 `computed` / 响应式上下文中读取,[MUST NOT]
84
111
  * 解构或一次性快照取值(`const x = bridge.APP_BASE_INFO.foo` ⚠️ 快照定格,update 后不变)。
85
112
  */
86
- APP_BASE_INFO: t.roBaseInfo,
113
+ APP_BASE_INFO: A.roBaseInfo,
87
114
  /** 应用环境信息(per #2.5 期 REQ-1) */
88
- APP_ENV_INFO: r.APP_ENV_INFO,
115
+ APP_ENV_INFO: e.APP_ENV_INFO,
89
116
  /** 应用缓存配置(per #2.5 期 REQ-1) */
90
- APP_CACHE_CONFIG: r.APP_CACHE_CONFIG,
117
+ APP_CACHE_CONFIG: e.APP_CACHE_CONFIG,
91
118
  /**
92
119
  * 应用布局-header 配置(**响应式只读视图**,插件系统一期改)。
93
120
  *
94
121
  * `readonly(reactive(...))` 包裹——`bridge.update("APP_LAYOUT_HEADER_CONFIG", partial)`
95
122
  * 后自动跟随。[SHOULD] 响应式上下文 / `computed` 读取,[MUST NOT] 解构/快照(⚠️ 定格)。
96
123
  */
97
- APP_LAYOUT_HEADER_CONFIG: t.roHeader,
124
+ APP_LAYOUT_HEADER_CONFIG: A.roHeader,
98
125
  /**
99
126
  * 应用布局-footer 配置(**响应式只读视图**,插件系统一期改)。
100
127
  *
101
128
  * `readonly(reactive(...))`——`bridge.update("APP_LAYOUT_FOOTER_CONFIG", partial)`
102
129
  * 后跟随。[SHOULD] 响应式上下文读取,[MUST NOT] 解构/快照(⚠️ 定格)。
103
130
  */
104
- APP_LAYOUT_FOOTER_CONFIG: t.roFooter,
131
+ APP_LAYOUT_FOOTER_CONFIG: A.roFooter,
105
132
  /**
106
133
  * 应用布局-sidebar 配置(**响应式只读视图**,插件系统一期改)。
107
134
  *
@@ -109,21 +136,28 @@ function V(r) {
109
136
  * 后跟随(一级浅合并,传 `{width}` 保留 `collapseWidth`)。[SHOULD] 响应式上下文
110
137
  * 读取,[MUST NOT] 解构/快照(⚠️ 定格)。
111
138
  */
112
- APP_LAYOUT_SIDEBAR_CONFIG: t.roSidebar,
139
+ APP_LAYOUT_SIDEBAR_CONFIG: A.roSidebar,
140
+ /**
141
+ * 应用布局-aside 右侧补充区配置(**响应式只读视图**,P1' additive)。
142
+ *
143
+ * `readonly(reactive(...))`——`bridge.update("APP_LAYOUT_ASIDE_CONFIG", partial)` 后跟随。
144
+ * 仅自定义 shell 渲染右侧区时消费;经典布局不读。[MUST NOT] 解构/快照(⚠️ 定格)。
145
+ */
146
+ APP_LAYOUT_ASIDE_CONFIG: A.roAside,
113
147
  /**
114
148
  * 应用布局-面包屑配置(**响应式只读视图**,插件系统一期改)。
115
149
  *
116
150
  * `readonly(reactive(...))`——`bridge.update("APP_LAYOUT_BREADCRUMB_CONFIG", partial)`
117
151
  * 后跟随。[SHOULD] 响应式上下文读取,[MUST NOT] 解构/快照(⚠️ 定格)。
118
152
  */
119
- APP_LAYOUT_BREADCRUMB_CONFIG: t.roBreadcrumb,
153
+ APP_LAYOUT_BREADCRUMB_CONFIG: A.roBreadcrumb,
120
154
  /**
121
155
  * 应用布局-页面主体配置(**响应式只读视图**,插件系统一期改)。
122
156
  *
123
157
  * `readonly(reactive(...))`——`bridge.update("APP_LAYOUT_BODY_CONFIG", partial)`
124
158
  * 后跟随。[SHOULD] 响应式上下文读取,[MUST NOT] 解构/快照(⚠️ 定格)。
125
159
  */
126
- APP_LAYOUT_BODY_CONFIG: t.roBody,
160
+ APP_LAYOUT_BODY_CONFIG: A.roBody,
127
161
  /**
128
162
  * 应用布局-视口边框配置(**响应式只读视图**)。
129
163
  *
@@ -131,7 +165,15 @@ function V(r) {
131
165
  * 后跟随(一级浅合并,传 `{paddingTop}` 保留其余三边)。store/app 经此派生 viewport
132
166
  * padding 给 Header/Sidebar fixed 锚点 + AppBody calc。[MUST NOT] 解构/快照(⚠️ 定格)。
133
167
  */
134
- APP_LAYOUT_VIEWPORT_CONFIG: t.roViewport,
168
+ APP_LAYOUT_VIEWPORT_CONFIG: A.roViewport,
169
+ /**
170
+ * 应用布局-模块间距配置(**响应式只读视图**,内缝 gap)。
171
+ *
172
+ * `readonly(reactive(...))`——`bridge.update("APP_LAYOUT_GAP_CONFIG", { size })`
173
+ * 后跟随。store/app 经此派生 gapTop/Left/Right/Bottom 叠加进几何 calc。
174
+ * [MUST NOT] 解构/快照(⚠️ 定格)。
175
+ */
176
+ APP_LAYOUT_GAP_CONFIG: A.roGap,
135
177
  /**
136
178
  * 应用布局聚合配置(**响应式只读视图**,插件系统一期改)。
137
179
  *
@@ -139,13 +181,13 @@ function V(r) {
139
181
  * `readonly(reactive({header, footer, sidebar, breadcrumb, body}))`——不再是
140
182
  * `Object.freeze` 静态聚合。[SHOULD] 响应式上下文读取,[MUST NOT] 解构/快照(⚠️ 定格)。
141
183
  */
142
- APP_LAYOUT_CONFIG: t.roLayout,
184
+ APP_LAYOUT_CONFIG: A.roLayout,
143
185
  /** 应用路由元信息默认配置(per #2.5 期 REQ-1) */
144
- APP_ROUTER_META_DEFAULT_CONFIG: r.APP_ROUTER_META_DEFAULT_CONFIG,
186
+ APP_ROUTER_META_DEFAULT_CONFIG: e.APP_ROUTER_META_DEFAULT_CONFIG,
145
187
  /** 应用路由配置(per #2.5 期 REQ-1) */
146
- APP_ROUTER_CONFIG: r.APP_ROUTER_CONFIG,
188
+ APP_ROUTER_CONFIG: e.APP_ROUTER_CONFIG,
147
189
  /** 应用路由路径配置(per #7.3 期 readonly 挂载) */
148
- APP_ROUTER_PATHS_CONFIG: r.APP_ROUTER_PATHS_CONFIG,
190
+ APP_ROUTER_PATHS_CONFIG: e.APP_ROUTER_PATHS_CONFIG,
149
191
  /**
150
192
  * 应用主题配置(**响应式只读视图**,插件系统一期改)。
151
193
  *
@@ -153,47 +195,51 @@ function V(r) {
153
195
  * 一级浅合并整体替换 `light`、保留 `dark`,后自动跟随。[SHOULD] 响应式上下文读取,
154
196
  * [MUST NOT] 解构/快照(⚠️ 定格)。
155
197
  */
156
- APP_THEME_CONFIG: t.roTheme,
198
+ APP_THEME_CONFIG: A.roTheme,
157
199
  /** 主题模块(架构反转:风格切换真相源在 bridge;插件经 theme.add 注册风格) */
158
- theme: P.theme,
200
+ theme: t.theme,
159
201
  /** 当前风格名(响应式只读真相源) */
160
- themeStyle: P.themeStyle,
161
- /** 是否暗色(响应式只读真相源;appStore / 挂值 composable 读此) */
162
- themeIsDark: P.themeIsDark,
202
+ themeStyle: t.themeStyle,
203
+ /** 明暗模式三态真相源(亮/暗/跟随系统) */
204
+ themeMode: t.themeMode,
205
+ /** 是否暗色(响应式只读派生;appStore / 挂值 composable 读此) */
206
+ themeIsDark: t.themeIsDark,
207
+ /** 当前 preset 的 layout 运行时维度(AppLayout 直读 shell + 分流意图) */
208
+ themeLayout: t.themeLayout,
163
209
  /** 当前生效 JS 主题色(输出 B;MenuTree/布局直读、appStore.theme 转发) */
164
- themeColors: c,
210
+ themeColors: R,
165
211
  /** 用户信息字段访问器集(第一宪法:业务注入 get/set 读写 token/refreshToken/permission) */
166
- userInfoAccess: N,
212
+ userInfoAccess: d,
167
213
  // 插件系统一期:update(REQ-1)+ install(REQ-9)挂载。
168
214
  // install 箭头函数闭包引用 bridgeInstance([MUST NOT] 用 this——strict
169
215
  // noImplicitThis);provide 整 bridge 自身;零单例([MUST NOT] globalThis/模块级缓存)。
170
- update: t.update,
171
- use: (e, U) => R.use({
172
- bridge: g,
173
- update: t.update,
174
- plugin: e,
175
- options: U
216
+ update: A.update,
217
+ use: (r, c) => h.use({
218
+ bridge: E,
219
+ update: A.update,
220
+ plugin: r,
221
+ options: c
176
222
  }),
177
- install: (e) => (e.provide(Y, g), e),
223
+ install: (r) => (r.provide(H, E), r),
178
224
  // 异步对:未注册返回 rejected 原生 Error(#4a-2 per-method 降级)
179
- loginApi(e) {
180
- return I ? I(e) : Promise.reject(new Error(A("loginApi")));
225
+ loginApi(r) {
226
+ return T ? T(r) : Promise.reject(new Error(_("loginApi")));
181
227
  },
182
228
  logoutApi() {
183
- return i ? i() : Promise.reject(new Error(A("logoutApi")));
229
+ return i ? i() : Promise.reject(new Error(_("logoutApi")));
184
230
  },
185
231
  getUserInfoApi() {
186
- return E ? E() : Promise.reject(new Error(A("getUserInfoApi")));
232
+ return F ? F() : Promise.reject(new Error(_("getUserInfoApi")));
187
233
  },
188
- refreshTokenApi(e) {
189
- return f ? f(e) : Promise.reject(new Error(A("refreshTokenApi")));
234
+ refreshTokenApi(r) {
235
+ return a ? a(r) : Promise.reject(new Error(_("refreshTokenApi")));
190
236
  }
191
237
  };
192
- return g;
238
+ return E;
193
239
  }
194
240
  export {
195
- V as createAdminBridge,
241
+ v as createAdminBridge,
196
242
  l as createGenerateRouteMetaRawTree,
197
- G as createStorageWithNamespace,
198
- d as createUseState
243
+ L as createStorageWithNamespace,
244
+ Y as createUseState
199
245
  };
@@ -0,0 +1,103 @@
1
+ import { ref as c, computed as y, readonly as v, markRaw as w } from "vue";
2
+ import { readPersist as H, DEFAULT_STORAGE_KEY as x } from "./persist.mjs";
3
+ import { readSystemPrefersDark as K, watchSystemPrefersDark as V } from "./system-dark.mjs";
4
+ const l = "default", W = "light", J = "默认", j = (s) => ({
5
+ light: { ...s.light },
6
+ dark: { ...s.dark }
7
+ });
8
+ function X(s) {
9
+ var F;
10
+ const u = s.storageKey ?? x, A = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), o = c(l), d = c(W), L = c(K()), G = y(
11
+ () => d.value === "system" ? L.value : d.value === "dark"
12
+ );
13
+ V((e) => {
14
+ L.value = e;
15
+ });
16
+ const g = c({
17
+ shell: void 0,
18
+ extractLevel1ToHeader: !1
19
+ }), T = c([]), _ = c({}), f = c({});
20
+ let O = l;
21
+ const a = H(s.storage, u);
22
+ a && (typeof a.themeStyle == "string" && a.themeStyle && (O = a.themeStyle), a.themeMode === "light" || a.themeMode === "dark" || a.themeMode === "system" ? d.value = a.themeMode : typeof a.themeIsDark == "boolean" && (d.value = a.themeIsDark ? "dark" : "light"));
23
+ const D = () => {
24
+ s.storage.setItem(
25
+ u,
26
+ JSON.stringify({
27
+ themeStyle: o.value,
28
+ themeMode: d.value
29
+ })
30
+ );
31
+ }, m = () => {
32
+ T.value = Array.from(A.keys());
33
+ }, Y = (e) => {
34
+ s.update("APP_THEME_CONFIG", { light: e.light, dark: e.dark });
35
+ }, M = (e) => {
36
+ const t = s.layoutBaseline;
37
+ t && (s.update("APP_LAYOUT_HEADER_CONFIG", { ...t.header }), s.update("APP_LAYOUT_FOOTER_CONFIG", { ...t.footer }), s.update("APP_LAYOUT_SIDEBAR_CONFIG", { ...t.sidebar }), s.update("APP_LAYOUT_ASIDE_CONFIG", { ...t.aside }), s.update("APP_LAYOUT_BREADCRUMB_CONFIG", { ...t.breadcrumb }), s.update("APP_LAYOUT_BODY_CONFIG", { ...t.body }), s.update("APP_LAYOUT_VIEWPORT_CONFIG", { ...t.viewport }), s.update("APP_LAYOUT_GAP_CONFIG", { ...t.gap })), e && (e.header && s.update("APP_LAYOUT_HEADER_CONFIG", e.header), e.footer && s.update("APP_LAYOUT_FOOTER_CONFIG", e.footer), e.sidebar && s.update("APP_LAYOUT_SIDEBAR_CONFIG", e.sidebar), e.aside && s.update("APP_LAYOUT_ASIDE_CONFIG", e.aside), e.breadcrumb && s.update("APP_LAYOUT_BREADCRUMB_CONFIG", e.breadcrumb), e.body && s.update("APP_LAYOUT_BODY_CONFIG", e.body), e.viewport && s.update("APP_LAYOUT_VIEWPORT_CONFIG", e.viewport), e.gap && s.update("APP_LAYOUT_GAP_CONFIG", e.gap)), g.value = {
38
+ shell: e != null && e.shell ? w(e.shell) : void 0,
39
+ extractLevel1ToHeader: (e == null ? void 0 : e.extractLevel1ToHeader) ?? !1
40
+ };
41
+ }, n = (e, t) => {
42
+ if (e)
43
+ try {
44
+ e({ id: t });
45
+ } catch (r) {
46
+ console.warn("[admin-theme] lifecycle hook error", r);
47
+ }
48
+ }, p = (e) => {
49
+ var U, k;
50
+ const t = A.get(e), r = t ? e : l, b = t ?? A.get(l);
51
+ if (!b) return;
52
+ const P = o.value;
53
+ P !== r && (n((U = i.get(P)) == null ? void 0 : U.onDeactivate, P), Y(b), M(h.get(r)), o.value = r, n((k = i.get(r)) == null ? void 0 : k.onActivate, r), D());
54
+ }, I = (e) => {
55
+ d.value = e, D();
56
+ }, N = (e) => {
57
+ I(e ? "dark" : "light");
58
+ }, E = (e, t) => {
59
+ A.set(e, j(t.config)), t.layout ? h.set(e, t.layout) : h.delete(e), t.onActivate || t.onDeactivate ? i.set(e, {
60
+ onActivate: t.onActivate,
61
+ onDeactivate: t.onDeactivate
62
+ }) : i.delete(e), _.value = { ..._.value, [e]: t.label ?? e }, t.description !== void 0 && (f.value = {
63
+ ...f.value,
64
+ [e]: t.description
65
+ }), m(), e === O && o.value !== O && p(e);
66
+ }, S = (e) => {
67
+ if (e === l || !A.delete(e)) return;
68
+ h.delete(e);
69
+ const t = { ..._.value };
70
+ delete t[e], _.value = t;
71
+ const r = { ...f.value };
72
+ delete r[e], f.value = r, m(), o.value === e && p(l), i.delete(e);
73
+ }, R = (e) => _.value[e] ?? e, B = (e) => f.value[e];
74
+ E(l, {
75
+ config: s.initConfig,
76
+ label: J,
77
+ description: {
78
+ suitable: "常规中后台:左 sidebar 主导航 + 顶 header,表单 / 列表密集型管理应用。",
79
+ unsuitable: "需沉浸式边框 / 右侧上下文面板 / 一级模块横向切换的应用(宜用带布局变更的 preset)。"
80
+ }
81
+ });
82
+ const C = o.value;
83
+ return n((F = i.get(C)) == null ? void 0 : F.onActivate, C), {
84
+ theme: {
85
+ add: E,
86
+ remove: S,
87
+ setStyle: p,
88
+ setMode: I,
89
+ setDark: N,
90
+ list: v(T),
91
+ labelOf: R,
92
+ descriptionOf: B
93
+ },
94
+ themeStyle: v(o),
95
+ themeMode: v(d),
96
+ // themeIsDark 为 computed(已只读),直接返回;与 DeepReadonly<Ref<boolean>> 契约相容。
97
+ themeIsDark: G,
98
+ themeLayout: v(g)
99
+ };
100
+ }
101
+ export {
102
+ X as createBridgeThemeHook
103
+ };
@@ -0,0 +1,14 @@
1
+ const c = "admin-core-theme", o = (r, n) => {
2
+ const e = r.getItem(n);
3
+ if (!e) return null;
4
+ try {
5
+ const t = JSON.parse(e);
6
+ return t && typeof t == "object" ? t : null;
7
+ } catch {
8
+ return null;
9
+ }
10
+ };
11
+ export {
12
+ c as DEFAULT_STORAGE_KEY,
13
+ o as readPersist
14
+ };
@@ -0,0 +1,11 @@
1
+ const o = () => typeof window > "u" || typeof window.matchMedia != "function" ? !1 : window.matchMedia("(prefers-color-scheme: dark)").matches, a = (r) => {
2
+ if (typeof window > "u" || typeof window.matchMedia != "function")
3
+ return () => {
4
+ };
5
+ const e = window.matchMedia("(prefers-color-scheme: dark)"), n = (t) => r(t.matches);
6
+ return e.addEventListener("change", n), () => e.removeEventListener("change", n);
7
+ };
8
+ export {
9
+ o as readSystemPrefersDark,
10
+ a as watchSystemPrefersDark
11
+ };
@@ -0,0 +1,7 @@
1
+ import o from "./AppAside.vue2.mjs";
2
+ /* empty css */
3
+ import p from "../../_virtual/_plugin-vue_export-helper.mjs";
4
+ const e = /* @__PURE__ */ p(o, [["__scopeId", "data-v-d07cb9ed"]]);
5
+ export {
6
+ e as default
7
+ };
@@ -0,0 +1,22 @@
1
+ import { defineComponent as r, inject as a, computed as n, withDirectives as p, openBlock as i, createElementBlock as l, normalizeStyle as c, renderSlot as d, vShow as m } from "vue";
2
+ import { APP_LAYOUT_APP_STORE_KEY as _ } from "../../inject/key.mjs";
3
+ const h = /* @__PURE__ */ r({
4
+ __name: "AppAside",
5
+ props: {
6
+ show: { type: Boolean }
7
+ },
8
+ setup(e) {
9
+ const t = a(_), o = n(() => t.asideStyle);
10
+ return (s, u) => p((i(), l("div", {
11
+ class: "app-aside",
12
+ style: c(o.value)
13
+ }, [
14
+ d(s.$slots, "default", {}, void 0, !0)
15
+ ], 4)), [
16
+ [m, e.show]
17
+ ]);
18
+ }
19
+ });
20
+ export {
21
+ h as default
22
+ };
@@ -1,7 +1,7 @@
1
1
  import o from "./AppFooter.vue2.mjs";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-bba5d0e4"]]);
4
+ const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-71b2892d"]]);
5
5
  export {
6
- e as default
6
+ _ as default
7
7
  };
@@ -1,7 +1,7 @@
1
1
  import o from "./AppHeader.vue2.mjs";
2
2
  /* empty css */
3
3
  import p from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const e = /* @__PURE__ */ p(o, [["__scopeId", "data-v-b47543cd"]]);
4
+ const f = /* @__PURE__ */ p(o, [["__scopeId", "data-v-ef6c4b9f"]]);
5
5
  export {
6
- e as default
6
+ f as default
7
7
  };