@done-coding/admin-core 0.17.1-alpha.0 → 0.18.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.
- package/README.md +77 -1
- package/es/_virtual/_plugin-vue_export-helper.mjs +7 -6
- package/es/bridge/config-hook.mjs +49 -37
- package/es/bridge/index.mjs +152 -109
- package/es/bridge/layout.mjs +45 -31
- package/es/bridge/plugin.mjs +22 -12
- package/es/bridge/route.mjs +59 -50
- package/es/bridge/state.mjs +54 -39
- package/es/bridge/storage.mjs +18 -8
- package/es/bridge/theme/index.mjs +200 -97
- package/es/bridge/theme/persist.mjs +11 -7
- package/es/bridge/theme/system-dark.mjs +13 -6
- package/es/components/app-layout/AppAside.vue.mjs +4 -4
- package/es/components/app-layout/AppAside.vue2.mjs +37 -30
- package/es/components/app-layout/AppBody.vue.mjs +4 -4
- package/es/components/app-layout/AppBody.vue2.mjs +97 -60
- package/es/components/app-layout/AppBreadcrumb.vue.mjs +4 -4
- package/es/components/app-layout/AppBreadcrumb.vue2.mjs +59 -38
- package/es/components/app-layout/AppCollapseToggle.vue.mjs +4 -4
- package/es/components/app-layout/AppCollapseToggle.vue2.mjs +51 -42
- package/es/components/app-layout/AppFooter.vue.mjs +4 -4
- package/es/components/app-layout/AppFooter.vue2.mjs +15 -12
- package/es/components/app-layout/AppHeader.vue.mjs +4 -4
- package/es/components/app-layout/AppHeader.vue2.mjs +81 -58
- package/es/components/app-layout/AppLayout.vue.mjs +4 -4
- package/es/components/app-layout/AppLayout.vue2.mjs +148 -112
- package/es/components/app-layout/AppPage.vue.mjs +4 -4
- package/es/components/app-layout/AppPage.vue2.mjs +254 -197
- package/es/components/app-layout/AppShell.vue.mjs +44 -42
- package/es/components/app-layout/AppShell.vue2.mjs +2 -2
- package/es/components/app-layout/AppSidebar.vue.mjs +4 -4
- package/es/components/app-layout/AppSidebar.vue2.mjs +76 -59
- package/es/components/app-layout/AppTheme.vue.mjs +4 -4
- package/es/components/app-layout/AppTheme.vue2.mjs +69 -57
- package/es/components/app-layout/app-page-geometry.mjs +44 -42
- package/es/components/app-layout/keep-alive.mjs +27 -19
- package/es/components/app-layout/viewport.mjs +4 -3
- package/es/components/data-view/DataListView.vue.mjs +4 -4
- package/es/components/data-view/DataListView.vue2.mjs +133 -93
- package/es/components/data-view/DataListViewItem.vue.mjs +4 -4
- package/es/components/data-view/DataListViewItem.vue2.mjs +11 -9
- package/es/components/data-view/utils.mjs +36 -34
- package/es/components/display/ActionBtn.vue.mjs +94 -71
- package/es/components/display/ActionBtn.vue2.mjs +2 -2
- package/es/components/display/ActionBtnGroup.vue.mjs +54 -48
- package/es/components/display/ActionBtnGroup.vue2.mjs +2 -2
- package/es/components/display/ActionConfirm.vue.mjs +4 -4
- package/es/components/display/ActionConfirm.vue2.mjs +116 -92
- package/es/components/display/BooleanTag.vue.mjs +24 -18
- package/es/components/display/BooleanTag.vue2.mjs +2 -2
- package/es/components/display/HeightProvider.vue.mjs +37 -27
- package/es/components/display/HeightProvider.vue2.mjs +2 -2
- package/es/components/display/TabsHeader.vue.mjs +4 -4
- package/es/components/display/TabsHeader.vue2.mjs +86 -57
- package/es/components/display/TabsMain.vue.mjs +156 -125
- package/es/components/display/TabsMain.vue2.mjs +2 -2
- package/es/components/display/TabsNaturalFlow.vue.mjs +15 -11
- package/es/components/display/TabsNaturalFlow.vue2.mjs +2 -2
- package/es/components/display/TabsRefineFlow.vue.mjs +55 -42
- package/es/components/display/TabsRefineFlow.vue2.mjs +2 -2
- package/es/components/display/TabsTile.vue.mjs +4 -4
- package/es/components/display/TabsTile.vue2.mjs +204 -146
- package/es/components/display/WatchSize.vue.mjs +50 -30
- package/es/components/display/WatchSize.vue2.mjs +2 -2
- package/es/components/display/use-tabs-query-sync.mjs +21 -17
- package/es/components/form/FormItem.vue.mjs +4 -4
- package/es/components/form/FormItem.vue2.mjs +183 -121
- package/es/components/form/FormItemNestForm.vue.mjs +4 -4
- package/es/components/form/FormItemNestForm.vue2.mjs +38 -34
- package/es/components/form/FormItemNestFormList.vue.mjs +4 -4
- package/es/components/form/FormItemNestFormList.vue2.mjs +135 -106
- package/es/components/form/FormMain.vue.mjs +4 -4
- package/es/components/form/FormMain.vue2.mjs +226 -139
- package/es/components/form/FormRadioGroup.vue.mjs +67 -52
- package/es/components/form/FormRadioGroup.vue2.mjs +2 -2
- package/es/components/form/FormSearch.vue.mjs +4 -4
- package/es/components/form/FormSearch.vue2.mjs +194 -156
- package/es/components/form/FormSelect.vue.mjs +69 -42
- package/es/components/form/FormSelect.vue2.mjs +2 -2
- package/es/components/form/FormSubmitBtn.vue.mjs +30 -25
- package/es/components/form/FormSubmitBtn.vue2.mjs +2 -2
- package/es/components/form/FormSubmitPanel.vue.mjs +4 -4
- package/es/components/form/FormSubmitPanel.vue2.mjs +129 -96
- package/es/components/form/FormTree.vue.mjs +19 -16
- package/es/components/form/FormTree.vue2.mjs +2 -2
- package/es/components/form/FormVerifyCode.vue.mjs +58 -41
- package/es/components/form/FormVerifyCode.vue2.mjs +2 -2
- package/es/components/form/FormVerifyImage.vue.mjs +4 -4
- package/es/components/form/FormVerifyImage.vue2.mjs +62 -40
- package/es/components/form/form-search-utils.mjs +83 -52
- package/es/components/form/nest-form-item-list.mjs +63 -55
- package/es/components/form/nest-form-item.mjs +30 -30
- package/es/components/form/nest-registry.mjs +4 -4
- package/es/components/form/use-form-submit.mjs +18 -15
- package/es/components/form/use-layout-by-container.mjs +23 -15
- package/es/components/form/use-nest-form-list.mjs +19 -16
- package/es/components/form/use-nest-form.mjs +37 -28
- package/es/components/form/use-nest-layout-scale.mjs +11 -10
- package/es/components/form/utils.mjs +233 -145
- package/es/components/list-page/ListPage.vue.mjs +4 -4
- package/es/components/list-page/ListPage.vue2.mjs +313 -207
- package/es/components/list-page/use-sticky.mjs +45 -33
- package/es/components/menu/MenuItemSub.vue.mjs +47 -43
- package/es/components/menu/MenuItemSub.vue2.mjs +2 -2
- package/es/components/menu/MenuTree.vue.mjs +84 -61
- package/es/components/menu/MenuTree.vue2.mjs +2 -2
- package/es/components/misc/AutoRefresh.vue.mjs +4 -4
- package/es/components/misc/AutoRefresh.vue2.mjs +78 -53
- package/es/components/misc/AutoRefreshGroup.vue.mjs +4 -4
- package/es/components/misc/AutoRefreshGroup.vue2.mjs +54 -51
- package/es/components/misc/SelectModule.vue.mjs +54 -45
- package/es/components/misc/SelectModule.vue2.mjs +2 -2
- package/es/components/misc/TriggerAutoImport.vue.mjs +7 -5
- package/es/components/misc/TriggerAutoImport.vue2.mjs +2 -2
- package/es/components/modal/ModalConfirm.vue.mjs +4 -4
- package/es/components/modal/ModalConfirm.vue2.mjs +160 -125
- package/es/components/modal/ModalDetail.vue.mjs +50 -39
- package/es/components/modal/ModalDetail.vue2.mjs +2 -2
- package/es/components/modal/ModalForm.vue.mjs +63 -52
- package/es/components/modal/ModalForm.vue2.mjs +2 -2
- package/es/components/modal/ModalPorter.vue.mjs +51 -36
- package/es/components/modal/ModalPorter.vue2.mjs +2 -2
- package/es/components/modal/ModalShelf.vue.mjs +38 -28
- package/es/components/modal/ModalShelf.vue2.mjs +2 -2
- package/es/components/modal/modal-shelf-core.mjs +52 -36
- package/es/components/modal/modal-shelf-hierarchy.mjs +11 -9
- package/es/components/panel/PanelEditSwitch.vue.mjs +4 -4
- package/es/components/panel/PanelEditSwitch.vue2.mjs +88 -66
- package/es/components/panel/PanelItem.vue.mjs +4 -4
- package/es/components/panel/PanelItem.vue2.mjs +103 -77
- package/es/components/panel/PanelItemNestForm.vue.mjs +4 -4
- package/es/components/panel/PanelItemNestForm.vue2.mjs +61 -52
- package/es/components/panel/PanelItemNestPanel.vue.mjs +22 -20
- package/es/components/panel/PanelItemNestPanel.vue2.mjs +2 -2
- package/es/components/panel/PanelMain.vue.mjs +4 -4
- package/es/components/panel/PanelMain.vue2.mjs +92 -74
- package/es/components/panel/nest-panel-form.mjs +44 -38
- package/es/components/panel/nest-panel-item.mjs +18 -17
- package/es/components/slot-layout/SlotLayoutFlowAside.vue.mjs +4 -4
- package/es/components/slot-layout/SlotLayoutFlowAside.vue2.mjs +55 -42
- package/es/components/slot-layout/SlotLayoutTemplate.vue.mjs +11 -9
- package/es/components/slot-layout/SlotLayoutTemplate.vue2.mjs +2 -2
- package/es/components/table/TableMain.vue.mjs +4 -4
- package/es/components/table/TableMain.vue2.mjs +378 -275
- package/es/components/table/TableSkeleton.vue.mjs +4 -4
- package/es/components/table/TableSkeleton.vue2.mjs +95 -74
- package/es/components/table/TableToolbar.vue.mjs +4 -4
- package/es/components/table/TableToolbar.vue2.mjs +170 -154
- package/es/components/table/ToolbarButtons.vue.mjs +12 -10
- package/es/components/table/ToolbarButtons.vue2.mjs +2 -2
- package/es/components/table/constants.mjs +4 -3
- package/es/components/table/use-fill-height.mjs +12 -10
- package/es/components/table/use-table-skeleton.mjs +19 -15
- package/es/config/list-model.mjs +2 -2
- package/es/config/route.mjs +4 -3
- package/es/helpers/form.mjs +35 -25
- package/es/helpers/list-helper.mjs +59 -44
- package/es/hooks/activated.mjs +49 -33
- package/es/hooks/feel-size.mjs +39 -23
- package/es/hooks/menus-dispatch.mjs +68 -35
- package/es/hooks/timeout.mjs +29 -14
- package/es/hooks/use-breakpoint.mjs +35 -23
- package/es/hooks/use-channel-viewport-height.mjs +30 -20
- package/es/hooks/use-custom-breakpoint.mjs +48 -31
- package/es/hooks/use-observe-size.mjs +37 -20
- package/es/hooks/use-theme-apply.mjs +175 -124
- package/es/hooks/use-viewport-apply.mjs +39 -27
- package/es/index.mjs +239 -239
- package/es/inject/key.mjs +52 -41
- package/es/injectInfo.json.mjs +2 -2
- package/es/router/group-redirect.mjs +22 -16
- package/es/router/guard/index.mjs +26 -21
- package/es/router/guard/login.mjs +4 -2
- package/es/router/guard/permission.mjs +4 -2
- package/es/store/app.mjs +163 -123
- package/es/store/router-permission.mjs +75 -46
- package/es/store/user.mjs +100 -71
- package/es/style.css +769 -1
- package/es/utils/dom.mjs +20 -16
- package/es/utils/export.mjs +34 -18
- package/es/utils/id.mjs +5 -3
- package/es/utils/router.mjs +21 -14
- package/es/utils/theme-scale.mjs +50 -35
- package/es/utils/time.mjs +20 -14
- package/package.json +4 -3
- package/src/bridge/README.md +5 -0
- package/src/bridge/docs/README.md +72 -0
- package/src/components/README.md +84 -0
- package/src/components/app-layout/README.md +46 -0
- package/src/components/app-layout/docs/README-AppAside.md +69 -0
- package/src/components/app-layout/docs/README-AppBody.md +81 -0
- package/src/components/app-layout/docs/README-AppBreadcrumb.md +71 -0
- package/src/components/app-layout/docs/README-AppFooter.md +41 -0
- package/src/components/app-layout/docs/README-AppHeader.md +73 -0
- package/src/components/app-layout/docs/README-AppLayout.md +83 -0
- package/src/components/app-layout/docs/README-AppPage.md +80 -0
- package/src/components/app-layout/docs/README-AppSidebar.md +70 -0
- package/src/components/app-layout/docs/README-AppTheme.md +66 -0
- package/src/components/data-view/README.md +19 -0
- package/src/components/data-view/docs/README-DataListView.md +114 -0
- package/src/components/display/README.md +23 -0
- package/src/components/display/docs/README-ActionBtn.md +84 -0
- package/src/components/display/docs/README-ActionBtnGroup.md +96 -0
- package/src/components/display/docs/README-ActionConfirm.md +77 -0
- package/src/components/display/docs/README-BooleanTag.md +76 -0
- package/src/components/display/docs/README-HeightProvider.md +74 -0
- package/src/components/display/docs/README-TabsMain.md +99 -0
- package/src/components/display/docs/README-WatchSize.md +70 -0
- package/src/components/form/README.md +24 -0
- package/src/components/form/docs/README-FormItemNestForm.md +86 -0
- package/src/components/form/docs/README-FormItemNestFormList.md +93 -0
- package/src/components/form/docs/README-FormMain.md +101 -0
- package/src/components/form/docs/README-FormSearch.md +89 -0
- package/src/components/form/docs/README-FormSubmitBtn.md +72 -0
- package/src/components/form/docs/README-FormSubmitPanel.md +97 -0
- package/src/components/list-page/README.md +16 -0
- package/src/components/list-page/docs/README-ListPage.md +136 -0
- package/src/components/menu/README.md +19 -0
- package/src/components/menu/docs/README-MenuItemSub.md +53 -0
- package/src/components/menu/docs/README-MenuTree.md +76 -0
- package/src/components/misc/README.md +21 -0
- package/src/components/misc/docs/README-AutoRefresh.md +74 -0
- package/src/components/misc/docs/README-AutoRefreshGroup.md +74 -0
- package/src/components/misc/docs/README-SelectModule.md +72 -0
- package/src/components/modal/README.md +21 -0
- package/src/components/modal/docs/README-ModalConfirm.md +105 -0
- package/src/components/modal/docs/README-ModalDetail.md +103 -0
- package/src/components/modal/docs/README-ModalForm.md +97 -0
- package/src/components/modal/docs/README-ModalPorter.md +92 -0
- package/src/components/modal/docs/README-ModalShelf.md +115 -0
- package/src/components/panel/README.md +19 -0
- package/src/components/panel/docs/README-PanelMain.md +149 -0
- package/src/components/slot-layout/README.md +17 -0
- package/src/components/slot-layout/docs/README-SlotLayoutFlowAside.md +83 -0
- package/src/components/slot-layout/docs/README-SlotLayoutTemplate.md +73 -0
- package/src/components/table/README.md +17 -0
- package/src/components/table/docs/README-TableMain.md +140 -0
- package/src/hooks/README.md +5 -0
- package/src/hooks/docs/README.md +49 -0
- package/types/bridge/config-hook.d.ts +68 -0
- package/types/bridge/index.d.ts +411 -0
- package/types/bridge/layout.d.ts +40 -0
- package/types/bridge/plugin.d.ts +18 -0
- package/types/bridge/route.d.ts +20 -1
- package/types/bridge/state.d.ts +14 -0
- package/types/bridge/storage.d.ts +9 -0
- package/types/bridge/theme/index.d.ts +7 -0
- package/types/bridge/theme/persist.d.ts +12 -0
- package/types/bridge/theme/system-dark.d.ts +12 -0
- package/types/bridge/theme/types.d.ts +238 -0
- package/types/components/app-layout/AppAside.vue.d.ts +1 -0
- package/types/components/app-layout/AppCollapseToggle.vue.d.ts +3 -0
- package/types/components/app-layout/AppHeader.vue.d.ts +3 -0
- package/types/components/app-layout/AppLayout.vue.d.ts +12 -0
- package/types/components/app-layout/AppPage.vue.d.ts +17 -0
- package/types/components/app-layout/AppSidebar.vue.d.ts +2 -0
- package/types/components/app-layout/app-page-geometry.d.ts +48 -0
- package/types/components/app-layout/keep-alive.d.ts +17 -0
- package/types/components/app-layout/types.d.ts +125 -0
- package/types/components/app-layout/viewport.d.ts +28 -0
- package/types/components/data-view/DataListViewItem.vue.d.ts +8 -0
- package/types/components/data-view/index.d.ts +4 -0
- package/types/components/data-view/types.d.ts +42 -0
- package/types/components/data-view/utils.d.ts +3 -0
- package/types/components/display/TabsHeader.vue.d.ts +2 -0
- package/types/components/display/TabsMain.vue.d.ts +2 -0
- package/types/components/display/TabsRefineFlow.vue.d.ts +1 -0
- package/types/components/display/TabsTile.vue.d.ts +247 -12
- package/types/components/display/WatchSize.vue.d.ts +9 -0
- package/types/components/display/index.d.ts +37 -1
- package/types/components/display/types.d.ts +163 -0
- package/types/components/display/use-tabs-query-sync.d.ts +29 -0
- package/types/components/form/FormItemNestForm.vue.d.ts +5 -0
- package/types/components/form/FormItemNestFormList.vue.d.ts +17 -0
- package/types/components/form/FormVerifyCode.vue.d.ts +9 -0
- package/types/components/form/FormVerifyImage.vue.d.ts +1 -0
- package/types/components/form/form-search-utils.d.ts +34 -0
- package/types/components/form/nest-form-item-list.d.ts +28 -0
- package/types/components/form/nest-form-item.d.ts +21 -0
- package/types/components/form/nest-registry.d.ts +14 -0
- package/types/components/form/types.d.ts +208 -8
- package/types/components/form/use-form-submit.d.ts +13 -0
- package/types/components/form/use-layout-by-container.d.ts +23 -0
- package/types/components/form/use-nest-form-list.d.ts +13 -0
- package/types/components/form/use-nest-form.d.ts +15 -0
- package/types/components/form/use-nest-layout-scale.d.ts +12 -0
- package/types/components/form/utils.d.ts +56 -1
- package/types/components/list-page/ListPage.vue.d.ts +6 -0
- package/types/components/list-page/types.d.ts +50 -2
- package/types/components/list-page/use-sticky.d.ts +23 -0
- package/types/components/misc/index.d.ts +6 -1
- package/types/components/misc/types.d.ts +7 -0
- package/types/components/modal/ModalConfirm.vue.d.ts +29 -0
- package/types/components/modal/index.d.ts +7 -1
- package/types/components/modal/modal-shelf-core.d.ts +3 -0
- package/types/components/modal/modal-shelf-hierarchy.d.ts +4 -0
- package/types/components/modal/modal-shelf-types.d.ts +34 -0
- package/types/components/modal/types.d.ts +63 -2
- package/types/components/panel/PanelItemNestForm.vue.d.ts +6 -0
- package/types/components/panel/PanelItemNestPanel.vue.d.ts +5 -0
- package/types/components/panel/nest-panel-form.d.ts +21 -0
- package/types/components/panel/nest-panel-item.d.ts +14 -0
- package/types/components/panel/types.d.ts +52 -1
- package/types/components/slot-layout/SlotLayoutTemplate.vue.d.ts +21 -0
- package/types/components/slot-layout/types.d.ts +4 -0
- package/types/components/table/constants.d.ts +8 -0
- package/types/components/table/types.d.ts +140 -9
- package/types/components/table/use-fill-height.d.ts +14 -0
- package/types/components/table/use-table-skeleton.d.ts +16 -0
- package/types/config/list-model.d.ts +29 -0
- package/types/config/route.d.ts +2 -0
- package/types/helpers/form.d.ts +5 -0
- package/types/helpers/list-helper.d.ts +26 -0
- package/types/helpers/types.d.ts +11 -0
- package/types/hooks/activated.d.ts +23 -0
- package/types/hooks/feel-size.d.ts +2 -0
- package/types/hooks/menus-dispatch.d.ts +4 -0
- package/types/hooks/timeout.d.ts +4 -0
- package/types/hooks/use-channel-viewport-height.d.ts +8 -0
- package/types/hooks/use-custom-breakpoint.d.ts +19 -0
- package/types/hooks/use-observe-size.d.ts +29 -0
- package/types/hooks/use-theme-apply.d.ts +23 -0
- package/types/hooks/use-viewport-apply.d.ts +12 -0
- package/types/inject/key.d.ts +163 -0
- package/types/injectInfo.json.d.ts +1 -1
- package/types/router/group-redirect.d.ts +9 -0
- package/types/router/guard/index.d.ts +13 -0
- package/types/router/guard/login.d.ts +1 -0
- package/types/router/guard/permission.d.ts +1 -0
- package/types/router/guard/types.d.ts +3 -0
- package/types/store/app.d.ts +27 -0
- package/types/store/router-permission.d.ts +53 -0
- package/types/store/user.d.ts +24 -0
- package/types/types/dot-path.d.ts +8 -0
- package/types/types/route.d.ts +45 -0
- package/types/types/utility-types.d.ts +7 -0
- package/types/utils/dom.d.ts +22 -0
- package/types/utils/export.d.ts +16 -1
- package/types/utils/id.d.ts +1 -0
- package/types/utils/router.d.ts +2 -0
- package/types/utils/theme-scale.d.ts +31 -0
- package/types/utils/time.d.ts +1 -0
package/es/utils/dom.mjs
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
function
|
|
2
|
-
let
|
|
3
|
-
|
|
4
|
-
const { overflowY
|
|
5
|
-
if (/(auto|scroll|overlay)/.test(
|
|
6
|
-
return
|
|
7
|
-
|
|
1
|
+
function domClosestScrollableAncestor(el) {
|
|
2
|
+
let cur = el == null ? void 0 : el.parentElement;
|
|
3
|
+
while (cur && cur !== document.body && cur !== document.documentElement) {
|
|
4
|
+
const { overflowY } = getComputedStyle(cur);
|
|
5
|
+
if (/(auto|scroll|overlay)/.test(overflowY) && cur.scrollHeight > cur.clientHeight) {
|
|
6
|
+
return cur;
|
|
7
|
+
}
|
|
8
|
+
cur = cur.parentElement;
|
|
8
9
|
}
|
|
10
|
+
return void 0;
|
|
9
11
|
}
|
|
10
|
-
function
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
15
|
-
return
|
|
16
|
-
|
|
12
|
+
function domClosestStickyScrollport(el) {
|
|
13
|
+
let cur = el == null ? void 0 : el.parentElement;
|
|
14
|
+
while (cur && cur !== document.body && cur !== document.documentElement) {
|
|
15
|
+
const cs = getComputedStyle(cur);
|
|
16
|
+
if (cs.display !== "contents" && /(auto|scroll|overlay|hidden)/.test(cs.overflowY)) {
|
|
17
|
+
return cur;
|
|
18
|
+
}
|
|
19
|
+
cur = cur.parentElement;
|
|
17
20
|
}
|
|
21
|
+
return void 0;
|
|
18
22
|
}
|
|
19
23
|
export {
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
domClosestScrollableAncestor,
|
|
25
|
+
domClosestStickyScrollport
|
|
22
26
|
};
|
package/es/utils/export.mjs
CHANGED
|
@@ -1,23 +1,39 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const OPERATE_COLUMN_PROP = "OPERATE";
|
|
2
|
+
const EXPORT_MAX_LIMIT = 1e4;
|
|
3
|
+
const pickExportColumns = (columns) => columns.filter((col) => {
|
|
4
|
+
if (!col.prop) return false;
|
|
5
|
+
if (col.prop === OPERATE_COLUMN_PROP) return false;
|
|
6
|
+
if (col.type && col.type !== "default") return false;
|
|
7
|
+
return true;
|
|
8
|
+
}).map((col) => ({
|
|
9
|
+
prop: col.prop,
|
|
10
|
+
label: col.label
|
|
11
|
+
}));
|
|
12
|
+
const BOM = "\uFEFF";
|
|
13
|
+
const exportCSV = ({
|
|
14
|
+
columns,
|
|
15
|
+
list,
|
|
16
|
+
filename = "导出数据"
|
|
8
17
|
}) => {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
const header = columns.map((c) => c.label).join(",");
|
|
19
|
+
const rows = list.map(
|
|
20
|
+
(row) => columns.map((c) => {
|
|
21
|
+
const raw = c.valueMap ? c.valueMap(row) : row[c.prop] ?? "";
|
|
22
|
+
return `"${String(raw).replace(/"/g, '""')}"`;
|
|
13
23
|
}).join(",")
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
);
|
|
25
|
+
const csv = BOM + [header, ...rows].join("\n");
|
|
26
|
+
const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
|
|
27
|
+
const url = URL.createObjectURL(blob);
|
|
28
|
+
const link = document.createElement("a");
|
|
29
|
+
link.href = url;
|
|
30
|
+
link.download = `${filename}.csv`;
|
|
31
|
+
link.click();
|
|
32
|
+
URL.revokeObjectURL(url);
|
|
17
33
|
};
|
|
18
34
|
export {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
35
|
+
EXPORT_MAX_LIMIT,
|
|
36
|
+
OPERATE_COLUMN_PROP,
|
|
37
|
+
exportCSV,
|
|
38
|
+
pickExportColumns
|
|
23
39
|
};
|
package/es/utils/id.mjs
CHANGED
package/es/utils/router.mjs
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
-
const
|
|
2
|
-
path
|
|
3
|
-
permission:
|
|
1
|
+
const getRoutePermissionKey = ({
|
|
2
|
+
path,
|
|
3
|
+
permission: permissionConfig
|
|
4
4
|
}) => {
|
|
5
|
-
if (!
|
|
5
|
+
if (!permissionConfig) {
|
|
6
6
|
return;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
7
|
+
}
|
|
8
|
+
const { key, keyUsePath } = permissionConfig;
|
|
9
|
+
if (key) {
|
|
10
|
+
return key;
|
|
11
|
+
} else if (keyUsePath) {
|
|
12
|
+
return path;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const flatRouteMetaResolveRaw = (list, arr = []) => {
|
|
16
|
+
list.forEach((item) => {
|
|
17
|
+
arr.push(item);
|
|
18
|
+
flatRouteMetaResolveRaw(item.children, arr);
|
|
19
|
+
});
|
|
20
|
+
return arr;
|
|
21
|
+
};
|
|
15
22
|
export {
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
flatRouteMetaResolveRaw,
|
|
24
|
+
getRoutePermissionKey
|
|
18
25
|
};
|
package/es/utils/theme-scale.mjs
CHANGED
|
@@ -1,44 +1,59 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
if (
|
|
4
|
-
const
|
|
5
|
-
|
|
1
|
+
const themeScaleParseHex = (hex) => {
|
|
2
|
+
const m = hex.trim().replace(/^#/, "");
|
|
3
|
+
if (m.length === 3) {
|
|
4
|
+
const r = parseInt(m[0] + m[0], 16);
|
|
5
|
+
const g = parseInt(m[1] + m[1], 16);
|
|
6
|
+
const b = parseInt(m[2] + m[2], 16);
|
|
7
|
+
return [r, g, b].some(Number.isNaN) ? null : [r, g, b];
|
|
6
8
|
}
|
|
7
|
-
if (
|
|
8
|
-
const
|
|
9
|
-
|
|
9
|
+
if (m.length === 6) {
|
|
10
|
+
const r = parseInt(m.slice(0, 2), 16);
|
|
11
|
+
const g = parseInt(m.slice(2, 4), 16);
|
|
12
|
+
const b = parseInt(m.slice(4, 6), 16);
|
|
13
|
+
return [r, g, b].some(Number.isNaN) ? null : [r, g, b];
|
|
10
14
|
}
|
|
11
15
|
return null;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
};
|
|
17
|
+
const themeScaleToHex = (r, g, b) => {
|
|
18
|
+
const h = (n) => {
|
|
19
|
+
const v = Math.min(255, Math.max(0, Math.round(n)));
|
|
20
|
+
return v.toString(16).padStart(2, "0");
|
|
21
|
+
};
|
|
22
|
+
return `#${h(r)}${h(g)}${h(b)}`;
|
|
23
|
+
};
|
|
24
|
+
const themeScaleMix = (c1, c2, w1) => {
|
|
25
|
+
const a = themeScaleParseHex(c1);
|
|
26
|
+
const b = themeScaleParseHex(c2);
|
|
27
|
+
if (!a || !b) return c2;
|
|
28
|
+
return themeScaleToHex(
|
|
29
|
+
a[0] * w1 + b[0] * (1 - w1),
|
|
30
|
+
a[1] * w1 + b[1] * (1 - w1),
|
|
31
|
+
a[2] * w1 + b[2] * (1 - w1)
|
|
21
32
|
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
},
|
|
28
|
-
|
|
33
|
+
};
|
|
34
|
+
const themeScaleToRgba = (hex, alpha) => {
|
|
35
|
+
const rgb = themeScaleParseHex(hex);
|
|
36
|
+
if (!rgb) return hex;
|
|
37
|
+
const a = Math.min(1, Math.max(0, alpha));
|
|
38
|
+
return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${a})`;
|
|
39
|
+
};
|
|
40
|
+
const themeScaleDerive = (base, mode) => {
|
|
41
|
+
const lightMix = mode === "light" ? "#ffffff" : "#141414";
|
|
42
|
+
const darkMix = mode === "light" ? "#000000" : "#ffffff";
|
|
43
|
+
const li = (i) => themeScaleMix(lightMix, base, i / 10);
|
|
29
44
|
return {
|
|
30
|
-
base
|
|
31
|
-
"light-3":
|
|
32
|
-
"light-5":
|
|
33
|
-
"light-7":
|
|
34
|
-
"light-8":
|
|
35
|
-
"light-9":
|
|
36
|
-
"dark-2":
|
|
45
|
+
base,
|
|
46
|
+
"light-3": li(3),
|
|
47
|
+
"light-5": li(5),
|
|
48
|
+
"light-7": li(7),
|
|
49
|
+
"light-8": li(8),
|
|
50
|
+
"light-9": li(9),
|
|
51
|
+
"dark-2": themeScaleMix(darkMix, base, 0.2)
|
|
37
52
|
};
|
|
38
53
|
};
|
|
39
54
|
export {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
themeScaleDerive,
|
|
56
|
+
themeScaleMix,
|
|
57
|
+
themeScaleParseHex,
|
|
58
|
+
themeScaleToRgba
|
|
44
59
|
};
|
package/es/utils/time.mjs
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
const
|
|
2
|
-
let
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
const timeCountDown = (time, handler, endHandler) => {
|
|
2
|
+
let timer;
|
|
3
|
+
const initTimeStamp = Date.now();
|
|
4
|
+
const targetTimeStamp = initTimeStamp + time * 1e3;
|
|
5
|
+
const timeStep = 1e3;
|
|
6
|
+
function main() {
|
|
7
|
+
timer = setTimeout(() => {
|
|
8
|
+
const nowTimeStamp = Date.now();
|
|
9
|
+
if (targetTimeStamp - nowTimeStamp > 0) {
|
|
10
|
+
const newTime = Math.round((targetTimeStamp - nowTimeStamp) / 1e3);
|
|
11
|
+
handler(Math.max(newTime, 0));
|
|
12
|
+
main();
|
|
13
|
+
} else {
|
|
14
|
+
handler(0);
|
|
15
|
+
endHandler();
|
|
16
|
+
}
|
|
17
|
+
}, timeStep);
|
|
13
18
|
}
|
|
14
|
-
|
|
19
|
+
main();
|
|
20
|
+
return () => clearTimeout(timer);
|
|
15
21
|
};
|
|
16
22
|
export {
|
|
17
|
-
|
|
23
|
+
timeCountDown
|
|
18
24
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@done-coding/admin-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.1-alpha.0",
|
|
4
4
|
"description": "内部前端库",
|
|
5
5
|
"private": false,
|
|
6
6
|
"main": "es/index.mjs",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"es",
|
|
20
|
-
"types"
|
|
20
|
+
"types",
|
|
21
|
+
"src/**/README*.md"
|
|
21
22
|
],
|
|
22
23
|
"scripts": {
|
|
23
24
|
"serve": "vite",
|
|
@@ -79,5 +80,5 @@
|
|
|
79
80
|
"node": ">=18.0.0",
|
|
80
81
|
"pnpm": ">=9.0.0"
|
|
81
82
|
},
|
|
82
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "f439b08f77c84f7e15e3f7286de9978e9aae9ff4"
|
|
83
84
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# bridge 模块引导(接线中枢)
|
|
2
|
+
|
|
3
|
+
core 的「实例化中枢」:`createCoreBridge(options)` 产出 `CoreBridge` 单例——认证 / 布局 / 主题 / 路由派生的总接线口,经 `app.use(bridge)` 全局注入(`CORE_BRIDGE_KEY`),AppLayout 接收后 provide 给全部子组件。
|
|
4
|
+
|
|
5
|
+
**范式**:桥是 app 侧唯一的接线点(参考 `apps/reference/src/config/bridge.ts` 的实例化),core 组件/页面不直接持有 app 依赖。
|
|
6
|
+
|
|
7
|
+
## 导出面(`bridge/index.ts` 聚合)
|
|
8
|
+
|
|
9
|
+
| 符号 | 职责 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `createCoreBridge` | 工厂:传入 `CoreBridgeInitOptions`(配置 schema + auth facade + 存储 + 主题初值等),产出 `CoreBridge` |
|
|
12
|
+
| `CoreBridge` | 实例接口:`update()` 响应式更新 8 组配置视图 + `theme` 模块 + `layout` 折叠模块 + auth/api/路由派生方法 |
|
|
13
|
+
| `CoreBridgeRegisterOptions` | 注册选项类型(配置键 → 默认值/访问器) |
|
|
14
|
+
| `AppConfig` / `AppEnvInfo` | 配置 schema 顶层类型 |
|
|
15
|
+
| `AppLayout*Config`(Header/Footer/Sidebar/Aside/Body/Viewport/Gap) | 布局 7 组配置视图类型(`update` 改它们即响应式生效) |
|
|
16
|
+
| `AppThemeConfig` | 主题配置视图 |
|
|
17
|
+
| `AppRouterConfig` / `AppRouterPathsConfig` | 路由配置 + 8 个基础 path 常量真源 |
|
|
18
|
+
| `AppCacheConfig` | 缓存配置(命名空间 localStorage 由 `bridge/storage.ts` 工厂实例化) |
|
|
19
|
+
| `UserInfoAccess` / `UserInfoFieldAccessor` / `UserInfoPermissionAccessor` | userInfo 字段/权限访问器契约 |
|
|
20
|
+
| `AppBaseInfo` 等类型别名 | 各配置视图的便捷类型 |
|
|
21
|
+
|
|
22
|
+
**模块拆分**(规则 12:按耦合度独立文件):`theme/`(createBridgeThemeHook:风格 map + setStyle/setDark + 响应式 + 持久化)、`layout.ts`(折叠)、`plugin.ts`(插件注册)、`config-hook.ts`、`route.ts`(路由派生)、`state.ts`(useState 工厂)、`storage.ts`(命名空间存储)。
|
|
23
|
+
|
|
24
|
+
## 快速上手(接线范式)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
// apps/reference/src/config/bridge.ts(完整实例化参照)
|
|
28
|
+
const appCoreBridge = createCoreBridge({
|
|
29
|
+
APP_BASE_INFO: { name: "参考应用" },
|
|
30
|
+
APP_ENV: { ... },
|
|
31
|
+
APP_CACHE_CONFIG: { ... },
|
|
32
|
+
APP_LAYOUT_HEADER_CONFIG: { ... }, // 布局 5 组
|
|
33
|
+
APP_LAYOUT_VIEWPORT_CONFIG: { ... },
|
|
34
|
+
APP_THEME_CONFIG: { themeStyle: "default", themeIsDark: false },
|
|
35
|
+
APP_ROUTER_CONFIG: { meta: { default: ... } },
|
|
36
|
+
APP_ROUTER_PATHS_CONFIG: { rootPath, homePath, loginPath, ... }, // 8 path 真源
|
|
37
|
+
userInfoAccess: { ... }, // userInfo 字段/权限访问器
|
|
38
|
+
storage: storageLike, // 命名空间 localStorage
|
|
39
|
+
auth: { getToken, goToLogin, refreshToken, refreshAuth },
|
|
40
|
+
});
|
|
41
|
+
app.use(appCoreBridge); // opt-in:CORE_BRIDGE_KEY 注入
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
响应式更新(`update` 改配置视图,全链路即时生效):
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
appCoreBridge.update({ APP_LAYOUT_VIEWPORT_CONFIG: { ... } });
|
|
48
|
+
appCoreBridge.theme.setStyle("studio-stage");
|
|
49
|
+
appCoreBridge.theme.setDark(true);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 认证与请求接线
|
|
53
|
+
|
|
54
|
+
### 认证 facade(bridge 4 钩子 + userInfoAccess)
|
|
55
|
+
|
|
56
|
+
`CoreBridge` 提供 4 个**零参** auth facade(core 对 `UserInfo` 不透明):`getToken?` / `goToLogin?` / `refreshToken?` / `refreshAuth?`;另有 4 个增量可选业务 api(`loginApi` / `logoutApi` / `getUserInfoApi` / `refreshTokenApi`,由 `createUserStore` 薄壳 register 注入)。
|
|
57
|
+
|
|
58
|
+
- `userInfoAccess`:token / refreshToken / permission 三字段访问器(get + set),createCoreBridge 时注入
|
|
59
|
+
- 接线样板:`apps/reference/src/config/bridge.ts`(userInfoAccess + auth facade + 8 path 配置全量实例化)
|
|
60
|
+
|
|
61
|
+
### 请求实例(@done-coding/request-axios)
|
|
62
|
+
|
|
63
|
+
请求层**不在 core 包内**——消费方用 `@done-coding/request-axios` 的 `createRequest` 自建全局实例(peer 依赖):
|
|
64
|
+
|
|
65
|
+
- 样板:`apps/reference/src/api/request.ts`——`businessSuccessCodeList` + `getBusinessCode/getBusinessData/getBusinessMsg`(业务模型 key 由 `APP_API_BUSINESS_MODEL_KEY_CONFIG` 定)+ `beforeRequest` 注入 `Authorization`(token 取 `appCoreBridge.getToken()`)+ 拦截链(业务错误码分发 / token 刷新 / 跳登录 / 重拉权限)
|
|
66
|
+
- 业务 API 函数定义样板:`apps/reference/src/api/common.ts`(登录/登出/刷新/getUserInfo)
|
|
67
|
+
|
|
68
|
+
## 关联
|
|
69
|
+
|
|
70
|
+
- `CORE_BRIDGE_KEY`:`app.use(bridge)` 后的 inject 入口(未 use 时 inject 返回 undefined)
|
|
71
|
+
- 主题模块完整能力见 `apps/reference/src/config/theme-plugin.ts`(35 套资产注册)与 plugin-theme 包
|
|
72
|
+
- 范式演示:`apps/reference/src/pages/integration/bridge-update/`(update 响应式示例)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# components 组件族总引导
|
|
2
|
+
|
|
3
|
+
core 共 11 个组件族,全部经顶层 barrel 导出(`import { FormMain } from "@done-coding/admin-core"`)。各族目录内均有 `README.md` 入口(组件清单 + 指向 `docs/` 组件详情文档,`README-<PascalName>.md`)。
|
|
4
|
+
|
|
5
|
+
**页面范式**:`AppPage`(页面容器)→ `ListPage`(列表)/ `FormMain`(表单)/ `ViewLayout`(详情展示,**后续迭代,未实现**)→ `TableMain` / `FormSearch` 子配置。⚠️ 存量 `PanelMain` 的页级展示一等公民地位已撤销、将废弃——新页面 [MUST NOT] 以 PanelMain 作页级展示根容器(详见 panel 族文档)。
|
|
6
|
+
|
|
7
|
+
## 配置化体系契约(设计引导)
|
|
8
|
+
|
|
9
|
+
> 提炼自配置化体系设计范式(2026-08 对照 MIGRATION 与源码验证时效)。开发/接入前 [MUST] 先读本节。
|
|
10
|
+
|
|
11
|
+
### 第一性原理
|
|
12
|
+
|
|
13
|
+
- **万物皆表单项**:任何输入形态(upload / JSON / 选择器 / 验证码…)都是 `FormItemConfig` 的 render/component 变体——[MUST NOT] 另造「输入组件」形态
|
|
14
|
+
- **万物皆 Nest 递归组合**:嵌套子表单/子面板不手写 HTML,走 `nestFormItem` / `nestFormItemList` / `nestPanelItem` / `nestPanelForm`(配置一个容器的产物本身又是合法 item 内容,跨等级递归自嵌套)
|
|
15
|
+
- **编排即组合、不是分类**:customView 是列表视图变体不单列一类;横排/竖排/分步同源不为布局差异另造范式——组合自由、非封闭模板
|
|
16
|
+
- **容器即 prop**:弹窗/抽屉一个 `layerType` 切、大小一个 `width` 切——不另造形态
|
|
17
|
+
|
|
18
|
+
### 空间一等公民(组合件优先)
|
|
19
|
+
|
|
20
|
+
| 空间 | 一等公民(优先用) | 零件(底层,一般经一等公民使用) |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| 列表 | `ListPage` | `TableMain`(表格侧)/ `FormSearch`(搜索侧) |
|
|
23
|
+
| 纯表单提交 | `FormSubmitPanel` | `FormMain`(底座)/ `FormSubmitBtn` |
|
|
24
|
+
| 弹窗 CRUD / 表单 | `ModalDetail` / `ModalForm` | `ModalConfirm`(原语底座) |
|
|
25
|
+
| 弹窗命令式 | `ModalPorter` + `ModalShelf`(app/page 内置) | — |
|
|
26
|
+
| 详情展示 | `ViewLayout`(**后续迭代,未实现**);存量 `PanelMain` 将废弃(仅表单预览 / 就地编辑场景保留) | `PanelItem` / `PanelEditSwitch` |
|
|
27
|
+
| 多 tab | `TabsMain` | `TabsRefineFlow` 等(内部件) |
|
|
28
|
+
|
|
29
|
+
业务层 [MUST] 一等公民优先:能用 `TableMain` 处用 `ListPage`、能用 `FormMain` 处用 `FormSubmitPanel`;裸用仅限特例(详见各族文档定位段断言)。
|
|
30
|
+
|
|
31
|
+
### 配置化字段归位四机制
|
|
32
|
+
|
|
33
|
+
`ignore`(视图在数据不在)/ `hide`(数据在视图不在)/ `staticQuery`(列表查询固定参数)/ `init`(可被用户覆盖的初值)——字段落位先按四机制归位,[MUST NOT] 硬编码过滤。
|
|
34
|
+
|
|
35
|
+
### 弹窗即空间
|
|
36
|
+
|
|
37
|
+
- 内容型弹窗 [MUST] 走 `modalList` item + `shelf:"page"` + `ModalPorter.evoke(key, payload)`;[MUST NOT] 直挂 `ModalDetail`/`ModalForm` 组件到页面、[MUST NOT] 自声明 app/page 级 `ModalShelf`(AppLayout/AppPage 已内置)
|
|
38
|
+
- 确认类弹窗 [MUST NOT] 注册进 modalList:一句话确认走 `ActionBtn.confirmConfig`(popconfirm / messageConfirm)
|
|
39
|
+
|
|
40
|
+
### 页面反模式红线
|
|
41
|
+
|
|
42
|
+
- 所有业务页面 [MUST] `AppPage` 包裹(自带 page 级 ModalShelf + 视口高度链)
|
|
43
|
+
- 单向数据流:[MUST NOT] 跨层/跨 tab 全局 store 通信(props / emit / payload 回调)
|
|
44
|
+
- keepAlive 页返回刷新 core 内置(onActivated refresh 留页码),app 侧 [MUST NOT] 补偿(双重请求反模式)
|
|
45
|
+
- 新增按钮 [MUST] 走 `toolbar.leftExtraButtons`(ActionBtn 配置驱动);操作列 [MUST] 用 `column.render` 工厂 + `ActionBtnGroup`(`#table-OPERATE` 槽已非推荐通道)
|
|
46
|
+
- 跨包纪律:桶级导出 / `Symbol.for` / 双链验证 / style.css 显式导入 / `ActionBtn` 替代 ElButton(细则见项目 CLAUDE.md 规则 6–11)
|
|
47
|
+
- app 层范式:`useSpaceConfig` 单一配置出口 + handlers 出界注入(config 不 import router/不持 ref)——见 `apps/reference/src/pages/_shared/space.ts`
|
|
48
|
+
|
|
49
|
+
## 族清单
|
|
50
|
+
|
|
51
|
+
| 族 | 组件 | 入口 |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| form 表单族 | FormMain / FormSearch / FormSubmitBtn / FormSubmitPanel / FormItemNestForm / FormItemNestFormList / FormSelect / FormRadioGroup / FormTree / FormVerifyImage / FormVerifyCode | [README](./form/README.md) |
|
|
54
|
+
| list-page 列表族 | ListPage(FormSearch + TableMain 组合页) | [README](./list-page/README.md) |
|
|
55
|
+
| table 表格族 | TableMain | [README](./table/README.md) |
|
|
56
|
+
| modal 弹窗族 | ModalConfirm / ModalForm / ModalDetail / ModalShelf / ModalPorter | [README](./modal/README.md) |
|
|
57
|
+
| panel 面板族 | PanelMain / PanelItem / PanelEditSwitch / PanelItemNestPanel / PanelItemNestForm | [README](./panel/README.md) |
|
|
58
|
+
| display 展示族 | TabsMain / ActionBtn / ActionBtnGroup / ActionConfirm / WatchSize / HeightProvider / BooleanTag | [README](./display/README.md) |
|
|
59
|
+
| app-layout 布局族 | AppLayout / AppPage / AppBody / AppHeader / AppSidebar / AppAside / AppBreadcrumb / AppFooter / AppTheme / AppCollapseToggle(未导出) | [README](./app-layout/README.md) |
|
|
60
|
+
| menu 菜单族 | MenuTree / MenuItemSub | [README](./menu/README.md) |
|
|
61
|
+
| slot-layout 插槽布局族 | SlotLayoutTemplate / SlotLayoutFlowAside | [README](./slot-layout/README.md) |
|
|
62
|
+
| data-view 数据视图族 | DataListView / DataListViewItem(TableMain 内部件,customView 模式;不进顶层 export) | [README](./data-view/README.md) |
|
|
63
|
+
| misc 杂项族 | AutoRefresh / AutoRefreshGroup / SelectModule / TriggerAutoImport(@deprecated) | [README](./misc/README.md) |
|
|
64
|
+
|
|
65
|
+
## 写作与维护约定
|
|
66
|
+
|
|
67
|
+
- 各族 `README.md` = 入口(组件清单 + 一句话),组件详情在 `docs/README-<PascalName>.md`
|
|
68
|
+
- **快速上手 = 最小可用形态**(默认值即够用,5–20 行可直接抄的代码)——[MUST NOT] 把能力全开示例当快速上手(AI 会按示例最大化使用,全能力示例反而误导)
|
|
69
|
+
- **空间一等公民断言**:组合件(ListPage / FormSearch / FormSubmitPanel / ModalDetail 等)与零件(TableMain / FormMain / ModalConfirm / PanelItem 等)的文档 [MUST] 在定位段断言「优先经 <空间组件> 使用 + 直接使用仅当 <特例>」——配置化体系「空间一等公民优先」范式,[MUST NOT] 让 AI 把零件当默认起点。⚠️ `PanelMain` 已撤销一等公民地位(将废弃,待 `ViewLayout` 承接),文档 [MUST NOT] 再以 PanelMain 作详情展示组合件示例
|
|
70
|
+
- **每篇必含「能力边界 / 按需使用」段**(快速上手之后):逐条断言「默认关/默认即够用 + 仅当 X 场景才开(判据)」,末行给「完整能力演示」reference 指针——全能力代码不复制进文档正文(活代码在 reference showcase 页,零重复维护)
|
|
71
|
+
- 新增/改造对外组件 [MUST] 同步补 `docs/README-<PascalName>.md`(随 `docs/specs/` 任务闭环)
|
|
72
|
+
- API 段以 `types.ts` + 组件源码为真相源;与文档冲突时以源码为准
|
|
73
|
+
- 内部件(不导出)**也写独立文档,但仅 API 段**(props/emits/slots/expose + 机制契约真相,以源码为真相源)——[MUST NOT] 写定位 / 快速上手 / 基础应用等消费向叙事段(无对外使用场景,写了反而误导 AI 当公共组件用);族入口标注「内部件 · 仅 API」
|
|
74
|
+
|
|
75
|
+
### 开发流程(API 契约先行)
|
|
76
|
+
|
|
77
|
+
新组件 / 组件改造(含 API 变更)[MUST] 按四步走,[MUST NOT] 先实现后补文档:
|
|
78
|
+
|
|
79
|
+
1. **API 契约先行**:先写 `types.ts`(props/emits 类型)并**同步更新**对应 `docs/README-<PascalName>.md` 的 API 段(props/emits/slots/expose 表)——API 表先于实现存在、锁定契约;同时补「类型测试」锚(types.ts 形态断言——文档先行里唯一可执行的部分,把契约落成机器可验)
|
|
80
|
+
2. **实现**:满足契约;实现中 API 微调属正常,同步回改 API 表(文档是承诺不是枷锁,但 [MUST NOT] 实现完成时 API 表与 types.ts 不一致)
|
|
81
|
+
3. **验收**:reference 更新 demo(规则 10:范式页 + 手验 + build 静态验证)+ 单测 + 双链 build(规则 9.1)
|
|
82
|
+
4. **非 API 文档收尾**([MUST] 作为 spec TASK 单列,[MUST NOT] 靠「收尾顺手补」):定位 / 快速上手(最小可用,从 demo 最小形态提炼)/ 能力边界 / 反模式——此时实现与 demo 已定型,写出的姿势全部经实证
|
|
83
|
+
|
|
84
|
+
**复核闸**:第 4 步执行时 [MUST] 对照 `types.ts` + `withDefaults` 复核 API 表(预言 vs 兑现兑平)——「API 以 types.ts 为真相源」双向执行:实现前 API 表当契约写,实现后 types.ts 当真相校。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# app-layout(应用布局族)
|
|
2
|
+
|
|
3
|
+
> 应用壳族:AppLayout 数据桥/机制 + AppPage 页面容器 + AppBody 内容主体 + 六件布局积木(Header/Sidebar/Aside/Breadcrumb/Footer/Theme)。
|
|
4
|
+
> 范式页:`apps/reference/src/App.vue`(族总装配)、`apps/reference/src/pages/app-layout/shell/`(自供 shell 积木直引)、`apps/reference/src/pages/app-layout/page-slots/`(AppPage 四向悬浮槽)、`apps/reference/src/pages/app-layout/layout/`(布局显隐变体)
|
|
5
|
+
|
|
6
|
+
## 组件清单
|
|
7
|
+
|
|
8
|
+
| 组件 | 一句话 | 核心 props | 文档 |
|
|
9
|
+
| --- | --- | --- | --- |
|
|
10
|
+
| `AppLayout` | 应用布局总控:bridge/appStore/userStore 三注入 + 5 内容锚 + 内置默认经典布局 shell | `bridge`(必填)`appStore`(必填)`userStore`(必填)`watermarkContent` `sidebarAboveHeader` | [README-AppLayout.md](./docs/README-AppLayout.md) |
|
|
11
|
+
| `AppPage` | 页面主体容器:撑满视口 + 四向悬浮 fixed 插槽 | `fullViewport` `fullMode` `gap` `topBg`/`bottomBg`/`leftBg`/`rightBg` `nextViewportMaxHeight` | [README-AppPage.md](./docs/README-AppPage.md) |
|
|
12
|
+
| `AppBody` | 内容主体:内置 RouterView + KeepAlive + 面包屑 affix + #footer 槽 | `menuFlatList` | [README-AppBody.md](./docs/README-AppBody.md) |
|
|
13
|
+
| `AppHeader` | 顶栏积木:#left 品牌 + 路由模块菜单 + #right 操作区 | `menus` `menuFlatList`(必填)`show`(未消费) | [README-AppHeader.md](./docs/README-AppHeader.md) |
|
|
14
|
+
| `AppSidebar` | 侧边栏积木:折叠把手 + MenuTree 菜单 + #top/#bottom 高度自撑 | `show` `menus`(必填)`menuFlatList`(必填)`aboveHeader` | [README-AppSidebar.md](./docs/README-AppSidebar.md) |
|
|
15
|
+
| `AppAside` | 右侧补充区积木(对称 AppSidebar),无内置内容 | `show` | [README-AppAside.md](./docs/README-AppAside.md) |
|
|
16
|
+
| `AppBreadcrumb` | 面包屑积木:menuFlatList 匹配 route.matched 出链 | `height`(必填)`menuFlatList`(必填) | [README-AppBreadcrumb.md](./docs/README-AppBreadcrumb.md) |
|
|
17
|
+
| `AppFooter` | 底部状态条积木:高度/样式随 appStore.footerStyle 驱动,零 props | 无 | [README-AppFooter.md](./docs/README-AppFooter.md) |
|
|
18
|
+
| `AppTheme` | 主题切换器积木:bridge.theme 直读直写(亮/暗/系统 + 风格下拉) | 无 | [README-AppTheme.md](./docs/README-AppTheme.md) |
|
|
19
|
+
|
|
20
|
+
## 契约与类型(types.ts)
|
|
21
|
+
|
|
22
|
+
契约集中在 `app-layout/types.ts`(族内无每组件独立 types.ts),导出:
|
|
23
|
+
|
|
24
|
+
| 类型 | 语义 |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `AppLayoutAppStoreSlice<UserInfo>` | createAppStore 返回类型窄化 |
|
|
27
|
+
| `AppLayoutUserStoreSlice<UserInfo>` | createUserStore 返回类型窄化 |
|
|
28
|
+
| `AppLayoutBridgeSlice` | CoreBridge Pick 窄化:12+ readonly 配置 + theme* 系列 + getRoutes/generateRouteMetaRawTree |
|
|
29
|
+
| `AppShellContentAnchor` | 内容锚名联合:`"brand" \| "userEntry" \| "settings" \| "themeSwitcher" \| "aside"` |
|
|
30
|
+
| `AppShellProps` / `AppShellEmits`(空)/ `AppShellDefaultSlotScope`(`{ Footer: Component }`)/ `AppShellAnchorScope`(`{ Default?: Component }`)/ `AppShellSlots` | 布局插件自供 shell 的契约 |
|
|
31
|
+
|
|
32
|
+
## 内部件(不导出)
|
|
33
|
+
|
|
34
|
+
- `AppShell`:内置默认经典布局 shell(左 sidebar + 顶 header + 主体 body 1:1 镜像)——仅 AppLayout 内部 import;布局插件自供 shell(可照搬内置实现、复用上述积木)
|
|
35
|
+
- `AppCollapseToggle`:族内共享折叠积木(AppSidebar/AppAside 内部使用),未导出
|
|
36
|
+
- `keep-alive.ts`:AppBody depth-0 KeepAlive 缓存判据(真叶子 + meta.keepAlive),内部工具不入公共 barrel
|
|
37
|
+
|
|
38
|
+
## 导出面(index.ts)
|
|
39
|
+
|
|
40
|
+
9 组件 + `export * from "./types"` + `./viewport`(`CORE_VIEWPORT_DECOR_ZINDEX_BELOW`=800 弹窗下档 / `CORE_VIEWPORT_DECOR_ZINDEX_ABOVE`=10000 弹窗上档)+ `./app-page-geometry`(`computeAppPageReducedViewportHeight`/`computeAppPageReducedViewportWidth`、`computeAppPageContentInset`、`computeAppPageSlotStyles`、`computeAppPageSlotShimStyles` + `APP_PAGE_SLOT_Z_INDEX`=1)
|
|
41
|
+
|
|
42
|
+
## 关联
|
|
43
|
+
|
|
44
|
+
- 布局插件自供 shell 契约:`AppShellProps` / `AppShellSlots`(types.ts)
|
|
45
|
+
- 页面级骨架(ListPage 等)以 `AppPage` 为宿主:`apps/reference/src/pages/app-layout/page-slots/`
|
|
46
|
+
- 范式页:`apps/reference/src/App.vue`、`apps/reference/src/pages/app-layout/shell/`、`apps/reference/src/pages/app-layout/page-slots/`、`apps/reference/src/pages/app-layout/layout/`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# AppAside(右侧补充区积木)
|
|
2
|
+
|
|
3
|
+
> 右侧补充区积木(对称 AppSidebar):默认 slot 承载右侧面板内容;核内默认宽 0,app/preset 加宽启用。
|
|
4
|
+
> 范式页:`apps/reference/src/App.vue`(AppLayout #aside 锚经 shell 落位到 AppAside 默认槽)、`apps/reference/src/pages/app-layout/shell/`
|
|
5
|
+
|
|
6
|
+
## 定位
|
|
7
|
+
|
|
8
|
+
- **何时用**:右侧补充区(对话面板/属性栏等)——AppLayout `#aside` 内容锚的落位目标
|
|
9
|
+
- 始终渲染(对称 sidebar);核内默认宽 0 → 经典布局 1:1 无右间隙;app/preset 加宽即启用
|
|
10
|
+
- 无内置内容——内容完全由默认 slot 提供
|
|
11
|
+
- `show=false` 整列不渲染
|
|
12
|
+
|
|
13
|
+
## 快速上手(最小可用)
|
|
14
|
+
|
|
15
|
+
业务侧只填 AppLayout `#aside` 锚(App.vue 范式——内容经 shell 中转喂进 AppAside 默认槽):
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<AppLayout :bridge="appCoreBridge" :appStore="appStore" :userStore="userStore">
|
|
19
|
+
<template #brand><AppBrand /></template>
|
|
20
|
+
<template #userEntry><UserHeaderAction /></template>
|
|
21
|
+
<template #aside><ChatAsidePanel /></template>
|
|
22
|
+
</AppLayout>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**要点**:
|
|
26
|
+
|
|
27
|
+
- `#aside` 内容锚单实例(同 #brand/#userEntry 范式),落位权归 shell
|
|
28
|
+
|
|
29
|
+
## 能力边界 / 按需使用
|
|
30
|
+
|
|
31
|
+
- **宽度不在组件自身**:核内默认宽 0(经典布局 1:1 无右间隙)——加宽由 app/preset 配置(`bridge.APP_LAYOUT_ASIDE_CONFIG.width`)启用,[MUST NOT] 在 AppAside 自身调宽度。
|
|
32
|
+
- **无 `#aside` 内容即空渲染**:始终渲染(对称 sidebar)但无内置内容——不填即零右间隙,填了才出现右侧补充区。
|
|
33
|
+
- `show` 显隐基线来自路由 `meta.layout.aside`(store showAside),false 整列不渲染。
|
|
34
|
+
- **完整能力演示**(#aside 锚 + 自供 shell):`apps/reference/src/App.vue`、`apps/reference/src/pages/app-layout/shell/`
|
|
35
|
+
|
|
36
|
+
## API
|
|
37
|
+
> ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
|
|
38
|
+
|
|
39
|
+
### Props
|
|
40
|
+
|
|
41
|
+
| name | type | 默认 | 语义 |
|
|
42
|
+
| --- | --- | --- | --- |
|
|
43
|
+
| `show` | `boolean`(必填) | — | 显隐(false 整列不渲染) |
|
|
44
|
+
|
|
45
|
+
### Emits
|
|
46
|
+
|
|
47
|
+
无
|
|
48
|
+
|
|
49
|
+
### Slots
|
|
50
|
+
|
|
51
|
+
| 槽 | scope | 语义 |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `default` | 无 | 右侧补充区内容(无内置内容) |
|
|
54
|
+
|
|
55
|
+
### Expose
|
|
56
|
+
|
|
57
|
+
无
|
|
58
|
+
|
|
59
|
+
## 反模式 / 注意
|
|
60
|
+
|
|
61
|
+
- **别给 AppAside 塞「布局默认内容」**:内容全部来自默认 slot(经 `#aside` 锚),无内置内容
|
|
62
|
+
- **别在 AppAside 自身调宽度**:核内默认宽 0,加宽由 app/preset 决定
|
|
63
|
+
- 无填 `#aside` 则空渲染——经典布局无右间隙(1:1 镜像)
|
|
64
|
+
|
|
65
|
+
## 关联
|
|
66
|
+
|
|
67
|
+
- 对称积木:`AppSidebar`
|
|
68
|
+
- 内容锚:`#aside`(AppLayout 5 锚之一,`AppShellContentAnchor`)
|
|
69
|
+
- 范式页:`apps/reference/src/App.vue`、`apps/reference/src/pages/app-layout/shell/`
|