@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.
Files changed (33) hide show
  1. package/es/bridge/index.mjs +51 -45
  2. package/es/bridge/theme/index.mjs +88 -74
  3. package/es/components/app-layout/AppLayout.vue.mjs +2 -2
  4. package/es/components/app-layout/AppLayout.vue2.mjs +49 -45
  5. package/es/components/app-layout/AppTheme.vue.mjs +3 -3
  6. package/es/components/app-layout/AppTheme.vue2.mjs +15 -15
  7. package/es/components/display/ActionBtn.vue.mjs +22 -19
  8. package/es/components/display/TabsMain.vue.mjs +5 -5
  9. package/es/components/form/FormMain.vue.mjs +1 -1
  10. package/es/components/form/FormMain.vue2.mjs +1 -0
  11. package/es/components/list-page/ListPage.vue.mjs +2 -2
  12. package/es/components/list-page/ListPage.vue2.mjs +2 -2
  13. package/es/components/menu/MenuItemSub.vue.mjs +10 -9
  14. package/es/components/menu/MenuTree.vue.mjs +1 -0
  15. package/es/components/modal/ConfirmModal.vue.mjs +3 -3
  16. package/es/components/modal/ConfirmModal.vue2.mjs +15 -15
  17. package/es/components/modal/DetailModal.vue.mjs +18 -17
  18. package/es/components/panel/PanelMain.vue.mjs +2 -2
  19. package/es/components/panel/PanelMain.vue2.mjs +21 -18
  20. package/es/components/table/TableMain.vue.mjs +2 -2
  21. package/es/components/table/TableMain.vue2.mjs +48 -48
  22. package/es/hooks/use-admin-theme-apply.mjs +210 -40
  23. package/es/index.mjs +88 -85
  24. package/es/style.css +1 -1
  25. package/es/utils/theme-scale.mjs +30 -23
  26. package/package.json +6 -4
  27. package/types/bridge/index.d.ts +26 -2
  28. package/types/bridge/theme/index.d.ts +1 -1
  29. package/types/bridge/theme/types.d.ts +78 -0
  30. package/types/components/app-layout/AppLayout.vue.d.ts +1 -1
  31. package/types/components/app-layout/types.d.ts +1 -1
  32. package/types/hooks/use-admin-theme-apply.d.ts +18 -1
  33. package/types/utils/theme-scale.d.ts +10 -0
package/es/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { createAdminBridge as r } from "./bridge/index.mjs";
1
+ import { createAdminBridge as t } from "./bridge/index.mjs";
2
2
  import { default as a } from "./components/display/ActionBtn.vue.mjs";
3
3
  import { default as f } from "./components/display/ActionBtnGroup.vue.mjs";
4
4
  import { default as s } from "./components/display/BooleanTag.vue.mjs";
@@ -16,12 +16,12 @@ import { default as C } from "./components/modal/ModalShelf.vue.mjs";
16
16
  import { default as D } from "./components/panel/PanelItem.vue.mjs";
17
17
  import { default as B } from "./components/panel/PanelItemNestPanel.vue.mjs";
18
18
  import { default as Y } from "./components/misc/SelectModule.vue.mjs";
19
- import { default as U } from "./components/display/TabsMain.vue.mjs";
19
+ import { default as G } from "./components/display/TabsMain.vue.mjs";
20
20
  import { default as K } from "./components/misc/TriggerAutoImport.vue.mjs";
21
21
  import { default as w } from "./components/display/WatchSize.vue.mjs";
22
22
  import { ADMIN_BRIDGE_KEY as W, APP_LAYOUT_APP_STORE_KEY as k, APP_LAYOUT_BRIDGE_KEY as X, APP_LAYOUT_USER_STORE_KEY as z, BODY_CONTENT_VIEWPORT_HEIGHT as Z, FORM_NEST_REGISTRY_KEY as j, NEST_LAYOUT_SCALE_KEY as Q, TABS_MAIN_VISUAL_LEVEL as q, getModalShelfInjectionKey as J } from "./inject/key.mjs";
23
23
  import { ADMIN_CORE_VIEWPORT_DECOR_ZINDEX_ABOVE as ee, ADMIN_CORE_VIEWPORT_DECOR_ZINDEX_BELOW as oe } from "./components/app-layout/viewport.mjs";
24
- import { APP_API_LIST_MODEL_KEY_CONFIG as te } from "./config/list-model.mjs";
24
+ import { APP_API_LIST_MODEL_KEY_CONFIG as re } from "./config/list-model.mjs";
25
25
  import { default as me } from "./components/display/ActionConfirm.vue.mjs";
26
26
  import { default as pe } from "./components/app-layout/AppAside.vue.mjs";
27
27
  import { default as ue } from "./components/app-layout/AppBody.vue.mjs";
@@ -34,10 +34,10 @@ import { default as Ie } from "./components/app-layout/AppSidebar.vue.mjs";
34
34
  import { default as Re } from "./components/app-layout/AppTheme.vue.mjs";
35
35
  import { default as Le } from "./components/misc/AutoRefresh.vue.mjs";
36
36
  import { default as Oe } from "./components/misc/AutoRefreshGroup.vue.mjs";
37
- import { default as Ne } from "./components/modal/ConfirmModal.vue.mjs";
38
- import { EXPORT_MAX_LIMIT as he, OPERATE_COLUMN_PROP as De, exportCSV as ye, pickExportColumns as Be } from "./utils/export.mjs";
39
- import { FORM_CONFIG_SELECT_ALL_VALUE as Ye, getConfirmPasswordRule as Ge, passwordRule as Ue, setFormComponentType as be } from "./helpers/form.mjs";
40
- import { FORM_ITEM_CHANGE_LOADING as ve, NEST_LAYOUT_TIERS as we, ceilToTier as He, generateFormData as We, getBlurSubmit as ke, getChangeSubmit as Xe, getDatePickerShortcuts as ze, getEnterSubmit as Ze, getPlaceholder as je, getVModelSugar as Qe, parseFormData as qe, resolveFormLayout as Je, resolveLayoutSpan as $e, setInputComponent as eo, setSelectComponent as oo, stringifyFormData as ro, swiftFormItemConfig as to } from "./components/form/utils.mjs";
37
+ import { default as he } from "./components/modal/ConfirmModal.vue.mjs";
38
+ import { EXPORT_MAX_LIMIT as Ne, OPERATE_COLUMN_PROP as De, exportCSV as ye, pickExportColumns as Be } from "./utils/export.mjs";
39
+ import { FORM_CONFIG_SELECT_ALL_VALUE as Ye, getConfirmPasswordRule as be, passwordRule as Ge, setFormComponentType as Ue } from "./helpers/form.mjs";
40
+ import { FORM_ITEM_CHANGE_LOADING as ve, NEST_LAYOUT_TIERS as we, ceilToTier as He, generateFormData as We, getBlurSubmit as ke, getChangeSubmit as Xe, getDatePickerShortcuts as ze, getEnterSubmit as Ze, getPlaceholder as je, getVModelSugar as Qe, parseFormData as qe, resolveFormLayout as Je, resolveLayoutSpan as $e, setInputComponent as eo, setSelectComponent as oo, stringifyFormData as to, swiftFormItemConfig as ro } from "./components/form/utils.mjs";
41
41
  import { default as mo } from "./components/form/FormItemNestForm.vue.mjs";
42
42
  import { default as po } from "./components/form/FormItemNestFormList.vue.mjs";
43
43
  import { default as uo } from "./components/form/FormMain.vue.mjs";
@@ -49,42 +49,42 @@ import { default as To } from "./components/panel/PanelEditSwitch.vue.mjs";
49
49
  import { default as Po } from "./components/panel/PanelItemNestForm.vue.mjs";
50
50
  import { default as Fo } from "./components/panel/PanelMain.vue.mjs";
51
51
  import { ROUTE_MODULE_LEVEL as Mo, TabsMainReplaceQueryKey as Oo } from "./config/route.mjs";
52
- import { default as No } from "./components/table/TableMain.vue.mjs";
53
- import { checkLogin as ho } from "./router/guard/login.mjs";
54
- import { checkPermission as yo } from "./router/guard/permission.mjs";
55
- import { countAll as Vo, createListApi as Yo, fetchListAll as Go } from "./helpers/list-helper.mjs";
56
- import { createAppStore as bo } from "./store/app.mjs";
57
- import { createGenerateRouteMetaRawTree as vo } from "./bridge/route.mjs";
58
- import { createGuard as Ho } from "./router/guard/index.mjs";
59
- import { createNestFormExposeMap as ko } from "./components/form/nest-registry.mjs";
60
- import { createRoutePermissionStore as zo } from "./store/router-permission.mjs";
61
- import { createStorageWithNamespace as jo } from "./bridge/storage.mjs";
62
- import { createUseState as qo } from "./bridge/state.mjs";
63
- import { createUserStore as $o } from "./store/user.mjs";
64
- import { flatRouteMetaResolveRaw as or, getRoutePermissionKey as rr } from "./utils/router.mjs";
65
- import { getId as ar } from "./utils/id.mjs";
66
- import { nestFormItem as fr } from "./components/form/nest-form-item.mjs";
67
- import { nestFormItemList as sr } from "./components/form/nest-form-item-list.mjs";
68
- import { nestPanelForm as lr } from "./components/panel/nest-panel-form.mjs";
69
- import { nestPanelItem as dr } from "./components/panel/nest-panel-item.mjs";
70
- import { themeScaleDerive as nr, themeScaleMix as _r } from "./utils/theme-scale.mjs";
71
- import { timeCountDown as Er } from "./utils/time.mjs";
72
- import { useActivated as Sr, useActivatedEvent as Tr, useActivatedExec as Ir } from "./hooks/activated.mjs";
73
- import { useAdminThemeApply as Rr } from "./hooks/use-admin-theme-apply.mjs";
74
- import { useAdminViewportApply as Lr } from "./hooks/use-admin-viewport-apply.mjs";
75
- import { useBreakpoint as Or } from "./hooks/use-breakpoint.mjs";
76
- import { useChannelViewportHeight as Nr } from "./hooks/use-channel-viewport-height.mjs";
77
- import { useFeelSize as hr } from "./hooks/feel-size.mjs";
78
- import { useMenusDataDispatch as yr } from "./hooks/menus-dispatch.mjs";
79
- import { useNestForm as Vr } from "./components/form/use-nest-form.mjs";
80
- import { useNestFormList as Gr } from "./components/form/use-nest-form-list.mjs";
81
- import { useNestLayoutScale as br } from "./components/form/use-nest-layout-scale.mjs";
82
- import { useTimeout as vr } from "./hooks/timeout.mjs";
52
+ import { default as ho } from "./components/table/TableMain.vue.mjs";
53
+ import { buildRhythmCss as No, useAdminThemeApply as Do } from "./hooks/use-admin-theme-apply.mjs";
54
+ import { checkLogin as Bo } from "./router/guard/login.mjs";
55
+ import { checkPermission as Yo } from "./router/guard/permission.mjs";
56
+ import { countAll as Go, createListApi as Uo, fetchListAll as Ko } from "./helpers/list-helper.mjs";
57
+ import { createAppStore as wo } from "./store/app.mjs";
58
+ import { createGenerateRouteMetaRawTree as Wo } from "./bridge/route.mjs";
59
+ import { createGuard as Xo } from "./router/guard/index.mjs";
60
+ import { createNestFormExposeMap as Zo } from "./components/form/nest-registry.mjs";
61
+ import { createRoutePermissionStore as Qo } from "./store/router-permission.mjs";
62
+ import { createStorageWithNamespace as Jo } from "./bridge/storage.mjs";
63
+ import { createUseState as et } from "./bridge/state.mjs";
64
+ import { createUserStore as tt } from "./store/user.mjs";
65
+ import { flatRouteMetaResolveRaw as at, getRoutePermissionKey as mt } from "./utils/router.mjs";
66
+ import { getId as pt } from "./utils/id.mjs";
67
+ import { nestFormItem as ut } from "./components/form/nest-form-item.mjs";
68
+ import { nestFormItemList as xt } from "./components/form/nest-form-item-list.mjs";
69
+ import { nestPanelForm as it } from "./components/panel/nest-panel-form.mjs";
70
+ import { nestPanelItem as _t } from "./components/panel/nest-panel-item.mjs";
71
+ import { themeScaleDerive as Et, themeScaleMix as ct, themeScaleParseHex as St, themeScaleToRgba as Tt } from "./utils/theme-scale.mjs";
72
+ import { timeCountDown as Pt } from "./utils/time.mjs";
73
+ import { useActivated as Ft, useActivatedEvent as Lt, useActivatedExec as Mt } from "./hooks/activated.mjs";
74
+ import { useAdminViewportApply as gt } from "./hooks/use-admin-viewport-apply.mjs";
75
+ import { useBreakpoint as Ct } from "./hooks/use-breakpoint.mjs";
76
+ import { useChannelViewportHeight as Dt } from "./hooks/use-channel-viewport-height.mjs";
77
+ import { useFeelSize as Bt } from "./hooks/feel-size.mjs";
78
+ import { useMenusDataDispatch as Yt } from "./hooks/menus-dispatch.mjs";
79
+ import { useNestForm as Gt } from "./components/form/use-nest-form.mjs";
80
+ import { useNestFormList as Kt } from "./components/form/use-nest-form-list.mjs";
81
+ import { useNestLayoutScale as wt } from "./components/form/use-nest-layout-scale.mjs";
82
+ import { useTimeout as Wt } from "./hooks/timeout.mjs";
83
83
  export {
84
84
  W as ADMIN_BRIDGE_KEY,
85
85
  ee as ADMIN_CORE_VIEWPORT_DECOR_ZINDEX_ABOVE,
86
86
  oe as ADMIN_CORE_VIEWPORT_DECOR_ZINDEX_BELOW,
87
- te as APP_API_LIST_MODEL_KEY_CONFIG,
87
+ re as APP_API_LIST_MODEL_KEY_CONFIG,
88
88
  k as APP_LAYOUT_APP_STORE_KEY,
89
89
  X as APP_LAYOUT_BRIDGE_KEY,
90
90
  z as APP_LAYOUT_USER_STORE_KEY,
@@ -104,9 +104,9 @@ export {
104
104
  Oe as AutoRefreshGroup,
105
105
  Z as BODY_CONTENT_VIEWPORT_HEIGHT,
106
106
  s as BooleanTag,
107
- Ne as ConfirmModal,
107
+ he as ConfirmModal,
108
108
  l as DetailModal,
109
- he as EXPORT_MAX_LIMIT,
109
+ Ne as EXPORT_MAX_LIMIT,
110
110
  Ye as FORM_CONFIG_SELECT_ALL_VALUE,
111
111
  ve as FORM_ITEM_CHANGE_LOADING,
112
112
  j as FORM_NEST_REGISTRY_KEY,
@@ -138,67 +138,70 @@ export {
138
138
  Mo as ROUTE_MODULE_LEVEL,
139
139
  Y as SelectModule,
140
140
  q as TABS_MAIN_VISUAL_LEVEL,
141
- No as TableMain,
142
- U as TabsMain,
141
+ ho as TableMain,
142
+ G as TabsMain,
143
143
  Oo as TabsMainReplaceQueryKey,
144
144
  K as TriggerAutoImport,
145
145
  w as WatchSize,
146
+ No as buildRhythmCss,
146
147
  He as ceilToTier,
147
- ho as checkLogin,
148
- yo as checkPermission,
149
- Vo as countAll,
150
- r as createAdminBridge,
151
- bo as createAppStore,
152
- vo as createGenerateRouteMetaRawTree,
153
- Ho as createGuard,
154
- Yo as createListApi,
155
- ko as createNestFormExposeMap,
156
- zo as createRoutePermissionStore,
157
- jo as createStorageWithNamespace,
158
- qo as createUseState,
159
- $o as createUserStore,
148
+ Bo as checkLogin,
149
+ Yo as checkPermission,
150
+ Go as countAll,
151
+ t as createAdminBridge,
152
+ wo as createAppStore,
153
+ Wo as createGenerateRouteMetaRawTree,
154
+ Xo as createGuard,
155
+ Uo as createListApi,
156
+ Zo as createNestFormExposeMap,
157
+ Qo as createRoutePermissionStore,
158
+ Jo as createStorageWithNamespace,
159
+ et as createUseState,
160
+ tt as createUserStore,
160
161
  ye as exportCSV,
161
- Go as fetchListAll,
162
- or as flatRouteMetaResolveRaw,
162
+ Ko as fetchListAll,
163
+ at as flatRouteMetaResolveRaw,
163
164
  We as generateFormData,
164
165
  ke as getBlurSubmit,
165
166
  Xe as getChangeSubmit,
166
- Ge as getConfirmPasswordRule,
167
+ be as getConfirmPasswordRule,
167
168
  ze as getDatePickerShortcuts,
168
169
  Ze as getEnterSubmit,
169
- ar as getId,
170
+ pt as getId,
170
171
  J as getModalShelfInjectionKey,
171
172
  je as getPlaceholder,
172
- rr as getRoutePermissionKey,
173
+ mt as getRoutePermissionKey,
173
174
  Qe as getVModelSugar,
174
- fr as nestFormItem,
175
- sr as nestFormItemList,
176
- lr as nestPanelForm,
177
- dr as nestPanelItem,
175
+ ut as nestFormItem,
176
+ xt as nestFormItemList,
177
+ it as nestPanelForm,
178
+ _t as nestPanelItem,
178
179
  qe as parseFormData,
179
- Ue as passwordRule,
180
+ Ge as passwordRule,
180
181
  Be as pickExportColumns,
181
182
  Je as resolveFormLayout,
182
183
  $e as resolveLayoutSpan,
183
- be as setFormComponentType,
184
+ Ue as setFormComponentType,
184
185
  eo as setInputComponent,
185
186
  oo as setSelectComponent,
186
- ro as stringifyFormData,
187
- to as swiftFormItemConfig,
188
- nr as themeScaleDerive,
189
- _r as themeScaleMix,
190
- Er as timeCountDown,
191
- Sr as useActivated,
192
- Tr as useActivatedEvent,
193
- Ir as useActivatedExec,
194
- Rr as useAdminThemeApply,
195
- Lr as useAdminViewportApply,
196
- Or as useBreakpoint,
197
- Nr as useChannelViewportHeight,
198
- hr as useFeelSize,
199
- yr as useMenusDataDispatch,
200
- Vr as useNestForm,
201
- Gr as useNestFormList,
202
- br as useNestLayoutScale,
203
- vr as useTimeout
187
+ to as stringifyFormData,
188
+ ro as swiftFormItemConfig,
189
+ Et as themeScaleDerive,
190
+ ct as themeScaleMix,
191
+ St as themeScaleParseHex,
192
+ Tt as themeScaleToRgba,
193
+ Pt as timeCountDown,
194
+ Ft as useActivated,
195
+ Lt as useActivatedEvent,
196
+ Mt as useActivatedExec,
197
+ Do as useAdminThemeApply,
198
+ gt as useAdminViewportApply,
199
+ Ct as useBreakpoint,
200
+ Dt as useChannelViewportHeight,
201
+ Bt as useFeelSize,
202
+ Yt as useMenusDataDispatch,
203
+ Gt as useNestForm,
204
+ Kt as useNestFormList,
205
+ wt as useNestLayoutScale,
206
+ Wt as useTimeout
204
207
  };
package/es/style.css CHANGED
@@ -1 +1 @@
1
- .confirm-modal[data-v-26598cb2] .el-dialog__header{margin-right:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.confirm-modal__title[data-v-26598cb2]{font-size:16px;font-weight:600;line-height:24px;color:var(--el-text-color-primary);text-align:left}.confirm-modal[data-v-26598cb2] .el-dialog__body{padding:20px}.confirm-modal__content[data-v-26598cb2]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px);font-size:14px;line-height:22px;color:var(--el-text-color-regular);text-align:left;word-break:break-word}.confirm-modal[data-v-26598cb2] .el-dialog__footer{padding:12px 20px;border-top:1px solid var(--el-border-color-lighter)}.confirm-modal__footer[data-v-26598cb2]{display:flex;justify-content:flex-end;align-items:center;gap:8px}.confirm-modal__footer[data-v-26598cb2] .el-button{min-width:72px}.confirm-modal__footer[reverse=true][data-v-26598cb2]{flex-direction:row-reverse}.action-confirm__title[data-v-88119b35]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-88119b35]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-88119b35]{display:flex;justify-content:flex-end;gap:8px}.form-item-tip[data-v-8b508d64]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-8b508d64] .el-form-item__label-wrap{display:none}[data-v-8ad14c45] .el-row>.el-col>.el-form-item{margin-bottom:18px}.form-submit-panel[data-v-93bc9096]{display:flex;flex-direction:column}.form-submit-panel .form-submit-panel-form[data-v-93bc9096]{order:1}.form-submit-panel .form-submit-panel-operation[data-v-93bc9096]{order:2}.form-submit-panel .form-submit-panel-operation-inner[data-v-93bc9096]{display:flex;align-items:center;gap:8px;padding:10px 12px}.form-submit-panel .el-affix--fixed .form-submit-panel-operation-inner[data-v-93bc9096]{background-color:var(--admin-core-body-color)}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096],.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{border-top:1px solid var(--el-border-color-light);border-bottom-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-bottom-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:center}.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end}.form-submit-panel_top-right .form-submit-panel-operation[data-v-93bc9096]{order:0}.form-submit-panel_top-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end;border-bottom:1px solid var(--el-border-color-light);border-top-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-top-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_no-divider .form-submit-panel-operation-inner[data-v-93bc9096]{border:none;border-radius:0}.form-submit-panel_bare .form-submit-panel-operation-inner[data-v-93bc9096]{padding:0}.panel-edit-switch[data-v-65f056ab]{position:relative}.panel-edit-switch:hover .panel-edit-switch-edit-btn[data-v-65f056ab]{display:block}.panel-edit-switch-edit-btn[data-v-65f056ab]{position:absolute;top:0;right:0;z-index:1;display:none}.panel-edit-switch-actions[data-v-65f056ab]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.panel-main-item-col:not(:last-of-type) .panel-main-item-col-wrap_card[data-v-9c14b584]{margin-bottom:var(--v5b714e11)}.form-search_show[data-v-4d4d2642]{margin-bottom:10px}.form-search .btn-box[data-v-4d4d2642]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.form-search .btn-box-expand-icon[data-v-4d4d2642]{margin-right:2px}.form-verify-image[data-v-669b7ad9] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-669b7ad9]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--admin-core-radius, var(--el-border-radius-base)));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-669b7ad9]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-3faa57f5]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-3faa57f5]{border:none;background:transparent;cursor:pointer;color:var(--el-text-color-regular);transition:background .2s,color .2s,box-shadow .2s}.tabs-main-bar-indicator[data-v-3faa57f5]{position:absolute;left:0;background:var(--admin-core-primary-color);transition:transform .2s,width .2s}.tabs-main-bar--l1 .tabs-main-bar-item[data-v-3faa57f5]{font-size:16px}.tabs-main-bar--l2 .tabs-main-bar-item[data-v-3faa57f5]{font-size:14px}.tabs-main-bar--l3 .tabs-main-bar-item[data-v-3faa57f5],.tabs-main-bar--l4 .tabs-main-bar-item[data-v-3faa57f5]{font-size:12px}.tabs-main-bar--variant-card[data-v-3faa57f5]{position:relative;overflow:hidden;gap:2px}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]{position:relative;padding:8px 20px;line-height:1.4;border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]:hover:not(.tabs-main-bar-item_active){color:var(--admin-core-primary-color)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);border-color:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before,.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{content:"";position:absolute;bottom:0;width:100vw;height:1px;background:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before{right:100%}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{left:100%}.tabs-main-bar--variant-indicator .tabs-main-bar-item[data-v-3faa57f5]{padding:8px 16px}.tabs-main-bar--variant-indicator .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:2px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item[data-v-3faa57f5]{padding:6px 10px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:1px}.tabs-main-bar--variant-plain .tabs-main-bar-item[data-v-3faa57f5]{padding:4px 8px}.tabs-main-bar--variant-plain .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);font-weight:600}.app-aside[data-v-d07cb9ed]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow-x:hidden;overflow-y:auto;z-index:0}.app-breadcrumb[data-v-9bbe0b05]{display:flex;align-items:center;justify-content:flex-start}.app-body[data-v-ae442089]{transition-duration:.3s;transition-property:padding;transition-timing-function:linear;min-height:100vh}.app-body-shim[data-v-ae442089]{width:100%;--app-viewport-max-height: var(--ae6fc168)}.app-footer[data-v-71b2892d]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;width:100%;box-shadow:var(--admin-core-shadow, var(--el-box-shadow))}.app-footer-shim[data-v-71b2892d]{width:100%;height:100%;padding:0 20px}.app-header[data-v-ef6c4b9f]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));z-index:1}.app-header-module[data-v-ef6c4b9f]{display:flex;flex:1;height:100%;overflow-x:auto}.app-header-module-item[data-v-ef6c4b9f]{display:flex;justify-content:center;align-items:center;padding:0 20px;white-space:nowrap;height:100%}.app-header-module-item[data-v-ef6c4b9f]:hover,.app-header-module-item_active[data-v-ef6c4b9f]{color:var(--v1eee7516)}.app-header-module-item_active[data-v-ef6c4b9f]{position:relative}.app-header-module-item_active[data-v-ef6c4b9f]:before{content:"";position:absolute;left:50%;top:0;width:100%;height:3px;background-color:var(--v1eee7516);transform:translate(-50%)}.app-header-shim[data-v-ef6c4b9f]{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;font-size:18px;font-weight:700}.app-header-module-item__icon[data-v-ef6c4b9f]{margin-right:8px}.app-header-right[data-v-ef6c4b9f]{padding-left:80px;display:flex;align-items:center}.app-sidebar[data-v-1dee248d]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow:visible;z-index:var(--v368510bd)}.app-sidebar-top[data-v-1dee248d]{position:absolute;left:0;right:0;top:0;overflow:hidden}.app-sidebar-bottom[data-v-1dee248d]{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.app-sidebar-shim[data-v-1dee248d]{position:absolute;left:0;right:0;top:var(--v7b09fce5);bottom:var(--v1098f49b);overflow-x:hidden;overflow-y:auto;--el-menu-border-color: transparent;-webkit-user-select:none;user-select:none}.app-sidebar-toggle[data-v-1dee248d]{position:absolute;left:100%;top:50%;transform:translate(-50%,-50%);cursor:pointer;width:22px;height:22px;border-radius:50%;background-color:var(--cc02eed6);color:var(--v56d0884d);border:1px solid var(--v56d0884d);box-shadow:0 1px 2px #0000000f;display:flex;align-items:center;justify-content:center;font-size:12px;z-index:1;isolation:isolate;transition:color .3s,border-color .3s,box-shadow .3s}.app-sidebar-toggle[data-v-1dee248d]:before{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background-color:var(--v56d0884d);opacity:.18;z-index:-1;pointer-events:none;transition:opacity .3s,inset .3s}.app-sidebar-toggle[data-v-1dee248d]:active,.app-sidebar-toggle[data-v-1dee248d]:focus,.app-sidebar-toggle[data-v-1dee248d]:hover{box-shadow:0 2px 6px #0000001f}.app-sidebar-toggle[data-v-1dee248d]:active:before,.app-sidebar-toggle[data-v-1dee248d]:focus:before,.app-sidebar-toggle[data-v-1dee248d]:hover:before{opacity:.32;top:-5px;right:-5px;bottom:-5px;left:-5px}.app-sidebar-toggle-icon[data-v-1dee248d]{transition:transform .3s}.app-theme[data-v-89d81e34]{display:inline-flex;align-items:center;gap:12px;margin-right:12px}.app-theme__style-select[data-v-89d81e34]{width:120px}.app-layout[data-v-646eac1d]{position:relative}.app-layout_noLogin[data-v-646eac1d] .app-body,.app-layout_noLogin[data-v-646eac1d] .app-sidebar,.app-layout_noLogin[data-v-646eac1d] .app-header,.app-layout_noLogin[data-v-646eac1d] .app-footer{transition:none!important}.app-page-shim[data-v-fda19616]{--app-viewport-max-height: var(--v54888f0e)}[data-v-64f355fe] .auto-refresh-label{display:flex;font-size:13px;color:var(--el-text-color-regular);margin-bottom:8px}.auto-refresh-group-icon--rotating[data-v-e608ff06]{animation:auto-refresh-rotating-e608ff06 1s linear infinite}@keyframes auto-refresh-rotating-e608ff06{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.form-item-nest-form[data-v-12b77b02],.form-item-nest-form-list[data-v-9fa02cbe]{padding:16px;border:1px solid var(--admin-core-border-color);border-radius:8px;box-shadow:var(--admin-core-shadow, var(--el-box-shadow-lighter))}.form-item-nest-form-list-row[data-v-9fa02cbe]{display:flex;align-items:flex-start;gap:8px;margin-bottom:12px}.form-item-nest-form-list-row-body[data-v-9fa02cbe]{flex:1;min-width:0;padding:12px 16px;border:1px solid var(--el-border-color-lighter);border-radius:6px;box-shadow:var(--el-box-shadow-lighter)}.table-toolbar[data-v-6f2937e1]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-6f2937e1],.table-toolbar-right[data-v-6f2937e1]{display:flex;align-items:center;gap:10px}.table-toolbar-switch-view[data-v-6f2937e1]{--el-switch-off-color: var(--admin-core-primary-color);--el-switch-on-color: var(--admin-core-warning-color)}.data-list-view[data-v-708af83f]{width:100%}.data-list-view-empty[data-v-708af83f]{display:flex;justify-content:center;align-items:center;width:100%;min-height:60px}.table-main-pagination[data-v-132febbc]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-fc41e3d4]{min-height:var(--c6e708aa)}.list-page-header[data-v-fc41e3d4],.list-page-operation[data-v-fc41e3d4]{margin-bottom:10px}.list-page[data-v-fc41e3d4] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-item-nest-form-actions[data-v-3af1d77a]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
1
+ .confirm-modal[data-v-647fb7fd] .el-dialog__header{margin-right:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.confirm-modal__title[data-v-647fb7fd]{font-size:16px;font-weight:600;line-height:24px;color:var(--el-text-color-primary);text-align:left}.confirm-modal[data-v-647fb7fd] .el-dialog__body{padding:20px}.confirm-modal__content[data-v-647fb7fd]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px);font-size:14px;line-height:22px;color:var(--el-text-color-regular);text-align:left;word-break:break-word}.confirm-modal[data-v-647fb7fd] .el-dialog__footer{padding:12px 20px;border-top:1px solid var(--el-border-color-lighter)}.confirm-modal__footer[data-v-647fb7fd]{display:flex;justify-content:flex-end;align-items:center;gap:8px}.confirm-modal__footer[data-v-647fb7fd] .el-button{min-width:72px}.confirm-modal__footer[reverse=true][data-v-647fb7fd]{flex-direction:row-reverse}.action-confirm__title[data-v-88119b35]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-88119b35]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-88119b35]{display:flex;justify-content:flex-end;gap:8px}.form-item-tip[data-v-8b508d64]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-8b508d64] .el-form-item__label-wrap{display:none}[data-v-83b1b718] .el-row>.el-col>.el-form-item{margin-bottom:18px}.form-submit-panel[data-v-93bc9096]{display:flex;flex-direction:column}.form-submit-panel .form-submit-panel-form[data-v-93bc9096]{order:1}.form-submit-panel .form-submit-panel-operation[data-v-93bc9096]{order:2}.form-submit-panel .form-submit-panel-operation-inner[data-v-93bc9096]{display:flex;align-items:center;gap:8px;padding:10px 12px}.form-submit-panel .el-affix--fixed .form-submit-panel-operation-inner[data-v-93bc9096]{background-color:var(--admin-core-body-color)}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096],.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{border-top:1px solid var(--el-border-color-light);border-bottom-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-bottom-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:center}.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end}.form-submit-panel_top-right .form-submit-panel-operation[data-v-93bc9096]{order:0}.form-submit-panel_top-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end;border-bottom:1px solid var(--el-border-color-light);border-top-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-top-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_no-divider .form-submit-panel-operation-inner[data-v-93bc9096]{border:none;border-radius:0}.form-submit-panel_bare .form-submit-panel-operation-inner[data-v-93bc9096]{padding:0}.panel-edit-switch[data-v-65f056ab]{position:relative}.panel-edit-switch:hover .panel-edit-switch-edit-btn[data-v-65f056ab]{display:block}.panel-edit-switch-edit-btn[data-v-65f056ab]{position:absolute;top:0;right:0;z-index:1;display:none}.panel-edit-switch-actions[data-v-65f056ab]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.panel-main-item-col:not(:last-of-type) .panel-main-item-col-wrap_card[data-v-0835965e]{margin-bottom:var(--e1f69828)}.form-search_show[data-v-4d4d2642]{margin-bottom:10px}.form-search .btn-box[data-v-4d4d2642]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.form-search .btn-box-expand-icon[data-v-4d4d2642]{margin-right:2px}.form-verify-image[data-v-669b7ad9] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-669b7ad9]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--admin-core-radius, var(--el-border-radius-base)));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-669b7ad9]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-3faa57f5]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-3faa57f5]{border:none;background:transparent;cursor:pointer;color:var(--el-text-color-regular);transition:background .2s,color .2s,box-shadow .2s}.tabs-main-bar-indicator[data-v-3faa57f5]{position:absolute;left:0;background:var(--admin-core-primary-color);transition:transform .2s,width .2s}.tabs-main-bar--l1 .tabs-main-bar-item[data-v-3faa57f5]{font-size:16px}.tabs-main-bar--l2 .tabs-main-bar-item[data-v-3faa57f5]{font-size:14px}.tabs-main-bar--l3 .tabs-main-bar-item[data-v-3faa57f5],.tabs-main-bar--l4 .tabs-main-bar-item[data-v-3faa57f5]{font-size:12px}.tabs-main-bar--variant-card[data-v-3faa57f5]{position:relative;overflow:hidden;gap:2px}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]{position:relative;padding:8px 20px;line-height:1.4;border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]:hover:not(.tabs-main-bar-item_active){color:var(--admin-core-primary-color)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);border-color:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before,.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{content:"";position:absolute;bottom:0;width:100vw;height:1px;background:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before{right:100%}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{left:100%}.tabs-main-bar--variant-indicator .tabs-main-bar-item[data-v-3faa57f5]{padding:8px 16px}.tabs-main-bar--variant-indicator .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:2px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item[data-v-3faa57f5]{padding:6px 10px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:1px}.tabs-main-bar--variant-plain .tabs-main-bar-item[data-v-3faa57f5]{padding:4px 8px}.tabs-main-bar--variant-plain .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);font-weight:600}.app-aside[data-v-d07cb9ed]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow-x:hidden;overflow-y:auto;z-index:0}.app-breadcrumb[data-v-9bbe0b05]{display:flex;align-items:center;justify-content:flex-start}.app-body[data-v-ae442089]{transition-duration:.3s;transition-property:padding;transition-timing-function:linear;min-height:100vh}.app-body-shim[data-v-ae442089]{width:100%;--app-viewport-max-height: var(--ae6fc168)}.app-footer[data-v-71b2892d]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;width:100%;box-shadow:var(--admin-core-shadow, var(--el-box-shadow))}.app-footer-shim[data-v-71b2892d]{width:100%;height:100%;padding:0 20px}.app-header[data-v-ef6c4b9f]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));z-index:1}.app-header-module[data-v-ef6c4b9f]{display:flex;flex:1;height:100%;overflow-x:auto}.app-header-module-item[data-v-ef6c4b9f]{display:flex;justify-content:center;align-items:center;padding:0 20px;white-space:nowrap;height:100%}.app-header-module-item[data-v-ef6c4b9f]:hover,.app-header-module-item_active[data-v-ef6c4b9f]{color:var(--v1eee7516)}.app-header-module-item_active[data-v-ef6c4b9f]{position:relative}.app-header-module-item_active[data-v-ef6c4b9f]:before{content:"";position:absolute;left:50%;top:0;width:100%;height:3px;background-color:var(--v1eee7516);transform:translate(-50%)}.app-header-shim[data-v-ef6c4b9f]{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;font-size:18px;font-weight:700}.app-header-module-item__icon[data-v-ef6c4b9f]{margin-right:8px}.app-header-right[data-v-ef6c4b9f]{padding-left:80px;display:flex;align-items:center}.app-sidebar[data-v-1dee248d]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow:visible;z-index:var(--v368510bd)}.app-sidebar-top[data-v-1dee248d]{position:absolute;left:0;right:0;top:0;overflow:hidden}.app-sidebar-bottom[data-v-1dee248d]{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.app-sidebar-shim[data-v-1dee248d]{position:absolute;left:0;right:0;top:var(--v7b09fce5);bottom:var(--v1098f49b);overflow-x:hidden;overflow-y:auto;--el-menu-border-color: transparent;-webkit-user-select:none;user-select:none}.app-sidebar-toggle[data-v-1dee248d]{position:absolute;left:100%;top:50%;transform:translate(-50%,-50%);cursor:pointer;width:22px;height:22px;border-radius:50%;background-color:var(--cc02eed6);color:var(--v56d0884d);border:1px solid var(--v56d0884d);box-shadow:0 1px 2px #0000000f;display:flex;align-items:center;justify-content:center;font-size:12px;z-index:1;isolation:isolate;transition:color .3s,border-color .3s,box-shadow .3s}.app-sidebar-toggle[data-v-1dee248d]:before{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background-color:var(--v56d0884d);opacity:.18;z-index:-1;pointer-events:none;transition:opacity .3s,inset .3s}.app-sidebar-toggle[data-v-1dee248d]:active,.app-sidebar-toggle[data-v-1dee248d]:focus,.app-sidebar-toggle[data-v-1dee248d]:hover{box-shadow:0 2px 6px #0000001f}.app-sidebar-toggle[data-v-1dee248d]:active:before,.app-sidebar-toggle[data-v-1dee248d]:focus:before,.app-sidebar-toggle[data-v-1dee248d]:hover:before{opacity:.32;top:-5px;right:-5px;bottom:-5px;left:-5px}.app-sidebar-toggle-icon[data-v-1dee248d]{transition:transform .3s}.app-theme[data-v-e4f0fe3b]{display:inline-flex;align-items:center;gap:12px;margin-right:12px}.app-theme__style-select[data-v-e4f0fe3b]{width:120px}.app-layout[data-v-452f511b]{position:relative}.app-layout_noLogin[data-v-452f511b] .app-body,.app-layout_noLogin[data-v-452f511b] .app-sidebar,.app-layout_noLogin[data-v-452f511b] .app-header,.app-layout_noLogin[data-v-452f511b] .app-footer{transition:none!important}.app-page-shim[data-v-fda19616]{--app-viewport-max-height: var(--v54888f0e)}[data-v-64f355fe] .auto-refresh-label{display:flex;font-size:13px;color:var(--el-text-color-regular);margin-bottom:8px}.auto-refresh-group-icon--rotating[data-v-e608ff06]{animation:auto-refresh-rotating-e608ff06 1s linear infinite}@keyframes auto-refresh-rotating-e608ff06{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.form-item-nest-form[data-v-12b77b02],.form-item-nest-form-list[data-v-9fa02cbe]{padding:16px;border:1px solid var(--admin-core-border-color);border-radius:8px;box-shadow:var(--admin-core-shadow, var(--el-box-shadow-lighter))}.form-item-nest-form-list-row[data-v-9fa02cbe]{display:flex;align-items:flex-start;gap:8px;margin-bottom:12px}.form-item-nest-form-list-row-body[data-v-9fa02cbe]{flex:1;min-width:0;padding:12px 16px;border:1px solid var(--el-border-color-lighter);border-radius:6px;box-shadow:var(--el-box-shadow-lighter)}.table-toolbar[data-v-6f2937e1]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-6f2937e1],.table-toolbar-right[data-v-6f2937e1]{display:flex;align-items:center;gap:10px}.table-toolbar-switch-view[data-v-6f2937e1]{--el-switch-off-color: var(--admin-core-primary-color);--el-switch-on-color: var(--admin-core-warning-color)}.data-list-view[data-v-708af83f]{width:100%}.data-list-view-empty[data-v-708af83f]{display:flex;justify-content:center;align-items:center;width:100%;min-height:60px}.table-main-pagination[data-v-e8584319]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-0e94ce51]{min-height:var(--v3390ee15)}.list-page-header[data-v-0e94ce51],.list-page-operation[data-v-0e94ce51]{margin-bottom:10px}.list-page[data-v-0e94ce51] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-item-nest-form-actions[data-v-3af1d77a]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
@@ -1,37 +1,44 @@
1
- const l = (s) => {
1
+ const c = (s) => {
2
2
  const t = s.trim().replace(/^#/, "");
3
3
  if (t.length === 3) {
4
- const n = parseInt(t[0] + t[0], 16), r = parseInt(t[1] + t[1], 16), e = parseInt(t[2] + t[2], 16);
5
- return [n, r, e].some(Number.isNaN) ? null : [n, r, e];
4
+ const n = parseInt(t[0] + t[0], 16), e = parseInt(t[1] + t[1], 16), r = parseInt(t[2] + t[2], 16);
5
+ return [n, e, r].some(Number.isNaN) ? null : [n, e, r];
6
6
  }
7
7
  if (t.length === 6) {
8
- const n = parseInt(t.slice(0, 2), 16), r = parseInt(t.slice(2, 4), 16), e = parseInt(t.slice(4, 6), 16);
9
- return [n, r, e].some(Number.isNaN) ? null : [n, r, e];
8
+ const n = parseInt(t.slice(0, 2), 16), e = parseInt(t.slice(2, 4), 16), r = parseInt(t.slice(4, 6), 16);
9
+ return [n, e, r].some(Number.isNaN) ? null : [n, e, r];
10
10
  }
11
11
  return null;
12
- }, o = (s, t, n) => {
13
- const r = (e) => Math.min(255, Math.max(0, Math.round(e))).toString(16).padStart(2, "0");
14
- return `#${r(s)}${r(t)}${r(n)}`;
15
12
  }, i = (s, t, n) => {
16
- const r = l(s), e = l(t);
17
- return !r || !e ? t : o(
18
- r[0] * n + e[0] * (1 - n),
19
- r[1] * n + e[1] * (1 - n),
20
- r[2] * n + e[2] * (1 - n)
13
+ const e = (r) => Math.min(255, Math.max(0, Math.round(r))).toString(16).padStart(2, "0");
14
+ return `#${e(s)}${e(t)}${e(n)}`;
15
+ }, o = (s, t, n) => {
16
+ const e = c(s), r = c(t);
17
+ return !e || !r ? t : i(
18
+ e[0] * n + r[0] * (1 - n),
19
+ e[1] * n + r[1] * (1 - n),
20
+ e[2] * n + r[2] * (1 - n)
21
21
  );
22
- }, a = (s, t) => {
23
- const n = t === "light" ? "#ffffff" : "#141414", r = t === "light" ? "#000000" : "#ffffff", e = (c) => i(n, s, c / 10);
22
+ }, l = (s, t) => {
23
+ const n = c(s);
24
+ if (!n) return s;
25
+ const e = Math.min(1, Math.max(0, t));
26
+ return `rgba(${n[0]}, ${n[1]}, ${n[2]}, ${e})`;
27
+ }, h = (s, t) => {
28
+ const n = t === "light" ? "#ffffff" : "#141414", e = t === "light" ? "#000000" : "#ffffff", r = (a) => o(n, s, a / 10);
24
29
  return {
25
30
  base: s,
26
- "light-3": e(3),
27
- "light-5": e(5),
28
- "light-7": e(7),
29
- "light-8": e(8),
30
- "light-9": e(9),
31
- "dark-2": i(r, s, 0.2)
31
+ "light-3": r(3),
32
+ "light-5": r(5),
33
+ "light-7": r(7),
34
+ "light-8": r(8),
35
+ "light-9": r(9),
36
+ "dark-2": o(e, s, 0.2)
32
37
  };
33
38
  };
34
39
  export {
35
- a as themeScaleDerive,
36
- i as themeScaleMix
40
+ h as themeScaleDerive,
41
+ o as themeScaleMix,
42
+ c as themeScaleParseHex,
43
+ l as themeScaleToRgba
37
44
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "后台管理核心",
5
5
  "private": false,
6
6
  "main": "lib/index.cjs",
@@ -27,12 +27,13 @@
27
27
  "dev": "vite build -w -m hotBuild",
28
28
  "prehotBuild": "dc-inject",
29
29
  "hotBuild": "vite build -w",
30
- "prebuild": "dc-inject",
30
+ "prebuild": "rimraf types && dc-inject",
31
31
  "build": "vue-tsc && vite build",
32
32
  "build:test": "pnpm run build",
33
33
  "prepack": "pnpm build",
34
34
  "test": "vitest",
35
- "coverage": "vitest run --coverage"
35
+ "coverage": "vitest run --coverage",
36
+ "prebuild:test": "rimraf types"
36
37
  },
37
38
  "repository": {
38
39
  "type": "git",
@@ -59,6 +60,7 @@
59
60
  "@vue/test-utils": "^2.4.10",
60
61
  "jsdom": "^29.1.0",
61
62
  "less": "^4.2.0",
63
+ "rimraf": "^5.0.1",
62
64
  "typescript": "^5.2.2",
63
65
  "vite": "^5.2.0",
64
66
  "vite-plugin-dts": "^4.5.4",
@@ -79,5 +81,5 @@
79
81
  "node": ">=18.0.0",
80
82
  "pnpm": ">=9.0.0"
81
83
  },
82
- "gitHead": "a02bf1be515a9ed026b48573c3036fdb42f38dcc"
84
+ "gitHead": "d6b53243bbb38460aab7b806e57885a4fcd70172"
83
85
  }
@@ -4,11 +4,11 @@ import { createUseState } from './state';
4
4
  import { createGenerateRouteMetaRawTree } from './route';
5
5
  import { UpdatableConfigKey, UpdatableConfigMap } from './config-hook';
6
6
  import { AdminBridgePluginLike } from './plugin';
7
- import { AdminThemeModule, AdminThemeMode, BridgeThemeLayoutState } from './theme';
7
+ import { AdminThemeModule, AdminThemeMode, AdminThemeDensity, AdminThemeMotion, BridgeThemeLayoutState } from './theme';
8
8
  export { createUseState, type UseStateOptions } from './state';
9
9
  export { createGenerateRouteMetaRawTree, type RouteMetaDefaultConfig, } from './route';
10
10
  export { createStorageWithNamespace } from './storage';
11
- export type { AdminThemeEntry, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminConfigDescription, AdminThemeModule, AdminThemeMode, AdminThemePresetLayout, BridgeThemeLayoutState, BridgeThemeLayoutBaseline, BridgeThemeHook, } from './theme';
11
+ export type { AdminThemeEntry, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminConfigDescription, AdminThemeModule, AdminThemeMode, AdminThemeDensity, AdminThemeMotion, ElSize, AdminThemeComponentDefaults, AdminThemePresetLayout, BridgeThemeLayoutState, BridgeThemeLayoutBaseline, BridgeThemeHook, } from './theme';
12
12
  /**
13
13
  * 认证桥接无状态纯工厂。
14
14
  *
@@ -453,6 +453,21 @@ export interface AdminBridgeInitOptions<UserInfo = unknown> {
453
453
  APP_ROUTER_PATHS_CONFIG: AppRouterPathsConfig;
454
454
  /** 应用主题配置(light / dark 双主题) */
455
455
  APP_THEME_CONFIG: AppThemeConfig;
456
+ /**
457
+ * 明暗模式默认值(**仅无缓存时生效**,可选);缺省 `"light"`。
458
+ *
459
+ * 读持久化命中 themeMode → 缓存优先;无缓存才回落本值。设 `"dark"` =「首次进入默认暗色」、
460
+ * `"system"` =「默认跟随系统」。透传给 theme cache hook 的 `defaultMode`。
461
+ */
462
+ defaultThemeMode?: AdminThemeMode;
463
+ /**
464
+ * 是否显示内置「风格切换下拉」(AppTheme 的 ElSelect);缺省 `true`。
465
+ *
466
+ * false 时仅隐藏风格下拉,**亮/暗/跟随系统三态切换恒显、不受此控**。风格下拉本就
467
+ * 仅在注册多风格(list.length>1)时出现,此开关用于「多风格已注册但不想让用户切风格」。
468
+ * 经 `bridge.showThemeStyleSwitcher` readonly 暴露,AppTheme 直读 `v-if` 自控。
469
+ */
470
+ showThemeStyleSwitcher?: boolean;
456
471
  /** app 嵌套路由树(必传,#4e additive;createUserStore 权限树依赖 children 嵌套,[MUST NOT] 传扁平化数据) */
457
472
  routes: RouteRecordRaw[];
458
473
  /** 用户信息空保底工厂(v3 终锁 Δ0b;恒返非空业务字段默认值对象,createUserStore useState 经此取初值,core 不锁业务 shape) */
@@ -551,6 +566,13 @@ export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
551
566
  * [MUST NOT] 解构/快照(⚠️ 切换 preset 后定格)。
552
567
  */
553
568
  readonly themeLayout: DeepReadonly<Ref<BridgeThemeLayoutState>>;
569
+ /**
570
+ * 当前密度档 / 动效档(响应式只读真相源;明暗无关)。
571
+ * `useAdminThemeApply` watch 此重写节奏 `<style>`;`theme.setStyle` 按 preset 复位、
572
+ * `theme.setDensity`/`setMotion` 直接改。[MUST NOT] 解构/快照。
573
+ */
574
+ readonly themeDensity: DeepReadonly<Ref<AdminThemeDensity>>;
575
+ readonly themeMotion: DeepReadonly<Ref<AdminThemeMotion>>;
554
576
  /**
555
577
  * 当前生效的 JS 主题色(输出 B:JS 色值直给,与挂值 composable 的 cssvar 输出 A 对称)。
556
578
  *
@@ -562,6 +584,8 @@ export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
562
584
  * [MUST NOT] 解构/快照(⚠️ 切换风格/明暗后定格)。
563
585
  */
564
586
  readonly themeColors: DeepReadonly<Ref<AppThemeColor>>;
587
+ /** 是否显示内置「风格切换下拉」(AppTheme ElSelect);init 静态值,缺省 true。亮暗切换恒显、不受此控。 */
588
+ readonly showThemeStyleSwitcher: boolean;
565
589
  /** 用户信息字段访问器集(业务注入;createUserStore 经 bridge.userInfoAccess.<字段>.get/set 读写,第一宪法 core 零字段耦合) */
566
590
  readonly userInfoAccess: UserInfoAccess<UserInfo>;
567
591
  /**
@@ -7,4 +7,4 @@ import { BridgeThemeHook, BridgeThemeInit } from './types';
7
7
  * `themeStyle` 走「desiredStyle 命中再 apply」时序(插件后注册风格亦能恢复)。
8
8
  */
9
9
  export declare function createBridgeThemeHook(init: BridgeThemeInit): BridgeThemeHook;
10
- export type { AdminThemePresetLayout, AdminConfigDescription, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminThemeEntry, AdminThemeMode, AdminThemeModule, BridgeThemeLayoutState, BridgeThemeHook, BridgeThemeLayoutBaseline, BridgeThemeInit, } from './types';
10
+ export type { AdminThemePresetLayout, AdminConfigDescription, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminThemeEntry, AdminThemeMode, AdminThemeModule, AdminThemeDensity, AdminThemeMotion, ElSize, AdminThemeComponentDefaults, BridgeThemeLayoutState, BridgeThemeHook, BridgeThemeLayoutBaseline, BridgeThemeInit, } from './types';
@@ -140,6 +140,62 @@ export interface AdminThemeEntry extends AdminThemeLifecycleHooks {
140
140
  * 见 {@link AdminThemePresetLayout}。
141
141
  */
142
142
  layout?: AdminThemePresetLayout;
143
+ /**
144
+ * 密度档(节奏维度);缺省 → 切到该 preset 复位为 `'cozy'`。
145
+ * 见 {@link AdminThemeDensity}。setStyle 时复位 + 应用(同 layout「基线复位 + 叠加」语义)。
146
+ */
147
+ density?: AdminThemeDensity;
148
+ /**
149
+ * 动效档(节奏维度);缺省 → 切到该 preset 复位为 `'standard'`。
150
+ * 见 {@link AdminThemeMotion}。
151
+ */
152
+ motion?: AdminThemeMotion;
153
+ /**
154
+ * 逐族 EP size 覆盖(**期二消费**,本期仅冻结数据形为焊缝);缺省不覆盖、走 density 档默认。
155
+ * 仅声明式 size/border/stripe,[MUST NOT] 收行为(design §9 表现 vs 行为边界)。
156
+ * 见 {@link AdminThemeComponentDefaults}。
157
+ */
158
+ componentDefaults?: AdminThemeComponentDefaults;
159
+ }
160
+ /**
161
+ * element-plus 组件尺寸档(透传给一等公民 size prop)。
162
+ */
163
+ export type ElSize = "large" | "default" | "small";
164
+ /**
165
+ * 密度档(persona 节奏维度):紧凑 / 适中 / 舒展。
166
+ * 整体平移全局留白 + 控件高 + 字号(取值见 design §2.1)。明暗无关。
167
+ */
168
+ export type AdminThemeDensity = "compact" | "cozy" | "comfortable";
169
+ /**
170
+ * 动效档(persona 节奏维度):急促 / 标准 / 舒缓。
171
+ * 整体换挡全局过渡时长 + 缓动(取值见 design §2.2)。reduced-motion 无条件压过。
172
+ */
173
+ export type AdminThemeMotion = "snappy" | "standard" | "calm";
174
+ /**
175
+ * 逐族 EP size 覆盖(componentDefaults,**期二真例外补丁**;本期仅冻结类型为焊缝)。
176
+ *
177
+ * 仅声明式 size 枚举 + table 的 border/stripe,[MUST NOT] 收任何行为 / handler /
178
+ * validator / 数据流(design §9 表现 vs 行为边界判据:persona 永不拥有行为)。
179
+ */
180
+ export interface AdminThemeComponentDefaults {
181
+ /** 表格族默认(size / 是否边框 / 是否斑马纹) */
182
+ table?: {
183
+ size?: ElSize;
184
+ border?: boolean;
185
+ stripe?: boolean;
186
+ };
187
+ /** 表单族默认(size;labelPosition 任务驱动、[MUST NOT] 入此) */
188
+ form?: {
189
+ size?: ElSize;
190
+ };
191
+ /** 弹窗族默认(size 档→ width 由组件内映射) */
192
+ modal?: {
193
+ size?: ElSize;
194
+ };
195
+ /** 操作按钮族默认(size) */
196
+ actionBtn?: {
197
+ size?: ElSize;
198
+ };
143
199
  }
144
200
  /**
145
201
  * 主题明暗模式三态:亮 / 暗 / 跟随系统。
@@ -170,6 +226,13 @@ export interface AdminThemeModule {
170
226
  * 新代码 [SHOULD] 用 {@link AdminThemeModule.setMode}(支持 `system` 第三态)。
171
227
  */
172
228
  setDark: (isDark: boolean) => void;
229
+ /**
230
+ * 直接设密度档(独立于风格切换;供 UI 偏好 / demo 切换器)。
231
+ * 注:`setStyle` 会按目标 preset 的 density 复位,故风格切换后手设的密度会被覆盖(同 layout 语义)。
232
+ */
233
+ setDensity: (density: AdminThemeDensity) => void;
234
+ /** 直接设动效档(独立于风格切换;语义同 {@link setDensity})。 */
235
+ setMotion: (motion: AdminThemeMotion) => void;
173
236
  /** 响应式风格名列表(只读,供 `AppTheme.vue` 下拉;`length>1` 才显示选择)。 */
174
237
  list: DeepReadonly<Ref<string[]>>;
175
238
  /** 取风格展示名(`add` 注册的 label;缺省回退 name 自身)。 */
@@ -209,6 +272,13 @@ export interface BridgeThemeHook {
209
272
  * 尺寸 / 套框纯数据维度经 setStyle 灌 bridge config,不在此重复。
210
273
  */
211
274
  themeLayout: DeepReadonly<Ref<BridgeThemeLayoutState>>;
275
+ /**
276
+ * 当前密度档(响应式只读真相源);`useAdminThemeApply` watch 此重写节奏 `<style>`。
277
+ * setStyle 按 preset.density 复位(缺省 `'cozy'`),或 `setDensity` 直接改。
278
+ */
279
+ themeDensity: DeepReadonly<Ref<AdminThemeDensity>>;
280
+ /** 当前动效档(响应式只读真相源);语义同 {@link themeDensity}(缺省 `'standard'`)。 */
281
+ themeMotion: DeepReadonly<Ref<AdminThemeMotion>>;
212
282
  }
213
283
  /**
214
284
  * 六组布局 config 的 init 基线快照(`setStyle` 复位 + 叠加用)。
@@ -255,4 +325,12 @@ export interface BridgeThemeInit {
255
325
  storage: StorageLike;
256
326
  /** 持久化 key(命名空间已由 storage 加前缀);缺省 `"admin-core-theme"` */
257
327
  storageKey?: string;
328
+ /**
329
+ * 明暗模式默认值(**仅无缓存时生效**);缺省 `"light"`。
330
+ *
331
+ * 读持久化命中 `themeMode` → 缓存优先覆盖本值(缓存语义不变);无缓存才回落到此。
332
+ * 业务侧经 `createAdminBridge({ defaultThemeMode })` 注入,如设 `"dark"` =
333
+ * 「首次进入(无缓存)默认暗色」、`"system"` =「默认跟随系统」。
334
+ */
335
+ defaultMode?: AdminThemeMode;
258
336
  }
@@ -10,7 +10,7 @@ type __VLS_Props = {
10
10
  adminBridge: AppLayoutBridgeSlice;
11
11
  appStore: AppLayoutAppStoreSlice;
12
12
  userStore: AppLayoutUserStoreSlice;
13
- /** 水印内容(空数组/空串/undefined 不展示);layout 不耦合 UserInfo shape,由业务侧派生 */
13
+ /** 水印内容(空数组/空串/undefined 不展示 = 关闭水印);layout 不耦合 UserInfo shape,由业务侧派生 */
14
14
  watermarkContent?: WatermarkProps["content"];
15
15
  /**
16
16
  * sidebar 层级是否高于 header(#7.5 期新增,默认 false)。
@@ -41,7 +41,7 @@ export type AppLayoutUserStoreSlice<UserInfo = Record<string, any>> = ReturnType
41
41
  * (getRoutes / generateRouteMetaRawTree)。loginApi / refreshToken 等 auth
42
42
  * 面不通过本 slice 暴露(业务侧通过 appAdminBridge 直读)。
43
43
  */
44
- export type AppLayoutBridgeSlice = Pick<AdminBridge, "APP_BASE_INFO" | "APP_ENV_INFO" | "APP_CACHE_CONFIG" | "APP_LAYOUT_HEADER_CONFIG" | "APP_LAYOUT_FOOTER_CONFIG" | "APP_LAYOUT_SIDEBAR_CONFIG" | "APP_LAYOUT_BREADCRUMB_CONFIG" | "APP_LAYOUT_BODY_CONFIG" | "APP_LAYOUT_VIEWPORT_CONFIG" | "APP_LAYOUT_GAP_CONFIG" | "APP_LAYOUT_CONFIG" | "APP_ROUTER_META_DEFAULT_CONFIG" | "APP_ROUTER_CONFIG" | "APP_ROUTER_PATHS_CONFIG" | "APP_THEME_CONFIG" | "theme" | "themeStyle" | "themeMode" | "themeIsDark" | "themeLayout" | "themeColors" | "getRoutes" | "generateRouteMetaRawTree">;
44
+ export type AppLayoutBridgeSlice = Pick<AdminBridge, "APP_BASE_INFO" | "APP_ENV_INFO" | "APP_CACHE_CONFIG" | "APP_LAYOUT_HEADER_CONFIG" | "APP_LAYOUT_FOOTER_CONFIG" | "APP_LAYOUT_SIDEBAR_CONFIG" | "APP_LAYOUT_BREADCRUMB_CONFIG" | "APP_LAYOUT_BODY_CONFIG" | "APP_LAYOUT_VIEWPORT_CONFIG" | "APP_LAYOUT_GAP_CONFIG" | "APP_LAYOUT_CONFIG" | "APP_ROUTER_META_DEFAULT_CONFIG" | "APP_ROUTER_CONFIG" | "APP_ROUTER_PATHS_CONFIG" | "APP_THEME_CONFIG" | "theme" | "themeStyle" | "themeMode" | "themeIsDark" | "themeLayout" | "themeDensity" | "themeMotion" | "themeColors" | "showThemeStyleSwitcher" | "getRoutes" | "generateRouteMetaRawTree">;
45
45
  /**
46
46
  * 内容锚 slot 名集(焊缝契约 ③,纯功能语义;P1' 去布局化重做)。
47
47
  *
@@ -1,11 +1,28 @@
1
1
  import { DeepReadonly } from 'vue';
2
- import { AppThemeConfig } from '../bridge';
2
+ import { AppThemeConfig, AdminThemeDensity, AdminThemeMotion } from '../bridge';
3
+ /**
4
+ * 构建节奏 `<style>` 文本:单 `:root{}` 块(明暗无关,[MUST NOT] 进 `:root.dark`)
5
+ * + reduced-motion 兜底块(无条件压过三档,design §2.3)。
6
+ *
7
+ * dual-write 规格(design §3):control-height→`--el-component-size`、font-base→
8
+ * `--el-font-size-base`、motion-duration→`--el-transition-duration-fast`、
9
+ * duration-slow→`--el-transition-duration`、easing→两个 EP bezier。spacing 四 token
10
+ * EP 无对应、仅挂 admin-core(EP 内部写死间距由 §3.1 受控桥接样式重映射)。
11
+ */
12
+ export declare function buildRhythmCss(density: AdminThemeDensity, motion: AdminThemeMotion): string;
3
13
  /** `useAdminThemeApply` 入参。 */
4
14
  export interface UseAdminThemeApplyOptions {
5
15
  /** 当前风格 config 响应式获取器(= `bridge.APP_THEME_CONFIG`,含 light/dark) */
6
16
  getThemeConfig: () => AppThemeConfig | DeepReadonly<AppThemeConfig>;
7
17
  /** 是否暗色响应式获取器(= `bridge.themeIsDark.value`) */
8
18
  getThemeIsDark: () => boolean;
19
+ /**
20
+ * 当前密度档响应式获取器(= `bridge.themeDensity.value`)。
21
+ * 与 {@link getThemeMotion} **同时**提供才注入节奏 `<style>`;缺省 → 不挂节奏(向后兼容)。
22
+ */
23
+ getThemeDensity?: () => AdminThemeDensity;
24
+ /** 当前动效档响应式获取器(= `bridge.themeMotion.value`);语义同 {@link getThemeDensity}。 */
25
+ getThemeMotion?: () => AdminThemeMotion;
9
26
  /** 注入 document(测试 / SSR);缺省 `globalThis.document`,不存在时静默跳过 */
10
27
  document?: Document;
11
28
  }