@done-coding/admin-core 0.31.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.
Files changed (80) hide show
  1. package/es/bridge/config-hook.mjs +3 -0
  2. package/es/bridge/index.mjs +6 -0
  3. package/es/bridge/theme/index.mjs +11 -3
  4. package/es/components/app-layout/AppBody.vue.mjs +1 -1
  5. package/es/components/app-layout/AppBody.vue2.mjs +2 -2
  6. package/es/components/app-layout/AppPage.vue.mjs +1 -1
  7. package/es/components/app-layout/AppPage.vue2.mjs +175 -33
  8. package/es/components/app-layout/AppPageNavBar.vue.mjs +7 -0
  9. package/es/components/app-layout/AppPageNavBar.vue2.mjs +148 -0
  10. package/es/components/app-layout/app-page-geometry.mjs +3 -2
  11. package/es/components/app-layout/app-page-slot-surface.mjs +31 -0
  12. package/es/components/app-layout/use-app-page-title-field.mjs +41 -0
  13. package/es/components/data-view/DataGridView.vue.mjs +1 -1
  14. package/es/components/data-view/DataGridView.vue2.mjs +2 -1
  15. package/es/components/data-view/DataListView.vue.mjs +1 -1
  16. package/es/components/data-view/DataListView.vue2.mjs +14 -9
  17. package/es/components/data-view/DataListViewItem.vue.mjs +1 -1
  18. package/es/components/data-view/DataListViewItem.vue2.mjs +3 -1
  19. package/es/components/data-view/InfiniteListView.vue.mjs +1 -1
  20. package/es/components/data-view/InfiniteListView.vue2.mjs +25 -18
  21. package/es/components/data-view/use-grid-layout.mjs +13 -15
  22. package/es/components/display/TabsMain.vue.mjs +3 -1
  23. package/es/components/display/use-badge.mjs +10 -3
  24. package/es/components/form/FormItem.vue.mjs +1 -1
  25. package/es/components/form/FormMain.vue.mjs +1 -1
  26. package/es/components/form/FormMain.vue2.mjs +11 -4
  27. package/es/components/form/FormSearch.vue.mjs +1 -1
  28. package/es/components/form/FormSearch.vue2.mjs +12 -4
  29. package/es/components/form/FormSubmitPanel.vue.mjs +1 -1
  30. package/es/components/form/FormSubmitPanel.vue2.mjs +2 -0
  31. package/es/components/form/use-ai-fill.mjs +7 -1
  32. package/es/components/list-layout/ListLayout.vue.mjs +1 -1
  33. package/es/components/list-layout/ListLayout.vue2.mjs +19 -10
  34. package/es/components/modal/ModalConfirm.vue.mjs +1 -1
  35. package/es/components/modal/ModalConfirm.vue2.mjs +28 -5
  36. package/es/components/table/TableToolbar.vue.mjs +1 -1
  37. package/es/components/table/TableToolbar.vue2.mjs +15 -1
  38. package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
  39. package/es/components/view-layout/ViewLayout.vue2.mjs +22 -29
  40. package/es/components/view-layout/ViewLayoutToolbar.vue.mjs +1 -1
  41. package/es/components/view-layout/ViewLayoutToolbar.vue2.mjs +16 -129
  42. package/es/config/slot-region.mjs +1 -0
  43. package/es/hooks/use-surface.mjs +5 -0
  44. package/es/hooks/use-theme-apply.mjs +18 -0
  45. package/es/index.mjs +4 -1
  46. package/es/store/app.mjs +26 -11
  47. package/es/style.css +230 -172
  48. package/package.json +2 -2
  49. package/src/bridge/docs/README.md +19 -3
  50. package/src/components/app-layout/docs/README-AppBody.md +25 -1
  51. package/src/components/app-layout/docs/README-AppHeader.md +1 -1
  52. package/src/components/app-layout/docs/README-AppPage.md +172 -3
  53. package/src/components/data-view/docs/README-DataListView.md +40 -1
  54. package/src/components/data-view/docs/README-InfiniteListView.md +68 -4
  55. package/src/components/display/docs/README-BadgeMark.md +18 -10
  56. package/src/components/form/docs/README-FormMain.md +26 -0
  57. package/src/components/list-layout/docs/README-ListLayout.md +12 -1
  58. package/src/components/menu/README.md +1 -1
  59. package/src/components/modal/docs/README-ModalConfirm.md +57 -0
  60. package/src/components/view-layout/docs/README-ViewLayout.md +46 -129
  61. package/types/bridge/config-hook.d.ts +5 -2
  62. package/types/bridge/index.d.ts +22 -0
  63. package/types/components/app-layout/AppPage.vue.d.ts +43 -1
  64. package/types/components/app-layout/AppPageNavBar.vue.d.ts +48 -0
  65. package/types/components/app-layout/app-page-geometry.d.ts +27 -2
  66. package/types/components/app-layout/app-page-slot-surface.d.ts +18 -0
  67. package/types/components/app-layout/index.d.ts +1 -0
  68. package/types/components/app-layout/types.d.ts +37 -1
  69. package/types/components/app-layout/use-app-page-title-field.d.ts +49 -0
  70. package/types/components/data-view/DataListViewItem.vue.d.ts +7 -0
  71. package/types/components/data-view/types.d.ts +26 -3
  72. package/types/components/data-view/use-grid-layout.d.ts +31 -6
  73. package/types/components/form/types.d.ts +8 -2
  74. package/types/components/list-layout/ListLayout.vue.d.ts +23 -2
  75. package/types/components/list-layout/types.d.ts +7 -0
  76. package/types/components/view-layout/ViewLayout.vue.d.ts +4 -16
  77. package/types/components/view-layout/ViewLayoutToolbar.vue.d.ts +3 -9
  78. package/types/components/view-layout/types.d.ts +11 -50
  79. package/types/config/slot-region.d.ts +17 -1
  80. 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, unref, normalizeClass, renderSlot, createElementBlock, Fragment, createTextVNode, toDisplayString, createCommentVNode, createVNode } from "vue";
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 { BODY_CONTENT_VIEWPORT_HEIGHT, SCOPE_VIEWPORT_MAX_HEIGHT } from "../../inject/key.mjs";
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": unref(SlotRegion).ModalConfirm_Body
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-0220e327"]]);
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, useModel, computed, ref, withDirectives, openBlock, createElementBlock, createElementVNode, createBlock, unref, withCtx, createVNode, createTextVNode, createCommentVNode, vShow, mergeModels } from "vue";
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-f386aec7"]]);
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
- appBar: { type: Boolean },
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
- "v5975c734": padXPx.value
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 ? true : void 0)
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
- // appBar 形态四件套原样下传(gate 判定收在子组件里,见其 showBack / showMore)
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-99d466e9"]]);
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, useSlots, computed, withDirectives, openBlock, createElementBlock, normalizeClass, createElementVNode, withKeys, withModifiers, createVNode, unref, withCtx, createCommentVNode, renderSlot, createBlock, Fragment, renderList, createTextVNode, toDisplayString, vShow } from "vue";
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-toolbar__left" };
8
- const _hoisted_2 = {
9
- key: 1,
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 _hoisted_3 = { class: "view-layout-toolbar__right" };
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
- appBar: { type: Boolean },
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
- "v507b6fb2": _ctx.padXPx
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
- class: normalizeClass(["view-layout-toolbar", rootClass.value])
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", _hoisted_3, [
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[3] || (_cache[3] = ($event) => emit("update:isAutoRefresh", $event))
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
- ], 2)), [
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) => {
@@ -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})` : `calc(${viewportPadding.value.top} + ${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
- // 🔴 内容四边一律让**外圈档**(huhyx7):内容 ↔ chrome、内容 ↔ viewport
190
- // 都是「内容对外」的那一档,比 chrome 模块彼此的 ×1 多一档。
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})` : `calc(${viewportPadding.value.left} + ${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})` : `calc(${viewportPadding.value.right} + ${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 + o,
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 + o,
220
- right: showAside.value ? vpCfg.paddingRight + g + asideEffWidth + o : vpCfg.paddingRight + o
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
- // 上下两处从 gap 改**外圈档**:与 bodyStyle paddingTop/Bottom 逐项同式
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)。