@done-coding/admin-core 0.18.0 → 0.19.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 (342) hide show
  1. package/README.md +77 -1
  2. package/es/_virtual/_plugin-vue_export-helper.mjs +7 -6
  3. package/es/bridge/config-hook.mjs +49 -37
  4. package/es/bridge/index.mjs +152 -109
  5. package/es/bridge/layout.mjs +45 -31
  6. package/es/bridge/plugin.mjs +22 -12
  7. package/es/bridge/route.mjs +59 -50
  8. package/es/bridge/state.mjs +54 -39
  9. package/es/bridge/storage.mjs +18 -8
  10. package/es/bridge/theme/index.mjs +200 -97
  11. package/es/bridge/theme/persist.mjs +11 -7
  12. package/es/bridge/theme/system-dark.mjs +13 -6
  13. package/es/components/app-layout/AppAside.vue.mjs +4 -4
  14. package/es/components/app-layout/AppAside.vue2.mjs +37 -30
  15. package/es/components/app-layout/AppBody.vue.mjs +4 -4
  16. package/es/components/app-layout/AppBody.vue2.mjs +97 -60
  17. package/es/components/app-layout/AppBreadcrumb.vue.mjs +4 -4
  18. package/es/components/app-layout/AppBreadcrumb.vue2.mjs +59 -38
  19. package/es/components/app-layout/AppCollapseToggle.vue.mjs +4 -4
  20. package/es/components/app-layout/AppCollapseToggle.vue2.mjs +51 -42
  21. package/es/components/app-layout/AppFooter.vue.mjs +4 -4
  22. package/es/components/app-layout/AppFooter.vue2.mjs +15 -12
  23. package/es/components/app-layout/AppHeader.vue.mjs +4 -4
  24. package/es/components/app-layout/AppHeader.vue2.mjs +81 -58
  25. package/es/components/app-layout/AppLayout.vue.mjs +4 -4
  26. package/es/components/app-layout/AppLayout.vue2.mjs +148 -112
  27. package/es/components/app-layout/AppPage.vue.mjs +4 -4
  28. package/es/components/app-layout/AppPage.vue2.mjs +254 -197
  29. package/es/components/app-layout/AppShell.vue.mjs +44 -42
  30. package/es/components/app-layout/AppShell.vue2.mjs +2 -2
  31. package/es/components/app-layout/AppSidebar.vue.mjs +4 -4
  32. package/es/components/app-layout/AppSidebar.vue2.mjs +76 -59
  33. package/es/components/app-layout/AppTheme.vue.mjs +4 -4
  34. package/es/components/app-layout/AppTheme.vue2.mjs +69 -57
  35. package/es/components/app-layout/app-page-geometry.mjs +44 -42
  36. package/es/components/app-layout/keep-alive.mjs +27 -19
  37. package/es/components/app-layout/viewport.mjs +4 -3
  38. package/es/components/data-view/DataListView.vue.mjs +4 -4
  39. package/es/components/data-view/DataListView.vue2.mjs +133 -93
  40. package/es/components/data-view/DataListViewItem.vue.mjs +4 -4
  41. package/es/components/data-view/DataListViewItem.vue2.mjs +11 -9
  42. package/es/components/data-view/utils.mjs +36 -34
  43. package/es/components/display/ActionBtn.vue.mjs +94 -71
  44. package/es/components/display/ActionBtn.vue2.mjs +2 -2
  45. package/es/components/display/ActionBtnGroup.vue.mjs +54 -48
  46. package/es/components/display/ActionBtnGroup.vue2.mjs +2 -2
  47. package/es/components/display/ActionConfirm.vue.mjs +4 -4
  48. package/es/components/display/ActionConfirm.vue2.mjs +116 -92
  49. package/es/components/display/BooleanTag.vue.mjs +24 -18
  50. package/es/components/display/BooleanTag.vue2.mjs +2 -2
  51. package/es/components/display/HeightProvider.vue.mjs +37 -27
  52. package/es/components/display/HeightProvider.vue2.mjs +2 -2
  53. package/es/components/display/TabsHeader.vue.mjs +4 -4
  54. package/es/components/display/TabsHeader.vue2.mjs +86 -57
  55. package/es/components/display/TabsMain.vue.mjs +156 -125
  56. package/es/components/display/TabsMain.vue2.mjs +2 -2
  57. package/es/components/display/TabsNaturalFlow.vue.mjs +15 -11
  58. package/es/components/display/TabsNaturalFlow.vue2.mjs +2 -2
  59. package/es/components/display/TabsRefineFlow.vue.mjs +55 -42
  60. package/es/components/display/TabsRefineFlow.vue2.mjs +2 -2
  61. package/es/components/display/TabsTile.vue.mjs +4 -4
  62. package/es/components/display/TabsTile.vue2.mjs +204 -146
  63. package/es/components/display/WatchSize.vue.mjs +50 -30
  64. package/es/components/display/WatchSize.vue2.mjs +2 -2
  65. package/es/components/display/use-tabs-query-sync.mjs +21 -17
  66. package/es/components/form/FormItem.vue.mjs +4 -4
  67. package/es/components/form/FormItem.vue2.mjs +183 -121
  68. package/es/components/form/FormItemNestForm.vue.mjs +4 -4
  69. package/es/components/form/FormItemNestForm.vue2.mjs +38 -34
  70. package/es/components/form/FormItemNestFormList.vue.mjs +4 -4
  71. package/es/components/form/FormItemNestFormList.vue2.mjs +135 -106
  72. package/es/components/form/FormMain.vue.mjs +4 -4
  73. package/es/components/form/FormMain.vue2.mjs +226 -139
  74. package/es/components/form/FormRadioGroup.vue.mjs +67 -52
  75. package/es/components/form/FormRadioGroup.vue2.mjs +2 -2
  76. package/es/components/form/FormSearch.vue.mjs +4 -4
  77. package/es/components/form/FormSearch.vue2.mjs +194 -156
  78. package/es/components/form/FormSelect.vue.mjs +69 -42
  79. package/es/components/form/FormSelect.vue2.mjs +2 -2
  80. package/es/components/form/FormSubmitBtn.vue.mjs +30 -25
  81. package/es/components/form/FormSubmitBtn.vue2.mjs +2 -2
  82. package/es/components/form/FormSubmitPanel.vue.mjs +4 -4
  83. package/es/components/form/FormSubmitPanel.vue2.mjs +129 -96
  84. package/es/components/form/FormTree.vue.mjs +19 -16
  85. package/es/components/form/FormTree.vue2.mjs +2 -2
  86. package/es/components/form/FormVerifyCode.vue.mjs +58 -41
  87. package/es/components/form/FormVerifyCode.vue2.mjs +2 -2
  88. package/es/components/form/FormVerifyImage.vue.mjs +4 -4
  89. package/es/components/form/FormVerifyImage.vue2.mjs +62 -40
  90. package/es/components/form/form-search-utils.mjs +83 -52
  91. package/es/components/form/nest-form-item-list.mjs +63 -55
  92. package/es/components/form/nest-form-item.mjs +30 -30
  93. package/es/components/form/nest-registry.mjs +4 -4
  94. package/es/components/form/use-form-submit.mjs +18 -15
  95. package/es/components/form/use-layout-by-container.mjs +23 -15
  96. package/es/components/form/use-nest-form-list.mjs +19 -16
  97. package/es/components/form/use-nest-form.mjs +37 -28
  98. package/es/components/form/use-nest-layout-scale.mjs +11 -10
  99. package/es/components/form/utils.mjs +233 -145
  100. package/es/components/list-page/ListPage.vue.mjs +4 -4
  101. package/es/components/list-page/ListPage.vue2.mjs +313 -207
  102. package/es/components/list-page/use-sticky.mjs +45 -33
  103. package/es/components/menu/MenuItemSub.vue.mjs +47 -43
  104. package/es/components/menu/MenuItemSub.vue2.mjs +2 -2
  105. package/es/components/menu/MenuTree.vue.mjs +84 -61
  106. package/es/components/menu/MenuTree.vue2.mjs +2 -2
  107. package/es/components/misc/AutoRefresh.vue.mjs +4 -4
  108. package/es/components/misc/AutoRefresh.vue2.mjs +78 -53
  109. package/es/components/misc/AutoRefreshGroup.vue.mjs +4 -4
  110. package/es/components/misc/AutoRefreshGroup.vue2.mjs +54 -51
  111. package/es/components/misc/SelectModule.vue.mjs +54 -45
  112. package/es/components/misc/SelectModule.vue2.mjs +2 -2
  113. package/es/components/misc/TriggerAutoImport.vue.mjs +7 -5
  114. package/es/components/misc/TriggerAutoImport.vue2.mjs +2 -2
  115. package/es/components/modal/ModalConfirm.vue.mjs +4 -4
  116. package/es/components/modal/ModalConfirm.vue2.mjs +160 -125
  117. package/es/components/modal/ModalDetail.vue.mjs +50 -39
  118. package/es/components/modal/ModalDetail.vue2.mjs +2 -2
  119. package/es/components/modal/ModalForm.vue.mjs +63 -52
  120. package/es/components/modal/ModalForm.vue2.mjs +2 -2
  121. package/es/components/modal/ModalPorter.vue.mjs +51 -36
  122. package/es/components/modal/ModalPorter.vue2.mjs +2 -2
  123. package/es/components/modal/ModalShelf.vue.mjs +38 -28
  124. package/es/components/modal/ModalShelf.vue2.mjs +2 -2
  125. package/es/components/modal/modal-shelf-core.mjs +52 -36
  126. package/es/components/modal/modal-shelf-hierarchy.mjs +11 -9
  127. package/es/components/panel/PanelEditSwitch.vue.mjs +4 -4
  128. package/es/components/panel/PanelEditSwitch.vue2.mjs +88 -66
  129. package/es/components/panel/PanelItem.vue.mjs +4 -4
  130. package/es/components/panel/PanelItem.vue2.mjs +103 -77
  131. package/es/components/panel/PanelItemNestForm.vue.mjs +4 -4
  132. package/es/components/panel/PanelItemNestForm.vue2.mjs +61 -52
  133. package/es/components/panel/PanelItemNestPanel.vue.mjs +22 -20
  134. package/es/components/panel/PanelItemNestPanel.vue2.mjs +2 -2
  135. package/es/components/panel/PanelMain.vue.mjs +4 -4
  136. package/es/components/panel/PanelMain.vue2.mjs +92 -74
  137. package/es/components/panel/nest-panel-form.mjs +44 -38
  138. package/es/components/panel/nest-panel-item.mjs +18 -17
  139. package/es/components/slot-layout/SlotLayoutFlowAside.vue.mjs +4 -4
  140. package/es/components/slot-layout/SlotLayoutFlowAside.vue2.mjs +55 -42
  141. package/es/components/slot-layout/SlotLayoutTemplate.vue.mjs +11 -9
  142. package/es/components/slot-layout/SlotLayoutTemplate.vue2.mjs +2 -2
  143. package/es/components/table/TableMain.vue.mjs +4 -4
  144. package/es/components/table/TableMain.vue2.mjs +378 -275
  145. package/es/components/table/TableSkeleton.vue.mjs +4 -4
  146. package/es/components/table/TableSkeleton.vue2.mjs +95 -74
  147. package/es/components/table/TableToolbar.vue.mjs +4 -4
  148. package/es/components/table/TableToolbar.vue2.mjs +170 -154
  149. package/es/components/table/ToolbarButtons.vue.mjs +12 -10
  150. package/es/components/table/ToolbarButtons.vue2.mjs +2 -2
  151. package/es/components/table/constants.mjs +4 -3
  152. package/es/components/table/use-fill-height.mjs +12 -10
  153. package/es/components/table/use-table-skeleton.mjs +19 -15
  154. package/es/config/list-model.mjs +2 -2
  155. package/es/config/route.mjs +4 -3
  156. package/es/helpers/form.mjs +35 -25
  157. package/es/helpers/list-helper.mjs +59 -44
  158. package/es/hooks/activated.mjs +49 -33
  159. package/es/hooks/feel-size.mjs +39 -23
  160. package/es/hooks/menus-dispatch.mjs +68 -35
  161. package/es/hooks/timeout.mjs +29 -14
  162. package/es/hooks/use-breakpoint.mjs +35 -23
  163. package/es/hooks/use-channel-viewport-height.mjs +30 -20
  164. package/es/hooks/use-custom-breakpoint.mjs +48 -31
  165. package/es/hooks/use-observe-size.mjs +37 -20
  166. package/es/hooks/use-theme-apply.mjs +175 -124
  167. package/es/hooks/use-viewport-apply.mjs +39 -27
  168. package/es/index.mjs +239 -239
  169. package/es/inject/key.mjs +52 -41
  170. package/es/injectInfo.json.mjs +2 -2
  171. package/es/router/group-redirect.mjs +22 -16
  172. package/es/router/guard/index.mjs +26 -21
  173. package/es/router/guard/login.mjs +4 -2
  174. package/es/router/guard/permission.mjs +4 -2
  175. package/es/store/app.mjs +163 -123
  176. package/es/store/router-permission.mjs +75 -46
  177. package/es/store/user.mjs +100 -71
  178. package/es/style.css +769 -1
  179. package/es/utils/dom.mjs +20 -16
  180. package/es/utils/export.mjs +34 -18
  181. package/es/utils/id.mjs +5 -3
  182. package/es/utils/router.mjs +21 -14
  183. package/es/utils/theme-scale.mjs +50 -35
  184. package/es/utils/time.mjs +20 -14
  185. package/package.json +4 -3
  186. package/src/bridge/README.md +5 -0
  187. package/src/bridge/docs/README.md +72 -0
  188. package/src/components/README.md +84 -0
  189. package/src/components/app-layout/README.md +46 -0
  190. package/src/components/app-layout/docs/README-AppAside.md +69 -0
  191. package/src/components/app-layout/docs/README-AppBody.md +81 -0
  192. package/src/components/app-layout/docs/README-AppBreadcrumb.md +71 -0
  193. package/src/components/app-layout/docs/README-AppFooter.md +41 -0
  194. package/src/components/app-layout/docs/README-AppHeader.md +73 -0
  195. package/src/components/app-layout/docs/README-AppLayout.md +83 -0
  196. package/src/components/app-layout/docs/README-AppPage.md +80 -0
  197. package/src/components/app-layout/docs/README-AppSidebar.md +70 -0
  198. package/src/components/app-layout/docs/README-AppTheme.md +66 -0
  199. package/src/components/data-view/README.md +19 -0
  200. package/src/components/data-view/docs/README-DataListView.md +114 -0
  201. package/src/components/display/README.md +23 -0
  202. package/src/components/display/docs/README-ActionBtn.md +84 -0
  203. package/src/components/display/docs/README-ActionBtnGroup.md +96 -0
  204. package/src/components/display/docs/README-ActionConfirm.md +77 -0
  205. package/src/components/display/docs/README-BooleanTag.md +76 -0
  206. package/src/components/display/docs/README-HeightProvider.md +74 -0
  207. package/src/components/display/docs/README-TabsMain.md +99 -0
  208. package/src/components/display/docs/README-WatchSize.md +70 -0
  209. package/src/components/form/README.md +24 -0
  210. package/src/components/form/docs/README-FormItemNestForm.md +86 -0
  211. package/src/components/form/docs/README-FormItemNestFormList.md +93 -0
  212. package/src/components/form/docs/README-FormMain.md +101 -0
  213. package/src/components/form/docs/README-FormSearch.md +89 -0
  214. package/src/components/form/docs/README-FormSubmitBtn.md +72 -0
  215. package/src/components/form/docs/README-FormSubmitPanel.md +97 -0
  216. package/src/components/list-page/README.md +16 -0
  217. package/src/components/list-page/docs/README-ListPage.md +136 -0
  218. package/src/components/menu/README.md +19 -0
  219. package/src/components/menu/docs/README-MenuItemSub.md +53 -0
  220. package/src/components/menu/docs/README-MenuTree.md +76 -0
  221. package/src/components/misc/README.md +21 -0
  222. package/src/components/misc/docs/README-AutoRefresh.md +74 -0
  223. package/src/components/misc/docs/README-AutoRefreshGroup.md +74 -0
  224. package/src/components/misc/docs/README-SelectModule.md +72 -0
  225. package/src/components/modal/README.md +21 -0
  226. package/src/components/modal/docs/README-ModalConfirm.md +105 -0
  227. package/src/components/modal/docs/README-ModalDetail.md +103 -0
  228. package/src/components/modal/docs/README-ModalForm.md +97 -0
  229. package/src/components/modal/docs/README-ModalPorter.md +92 -0
  230. package/src/components/modal/docs/README-ModalShelf.md +115 -0
  231. package/src/components/panel/README.md +19 -0
  232. package/src/components/panel/docs/README-PanelMain.md +149 -0
  233. package/src/components/slot-layout/README.md +17 -0
  234. package/src/components/slot-layout/docs/README-SlotLayoutFlowAside.md +83 -0
  235. package/src/components/slot-layout/docs/README-SlotLayoutTemplate.md +73 -0
  236. package/src/components/table/README.md +17 -0
  237. package/src/components/table/docs/README-TableMain.md +140 -0
  238. package/src/hooks/README.md +5 -0
  239. package/src/hooks/docs/README.md +49 -0
  240. package/types/bridge/config-hook.d.ts +68 -0
  241. package/types/bridge/index.d.ts +411 -0
  242. package/types/bridge/layout.d.ts +40 -0
  243. package/types/bridge/plugin.d.ts +18 -0
  244. package/types/bridge/route.d.ts +20 -1
  245. package/types/bridge/state.d.ts +14 -0
  246. package/types/bridge/storage.d.ts +9 -0
  247. package/types/bridge/theme/index.d.ts +7 -0
  248. package/types/bridge/theme/persist.d.ts +12 -0
  249. package/types/bridge/theme/system-dark.d.ts +12 -0
  250. package/types/bridge/theme/types.d.ts +238 -0
  251. package/types/components/app-layout/AppAside.vue.d.ts +1 -0
  252. package/types/components/app-layout/AppCollapseToggle.vue.d.ts +3 -0
  253. package/types/components/app-layout/AppHeader.vue.d.ts +3 -0
  254. package/types/components/app-layout/AppLayout.vue.d.ts +12 -0
  255. package/types/components/app-layout/AppPage.vue.d.ts +17 -0
  256. package/types/components/app-layout/AppSidebar.vue.d.ts +2 -0
  257. package/types/components/app-layout/app-page-geometry.d.ts +48 -0
  258. package/types/components/app-layout/keep-alive.d.ts +17 -0
  259. package/types/components/app-layout/types.d.ts +125 -0
  260. package/types/components/app-layout/viewport.d.ts +28 -0
  261. package/types/components/data-view/DataListViewItem.vue.d.ts +8 -0
  262. package/types/components/data-view/index.d.ts +4 -0
  263. package/types/components/data-view/types.d.ts +42 -0
  264. package/types/components/data-view/utils.d.ts +3 -0
  265. package/types/components/display/TabsHeader.vue.d.ts +2 -0
  266. package/types/components/display/TabsMain.vue.d.ts +2 -0
  267. package/types/components/display/TabsRefineFlow.vue.d.ts +1 -0
  268. package/types/components/display/TabsTile.vue.d.ts +247 -12
  269. package/types/components/display/WatchSize.vue.d.ts +9 -0
  270. package/types/components/display/index.d.ts +37 -1
  271. package/types/components/display/types.d.ts +163 -0
  272. package/types/components/display/use-tabs-query-sync.d.ts +29 -0
  273. package/types/components/form/FormItemNestForm.vue.d.ts +5 -0
  274. package/types/components/form/FormItemNestFormList.vue.d.ts +17 -0
  275. package/types/components/form/FormVerifyCode.vue.d.ts +9 -0
  276. package/types/components/form/FormVerifyImage.vue.d.ts +1 -0
  277. package/types/components/form/form-search-utils.d.ts +34 -0
  278. package/types/components/form/nest-form-item-list.d.ts +28 -0
  279. package/types/components/form/nest-form-item.d.ts +21 -0
  280. package/types/components/form/nest-registry.d.ts +14 -0
  281. package/types/components/form/types.d.ts +208 -8
  282. package/types/components/form/use-form-submit.d.ts +13 -0
  283. package/types/components/form/use-layout-by-container.d.ts +23 -0
  284. package/types/components/form/use-nest-form-list.d.ts +13 -0
  285. package/types/components/form/use-nest-form.d.ts +15 -0
  286. package/types/components/form/use-nest-layout-scale.d.ts +12 -0
  287. package/types/components/form/utils.d.ts +56 -1
  288. package/types/components/list-page/ListPage.vue.d.ts +6 -0
  289. package/types/components/list-page/types.d.ts +50 -2
  290. package/types/components/list-page/use-sticky.d.ts +23 -0
  291. package/types/components/misc/index.d.ts +6 -1
  292. package/types/components/misc/types.d.ts +7 -0
  293. package/types/components/modal/ModalConfirm.vue.d.ts +29 -0
  294. package/types/components/modal/index.d.ts +7 -1
  295. package/types/components/modal/modal-shelf-core.d.ts +3 -0
  296. package/types/components/modal/modal-shelf-hierarchy.d.ts +4 -0
  297. package/types/components/modal/modal-shelf-types.d.ts +34 -0
  298. package/types/components/modal/types.d.ts +63 -2
  299. package/types/components/panel/PanelItemNestForm.vue.d.ts +6 -0
  300. package/types/components/panel/PanelItemNestPanel.vue.d.ts +5 -0
  301. package/types/components/panel/nest-panel-form.d.ts +21 -0
  302. package/types/components/panel/nest-panel-item.d.ts +14 -0
  303. package/types/components/panel/types.d.ts +52 -1
  304. package/types/components/slot-layout/SlotLayoutTemplate.vue.d.ts +21 -0
  305. package/types/components/slot-layout/types.d.ts +4 -0
  306. package/types/components/table/constants.d.ts +8 -0
  307. package/types/components/table/types.d.ts +140 -9
  308. package/types/components/table/use-fill-height.d.ts +14 -0
  309. package/types/components/table/use-table-skeleton.d.ts +16 -0
  310. package/types/config/list-model.d.ts +29 -0
  311. package/types/config/route.d.ts +2 -0
  312. package/types/helpers/form.d.ts +5 -0
  313. package/types/helpers/list-helper.d.ts +26 -0
  314. package/types/helpers/types.d.ts +11 -0
  315. package/types/hooks/activated.d.ts +23 -0
  316. package/types/hooks/feel-size.d.ts +2 -0
  317. package/types/hooks/menus-dispatch.d.ts +4 -0
  318. package/types/hooks/timeout.d.ts +4 -0
  319. package/types/hooks/use-channel-viewport-height.d.ts +8 -0
  320. package/types/hooks/use-custom-breakpoint.d.ts +19 -0
  321. package/types/hooks/use-observe-size.d.ts +29 -0
  322. package/types/hooks/use-theme-apply.d.ts +23 -0
  323. package/types/hooks/use-viewport-apply.d.ts +12 -0
  324. package/types/inject/key.d.ts +163 -0
  325. package/types/injectInfo.json.d.ts +1 -1
  326. package/types/router/group-redirect.d.ts +9 -0
  327. package/types/router/guard/index.d.ts +13 -0
  328. package/types/router/guard/login.d.ts +1 -0
  329. package/types/router/guard/permission.d.ts +1 -0
  330. package/types/router/guard/types.d.ts +3 -0
  331. package/types/store/app.d.ts +27 -0
  332. package/types/store/router-permission.d.ts +53 -0
  333. package/types/store/user.d.ts +24 -0
  334. package/types/types/dot-path.d.ts +8 -0
  335. package/types/types/route.d.ts +45 -0
  336. package/types/types/utility-types.d.ts +7 -0
  337. package/types/utils/dom.d.ts +22 -0
  338. package/types/utils/export.d.ts +16 -1
  339. package/types/utils/id.d.ts +1 -0
  340. package/types/utils/router.d.ts +2 -0
  341. package/types/utils/theme-scale.d.ts +31 -0
  342. package/types/utils/time.d.ts +1 -0
@@ -0,0 +1,114 @@
1
+ # DataListView(数据视图列表)
2
+
3
+ > 卡片/自定义渲染的列表视图:外部传入数据与列配置,无请求、无分页;TableMain `customView` 模式的渲染载体。
4
+ > 范式页:`apps/reference/src/pages/data-view/custom-view/Index.vue`
5
+ > ⚠️ 内部件:仅供 TableMain 内部 import,[MUST NOT] 对外导出(不进 core 顶层 export)
6
+
7
+ ## 定位
8
+
9
+ - **何时用**:`TableMain` 的 `customView` 模式——自定义卡片视图替代标准表格渲染
10
+ - **何时不用**:标准表格用 `TableMain` / `ElTable`;DataListView 不直接对外消费
11
+ - 泛型 `<T, F extends Record<string, any>>`:行类型 / 注入上下文类型
12
+ - 数据契约:`data` 外部传入(当前页数据),组件无请求/分页逻辑
13
+ - 接线:TableMain `customView.value ? markRaw(DataListView) : markRaw(ElTable)`;ListPage 转发 `#custom-view-item` 插槽(类型 `DataListViewItemScope<T>`)
14
+
15
+ ## 快速上手(最小可用)
16
+
17
+ 业务消费范式(经 TableMain `customView` 模式接入,`custom-view/Index.vue` 摘要):
18
+
19
+ ```html
20
+ <TableMain :customView="customView" :columns="columns" :api="api" rowKey="id">
21
+ <template #custom-view-item="{ fieldComponentMap, row, index, selected, toggleSelect }">
22
+ <component :is="fieldComponentMap['name']" :row="row" :index="index" />
23
+ </template>
24
+ </TableMain>
25
+ ```
26
+
27
+ **要点**:
28
+
29
+ - `fieldComponentMap` 键规则:列 `prop` / `$type_index`(行号)/ `$type_selection`(选中框);`type: "expand"` 跳过
30
+ - 字段组件经 `markRaw(defineComponent)`(name `"DataViewField"`,props `row` / `index` / `selected` / `toggleSelect`)产稳定组件,跨渲染不 remount
31
+ - 选中能力 `selectable` 开启后才有 `$type_selection` 键;选中变化走 `selectionChange`;`data` 引用变化(刷新)即清空选中
32
+
33
+ ## 能力边界 / 按需使用
34
+
35
+ - **内部件不进顶层 export:仅供 TableMain 内部 import,[MUST NOT] 对外导出 / 全局注册 / install。** 业务 [MUST] 走 `TableMain` `customView` 模式消费——本组件无请求/分页,`data` 须外部传入(当前页数据),脱离 TableMain 直接消费没有数据来源。
36
+ - **`maxHeight` / `minHeight`:默认 `undefined`(自然高度)即够用。** 仅当限高滚动(`maxHeight` 传入容器 `overflowY: auto`)或配合 TableMain `fillHeight` 顶分页器到底(`minHeight`)才设。
37
+ - **`selectable`:默认 `false` 即够用。** 仅当卡片需要选中/批量操作能力才开——开启后才有 `$type_selection` 键。
38
+ - **`rowKey` / `columns` / `getRenderCtxParams` 必填契约**:行唯一键、列配置、列 render 上下文缺一不可。
39
+ - **完整能力演示**(选中框列 + 行号列 + 字段列 + 操作列全接线):`apps/reference/src/pages/data-view/custom-view/Index.vue`——能力展示,非推荐默认。
40
+
41
+ ## API
42
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
43
+
44
+ ### Props
45
+
46
+ | name | type | 默认 | 语义 |
47
+ | --- | --- | --- | --- |
48
+ | `data` | `T[]`(必填) | 无 | 当前页数据,外部传入,组件无请求/分页逻辑 |
49
+ | `rowKey` | `Extract<keyof T, string> \| ((row: T) => string)`(必填) | 无 | 行唯一键:键名或函数,内部统一 String 化 |
50
+ | `columns` | `DataViewColumn<T>[]`(必填) | 无 | 列配置(Pick 自 ElTableColumnProps 的 `prop` / `label` / `type` / `render`),内部归一为 `fieldComponentMap` |
51
+ | `maxHeight` | `number` | `undefined` | 传入时容器 `overflowY: auto` 限高滚动 |
52
+ | `minHeight` | `number` | `undefined` | 传入时撑满至此高(配合 TableMain `fillHeight` 顶分页器到底) |
53
+ | `selectable` | `boolean` | `false` | 启用选中能力 |
54
+ | `getRenderCtxParams` | `() => Pick<TableColumnDefaultScope<T, F>, "injectInfo" \| "exposeInfo">`(必填) | 无 | 列 render 上下文(必填契约) |
55
+
56
+ ### Emits
57
+
58
+ | 事件 | 载荷 | 语义 |
59
+ | --- | --- | --- |
60
+ | `selectionChange` | `rows: T[]` | 选中项变更 |
61
+
62
+ ### Slots
63
+
64
+ | 槽 | scope | 语义 |
65
+ | --- | --- | --- |
66
+ | `#item` | `DataListViewItemScope<T>`(`fieldComponentMap` / `row` / `index` / `selected` / `toggleSelect`) | 单项渲染(customView 卡片内容) |
67
+ | `#empty` | 无 | 空态(默认 `<el-empty />`,消费方可覆写) |
68
+
69
+ ### Expose(`DataListViewInstance` = TableInstance 对齐)
70
+
71
+ 实际实现 5 个:`clearSelection` / `getSelectionRows` / `toggleRowSelection` / `toggleAllSelection` / `columns`。
72
+
73
+ 其余 10 个方法(`toggleRowExpansion` / `setCurrentRow` / `clearSort` / `clearFilter` / `doLayout` / `sort` / `scrollTo` / `setScrollTop` / `setScrollLeft` / `updateKeyChildren`)经 utils 填「not supported」抛错桩——调用即抛错,勿依赖。
74
+
75
+ ## 反模式 / 注意
76
+
77
+ - **不对外导出**:本组件 [MUST NOT] 对外导出 / 全局注册 / 提供 install 插件;消费方 [MUST] 走 `TableMain` `customView` 模式
78
+ - **无请求/分页**:`data` 须外部传入(当前页数据),勿期待组件内部取数
79
+ - **刷新清选中**:`data` 引用变化即清空选中——跨页 / 刷新后选中状态不保留
80
+ - **未实现方法抛错**:Expose 面与 TableInstance 对齐但 10 个方法为「not supported」桩(表格特有行为在自定义视图无意义)
81
+ - **列键依赖归一规则**:消费 `fieldComponentMap` 只用 `prop` / `$type_index` / `$type_selection` 三系键,`type: "expand"` 列不产出
82
+
83
+ ## DataListViewItem(列表项容器)
84
+
85
+ 由 DataListView 内部 `v-for` 使用的列表项容器;消费方一般不直接使用。
86
+
87
+ ### Props
88
+
89
+ | name | type | 默认 | 语义 |
90
+ | --- | --- | --- | --- |
91
+ | `selected` | `boolean`(必填) | 无 | 是否选中(由 DataListView 传入) |
92
+
93
+ ### Emits / Expose
94
+
95
+
96
+
97
+ ### Slots
98
+
99
+ | 槽 | scope | 语义 |
100
+ | --- | --- | --- |
101
+ | `#default` | 无 | 项内容 |
102
+
103
+ ### 定位注释(.vue 头)
104
+
105
+ - 仅承载选中态 class 钩子(`.is-selected`)+ 项内容插槽
106
+ - [MUST NOT] 写死视觉样式(卡片阴影 / 圆角归消费方)
107
+ - [MUST NOT] 内置选中状态机
108
+
109
+ ## 关联
110
+
111
+ - 宿主:`TableMain`(table 族,`customView` 模式);`ListPage`(转发 `#custom-view-item`)
112
+ - 内部件:`DataListViewItem`(本文件上文)
113
+ - 类型:`DataViewColumn<T>` / `DataListViewItemScope<T>`(data-view types.ts)
114
+ - 范式页:`apps/reference/src/pages/data-view/custom-view/Index.vue`
@@ -0,0 +1,23 @@
1
+ # display 展示族
2
+
3
+ 展示与交互原语:TabsMain(Tab 容器)/ ActionBtn 系列(确认闸门 + 自动 loading)/ 尺寸与高度工具(WatchSize / HeightProvider)/ BooleanTag。
4
+
5
+ ## 组件文档(docs/)
6
+
7
+ - [TabsMain](./docs/README-TabsMain.md) — Tab 容器(channel 嵌套 / tile 平铺 / query 同步)
8
+ - [ActionBtn](./docs/README-ActionBtn.md) — ElButton 超集(confirm 闸门 + beforeOpen + 自动 loading)
9
+ - [ActionBtnGroup](./docs/README-ActionBtnGroup.md) — 配置式按钮组(渲染三态)
10
+ - [ActionConfirm](./docs/README-ActionConfirm.md) — 确认原语(扁平,submitFn 返 Promise 才关)
11
+ - [WatchSize](./docs/README-WatchSize.md) — 尺寸监听容器(mode / observeResize / debounce)
12
+ - [HeightProvider](./docs/README-HeightProvider.md) — 纯数值高度预算节点(available = viewportHeight − reserve)
13
+ - [BooleanTag](./docs/README-BooleanTag.md) — boolean 只读彩色标签
14
+
15
+ ## 关键类型
16
+
17
+ - `TabsMainProps` / `TabsMainItem` / `ActionBtnProps` / `ActionBtnConfirmConfig` / `ActionBtnConfigItem` / `ActionBtnGroupProps` / `ActionConfirmProps` / `BooleanTagProps`(经 `./types` 导出)
18
+ - 内部件不导出:`TabsHeader` / `TabsTile` / `TabsRefineFlow` / `TabsNaturalFlow` / `use-tabs-query-sync`
19
+
20
+ ## 范式页(apps/reference)
21
+
22
+ - `/display/tabs/showcase`(基础 + queryKey)、`/display/tabs/guide`(channel 嵌套最佳实践)、`/display/tabs/tile`(平铺)、`/display/tabs/fullpage`(顶级自撑)、`/display/tabs/nested-channel`
23
+ - `/display/action-btn/showcase`(16 场景)、`/display/action-btn-group/showcase`(5 场景)
@@ -0,0 +1,84 @@
1
+ # ActionBtn(确认闸门按钮)
2
+
3
+ > ElButton 超集:透传全部 ElButton props + 确认闸门(popconfirm / messageConfirm)+ beforeOpen 异步预取 + click handler 返 Promise 自动 loading + 重复点击防抖。
4
+ > 范式页:`apps/reference/src/pages/display/action-btn/showcase/`
5
+
6
+ ## 定位
7
+
8
+ - **何时用**:配置化体系下的**默认按钮原语**——需要 confirm / loading 中的任意能力,或按体系规则 11 替代 ElButton
9
+ - **何时不用**:表格操作列 / 堆按钮用 `ActionBtnGroup`(配置驱动);`loading` 对外不可设置,[MUST NOT] 自管 submitting ref + :loading
10
+ - 内部:`confirmMode="messageConfirm"` 内嵌 ConfirmModal 居中模态;`"popconfirm"` 走 ElPopover
11
+
12
+ ## 快速上手(最小可用)
13
+
14
+ 普通按钮 + 异步 onClick 自动 loading——零配置即带 loading 与重复点击防抖:
15
+
16
+ ```html
17
+ <ActionBtn type="danger" @click="handleDelete">删除</ActionBtn>
18
+ ```
19
+
20
+ ```ts
21
+ const handleDelete = async () => {
22
+ await deleteUserApi(row.id); // 返回 Promise → 自动 loading
23
+ ElMessage.success("已删除");
24
+ };
25
+ ```
26
+
27
+ **要点**:
28
+
29
+ - 提交类按钮让 onClick 返回 Promise(async)即自动 loading——[MUST NOT] 自管 `submitting` ref + `:loading`(留着是死 prop)
30
+ - `@click` 归 emits 不进 $attrs(防绕过闸门),由组件在确认通过后手动触发
31
+
32
+ ## 能力边界 / 按需使用
33
+
34
+ - **确认闸门(`confirmConfig`):默认无=普通按钮直通 click。** 仅当操作需要确认(删除 / 归档 / 批量操作等不可逆)才配;函数形态 `(data: T) => config` 仅当确认文案依赖点击时预取的数据时用(data 来自 `beforeOpen` 返回值,无 beforeOpen 时 T 默认 void、data=undefined)。
35
+ - **`confirmMode`:默认 `"popconfirm"`(ElPopover 就近轻确认)即够用**;`"messageConfirm"`(内嵌 ConfirmModal 居中模态、强阻断)仅当操作风险高、需醒目居中确认时选。
36
+ - **`beforeOpen`(异步预取):默认不用。** 仅当确认内容需要点击时动态取数(如先取详情再拼删除文案)才配;reject 静默退出(不弹层不触发 click),调用方 [MUST] 内部 catch 反馈;⚠️ 与 confirmConfig 均消耗瞬时用户激活窗口,handler 内 [MUST NOT] 调 window.open / navigator.clipboard 等。
37
+ - **自动 loading 与重复点击防抖:默认即带。** onClick 返 Promise 自动 loading,innerLoading / confirmVisible 置位时自动吞重复点击——无需任何配置。
38
+ - **完整能力演示**(beforeOpen 预取 + 函数 confirmConfig + 动态删除各场景):`apps/reference/src/pages/display/action-btn/showcase/`——能力展示,非推荐默认。
39
+
40
+ ## API
41
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
42
+
43
+ ### Props(泛型 `T` = beforeOpen 返回类型)
44
+
45
+ | name | type | 默认 | 语义 |
46
+ | --- | --- | --- | --- |
47
+ | 全部 ElButton props | 透传 | type 默认 "default" | size/plain/bg/link/round/circle/color/dark/disabled/autofocus/nativeType/autoInsertSpace/tag/icon/loadingIcon 显式 pick 透传 + attrs 叠加 |
48
+ | `loading` | ❌ 被 Omit | — | 对外不可设置,内部独占 innerLoading(对接异步 confirm / beforeOpen / click handler) |
49
+ | `confirmMode` | `ActionConfirmMode?` | `"popconfirm"` | "popconfirm"\|"messageConfirm"(后者内嵌 ConfirmModal 居中模态) |
50
+ | `confirmConfig` | `ActionBtnConfirmConfig \| ((data: T) => ActionBtnConfirmConfig)?` | 无=普通按钮 | 确认闸门;函数形态入参 data 来自 beforeOpen 返回值 |
51
+ | `beforeOpen` | `() => Promise<T>?` | — | 点击后、弹层前异步预取;reject 静默退出(不弹层不触发 click,调用方 [MUST] 内部 catch 反馈);期间按钮 loading。⚠️ confirmConfig/beforeOpen 均会消耗瞬时用户激活窗口,之后 handler [MUST NOT] 调 window.open/navigator.clipboard 等 |
52
+
53
+ `ActionBtnConfirmConfig`:`title?` / `content?`(`ActionConfirmTextResolver` = string | (() => string | VNode[]))、`confirmText?`(默认「确定」)、`cancelText?`(默认「取消」)、`type?: ButtonProps["type"]`
54
+
55
+ ### Emits
56
+
57
+ | 事件 | 载荷 | 语义 |
58
+ | --- | --- | --- |
59
+ | `click` | `MouseEvent` | 显式声明——父层 @click 归 emits 不进 $attrs(防绕过闸门);由组件在确认通过后手动触发 |
60
+
61
+ ### Slots
62
+
63
+ | 槽 | scope | 语义 |
64
+ | --- | --- | --- |
65
+ | `#default` | 无 | 按钮内容 |
66
+
67
+ ### Expose
68
+
69
+ 无(`inheritAttrs: false`)
70
+
71
+ ## 反模式 / 注意
72
+
73
+ - **自管 loading**:[MUST NOT] 自管 submitting ref + `:loading`——onClick 返 Promise 即自动 loading,外部 `:loading` 被忽略
74
+ - **beforeOpen reject 反馈**:reject 静默退出,调用方 [MUST] 内部 catch 做错误反馈(如 ElMessage.error)
75
+ - **用户激活窗口**:confirmConfig / beforeOpen 消耗瞬时用户激活窗口,handler 内 [MUST NOT] 调 window.open / navigator.clipboard 等(被浏览器拦截)
76
+ - **无闸门语义**:confirmConfig 不传 = 普通按钮直通 click——需确认的操作 [MUST] 配 confirmConfig
77
+ - **重复点击**:innerLoading || confirmVisible 置位时吞掉重复点击(防抖),无需外部再防
78
+
79
+ ## 关联
80
+
81
+ - 上游:`ActionConfirm`(popconfirm / messageConfirm 两种确认弹层)
82
+ - 下游:`ActionBtnGroup`(表格操作列 / 堆按钮配置驱动)
83
+ - 体系规则:规则 11(配置化体系按钮默认 ActionBtn 替代 ElButton)
84
+ - 范式页:`apps/reference/src/pages/display/action-btn/showcase/`
@@ -0,0 +1,96 @@
1
+ # ActionBtnGroup(配置驱动按钮组)
2
+
3
+ > 配置驱动按钮组:一个 configs 数组渲染一列按钮——`actionBtnProps` 走 ActionBtn(带确认闸门)或 `props` 走 ElButton(无闸门),`show` 控制显隐、`render` 自由接管。
4
+ > 范式页:`apps/reference/src/pages/display/action-btn-group/showcase/`
5
+
6
+ ## 定位
7
+
8
+ - **何时用**:表格操作列 / 工具栏堆按钮——按配置项数组驱动,多按钮零手写
9
+ - **何时不用**:单按钮直接用 `ActionBtn`
10
+ - 渲染三态(`ActionBtnConfigItem<Ctx>`):`actionBtnProps`(走 ActionBtn,带 confirm/beforeOpen,与 props 二选一优先)/ `props`(走 ElButton,无闸门)/ `render`(对标 FormItem.render 三态,完全接管)
11
+
12
+ ## 快速上手(最小可用)
13
+
14
+ 挂载(`action-btn-group/showcase/Index.vue`):
15
+
16
+ ```html
17
+ <ActionBtnGroup :configs="scene1Configs" :ctx="row" />
18
+ ```
19
+
20
+ 单项配置(popconfirm 默认模式 + ctx 入参):
21
+
22
+ ```ts
23
+ {
24
+ key: "1a",
25
+ label: "1A:popconfirm(默认模式)",
26
+ actionBtnProps: (c) => ({
27
+ type: "warning",
28
+ confirmConfig: { title: `归档 ${c.row.name}?`, type: "warning" },
29
+ onClick: () => {
30
+ lastAction.value = `1A popconfirm 归档:${c.row.name}`;
31
+ ElMessage.success("已归档(popconfirm)");
32
+ },
33
+ }),
34
+ },
35
+ ```
36
+
37
+ **要点**:
38
+
39
+ - `actionBtnProps` 与 `props` 二选一,`actionBtnProps` 优先(走 ActionBtn,带 confirm/beforeOpen)
40
+ - `ctx` 透传给每项 actionBtnProps/props/render/show——函数态统一入口
41
+ - Fragment 多根,[MUST NOT] 直接传 style attr(外层 [MUST] 包 div)
42
+
43
+ ## 能力边界 / 按需使用
44
+
45
+ - **`actionBtnProps` 分支(走 ActionBtn,带闸门):默认推荐。** 绝大多数操作按钮走它(confirm / beforeOpen / 自动 loading 白拿);`props` 分支(裸 ElButton 无闸门)仅当按钮确实无需闸门且无需 ActionBtn 能力时才用——同项二选一(`actionBtnProps` 优先)。
46
+ - **`render`(完全接管):默认不用。** 仅当按钮内容 / 结构超出 props 表达(自定义复合内容、非按钮形态)才用——对标 FormItem.render 三态(string / Component / (props) => VNode)。
47
+ - **`show`(显隐过滤):默认全显(缺省 true)。** 仅当按钮需按上下文动态显隐(如选中行才出现的操作)才配 `(ctx) => boolean`。
48
+ - **`defaultSize`:默认不强加。** 仅当整组按钮需统一基础 size 时传;业务侧显式 size 优先(spread 在后覆盖)。
49
+ - **完整能力演示**(渲染三态 + show 过滤 + 多场景组合):`apps/reference/src/pages/display/action-btn-group/showcase/`——能力展示,非推荐默认。
50
+
51
+ ## API
52
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
53
+
54
+ ### Props(泛型 `Ctx` = 渲染上下文)
55
+
56
+ | name | type | 默认 | 语义 |
57
+ | --- | --- | --- | --- |
58
+ | `configs` | `ActionBtnConfigItem<Ctx>[]?` | `[]` | 按钮配置列表 |
59
+ | `ctx` | `Ctx`(必填) | — | 渲染上下文,透传给每项 actionBtnProps/props/render/show |
60
+ | `defaultSize` | `ActionBtnSize?`("large"\|"default"\|"small") | 不传=不强加 | 基础 size 注入;业务侧返回对象内显式 size 优先(spread 在后覆盖) |
61
+
62
+ **ActionBtnConfigItem\<Ctx\> 渲染三态**:
63
+
64
+ | 字段 | type | 语义 |
65
+ | --- | --- | --- |
66
+ | `key` | `string`(必填) | 项唯一键 |
67
+ | `actionBtnProps` | `(ctx) => Record<string, any>` | 走 ActionBtn,带 confirm/beforeOpen;与 props 二选一优先 |
68
+ | `props` | `(ctx) => Record<string, any>` | 走 ElButton,无闸门 |
69
+ | `label` | `string?` | render 缺省时回退文案 |
70
+ | `render` | `string \| Component \| ((props: { ctx: Ctx }) => VNode)` | 对标 FormItem.render 三态,完全接管渲染 |
71
+ | `show` | `(ctx) => boolean` | false 跳过,缺省 true |
72
+
73
+ ### Emits
74
+
75
+
76
+
77
+ ### Slots
78
+
79
+
80
+
81
+ ### Expose
82
+
83
+
84
+
85
+ ## 反模式 / 注意
86
+
87
+ - **直接给 Fragment 传 style attr**:[MUST NOT]——多根 Fragment 无法落 style,外层包 div
88
+ - **同项同配 actionBtnProps 与 props**:二选一(actionBtnProps 优先),语义混用易困惑
89
+ - **defaultSize 覆盖**:业务侧显式 size 覆盖注入(spread 在后),无需担心注入污染
90
+ - **无闸门语义**:`props` 分支是裸 ElButton——需要确认的按钮 [MUST] 走 actionBtnProps
91
+
92
+ ## 关联
93
+
94
+ - 内部组件:`ActionBtn`(actionBtnProps 分支)
95
+ - 上游:`ListPage.toolbar`(leftExtraButtons 即 ActionBtnGroup 配置形态)
96
+ - 范式页:`apps/reference/src/pages/display/action-btn-group/showcase/`
@@ -0,0 +1,77 @@
1
+ # ActionConfirm(独立确认弹层)
2
+
3
+ > 独立确认弹层:popconfirm(ElPopover 宽 240)或 messageConfirm(内嵌 ConfirmModal 居中模态)两种模式,submitFn 返 Promise → 确认按钮 loading + 弹层不关,仅 fulfill 才关闭。
4
+ > 范式页:`apps/reference/src/pages/display/action-btn/showcase/`(场景 12 独立用法)
5
+
6
+ ## 定位
7
+
8
+ - **何时用**:需要外部独立控制确认弹层显隐(`v-model:show`)的场景——ActionBtn 的确认闸门底层即本组件
9
+ - **何时不用**:按钮确认直接走 `ActionBtn` 的 `confirmConfig`(本组件已内嵌,无需手动组合)
10
+ - 触发元素由 `#default` 槽提供;弹层显隐由外部 `v-model:show` 控制
11
+
12
+ ## 快速上手(最小可用)
13
+
14
+ 独立用法(`action-btn/showcase/Index.vue` 场景 12):
15
+
16
+ ```html
17
+ <ActionConfirm v-model:show="standaloneVisible" mode="popconfirm" title=... content=... type="danger" :submit-fn="standaloneSubmit">
18
+ <!-- 触发元素由默认 slot 提供 -->
19
+ </ActionConfirm>
20
+ ```
21
+
22
+ **要点**:
23
+
24
+ - submitFn 返 Promise → 确认按钮 loading + 弹层不关,仅 fulfill 才关闭;reject/throw 保持打开(错误由 submitFn 内部 catch 反馈)
25
+ - 弹层关闭(确认或取消)都会 emit `close(confirmed: boolean)`
26
+ - messageConfirm 模式 show=true→true 重入安全
27
+
28
+ ## 能力边界 / 按需使用
29
+
30
+ - **`mode` 两种形态判据(必填)**:`"popconfirm"`(ElPopover 宽 240、就近轻确认)为常规推荐;`"messageConfirm"`(内嵌 ConfirmModal 居中模态、强阻断 + 自定义弹层)仅当操作风险高、需醒目居中确认时选。
31
+ - **`submitFn` 返 Promise:所有确认场景建议返 Promise**——确认按钮自动 loading + 弹层不关、仅 fulfill 才关闭(防重复提交);reject/throw 保持打开,错误在 submitFn 内部 catch 反馈。
32
+ - **`v-model:show` 外部控制:仅独立弹层场景需要。** 按钮确认一律走 `ActionBtn` 的 `confirmConfig`(本组件已内嵌,无需手动组合);仅当弹层显隐由外部业务逻辑独立驱动(非按钮触发)时才直用本组件。
33
+ - **触发元素由 `#default` 槽提供**:[MUST NOT] 留空(弹层无内置触发点)。
34
+ - **完整能力演示**(独立用法):`apps/reference/src/pages/display/action-btn/showcase/` 场景 12——能力展示,非推荐默认。
35
+
36
+ ## API
37
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
38
+
39
+ ### Props
40
+
41
+ | name | type | 默认 | 语义 |
42
+ | --- | --- | --- | --- |
43
+ | `mode` | `"popconfirm" \| "messageConfirm"`(必填) | — | 弹层形态(popconfirm = ElPopover 宽 240;messageConfirm = 内嵌 ConfirmModal) |
44
+ | `title` / `content` | 同 ActionBtnConfirmConfig | — | 标题 / 内容文本 |
45
+ | `confirmText` | `string?` | 「确定」 | 确认按钮文案 |
46
+ | `cancelText` | `string?` | 「取消」 | 取消按钮文案 |
47
+ | `type` | `ButtonProps["type"]?` | — | 按钮类型(如 danger) |
48
+ | `submitFn` | `() => void \| Promise<void>`(必填) | — | 确认提交逻辑 |
49
+
50
+ **v-model**:`show`(`v-model:show`,默认 false)
51
+
52
+ ### Emits
53
+
54
+ | 事件 | 载荷 | 语义 |
55
+ | --- | --- | --- |
56
+ | `close` | `confirmed: boolean` | 弹层关闭(确认 true / 取消 false) |
57
+
58
+ ### Slots
59
+
60
+ | 槽 | scope | 语义 |
61
+ | --- | --- | --- |
62
+ | `#default` | 无 | 触发元素 |
63
+
64
+ ### Expose
65
+
66
+
67
+
68
+ ## 反模式 / 注意
69
+
70
+ - **submitFn 吞错误再 resolve**:[MUST NOT] 把失败当成功关闭弹层——reject/throw 保持打开,错误在 submitFn 内部 catch 反馈(如 ElMessage.error)
71
+ - **默认槽留空**:popconfirm 触发元素由默认槽提供,[MUST NOT] 留空
72
+
73
+ ## 关联
74
+
75
+ - 内部组件:`ConfirmModal`(messageConfirm 模式)
76
+ - 上游:`ActionBtn`(confirmConfig 内部即本组件)
77
+ - 范式页:`apps/reference/src/pages/display/action-btn/showcase/`(场景 12)
@@ -0,0 +1,76 @@
1
+ # BooleanTag(布尔状态标签)
2
+
3
+ > 布尔值 → ElTag 状态标签:value 派生 type(true → activeTagType 默认 success,false → inactiveTagType 默认 info),文案可配。
4
+ > 范式页:无独立范式页(典型消费:`apps/reference/src/pages/_shared/user-form.config.tsx` 表单列 render)
5
+
6
+ ## 定位
7
+
8
+ - **何时用**:把 boolean 渲染为「是/否」「启用/禁用」等状态标签(表格列 / 表单只读渲染)
9
+ - **何时不用**:多态枚举标签用 `ElTag` 自配 type;纯文本用普通 span
10
+ - `inheritAttrs: false`——attrs(size/effect/round 等)透传 ElTag,但 `:type` 被 value 派生覆盖(消费方无法覆盖 type)
11
+
12
+ ## 快速上手(最小可用)
13
+
14
+ 典型消费(`_shared/user-form.config.tsx`——枚举→boolean 在调用点一行映射):
15
+
16
+ ```tsx
17
+ {
18
+ key: "status",
19
+ label: "状态",
20
+ render: (scope) => (
21
+ <BooleanTag
22
+ value={scope.value === "enabled"}
23
+ activeText="启用"
24
+ inactiveText="禁用"
25
+ />
26
+ ),
27
+ },
28
+ ```
29
+
30
+ **要点**:
31
+
32
+ - 枚举 → boolean 的映射在调用点一行完成(如上 `scope.value === "enabled"`)
33
+ - 默认「是/否」+ success/info 即可覆盖大多数场景,文案/type 按需覆盖
34
+
35
+ ## 能力边界 / 按需使用
36
+
37
+ - **默认即够用**:默认「是/否」文案 + success/info 双态配色覆盖大多数场景(启用/禁用、上线/下线等)——零配置使用,典型消费仅一行 render 映射。
38
+ - **`activeText` / `inactiveText` / `activeTagType` / `inactiveTagType`:仅当默认文案 / 配色不符合业务语义才覆盖**(如「启用 / 禁用」、状态需醒目色);均为按需单项覆盖,无需成套配。
39
+ - **attrs 透传(size / effect / round 等):默认不加。** 仅视觉微调按需透传;⚠️ `:type` 被 value 派生独占,消费方 [MUST NOT] 覆盖。
40
+ - **适用范围:只吃 boolean。** 三态及以上枚举标签用 `ElTag` 自配 type;纯文本直接用 span。
41
+ - **完整能力演示**:典型消费 `apps/reference/src/pages/_shared/user-form.config.tsx`(表单列 render 一行映射)。
42
+
43
+ ## API
44
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
45
+
46
+ ### Props
47
+
48
+ | name | type | 默认 | 语义 |
49
+ | --- | --- | --- | --- |
50
+ | `value` | `boolean`(必填) | — | 布尔值 |
51
+ | `activeText` | `string?` | 「是」 | true 文案 |
52
+ | `inactiveText` | `string?` | 「否」 | false 文案 |
53
+ | `activeTagType` | 同 ElTag type | `"success"` | true 的标签 type |
54
+ | `inactiveTagType` | 同 ElTag type | `"info"` | false 的标签 type |
55
+
56
+ ### Emits
57
+
58
+
59
+
60
+ ### Slots
61
+
62
+
63
+
64
+ ### Expose
65
+
66
+
67
+
68
+ ## 反模式 / 注意
69
+
70
+ - **覆盖 :type**:[MUST NOT]——type 由 value 派生独占,消费方无法覆盖(attrs 只透传 size/effect/round 等)
71
+ - **三态枚举**:只吃 boolean——三态及以上用 ElTag 自管
72
+
73
+ ## 关联
74
+
75
+ - 基础:`ElTag`(element-plus)
76
+ - 典型消费:`apps/reference/src/pages/_shared/user-form.config.tsx`
@@ -0,0 +1,74 @@
1
+ # HeightProvider(视口高度供给)
2
+
3
+ > 视口高度供给:传入 viewportHeight,按 #header 实际高度(WatchSize 测高)扣减 reserve,向 #default 插槽提供 available 高度——页面容器高度链的源头。
4
+ > 范式页:无独立范式页(内嵌于 TabsMain refine 精细流等容器;核心实证:`packages/core/src/components/display/__tests__/HeightProvider.test.ts`)
5
+
6
+ ## 定位
7
+
8
+ - **何时用**:需要「视口高 − 页头高 → 内容可用高」计算的容器源头
9
+ - **何时不用**:页签容器直接用 `TabsMain`(内部已接 HeightProvider,无需手动组合)
10
+ - 不 inject/provide;Fragment 双根(header + default 并行渲染)
11
+
12
+ ## 快速上手(最小可用)
13
+
14
+ 核心实证(`__tests__/HeightProvider.test.ts`):
15
+
16
+ ```html
17
+ <HeightProvider :viewportHeight="480">
18
+ <template #header>...</template>
19
+ <template #default="{ viewportHeight }">...</template>
20
+ </HeightProvider>
21
+ ```
22
+
23
+ **要点**:
24
+
25
+ - `#default` scope `{ viewportHeight: available }`,available = max(viewportHeight - reserve, minHeight ?? 0)
26
+ - `#header` 经 WatchSize 测高得 reserve——header 高度变化自动回算
27
+ - [MUST NOT] 给 WatchSize 设 min-height: available(reserve↔available 反馈环 → 首帧震荡)
28
+
29
+ ## 能力边界 / 按需使用
30
+
31
+ - **默认场景:被容器组件内嵌消费,业务 [MUST NOT] 手动组合。** `TabsMain` refine 精细流内部即包 HeightProvider、`ListPage` 已接管高度链——常规页签 / 列表页无需直用本组件。
32
+ - **业务直用判据**:自定义容器需要「视口高 − 页头高 → 内容可用高」计算,且现有容器组件(TabsMain / ListPage)接不上时才直用——形态:有固定 `#header` 区 + `#default` 需精确撑满到视口底;`#header` 经 WatchSize 量高,header 高度变化自动回算。
33
+ - **`minHeight`:默认 `0` 即够用。** 仅当内容需要保底高度才设;⚠️ 超 viewportHeight 会撑破父容器——有意设计,[MUST NOT] 当 bug 修。
34
+ - **`viewportHeight` 必填**:由父级传入(AppBody 高度链 / 显式值),本组件不 inject/provide。
35
+ - **完整能力演示**:无独立范式页——核心实证 `packages/core/src/components/display/__tests__/HeightProvider.test.ts` + `TabsMain` refine 精细流消费(`apps/reference/src/pages/display/tabs/`)。
36
+
37
+ ## API
38
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
39
+
40
+ ### Props
41
+
42
+ | name | type | 默认 | 语义 |
43
+ | --- | --- | --- | --- |
44
+ | `viewportHeight` | `number`(必填) | — | 视口可用高度(父级传入) |
45
+ | `minHeight` | `number?` | `0` | 兜底下限;超 viewportHeight 会撑破父容器——有意设计 |
46
+
47
+ ### Emits
48
+
49
+ | 事件 | 载荷 | 语义 |
50
+ | --- | --- | --- |
51
+ | `childViewportHeightChange` | `value: number` | 可用高度变化(immediate 首发) |
52
+
53
+ ### Slots
54
+
55
+ | 槽 | scope | 语义 |
56
+ | --- | --- | --- |
57
+ | `#default` | `{ viewportHeight: available }` | 内容区(available = max(viewportHeight - reserve, minHeight ?? 0)) |
58
+ | `#header` | 无 | 页头区(经 WatchSize 测高得 reserve) |
59
+
60
+ ### Expose
61
+
62
+
63
+
64
+ ## 反模式 / 注意
65
+
66
+ - **WatchSize min-height: available 反馈环**:[MUST NOT]——reserve↔available 互算 → 首帧震荡
67
+ - **minHeight 超 viewportHeight**:会撑破父容器——有意设计,[MUST NOT] 当 bug 修
68
+ - **Fragment 双根**:不能直接作为单根子组件传 class/style 到外部
69
+
70
+ ## 关联
71
+
72
+ - 内部:`WatchSize`(#header 量高)
73
+ - 下游:`TabsMain`(refine 精细流内部包 HeightProvider)
74
+ - 核心实证:`packages/core/src/components/display/__tests__/HeightProvider.test.ts`
@@ -0,0 +1,99 @@
1
+ # TabsMain(配置化页签容器)
2
+
3
+ > 配置驱动的页签容器:v-model 激活 + 动态命名槽 / 组件渲染 + 视口高度链(refine 精细流 / 自然流)+ 路由 query 双向同步 + 平铺 tile 模式(卡片列 + 角落 nav + scrollspy)。
4
+ > 范式页:`apps/reference/src/pages/display/tabs/showcase/`(基础 + queryKey)、`pages/display/tabs/nested-channel/`(channel 嵌套链)、`pages/display/tabs/tile/`(平铺)
5
+
6
+ ## 定位
7
+
8
+ - **空间一等公民**:多 tab 空间首选(单层或嵌套 tab 链)
9
+ - **何时用**:页签切换内容的容器(单层或嵌套 tab 链),需要可用高度计算 / 路由深链 / 平铺卡片列时
10
+ - **何时不用**:无页签语义的纯内容高度计算用 `HeightProvider`;列表页场景直接用 `ListPage`
11
+ - 双流实现:refine=false 自然流(`TabsNaturalFlow`,不包 HeightProvider,scope viewportHeight 为 undefined);refine=true 精细流(`TabsRefineFlow`,HeightProvider 精确扣 header reserve + padding)——均为内部实现,不导出
12
+ - 内部实现(不导出):`TabsHeader` / `TabsTile` / `TabsNaturalFlow` / `TabsRefineFlow` / `use-tabs-query-sync.ts`
13
+
14
+ ## 快速上手(最小可用)
15
+
16
+ 最常用基础 tab 形态——默认配置即够用(自然流,不依赖 queryKey / channel / tile):
17
+
18
+ ```ts
19
+ const active = ref<string>();
20
+ const tabs = [
21
+ { key: "overview", title: "概览" },
22
+ { key: "editor", title: "编辑器", component: markRaw(EditorPane) },
23
+ ];
24
+ ```
25
+
26
+ ```html
27
+ <TabsMain v-model="active" :tabs="tabs">
28
+ <template #overview="{ tab, active: a }"> ... </template>
29
+ </TabsMain>
30
+ ```
31
+
32
+ **要点**:
33
+
34
+ - `#<key>` 动态槽优先于 `tab.component` 回退;槽 scope `{ tab, active, viewportHeight }`(refine 精细流给可用高度、自然流 undefined)
35
+ - `component` [MUST] 用 `markRaw` 包裹,[MUST NOT] 直接放响应式组件对象
36
+ - 槽内角标用 opacity 切换勿用 v-if——会改标题宽度致下划线动画错位
37
+
38
+ ## 能力边界 / 按需使用
39
+
40
+ - **refine(精细流):默认 `false`(自然流)即够用。** 自然流不包 HeightProvider(scope viewportHeight 为 undefined),页签内容按自身尺寸渲染即可;仅当 tab 内容需要精确撑满到视口底(页签头内滚、内容区借可用高度)才开 `refine`——判据:内容高度必须由「视口高 − header reserve − padding」计算,且随 header 变化回算。
41
+ - **queryKey(路由深链):默认不传=不同步。** 仅当激活 tab 需要可被 URL 深链 / 刷新 / 前进后退恢复(分享链接 / 回到原 tab)才传 `queryKey`;此时 active 初值留空由 query 恢复(防 replace 竞速覆盖深链);无 vue-router 环境静默失效。
42
+ - **channel / parentChannel(嵌套链):默认不用。** 仅当 tab 内容里还有更深的页签链、需要逐级扣高(L1 页签内容再嵌 L2 页签,且 L2 需撑满 L1 剩余高度)才配;⚠️ 每级 [MUST] 显式 `refine`、每级 TabsMain [MUST] 是父 tab 内容**直接根**、channel 名 [MUST NOT] 响应式变更——缺任一链路静默失效。
43
+ - **tile(平铺模式):默认关(tab-bar 页签形态)。** 仅当所有 item 需铺成卡片列 + 角落 nav + scrollspy(长文档式阅读、内容即卡片)才开 `tile`;`navPosition` / `navMode` / `navOffset` 仅在 tile 下有意义。
44
+ - **variant:默认按 level 推导(1-4 级依次 card / indicator / indicator-compact / plain)即够用**,仅特殊视觉需求显式覆盖。
45
+ - **完整能力演示**(基础 + queryKey + 嵌套链 + 平铺各态):`apps/reference/src/pages/display/tabs/showcase/`、`pages/display/tabs/nested-channel/`、`pages/display/tabs/tile/`——能力展示,非推荐默认。
46
+
47
+ ## API
48
+ > ⚠️ API 以 types.ts 与组件源码为真相源;与文档冲突时以源码为准。
49
+
50
+ ### Props
51
+
52
+ | name | type | 默认 | 语义 |
53
+ | --- | --- | --- | --- |
54
+ | `tabs` | `TabsMainItem[]`(必填) | — | tab 配置列表 |
55
+ | `viewportHeight` | `number?` | — | 显式视口高度,优先级最高;未传降级 inject SCOPE_VIEWPORT_MAX_HEIGHT scope 链 |
56
+ | `minHeight` | `number?` | `100` | 内容区高度兜底下限 |
57
+ | `channel` | `string?` | — | 作为父时的 scope 标识。⚠️ 与 parentChannel 均 [MUST NOT] 响应式变更(setup 期快照);且仅 refine=true 路径生效 |
58
+ | `parentChannel` | `string?` | — | 作为子时定向消费的祖先 scope 标识(沿对象链 parent 找匹配) |
59
+ | `padding` | `TabsMainPadding`(= [top,right,bottom,left] px) | `[10,10,0,10]` | 默认插槽容器内置 padding(withDefaults 实证);top+bottom 同步从 slot scope / channel viewportHeight 扣减 |
60
+ | `refine` | `boolean?` | `false` | false=自然流(TabsNaturalFlow,不包 HeightProvider,scope viewportHeight 为 undefined);true=精细流(TabsRefineFlow,HeightProvider 精确扣 header reserve + padding) |
61
+ | `refineReduceHeight` | `number?` | `0` | 从 viewportHeightFinal 预扣的高度(refine=false 时同样生效) |
62
+ | `variant` | `TabsHeaderVariant?` | 按 level 推导 | "card"\|"indicator"\|"indicator-compact"\|"plain";level 1-4 默认依次 card/indicator/indicator-compact/plain。字号始终跟 level(inject TABS_MAIN_VISUAL_LEVEL +1 每层) |
63
+ | `queryKey` | `string?` | 不传=不同步 | 激活 tab ↔ 路由 query 双向同步的 key:切 tab → router.replace `?{queryKey}={key}`(不压栈);激活/刷新/前进后退读 query 反向恢复;无 vue-router 环境静默失效 |
64
+ | `tile` | `boolean?` | `false` | 平铺模式:所有 item 铺成卡片列(各裹 ElCard)、隐藏 tab-bar、角落 nav 导航 + scrollspy 反写激活 |
65
+ | `navPosition` | `TabsMainTileNavPosition?` | `"bottom-right"` | 平铺角落 nav 落角(四角) |
66
+ | `navMode` | `TabsMainTileNavMode?` | `"auto"` | "auto"\|"absolute"\|"sticky"\|"fixed";auto = refine→absolute / 自然流→sticky |
67
+ | `navOffset` | `number?` | `12` | 平铺角落 nav 距角像素 |
68
+
69
+ **v-model**:`v-model`(string,激活 tab key;非法值归一回写 tabs[0].key,tabs 空不回写)
70
+
71
+ ### Emits
72
+
73
+ 无显式 defineEmits(仅 model)
74
+
75
+ ### Slots
76
+
77
+ | 槽 | scope | 语义 |
78
+ | --- | --- | --- |
79
+ | `#<key>` | `{ tab, active, viewportHeight }` | 优先于 tab.component 回退;viewportHeight 精细流给可用高度、自然流 undefined(⚠️ tile 模式槽 scope 仅 `{ tab, active }`,无 viewportHeight) |
80
+ | `#header-<key>` | `{ tab, active }` | 覆盖页签头,优先于 tab.title |
81
+
82
+ ### Expose
83
+
84
+
85
+
86
+ ## 反模式 / 注意
87
+
88
+ - **channel / parentChannel 响应式变更**:[MUST NOT]——setup 期快照,后续变更无效
89
+ - **缺 refine 的 channel 链**:链路静默失效——每级 [MUST] 显式 refine
90
+ - **TabsMain 非父 tab 内容直接根**:[MUST NOT]——外层再包 div 会让高度链错位
91
+ - **槽内角标用 v-if**:会改标题宽度致下划线动画错位,用 opacity 切换
92
+ - **queryKey 深链初值**:active 初值留空由 query 恢复(防 replace 竞速覆盖深链)
93
+ - **tab.component 裸放响应式组件对象**:用 markRaw
94
+
95
+ ## 关联
96
+
97
+ - 内部实现:`TabsNaturalFlow` / `TabsRefineFlow` / `TabsHeader` / `TabsTile` / `use-tabs-query-sync.ts`(均不导出)
98
+ - 高度链:`SCOPE_VIEWPORT_MAX_HEIGHT` scope 链(viewportHeight / parentChannel 消费侧)
99
+ - 范式页:`apps/reference/src/pages/display/tabs/showcase/`、`pages/display/tabs/nested-channel/`、`pages/display/tabs/tile/`