@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
|
@@ -1,63 +1,94 @@
|
|
|
1
|
-
import { resolveFormLayout
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { resolveFormLayout } from "./utils.mjs";
|
|
2
|
+
const getCurrentSpan = (layout, breakpoint) => {
|
|
3
|
+
const base = resolveFormLayout(layout);
|
|
4
|
+
const raw = base[breakpoint];
|
|
5
|
+
return typeof raw === "number" ? raw : base.span ?? 6;
|
|
6
|
+
};
|
|
7
|
+
const colOccupancy = (raw, fallback) => {
|
|
8
|
+
if (typeof raw === "number") return raw;
|
|
9
|
+
if (raw && typeof raw === "object") {
|
|
10
|
+
const o = raw;
|
|
11
|
+
return (o.span ?? 24) + (o.offset ?? 0);
|
|
10
12
|
}
|
|
11
|
-
return
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
return fallback;
|
|
14
|
+
};
|
|
15
|
+
const resolveSearchItemOccupancy = (merged, breakpoint) => {
|
|
16
|
+
const fallback = typeof merged.span === "number" ? merged.span : 24;
|
|
17
|
+
const occupancy = colOccupancy(
|
|
18
|
+
merged[breakpoint],
|
|
19
|
+
fallback
|
|
16
20
|
);
|
|
17
|
-
return Math.min(24, Math.max(1,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
return Math.min(24, Math.max(1, occupancy));
|
|
22
|
+
};
|
|
23
|
+
const simulateSearchRows = (spans) => {
|
|
24
|
+
let rows = 0;
|
|
25
|
+
let lastRowUsed = 0;
|
|
26
|
+
for (const span of spans) {
|
|
27
|
+
if (rows === 0 || lastRowUsed + span > 24) {
|
|
28
|
+
rows += 1;
|
|
29
|
+
lastRowUsed = span;
|
|
30
|
+
} else {
|
|
31
|
+
lastRowUsed += span;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { rows, lastRowUsed };
|
|
35
|
+
};
|
|
36
|
+
const placeSearchButtons = (spans, buttonMinSpan) => {
|
|
37
|
+
const { rows, lastRowUsed } = simulateSearchRows(spans);
|
|
38
|
+
const remaining = 24 - lastRowUsed;
|
|
39
|
+
if (rows > 0 && remaining >= buttonMinSpan) {
|
|
40
|
+
return { totalRows: rows, buttonSpan: remaining };
|
|
41
|
+
}
|
|
42
|
+
return { totalRows: rows + 1, buttonSpan: 24 };
|
|
43
|
+
};
|
|
44
|
+
const computeSearchGeometry = ({
|
|
45
|
+
spans,
|
|
46
|
+
buttonMinSpan,
|
|
47
|
+
maxRows,
|
|
48
|
+
collapsed
|
|
31
49
|
}) => {
|
|
32
|
-
const
|
|
33
|
-
|
|
50
|
+
const minSpan = Math.min(24, Math.max(1, buttonMinSpan));
|
|
51
|
+
const full = placeSearchButtons(spans, minSpan);
|
|
52
|
+
if (maxRows <= 0) {
|
|
34
53
|
return {
|
|
35
|
-
showCount:
|
|
36
|
-
needsFold:
|
|
37
|
-
buttonSpan:
|
|
54
|
+
showCount: spans.length,
|
|
55
|
+
needsFold: false,
|
|
56
|
+
buttonSpan: full.buttonSpan
|
|
38
57
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
58
|
+
}
|
|
59
|
+
let count = spans.length;
|
|
60
|
+
let placed = full;
|
|
61
|
+
while (count > 0 && placed.totalRows > maxRows) {
|
|
62
|
+
count -= 1;
|
|
63
|
+
placed = placeSearchButtons(spans.slice(0, count), minSpan);
|
|
64
|
+
}
|
|
42
65
|
return {
|
|
43
|
-
showCount:
|
|
44
|
-
needsFold:
|
|
45
|
-
buttonSpan:
|
|
66
|
+
showCount: collapsed ? count : spans.length,
|
|
67
|
+
needsFold: count < spans.length,
|
|
68
|
+
buttonSpan: collapsed ? placed.buttonSpan : full.buttonSpan
|
|
46
69
|
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
70
|
+
};
|
|
71
|
+
const resolveSearchLayout = (compact, layout, breakpoint) => compact ? { span: getCurrentSpan(layout, breakpoint) } : layout;
|
|
72
|
+
const resolveSearchLabelPosition = (compact, labelPosition) => compact ? "top" : labelPosition;
|
|
73
|
+
const packSearchFormList = (list, options) => {
|
|
74
|
+
const { compact, itemLayout, collapsing, threshold } = options;
|
|
75
|
+
if (!compact && !collapsing) return list;
|
|
76
|
+
let visibleSeen = 0;
|
|
77
|
+
return list.map((item) => {
|
|
78
|
+
let next = item;
|
|
79
|
+
if (compact) next = { ...next, layout: itemLayout };
|
|
80
|
+
if (item.hide !== true) {
|
|
81
|
+
visibleSeen += 1;
|
|
82
|
+
if (collapsing && visibleSeen > threshold) next = { ...next, hide: true };
|
|
83
|
+
}
|
|
84
|
+
return next;
|
|
54
85
|
});
|
|
55
86
|
};
|
|
56
87
|
export {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
88
|
+
computeSearchGeometry,
|
|
89
|
+
getCurrentSpan,
|
|
90
|
+
packSearchFormList,
|
|
91
|
+
resolveSearchItemOccupancy,
|
|
92
|
+
resolveSearchLabelPosition,
|
|
93
|
+
resolveSearchLayout
|
|
63
94
|
};
|
|
@@ -1,71 +1,79 @@
|
|
|
1
|
-
import { markRaw
|
|
2
|
-
import
|
|
3
|
-
import { resolveLayoutSpan
|
|
4
|
-
const
|
|
5
|
-
function
|
|
1
|
+
import { markRaw } from "vue";
|
|
2
|
+
import FormItemNestFormList from "./FormItemNestFormList.vue.mjs";
|
|
3
|
+
import { resolveLayoutSpan, parseFormData, stringifyFormData } from "./utils.mjs";
|
|
4
|
+
const RawFormItemNestFormList = markRaw(FormItemNestFormList);
|
|
5
|
+
function nestFormItemList(options) {
|
|
6
6
|
const {
|
|
7
|
-
key
|
|
8
|
-
label
|
|
9
|
-
list
|
|
10
|
-
rowKey
|
|
11
|
-
itemFactory
|
|
12
|
-
min
|
|
13
|
-
max
|
|
14
|
-
layout
|
|
15
|
-
rowGutter
|
|
16
|
-
addText
|
|
17
|
-
removeText
|
|
18
|
-
headerRender
|
|
19
|
-
footerRender
|
|
20
|
-
shadowColor
|
|
21
|
-
rules
|
|
22
|
-
init
|
|
23
|
-
stringify
|
|
24
|
-
parse
|
|
25
|
-
rebase
|
|
26
|
-
removeConfirm
|
|
27
|
-
} =
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
7
|
+
key,
|
|
8
|
+
label,
|
|
9
|
+
list,
|
|
10
|
+
rowKey,
|
|
11
|
+
itemFactory,
|
|
12
|
+
min,
|
|
13
|
+
max,
|
|
14
|
+
layout,
|
|
15
|
+
rowGutter,
|
|
16
|
+
addText,
|
|
17
|
+
removeText,
|
|
18
|
+
headerRender,
|
|
19
|
+
footerRender,
|
|
20
|
+
shadowColor,
|
|
21
|
+
rules,
|
|
22
|
+
init,
|
|
23
|
+
stringify,
|
|
24
|
+
parse,
|
|
25
|
+
rebase,
|
|
26
|
+
removeConfirm
|
|
27
|
+
} = options;
|
|
28
|
+
const effMin = min ?? 0;
|
|
29
|
+
const effMax = max ?? Infinity;
|
|
30
|
+
const lengthRule = {
|
|
31
|
+
validator: (_rule, value, callback) => {
|
|
32
|
+
const len = Array.isArray(value) ? value.length : 0;
|
|
33
|
+
if (len < effMin)
|
|
34
|
+
return callback(new Error(`${label}至少需要 ${effMin} 项`));
|
|
35
|
+
if (len > effMax) return callback(new Error(`${label}最多 ${effMax} 项`));
|
|
36
|
+
return callback();
|
|
31
37
|
},
|
|
32
38
|
trigger: "change"
|
|
33
|
-
}
|
|
39
|
+
};
|
|
40
|
+
const hasLengthRule = effMin > 0 || effMax !== Infinity;
|
|
41
|
+
const mergedRules = !hasLengthRule ? rules : typeof rules === "function" ? (scope) => [lengthRule, ...rules(scope)] : [lengthRule, ...rules ?? []];
|
|
34
42
|
return {
|
|
35
|
-
key
|
|
36
|
-
label
|
|
37
|
-
layout
|
|
38
|
-
rules:
|
|
43
|
+
key,
|
|
44
|
+
label,
|
|
45
|
+
layout,
|
|
46
|
+
rules: mergedRules,
|
|
39
47
|
// 自动 pack(可覆盖):父 generate/stringify/parse 对数组逐项递归。
|
|
40
48
|
// init 缺省 = 空数组 []([MUST NOT] 补 min 行改初始值;min/max 由上方 rules 校验)
|
|
41
|
-
init:
|
|
42
|
-
stringify:
|
|
43
|
-
(
|
|
49
|
+
init: init ?? (() => []),
|
|
50
|
+
stringify: stringify ?? ((value) => (Array.isArray(value) ? value : []).map(
|
|
51
|
+
(t) => stringifyFormData(t, list)
|
|
44
52
|
)),
|
|
45
|
-
parse:
|
|
53
|
+
parse: parse ?? ((value) => (Array.isArray(value) ? value : []).map((t) => parseFormData(t, list))),
|
|
46
54
|
// render 用【组件本体引用】(非包裹 fn):FormItem 经 vModel sugar 注入 modelValue/onUpdate,
|
|
47
55
|
// 固定配置走 props。便于消费方按 `config.render === FormItemNestFormList` 判定"是联结组件"。
|
|
48
|
-
render:
|
|
56
|
+
render: RawFormItemNestFormList,
|
|
49
57
|
props: {
|
|
50
|
-
nestKey:
|
|
51
|
-
list
|
|
52
|
-
rowKey
|
|
53
|
-
itemFactory
|
|
54
|
-
min
|
|
55
|
-
max
|
|
56
|
-
rowGutter
|
|
57
|
-
addText
|
|
58
|
-
removeText
|
|
59
|
-
headerRender
|
|
60
|
-
footerRender
|
|
61
|
-
shadowColor
|
|
58
|
+
nestKey: key,
|
|
59
|
+
list,
|
|
60
|
+
rowKey,
|
|
61
|
+
itemFactory,
|
|
62
|
+
min,
|
|
63
|
+
max,
|
|
64
|
+
rowGutter,
|
|
65
|
+
addText,
|
|
66
|
+
removeText,
|
|
67
|
+
headerRender,
|
|
68
|
+
footerRender,
|
|
69
|
+
shadowColor,
|
|
62
70
|
// P3:把父 item 代表 span 传薄壳,供其叠 rebase 因子算每行子 FormMain 的 layoutScale
|
|
63
|
-
parentSpan:
|
|
64
|
-
rebase
|
|
65
|
-
removeConfirm
|
|
71
|
+
parentSpan: resolveLayoutSpan(layout),
|
|
72
|
+
rebase,
|
|
73
|
+
removeConfirm
|
|
66
74
|
}
|
|
67
75
|
};
|
|
68
76
|
}
|
|
69
77
|
export {
|
|
70
|
-
|
|
78
|
+
nestFormItemList
|
|
71
79
|
};
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { markRaw
|
|
2
|
-
import
|
|
3
|
-
import { resolveLayoutSpan
|
|
4
|
-
const
|
|
5
|
-
function
|
|
1
|
+
import { markRaw } from "vue";
|
|
2
|
+
import FormItemNestForm from "./FormItemNestForm.vue.mjs";
|
|
3
|
+
import { resolveLayoutSpan, parseFormData, stringifyFormData, generateFormData } from "./utils.mjs";
|
|
4
|
+
const RawFormItemNestForm = markRaw(FormItemNestForm);
|
|
5
|
+
function nestFormItem(options) {
|
|
6
6
|
const {
|
|
7
|
-
key
|
|
8
|
-
label
|
|
9
|
-
list
|
|
10
|
-
layout
|
|
11
|
-
rowGutter
|
|
12
|
-
shadowColor
|
|
13
|
-
init
|
|
14
|
-
stringify
|
|
15
|
-
parse
|
|
16
|
-
rebase
|
|
17
|
-
} =
|
|
7
|
+
key,
|
|
8
|
+
label,
|
|
9
|
+
list,
|
|
10
|
+
layout,
|
|
11
|
+
rowGutter,
|
|
12
|
+
shadowColor,
|
|
13
|
+
init,
|
|
14
|
+
stringify,
|
|
15
|
+
parse,
|
|
16
|
+
rebase
|
|
17
|
+
} = options;
|
|
18
18
|
return {
|
|
19
|
-
key
|
|
20
|
-
label
|
|
21
|
-
layout
|
|
19
|
+
key,
|
|
20
|
+
label,
|
|
21
|
+
layout,
|
|
22
22
|
// 自动 pack(可覆盖):父 generate/stringify/parse 递归进子 list
|
|
23
|
-
init:
|
|
24
|
-
stringify:
|
|
25
|
-
parse:
|
|
23
|
+
init: init ?? (() => generateFormData(list)),
|
|
24
|
+
stringify: stringify ?? ((value) => stringifyFormData(value ?? {}, list)),
|
|
25
|
+
parse: parse ?? ((value) => parseFormData(value ?? {}, list)),
|
|
26
26
|
// render 用【组件本体引用】(非包裹 fn):FormItem 经 vModel sugar 注入 modelValue/onUpdate,
|
|
27
27
|
// 固定配置走 props。便于消费方按 `config.render === FormItemNestForm` 判定"是联结组件"。
|
|
28
|
-
render:
|
|
28
|
+
render: RawFormItemNestForm,
|
|
29
29
|
props: {
|
|
30
|
-
nestKey:
|
|
31
|
-
list
|
|
32
|
-
rowGutter
|
|
33
|
-
shadowColor
|
|
30
|
+
nestKey: key,
|
|
31
|
+
list,
|
|
32
|
+
rowGutter,
|
|
33
|
+
shadowColor,
|
|
34
34
|
// P3:把父 item 代表 span 传薄壳,供其叠 rebase 因子算子 FormMain 的 layoutScale
|
|
35
|
-
parentSpan:
|
|
36
|
-
rebase
|
|
35
|
+
parentSpan: resolveLayoutSpan(layout),
|
|
36
|
+
rebase
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
export {
|
|
41
|
-
|
|
41
|
+
nestFormItem
|
|
42
42
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { shallowReactive
|
|
2
|
-
function
|
|
3
|
-
return
|
|
1
|
+
import { shallowReactive } from "vue";
|
|
2
|
+
function createNestFormExposeMap() {
|
|
3
|
+
return shallowReactive({});
|
|
4
4
|
}
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
createNestFormExposeMap
|
|
7
7
|
};
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { ref
|
|
2
|
-
function
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
(
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
function useFormSubmit(options) {
|
|
3
|
+
const submitting = ref(false);
|
|
4
|
+
const submit = async () => {
|
|
5
|
+
var _a, _b, _c;
|
|
6
|
+
(_a = options.onSubmitStart) == null ? void 0 : _a.call(options);
|
|
7
|
+
submitting.value = true;
|
|
7
8
|
try {
|
|
8
|
-
const
|
|
9
|
-
await
|
|
10
|
-
const
|
|
11
|
-
await
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const formMainInstance = options.getFormMainInstance();
|
|
10
|
+
await formMainInstance.validate();
|
|
11
|
+
const stringifyData = formMainInstance.stringify();
|
|
12
|
+
await options.submitFn(stringifyData);
|
|
13
|
+
(_b = options.onSuccess) == null ? void 0 : _b.call(options, stringifyData);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
(_c = options.onFail) == null ? void 0 : _c.call(options, error);
|
|
14
16
|
} finally {
|
|
15
|
-
|
|
17
|
+
submitting.value = false;
|
|
16
18
|
}
|
|
17
|
-
}
|
|
19
|
+
};
|
|
20
|
+
return { submitting, submit };
|
|
18
21
|
}
|
|
19
22
|
export {
|
|
20
|
-
|
|
23
|
+
useFormSubmit
|
|
21
24
|
};
|
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import { watch
|
|
2
|
-
import { useCustomBreakpoint
|
|
3
|
-
const
|
|
4
|
-
const { xs
|
|
5
|
-
|
|
1
|
+
import { watch } from "vue";
|
|
2
|
+
import { useCustomBreakpoint } from "../../hooks/use-custom-breakpoint.mjs";
|
|
3
|
+
const resolveFormLayoutAtBreakpoint = (merged, breakpoint) => {
|
|
4
|
+
const { xs, sm, md, lg, xl, ...rest } = merged;
|
|
5
|
+
const raw = { xs, sm, md, lg, xl }[breakpoint];
|
|
6
|
+
if (raw === void 0) return rest;
|
|
7
|
+
if (typeof raw === "number") return { ...rest, span: raw };
|
|
8
|
+
return { ...rest, ...raw };
|
|
6
9
|
};
|
|
7
|
-
function
|
|
8
|
-
const { elRef
|
|
9
|
-
|
|
10
|
-
() => [
|
|
11
|
-
([
|
|
12
|
-
|
|
10
|
+
function useFormLayoutByContainer(options) {
|
|
11
|
+
const { elRef, activeBreakpoint } = useCustomBreakpoint();
|
|
12
|
+
watch(
|
|
13
|
+
() => [options.enabled(), options.getForm()],
|
|
14
|
+
([on, form]) => {
|
|
15
|
+
elRef.value = on ? form : void 0;
|
|
13
16
|
},
|
|
14
|
-
{ immediate:
|
|
15
|
-
)
|
|
17
|
+
{ immediate: true }
|
|
18
|
+
);
|
|
19
|
+
const resolveLayoutByContainer = (merged) => {
|
|
20
|
+
if (!options.enabled()) return merged;
|
|
21
|
+
return resolveFormLayoutAtBreakpoint(merged, activeBreakpoint.value);
|
|
22
|
+
};
|
|
23
|
+
return { resolveLayoutByContainer };
|
|
16
24
|
}
|
|
17
25
|
export {
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
resolveFormLayoutAtBreakpoint,
|
|
27
|
+
useFormLayoutByContainer
|
|
20
28
|
};
|
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
import { inject
|
|
2
|
-
import { FORM_NEST_REGISTRY_KEY
|
|
3
|
-
function
|
|
4
|
-
const { rowInstances
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { inject, onMounted, toValue, onBeforeUnmount } from "vue";
|
|
2
|
+
import { FORM_NEST_REGISTRY_KEY } from "../../inject/key.mjs";
|
|
3
|
+
function useNestFormList(options) {
|
|
4
|
+
const { rowInstances, key } = options;
|
|
5
|
+
const exposeMap = inject(FORM_NEST_REGISTRY_KEY, null);
|
|
6
|
+
if (!exposeMap) return;
|
|
7
|
+
const aggregate = {
|
|
8
|
+
validate: () => Promise.all(rowInstances().map((r) => r.validate())).then(() => {
|
|
8
9
|
}),
|
|
9
|
-
clearValidate: () =>
|
|
10
|
-
resetFields: () =>
|
|
10
|
+
clearValidate: () => rowInstances().forEach((r) => r.clearValidate()),
|
|
11
|
+
resetFields: () => rowInstances().forEach((r) => r.resetFields())
|
|
11
12
|
};
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
onMounted(() => {
|
|
14
|
+
const k = toValue(key);
|
|
15
|
+
if (k === void 0) return;
|
|
16
|
+
exposeMap[k] = aggregate;
|
|
17
|
+
});
|
|
18
|
+
onBeforeUnmount(() => {
|
|
19
|
+
const k = toValue(key);
|
|
20
|
+
if (k !== void 0) delete exposeMap[k];
|
|
18
21
|
});
|
|
19
22
|
}
|
|
20
23
|
export {
|
|
21
|
-
|
|
24
|
+
useNestFormList
|
|
22
25
|
};
|
|
@@ -1,34 +1,43 @@
|
|
|
1
|
-
import { inject
|
|
2
|
-
import { FORM_NEST_REGISTRY_KEY
|
|
3
|
-
function
|
|
4
|
-
const { childRef
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import { inject, onMounted, toValue, onBeforeUnmount } from "vue";
|
|
2
|
+
import { FORM_NEST_REGISTRY_KEY } from "../../inject/key.mjs";
|
|
3
|
+
function useNestForm(options) {
|
|
4
|
+
const { childRef, key } = options;
|
|
5
|
+
const validateChild = () => {
|
|
6
|
+
var _a;
|
|
7
|
+
return ((_a = childRef.value) == null ? void 0 : _a.validate()) ?? Promise.resolve();
|
|
8
|
+
};
|
|
9
|
+
const clearChild = (k) => {
|
|
10
|
+
var _a;
|
|
11
|
+
return (_a = childRef.value) == null ? void 0 : _a.clearValidate(k);
|
|
12
|
+
};
|
|
13
|
+
const resetChild = () => {
|
|
14
|
+
var _a;
|
|
15
|
+
return (_a = childRef.value) == null ? void 0 : _a.resetFields();
|
|
16
|
+
};
|
|
17
|
+
const exposeMap = inject(FORM_NEST_REGISTRY_KEY, null);
|
|
18
|
+
if (exposeMap) {
|
|
19
|
+
const expose = {
|
|
20
|
+
validate: () => validateChild(),
|
|
21
|
+
clearValidate: (k) => clearChild(k),
|
|
22
|
+
resetFields: () => resetChild()
|
|
19
23
|
};
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
onMounted(() => {
|
|
25
|
+
const k = toValue(key);
|
|
26
|
+
if (k === void 0) return;
|
|
27
|
+
if (k in exposeMap && exposeMap[k] === expose) {
|
|
28
|
+
console.error(
|
|
29
|
+
`[useNestForm] 嵌套 exposeMap 重复注册同一 expose(key="${k}"),疑似生命周期重复挂载;已继续挂载。`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
exposeMap[k] = expose;
|
|
33
|
+
});
|
|
34
|
+
onBeforeUnmount(() => {
|
|
35
|
+
const k = toValue(key);
|
|
36
|
+
if (k !== void 0) delete exposeMap[k];
|
|
28
37
|
});
|
|
29
38
|
}
|
|
30
|
-
return { validateChild
|
|
39
|
+
return { validateChild, clearChild, resetChild };
|
|
31
40
|
}
|
|
32
41
|
export {
|
|
33
|
-
|
|
42
|
+
useNestForm
|
|
34
43
|
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { inject
|
|
2
|
-
import { NEST_LAYOUT_SCALE_KEY
|
|
3
|
-
function
|
|
4
|
-
const
|
|
5
|
-
return
|
|
6
|
-
const
|
|
7
|
-
if (
|
|
8
|
-
const
|
|
9
|
-
|
|
1
|
+
import { inject, computed, toValue } from "vue";
|
|
2
|
+
import { NEST_LAYOUT_SCALE_KEY } from "../../inject/key.mjs";
|
|
3
|
+
function useNestLayoutScale(options) {
|
|
4
|
+
const parentScaleRef = inject(NEST_LAYOUT_SCALE_KEY, void 0);
|
|
5
|
+
return computed(() => {
|
|
6
|
+
const base = parentScaleRef ? parentScaleRef.value : 1;
|
|
7
|
+
if (toValue(options.rebase) === false) return base;
|
|
8
|
+
const span = toValue(options.parentSpan);
|
|
9
|
+
const eff = typeof span === "number" && span > 0 ? span : 24;
|
|
10
|
+
return base * (24 / eff);
|
|
10
11
|
});
|
|
11
12
|
}
|
|
12
13
|
export {
|
|
13
|
-
|
|
14
|
+
useNestLayoutScale
|
|
14
15
|
};
|