@done-coding/admin-core 0.26.1 → 0.27.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 (32) hide show
  1. package/es/bridge/badge.mjs +5 -0
  2. package/es/bridge/index.mjs +2 -0
  3. package/es/bridge/theme/index.mjs +6 -1
  4. package/es/components/app-layout/AppHeader.vue.mjs +1 -1
  5. package/es/components/app-layout/AppHeader.vue2.mjs +2 -1
  6. package/es/components/display/ActionBtn.vue.mjs +6 -2
  7. package/es/components/display/BadgeMark.vue.mjs +1 -1
  8. package/es/components/display/BadgeMark.vue2.mjs +39 -6
  9. package/es/components/display/TabsTile.vue.mjs +1 -1
  10. package/es/components/display/TabsTile.vue2.mjs +1 -0
  11. package/es/components/display/use-badge-mask.mjs +83 -0
  12. package/es/components/display/use-badge.mjs +32 -5
  13. package/es/components/icon/IconHammer.vue.mjs +26 -0
  14. package/es/components/icon/IconHammer.vue2.mjs +4 -0
  15. package/es/components/menu/MenuItemSub.vue.mjs +4 -2
  16. package/es/components/menu/MenuTree.vue.mjs +4 -2
  17. package/es/index.mjs +120 -116
  18. package/es/style.css +25 -20
  19. package/package.json +2 -2
  20. package/src/bridge/docs/README.md +22 -0
  21. package/src/components/icon/README.md +38 -0
  22. package/types/bridge/badge.d.ts +29 -1
  23. package/types/bridge/index.d.ts +1 -0
  24. package/types/bridge/theme/types.d.ts +11 -0
  25. package/types/components/display/BadgeMark.vue.d.ts +153 -2
  26. package/types/components/display/TabsTile.vue.d.ts +2 -2
  27. package/types/components/display/use-badge-mask.d.ts +8 -0
  28. package/types/components/display/use-badge.d.ts +13 -1
  29. package/types/components/icon/IconHammer.vue.d.ts +2 -0
  30. package/types/components/icon/index.d.ts +7 -0
  31. package/types/index.d.ts +1 -0
  32. package/types/injectInfo.json.d.ts +1 -1
package/es/index.mjs CHANGED
@@ -14,74 +14,76 @@ import { default as default15 } from "./components/form/FormSubmitBtn.vue.mjs";
14
14
  import { default as default16 } from "./components/form/FormTree.vue.mjs";
15
15
  import { default as default17 } from "./components/form/FormVerifyCode.vue.mjs";
16
16
  import { default as default18 } from "./components/display/HeightProvider.vue.mjs";
17
- import { default as default19 } from "./components/modal/ImagePreviewTrigger.vue.mjs";
18
- import { default as default20 } from "./components/menu/MenuItemSub.vue.mjs";
19
- import { default as default21 } from "./components/menu/MenuTree.vue.mjs";
20
- import { default as default22 } from "./components/modal/ModalImagePreview.vue.mjs";
21
- import { default as default23 } from "./components/modal/ModalPorter.vue.mjs";
22
- import { default as default24 } from "./components/modal/ModalShelf.vue.mjs";
23
- import { default as default25 } from "./components/panel/PanelItemNestPanel.vue.mjs";
24
- import { default as default26 } from "./components/misc/SelectModule.vue.mjs";
25
- import { default as default27 } from "./components/display/ShadowClone.vue.mjs";
26
- import { default as default28 } from "./components/slot-layout/SlotLayoutTemplate.vue.mjs";
27
- import { default as default29 } from "./components/table/TableEmpty.vue.mjs";
28
- import { default as default30 } from "./components/display/TabsMain.vue.mjs";
29
- import { default as default31 } from "./components/misc/TriggerAutoImport.vue.mjs";
30
- import { default as default32 } from "./components/display/WatchSize.vue.mjs";
17
+ import { default as default19 } from "./components/icon/IconHammer.vue.mjs";
18
+ import { default as default20 } from "./components/modal/ImagePreviewTrigger.vue.mjs";
19
+ import { default as default21 } from "./components/menu/MenuItemSub.vue.mjs";
20
+ import { default as default22 } from "./components/menu/MenuTree.vue.mjs";
21
+ import { default as default23 } from "./components/modal/ModalImagePreview.vue.mjs";
22
+ import { default as default24 } from "./components/modal/ModalPorter.vue.mjs";
23
+ import { default as default25 } from "./components/modal/ModalShelf.vue.mjs";
24
+ import { default as default26 } from "./components/panel/PanelItemNestPanel.vue.mjs";
25
+ import { default as default27 } from "./components/misc/SelectModule.vue.mjs";
26
+ import { default as default28 } from "./components/display/ShadowClone.vue.mjs";
27
+ import { default as default29 } from "./components/slot-layout/SlotLayoutTemplate.vue.mjs";
28
+ import { default as default30 } from "./components/table/TableEmpty.vue.mjs";
29
+ import { default as default31 } from "./components/display/TabsMain.vue.mjs";
30
+ import { default as default32 } from "./components/misc/TriggerAutoImport.vue.mjs";
31
+ import { default as default33 } from "./components/display/WatchSize.vue.mjs";
31
32
  import { APP_API_LIST_MODEL_KEY_CONFIG } from "./config/list-model.mjs";
32
33
  import { APP_GLOBAL_IMAGE_PREVIEW_KEY, APP_GLOBAL_VIDEO_PREVIEW_KEY, GLOBAL_MODAL_REMOTE_KEY } from "./components/modal/modal-global-keys.mjs";
33
34
  import { APP_LAYOUT_APP_STORE_KEY, APP_LAYOUT_BRIDGE_KEY, APP_LAYOUT_USER_STORE_KEY, APP_PAGE_CONTENT_INSET, APP_PAGE_LIST_DETAIL_CONTEXT, BODY_CONTENT_VIEWPORT_HEIGHT, BODY_CONTENT_VIEWPORT_INSET, BODY_CONTENT_VIEWPORT_RECT, CORE_BRIDGE_KEY, FORM_NEST_REGISTRY_KEY, NEST_LAYOUT_SCALE_KEY, SCOPE_VIEWPORT_MAX_HEIGHT, TABS_MAIN_VISUAL_LEVEL, getModalShelfInjectionKey } from "./inject/key.mjs";
34
35
  import { APP_PAGE_SLOT_Z_INDEX, computeAppPageContentInset, computeAppPageReducedViewportHeight, computeAppPageReducedViewportWidth, computeAppPageSlotShimStyles, computeAppPageSlotStyles } from "./components/app-layout/app-page-geometry.mjs";
35
- import { default as default33 } from "./components/display/ActionConfirm.vue.mjs";
36
- import { default as default34 } from "./components/app-layout/AppAside.vue.mjs";
37
- import { default as default35 } from "./components/app-layout/AppBody.vue.mjs";
38
- import { default as default36 } from "./components/app-layout/AppBreadcrumb.vue.mjs";
39
- import { default as default37 } from "./components/app-layout/AppFooter.vue.mjs";
40
- import { default as default38 } from "./components/app-layout/AppHeader.vue.mjs";
41
- import { default as default39 } from "./components/app-layout/AppLayout.vue.mjs";
42
- import { default as default40 } from "./components/app-layout/AppPage.vue.mjs";
43
- import { default as default41 } from "./components/page-layout/AppPageDetail.vue.mjs";
44
- import { default as default42 } from "./components/app-layout/AppSidebar.vue.mjs";
45
- import { default as default43 } from "./components/app-layout/AppTheme.vue.mjs";
46
- import { default as default44 } from "./components/misc/AutoRefresh.vue.mjs";
47
- import { default as default45 } from "./components/misc/AutoRefreshGroup.vue.mjs";
48
- import { default as default46 } from "./components/display/BadgeMark.vue.mjs";
36
+ import { default as default34 } from "./components/display/ActionConfirm.vue.mjs";
37
+ import { default as default35 } from "./components/app-layout/AppAside.vue.mjs";
38
+ import { default as default36 } from "./components/app-layout/AppBody.vue.mjs";
39
+ import { default as default37 } from "./components/app-layout/AppBreadcrumb.vue.mjs";
40
+ import { default as default38 } from "./components/app-layout/AppFooter.vue.mjs";
41
+ import { default as default39 } from "./components/app-layout/AppHeader.vue.mjs";
42
+ import { default as default40 } from "./components/app-layout/AppLayout.vue.mjs";
43
+ import { default as default41 } from "./components/app-layout/AppPage.vue.mjs";
44
+ import { default as default42 } from "./components/page-layout/AppPageDetail.vue.mjs";
45
+ import { default as default43 } from "./components/app-layout/AppSidebar.vue.mjs";
46
+ import { default as default44 } from "./components/app-layout/AppTheme.vue.mjs";
47
+ import { default as default45 } from "./components/misc/AutoRefresh.vue.mjs";
48
+ import { default as default46 } from "./components/misc/AutoRefreshGroup.vue.mjs";
49
+ import { BADGE_MASK_KINDS } from "./bridge/badge.mjs";
50
+ import { default as default47 } from "./components/display/BadgeMark.vue.mjs";
49
51
  import { CORE_VIEWPORT_DECOR_ZINDEX_ABOVE, CORE_VIEWPORT_DECOR_ZINDEX_BELOW } from "./components/app-layout/viewport.mjs";
50
- import { default as default47, default as default48 } from "./components/modal/ModalConfirm.vue.mjs";
52
+ import { default as default48, default as default49 } from "./components/modal/ModalConfirm.vue.mjs";
51
53
  import { DC_SLOT_ATTR, SlotRegion, parseSlotRegion } from "./config/slot-region.mjs";
52
- import { default as default49 } from "./components/data-view/DataGridView.vue.mjs";
54
+ import { default as default50 } from "./components/data-view/DataGridView.vue.mjs";
53
55
  import { EXPORT_MAX_LIMIT, OPERATE_COLUMN_PROP, exportCSV, pickExportColumns } from "./utils/export.mjs";
54
56
  import { FORM_CONFIG_SELECT_ALL_VALUE, getConfirmPasswordRule, passwordRule, setFormComponentType } from "./helpers/form.mjs";
55
57
  import { FORM_ITEM_CHANGE_LOADING, NEST_LAYOUT_TIERS, ceilToTier, generateFormData, getBlurSubmit, getChangeSubmit, getDatePickerShortcuts, getEnterSubmit, getPlaceholder, getVModelSugar, parseFormData, resolveFormLayout, resolveLayoutSpan, setInputComponent, setSelectComponent, stringifyFormData, swiftFormItemConfig } from "./components/form/utils.mjs";
56
- import { default as default50 } from "./components/form/FormActiveFilter.vue.mjs";
57
- import { default as default51 } from "./components/form/FormItemNestForm.vue.mjs";
58
- import { default as default52 } from "./components/form/FormItemNestFormList.vue.mjs";
59
- import { default as default53 } from "./components/form/FormMain.vue.mjs";
60
- import { default as default54 } from "./components/form/FormSearch.vue.mjs";
61
- import { default as default55 } from "./components/form/FormShadowCloneDispatch.vue.mjs";
62
- import { default as default56 } from "./components/form/FormSortSwitch.vue.mjs";
63
- import { default as default57 } from "./components/form/FormSortSwitchGroup.vue.mjs";
64
- import { default as default58 } from "./components/form/FormSubmitPanel.vue.mjs";
65
- import { default as default59 } from "./components/form/FormUpload.vue.mjs";
66
- import { default as default60 } from "./components/form/FormUploadAudio.vue.mjs";
67
- import { default as default61 } from "./components/form/FormUploadImage.vue.mjs";
68
- import { default as default62 } from "./components/form/FormUploadVideo.vue.mjs";
69
- import { default as default63 } from "./components/form/FormVerifyImage.vue.mjs";
70
- import { default as default64 } from "./components/data-view/InfiniteListView.vue.mjs";
71
- import { default as default65, default as default66 } from "./components/list-layout/ListLayout.vue.mjs";
72
- import { default as default67 } from "./components/modal/ModalVideoPreview.vue.mjs";
73
- import { default as default68 } from "./components/panel/PanelEditSwitch.vue.mjs";
74
- import { default as default69 } from "./components/panel/PanelItem.vue.mjs";
75
- import { default as default70 } from "./components/panel/PanelItemNestForm.vue.mjs";
76
- import { default as default71 } from "./components/panel/PanelMain.vue.mjs";
58
+ import { default as default51 } from "./components/form/FormActiveFilter.vue.mjs";
59
+ import { default as default52 } from "./components/form/FormItemNestForm.vue.mjs";
60
+ import { default as default53 } from "./components/form/FormItemNestFormList.vue.mjs";
61
+ import { default as default54 } from "./components/form/FormMain.vue.mjs";
62
+ import { default as default55 } from "./components/form/FormSearch.vue.mjs";
63
+ import { default as default56 } from "./components/form/FormShadowCloneDispatch.vue.mjs";
64
+ import { default as default57 } from "./components/form/FormSortSwitch.vue.mjs";
65
+ import { default as default58 } from "./components/form/FormSortSwitchGroup.vue.mjs";
66
+ import { default as default59 } from "./components/form/FormSubmitPanel.vue.mjs";
67
+ import { default as default60 } from "./components/form/FormUpload.vue.mjs";
68
+ import { default as default61 } from "./components/form/FormUploadAudio.vue.mjs";
69
+ import { default as default62 } from "./components/form/FormUploadImage.vue.mjs";
70
+ import { default as default63 } from "./components/form/FormUploadVideo.vue.mjs";
71
+ import { default as default64 } from "./components/form/FormVerifyImage.vue.mjs";
72
+ import { default as default65 } from "./components/data-view/InfiniteListView.vue.mjs";
73
+ import { default as default66, default as default67 } from "./components/list-layout/ListLayout.vue.mjs";
74
+ import { default as default68 } from "./components/modal/ModalVideoPreview.vue.mjs";
75
+ import { default as default69 } from "./components/panel/PanelEditSwitch.vue.mjs";
76
+ import { default as default70 } from "./components/panel/PanelItem.vue.mjs";
77
+ import { default as default71 } from "./components/panel/PanelItemNestForm.vue.mjs";
78
+ import { default as default72 } from "./components/panel/PanelMain.vue.mjs";
77
79
  import { ROUTE_MODULE_LEVEL, TabsMainReplaceQueryKey } from "./config/route.mjs";
78
- import { default as default72 } from "./components/slot-layout/SlotLayoutFlowAside.vue.mjs";
80
+ import { default as default73 } from "./components/slot-layout/SlotLayoutFlowAside.vue.mjs";
79
81
  import { TABLE_COLUMN_KEY_OPERATE, TABLE_COLUMN_KEY_SELECTION } from "./components/table/constants.mjs";
80
- import { default as default73 } from "./components/table/TableMain.vue.mjs";
81
- import { default as default74 } from "./components/table/TableSkeleton.vue.mjs";
82
- import { default as default75 } from "./components/table/TableToolbar.vue.mjs";
83
- import { default as default76 } from "./components/modal/VideoPreviewTrigger.vue.mjs";
84
- import { default as default77 } from "./components/view-layout/ViewLayout.vue.mjs";
82
+ import { default as default74 } from "./components/table/TableMain.vue.mjs";
83
+ import { default as default75 } from "./components/table/TableSkeleton.vue.mjs";
84
+ import { default as default76 } from "./components/table/TableToolbar.vue.mjs";
85
+ import { default as default77 } from "./components/modal/VideoPreviewTrigger.vue.mjs";
86
+ import { default as default78 } from "./components/view-layout/ViewLayout.vue.mjs";
85
87
  import { buildRhythmCss, useCoreThemeApply } from "./hooks/use-theme-apply.mjs";
86
88
  import { checkLogin } from "./router/guard/login.mjs";
87
89
  import { checkPermission } from "./router/guard/permission.mjs";
@@ -128,102 +130,104 @@ export {
128
130
  APP_PAGE_SLOT_Z_INDEX,
129
131
  default2 as ActionBtn,
130
132
  default3 as ActionBtnGroup,
131
- default33 as ActionConfirm,
132
- default34 as AppAside,
133
- default35 as AppBody,
134
- default36 as AppBreadcrumb,
135
- default37 as AppFooter,
136
- default38 as AppHeader,
137
- default39 as AppLayout,
138
- default40 as AppPage,
139
- default41 as AppPageDetail,
133
+ default34 as ActionConfirm,
134
+ default35 as AppAside,
135
+ default36 as AppBody,
136
+ default37 as AppBreadcrumb,
137
+ default38 as AppFooter,
138
+ default39 as AppHeader,
139
+ default40 as AppLayout,
140
+ default41 as AppPage,
141
+ default42 as AppPageDetail,
140
142
  default4 as AppPageListDetailLayout,
141
- default42 as AppSidebar,
142
- default43 as AppTheme,
143
- default44 as AutoRefresh,
144
- default45 as AutoRefreshGroup,
143
+ default43 as AppSidebar,
144
+ default44 as AppTheme,
145
+ default45 as AutoRefresh,
146
+ default46 as AutoRefreshGroup,
147
+ BADGE_MASK_KINDS,
145
148
  BODY_CONTENT_VIEWPORT_HEIGHT,
146
149
  BODY_CONTENT_VIEWPORT_INSET,
147
150
  BODY_CONTENT_VIEWPORT_RECT,
148
- default46 as BadgeMark,
151
+ default47 as BadgeMark,
149
152
  default5 as BooleanTag,
150
153
  CORE_BRIDGE_KEY,
151
154
  CORE_VIEWPORT_DECOR_ZINDEX_ABOVE,
152
155
  CORE_VIEWPORT_DECOR_ZINDEX_BELOW,
153
- default47 as ConfirmModal,
156
+ default48 as ConfirmModal,
154
157
  DC_SLOT_ATTR,
155
- default49 as DataGridView,
158
+ default50 as DataGridView,
156
159
  default6 as DetailModal,
157
160
  EXPORT_MAX_LIMIT,
158
161
  FORM_CONFIG_SELECT_ALL_VALUE,
159
162
  FORM_ITEM_CHANGE_LOADING,
160
163
  FORM_NEST_REGISTRY_KEY,
161
- default50 as FormActiveFilter,
164
+ default51 as FormActiveFilter,
162
165
  default8 as FormInput,
163
166
  default9 as FormInputShadowClone,
164
- default51 as FormItemNestForm,
165
- default52 as FormItemNestFormList,
166
- default53 as FormMain,
167
+ default52 as FormItemNestForm,
168
+ default53 as FormItemNestFormList,
169
+ default54 as FormMain,
167
170
  default10 as FormModal,
168
171
  default12 as FormRadioGroup,
169
- default54 as FormSearch,
172
+ default55 as FormSearch,
170
173
  default13 as FormSelect,
171
174
  default14 as FormSelectShadowClone,
172
- default55 as FormShadowCloneDispatch,
173
- default56 as FormSortSwitch,
174
- default57 as FormSortSwitchGroup,
175
+ default56 as FormShadowCloneDispatch,
176
+ default57 as FormSortSwitch,
177
+ default58 as FormSortSwitchGroup,
175
178
  default15 as FormSubmitBtn,
176
- default58 as FormSubmitPanel,
179
+ default59 as FormSubmitPanel,
177
180
  default16 as FormTree,
178
- default59 as FormUpload,
179
- default60 as FormUploadAudio,
180
- default61 as FormUploadImage,
181
- default62 as FormUploadVideo,
181
+ default60 as FormUpload,
182
+ default61 as FormUploadAudio,
183
+ default62 as FormUploadImage,
184
+ default63 as FormUploadVideo,
182
185
  default17 as FormVerifyCode,
183
- default63 as FormVerifyImage,
186
+ default64 as FormVerifyImage,
184
187
  GLOBAL_MODAL_REMOTE_KEY,
185
188
  default18 as HeightProvider,
186
- default19 as ImagePreviewTrigger,
187
- default64 as InfiniteListView,
188
- default65 as ListLayout,
189
- default66 as ListPage,
190
- default20 as MenuItemSub,
191
- default21 as MenuTree,
192
- default48 as ModalConfirm,
189
+ default19 as IconHammer,
190
+ default20 as ImagePreviewTrigger,
191
+ default65 as InfiniteListView,
192
+ default66 as ListLayout,
193
+ default67 as ListPage,
194
+ default21 as MenuItemSub,
195
+ default22 as MenuTree,
196
+ default49 as ModalConfirm,
193
197
  default7 as ModalDetail,
194
198
  default11 as ModalForm,
195
- default22 as ModalImagePreview,
196
- default23 as ModalPorter,
197
- default24 as ModalShelf,
198
- default67 as ModalVideoPreview,
199
+ default23 as ModalImagePreview,
200
+ default24 as ModalPorter,
201
+ default25 as ModalShelf,
202
+ default68 as ModalVideoPreview,
199
203
  NEST_LAYOUT_SCALE_KEY,
200
204
  NEST_LAYOUT_TIERS,
201
205
  OPERATE_COLUMN_PROP,
202
- default68 as PanelEditSwitch,
203
- default69 as PanelItem,
204
- default70 as PanelItemNestForm,
205
- default25 as PanelItemNestPanel,
206
- default71 as PanelMain,
206
+ default69 as PanelEditSwitch,
207
+ default70 as PanelItem,
208
+ default71 as PanelItemNestForm,
209
+ default26 as PanelItemNestPanel,
210
+ default72 as PanelMain,
207
211
  ROUTE_MODULE_LEVEL,
208
212
  SCOPE_VIEWPORT_MAX_HEIGHT,
209
- default26 as SelectModule,
210
- default27 as ShadowClone,
211
- default72 as SlotLayoutFlowAside,
212
- default28 as SlotLayoutTemplate,
213
+ default27 as SelectModule,
214
+ default28 as ShadowClone,
215
+ default73 as SlotLayoutFlowAside,
216
+ default29 as SlotLayoutTemplate,
213
217
  SlotRegion,
214
218
  TABLE_COLUMN_KEY_OPERATE,
215
219
  TABLE_COLUMN_KEY_SELECTION,
216
220
  TABS_MAIN_VISUAL_LEVEL,
217
- default29 as TableEmpty,
218
- default73 as TableMain,
219
- default74 as TableSkeleton,
220
- default75 as TableToolbar,
221
- default30 as TabsMain,
221
+ default30 as TableEmpty,
222
+ default74 as TableMain,
223
+ default75 as TableSkeleton,
224
+ default76 as TableToolbar,
225
+ default31 as TabsMain,
222
226
  TabsMainReplaceQueryKey,
223
- default31 as TriggerAutoImport,
224
- default76 as VideoPreviewTrigger,
225
- default77 as ViewLayout,
226
- default32 as WatchSize,
227
+ default32 as TriggerAutoImport,
228
+ default77 as VideoPreviewTrigger,
229
+ default78 as ViewLayout,
230
+ default33 as WatchSize,
227
231
  buildRhythmCss,
228
232
  ceilToTier,
229
233
  checkLogin,
package/es/style.css CHANGED
@@ -66,13 +66,18 @@
66
66
  justify-content: flex-end;
67
67
  gap: 8px;
68
68
  }
69
- .badge-mark[data-v-12868883] .el-badge__content.is-fixed {
69
+ .badge-mark[data-v-4116ac36] .el-badge__content.is-fixed {
70
70
  right: 0;
71
71
  transform: translateY(-50%) translateX(calc(100% + 2px));
72
72
  }
73
- .badge-mark_middle[data-v-12868883] .el-badge__content.is-fixed {
73
+ .badge-mark_middle[data-v-4116ac36] .el-badge__content.is-fixed {
74
74
  top: 50%;
75
75
  }
76
+ .badge-mark[data-v-4116ac36] .badge-mark__icon {
77
+ display: block;
78
+ font-size: 1em;
79
+ line-height: 1;
80
+ }
76
81
  .app-page[data-v-3ef165a7] {
77
82
  --dc-page-content-viewport-top: var(--v6b53f4c2);
78
83
  --dc-page-content-viewport-bottom: var(--v1c770cbe);
@@ -415,23 +420,23 @@ to {
415
420
  color: var(--dc-core-primary-color);
416
421
  font-weight: 600;
417
422
  }
418
- .dc-tabs-tile--nav-absolute[data-v-acb4bb13],
419
- .dc-tabs-tile--nav-fixed[data-v-acb4bb13] {
423
+ .dc-tabs-tile--nav-absolute[data-v-9b8e85b8],
424
+ .dc-tabs-tile--nav-fixed[data-v-9b8e85b8] {
420
425
  position: relative;
421
426
  }
422
- .dc-tabs-tile--nav-sticky[data-v-acb4bb13] {
427
+ .dc-tabs-tile--nav-sticky[data-v-9b8e85b8] {
423
428
  display: flex;
424
429
  flex-direction: column;
425
430
  }
426
- .dc-tabs-tile__scroll[data-v-acb4bb13] {
431
+ .dc-tabs-tile__scroll[data-v-9b8e85b8] {
427
432
  display: flex;
428
433
  flex-direction: column;
429
434
  gap: 12px;
430
435
  }
431
- .dc-tabs-tile__card[data-v-acb4bb13] {
436
+ .dc-tabs-tile__card[data-v-9b8e85b8] {
432
437
  width: 100%;
433
438
  }
434
- .dc-tabs-tile__nav[data-v-acb4bb13] {
439
+ .dc-tabs-tile__nav[data-v-9b8e85b8] {
435
440
  z-index: 2;
436
441
  max-height: 60%;
437
442
  overflow: auto;
@@ -536,7 +541,7 @@ to {
536
541
  height: 100%;
537
542
  padding: 0 20px;
538
543
  }
539
- .app-header[data-v-40b13903] {
544
+ .app-header[data-v-d887bc4c] {
540
545
  transition-duration: 0.3s;
541
546
  transition-property: height;
542
547
  transition-timing-function: linear;
@@ -544,13 +549,13 @@ to {
544
549
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow));
545
550
  z-index: 1;
546
551
  }
547
- .app-header-module[data-v-40b13903] {
552
+ .app-header-module[data-v-d887bc4c] {
548
553
  display: flex;
549
554
  flex: 1;
550
555
  height: 100%;
551
556
  overflow-x: auto;
552
557
  }
553
- .app-header-module-item[data-v-40b13903] {
558
+ .app-header-module-item[data-v-d887bc4c] {
554
559
  display: flex;
555
560
  justify-content: center;
556
561
  align-items: center;
@@ -558,24 +563,24 @@ to {
558
563
  white-space: nowrap;
559
564
  height: 100%;
560
565
  }
561
- .app-header-module-item[data-v-40b13903]:hover,
562
- .app-header-module-item_active[data-v-40b13903] {
563
- color: var(--v05959ac0);
566
+ .app-header-module-item[data-v-d887bc4c]:hover,
567
+ .app-header-module-item_active[data-v-d887bc4c] {
568
+ color: var(--v7733782f);
564
569
  }
565
- .app-header-module-item_active[data-v-40b13903] {
570
+ .app-header-module-item_active[data-v-d887bc4c] {
566
571
  position: relative;
567
572
  }
568
- .app-header-module-item_active[data-v-40b13903]::before {
573
+ .app-header-module-item_active[data-v-d887bc4c]::before {
569
574
  content: "";
570
575
  position: absolute;
571
576
  left: 50%;
572
577
  top: 0;
573
578
  width: 100%;
574
579
  height: 3px;
575
- background-color: var(--v05959ac0);
580
+ background-color: var(--v7733782f);
576
581
  transform: translateX(-50%);
577
582
  }
578
- .app-header-shim[data-v-40b13903] {
583
+ .app-header-shim[data-v-d887bc4c] {
579
584
  width: 100%;
580
585
  height: 100%;
581
586
  display: flex;
@@ -585,10 +590,10 @@ to {
585
590
  font-size: 18px;
586
591
  font-weight: bold;
587
592
  }
588
- .app-header-module-item__icon[data-v-40b13903] {
593
+ .app-header-module-item__icon[data-v-d887bc4c] {
589
594
  margin-right: 8px;
590
595
  }
591
- .app-header-right[data-v-40b13903] {
596
+ .app-header-right[data-v-d887bc4c] {
592
597
  padding-left: 80px;
593
598
  display: flex;
594
599
  align-items: center;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.26.1",
3
+ "version": "0.27.0",
4
4
  "description": "内部前端库",
5
5
  "private": false,
6
6
  "main": "es/index.mjs",
@@ -83,5 +83,5 @@
83
83
  "dependencies": {
84
84
  "@tanstack/vue-virtual": "^3.13.35"
85
85
  },
86
- "gitHead": "413474bbb4f32f343d3cfa990815985518729ef1"
86
+ "gitHead": "2c445676329b49413fcb729f224638ecec4c0e06"
87
87
  }
@@ -50,6 +50,28 @@ appCoreBridge.theme.setStyle("studio-stage");
50
50
  appCoreBridge.theme.setDark(true);
51
51
  ```
52
52
 
53
+ ### 明暗覆盖(`theme.setDarkOverride`)
54
+
55
+ 明暗有两层:`theme.setMode` / `setDark` 改的是**用户偏好**(写缓存、下次启动恢复);
56
+ `theme.setDarkOverride` 改的是**当前会话的临时覆盖**——压过 mode 派生,但 [MUST NOT]
57
+ 触达 storage、[MUST NOT] 改 `themeMode`。
58
+
59
+ ```ts
60
+ appCoreBridge.theme.setDarkOverride(true); // 临时暗色(不写缓存)
61
+ appCoreBridge.theme.setDarkOverride(); // 无参清除覆盖,回落用户偏好
62
+ ```
63
+
64
+ 典型场景:本应用被宿主以 iframe 嵌入(如 SSO 登录页),明暗须跟随宿主临时接管,
65
+ 而该应用**独立打开时仍按自己缓存的偏好**。
66
+
67
+ 覆盖期间 `themeIsDark` / `themeColors` / `<html>.dark` 全部跟随覆盖值(无「视觉暗、
68
+ 状态亮」的脱钩);明暗切换控件仍显示 `themeMode`,即用户自己的偏好——语义上就该如此:
69
+ 偏好没变,只是当前被宿主接管。
70
+
71
+ [MUST NOT] 用 `setDark` 模拟临时覆盖:`persist()` 写的是 `themeStyle + themeMode` 整条
72
+ payload,覆盖值一旦进了 `themeMode`,后续任何一次 `setStyle`(含插件风格异步注册时
73
+ `add` 内自动触发的那次)都会把它顺手写进缓存、污染独立打开时的偏好。
74
+
53
75
  ## 徽标注册表(`bridge.badge`)
54
76
 
55
77
  一张扁平的 `key → 标记` 表;菜单项与 `ActionBtn` 按 key 查表渲染**绝对定位角标**(跟在文案右侧,**不压字**,且[MUST] 不改变宿主尺寸)。
@@ -0,0 +1,38 @@
1
+ # components/icon — 图标族
2
+
3
+ core 自带的图标组件族。**只收 element-plus 图标集缺失、且语义上非它不可的那几个**——
4
+ [MUST NOT] 把 EP 已有的图标在这里再画一遍(那是纯重复,且两套观感会打架)。
5
+
6
+ ## 准入判据
7
+
8
+ 新增一个图标前 [MUST] 先答这两问:
9
+
10
+ 1. **EP 图标集里真的没有吗?** 全量清单见 `@element-plus/icons-vue`。有就直接用 EP 的。
11
+ 2. **换一个近似的 EP 图标真的不行吗?** 「近似但会被读错」才算不行(如 `Tools` 被读成设置),
12
+ 「不够好看」不算。
13
+
14
+ ## 优先取开源图标集的形,[MUST NOT] 手画
15
+
16
+ 小尺寸图标的辨识度高度依赖剪影,手画的几何形在 12px 下几乎必然糊(实测:手画的轴对齐
17
+ T 形锤被甲方判「太丑」,换成斜置羊角锤即可读)。故 [MUST] 先从成熟开源集(Bootstrap Icons /
18
+ Lucide / Material Symbols 等,许可证需 MIT / ISC / Apache-2.0 一类)取被大量验证过的形,
19
+ **只抄单条 path、[MUST NOT] 引整包依赖**(我们一次只要一个图标)。
20
+
21
+ [MUST] 在组件注释里写明**来源 + 许可证 + 版权行**。风格上优先取 **fill 实心**版本——
22
+ EP 图标是实心的,描边版(如 Lucide)在 12px 下偏细、与 EP 混排会打架。
23
+
24
+ ## 写作约定
25
+
26
+ - **颜色 [MUST] 用 `fill="currentColor"`**:继承父级 `color`,天然随主题风格 / 亮暗 / 语义色档走。
27
+ [MUST NOT] 写死色值、[MUST NOT] 自造 CSS 变量(规则 14)。
28
+ - **尺寸 [MUST] 用 `width/height="1em"`**:外面套 `ElIcon` 调 `font-size` 即可缩放,
29
+ [MUST NOT] 写死 px。`viewBox` **随图标源**,不强求与 EP 的 1024 一致——渲染尺寸由 1em 决定,
30
+ 换算坐标只会徒增手抄出错的风险。
31
+ - **根元素 [MUST] 带 `dc-<组件名-kebab>` 类**(规则 17),与内部裸类并存。
32
+ - `aria-hidden="true"` + `focusable="false"`:图标是装饰,语义由宿主(或悬浮气泡)承担。
33
+
34
+ ## 清单
35
+
36
+ | 组件 | 用途 | 为什么不用 EP 的 |
37
+ |---|---|---|
38
+ | `IconHammer` | 施工 / 开发中(`bridge.badge` 的 `wip` 档) | EP 无锤子;最接近的 `Tools` 是扳手+齿轮,被读成「设置」。取自 Bootstrap Icons `hammer`(MIT) |
@@ -50,6 +50,28 @@ export type BadgeEntry = {
50
50
  * @example "批量导出订单为 Excel。适合按月对账;单次超 10 万行会超时,内测期不建议用于生产对账。"
51
51
  */
52
52
  description?: string;
53
+ /**
54
+ * 被遮挡的标被触发时的回调(点宿主 / 点角标都算触发)。
55
+ *
56
+ * **[MUST] 只有 `wip` / `locked` 两档会调用它**——只有这两档会遮挡宿主交互,
57
+ * 其余 kind 是纯展示、宿主照常可点,没有"被拦下的那次点击"可供回调。
58
+ * 字段放在共享段(而非收窄进那两个 kind)是甲方口径:所有 kind 都可配、非必传。
59
+ *
60
+ * 缺省时由 core 出默认提示(`locked` →「请联系平台开通功能」/ `wip` →
61
+ * 「功能正在加紧开发中」)。要改文案就自己配本回调去弹,core [MUST NOT] 再开覆盖字段。
62
+ */
63
+ onTrigger?: (entry: BadgeEntry) => void;
64
+ /**
65
+ * 业务自定义标识——**core 不消费、纯透传**,供业务方自己按它找东西
66
+ * (查文档 / 查开通链接 / 埋点归因等)。
67
+ *
68
+ * 命名带 `biz` 前缀是刻意的:注册表本身的 map key 已经占了"key"这个词
69
+ * (菜单侧是路由 path),entry 里再来个裸 `key` 会当场混淆。
70
+ *
71
+ * [MUST NOT] 由 core 据它组装 / 注册 `key → 回调` 的映射——core 是基座层不是应用层,
72
+ * 聚合与数据来源全在 app(同本文件开头的分工)。
73
+ */
74
+ bizKey?: string;
53
75
  } & ({
54
76
  /** 数字角标 */
55
77
  kind: "count";
@@ -65,6 +87,10 @@ export type BadgeEntry = {
65
87
  kind: "beta";
66
88
  } | {
67
89
  kind: "wip";
90
+ } | {
91
+ kind: "deprecated";
92
+ } | {
93
+ kind: "locked";
68
94
  } | {
69
95
  /** 自定义标:内置五档不够用时才用 */
70
96
  kind: "custom";
@@ -77,7 +103,9 @@ export type BadgeEntry = {
77
103
  type?: BadgeProps["type"];
78
104
  });
79
105
  /** 内置标(非 count / custom)的 kind 联合——文案与语义色由 core 统一定,保证跨 app 一致 */
80
- export type BadgeBuiltinKind = "new" | "updated" | "beta" | "wip";
106
+ export type BadgeBuiltinKind = "new" | "updated" | "beta" | "wip" | "deprecated" | "locked";
107
+ /** 会遮挡宿主交互的 kind——[MUST] 与 `use-badge-mask` 的判据同源,[MUST NOT] 两处各写一份 */
108
+ export declare const BADGE_MASK_KINDS: readonly ["wip", "locked"];
81
109
  /** bridge 徽标 hook 工厂入参 */
82
110
  export interface BridgeBadgeInit {
83
111
  /** 初始标记表(如随版本发布的静态 NEW 标);缺省空表 */
@@ -13,6 +13,7 @@ export { createStorageWithNamespace } from './storage';
13
13
  export type { CoreThemeEntry, CoreThemeLifecycleContext, CoreThemeLifecycleHooks, CoreConfigDescription, CoreThemeModule, CoreThemeMode, CoreThemeDensity, CoreThemeMotion, ElSize, CoreThemeComponentDefaults, CoreThemePresetLayout, BridgeThemeLayoutState, BridgeThemeLayoutBaseline, BridgeThemeHook, } from './theme';
14
14
  export type { CoreLayoutModule, BridgeLayoutHook, BridgeLayoutInit, LayoutCollapsePersistShape, } from './layout';
15
15
  export type { BadgeEntry, BadgeMarkMap, BadgeBuiltinKind, CoreBadgeModule, BridgeBadgeHook, BridgeBadgeInit, } from './badge';
16
+ export { BADGE_MASK_KINDS } from './badge';
16
17
  /**
17
18
  * 认证桥接无状态纯工厂。
18
19
  *
@@ -226,6 +226,17 @@ export interface CoreThemeModule {
226
226
  * 新代码 [SHOULD] 用 {@link CoreThemeModule.setMode}(支持 `system` 第三态)。
227
227
  */
228
228
  setDark: (isDark: boolean) => void;
229
+ /**
230
+ * 覆盖明暗(**仅内存,不持久化**):`true`/`false` 压过 {@link CoreThemeModule.setMode}
231
+ * 的派生结果,**无参调用** `setDarkOverride()` 清除覆盖、回落 mode。
232
+ *
233
+ * 场景:应用被宿主以 iframe 嵌入(如 SSO 登录页),明暗须跟随宿主临时接管,但该应用
234
+ * 独立打开时仍按自己缓存的偏好——故覆盖 [MUST NOT] 触达 storage、[MUST NOT] 改
235
+ * `themeMode`(用户真实偏好原样保留,明暗切换控件仍显示它)。
236
+ * 覆盖期间 `themeIsDark` / `themeColors` / `<html>.dark` 全部跟随覆盖值,不存在
237
+ * 「视觉暗、状态亮」的脱钩。
238
+ */
239
+ setDarkOverride: (isDark?: boolean) => void;
229
240
  /**
230
241
  * 直接设密度档(独立于风格切换;供 UI 偏好 / demo 切换器)。
231
242
  * 注:`setStyle` 会按目标 preset 的 density 复位,故风格切换后手设的密度会被覆盖(同 layout 语义)。