@done-coding/admin-core 0.29.0 → 0.29.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 (86) hide show
  1. package/es/bridge/layout.mjs +31 -2
  2. package/es/components/app-layout/AppAside.vue.mjs +1 -1
  3. package/es/components/app-layout/AppCollapseToggle.vue.mjs +1 -1
  4. package/es/components/app-layout/AppFooter.vue.mjs +1 -1
  5. package/es/components/app-layout/AppHeader.vue.mjs +1 -1
  6. package/es/components/app-layout/AppHeader.vue2.mjs +1 -1
  7. package/es/components/app-layout/AppSidebar.vue.mjs +1 -1
  8. package/es/components/app-layout/AppSidebar.vue2.mjs +60 -34
  9. package/es/components/data-view/DataGridView.vue.mjs +1 -1
  10. package/es/components/data-view/DataGridView.vue2.mjs +30 -6
  11. package/es/components/data-view/DataListView.vue.mjs +1 -1
  12. package/es/components/data-view/DataListView.vue2.mjs +38 -14
  13. package/es/components/data-view/DataListViewItem.vue.mjs +1 -1
  14. package/es/components/data-view/DataListViewItem.vue2.mjs +23 -4
  15. package/es/components/data-view/InfiniteListView.vue.mjs +1 -1
  16. package/es/components/data-view/InfiniteListView.vue2.mjs +9 -3
  17. package/es/components/data-view/use-grid-layout.mjs +46 -0
  18. package/es/components/data-view/use-masonry.mjs +65 -0
  19. package/es/components/display/BadgeMark.vue.mjs +1 -1
  20. package/es/components/display/BadgeMark.vue2.mjs +11 -3
  21. package/es/components/display/HeightProvider.vue.mjs +17 -3
  22. package/es/components/display/use-badge.mjs +22 -13
  23. package/es/components/form/use-upload-state.mjs +33 -11
  24. package/es/components/page-layout/AppPageDetail.vue.mjs +1 -1
  25. package/es/components/page-layout/AppPageDetail.vue2.mjs +12 -2
  26. package/es/components/page-layout/AppPageListDetailLayout.vue.mjs +11 -4
  27. package/es/components/page-layout/AppPageListDetailSheet.vue.mjs +8 -1
  28. package/es/components/page-layout/AppPageListDetailSplit.vue.mjs +1 -1
  29. package/es/components/page-layout/AppPageListDetailSplit.vue2.mjs +8 -1
  30. package/es/components/table/TableMain.vue.mjs +1 -1
  31. package/es/components/table/TableMain.vue2.mjs +8 -5
  32. package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
  33. package/es/components/view-layout/ViewLayout.vue2.mjs +68 -20
  34. package/es/hooks/use-surface.mjs +4 -1
  35. package/es/hooks/use-theme-apply.mjs +78 -0
  36. package/es/index.mjs +118 -120
  37. package/es/store/app.mjs +25 -0
  38. package/es/style.css +120 -95
  39. package/package.json +2 -2
  40. package/src/bridge/docs/README.md +31 -0
  41. package/src/components/app-layout/docs/README-AppAside.md +11 -0
  42. package/src/components/app-layout/docs/README-AppFooter.md +11 -1
  43. package/src/components/app-layout/docs/README-AppHeader.md +16 -0
  44. package/src/components/app-layout/docs/README-AppSidebar.md +18 -0
  45. package/src/components/data-view/README.md +2 -1
  46. package/src/components/data-view/docs/README-DataGridView.md +21 -1
  47. package/src/components/data-view/docs/README-DataListView.md +65 -3
  48. package/src/components/data-view/docs/README-InfiniteListView.md +17 -0
  49. package/src/components/display/README.md +1 -1
  50. package/src/components/display/docs/README-BadgeMark.md +52 -10
  51. package/src/components/display/docs/README-HeightProvider.md +14 -8
  52. package/src/components/form/docs/README-FormUpload.md +79 -0
  53. package/src/components/form/docs/README-FormUploadImage.md +19 -0
  54. package/src/components/form/docs/README-FormUploadVideo.md +19 -0
  55. package/src/components/page-layout/README.md +15 -0
  56. package/src/components/page-layout/docs/README-AppPageDetail.md +3 -0
  57. package/src/components/page-layout/docs/README-AppPageListDetailLayout.md +33 -0
  58. package/src/components/table/docs/README-TableMain.md +17 -0
  59. package/src/components/view-layout/README.md +2 -2
  60. package/src/components/view-layout/docs/README-ViewLayout.md +97 -6
  61. package/types/bridge/badge.d.ts +3 -1
  62. package/types/bridge/layout.d.ts +42 -5
  63. package/types/components/app-layout/AppSidebar.vue.d.ts +286 -2
  64. package/types/components/app-layout/types.d.ts +1 -1
  65. package/types/components/data-view/DataListViewItem.vue.d.ts +12 -7
  66. package/types/components/data-view/types.d.ts +76 -0
  67. package/types/components/data-view/use-grid-layout.d.ts +42 -0
  68. package/types/components/data-view/use-masonry.d.ts +44 -0
  69. package/types/components/display/BadgeMark.vue.d.ts +5 -5
  70. package/types/components/display/HeightProvider.vue.d.ts +1 -0
  71. package/types/components/display/use-badge.d.ts +6 -0
  72. package/types/components/page-layout/AppPageDetail.vue.d.ts +18 -0
  73. package/types/components/page-layout/AppPageListDetailLayout.vue.d.ts +20 -0
  74. package/types/components/page-layout/AppPageListDetailSheet.vue.d.ts +4 -0
  75. package/types/components/page-layout/AppPageListDetailSplit.vue.d.ts +4 -0
  76. package/types/components/table/types.d.ts +8 -0
  77. package/types/components/view-layout/ViewLayout.vue.d.ts +30 -0
  78. package/types/components/view-layout/types.d.ts +12 -0
  79. package/types/hooks/use-surface.d.ts +11 -0
  80. package/types/index.d.ts +0 -1
  81. package/types/injectInfo.json.d.ts +1 -1
  82. package/es/components/icon/IconHammer.vue.mjs +0 -26
  83. package/es/components/icon/IconHammer.vue2.mjs +0 -4
  84. package/src/components/icon/README.md +0 -38
  85. package/types/components/icon/IconHammer.vue.d.ts +0 -2
  86. package/types/components/icon/index.d.ts +0 -7
package/es/style.css CHANGED
@@ -66,14 +66,14 @@
66
66
  justify-content: flex-end;
67
67
  gap: 8px;
68
68
  }
69
- .badge-mark[data-v-18853ddc] .el-badge__content.is-fixed {
69
+ .badge-mark[data-v-9eb89306] .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-18853ddc] .el-badge__content.is-fixed {
73
+ .badge-mark_middle[data-v-9eb89306] .el-badge__content.is-fixed {
74
74
  top: 50%;
75
75
  }
76
- .badge-mark[data-v-18853ddc] .badge-mark__icon {
76
+ .badge-mark[data-v-9eb89306] .badge-mark__icon {
77
77
  display: block;
78
78
  font-size: 1em;
79
79
  line-height: 1;
@@ -131,7 +131,7 @@ to {
131
131
  text-align: center;
132
132
  font-variant-numeric: tabular-nums;
133
133
  }
134
- .view-layout-header[data-v-e7dc3f12] {
134
+ .view-layout-header[data-v-3c6fd3fe] {
135
135
  flex: 0 1 auto;
136
136
  min-width: 0;
137
137
  overflow: hidden;
@@ -142,21 +142,21 @@ to {
142
142
  white-space: nowrap;
143
143
  text-overflow: ellipsis;
144
144
  }
145
- .view-layout[data-v-e7dc3f12] {
145
+ .view-layout[data-v-3c6fd3fe] {
146
146
  display: flex;
147
147
  flex-direction: column;
148
148
  }
149
- .view-layout-toolbar[data-v-e7dc3f12] {
149
+ .view-layout-toolbar[data-v-3c6fd3fe] {
150
150
  display: flex;
151
151
  justify-content: space-between;
152
152
  align-items: center;
153
- padding: 0 8px 8px;
153
+ padding: 0 var(--v72fb5e44) 0 var(--v7243a29e);
154
154
  position: relative;
155
155
  gap: 20px;
156
156
  background: color-mix(in srgb, var(--dc-core-surface, var(--el-bg-color)) 50%, var(--dc-core-ground, var(--el-bg-color-page)));
157
157
  border-radius: 0;
158
158
  }
159
- .view-layout-toolbar[data-v-e7dc3f12]::before {
159
+ .view-layout-toolbar[data-v-3c6fd3fe]::before {
160
160
  content: "";
161
161
  position: absolute;
162
162
  top: 0;
@@ -166,33 +166,35 @@ to {
166
166
  border-radius: 3px;
167
167
  background: var(--dc-core-primary-color, var(--el-color-primary));
168
168
  }
169
- .view-layout-toolbar__left[data-v-e7dc3f12],
170
- .view-layout-toolbar__right[data-v-e7dc3f12] {
169
+ .view-layout-toolbar__left[data-v-3c6fd3fe],
170
+ .view-layout-toolbar__right[data-v-3c6fd3fe] {
171
171
  display: flex;
172
172
  align-items: center;
173
173
  gap: 10px;
174
174
  }
175
- .view-layout-toolbar__left[data-v-e7dc3f12] > *,
176
- .view-layout-toolbar__right[data-v-e7dc3f12] > * {
175
+ .view-layout-toolbar__left[data-v-3c6fd3fe] > *,
176
+ .view-layout-toolbar__right[data-v-3c6fd3fe] > * {
177
177
  flex: none;
178
178
  }
179
- .view-layout-toolbar__left .view-layout-header[data-v-e7dc3f12] {
179
+ .view-layout-toolbar__left .view-layout-header[data-v-3c6fd3fe] {
180
180
  flex: 1 1 auto;
181
181
  }
182
- .view-layout-toolbar__right[data-v-e7dc3f12] {
182
+ .view-layout-toolbar__right[data-v-3c6fd3fe] {
183
183
  flex: none;
184
184
  }
185
- .view-layout-content[data-v-e7dc3f12] {
185
+ .view-layout-content[data-v-3c6fd3fe] {
186
186
  overflow: auto;
187
+ box-sizing: border-box;
188
+ padding: var(--v72fb5e44) var(--v72fb5e44) var(--v72fb5e44) var(--v7243a29e);
187
189
  }
188
- .dc-app-page-detail__title[data-v-4426d26a] {
190
+ .dc-app-page-detail__title[data-v-1b784d3a] {
189
191
  padding-bottom: 12px;
190
192
  font-size: 16px;
191
193
  font-weight: 600;
192
194
  line-height: 24px;
193
195
  color: var(--dc-core-text-color, var(--el-text-color-primary));
194
196
  }
195
- .dc-app-page-list-detail-split__list[data-v-e97ba16e] {
197
+ .dc-app-page-list-detail-split__list[data-v-7aa91bcb] {
196
198
  box-sizing: border-box;
197
199
  height: 100%;
198
200
  overflow: hidden;
@@ -555,7 +557,7 @@ to {
555
557
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow-lighter));
556
558
  border: 1px solid var(--dc-core-border-color, var(--el-border-color-lighter));
557
559
  }
558
- .app-collapse-toggle[data-v-10c7e006] {
560
+ .app-collapse-toggle[data-v-7c080128] {
559
561
  position: absolute;
560
562
  top: 50%;
561
563
  cursor: pointer;
@@ -563,50 +565,51 @@ to {
563
565
  height: 44px;
564
566
  border-radius: 7px;
565
567
  background-color: var(--dc-core-surface, var(--el-bg-color-overlay));
566
- border: 1px solid var(--dc-core-border-color, var(--el-border-color-lighter));
567
- color: var(--el-text-color-secondary);
568
+ border: 1px solid var(--dc-core-border-color, var(--el-border-color));
569
+ color: var(--el-text-color-regular);
568
570
  display: flex;
569
571
  align-items: center;
570
572
  justify-content: center;
571
573
  font-size: 12px;
572
574
  z-index: 1;
573
- opacity: 0.3;
575
+ opacity: 1;
574
576
  box-shadow: none;
575
577
  transition: opacity 0.2s ease, color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
576
578
  }
577
- .app-collapse-toggle--sidebar[data-v-10c7e006] {
579
+ .app-collapse-toggle--sidebar[data-v-7c080128] {
578
580
  left: 100%;
579
581
  transform: translate(-50%, -50%);
580
582
  }
581
- .app-collapse-toggle--aside[data-v-10c7e006] {
583
+ .app-collapse-toggle--aside[data-v-7c080128] {
582
584
  right: 100%;
583
585
  transform: translate(50%, -50%);
584
586
  }
585
- .app-collapse-toggle[data-v-10c7e006]:hover,
586
- .app-collapse-toggle[data-v-10c7e006]:focus-visible {
587
+ .app-collapse-toggle[data-v-7c080128]:hover,
588
+ .app-collapse-toggle[data-v-7c080128]:focus-visible {
587
589
  opacity: 1;
588
590
  color: var(--el-text-color-primary);
589
591
  border-color: var(--dc-core-border-color, var(--el-border-color));
590
592
  box-shadow: var(--el-box-shadow-lighter);
591
593
  }
592
- .app-collapse-toggle[data-v-10c7e006]:active {
594
+ .app-collapse-toggle[data-v-7c080128]:active {
593
595
  border-color: var(--dc-core-primary-color, var(--el-color-primary));
594
596
  }
595
- .app-collapse-toggle__icon[data-v-10c7e006] {
597
+ .app-collapse-toggle__icon[data-v-7c080128] {
596
598
  transition: transform 0.3s;
597
599
  }
598
- .app-aside[data-v-7e17d342] {
600
+ .app-aside[data-v-d6ef7f3d] {
599
601
  transition: width var(--dc-core-motion-duration-slow, 300ms) var(--dc-core-motion-easing, ease);
600
602
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow));
601
603
  overflow: visible;
602
604
  z-index: 0;
603
605
  }
604
- .app-aside-clip[data-v-7e17d342] {
606
+ .app-aside-clip[data-v-d6ef7f3d] {
605
607
  position: absolute;
606
608
  inset: 0;
607
609
  overflow: hidden;
610
+ border-radius: inherit;
608
611
  }
609
- .app-aside-shim[data-v-7e17d342] {
612
+ .app-aside-shim[data-v-d6ef7f3d] {
610
613
  position: absolute;
611
614
  right: 0;
612
615
  top: 0;
@@ -616,8 +619,8 @@ to {
616
619
  transition: opacity var(--dc-core-motion-duration, 200ms) var(--dc-core-motion-easing, ease);
617
620
  }
618
621
  @media (prefers-reduced-motion: reduce) {
619
- .app-aside[data-v-7e17d342],
620
- .app-aside-shim[data-v-7e17d342] {
622
+ .app-aside[data-v-d6ef7f3d],
623
+ .app-aside-shim[data-v-d6ef7f3d] {
621
624
  transition: none;
622
625
  }
623
626
  }
@@ -637,7 +640,7 @@ to {
637
640
  display: flow-root;
638
641
  --app-viewport-max-height: var(--ece8e1ac);
639
642
  }
640
- .app-footer[data-v-8960664d] {
643
+ .app-footer[data-v-de6fd086] {
641
644
  transition-duration: 0.3s;
642
645
  transition-property: height;
643
646
  transition-timing-function: linear;
@@ -645,12 +648,11 @@ to {
645
648
  width: 100%;
646
649
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow));
647
650
  }
648
- .app-footer-shim[data-v-8960664d] {
651
+ .app-footer-shim[data-v-de6fd086] {
649
652
  width: 100%;
650
653
  height: 100%;
651
- padding: 0 20px;
652
654
  }
653
- .app-header[data-v-fe33f01b] {
655
+ .app-header[data-v-6fa13544] {
654
656
  transition-duration: 0.3s;
655
657
  transition-property: height;
656
658
  transition-timing-function: linear;
@@ -658,13 +660,13 @@ to {
658
660
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow));
659
661
  z-index: 1;
660
662
  }
661
- .app-header-module[data-v-fe33f01b] {
663
+ .app-header-module[data-v-6fa13544] {
662
664
  display: flex;
663
665
  flex: 1;
664
666
  height: 100%;
665
667
  overflow-x: auto;
666
668
  }
667
- .app-header-module-item[data-v-fe33f01b] {
669
+ .app-header-module-item[data-v-6fa13544] {
668
670
  display: flex;
669
671
  justify-content: center;
670
672
  align-items: center;
@@ -672,69 +674,74 @@ to {
672
674
  white-space: nowrap;
673
675
  height: 100%;
674
676
  }
675
- .app-header-module-item[data-v-fe33f01b]:hover,
676
- .app-header-module-item_active[data-v-fe33f01b] {
677
- color: var(--v5a41bfe6);
677
+ .app-header-module-item[data-v-6fa13544]:hover,
678
+ .app-header-module-item_active[data-v-6fa13544] {
679
+ color: var(--v1c549aee);
678
680
  }
679
- .app-header-module-item_active[data-v-fe33f01b] {
681
+ .app-header-module-item_active[data-v-6fa13544] {
680
682
  position: relative;
681
683
  }
682
- .app-header-module-item_active[data-v-fe33f01b]::before {
684
+ .app-header-module-item_active[data-v-6fa13544]::before {
683
685
  content: "";
684
686
  position: absolute;
685
687
  left: 50%;
686
688
  top: 0;
687
689
  width: 100%;
688
690
  height: 3px;
689
- background-color: var(--v5a41bfe6);
691
+ background-color: var(--v1c549aee);
690
692
  transform: translateX(-50%);
691
693
  }
692
- .app-header-shim[data-v-fe33f01b] {
694
+ .app-header-shim[data-v-6fa13544] {
693
695
  width: 100%;
694
696
  height: 100%;
695
697
  display: flex;
696
698
  align-items: center;
697
699
  justify-content: space-between;
698
- padding: 0 20px;
699
700
  font-size: 18px;
700
701
  font-weight: bold;
701
702
  }
702
- .app-header-module-item__icon[data-v-fe33f01b] {
703
+ .app-header-module-item__icon[data-v-6fa13544] {
703
704
  margin-right: 8px;
704
705
  }
705
- .app-header-right[data-v-fe33f01b] {
706
+ .app-header-right[data-v-6fa13544] {
706
707
  padding-left: 80px;
707
708
  display: flex;
708
709
  align-items: center;
709
710
  }
710
- .app-sidebar[data-v-6808ecdb] {
711
+ .app-sidebar[data-v-e8e50875] {
711
712
  transition-duration: 0.3s;
712
713
  transition-property: width;
713
714
  transition-timing-function: linear;
714
715
  box-shadow: var(--dc-core-shadow, var(--el-box-shadow));
715
716
  overflow: visible;
716
- z-index: var(--a540a4d0);
717
+ z-index: var(--v2dcbfdd5);
717
718
  }
718
- .app-sidebar-top[data-v-6808ecdb] {
719
+ .app-sidebar-clip[data-v-e8e50875] {
720
+ position: absolute;
721
+ inset: 0;
722
+ overflow: hidden;
723
+ border-radius: inherit;
724
+ }
725
+ .app-sidebar-top[data-v-e8e50875] {
719
726
  position: absolute;
720
727
  left: 0;
721
728
  right: 0;
722
729
  top: 0;
723
730
  overflow: hidden;
724
731
  }
725
- .app-sidebar-bottom[data-v-6808ecdb] {
732
+ .app-sidebar-bottom[data-v-e8e50875] {
726
733
  position: absolute;
727
734
  left: 0;
728
735
  right: 0;
729
736
  bottom: 0;
730
737
  overflow: hidden;
731
738
  }
732
- .app-sidebar-shim[data-v-6808ecdb] {
739
+ .app-sidebar-shim[data-v-e8e50875] {
733
740
  position: absolute;
734
741
  left: 0;
735
742
  right: 0;
736
- top: var(--v4433cc00);
737
- bottom: var(--v7d77fda0);
743
+ top: var(--v78ee9bfd);
744
+ bottom: var(--v3ef242fa);
738
745
  overflow-x: hidden;
739
746
  overflow-y: auto;
740
747
  --el-menu-border-color: transparent;
@@ -927,22 +934,24 @@ to {
927
934
  animation: none;
928
935
  }
929
936
  }
930
- .infinite-list-view_surface[data-v-6539caa4] {
937
+ .infinite-list-view_surface[data-v-a62d17f9] {
931
938
  box-sizing: border-box;
932
- padding: var(--v0d4fd951);
933
- background: var(--el-bg-color);
939
+ padding: var(--v9e087332);
934
940
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
935
941
  }
936
- .infinite-list-view[data-v-6539caa4] {
942
+ .infinite-list-view_surface-bg[data-v-a62d17f9] {
943
+ background: var(--el-bg-color);
944
+ }
945
+ .infinite-list-view[data-v-a62d17f9] {
937
946
  width: 100%;
938
947
  }
939
- .infinite-list-view__viewport[data-v-6539caa4] {
948
+ .infinite-list-view__viewport[data-v-a62d17f9] {
940
949
  width: 100%;
941
950
  }
942
- .infinite-list-view__sentinel[data-v-6539caa4] {
951
+ .infinite-list-view__sentinel[data-v-a62d17f9] {
943
952
  height: 1px;
944
953
  }
945
- .infinite-list-view__footer[data-v-6539caa4] {
954
+ .infinite-list-view__footer[data-v-a62d17f9] {
946
955
  display: flex;
947
956
  justify-content: center;
948
957
  align-items: center;
@@ -950,17 +959,17 @@ to {
950
959
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
951
960
  font-size: 13px;
952
961
  }
953
- .infinite-list-view__json[data-v-6539caa4] {
962
+ .infinite-list-view__json[data-v-a62d17f9] {
954
963
  margin: 0;
955
964
  font-size: 12px;
956
965
  white-space: pre-wrap;
957
966
  word-break: break-all;
958
967
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
959
968
  }
960
- .infinite-list-view__tip[data-v-6539caa4] {
969
+ .infinite-list-view__tip[data-v-a62d17f9] {
961
970
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
962
971
  }
963
- .infinite-list-view__retry[data-v-6539caa4] {
972
+ .infinite-list-view__retry[data-v-a62d17f9] {
964
973
  border: none;
965
974
  background: transparent;
966
975
  color: var(--dc-core-primary-color, var(--el-color-primary));
@@ -968,10 +977,10 @@ to {
968
977
  cursor: pointer;
969
978
  padding: 0;
970
979
  }
971
- .infinite-list-view__retry[data-v-6539caa4]:hover {
980
+ .infinite-list-view__retry[data-v-a62d17f9]:hover {
972
981
  opacity: 0.8;
973
982
  }
974
- .infinite-list-view__empty[data-v-6539caa4] {
983
+ .infinite-list-view__empty[data-v-a62d17f9] {
975
984
  display: flex;
976
985
  justify-content: center;
977
986
  align-items: center;
@@ -979,7 +988,7 @@ to {
979
988
  min-height: 60px;
980
989
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
981
990
  }
982
- .infinite-list-view__pull-indicator[data-v-6539caa4] {
991
+ .infinite-list-view__pull-indicator[data-v-a62d17f9] {
983
992
  display: flex;
984
993
  justify-content: center;
985
994
  align-items: flex-end;
@@ -988,53 +997,56 @@ to {
988
997
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
989
998
  transition: height 0.2s;
990
999
  }
991
- .infinite-list-view__pull-indicator > span[data-v-6539caa4] {
1000
+ .infinite-list-view__pull-indicator > span[data-v-a62d17f9] {
992
1001
  padding-bottom: 6px;
993
1002
  }
994
- .data-grid-view[data-v-90c0ccf6] {
1003
+ .data-grid-view[data-v-136078cd] {
995
1004
  width: 100%;
996
1005
  }
997
- .data-grid-view_surface[data-v-90c0ccf6] {
998
- padding: var(--c829655a);
999
- background: var(--el-bg-color);
1006
+ .data-grid-view_surface[data-v-136078cd] {
1007
+ padding: var(--e2a8f6ae);
1000
1008
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1001
1009
  }
1002
- .data-grid-view__grid[data-v-90c0ccf6] {
1010
+ .data-grid-view_surface-bg[data-v-136078cd] {
1011
+ background: var(--el-bg-color);
1012
+ }
1013
+ .data-grid-view__grid[data-v-136078cd] {
1003
1014
  display: grid;
1004
- gap: 12px;
1005
- padding-bottom: 12px;
1006
1015
  }
1007
- .data-grid-view__cell.is-active[data-v-90c0ccf6] {
1016
+ .data-grid-view__cell.is-active[data-v-136078cd] {
1008
1017
  /* stylelint-disable-next-line block-no-empty */
1009
1018
  }
1010
- .data-grid-view__cell[data-v-90c0ccf6] {
1019
+ .data-grid-view__cell[data-v-136078cd] {
1011
1020
  min-width: 0;
1012
1021
  }
1013
- .data-grid-view__card[data-v-90c0ccf6] {
1022
+ .data-grid-view__cell.is-card[data-v-136078cd] {
1023
+ box-sizing: border-box;
1024
+ background: var(--el-bg-color);
1014
1025
  border: 1px solid var(--dc-core-border-color, var(--el-border-color-lighter));
1015
- border-radius: var(--dc-core-radius, 4px);
1016
- padding: 10px 12px;
1026
+ border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1027
+ }
1028
+ .data-grid-view__card[data-v-136078cd] {
1017
1029
  height: 100%;
1018
1030
  box-sizing: border-box;
1019
1031
  overflow: hidden;
1020
1032
  }
1021
- .data-grid-view__field[data-v-90c0ccf6] {
1033
+ .data-grid-view__field[data-v-136078cd] {
1022
1034
  display: flex;
1023
1035
  gap: 6px;
1024
1036
  align-items: baseline;
1025
1037
  line-height: 1.6;
1026
1038
  font-size: 13px;
1027
1039
  }
1028
- .data-grid-view__field-label[data-v-90c0ccf6] {
1040
+ .data-grid-view__field-label[data-v-136078cd] {
1029
1041
  flex-shrink: 0;
1030
1042
  color: var(--dc-core-text-color-secondary, var(--el-text-color-secondary));
1031
1043
  }
1032
- .data-grid-view__field-value[data-v-90c0ccf6] {
1044
+ .data-grid-view__field-value[data-v-136078cd] {
1033
1045
  overflow: hidden;
1034
1046
  text-overflow: ellipsis;
1035
1047
  white-space: nowrap;
1036
1048
  }
1037
- .data-grid-view__empty-error[data-v-90c0ccf6] {
1049
+ .data-grid-view__empty-error[data-v-136078cd] {
1038
1050
  display: flex;
1039
1051
  justify-content: center;
1040
1052
  align-items: center;
@@ -1409,16 +1421,27 @@ html.dark .form-item-nest-form[data-v-46959572]::before {
1409
1421
  .dc-form-upload-video__thumb_empty[data-v-5eac98bc] {
1410
1422
  background: var(--el-fill-color-light);
1411
1423
  }
1412
- .data-list-view-item.is-selected[data-v-c2a6c6be] {
1424
+ .data-list-view-item.is-selected[data-v-4b05138c] {
1413
1425
  /* 选中(勾选)态钩子,具体视觉由消费方覆写 */
1414
1426
  }
1415
- .data-list-view-item.is-active[data-v-c2a6c6be] {
1427
+ .data-list-view-item.is-active[data-v-4b05138c] {
1416
1428
  /* 当前项(active)态钩子,具体视觉由消费方覆写 */
1417
1429
  }
1418
- .data-list-view[data-v-0d316a42] {
1430
+ .data-list-view-item.is-card[data-v-4b05138c] {
1431
+ box-sizing: border-box;
1432
+ padding: 12px;
1433
+ background: var(--el-bg-color);
1434
+ border: 1px solid var(--dc-core-border-color, var(--el-border-color-lighter));
1435
+ border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1436
+ }
1437
+ .data-list-view-item.is-masonry[data-v-4b05138c] {
1438
+ align-self: start;
1439
+ grid-row-end: span 125;
1440
+ }
1441
+ .data-list-view[data-v-f900ae4e] {
1419
1442
  width: 100%;
1420
1443
  }
1421
- .data-list-view-empty[data-v-0d316a42] {
1444
+ .data-list-view-empty[data-v-f900ae4e] {
1422
1445
  display: flex;
1423
1446
  justify-content: center;
1424
1447
  align-items: center;
@@ -1426,18 +1449,20 @@ html.dark .form-item-nest-form[data-v-46959572]::before {
1426
1449
  min-height: 60px;
1427
1450
  grid-column: 1 / -1;
1428
1451
  }
1429
- .table-main_surface[data-v-431aac71] {
1430
- padding: var(--v02eff1c8);
1431
- background: var(--el-bg-color);
1452
+ .table-main_surface[data-v-f5764fe4] {
1453
+ padding: var(--v5308fe58);
1432
1454
  border-radius: var(--dc-core-radius, var(--el-border-radius-base));
1433
1455
  }
1434
- .table-main-pagination[data-v-431aac71] {
1456
+ .table-main_surface-bg[data-v-f5764fe4] {
1457
+ background: var(--el-bg-color);
1458
+ }
1459
+ .table-main-pagination[data-v-f5764fe4] {
1435
1460
  margin-top: 10px;
1436
1461
  display: flex;
1437
1462
  justify-content: flex-end;
1438
1463
  }
1439
- .table-main_fill[data-v-431aac71] .el-table__body-wrapper {
1440
- min-height: var(--v75a7164e);
1464
+ .table-main_fill[data-v-f5764fe4] .el-table__body-wrapper {
1465
+ min-height: var(--v418a0592);
1441
1466
  }
1442
1467
  .dc-slot-layout-flow-aside_separate[data-v-5c6ef74b] {
1443
1468
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.29.0",
3
+ "version": "0.29.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": "e2bd73b54a75a6df469b1ec7916a38998318609a"
86
+ "gitHead": "428001dd152178576b5f87445148896efdde98c5"
87
87
  }
@@ -219,6 +219,37 @@ appCoreBridge.update("APP_LAYOUT_SIDEBAR_CONFIG", { menuGroupMode: true });
219
219
 
220
220
  适用判据与三级菜单的混合渲染规则见 [menu 族文档](../../components/menu/README.md) 与 [AppSidebar 文档](../../components/app-layout/docs/README-AppSidebar.md)。
221
221
 
222
+ ## 展开菜单到某路径(`bridge.layout.openMenuTo`)
223
+
224
+ ```ts
225
+ const ok = bridge.layout.openMenuTo("/system/user/detail");
226
+ ```
227
+
228
+ 把目标路径**沿途的父级子菜单全部展开**,返回是否成功。缘起是引导(`forge-plugin-guide`)
229
+ 要高亮折叠子菜单里的项 —— 那种元素虽在 DOM 里但 `display:none`、rect 全 0,
230
+ 引导只能跳过它(插件侧已有 `getClientRects().length` 判空的防御,避免按 `(0,0)` 把弹窗
231
+ 摆到屏幕左上角)。防御解决的是「不出坏效果」,本方法解决「到得了那一步」。
232
+
233
+ **判据是 `getClientRects().length > 0`**(目标项真的占布局),[MUST NOT] 用「没报错」当成功。
234
+
235
+ ### 三种形态下的行为
236
+
237
+ | 形态 | 行为 |
238
+ | --- | --- |
239
+ | 常规树形菜单 | 逐级 `open()` 沿途父级 → `true` |
240
+ | 分组形态(`menuGroupMode`) | 父级是 section heading、**本就全展开** ⇒ **no-op 返回 `true`** |
241
+ | **侧栏折叠态** | **先展开侧栏**(`setSidebarCollapse(false)`)再展开沿途父级 → `true` |
242
+
243
+ 🔴 **折叠态自动展开侧栏是甲方 2026-09-18 的裁决**,且**事后不还原**:
244
+
245
+ - 代价知情:折叠态是**持久化到 localStorage 的用户偏好**,本方法等于程序化改写它。
246
+ 依据 = 引导是用户主动发起的流程,为让他看见而展开属正当副作用,且「他刚学会这个入口」
247
+ 留在展开态反而合理。
248
+ - [MUST NOT] 改成「展开后自动还原」:还原时机不可靠(引导弹窗还开着就还原会当场收起菜单),
249
+ 异常路径 / 快速切路由会让状态泄漏 —— 同 `store/app.ts` 的 viewportConfig 为何取派生而非
250
+ 「改真相源 + 还原」。
251
+ - 路径不存在 / 无侧栏(`showSidebar` 为假)→ `false`,且**不动任何状态**。
252
+
222
253
  ## 认证与请求接线
223
254
 
224
255
  ### 认证 facade(bridge 4 钩子 + userInfoAccess)
@@ -33,6 +33,17 @@
33
33
  - `show` 显隐基线来自路由 `meta.layout.aside`(store showAside),false 整列不渲染。
34
34
  - **完整能力演示**(#aside 锚 + 自供 shell):`apps/reference/src/App.vue`、`apps/reference/src/pages/app-layout/shell/`
35
35
 
36
+ ## 面貌(背景 / 圆角 / 无横向内呼吸)
37
+
38
+ 与 `AppSidebar` **同口径**(对称积木,[MUST] 一起改):背景 `APP_LAYOUT_ASIDE_CONFIG.background ?? 主题 bodyColor`、
39
+ 圆角 `var(--dc-core-radius, var(--el-border-radius-base))`,两者同在 `appStore.asideStyle` 这一份 inline style 里,
40
+ 默认值写在 `...cfg.style` 展开之前 ⇒ `APP_LAYOUT_ASIDE_CONFIG.style.borderRadius` 可整体覆盖。
41
+
42
+ - **不给横向内呼吸**:内容由消费方经默认插槽自填,呼吸归内容自己——core 代为让白会与内容自带的 padding 叠成双份。
43
+ - 圆角由既有的 `.app-aside-clip`(`inset: 0` + `overflow: hidden`)承接裁切(已补 `border-radius: inherit`);
44
+ 根盒 `overflow: visible` 是折叠把手悬挂所需,[MUST NOT] 改。
45
+ - 折叠 / 隐藏态宽收 0 ⇒ 零面积、不留圆角残影。
46
+
36
47
  ## API
37
48
  > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
38
49
 
@@ -5,7 +5,17 @@
5
5
 
6
6
  ## 定位
7
7
 
8
- AppFooter 是族内最薄的积木:自身无任何对外接口(无 props / emits / slots / expose),只做一件事——inject 应用 store 窄化实例(`APP_LAYOUT_APP_STORE_KEY`),把 `appStore.footerStyle` 绑到根盒 `:style` 上渲染底部状态条(高度/留白/阴影由 store 驱动,阴影走主题 var)。显隐与高度变化全部由 AppLayout/store 侧控制,消费方不直接挂载、也无可配置项。
8
+ AppFooter 是族内最薄的积木:自身无任何对外接口(无 props / emits / slots / expose),只做一件事——inject 应用 store 窄化实例(`APP_LAYOUT_APP_STORE_KEY`),把 `appStore.footerStyle` 绑到根盒 `:style` 上渲染底部状态条(高度 / 背景 / 圆角 / 横向内呼吸由 store 驱动,阴影走主题 var)。显隐与高度变化全部由 AppLayout/store 侧控制,消费方不直接挂载、也无可配置项。
9
+
10
+ **面貌三项与 AppHeader 同源同口径**(对称积木,[MUST] 一起改):
11
+
12
+ | 项 | 默认 | 覆盖法 |
13
+ | --- | --- | --- |
14
+ | 背景 | `APP_LAYOUT_FOOTER_CONFIG.background ?? 主题 bodyColor` | 配 `background` |
15
+ | 圆角 | `var(--dc-core-radius, var(--el-border-radius-base))` | `APP_LAYOUT_FOOTER_CONFIG.style.borderRadius` |
16
+ | 横向内呼吸 | 间距阶梯**模块档**(默认 **8px**) | `APP_LAYOUT_FOOTER_CONFIG.style.padding` |
17
+
18
+ 圆角 / padding 的默认值在 `...cfg.style` 展开**之前**写入 ⇒ 逃生舱同名键恒赢;`height` / `marginTop` / `background` / `color` 仍是引擎托管键(展开之后,压过外部)。
9
19
 
10
20
  ## 能力边界 / 按需使用
11
21
 
@@ -9,6 +9,8 @@
9
9
  - #left = 品牌/业务入口(AppLayout `#brand` 锚落位);#right = userEntry/settings/themeSwitcher 操作区
10
10
  - 中间区 = 路由大模块菜单(menus 渲染,点击高亮 activeModulePath)
11
11
  - 整体显隐由 AppLayout 间接控制(store headerStyle.height=0 视觉收起 + dom 保留)
12
+ - **面貌(背景 / 圆角 / 横向内呼吸)三项同源** —— 都在 `appStore.headerStyle` 这一份 inline style 里
13
+ ([MUST NOT] 把其中任何一项挪回 scoped CSS:一半 inline 一半 CSS 会让消费方覆盖时只改得动一半)
12
14
 
13
15
  ## 模块条徽标(badge)
14
16
 
@@ -41,6 +43,19 @@
41
43
  - `#left` / `#right` 槽内容来自 AppLayout 内容锚转发(`#brand` → `#left`;`#userEntry` / `#settings` / `#themeSwitcher` → `#right`)——内置 shell 零配置;自供 shell 直引时按槽转发范式接住。
42
44
  - **完整能力演示**(自供 shell 积木直引 + NoHeader 变体):`apps/reference/src/pages/app-layout/shell/`、`apps/reference/src/pages/app-layout/layout/`
43
45
 
46
+ ## 面貌与覆盖(背景 / 圆角 / 内呼吸)
47
+
48
+ | 项 | 默认 | 覆盖法 |
49
+ | --- | --- | --- |
50
+ | 背景 | `APP_LAYOUT_HEADER_CONFIG.background ?? 主题 bodyColor` | 配 `background`(支持色 / 渐变 / 背景图) |
51
+ | 圆角 | `var(--dc-core-radius, var(--el-border-radius-base))`(随主题) | `APP_LAYOUT_HEADER_CONFIG.style.borderRadius` |
52
+ | 横向内呼吸 | 间距阶梯**模块档**(`gap.size` × 密度 × 1,默认 **8px**) | `APP_LAYOUT_HEADER_CONFIG.style.padding` |
53
+
54
+ - 圆角 / padding 的默认值**在 `...cfg.style` 展开之前**写入 ⇒ `style` 逃生舱里的同名键恒赢,可整体覆盖。
55
+ (`position` / `top` / `left` / `right` / `height` / `background` / `color` 是**引擎托管键**,写在展开之后,
56
+ 外部传了也压不过——这条不变。)
57
+ - `box-sizing: border-box` 由引擎托管:横向 padding 恒收在盒内,[MUST NOT] 指望消费方的全局 reset。
58
+
44
59
  ## API
45
60
  > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
46
61
 
@@ -73,6 +88,7 @@
73
88
 
74
89
  - **`show` 勿用于显隐控制**:声明必填但模板未消费——整体显隐由 AppLayout 经 store 间接控制(headerStyle.height=0 视觉收起 + dom 保留)
75
90
  - 主题切换器不属 Header 私有:已解耦为 `AppTheme`,经 shell #right 注入(默认内容仍是 AppTheme,经典布局 1:1 镜像)
91
+ - **[MUST NOT] 在 scoped CSS 里给 `.app-header-shim` 写死横向 padding**:那会与 inline 的一份打架,且消费方覆盖只改得动一半——横向内呼吸的唯一出处是 `headerStyle`
76
92
 
77
93
  ## 关联
78
94
 
@@ -47,6 +47,24 @@
47
47
  - `show=false` 整栏不渲染(含折叠把手)——「收起但保留把手」场景走折叠态而非 `show=false`。
48
48
  - **完整能力演示**(DemoCustomShell 槽转发范式 + NoSidebar 变体):`apps/reference/src/pages/app-layout/shell/`、`apps/reference/src/pages/app-layout/layout/`
49
49
 
50
+ ## 面貌(背景 / 圆角 / 无横向内呼吸)
51
+
52
+ | 项 | 默认 | 覆盖法 |
53
+ | --- | --- | --- |
54
+ | 背景 | `APP_LAYOUT_SIDEBAR_CONFIG.background ?? 主题 bodyColor` | 配 `background` |
55
+ | 圆角 | `var(--dc-core-radius, var(--el-border-radius-base))`(随主题) | `APP_LAYOUT_SIDEBAR_CONFIG.style.borderRadius` |
56
+ | 横向内呼吸 | **无,[MUST NOT] 补** | —— |
57
+
58
+ - 圆角与背景**同源**(都在 `appStore.sidebarStyle` 这一份 inline style 里),默认值写在
59
+ `...cfg.style` 展开之前 ⇒ 逃生舱同名键恒赢。
60
+ - 🔴 **为什么不像 header / footer 那样补横向 padding**:侧栏里装的是菜单树,
61
+ `.el-menu-item` 自带 `padding: 0 var(--el-menu-base-level-padding)`(默认 20px)——
62
+ 外层再让一份就是**双份**,且折叠成图标栏时会把图标挤离中线。
63
+ - 🔴 **圆角要看得见,靠的是内部那层裁切盒**(`.app-sidebar-clip`,`inset: 0` + `overflow: hidden`
64
+ + `border-radius: inherit`):根盒 [MUST] 保持 `overflow: visible`(折叠把手悬挂在外缘),
65
+ 故根盒自己裁不了——而 `el-menu` 自带背景色会直接盖住四角。[MUST NOT] 把 clip 层删掉当冗余。
66
+ - 收起态(`showSidebar=false` → 宽收 0)零面积、不留圆角残影。
67
+
50
68
  ## API
51
69
  > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
52
70