@done-coding/admin-core 0.30.1-alpha.0 → 0.31.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/es/bridge/config-hook.mjs +3 -0
- package/es/bridge/index.mjs +6 -0
- package/es/bridge/theme/index.mjs +11 -3
- package/es/components/app-layout/AppBody.vue.mjs +1 -1
- package/es/components/app-layout/AppBody.vue2.mjs +2 -2
- package/es/components/app-layout/AppPage.vue.mjs +1 -1
- package/es/components/app-layout/AppPage.vue2.mjs +175 -33
- package/es/components/app-layout/AppPageNavBar.vue.mjs +7 -0
- package/es/components/app-layout/AppPageNavBar.vue2.mjs +148 -0
- package/es/components/app-layout/app-page-geometry.mjs +3 -2
- package/es/components/app-layout/app-page-slot-surface.mjs +31 -0
- package/es/components/app-layout/use-app-page-title-field.mjs +41 -0
- package/es/components/data-view/DataGridView.vue.mjs +1 -1
- package/es/components/data-view/DataGridView.vue2.mjs +2 -1
- package/es/components/data-view/DataListView.vue.mjs +1 -1
- package/es/components/data-view/DataListView.vue2.mjs +14 -9
- package/es/components/data-view/DataListViewItem.vue.mjs +1 -1
- package/es/components/data-view/DataListViewItem.vue2.mjs +3 -1
- package/es/components/data-view/InfiniteListView.vue.mjs +1 -1
- package/es/components/data-view/InfiniteListView.vue2.mjs +25 -18
- package/es/components/data-view/use-grid-layout.mjs +13 -15
- package/es/components/display/TabsMain.vue.mjs +3 -1
- package/es/components/display/use-badge.mjs +10 -3
- package/es/components/form/FormItem.vue.mjs +1 -1
- package/es/components/form/FormMain.vue.mjs +1 -1
- package/es/components/form/FormMain.vue2.mjs +11 -4
- package/es/components/form/FormSearch.vue.mjs +1 -1
- package/es/components/form/FormSearch.vue2.mjs +12 -4
- package/es/components/form/FormSubmitPanel.vue.mjs +1 -1
- package/es/components/form/FormSubmitPanel.vue2.mjs +2 -0
- package/es/components/form/use-ai-fill.mjs +7 -1
- package/es/components/list-layout/ListLayout.vue.mjs +1 -1
- package/es/components/list-layout/ListLayout.vue2.mjs +19 -10
- package/es/components/modal/ModalConfirm.vue.mjs +1 -1
- package/es/components/modal/ModalConfirm.vue2.mjs +28 -5
- package/es/components/table/TableToolbar.vue.mjs +1 -1
- package/es/components/table/TableToolbar.vue2.mjs +15 -1
- package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
- package/es/components/view-layout/ViewLayout.vue2.mjs +22 -29
- package/es/components/view-layout/ViewLayoutToolbar.vue.mjs +1 -1
- package/es/components/view-layout/ViewLayoutToolbar.vue2.mjs +16 -129
- package/es/config/slot-region.mjs +1 -0
- package/es/hooks/use-surface.mjs +5 -0
- package/es/hooks/use-theme-apply.mjs +18 -0
- package/es/index.mjs +4 -1
- package/es/store/app.mjs +26 -11
- package/es/style.css +230 -172
- package/package.json +2 -2
- package/src/bridge/docs/README.md +19 -3
- package/src/components/app-layout/docs/README-AppBody.md +25 -1
- package/src/components/app-layout/docs/README-AppHeader.md +1 -1
- package/src/components/app-layout/docs/README-AppPage.md +172 -3
- package/src/components/data-view/docs/README-DataListView.md +40 -1
- package/src/components/data-view/docs/README-InfiniteListView.md +68 -4
- package/src/components/display/docs/README-BadgeMark.md +18 -10
- package/src/components/form/docs/README-FormMain.md +26 -0
- package/src/components/list-layout/docs/README-ListLayout.md +12 -1
- package/src/components/menu/README.md +1 -1
- package/src/components/modal/docs/README-ModalConfirm.md +57 -0
- package/src/components/view-layout/docs/README-ViewLayout.md +46 -129
- package/types/bridge/config-hook.d.ts +5 -2
- package/types/bridge/index.d.ts +22 -0
- package/types/components/app-layout/AppPage.vue.d.ts +43 -1
- package/types/components/app-layout/AppPageNavBar.vue.d.ts +48 -0
- package/types/components/app-layout/app-page-geometry.d.ts +27 -2
- package/types/components/app-layout/app-page-slot-surface.d.ts +18 -0
- package/types/components/app-layout/index.d.ts +1 -0
- package/types/components/app-layout/types.d.ts +37 -1
- package/types/components/app-layout/use-app-page-title-field.d.ts +49 -0
- package/types/components/data-view/DataListViewItem.vue.d.ts +7 -0
- package/types/components/data-view/types.d.ts +26 -3
- package/types/components/data-view/use-grid-layout.d.ts +31 -6
- package/types/components/form/types.d.ts +8 -2
- package/types/components/list-layout/ListLayout.vue.d.ts +23 -2
- package/types/components/list-layout/types.d.ts +7 -0
- package/types/components/view-layout/ViewLayout.vue.d.ts +4 -16
- package/types/components/view-layout/ViewLayoutToolbar.vue.d.ts +3 -9
- package/types/components/view-layout/types.d.ts +11 -50
- package/types/config/slot-region.d.ts +17 -1
- package/types/injectInfo.json.d.ts +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { defineComponent, computed, shallowRef, ref, inject, provide, openBlock, createBlock, resolveDynamicComponent, mergeProps, createSlots, withCtx, createElementVNode,
|
|
1
|
+
import { defineComponent, computed, shallowRef, ref, inject, provide, openBlock, createBlock, resolveDynamicComponent, mergeProps, createSlots, withCtx, createElementVNode, normalizeClass, renderSlot, createElementBlock, Fragment, createTextVNode, toDisplayString, unref, createCommentVNode, createVNode } from "vue";
|
|
2
2
|
import { ElDrawer, ElDialog, ElButton } from "element-plus";
|
|
3
|
-
import {
|
|
3
|
+
import { SlotRegion } from "../../config/slot-region.mjs";
|
|
4
|
+
import { APP_LAYOUT_BRIDGE_KEY, BODY_CONTENT_VIEWPORT_HEIGHT, SCOPE_VIEWPORT_MAX_HEIGHT } from "../../inject/key.mjs";
|
|
5
|
+
import { gapScaleValue } from "../../utils/gap-scale.mjs";
|
|
4
6
|
import { useActivated } from "../../hooks/activated.mjs";
|
|
5
7
|
import { useObserveSize } from "../../hooks/use-observe-size.mjs";
|
|
6
|
-
import { SlotRegion } from "../../config/slot-region.mjs";
|
|
7
8
|
const _hoisted_1 = { class: "confirm-modal__title" };
|
|
8
9
|
const _hoisted_2 = ["data-dc-slot"];
|
|
9
10
|
const _hoisted_3 = ["reverse"];
|
|
@@ -46,6 +47,27 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
46
47
|
const showFooterDivider = computed(() => props.footerDivider ?? isDrawer.value);
|
|
47
48
|
const contentRef = shallowRef();
|
|
48
49
|
const drawerBodyHeight = ref(0);
|
|
50
|
+
const bodySlotRegion = computed(
|
|
51
|
+
() => isDrawer.value ? SlotRegion.ModalConfirm_DrawerBody : SlotRegion.ModalConfirm_Body
|
|
52
|
+
);
|
|
53
|
+
const layoutBridge = inject(APP_LAYOUT_BRIDGE_KEY, void 0);
|
|
54
|
+
const layerPadVars = computed(() => {
|
|
55
|
+
const base = (layoutBridge == null ? void 0 : layoutBridge.APP_LAYOUT_GAP_CONFIG.size) ?? 8;
|
|
56
|
+
const density = layoutBridge == null ? void 0 : layoutBridge.themeDensity.value;
|
|
57
|
+
return {
|
|
58
|
+
"--dc-confirm-modal-pad-x": `${gapScaleValue(base, "outer", density)}px`,
|
|
59
|
+
"--dc-confirm-modal-pad-body-y": `${gapScaleValue(
|
|
60
|
+
base,
|
|
61
|
+
"outer",
|
|
62
|
+
density
|
|
63
|
+
)}px`,
|
|
64
|
+
"--dc-confirm-modal-pad-chrome-y": `${gapScaleValue(
|
|
65
|
+
base,
|
|
66
|
+
"breath",
|
|
67
|
+
density
|
|
68
|
+
)}px`
|
|
69
|
+
};
|
|
70
|
+
});
|
|
49
71
|
const outerViewportHeight = inject(BODY_CONTENT_VIEWPORT_HEIGHT, void 0);
|
|
50
72
|
const providedViewportHeight = computed(
|
|
51
73
|
() => isDrawer.value ? drawerBodyHeight.value : (outerViewportHeight == null ? void 0 : outerViewportHeight.value) ?? 0
|
|
@@ -136,6 +158,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
136
158
|
"confirm-modal_hidden-header": __props.hiddenHeader
|
|
137
159
|
}
|
|
138
160
|
],
|
|
161
|
+
style: layerPadVars.value,
|
|
139
162
|
"show-close": __props.showClose,
|
|
140
163
|
"append-to-body": "",
|
|
141
164
|
"close-on-click-modal": __props.closeOnClickModal,
|
|
@@ -147,7 +170,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
147
170
|
ref_key: "contentRef",
|
|
148
171
|
ref: contentRef,
|
|
149
172
|
class: normalizeClass(["confirm-modal__content", { "confirm-modal__content_drawer": isDrawer.value }]),
|
|
150
|
-
"data-dc-slot":
|
|
173
|
+
"data-dc-slot": bodySlotRegion.value
|
|
151
174
|
}, [
|
|
152
175
|
renderSlot(_ctx.$slots, "main-header", {}, void 0, true),
|
|
153
176
|
renderSlot(_ctx.$slots, "default", {}, () => [
|
|
@@ -211,7 +234,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
211
234
|
]),
|
|
212
235
|
key: "1"
|
|
213
236
|
} : void 0
|
|
214
|
-
]), 1040, ["model-value", "class", "show-close", "close-on-click-modal", "close-on-press-escape"]);
|
|
237
|
+
]), 1040, ["model-value", "class", "style", "show-close", "close-on-click-modal", "close-on-press-escape"]);
|
|
215
238
|
};
|
|
216
239
|
}
|
|
217
240
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _sfc_main from "./TableToolbar.vue2.mjs";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
-
const TableToolbar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4
|
+
const TableToolbar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-bdf7a873"]]);
|
|
5
5
|
export {
|
|
6
6
|
TableToolbar as default
|
|
7
7
|
};
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, useCssVars, inject, computed, useModel, ref, withDirectives, openBlock, createElementBlock, createElementVNode, createBlock, unref, withCtx, createVNode, createTextVNode, createCommentVNode, vShow, mergeModels } from "vue";
|
|
2
2
|
import { ElDropdown, ElButton, ElIcon, ElDropdownMenu, ElDropdownItem, ElSwitch, ElMessageBox, ElMessage } from "element-plus";
|
|
3
3
|
import { ArrowDown, Calendar, Grid } from "@element-plus/icons-vue";
|
|
4
4
|
import _sfc_main$1 from "./ToolbarButtons.vue.mjs";
|
|
5
5
|
import AutoRefreshGroup from "../misc/AutoRefreshGroup.vue.mjs";
|
|
6
|
+
import { APP_LAYOUT_BRIDGE_KEY } from "../../inject/key.mjs";
|
|
7
|
+
import { gapScaleValue } from "../../utils/gap-scale.mjs";
|
|
6
8
|
import { countAll, fetchListAll } from "../../helpers/list-helper.mjs";
|
|
7
9
|
import { EXPORT_MAX_LIMIT, exportCSV } from "../../utils/export.mjs";
|
|
8
10
|
const _hoisted_1 = { class: "table-toolbar" };
|
|
9
11
|
const _hoisted_2 = { class: "table-toolbar-left" };
|
|
10
12
|
const _hoisted_3 = { class: "table-toolbar-right" };
|
|
13
|
+
const DEFAULT_GAP_BASE = 8;
|
|
11
14
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
12
15
|
__name: "TableToolbar",
|
|
13
16
|
props: /* @__PURE__ */ mergeModels({
|
|
@@ -34,7 +37,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
34
37
|
}),
|
|
35
38
|
emits: ["update:isAutoRefresh", "update:refreshInterval", "update:customView"],
|
|
36
39
|
setup(__props) {
|
|
40
|
+
useCssVars((_ctx) => ({
|
|
41
|
+
"v5e2681ca": groupGapPx.value
|
|
42
|
+
}));
|
|
37
43
|
const props = __props;
|
|
44
|
+
const layoutBridge = inject(APP_LAYOUT_BRIDGE_KEY, void 0);
|
|
45
|
+
const groupGapPx = computed(
|
|
46
|
+
() => `${gapScaleValue(
|
|
47
|
+
(layoutBridge == null ? void 0 : layoutBridge.APP_LAYOUT_GAP_CONFIG.size) ?? DEFAULT_GAP_BASE,
|
|
48
|
+
"breath",
|
|
49
|
+
layoutBridge == null ? void 0 : layoutBridge.themeDensity.value
|
|
50
|
+
)}px`
|
|
51
|
+
);
|
|
38
52
|
const isAutoRefresh = useModel(__props, "isAutoRefresh");
|
|
39
53
|
const refreshInterval = useModel(__props, "refreshInterval");
|
|
40
54
|
const customView = useModel(__props, "customView");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _sfc_main from "./ViewLayout.vue2.mjs";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
-
const ViewLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4
|
+
const ViewLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2a70d3bc"]]);
|
|
5
5
|
export {
|
|
6
6
|
ViewLayout as default
|
|
7
7
|
};
|
|
@@ -34,11 +34,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
34
34
|
showNavigation: { type: Boolean, default: true },
|
|
35
35
|
leftExtraButtons: { default: () => [] },
|
|
36
36
|
rightExtraButtons: { default: () => [] },
|
|
37
|
-
|
|
38
|
-
back: {},
|
|
39
|
-
moreOptions: {},
|
|
40
|
-
onMoreSelect: {},
|
|
41
|
-
onMore: {}
|
|
37
|
+
titleField: {}
|
|
42
38
|
}, {
|
|
43
39
|
"isAutoRefresh": { type: Boolean },
|
|
44
40
|
"isAutoRefreshModifiers": {}
|
|
@@ -46,13 +42,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
46
42
|
emits: ["update:isAutoRefresh"],
|
|
47
43
|
setup(__props) {
|
|
48
44
|
useCssVars((_ctx) => ({
|
|
49
|
-
"
|
|
45
|
+
"v4035b64a": padXPx.value
|
|
50
46
|
}));
|
|
51
47
|
const props = __props;
|
|
52
48
|
const { ctxRefine } = useContextDefaults({
|
|
53
49
|
getProps: () => props,
|
|
54
50
|
defaults: {
|
|
55
|
-
refine: ({ parentInfo, props: rawProps }) => rawProps.refine ?? (parentInfo === SlotRegion.AppPage_Default || parentInfo === SlotRegion.TabsMain_Item || parentInfo === SlotRegion.ModalConfirm_Body
|
|
51
|
+
refine: ({ parentInfo, props: rawProps }) => rawProps.refine ?? (parentInfo === SlotRegion.AppPage_Default || parentInfo === SlotRegion.TabsMain_Item || parentInfo === SlotRegion.ModalConfirm_Body || // 🔴 抽屉档 [MUST] 一起列上:两档都 provide 有界可用高,
|
|
52
|
+
// 漏它就是「抽屉里掉回自然流」(k2vnfp 换标时的连带)
|
|
53
|
+
parentInfo === SlotRegion.ModalConfirm_DrawerBody ? true : void 0)
|
|
56
54
|
}
|
|
57
55
|
});
|
|
58
56
|
const { viewportHeightFinal, nearestScope } = useChannelViewportHeight(props);
|
|
@@ -87,6 +85,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
87
85
|
goNext: listDetailCtx == null ? void 0 : listDetailCtx.goNext,
|
|
88
86
|
refreshList: listDetailCtx == null ? void 0 : listDetailCtx.refreshList
|
|
89
87
|
}));
|
|
88
|
+
watch(
|
|
89
|
+
() => [props.titleField, props.title],
|
|
90
|
+
([field, t]) => field == null ? void 0 : field.changeTitle(t),
|
|
91
|
+
{ immediate: true }
|
|
92
|
+
);
|
|
90
93
|
const hasHeader = computed(() => !!slots.header || !!props.title);
|
|
91
94
|
const hasBottom = computed(() => !!slots.bottom);
|
|
92
95
|
const toolbarProps = computed(() => ({
|
|
@@ -102,12 +105,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
102
105
|
showAutoRefresh: props.showAutoRefresh,
|
|
103
106
|
showRefresh: props.showRefresh,
|
|
104
107
|
padXPx: padXPx.value,
|
|
105
|
-
|
|
106
|
-
appBar: props.appBar,
|
|
107
|
-
back: props.back,
|
|
108
|
-
moreOptions: props.moreOptions,
|
|
109
|
-
onMoreSelect: props.onMoreSelect,
|
|
110
|
-
onMore: props.onMore
|
|
108
|
+
groupGapPx: toolbarGroupGapPx.value
|
|
111
109
|
}));
|
|
112
110
|
const hasToolbarContent = computed(
|
|
113
111
|
() => {
|
|
@@ -134,6 +132,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
134
132
|
)
|
|
135
133
|
);
|
|
136
134
|
const gapUnitPx = computed(() => `${gapUnit.value}px`);
|
|
135
|
+
const toolbarGroupGapPx = computed(
|
|
136
|
+
() => `${gapScaleValue(
|
|
137
|
+
(layoutBridge == null ? void 0 : layoutBridge.APP_LAYOUT_GAP_CONFIG.size) ?? DEFAULT_GAP_BASE,
|
|
138
|
+
"breath",
|
|
139
|
+
layoutBridge == null ? void 0 : layoutBridge.themeDensity.value
|
|
140
|
+
)}px`
|
|
141
|
+
);
|
|
137
142
|
const padXPx = computed(() => gapUnitPx.value);
|
|
138
143
|
const contentPaddingVertical = computed(() => gapUnit.value * 2);
|
|
139
144
|
const heightProviderViewportHeight = computed(
|
|
@@ -178,19 +183,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
178
183
|
fn: withCtx(() => [
|
|
179
184
|
renderSlot(_ctx.$slots, "header", {
|
|
180
185
|
data: data.value,
|
|
181
|
-
loading: loading.value
|
|
186
|
+
loading: loading.value,
|
|
187
|
+
title: __props.title
|
|
182
188
|
}, () => [
|
|
183
189
|
createTextVNode(toDisplayString(__props.title), 1)
|
|
184
190
|
], true)
|
|
185
191
|
]),
|
|
186
192
|
key: "0"
|
|
187
|
-
} : void 0,
|
|
188
|
-
_ctx.$slots.more ? {
|
|
189
|
-
name: "more",
|
|
190
|
-
fn: withCtx(() => [
|
|
191
|
-
renderSlot(_ctx.$slots, "more", {}, void 0, true)
|
|
192
|
-
]),
|
|
193
|
-
key: "1"
|
|
194
193
|
} : void 0
|
|
195
194
|
]), 1040, ["isAutoRefresh"])
|
|
196
195
|
]),
|
|
@@ -233,19 +232,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
233
232
|
fn: withCtx(() => [
|
|
234
233
|
renderSlot(_ctx.$slots, "header", {
|
|
235
234
|
data: data.value,
|
|
236
|
-
loading: loading.value
|
|
235
|
+
loading: loading.value,
|
|
236
|
+
title: __props.title
|
|
237
237
|
}, () => [
|
|
238
238
|
createTextVNode(toDisplayString(__props.title), 1)
|
|
239
239
|
], true)
|
|
240
240
|
]),
|
|
241
241
|
key: "0"
|
|
242
|
-
} : void 0,
|
|
243
|
-
_ctx.$slots.more ? {
|
|
244
|
-
name: "more",
|
|
245
|
-
fn: withCtx(() => [
|
|
246
|
-
renderSlot(_ctx.$slots, "more", {}, void 0, true)
|
|
247
|
-
]),
|
|
248
|
-
key: "1"
|
|
249
242
|
} : void 0
|
|
250
243
|
]), 1040, ["isAutoRefresh"]),
|
|
251
244
|
createElementVNode("div", _hoisted_3, [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _sfc_main from "./ViewLayoutToolbar.vue2.mjs";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
|
|
4
|
-
const ViewLayoutToolbar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4
|
+
const ViewLayoutToolbar = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-56bbc322"]]);
|
|
5
5
|
export {
|
|
6
6
|
ViewLayoutToolbar as default
|
|
7
7
|
};
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { defineComponent, useCssVars,
|
|
2
|
-
import { ElIcon, ElDropdown, ElDropdownMenu, ElDropdownItem } from "element-plus";
|
|
3
|
-
import { ArrowLeft, MoreFilled } from "@element-plus/icons-vue";
|
|
1
|
+
import { defineComponent, useCssVars, withDirectives, openBlock, createElementBlock, createElementVNode, renderSlot, createCommentVNode, createVNode, unref, createBlock, vShow } from "vue";
|
|
4
2
|
import AutoRefreshGroup from "../misc/AutoRefreshGroup.vue.mjs";
|
|
5
3
|
import _sfc_main$1 from "../display/ActionBtnGroup.vue.mjs";
|
|
6
4
|
import ViewLayoutNavigation from "./ViewLayoutNavigation.vue.mjs";
|
|
7
|
-
const _hoisted_1 = { class: "view-layout-
|
|
8
|
-
const _hoisted_2 = {
|
|
9
|
-
|
|
5
|
+
const _hoisted_1 = { class: "view-layout-toolbar" };
|
|
6
|
+
const _hoisted_2 = { class: "view-layout-toolbar__left" };
|
|
7
|
+
const _hoisted_3 = {
|
|
8
|
+
key: 0,
|
|
10
9
|
class: "dc-view-layout__header view-layout-header"
|
|
11
10
|
};
|
|
12
|
-
const
|
|
13
|
-
const _hoisted_4 = { class: "view-layout-toolbar__more" };
|
|
11
|
+
const _hoisted_4 = { class: "view-layout-toolbar__right" };
|
|
14
12
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
15
13
|
__name: "ViewLayoutToolbar",
|
|
16
14
|
props: {
|
|
@@ -27,65 +25,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
27
25
|
showAutoRefresh: { type: Boolean },
|
|
28
26
|
showRefresh: { type: Boolean },
|
|
29
27
|
padXPx: {},
|
|
30
|
-
|
|
31
|
-
back: { type: Function },
|
|
32
|
-
moreOptions: {},
|
|
33
|
-
onMoreSelect: { type: Function },
|
|
34
|
-
onMore: { type: Function }
|
|
28
|
+
groupGapPx: {}
|
|
35
29
|
},
|
|
36
30
|
emits: ["update:isAutoRefresh"],
|
|
37
31
|
setup(__props, { emit: __emit }) {
|
|
38
32
|
useCssVars((_ctx) => ({
|
|
39
|
-
"
|
|
33
|
+
"v466ae854": _ctx.padXPx,
|
|
34
|
+
"v93b5fbf4": _ctx.groupGapPx
|
|
40
35
|
}));
|
|
41
|
-
const props = __props;
|
|
42
36
|
const emit = __emit;
|
|
43
|
-
const slots = useSlots();
|
|
44
|
-
const showBack = computed(() => !!props.appBar && !!props.back);
|
|
45
|
-
const hasMoreMenu = computed(() => {
|
|
46
|
-
var _a;
|
|
47
|
-
return !!((_a = props.moreOptions) == null ? void 0 : _a.length);
|
|
48
|
-
});
|
|
49
|
-
const showMore = computed(
|
|
50
|
-
() => !!props.appBar && (hasMoreMenu.value || !!props.onMore || !!slots.more)
|
|
51
|
-
);
|
|
52
|
-
const rootClass = computed(() => ({
|
|
53
|
-
"view-layout-toolbar_app-bar": !!props.appBar
|
|
54
|
-
}));
|
|
55
37
|
return (_ctx, _cache) => {
|
|
56
|
-
return withDirectives((openBlock(), createElementBlock("div",
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
createElementVNode("div", _hoisted_1, [
|
|
60
|
-
showBack.value ? (openBlock(), createElementBlock("span", {
|
|
61
|
-
key: 0,
|
|
62
|
-
class: "view-layout-toolbar__back",
|
|
63
|
-
role: "button",
|
|
64
|
-
tabindex: "0",
|
|
65
|
-
"aria-label": "返回",
|
|
66
|
-
onClick: _cache[0] || (_cache[0] = ($event) => {
|
|
67
|
-
var _a;
|
|
68
|
-
return (_a = __props.back) == null ? void 0 : _a.call(__props);
|
|
69
|
-
}),
|
|
70
|
-
onKeydown: [
|
|
71
|
-
_cache[1] || (_cache[1] = withKeys(withModifiers(($event) => {
|
|
72
|
-
var _a;
|
|
73
|
-
return (_a = __props.back) == null ? void 0 : _a.call(__props);
|
|
74
|
-
}, ["prevent"]), ["enter"])),
|
|
75
|
-
_cache[2] || (_cache[2] = withKeys(withModifiers(($event) => {
|
|
76
|
-
var _a;
|
|
77
|
-
return (_a = __props.back) == null ? void 0 : _a.call(__props);
|
|
78
|
-
}, ["prevent"]), ["space"]))
|
|
79
|
-
]
|
|
80
|
-
}, [
|
|
81
|
-
createVNode(unref(ElIcon), null, {
|
|
82
|
-
default: withCtx(() => [
|
|
83
|
-
createVNode(unref(ArrowLeft))
|
|
84
|
-
]),
|
|
85
|
-
_: 1
|
|
86
|
-
})
|
|
87
|
-
], 32)) : createCommentVNode("", true),
|
|
88
|
-
__props.hasHeader ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
38
|
+
return withDirectives((openBlock(), createElementBlock("div", _hoisted_1, [
|
|
39
|
+
createElementVNode("div", _hoisted_2, [
|
|
40
|
+
__props.hasHeader ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
89
41
|
renderSlot(_ctx.$slots, "header", {}, void 0, true)
|
|
90
42
|
])) : createCommentVNode("", true),
|
|
91
43
|
createVNode(unref(_sfc_main$1), {
|
|
@@ -94,7 +46,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
94
46
|
"default-size": "small"
|
|
95
47
|
}, null, 8, ["configs", "ctx"])
|
|
96
48
|
]),
|
|
97
|
-
createElementVNode("div",
|
|
49
|
+
createElementVNode("div", _hoisted_4, [
|
|
98
50
|
__props.showNavigation ? (openBlock(), createBlock(ViewLayoutNavigation, {
|
|
99
51
|
key: 0,
|
|
100
52
|
ctx: __props.navigationCtx
|
|
@@ -110,75 +62,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
110
62
|
loading: __props.loading,
|
|
111
63
|
showAutoRefresh: __props.showAutoRefresh,
|
|
112
64
|
showRefresh: __props.showRefresh,
|
|
113
|
-
"onUpdate:isAutoRefresh": _cache[
|
|
114
|
-
}, null, 8, ["isAutoRefresh", "refreshFn", "loading", "showAutoRefresh", "showRefresh"])
|
|
115
|
-
showMore.value && hasMoreMenu.value ? (openBlock(), createBlock(unref(ElDropdown), {
|
|
116
|
-
key: 1,
|
|
117
|
-
trigger: "click",
|
|
118
|
-
onCommand: __props.onMoreSelect
|
|
119
|
-
}, {
|
|
120
|
-
dropdown: withCtx(() => [
|
|
121
|
-
createVNode(unref(ElDropdownMenu), null, {
|
|
122
|
-
default: withCtx(() => [
|
|
123
|
-
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.moreOptions, (item) => {
|
|
124
|
-
return openBlock(), createBlock(unref(ElDropdownItem), {
|
|
125
|
-
key: item.value,
|
|
126
|
-
command: item
|
|
127
|
-
}, {
|
|
128
|
-
default: withCtx(() => [
|
|
129
|
-
createTextVNode(toDisplayString(item.label), 1)
|
|
130
|
-
]),
|
|
131
|
-
_: 2
|
|
132
|
-
}, 1032, ["command"]);
|
|
133
|
-
}), 128))
|
|
134
|
-
]),
|
|
135
|
-
_: 1
|
|
136
|
-
})
|
|
137
|
-
]),
|
|
138
|
-
default: withCtx(() => [
|
|
139
|
-
createElementVNode("span", _hoisted_4, [
|
|
140
|
-
renderSlot(_ctx.$slots, "more", {}, () => [
|
|
141
|
-
createVNode(unref(ElIcon), null, {
|
|
142
|
-
default: withCtx(() => [
|
|
143
|
-
createVNode(unref(MoreFilled))
|
|
144
|
-
]),
|
|
145
|
-
_: 1
|
|
146
|
-
})
|
|
147
|
-
], true)
|
|
148
|
-
])
|
|
149
|
-
]),
|
|
150
|
-
_: 3
|
|
151
|
-
}, 8, ["onCommand"])) : showMore.value ? (openBlock(), createElementBlock("span", {
|
|
152
|
-
key: 2,
|
|
153
|
-
class: "view-layout-toolbar__more",
|
|
154
|
-
role: "button",
|
|
155
|
-
tabindex: "0",
|
|
156
|
-
onClick: _cache[4] || (_cache[4] = ($event) => {
|
|
157
|
-
var _a;
|
|
158
|
-
return (_a = __props.onMore) == null ? void 0 : _a.call(__props);
|
|
159
|
-
}),
|
|
160
|
-
onKeydown: [
|
|
161
|
-
_cache[5] || (_cache[5] = withKeys(withModifiers(($event) => {
|
|
162
|
-
var _a;
|
|
163
|
-
return (_a = __props.onMore) == null ? void 0 : _a.call(__props);
|
|
164
|
-
}, ["prevent"]), ["enter"])),
|
|
165
|
-
_cache[6] || (_cache[6] = withKeys(withModifiers(($event) => {
|
|
166
|
-
var _a;
|
|
167
|
-
return (_a = __props.onMore) == null ? void 0 : _a.call(__props);
|
|
168
|
-
}, ["prevent"]), ["space"]))
|
|
169
|
-
]
|
|
170
|
-
}, [
|
|
171
|
-
renderSlot(_ctx.$slots, "more", {}, () => [
|
|
172
|
-
createVNode(unref(ElIcon), null, {
|
|
173
|
-
default: withCtx(() => [
|
|
174
|
-
createVNode(unref(MoreFilled))
|
|
175
|
-
]),
|
|
176
|
-
_: 1
|
|
177
|
-
})
|
|
178
|
-
], true)
|
|
179
|
-
], 32)) : createCommentVNode("", true)
|
|
65
|
+
"onUpdate:isAutoRefresh": _cache[0] || (_cache[0] = ($event) => emit("update:isAutoRefresh", $event))
|
|
66
|
+
}, null, 8, ["isAutoRefresh", "refreshFn", "loading", "showAutoRefresh", "showRefresh"])
|
|
180
67
|
])
|
|
181
|
-
],
|
|
68
|
+
], 512)), [
|
|
182
69
|
[vShow, __props.visible]
|
|
183
70
|
]);
|
|
184
71
|
};
|
|
@@ -7,6 +7,7 @@ var SlotRegion = /* @__PURE__ */ ((SlotRegion2) => {
|
|
|
7
7
|
SlotRegion2[SlotRegion2["AppPage_Left"] = 5] = "AppPage_Left";
|
|
8
8
|
SlotRegion2[SlotRegion2["TabsMain_Item"] = 6] = "TabsMain_Item";
|
|
9
9
|
SlotRegion2[SlotRegion2["ModalConfirm_Body"] = 7] = "ModalConfirm_Body";
|
|
10
|
+
SlotRegion2[SlotRegion2["ModalConfirm_DrawerBody"] = 8] = "ModalConfirm_DrawerBody";
|
|
10
11
|
return SlotRegion2;
|
|
11
12
|
})(SlotRegion || {});
|
|
12
13
|
const parseSlotRegion = (raw) => {
|
package/es/hooks/use-surface.mjs
CHANGED
|
@@ -7,6 +7,11 @@ const useSurface = (getProps) => {
|
|
|
7
7
|
const { ctxSurface } = useContextDefaults({
|
|
8
8
|
getProps,
|
|
9
9
|
defaults: {
|
|
10
|
+
// 🔴 只对 **modal 正文**关面:那一档的底是抬升面(`--el-bg-color-overlay`)。
|
|
11
|
+
// **抽屉正文自 v0.32.0 起取底色**(`ModalConfirm_DrawerBody`)⇒ 那儿 [MUST] 自持面,
|
|
12
|
+
// 否则内容直接摊在底色上(与「空占位没有面」是同一种坏法,范围更大)。
|
|
13
|
+
// [MUST NOT] 写成 `parentInfo !== ModalConfirm_Body` 之外再排除抽屉档 ——
|
|
14
|
+
// 判据是「**脚下是不是一块面**」,抽屉那档的答案是「不是」。
|
|
10
15
|
surface: ({ parentInfo, props: rawProps }) => rawProps.surface ?? parentInfo !== SlotRegion.ModalConfirm_Body
|
|
11
16
|
}
|
|
12
17
|
});
|
|
@@ -158,6 +158,24 @@ const RHYTHM_STYLE_EL_ID = "dc-core-rhythm";
|
|
|
158
158
|
const EP_BRIDGE_STYLE_EL_ID = "dc-core-ep-bridge";
|
|
159
159
|
const EP_STRUCTURAL_STYLE_EL_ID = "dc-core-ep-structural";
|
|
160
160
|
const EP_STRUCTURAL_CSS = [
|
|
161
|
+
// ElSwitch 关闭态:EP 默认 `--el-switch-off-color: var(--el-border-color)`,
|
|
162
|
+
// 而边框色是**给分隔线用的最浅档** ⇒ 开关整体几乎看不见。
|
|
163
|
+
// 🔴 依据是 CDP 实测对比度(对白底 / 对近黑底),[MUST NOT] 只看顺眼:
|
|
164
|
+
// --el-border-color(EP 默认,现状) 1.33 / 2.18 ← 两侧都远低于下限
|
|
165
|
+
// --el-border-color-dark 1.44 / 2.60
|
|
166
|
+
// --el-text-color-placeholder 2.30 / 5.75 ← 亮色仍不过
|
|
167
|
+
// --el-text-color-secondary 3.08 / 7.56 ← **取它**:两侧都过且最轻
|
|
168
|
+
// --el-text-color-regular 6.11 / 12.29 ← 过重,关闭态会读成开启
|
|
169
|
+
// 下限取 3:1 —— WCAG 1.4.11 对**非文字 UI 控件**的可辨识要求;开关的轨道就是它的边界。
|
|
170
|
+
// ⚠️ 落点 [MUST] 在此而非组件 scoped:开关广泛散在各族与业务页,
|
|
171
|
+
// 逐处改既漏又会各定各的(同 .el-badge__content 那条的理由)。
|
|
172
|
+
// ⚠️ 这是**全仓所有 ElSwitch** 的关闭态观感变更,[MUST] 在 migrations 登记。
|
|
173
|
+
".el-switch {",
|
|
174
|
+
" --el-switch-off-color: var(",
|
|
175
|
+
" --dc-core-text-color-secondary,",
|
|
176
|
+
" var(--el-text-color-secondary)",
|
|
177
|
+
" );",
|
|
178
|
+
"}",
|
|
161
179
|
// 居中浮层(Dialog / MessageBox)+ 抽屉(Drawer):1px 主题描边硬边界
|
|
162
180
|
// (--el-border-color 类明暗自换:亮色浅灰近隐形、暗色中灰清晰)。
|
|
163
181
|
".el-dialog,",
|
package/es/index.mjs
CHANGED
|
@@ -32,7 +32,7 @@ import { APP_GLOBAL_IMAGE_PREVIEW_KEY, APP_GLOBAL_VIDEO_PREVIEW_KEY, GLOBAL_MODA
|
|
|
32
32
|
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, FORM_VALIDATE_ERROR_KEYS, NEST_LAYOUT_SCALE_KEY, SCOPE_VIEWPORT_MAX_HEIGHT, TABS_MAIN_VISUAL_LEVEL, getModalShelfInjectionKey } from "./inject/key.mjs";
|
|
33
33
|
import { APP_PAGE_LIST_LAYOUT_RECOMMENDED } from "./components/app-layout/app-page-recommended.mjs";
|
|
34
34
|
import { APP_PAGE_SIDE_SLOTS, DC_SLOT_ATTR, SlotRegion, parseSlotRegion, resolveAppPageSlotName } from "./config/slot-region.mjs";
|
|
35
|
-
import { APP_PAGE_SLOT_Z_INDEX, computeAppPageContentInset, computeAppPageReducedViewportHeight, computeAppPageReducedViewportWidth, computeAppPageSlotShimStyles, computeAppPageSlotStyles } from "./components/app-layout/app-page-geometry.mjs";
|
|
35
|
+
import { APP_PAGE_SLOT_Z_INDEX, appPageSlotInset, computeAppPageContentInset, computeAppPageReducedViewportHeight, computeAppPageReducedViewportWidth, computeAppPageSlotShimStyles, computeAppPageSlotStyles } from "./components/app-layout/app-page-geometry.mjs";
|
|
36
36
|
import { default as default32 } from "./components/display/ActionConfirm.vue.mjs";
|
|
37
37
|
import { default as default33 } from "./components/app-layout/AppAside.vue.mjs";
|
|
38
38
|
import { default as default34 } from "./components/app-layout/AppBody.vue.mjs";
|
|
@@ -112,6 +112,7 @@ import { resolveBreakpointByWidth, resolveRootEl, useCustomBreakpoint } from "./
|
|
|
112
112
|
import { themeScaleDerive, themeScaleIsNearBlack, themeScaleMix, themeScalePageColor, themeScaleParseHex, themeScaleSurfaceColor, themeScaleToRgba } from "./utils/theme-scale.mjs";
|
|
113
113
|
import { timeCountDown } from "./utils/time.mjs";
|
|
114
114
|
import { useActivated, useActivatedEvent, useActivatedExec } from "./hooks/activated.mjs";
|
|
115
|
+
import { useAppPageTitleField } from "./components/app-layout/use-app-page-title-field.mjs";
|
|
115
116
|
import { useBreakpoint } from "./hooks/use-breakpoint.mjs";
|
|
116
117
|
import { useChannelViewportHeight } from "./hooks/use-channel-viewport-height.mjs";
|
|
117
118
|
import { useCoreViewportApply } from "./hooks/use-viewport-apply.mjs";
|
|
@@ -240,6 +241,7 @@ export {
|
|
|
240
241
|
default77 as VideoPreviewTrigger,
|
|
241
242
|
default78 as ViewLayout,
|
|
242
243
|
default31 as WatchSize,
|
|
244
|
+
appPageSlotInset,
|
|
243
245
|
buildRhythmCss,
|
|
244
246
|
ceilToTier,
|
|
245
247
|
checkFormItemIsIgnore,
|
|
@@ -314,6 +316,7 @@ export {
|
|
|
314
316
|
useActivated,
|
|
315
317
|
useActivatedEvent,
|
|
316
318
|
useActivatedExec,
|
|
319
|
+
useAppPageTitleField,
|
|
317
320
|
useBreakpoint,
|
|
318
321
|
useChannelViewportHeight,
|
|
319
322
|
useCoreThemeApply,
|
package/es/store/app.mjs
CHANGED
|
@@ -126,7 +126,13 @@ function createAppStore(deps) {
|
|
|
126
126
|
() => hasHeader.value ? `calc(${viewportPadding.value.top} + ${gpx.value} + ${headerStyle.value.height} + ${gpx.value})` : `calc(${viewportPadding.value.top} + ${gpx.value})`
|
|
127
127
|
);
|
|
128
128
|
const contentTop = computed(
|
|
129
|
-
() => hasHeader.value ? `calc(${viewportPadding.value.top} + ${gpx.value} + ${headerStyle.value.height} + ${outerPx.value})` :
|
|
129
|
+
() => hasHeader.value ? `calc(${viewportPadding.value.top} + ${gpx.value} + ${headerStyle.value.height} + ${outerPx.value})` : (
|
|
130
|
+
// 🔴 **无 header ⇒ 内容自己就是最外层**,该拿**模块档**(chrome 贴视口边那一档),
|
|
131
|
+
// [MUST NOT] 继续拿外圈档(r8kvnd):外圈档量的是「内容 ↔ chrome」,
|
|
132
|
+
// 没有 chrome 时它顶替的是 header 的位置,理应与 header 同档
|
|
133
|
+
// —— 否则最外层距视口边随有没有 chrome 在 8 / 16 之间跳。
|
|
134
|
+
`calc(${viewportPadding.value.top} + ${gpx.value})`
|
|
135
|
+
)
|
|
130
136
|
);
|
|
131
137
|
const footerStyle = computed(() => {
|
|
132
138
|
const cfg = bridge.APP_LAYOUT_FOOTER_CONFIG;
|
|
@@ -186,16 +192,26 @@ function createAppStore(deps) {
|
|
|
186
192
|
});
|
|
187
193
|
const bodyStyle = computed(() => {
|
|
188
194
|
return {
|
|
189
|
-
// 🔴
|
|
190
|
-
//
|
|
195
|
+
// 🔴 **内容 ↔ chrome 让外圈档,内容 ↔ viewport 边让模块档**(r8kvnd 更正 huhyx7):
|
|
196
|
+
// 原口径把两者当成同一件事(都算「内容对外」)—— 其实是两件。没有 chrome 时
|
|
197
|
+
// **内容接替的是 chrome 的角色(最外层元素)**,就该拿 chrome 那一档。
|
|
198
|
+
// ⚠️ 底边(`paddingBottom`)暂未改:它是**无条件**的(footer 在流内),
|
|
199
|
+
// 动它全仓每页都变,[MUST] 由甲方拍板 —— 见回池条目。
|
|
191
200
|
// 它同时**接替了已废弃的 shimPadding** —— 此前这段留白由
|
|
192
201
|
// `gap + shimPadding` 两处各给一半,同一段空白两个来源正是要消除的冗余。
|
|
193
202
|
// 内容左让位:外框左 + 外圈;有 sidebar 再加 sidebar 宽(sidebar 自身左边已让模块档)。
|
|
194
|
-
paddingLeft: showSidebar.value ? `calc(${viewportPadding.value.left} + ${gpx.value} + ${sidebarStyle.value.width} + ${outerPx.value})` :
|
|
203
|
+
paddingLeft: showSidebar.value ? `calc(${viewportPadding.value.left} + ${gpx.value} + ${sidebarStyle.value.width} + ${outerPx.value})` : (
|
|
204
|
+
// 无 sidebar ⇒ 内容就是最外层,取模块档(同 contentTop 的注释,r8kvnd)
|
|
205
|
+
`calc(${viewportPadding.value.left} + ${gpx.value})`
|
|
206
|
+
),
|
|
195
207
|
// 顶让位 = 内容行顶(与 sidebar/aside 同行,但内容对 header 让外圈档)。
|
|
196
208
|
paddingTop: contentTop.value,
|
|
197
209
|
// 右让位(对称左):外框右 + 外圈;有 aside 再加 aside 宽。
|
|
198
|
-
paddingRight: showAside.value ? `calc(${viewportPadding.value.right} + ${gpx.value} + ${asideStyle.value.width} + ${outerPx.value})` :
|
|
210
|
+
paddingRight: showAside.value ? `calc(${viewportPadding.value.right} + ${gpx.value} + ${asideStyle.value.width} + ${outerPx.value})` : (
|
|
211
|
+
// 无 aside ⇒ 同上([MUST NOT] 只改左右不改上 —— 那会变成左右 8 / 上下 16,
|
|
212
|
+
// 上下比左右宽一倍,比原来四边都 16 更怪)
|
|
213
|
+
`calc(${viewportPadding.value.right} + ${gpx.value})`
|
|
214
|
+
),
|
|
199
215
|
// 底让位:外框下 + 外圈(footer 在流内,其底悬浮由此承担)。
|
|
200
216
|
paddingBottom: `calc(${viewportPadding.value.bottom} + ${outerPx.value})`,
|
|
201
217
|
// 底色:**缺省不铺**(akw76r)——.app-body 是容器,容器一律透明,布局底由全局
|
|
@@ -214,19 +230,18 @@ function createAppStore(deps) {
|
|
|
214
230
|
const vpCfg = bridge.APP_LAYOUT_VIEWPORT_CONFIG;
|
|
215
231
|
const asideEffWidth = showAside.value && !bridge.layout.asideCollapsed.value ? bridge.APP_LAYOUT_ASIDE_CONFIG.width : 0;
|
|
216
232
|
return {
|
|
217
|
-
top: hasHeader.value ? vpCfg.paddingTop + g + headerHeight.value + o : vpCfg.paddingTop +
|
|
233
|
+
top: hasHeader.value ? vpCfg.paddingTop + g + headerHeight.value + o : vpCfg.paddingTop + g,
|
|
218
234
|
bottom: hasFooter.value ? vpCfg.paddingBottom + g + footerHeight.value + o : vpCfg.paddingBottom + o,
|
|
219
|
-
left: showSidebar.value ? vpCfg.paddingLeft + g + sidebarWidth.value + o : vpCfg.paddingLeft +
|
|
220
|
-
right: showAside.value ? vpCfg.paddingRight + g + asideEffWidth + o : vpCfg.paddingRight +
|
|
235
|
+
left: showSidebar.value ? vpCfg.paddingLeft + g + sidebarWidth.value + o : vpCfg.paddingLeft + g,
|
|
236
|
+
right: showAside.value ? vpCfg.paddingRight + g + asideEffWidth + o : vpCfg.paddingRight + g
|
|
221
237
|
};
|
|
222
238
|
});
|
|
223
239
|
const bodyShimStyle = computed(() => {
|
|
224
240
|
const headerSub = hasHeader.value ? ` - ${headerStyle.value.height} - ${gpx.value}` : "";
|
|
225
241
|
const footerSub = hasFooter.value ? ` - ${footerStyle.value.height} - ${gpx.value}` : "";
|
|
242
|
+
const topSub = hasHeader.value ? outerPx.value : gpx.value;
|
|
226
243
|
return {
|
|
227
|
-
|
|
228
|
-
// (内容对外恒让外圈),[MUST] 一起改,否则可用高与实际内容盒对不上。
|
|
229
|
-
minHeight: `calc(100vh - ${viewportPadding.value.top} - ${viewportPadding.value.bottom} - ${outerPx.value} - ${outerPx.value}${headerSub}${footerSub})`
|
|
244
|
+
minHeight: `calc(100vh - ${viewportPadding.value.top} - ${viewportPadding.value.bottom} - ${topSub} - ${outerPx.value}${headerSub}${footerSub})`
|
|
230
245
|
// 🔴 **不铺 padding**(huhyx7 A 条):四周留白已由 bodyStyle 的外圈档给过,
|
|
231
246
|
// 这里再铺一层就是同一段空白两个来源 —— 那正是本批要消除的冗余。
|
|
232
247
|
// 原 `shimPadding` 已废弃(见 APP_LAYOUT_BODY_CONFIG.shimPadding 的 @deprecated)。
|