@done-coding/admin-core 0.29.1-alpha.0 → 0.30.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 (66) hide show
  1. package/es/bridge/badge.mjs +7 -1
  2. package/es/components/app-layout/AppPage.vue.mjs +1 -1
  3. package/es/components/app-layout/AppPage.vue2.mjs +15 -8
  4. package/es/components/app-layout/app-page-geometry.mjs +7 -3
  5. package/es/components/app-layout/use-slot-misuse-warn.mjs +40 -0
  6. package/es/components/data-view/DataGridView.vue.mjs +1 -1
  7. package/es/components/data-view/DataGridView.vue2.mjs +83 -32
  8. package/es/components/data-view/DataGridViewCard.vue.mjs +41 -0
  9. package/es/components/data-view/DataGridViewCard.vue2.mjs +4 -0
  10. package/es/components/data-view/InfiniteListView.vue.mjs +1 -1
  11. package/es/components/data-view/InfiniteListView.vue2.mjs +38 -11
  12. package/es/components/display/BadgeMark.vue.mjs +1 -1
  13. package/es/components/display/BadgeMark.vue2.mjs +31 -33
  14. package/es/components/display/use-badge.mjs +37 -33
  15. package/es/components/form/FormGroupTitle.vue.mjs +1 -1
  16. package/es/components/form/FormItem.vue.mjs +1 -1
  17. package/es/components/form/FormItemNestForm.vue.mjs +1 -1
  18. package/es/components/form/FormItemNestFormList.vue.mjs +1 -1
  19. package/es/components/form/FormTree.vue.mjs +5 -30
  20. package/es/components/form/FormTree.vue2.mjs +30 -1
  21. package/es/components/form/FormUpload.vue.mjs +1 -1
  22. package/es/components/modal/ModalPorter.vue.mjs +2 -0
  23. package/es/components/modal/use-slot-misuse-warn.mjs +22 -0
  24. package/es/components/page-layout/AppPageListDetailSplit.vue.mjs +1 -1
  25. package/es/components/page-layout/AppPageListDetailSplit.vue2.mjs +7 -7
  26. package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
  27. package/es/components/view-layout/ViewLayout.vue2.mjs +71 -91
  28. package/es/components/view-layout/ViewLayoutToolbar.vue.mjs +7 -0
  29. package/es/components/view-layout/ViewLayoutToolbar.vue2.mjs +189 -0
  30. package/es/config/slot-region.mjs +23 -1
  31. package/es/hooks/use-custom-breakpoint.mjs +12 -2
  32. package/es/hooks/use-is-dev.mjs +16 -0
  33. package/es/hooks/use-theme-apply.mjs +2 -2
  34. package/es/index.mjs +90 -88
  35. package/es/style.css +138 -87
  36. package/package.json +2 -2
  37. package/src/bridge/docs/README.md +34 -4
  38. package/src/components/app-layout/docs/README-AppPage.md +68 -0
  39. package/src/components/data-view/docs/README-DataGridView.md +83 -1
  40. package/src/components/data-view/docs/README-DataListView.md +5 -2
  41. package/src/components/display/docs/README-BadgeMark.md +102 -41
  42. package/src/components/form/README.md +14 -0
  43. package/src/components/form/docs/README-FormItemNestForm.md +3 -0
  44. package/src/components/form/docs/README-FormItemNestFormList.md +3 -0
  45. package/src/components/form/docs/README-FormUpload.md +3 -0
  46. package/src/components/modal/docs/README-ModalPorter.md +26 -0
  47. package/src/components/page-layout/docs/README-AppPageListDetailLayout.md +1 -1
  48. package/src/components/view-layout/docs/README-ViewLayout.md +152 -9
  49. package/src/hooks/docs/README.md +37 -1
  50. package/types/bridge/badge.d.ts +38 -2
  51. package/types/components/app-layout/AppPage.vue.d.ts +16 -0
  52. package/types/components/app-layout/app-page-geometry.d.ts +26 -2
  53. package/types/components/app-layout/use-slot-misuse-warn.d.ts +19 -0
  54. package/types/components/data-view/DataGridView.vue.d.ts +9 -0
  55. package/types/components/data-view/DataGridViewCard.vue.d.ts +25 -0
  56. package/types/components/data-view/types.d.ts +63 -0
  57. package/types/components/display/BadgeMark.vue.d.ts +9 -8
  58. package/types/components/display/use-badge.d.ts +22 -14
  59. package/types/components/modal/use-slot-misuse-warn.d.ts +21 -0
  60. package/types/components/view-layout/ViewLayout.vue.d.ts +16 -0
  61. package/types/components/view-layout/ViewLayoutToolbar.vue.d.ts +52 -0
  62. package/types/components/view-layout/types.d.ts +56 -0
  63. package/types/config/slot-region.d.ts +12 -0
  64. package/types/hooks/use-custom-breakpoint.d.ts +1 -12
  65. package/types/hooks/use-is-dev.d.ts +24 -0
  66. package/types/injectInfo.json.d.ts +1 -1
package/es/style.css CHANGED
@@ -66,31 +66,35 @@
66
66
  justify-content: flex-end;
67
67
  gap: 8px;
68
68
  }
69
- .badge-mark[data-v-9eb89306] .el-badge__content.is-fixed {
69
+ .badge-mark[data-v-64f0421b] .el-badge__content.is-fixed {
70
70
  right: 0;
71
71
  transform: translateY(-50%) translateX(calc(100% + 2px));
72
72
  }
73
- .badge-mark_middle[data-v-9eb89306] .el-badge__content.is-fixed {
73
+ .badge-mark_middle[data-v-64f0421b] .el-badge__content.is-fixed {
74
74
  top: 50%;
75
75
  }
76
- .badge-mark[data-v-9eb89306] .badge-mark__icon {
77
- display: block;
78
- font-size: 1em;
79
- line-height: 1;
76
+ .badge-mark_hidden[data-v-64f0421b] .el-badge__content {
77
+ width: 0;
78
+ height: 0;
79
+ min-width: 0;
80
+ padding: 0;
81
+ border-width: 0;
82
+ overflow: hidden;
83
+ pointer-events: none;
80
84
  }
81
- .app-page[data-v-facaf577] {
82
- --dc-page-content-viewport-top: var(--v14c1dc69);
83
- --dc-page-content-viewport-bottom: var(--v6d1cb697);
84
- --dc-page-content-viewport-left: var(--f914311a);
85
- --dc-page-content-viewport-right: var(--v28c52fa0);
86
- --dc-page-content-viewport-width: var(--v2838584c);
87
- --dc-page-content-viewport-height: var(--v76c7ad93);
85
+ .app-page[data-v-73e3d4a9] {
86
+ --dc-page-content-viewport-top: var(--v62d8191f);
87
+ --dc-page-content-viewport-bottom: var(--v7adfb621);
88
+ --dc-page-content-viewport-left: var(--v0fb17d06);
89
+ --dc-page-content-viewport-right: var(--v0d174f66);
90
+ --dc-page-content-viewport-width: var(--v0d5dbb10);
91
+ --dc-page-content-viewport-height: var(--f6eaa5c6);
88
92
  }
89
- .app-page-shim[data-v-facaf577] {
93
+ .app-page-shim[data-v-73e3d4a9] {
90
94
  display: flow-root;
91
- --app-viewport-max-height: var(--v9258c294);
95
+ --app-viewport-max-height: var(--v4ad30b28);
92
96
  }
93
- .app-page-slot-shim[data-v-facaf577] {
97
+ .app-page-slot-shim[data-v-73e3d4a9] {
94
98
  box-sizing: border-box;
95
99
  width: 100%;
96
100
  height: 100%;
@@ -131,61 +135,91 @@ to {
131
135
  text-align: center;
132
136
  font-variant-numeric: tabular-nums;
133
137
  }
134
- .view-layout-header[data-v-3c6fd3fe] {
135
- flex: 0 1 auto;
136
- min-width: 0;
137
- overflow: hidden;
138
- color: var(--el-text-color-primary);
139
- font-size: 16px;
140
- font-weight: 600;
141
- line-height: 1.4;
142
- white-space: nowrap;
143
- text-overflow: ellipsis;
144
- }
145
- .view-layout[data-v-3c6fd3fe] {
146
- display: flex;
147
- flex-direction: column;
148
- }
149
- .view-layout-toolbar[data-v-3c6fd3fe] {
138
+ .view-layout-toolbar[data-v-99d466e9] {
150
139
  display: flex;
151
140
  justify-content: space-between;
152
141
  align-items: center;
153
- padding: 0 var(--v72fb5e44) 0 var(--v7243a29e);
142
+ padding: 0 var(--v507b6fb2);
154
143
  position: relative;
155
144
  gap: 20px;
156
145
  background: color-mix(in srgb, var(--dc-core-surface, var(--el-bg-color)) 50%, var(--dc-core-ground, var(--el-bg-color-page)));
157
146
  border-radius: 0;
158
147
  }
159
- .view-layout-toolbar[data-v-3c6fd3fe]::before {
148
+ .view-layout-toolbar[data-v-99d466e9]::before {
160
149
  content: "";
161
150
  position: absolute;
162
151
  top: 0;
163
- bottom: 0;
164
152
  left: 0;
165
- width: 3px;
153
+ width: calc(var(--v507b6fb2) * 3);
154
+ height: 3px;
166
155
  border-radius: 3px;
167
156
  background: var(--dc-core-primary-color, var(--el-color-primary));
168
157
  }
169
- .view-layout-toolbar__left[data-v-3c6fd3fe],
170
- .view-layout-toolbar__right[data-v-3c6fd3fe] {
158
+ .view-layout-toolbar_app-bar[data-v-99d466e9] {
159
+ box-shadow: 0 2px 8px -4px var(--dc-core-border-color, var(--el-border-color));
160
+ min-height: 44px;
161
+ }
162
+ .view-layout-toolbar_app-bar[data-v-99d466e9]::before {
163
+ content: none;
164
+ }
165
+ .view-layout-toolbar__back[data-v-99d466e9],
166
+ .view-layout-toolbar__more[data-v-99d466e9] {
167
+ display: inline-flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ flex: none;
171
+ width: 44px;
172
+ height: 44px;
173
+ font-size: 18px;
174
+ color: var(--el-text-color-primary);
175
+ cursor: pointer;
176
+ user-select: none;
177
+ }
178
+ .view-layout-toolbar__back[data-v-99d466e9]:hover,
179
+ .view-layout-toolbar__more[data-v-99d466e9]:hover {
180
+ color: var(--dc-core-primary-color, var(--el-color-primary));
181
+ }
182
+ .view-layout-toolbar__back[data-v-99d466e9] {
183
+ margin-left: -13px;
184
+ }
185
+ .view-layout-toolbar__more[data-v-99d466e9] {
186
+ margin-right: 0;
187
+ }
188
+ .view-layout-toolbar__left[data-v-99d466e9],
189
+ .view-layout-toolbar__right[data-v-99d466e9] {
171
190
  display: flex;
172
191
  align-items: center;
173
192
  gap: 10px;
174
193
  }
175
- .view-layout-toolbar__left[data-v-3c6fd3fe] > *,
176
- .view-layout-toolbar__right[data-v-3c6fd3fe] > * {
194
+ .view-layout-toolbar__left[data-v-99d466e9] > *,
195
+ .view-layout-toolbar__right[data-v-99d466e9] > * {
177
196
  flex: none;
178
197
  }
179
- .view-layout-toolbar__left .view-layout-header[data-v-3c6fd3fe] {
198
+ .view-layout-toolbar__left .view-layout-header[data-v-99d466e9] {
180
199
  flex: 1 1 auto;
181
200
  }
182
- .view-layout-toolbar__right[data-v-3c6fd3fe] {
201
+ .view-layout-toolbar__right[data-v-99d466e9] {
183
202
  flex: none;
184
203
  }
185
- .view-layout-content[data-v-3c6fd3fe] {
204
+ .view-layout-header[data-v-99d466e9] {
205
+ flex: 0 1 auto;
206
+ min-width: 0;
207
+ overflow: hidden;
208
+ color: var(--el-text-color-primary);
209
+ font-size: 16px;
210
+ font-weight: 600;
211
+ line-height: 1.4;
212
+ white-space: nowrap;
213
+ text-overflow: ellipsis;
214
+ }
215
+ .view-layout[data-v-f386aec7] {
216
+ display: flex;
217
+ flex-direction: column;
218
+ }
219
+ .view-layout-content[data-v-f386aec7] {
186
220
  overflow: auto;
187
221
  box-sizing: border-box;
188
- padding: var(--v72fb5e44) var(--v72fb5e44) var(--v72fb5e44) var(--v7243a29e);
222
+ padding: var(--v5975c734);
189
223
  }
190
224
  .dc-app-page-detail__title[data-v-1b784d3a] {
191
225
  padding-bottom: 12px;
@@ -194,17 +228,20 @@ to {
194
228
  line-height: 24px;
195
229
  color: var(--dc-core-text-color, var(--el-text-color-primary));
196
230
  }
197
- .dc-app-page-list-detail-split__list[data-v-7aa91bcb] {
231
+ .dc-app-page-list-detail-split__list[data-v-68dc7b6b] {
198
232
  box-sizing: border-box;
233
+ width: 100%;
199
234
  height: 100%;
200
235
  overflow: hidden;
201
236
  }
202
- .form-item-tip[data-v-8b508d64] {
237
+ .form-item-tip[data-v-940abdf9] {
238
+ width: 100%;
239
+ min-width: 0;
203
240
  text-align: left;
204
241
  line-height: 1.5;
205
242
  font-size: 12px;
206
243
  }
207
- .form-item-label-hide[data-v-8b508d64] .el-form-item__label-wrap {
244
+ .form-item-label-hide[data-v-940abdf9] .el-form-item__label-wrap {
208
245
  display: none;
209
246
  }
210
247
  .drag-float[data-v-0ab49ed7] {
@@ -825,7 +862,9 @@ to {
825
862
  .app-layout_noAnimation[data-v-140fec15] .app-collapse-toggle {
826
863
  transition: none !important;
827
864
  }
828
- .form-group-title[data-v-c6148d68] {
865
+ .form-group-title[data-v-ee226102] {
866
+ width: 100%;
867
+ min-width: 0;
829
868
  display: flex;
830
869
  align-items: center;
831
870
  gap: 4px;
@@ -835,16 +874,16 @@ to {
835
874
  color: var(--dc-core-base-color, var(--el-text-color-primary));
836
875
  user-select: none;
837
876
  }
838
- .form-group-title_collapsible[data-v-c6148d68] {
877
+ .form-group-title_collapsible[data-v-ee226102] {
839
878
  cursor: pointer;
840
879
  }
841
- .form-group-title-arrow[data-v-c6148d68] {
880
+ .form-group-title-arrow[data-v-ee226102] {
842
881
  font-size: 12px;
843
882
  color: var(--el-text-color-secondary);
844
883
  transform: rotate(90deg);
845
884
  transition: transform var(--dc-core-motion-duration, 0.2s) var(--dc-core-motion-easing, ease);
846
885
  }
847
- .form-group-title-arrow_collapsed[data-v-c6148d68] {
886
+ .form-group-title-arrow_collapsed[data-v-ee226102] {
848
887
  transform: rotate(0deg);
849
888
  }
850
889
  .form-divider[data-v-66a37c1d] {
@@ -934,24 +973,24 @@ to {
934
973
  animation: none;
935
974
  }
936
975
  }
937
- .infinite-list-view_surface[data-v-a62d17f9] {
976
+ .infinite-list-view_surface[data-v-4f0267ce] {
938
977
  box-sizing: border-box;
939
- padding: var(--v9e087332);
978
+ padding: var(--v407ba190);
940
979
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
941
980
  }
942
- .infinite-list-view_surface-bg[data-v-a62d17f9] {
981
+ .infinite-list-view_surface-bg[data-v-4f0267ce] {
943
982
  background: var(--el-bg-color);
944
983
  }
945
- .infinite-list-view[data-v-a62d17f9] {
984
+ .infinite-list-view[data-v-4f0267ce] {
946
985
  width: 100%;
947
986
  }
948
- .infinite-list-view__viewport[data-v-a62d17f9] {
987
+ .infinite-list-view__viewport[data-v-4f0267ce] {
949
988
  width: 100%;
950
989
  }
951
- .infinite-list-view__sentinel[data-v-a62d17f9] {
990
+ .infinite-list-view__sentinel[data-v-4f0267ce] {
952
991
  height: 1px;
953
992
  }
954
- .infinite-list-view__footer[data-v-a62d17f9] {
993
+ .infinite-list-view__footer[data-v-4f0267ce] {
955
994
  display: flex;
956
995
  justify-content: center;
957
996
  align-items: center;
@@ -959,17 +998,17 @@ to {
959
998
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
960
999
  font-size: 13px;
961
1000
  }
962
- .infinite-list-view__json[data-v-a62d17f9] {
1001
+ .infinite-list-view__json[data-v-4f0267ce] {
963
1002
  margin: 0;
964
1003
  font-size: 12px;
965
1004
  white-space: pre-wrap;
966
1005
  word-break: break-all;
967
1006
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
968
1007
  }
969
- .infinite-list-view__tip[data-v-a62d17f9] {
1008
+ .infinite-list-view__tip[data-v-4f0267ce] {
970
1009
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
971
1010
  }
972
- .infinite-list-view__retry[data-v-a62d17f9] {
1011
+ .infinite-list-view__retry[data-v-4f0267ce] {
973
1012
  border: none;
974
1013
  background: transparent;
975
1014
  color: var(--dc-core-primary-color, var(--el-color-primary));
@@ -977,10 +1016,10 @@ to {
977
1016
  cursor: pointer;
978
1017
  padding: 0;
979
1018
  }
980
- .infinite-list-view__retry[data-v-a62d17f9]:hover {
1019
+ .infinite-list-view__retry[data-v-4f0267ce]:hover {
981
1020
  opacity: 0.8;
982
1021
  }
983
- .infinite-list-view__empty[data-v-a62d17f9] {
1022
+ .infinite-list-view__empty[data-v-4f0267ce] {
984
1023
  display: flex;
985
1024
  justify-content: center;
986
1025
  align-items: center;
@@ -988,7 +1027,7 @@ to {
988
1027
  min-height: 60px;
989
1028
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
990
1029
  }
991
- .infinite-list-view__pull-indicator[data-v-a62d17f9] {
1030
+ .infinite-list-view__pull-indicator[data-v-4f0267ce] {
992
1031
  display: flex;
993
1032
  justify-content: center;
994
1033
  align-items: flex-end;
@@ -997,56 +1036,56 @@ to {
997
1036
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
998
1037
  transition: height 0.2s;
999
1038
  }
1000
- .infinite-list-view__pull-indicator > span[data-v-a62d17f9] {
1039
+ .infinite-list-view__pull-indicator > span[data-v-4f0267ce] {
1001
1040
  padding-bottom: 6px;
1002
1041
  }
1003
- .data-grid-view[data-v-136078cd] {
1042
+ .data-grid-view[data-v-b4c213bc] {
1004
1043
  width: 100%;
1005
1044
  }
1006
- .data-grid-view_surface[data-v-136078cd] {
1007
- padding: var(--e2a8f6ae);
1045
+ .data-grid-view_surface[data-v-b4c213bc] {
1046
+ padding: var(--v081d8ea3);
1008
1047
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1009
1048
  }
1010
- .data-grid-view_surface-bg[data-v-136078cd] {
1049
+ .data-grid-view_surface-bg[data-v-b4c213bc] {
1011
1050
  background: var(--el-bg-color);
1012
1051
  }
1013
- .data-grid-view__grid[data-v-136078cd] {
1052
+ .data-grid-view__grid[data-v-b4c213bc] {
1014
1053
  display: grid;
1015
1054
  }
1016
- .data-grid-view__cell.is-active[data-v-136078cd] {
1055
+ .data-grid-view__cell.is-active[data-v-b4c213bc] {
1017
1056
  /* stylelint-disable-next-line block-no-empty */
1018
1057
  }
1019
- .data-grid-view__cell[data-v-136078cd] {
1058
+ .data-grid-view__cell[data-v-b4c213bc] {
1020
1059
  min-width: 0;
1021
1060
  }
1022
- .data-grid-view__cell.is-card[data-v-136078cd] {
1061
+ .data-grid-view__cell.is-card[data-v-b4c213bc] {
1023
1062
  box-sizing: border-box;
1024
1063
  background: var(--el-bg-color);
1025
1064
  border: 1px solid var(--dc-core-border-color, var(--el-border-color-lighter));
1026
1065
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1027
1066
  }
1028
- .data-grid-view__card[data-v-136078cd] {
1067
+ .data-grid-view__card[data-v-b4c213bc] {
1029
1068
  height: 100%;
1030
1069
  box-sizing: border-box;
1031
1070
  overflow: hidden;
1032
1071
  }
1033
- .data-grid-view__field[data-v-136078cd] {
1072
+ .data-grid-view__field[data-v-b4c213bc] {
1034
1073
  display: flex;
1035
1074
  gap: 6px;
1036
1075
  align-items: baseline;
1037
1076
  line-height: 1.6;
1038
1077
  font-size: 13px;
1039
1078
  }
1040
- .data-grid-view__field-label[data-v-136078cd] {
1079
+ .data-grid-view__field-label[data-v-b4c213bc] {
1041
1080
  flex-shrink: 0;
1042
1081
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
1043
1082
  }
1044
- .data-grid-view__field-value[data-v-136078cd] {
1083
+ .data-grid-view__field-value[data-v-b4c213bc] {
1045
1084
  overflow: hidden;
1046
1085
  text-overflow: ellipsis;
1047
1086
  white-space: nowrap;
1048
1087
  }
1049
- .data-grid-view__empty-error[data-v-136078cd] {
1088
+ .data-grid-view__empty-error[data-v-b4c213bc] {
1050
1089
  display: flex;
1051
1090
  justify-content: center;
1052
1091
  align-items: center;
@@ -1075,16 +1114,18 @@ to {
1075
1114
  font-size: 13px;
1076
1115
  color: var(--el-text-color-placeholder);
1077
1116
  }
1078
- .form-item-nest-form[data-v-46959572] {
1117
+ .form-item-nest-form[data-v-358d6905] {
1079
1118
  --dc-nest-indent: 16px;
1080
1119
  }
1081
- .form-item-nest-form[data-v-46959572] {
1120
+ .form-item-nest-form[data-v-358d6905] {
1082
1121
  position: relative;
1083
1122
  background: var(--el-bg-color-page);
1084
1123
  border-radius: 8px;
1124
+ width: 100%;
1125
+ min-width: 0;
1085
1126
  padding: 0 0 0 var(--dc-nest-indent);
1086
1127
  }
1087
- .form-item-nest-form[data-v-46959572]::before {
1128
+ .form-item-nest-form[data-v-358d6905]::before {
1088
1129
  content: "";
1089
1130
  position: absolute;
1090
1131
  top: 0;
@@ -1094,25 +1135,27 @@ to {
1094
1135
  background: var(--el-border-color-darker);
1095
1136
  border-radius: 3px;
1096
1137
  }
1097
- html.dark .form-item-nest-form[data-v-46959572]::before {
1138
+ html.dark .form-item-nest-form[data-v-358d6905]::before {
1098
1139
  background: var(--dc-core-border-color, var(--el-border-color));
1099
1140
  }
1100
- .form-item-nest-form-list[data-v-f9ac937e] {
1141
+ .form-item-nest-form-list[data-v-b6b79293] {
1101
1142
  padding: 12px;
1102
1143
  background: var(--el-bg-color-page);
1103
1144
  border-radius: 8px;
1145
+ width: 100%;
1146
+ min-width: 0;
1104
1147
  }
1105
- .form-item-nest-form-list-row[data-v-f9ac937e] {
1148
+ .form-item-nest-form-list-row[data-v-b6b79293] {
1106
1149
  position: relative;
1107
1150
  margin-bottom: 8px;
1108
1151
  }
1109
- .form-item-nest-form-list-row-body[data-v-f9ac937e] {
1152
+ .form-item-nest-form-list-row-body[data-v-b6b79293] {
1110
1153
  min-width: 0;
1111
1154
  padding: 32px 12px 8px;
1112
1155
  background: var(--el-bg-color);
1113
1156
  border-radius: 6px;
1114
1157
  }
1115
- .form-item-nest-form-list-row[data-v-f9ac937e] .form-item-nest-form-list-row-remove {
1158
+ .form-item-nest-form-list-row[data-v-b6b79293] .form-item-nest-form-list-row-remove {
1116
1159
  position: absolute;
1117
1160
  top: 4px;
1118
1161
  right: 8px;
@@ -1190,6 +1233,10 @@ html.dark .form-item-nest-form[data-v-46959572]::before {
1190
1233
  display: inline-flex;
1191
1234
  vertical-align: middle;
1192
1235
  }
1236
+ .dc-form-tree[data-v-e64f6895] {
1237
+ width: 100%;
1238
+ min-width: 0;
1239
+ }
1193
1240
  .dc-form-upload-trigger[data-v-9fb0fb2a] {
1194
1241
  display: flex;
1195
1242
  align-items: center;
@@ -1209,7 +1256,11 @@ html.dark .form-item-nest-form[data-v-46959572]::before {
1209
1256
  padding: 0;
1210
1257
  color: var(--el-text-color-secondary);
1211
1258
  }
1212
- .dc-form-upload__placeholder[data-v-9f186e75] {
1259
+ .dc-form-upload[data-v-1b155db4] {
1260
+ width: 100%;
1261
+ min-width: 0;
1262
+ }
1263
+ .dc-form-upload__placeholder[data-v-1b155db4] {
1213
1264
  margin-top: 4px;
1214
1265
  font-size: 12px;
1215
1266
  line-height: 1.5;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.29.1-alpha.0",
3
+ "version": "0.30.1-alpha.0",
4
4
  "description": "内部前端库",
5
5
  "private": false,
6
6
  "main": "es/index.mjs",
@@ -83,5 +83,5 @@
83
83
  "dependencies": {
84
84
  "@tanstack/vue-virtual": "^3.13.35"
85
85
  },
86
- "gitHead": "428001dd152178576b5f87445148896efdde98c5"
86
+ "gitHead": "ce4ef5042019885e7557f09a8e03f09836c66ec8"
87
87
  }
@@ -88,18 +88,29 @@ type BadgeEntry = {
88
88
  description?: string;
89
89
  /** 本条标的版本号(core 不消费,纯透传);消费方据它做「版本化的已读记录」 */
90
90
  version?: string | number;
91
+ /**
92
+ * 角标显不显示;缺省 = 跟随全局默认(`defaultVisible`,本身缺省 `true`)。
93
+ * 🔴 `false` **只藏角标、留 DOM 挂点**(引导插件照常定位得到)——
94
+ * 与「压根没配这条 key」是两回事。遮挡档(`locked`)**拒绝隐藏**,dev 下会 warn。
95
+ */
96
+ visible?: boolean;
91
97
  } & (
92
98
  | { kind: "count"; value: number; max?: number } // 数字角标
93
99
  | { kind: "new" } // 新上线
94
- | { kind: "updated" } // 更新
95
- | { kind: "beta" } // 内测:能用,不稳定
100
+ | { kind: "updated" } // 已更新
101
+ | { kind: "beta" } // 内测中:能用,不稳定
96
102
  | { kind: "wip" } // 开发中:仅提示,**不拦点击**
103
+ | { kind: "planned" } // 规划中:还没开工
104
+ | { kind: "deprecated" } // 待下线
105
+ | { kind: "locked" } // 未开通:**唯一拦点击、也唯一拒绝隐藏的档**
97
106
  | { kind: "custom"; text: string; type?: BadgeProps["type"] }
98
- | { kind: "anchor" } // 伪标:不渲染角标,只留 DOM 挂点供引导定位
107
+ | { kind: "anchor" } // 伪标:恒隐藏角标,只留 DOM 挂点供引导定位
99
108
  );
100
109
  ```
101
110
 
102
- 内置五档的文案与语义色由 core 统一定,保证跨 app 一致;`custom` 只在内置档不够用时用。
111
+ 内置七档的文案与语义色由 core 统一定,保证跨 app 一致;`custom` 只在内置档不够用时用。
112
+ **七档一律走文字**(甲方 2026-09-19 撤回 v0.30 的图标态),详见
113
+ [BadgeMark 文档](../../components/display/docs/README-BadgeMark.md)。
103
114
 
104
115
  **`version` 的用处**:消费方(如 `forge-plugin-guide`)把已读记录的 key 取成 `key@version`
105
116
  ⇒ **功能有实质更新时改一下版本号,引导 / 提示就对所有人重新出现一次**;不改则关过的人不再被打扰。
@@ -116,6 +127,25 @@ type BadgeEntry = {
116
127
  | `setAll(map)` | **整体替换** —— 轮询主路径,服务端本轮撤下的标随之消失 |
117
128
  | `set(key, entry)` | 单点写入 / 覆盖 |
118
129
  | `remove(key)` | 单点移除 |
130
+ | `defaultVisible` | **全局默认显不显示**(响应式只读,缺省 `true`);逐条 `entry.visible` 恒优先 |
131
+ | `setDefaultVisible(v)` | 改全局默认;也可在 `createCoreBridge({ badge: { defaultVisible } })` 初始化时给 |
132
+
133
+ ### 展示开关(`visible` / `defaultVisible`)
134
+
135
+ 徽标当初是拿来做新手引导的;有了 `forge-plugin-guide` 之后徽标不再必须显示 ⇒ 两层开关:
136
+
137
+ | 层 | 写法 | 缺省 |
138
+ | --- | --- | --- |
139
+ | 逐条 | `bridge.badge.set(key, { kind: "new", visible: false })` | `undefined` = 跟随全局 |
140
+ | 全局 | `createCoreBridge({ badge: { defaultVisible: false } })` / `bridge.badge.setDefaultVisible(false)` | **`true`** |
141
+
142
+ 🔴 **「配置了但不展示」≠「没配置」**:前者照常渲染 `ElBadge` + `data-dc-badge-key` 挂点,
143
+ 引导插件**仍能定位**;后者渲染裸插槽、连挂点都没有。
144
+ ⇒ 隐藏走 `visible`,[MUST NOT] 用 `v-if` 把整条标掐掉。
145
+
146
+ 🔴 **遮挡档(`BADGE_MASK_KINDS`,现仅 `locked`)拒绝隐藏**:逐条 `visible:false` 与全局默认
147
+ 都不作用到它,dev 下 `console.warn` 一句。依据:遮挡是**功能**不是资讯,藏了会变成
148
+ 「点不动又没说明的按钮」或「未开通却能点」。
119
149
 
120
150
  ⚠️ [MUST NOT] 用 `bridge.update()` 维护徽标:它是 `Object.assign` **浅合并**,轮询场景下服务端已撤下的标会永远留在表里。徽标独立走 `bridge.badge`。
121
151
 
@@ -60,6 +60,7 @@
60
60
  | `nextViewportMaxHeight` | `string` | `var(--app-viewport-max-height)` | shim 内视口高变量覆写 |
61
61
  | `background` | `string` | 无 | 根盒背景(通栏,不受限宽影响) |
62
62
  | `contentCentered` | `boolean` | `false` | 默认 slot 内容限宽居中(超宽屏适配);同步收窄对后代公布的内容几何(见下) |
63
+ | `leftWidth` / `rightWidth` | `string?` | — | `#left` / `#right` 槽的**显式宽度**(CSS 长度串)。缺省不写 ⇒ 槽宽跟内容走(shrink-to-fit,老行为)。🔴 **槽内内容要用百分比宽时 [MUST] 改用本 prop**,见下 |
63
64
  | `contentMaxWidth` | `number` | `1200` | 限宽值(px),仅 `contentCentered` 开启时生效 |
64
65
  | `gap` | `number` | `8` | 间距基数 px(缺省读 bridge `APP_LAYOUT_GAP_CONFIG.size`)。**槽 ↔ 内容**与**槽 ↔ 槽**都取由它派生的「外圈档」(`基数 × 2`,随密度缩放),两处同式同源 |
65
66
  | `topBg` / `bottomBg` / `leftBg` / `rightBg` | `string` | `var(--el-bg-color)`(面色) | 各槽 shim 背景;传 `"transparent"` 可关。**shim 自带圆角**(`--dc-core-radius`,随主题;无 bg 的槽透明、圆角无视觉影响) |
@@ -161,13 +162,80 @@ paddingRight = 右槽让位量 + gutter
161
162
 
162
163
 
163
164
 
165
+ ### 方位槽空壳检测(dev-only,每槽只报一次)
166
+
167
+ 四向槽是 **fixed 悬浮区**:槽一旦渲染,即使里面的东西「不占版面」,
168
+ **槽本身**照样铺 padding + 背景、照样从默认内容里扣掉让位高度(实测一条 16px 空白带)。
169
+
170
+ ⇒ dev 下(`import.meta.env.DEV`)挂载时检查每个方位槽渲染出的内容:
171
+ 若**全是不占版面的节点**(注释 / teleport 锚点 / 空文本)⇒ 一条 `console.error`,
172
+ **同一个槽只报一次**(不刷屏):
173
+
174
+ ```
175
+ [AppPage] #top 槽里没有占版面的内容,但槽本身照样渲染(fixed + padding + 背景)
176
+ 并从默认内容里扣掉让位高度 —— 白占一条。
177
+ · 若放的是 ModalPorter:移到**默认槽**(page 架子就住在默认槽里,与 AppPage 并列同样够不到,evoke() 一样恒为 null);
178
+ · 若放的是自己 teleport 走、不需要 page 架子的弹窗:移到默认槽或与 AppPage 并列均可;
179
+ · 若是 v-if 条件渲染的内容:此刻恰好为空,忽略本条。
180
+ ```
181
+
182
+ | 情形 | 是否报 |
183
+ | --- | --- |
184
+ | 槽里只有 `ModalPorter` / 已 teleport 的弹窗 | ✅ 报(正是要防的) |
185
+ | 槽里内容被 `v-if` 暂时关掉 | ⚠️ 会报 —— **合法动态状态**,靠 dev-only + 去重 + 文案给出口兜住,忽略即可 |
186
+ | 槽里有正常内容 | ❌ 不报 |
187
+ | 生产构建 | ❌ 不报(dev-only) |
188
+
189
+ 🔴 **只「报出来」,[MUST NOT] 顺手改成「空槽就不渲染」** —— 那是行为变更、会动已有页面布局,
190
+ 与检测是两件事;真要做得单独一版、走 migrations 说清楚。
191
+
192
+ ## 侧槽宽度:内容要用百分比时 [MUST] 用 `leftWidth` / `rightWidth`
193
+
194
+ ### 🔴 为什么槽内的百分比宽会留下死白
195
+
196
+ `#left` / `#right` 是 **`position: fixed` 且只给了 `left` / `right`** ——
197
+ 没有 `width`、没有对边 ⇒ 宽度**跟内容走**(shrink-to-fit)。
198
+
199
+ 槽内内容若写百分比宽,浏览器两趟算下来自相矛盾:
200
+
201
+ 1. 算**内在尺寸**时百分比按 `auto` 处理 ⇒ 槽被撑到内容的 **max-content**;
202
+ 2. 之后百分比才解析,基数是**刚被内容撑出来的那个宽** ⇒ 解出来往往远小于槽;
203
+ 3. ⇒ **槽里剩一大片死白**,且**随内容变丰富而变大**。
204
+
205
+ 实测(1280 视口,列表详情 split 档,`width: clamp(280px, 28%, 420px)` 写在槽内内容上):
206
+ 槽 **517** / 内容 **280** ⇒ 死白 **229px**。
207
+
208
+ ### 处置:把宽度放到**槽这一层**
209
+
210
+ ```vue
211
+ <AppPage :leftWidth="listWidth">
212
+ <template #left>
213
+ <div style="width: 100%">…</div> <!-- 内容只吃满槽 -->
214
+ </template>
215
+ </AppPage>
216
+ ```
217
+
218
+ 槽是 `fixed` ⇒ 包含块是**视口**(初始包含块)⇒ 百分比有**稳定且不循环**的基数。
219
+ 实测 `28%` 在 1280 下精确得 **358px**,死白降到 **8px**(= shim padding),
220
+ 且**加长内容后不再恶化**。
221
+
222
+ 🔴 **[MUST NOT] 改用 `--dc-page-content-viewport-width` 当百分比基数**:
223
+ 那个变量是**内容区**宽(已扣掉左右槽),语义本就不对,而且**它本身就在循环链上**
224
+ (内容区宽 ← 侧槽宽 ← 槽内内容宽)。
225
+
226
+ ⚠️ 写在这里的宽度照常被 `WatchSize` 量到、回写进内容区的让位 padding(实测跟得上),
227
+ 几何链不受影响。`#top` / `#bottom` 是**通栏**(`left` + `right` 双边定位),
228
+ 不存在这个问题、也没有对应 prop。
229
+
164
230
  ## 反模式 / 注意
165
231
 
166
232
  - **悬浮槽尺寸变化来自 CSS 过渡/异步撑开 → 必须开对应 `observeResize`**(onUpdated 只读渲染后瞬时值,过渡动画读起点漏最终)
167
233
  - 四向槽 fixed 定位——内容滚动时悬浮不动,属设计语义,勿误当普通 inline 槽
168
234
  - **运行时动态增减插槽(在槽模板上挂 `v-if`)不生效**——`hasTop/hasBottom/hasLeft/hasRight` 取 `!!slots.x`,`slots` 非响应式对象、computed 无依赖恒吃首次结果。插槽集 [MUST] 当静态结构写死;确需切换整套槽形态由调用方给 AppPage 换 `:key` 重挂载
235
+ - **[MUST NOT] 把 `ModalPorter` / 弹窗放进方位槽**:方位槽是页面内置 `ModalShelf` 的**兄弟**不是后代,`provide` 够不到(`evoke()` 恒 null),且槽本身白占版面。两条检测都会在控制台点名(见上)
169
236
  - 槽尺寸/inset 几何由 `app-page-geometry` 纯函数计算导出,[MUST NOT] 手写自造
170
237
  - `listLayoutRecommended` 开 `customView` 后 [MUST] 配套 ListLayout `#custom-view-item`,否则窄栏卡片渲染为空
238
+ - **在 `#left`/`#right` 槽内写百分比宽**:[MUST NOT]——槽是 shrink-to-fit,百分比没有稳定基数,会留下大片死白且随内容变大;宽度放 `leftWidth` / `rightWidth`
171
239
  - **列表 / 表格页开 `contentCentered`** —— 表格列本就挤,限宽后更挤;限宽只服务表单 / 详情 / 阅读型页
172
240
  - `contentMaxWidth` 传 CSS 字符串(`"80rem"`)—— 只收 `number`(px),字符串会让样式与公布几何脱钩
173
241
  - [MUST NOT] 在业务侧改写 `.app-page-shim` padding 自造限宽 —— 会与槽让位量打架且不同步 `APP_PAGE_CONTENT_INSET`;限宽一律走 `contentCentered`。子级确需破框全宽(full-bleed)时用负 margin 主动逃逸,属逃生舱