@done-coding/admin-core 0.17.1-alpha.0 → 0.18.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 (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
@@ -1,7 +1,36 @@
1
+ /** `useObserveSize` 入参。 */
1
2
  export interface UseObserveSizeOptions {
3
+ /**
4
+ * 观测目标获取器(响应式)——返回 `null`/`undefined` 时不观测;
5
+ * 支持派生元素(如 `() => contentRef.value?.parentElement`)。目标变化自动重挂。
6
+ */
2
7
  getTarget: () => HTMLElement | null | undefined;
8
+ /** 尺寸变化回调(RO 触发,携当次 entry;消费方按需读 contentRect / 自量 clientRect)。 */
3
9
  onResize: (entry: ResizeObserverEntry) => void;
10
+ /** 是否启用(响应式,缺省恒开);返回 `false` 时断开观测。 */
4
11
  enabled?: () => boolean;
12
+ /**
13
+ * RO 回调防抖间隔(ms,默认 `100`)。RO 在抽屉开合 / 窗口拖拽 / CSS 过渡期可**每帧回调**,
14
+ * `onResize` 里写响应式态会引发高频下游重算(provide computed 链 / 列表重排)。
15
+ * 默认防抖以 `{ leading: true, trailing: true }` 分发——**首帧即时**(无初始 0 值闪、
16
+ * 立即给出一次尺寸)+ **尾沿取静止后终值**,把中间高频帧洪流合并掉。
17
+ * 传 `0` 关闭防抖、每次 RO 回调同步透传(消费方自管防抖时用,如 `WatchSize` 的
18
+ * debounce 跨 RO / onUpdated / window.resize 三源共享,不宜在此再叠一层)。
19
+ */
5
20
  debounce?: number;
6
21
  }
22
+ /**
23
+ * 激活态感知的 ResizeObserver 元素尺寸观测原语(core hooks)。
24
+ *
25
+ * 把「新建 RO / 观测 / 绑解 / 清理」这套过程性机制从组件 setup 收敛进 hook——组件只声明
26
+ * `getTarget` + `onResize`,[MUST NOT] 在 setup 顶级手搓 `new ResizeObserver`/`let ro`(规则 21)。
27
+ *
28
+ * - **观测**:`getTarget()` 元素尺寸变化(含不触发重渲染的 CSS 过渡折叠 / 异步撑开)→ `onResize`。
29
+ * - **防抖**:默认 `100ms`(`debounce` 可调 / 传 0 关)——RO 高频帧合并,`leading` 首帧即时不丢初值。
30
+ * - **激活态感知**:随 `useActivated` 绑解——激活时观测、失活时断开(规则 21①),失活不空耗。
31
+ * - **目标/开关响应**:`getTarget` 或 `enabled` 变化(如抽屉懒渲染节点出现、`observeResize` 切换)
32
+ * 自动重挂观测(`flush: "post"` 确保 DOM 已 patch)。
33
+ * - **降级**:SSR / 无 `ResizeObserver` 环境静默跳过。
34
+ * - **清理**:`onScopeDispose`(hook 内合法,scope-portable、不依赖组件实例;规则 21③)。
35
+ */
7
36
  export declare const useObserveSize: (options: UseObserveSizeOptions) => void;
@@ -1,11 +1,34 @@
1
1
  import { DeepReadonly } from 'vue';
2
2
  import { AppThemeConfig, CoreThemeDensity, CoreThemeMotion } from '../bridge';
3
+ /**
4
+ * 构建节奏 `<style>` 文本:单 `:root{}` 块(明暗无关,[MUST NOT] 进 `:root.dark`)
5
+ * + reduced-motion 兜底块(无条件压过三档,design §2.3)。
6
+ *
7
+ * dual-write 规格(design §3):control-height→`--el-component-size`、font-base→
8
+ * `--el-font-size-base`、motion-duration→`--el-transition-duration-fast`、
9
+ * duration-slow→`--el-transition-duration`、easing→两个 EP bezier。spacing 四 token
10
+ * EP 无对应、仅挂 dc-core(EP 内部写死间距由 §3.1 受控桥接样式重映射)。
11
+ */
3
12
  export declare function buildRhythmCss(density: CoreThemeDensity, motion: CoreThemeMotion): string;
13
+ /** `useCoreThemeApply` 入参。 */
4
14
  export interface UseCoreThemeApplyOptions {
15
+ /** 当前风格 config 响应式获取器(= `bridge.APP_THEME_CONFIG`,含 light/dark) */
5
16
  getThemeConfig: () => AppThemeConfig | DeepReadonly<AppThemeConfig>;
17
+ /** 是否暗色响应式获取器(= `bridge.themeIsDark.value`) */
6
18
  getThemeIsDark: () => boolean;
19
+ /**
20
+ * 当前密度档响应式获取器(= `bridge.themeDensity.value`)。
21
+ * 与 {@link getThemeMotion} **同时**提供才注入节奏 `<style>`;缺省 → 不挂节奏(向后兼容)。
22
+ */
7
23
  getThemeDensity?: () => CoreThemeDensity;
24
+ /** 当前动效档响应式获取器(= `bridge.themeMotion.value`);语义同 {@link getThemeDensity}。 */
8
25
  getThemeMotion?: () => CoreThemeMotion;
26
+ /** 注入 document(测试 / SSR);缺省 `globalThis.document`,不存在时静默跳过 */
9
27
  document?: Document;
10
28
  }
29
+ /**
30
+ * 启动 core 主题挂值——watch 风格 config 重写 `<style>`、watch 暗色 toggle `<html>.dark`。
31
+ *
32
+ * 在组件 setup(`AppLayout`)内调用以随组件作用域自动停 watch。返回 void。
33
+ */
11
34
  export declare function useCoreThemeApply(options: UseCoreThemeApplyOptions): void;
@@ -1,8 +1,20 @@
1
1
  import { DeepReadonly } from 'vue';
2
2
  import { AppLayoutViewportConfig, AppLayoutGapConfig } from '../bridge';
3
+ /** `useCoreViewportApply` 入参。 */
3
4
  export interface UseCoreViewportApplyOptions {
5
+ /** viewport 边框配置响应式获取器(= `bridge.APP_LAYOUT_VIEWPORT_CONFIG`) */
4
6
  getViewportConfig: () => AppLayoutViewportConfig | DeepReadonly<AppLayoutViewportConfig>;
7
+ /**
8
+ * 模块间距 gap 配置响应式获取器(= `bridge.APP_LAYOUT_GAP_CONFIG`,可选)。
9
+ * 传入则额外注入 `--dc-core-gap`;不传则不注入该 var(向后兼容)。
10
+ */
5
11
  getGapConfig?: () => AppLayoutGapConfig | DeepReadonly<AppLayoutGapConfig>;
12
+ /** 注入 document(测试 / SSR);缺省 `globalThis.document`,不存在时静默跳过 */
6
13
  document?: Document;
7
14
  }
15
+ /**
16
+ * 启动 viewport CSS var 挂值——watch viewport config 重写 `<style>`。
17
+ *
18
+ * 在组件 setup(`AppLayout`)内调用以随组件作用域自动停 watch。返回 void。
19
+ */
8
20
  export declare function useCoreViewportApply(options: UseCoreViewportApplyOptions): void;
@@ -3,13 +3,70 @@ import { CoreBridge } from '../bridge';
3
3
  import { ModalLevel, ShelfController } from '../components/modal';
4
4
  import { AppLayoutAppStoreSlice, AppLayoutUserStoreSlice, AppLayoutBridgeSlice } from '../components/app-layout';
5
5
  import { NestFormExposeMap } from '../components/form';
6
+ /**
7
+ * body 视口高度
8
+ * ---
9
+ * AppBody(留 app)通过 provide 写入;
10
+ * TableMain / ListPage / Page1(核内或核外消费方)通过 inject 读取;
11
+ * ---
12
+ * **只读契约**:值类型 `Readonly<Ref<number>>`——几何真相只许 owner(AppBody 量测 /
13
+ * AppPage 扣槽重 provide)写,后代只读(provide 侧 `readonly()`/`computed` 包装,写 = dev warn +
14
+ * no-op)。类型焊在 key 上 → 所有 inject 点自动只读,[MUST NOT] 消费点自带泛型改写成可写 Ref。
15
+ * ---
16
+ * 使用 `Symbol.for` 全局注册表保证跨包 / 跨 chunk / 跨 ESM 实例的 Symbol 唯一性。
17
+ * `Symbol(key)` 每次调用产生新实例;vite chunk split 或多次模块 evaluate 可能
18
+ * 产生多个 Symbol → inject/provide 失配 → 列表精细化高度计算塌陷至 fallback。
19
+ * ---
20
+ * ⚠️ **已被 `SCOPE_VIEWPORT_MAX_HEIGHT` 取代、留作兼容**:core 内部(hook + refine 消费方)
21
+ * 已全部改走新 key;本 key 仅在各 provider(AppBody / AppPage / ConfirmModal)侧**并列保留
22
+ * provide**,供外部/存量直接 inject 的消费方续用(兼容只体现在"老 provide 不撤",
23
+ * [MUST NOT] 在消费 hook 里加老 key 兜底分支)。
24
+ */
6
25
  export declare const BODY_CONTENT_VIEWPORT_HEIGHT: InjectionKey<Readonly<Ref<number>>>;
26
+ /**
27
+ * scope 视口可用最大高载荷——单 key 承载「就近链」+「具名 scope 定向」。
28
+ * ---
29
+ * 取代 `BODY_CONTENT_VIEWPORT_HEIGHT`(一个 key 逐层含义不同、语义混浊)与
30
+ * `Symbol.for(props.channel)` 裸串 channel 机制(per-id 派生 symbol、无命名空间):
31
+ * 每个有界容器 provider(AppBody / AppPage / TabsMain 精细流 / ConfirmModal)provide
32
+ * 一个本对象,`parent` 指向上一层对象形成**祖先链**——
33
+ * - **就近**:消费方(`useChannelViewportHeight`)inject 最近对象取 `.viewportMaxHeight`;
34
+ * - **定向**:消费方带 `parentChannel` → 沿 `.parent` 走链找 `scope === parentChannel` 的那层;
35
+ * - **隔断**:弹层(ConfirmModal)不 inject 上层、自测自体高、`parent: undefined` 断链——
36
+ * 弹层内后代只见弹层 scope,不受身后页面高影响。
37
+ */
7
38
  export interface ScopeViewportMaxHeight {
39
+ /** 本 scope 标识:具名容器(TabsMain 的 channel)取 props.channel;匿名容器(AppBody/AppPage/弹层)为 undefined */
8
40
  scope?: string;
41
+ /** 本 scope 的可用最大高(响应式只读,同老 key 只读契约) */
9
42
  viewportMaxHeight: Readonly<Ref<number>>;
43
+ /** 祖先链:上一层 scope 对象;隔断层(ConfirmModal)置 undefined 断链 */
10
44
  parent?: ScopeViewportMaxHeight;
11
45
  }
46
+ /**
47
+ * scope 视口可用最大高 inject key(对象 + 祖先链,见 {@link ScopeViewportMaxHeight})。
48
+ * ---
49
+ * provider 侧与老 `BODY_CONTENT_VIEWPORT_HEIGHT` **并列 provide**(同一响应式源;
50
+ * ConfirmModal modal 态例外:老 key 透传外层、新 key 自测减预留,两值可不同 by design)。
51
+ * 消费侧(hook + core 内部 refine 全家)只认本 key。
52
+ * Symbol.for 全局注册表保证跨包/跨 chunk/跨 ESM 实例唯一(同 BODY_CONTENT_VIEWPORT_HEIGHT,规则 8)。
53
+ */
12
54
  export declare const SCOPE_VIEWPORT_MAX_HEIGHT: InjectionKey<ScopeViewportMaxHeight>;
55
+ /**
56
+ * body 内容矩形四边 viewport inset + shim 内边距(AppPage 四向悬浮插槽用)
57
+ * ---
58
+ * AppBody(持 store 几何)算好「内容矩形」= `app-body-shim` 外框相对 viewport 的四边
59
+ * inset(CSS calc 字符串,响应式)+ `shimPadding`(app-body-shim 内边距 px)后 provide;
60
+ * AppPage inject 自取,把四向悬浮插槽(page 级 header/footer/sidebar/aside)以
61
+ * `position: fixed` 纯 calc 定位(视口坐标、scroll 不变、随 chrome 自动跟),并据
62
+ * `shimPadding` 给各插槽 shim 的「朝 chrome 三边」留呼吸。
63
+ * ---
64
+ * 四区贴 app-body-shim 外框(inset 不含 shimPadding);shimPadding 改由各插槽内层 shim
65
+ * 的外侧边消化、内侧边用 AppPage gap。bottom inset 已扣 footer(取 minHeight 算)。
66
+ * inject 缺命中(脱离 AppLayout 单用)时 AppPage 降级量自身盒子兜底(shimPadding=0)。
67
+ * ---
68
+ * Symbol.for 全局注册表保证跨包/跨 chunk/跨 ESM 实例唯一(同 BODY_CONTENT_VIEWPORT_HEIGHT,规则 8)。
69
+ */
13
70
  export declare const BODY_CONTENT_VIEWPORT_RECT: InjectionKey<ComputedRef<{
14
71
  top: string;
15
72
  left: string;
@@ -17,23 +74,129 @@ export declare const BODY_CONTENT_VIEWPORT_RECT: InjectionKey<ComputedRef<{
17
74
  bottom: string;
18
75
  shimPadding: number;
19
76
  }>>;
77
+ /**
78
+ * body 内容矩形四边 viewport inset 的**已解析 px 数值**(app 级 chrome:header/footer/sidebar/aside + 外框 + gap)。
79
+ * ---
80
+ * 与 `BODY_CONTENT_VIEWPORT_RECT`(calc 字符串,供 CSS fixed 定位)**同源异形**:同一份 store 几何真相,
81
+ * 一个出 calc 串给 CSS、一个出 px 数值给 JS。四边 inset 里 `100vh` 全约掉 → store 纯数值算出(零探针、
82
+ * 零 getBoundingClientRect),响应式随 chrome(header/sidebar 显隐、尺寸/gap 配置、折叠)自动跟。
83
+ * ---
84
+ * 用途:自管滚动的后代(如 TabsMain tile 自然流 window 滚动)算「固定 chrome 顶厚度」作 ElAnchor offset;
85
+ * AppPage 在此基础上叠加自己的四向悬浮插槽 → `APP_PAGE_CONTENT_INSET`。
86
+ * inject 缺命中(脱离 AppLayout 单用)→ 消费方退 `{0,0,0,0}`(standalone 无 app chrome)。
87
+ * ---
88
+ * Symbol.for 全局注册表保证跨包/跨 chunk/跨 ESM 实例唯一(同 BODY_CONTENT_VIEWPORT_HEIGHT,规则 8)。
89
+ */
20
90
  export declare const BODY_CONTENT_VIEWPORT_INSET: InjectionKey<ComputedRef<{
21
91
  top: number;
22
92
  bottom: number;
23
93
  left: number;
24
94
  right: number;
25
95
  }>>;
96
+ /**
97
+ * AppPage 对后代暴露的「固定 chrome 四边内衬」——含四向悬浮插槽 + 内容矩形 inset 的**已解析 px** 值。
98
+ * ---
99
+ * `BODY_CONTENT_VIEWPORT_RECT` 只含「header + 主题 viewport + sidebar」inset,**不含 AppPage 自己的
100
+ * 四向悬浮插槽**。自然流(window 滚动)自管滚动的后代(如 TabsMain tile)算「滚动 offset」时须知道
101
+ * 含四槽的**固定 chrome** 厚度,否则内容被顶/底/侧悬浮插槽遮住。故 AppPage(四槽唯一 owner)在
102
+ * `BODY_CONTENT_VIEWPORT_INSET`(app 级 chrome 的 px 数值)基础上叠加自己四槽尺寸(含 gap)后 provide,
103
+ * 后代只消费不自造。**纯数值加法、零探针**(app 级 inset 已是 store 算好的 px)。
104
+ * ---
105
+ * - `top`/`bottom`/`left`/`right`:固定 chrome 在窗口坐标下的 px 厚度(= 内容矩形对应 inset + 对应槽含 gap)。
106
+ * 自然流(window 滚动)的组件用 `top` 作 ElAnchor `offset`(scrollTo 与 scrollspy 同用一值)。
107
+ * ---
108
+ * 注:**有界容器"可用高度"不走此 key**——AppPage 把可用高扣四槽后重 provide
109
+ * `SCOPE_VIEWPORT_MAX_HEIGHT`(+ 老 key 并列,见 AppPage),故 `useChannelViewportHeight`
110
+ * 的所有消费方(ListPage / TableMain / TabsRefineFlow / TabsTile refine)在 AppPage 内
111
+ * **自动**拿到扣槽后的高,无需逐个改。
112
+ * ---
113
+ * Symbol.for 全局注册表保证跨包/跨 chunk/跨 ESM 实例唯一(同 BODY_CONTENT_VIEWPORT_HEIGHT,规则 8)。
114
+ */
26
115
  export declare const APP_PAGE_CONTENT_INSET: InjectionKey<Readonly<Ref<Readonly<{
27
116
  top: number;
28
117
  bottom: number;
29
118
  left: number;
30
119
  right: number;
31
120
  }>>>>;
121
+ /**
122
+ * 弹窗架子 inject key 工厂——按 level 参数化。
123
+ * Symbol.for 全局注册表保证跨包/跨 chunk/跨 ESM 实例唯一(同 BODY_CONTENT_VIEWPORT_HEIGHT)。
124
+ */
32
125
  export declare function getModalShelfInjectionKey(level: ModalLevel): InjectionKey<ShelfController>;
126
+ /**
127
+ * TabsMain 视觉嵌套层级 inject key(独立于 channel payload.level)。
128
+ * ---
129
+ * 与 channel(SCOPE_VIEWPORT_MAX_HEIGHT scope 链,高度预算用)体系完全解耦:
130
+ * 视觉 level = 物理嵌套深度,每层 TabsMain(含 refine=false)+1 → provide 给后代
131
+ * ---
132
+ * 用途:TabsHeader 据此应用层级化样式(L1 卡片 / L2 下划线 / L3 紧凑 / L4+ 仅文字加粗)。
133
+ * setup 期一次性 provide number(不响应式);Symbol.for 跨包/chunk/ESM 实例唯一(同上)。
134
+ */
33
135
  export declare const TABS_MAIN_VISUAL_LEVEL: InjectionKey<number>;
136
+ /**
137
+ * AppLayout 族 app store 窄化消费契约 inject key。
138
+ * ---
139
+ * AppLayout(唯一 `useAppStore()` 调用方)provide;子组件
140
+ * (AppBody / AppHeader / AppSidebar / AppFooter)inject 自取。
141
+ * Symbol.for 保证跨包同一性(同 BODY_CONTENT_VIEWPORT_HEIGHT)。
142
+ */
34
143
  export declare const APP_LAYOUT_APP_STORE_KEY: InjectionKey<AppLayoutAppStoreSlice>;
144
+ /**
145
+ * AppLayout 族 user store 窄化消费契约 inject key。
146
+ * ---
147
+ * AppLayout 集中 provide;AppHeader inject 自取(取 userInfo / isLogin / logout 等)。
148
+ * Symbol.for 保证跨包同一性。
149
+ */
35
150
  export declare const APP_LAYOUT_USER_STORE_KEY: InjectionKey<AppLayoutUserStoreSlice>;
151
+ /**
152
+ * AppLayout 族 bridge 窄化消费契约 inject key(#7.6 期挂载)。
153
+ * ---
154
+ * AppLayout 通过 `props.bridge` 接收注入后 provide;子组件
155
+ * (AppBody/AppHeader/AppSidebar/AppLayout 内菜单派生)inject 自取 12 readonly
156
+ * 配置属性 + getRoutes / generateRouteMetaRawTree 派生方法。
157
+ * Symbol.for 保证跨包同一性(同 APP_LAYOUT_APP_STORE_KEY / APP_LAYOUT_USER_STORE_KEY)。
158
+ */
36
159
  export declare const APP_LAYOUT_BRIDGE_KEY: InjectionKey<AppLayoutBridgeSlice>;
160
+ /**
161
+ * 整 bridge app 级注入 key(#插件系统一期挂载)。
162
+ * ---
163
+ * `bridge.install(app)`(即 `app.use(bridge)`)经 `app.provide(CORE_BRIDGE_KEY, bridge)`
164
+ * 把**整个 bridge 实例**注入应用级 provide 链;任意后代组件经 `inject(CORE_BRIDGE_KEY)`
165
+ * 取整 bridge(含 7 响应式只读配置视图 + `update` + 全部 auth/api/派生方法)。
166
+ * ---
167
+ * **opt-in**:仅当 app 显式 `app.use(bridge)` 时注入;未 use 则 `inject(CORE_BRIDGE_KEY)`
168
+ * 返回 `undefined`(不报错)。
169
+ * ---
170
+ * **区别于 `APP_LAYOUT_BRIDGE_KEY`**:后者是 AppLayout 族**组件级**窄切片(`AppLayoutBridgeSlice`
171
+ * Pick 子集,由 AppLayout 从 `props.bridge` 接收后 provide,供 layout 子组件 inject),
172
+ * 两 KEY 各管各、并存——本 KEY 注入的是 app 级**整 bridge**,非 layout 窄切片。
173
+ * ---
174
+ * Symbol.for 保证跨包/跨 chunk/跨 ESM 实例唯一(同 APP_LAYOUT_BRIDGE_KEY,规则 8)。
175
+ */
37
176
  export declare const CORE_BRIDGE_KEY: InjectionKey<CoreBridge>;
177
+ /**
178
+ * 嵌套子 FormMain exposeMap inject key(配置化嵌套联结组件 Nest 三件套挂载)。
179
+ * ---
180
+ * 每个 FormMain `provide` 一份本 key 的空 exposeMap(shallowReactive,按 item key 索引),
181
+ * 供其后代联结组件(FormItemNestForm)`inject` 到**最近祖先** FormMain 的 map 并把子
182
+ * FormMain 的级联 expose 写入(key = 自身 item key);FormMain 的 validate/clearValidate/
183
+ * resetFields 遍历自身 map 级联子表单。
184
+ * ---
185
+ * provide/inject 链天然实现「只挂最近祖先」(inject 向上解析至最近 provide)。
186
+ * 注册由联结组件显式触发(非裸嵌套 FormMain 自动注册)→ 旧用法零回归(additive)。
187
+ * ---
188
+ * Symbol.for 保证跨包/跨 chunk/跨 ESM 实例唯一(规则 8,同上)。
189
+ */
38
190
  export declare const FORM_NEST_REGISTRY_KEY: InjectionKey<NestFormExposeMap>;
191
+ /**
192
+ * 嵌套布局 rebase 累乘因子 inject key(P3 嵌套布局 rebase 挂载)。
193
+ * ---
194
+ * 每个 FormMain / PanelMain `provide` 自身 `layoutScale`(缺省 1)的响应式只读引用;
195
+ * 其后代联结组件(FormItemNestForm / FormItemNestFormList / PanelItemNestPanel /
196
+ * PanelItemNestForm)`inject` 到**最近祖先**的 scale,叠本层因子
197
+ * `childScale = parentScale × (24 / parentItemSpan)` 后作 `layoutScale` 传子 Form/PanelMain。
198
+ * ---
199
+ * 顶级 FormMain/PanelMain 未嵌套时 provide 1 → 子层缺省行为不变(向后兼容)。
200
+ * Symbol.for 保证跨包/跨 chunk/跨 ESM 实例唯一(规则 8,同上)。
201
+ */
39
202
  export declare const NEST_LAYOUT_SCALE_KEY: InjectionKey<Readonly<Ref<number>>>;
@@ -1,6 +1,6 @@
1
1
  declare const _default: {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.17.1-alpha.0",
3
+ "version": "0.18.1-alpha.0",
4
4
  "description": "内部前端库"
5
5
  };
6
6
 
@@ -1,5 +1,14 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
2
  export interface WithGroupRedirectOptions {
3
+ /** 分组父配了 component 时的处置:"warn"(默认)console.warn;"error" throw。 */
3
4
  onParentComponent?: "warn" | "error";
4
5
  }
6
+ /**
7
+ * 路由分组处理(替代 flatRoutes,纯函数、递归多层):
8
+ * ① 无 component 分组父补 redirect 到 children[0],防直达父路径白屏(权限交守卫再校验);
9
+ * 无 name 子路由的兜底目标用 redirect 函数的 `to.path` 拼接——不依赖静态 basePath,
10
+ * 分组挂在任意 base 下(router root 或外层父路由)均正确。
11
+ * ② 分组父配了 component 时按 onParentComponent 警告/报错(范式:分组父不承接视图,共享父视图走 teleport)。
12
+ * 有显式 redirect / component 的节点原样保留。
13
+ */
5
14
  export declare const withGroupRedirect: (routes: RouteRecordRaw[], options?: WithGroupRedirectOptions) => RouteRecordRaw[];
@@ -2,6 +2,19 @@ import { Router } from 'vue-router';
2
2
  import { checkLogin } from './login';
3
3
  import { checkPermission } from './permission';
4
4
  import { CreateGuardOptions } from './types';
5
+ /**
6
+ * 路由守卫工厂——给 router 装登录守卫 + 权限守卫 + document.title 写入。
7
+ *
8
+ * 1:1 镜像原 app `router/guard/index.ts` 行为:
9
+ * - beforeEach: checkLogin → 跳 loginPath;checkPermission → 跳 noPermissionPath
10
+ * - beforeResolve: document.title = to.meta.title
11
+ *
12
+ * @example
13
+ * createGuard(router, {
14
+ * bridge: appBridge,
15
+ * useRoutePermission,
16
+ * });
17
+ */
5
18
  export declare const createGuard: (router: Router, options: CreateGuardOptions) => void;
6
19
  export { checkLogin, checkPermission };
7
20
  export type { CreateGuardOptions, GuardBridgeSlice, GuardRoutePermissionStore, } from './types';
@@ -1,3 +1,4 @@
1
1
  import { RouteLocationNormalized } from 'vue-router';
2
2
  import { GuardRoutePermissionStore } from './types';
3
+ /** 登录检测壳子——复用 store.checkNeedGoToLoginPage */
3
4
  export declare const checkLogin: (to: RouteLocationNormalized, store: GuardRoutePermissionStore) => Promise<boolean>;
@@ -1,3 +1,4 @@
1
1
  import { RouteLocationNormalized } from 'vue-router';
2
2
  import { GuardRoutePermissionStore } from './types';
3
+ /** 权限检测壳子——复用 store.checkNeedGoToAuthPage */
3
4
  export declare const checkPermission: (to: RouteLocationNormalized, store: GuardRoutePermissionStore) => Promise<boolean>;
@@ -1,10 +1,13 @@
1
1
  import { RouteLocationNormalized } from 'vue-router';
2
2
  import { CoreBridge } from '../../bridge';
3
+ /** guard 仅依赖 bridge 的路径配置切片(Pick 表达 → 必 type alias,无法 interface) */
3
4
  export type GuardBridgeSlice = Pick<CoreBridge, "APP_ROUTER_PATHS_CONFIG">;
5
+ /** guard 仅依赖 route-permission store 的 2 个 check 方法 */
4
6
  export interface GuardRoutePermissionStore {
5
7
  checkNeedGoToLoginPage: (route: RouteLocationNormalized) => boolean;
6
8
  checkNeedGoToAuthPage: (route: Pick<RouteLocationNormalized, "path">) => boolean;
7
9
  }
10
+ /** createGuard 入参 */
8
11
  export interface CreateGuardOptions {
9
12
  bridge: GuardBridgeSlice;
10
13
  useRoutePermission: () => GuardRoutePermissionStore;
@@ -1,8 +1,35 @@
1
1
  import { CSSProperties } from 'vue';
2
2
  import { CoreBridge } from '../bridge';
3
+ /**
4
+ * createAppStore 工厂依赖(#A 期,与 createUserStore deps 收敛单字段 `{ bridge }` 范式对齐)。
5
+ *
6
+ * 业务无泛型消费——layout/theme 配置全经 bridge 12 readonly 属性直读,业务 shape
7
+ * 不渗透 core;UserInfo / LoginParams 双泛型纯透传给入参 `CoreBridge` 签名
8
+ * (避免 app 侧具体类型 bridge 赋给 `CoreBridge<unknown,unknown>` 时的逆变位置
9
+ * 类型冲突,与 createUserStore 范式对齐),core setup 内 [MUST NOT] 消费双泛型字段。
10
+ * #C 期:删第 3 泛型 RefreshTokenParams 透传(bridge 签名已删第 3 泛型)。
11
+ */
3
12
  export interface CreateAppStoreDeps<UserInfo = unknown, LoginParams = unknown> {
13
+ /** app 侧 bridge 单例(注入而非 core 持单例,守规则 8;layout/theme 配置全经此读) */
4
14
  bridge: CoreBridge<UserInfo, LoginParams>;
5
15
  }
16
+ /**
17
+ * app store 工厂下沉 core。
18
+ *
19
+ * 返回 `defineStore("APP", setup)` 结果(store id 保持 `"APP"`;core 工厂无状态,
20
+ * store 实例由 app 侧 pinia 管理,规则 8)。
21
+ *
22
+ * 主题架构反转(不再 1:1 镜像原 app store dark 状态机):dark/风格切换真相全移交
23
+ * bridge(`bridge.themeIsDark` / `bridge.theme.setStyle/setDark`)——
24
+ * - `isDarkTheme` 改读 `bridge.themeIsDark`(store 不再持 ref 真相);
25
+ * - `changeIsDarkTheme` 转发 `bridge.theme.setDark`(旧消费方兼容兜底);
26
+ * - 退役 store `watch isDarkTheme → className`(由挂值 composable toggle `.dark`);
27
+ * - 退役 store dark 持久化(`pick:["isDarkTheme"]`)——bridge 持久化 `{themeStyle,themeIsDark}`。
28
+ * layout/route/sidebar 等非主题运行时行为保持不变。
29
+ *
30
+ * @example
31
+ * export const useAppStore = createAppStore({ bridge: appBridge });
32
+ */
6
33
  export declare function createAppStore<UserInfo = unknown, LoginParams = unknown>(deps: CreateAppStoreDeps<UserInfo, LoginParams>): import('pinia').StoreDefinition<"APP", Pick<{
7
34
  name: import('vue').ComputedRef<string>;
8
35
  isDarkTheme: import('vue').ComputedRef<boolean>;
@@ -1,19 +1,72 @@
1
1
  import { RouteLocationNormalizedLoaded } from 'vue-router';
2
2
  import { CoreBridge } from '../bridge';
3
+ /**
4
+ * createRoutePermissionStore 工厂依赖(#B 期;与 createUserStore / createAppStore
5
+ * deps 范式对齐——bridge 经 init 注入,业务 hook / 业务路径常量经 deps 注入)。
6
+ *
7
+ * `useUserStore` 采用 hook 注入(方案 A)——业务层传入 createUserStore 实例化结果,
8
+ * core setup 内调 `useUserStore()` 取响应式 store 实例。方案 B(store 实例注入)
9
+ * 在 createRoutePermissionStore 模块求值期调 hook 会 throw "pinia not active",故采纳 A。
10
+ * Hook 返回的 store 实例形状用结构最小约束 `{ isLogin, havePermissionByPath, noApiLogout }`
11
+ * 表达——避免 core 反向耦合 createUserStore 三泛型 + 与 createUserStore 返回的具体
12
+ * store 结构自动结构兼容(业务侧零摩擦传入 useUserStore)。
13
+ *
14
+ * `paths` 4 业务路径经 deps 注入而非 bridge schema——业务路径非通用 layout config,
15
+ * 不内化到 bridge(产研统筹勘察结论;保 bridge schema 0 扩张)。
16
+ *
17
+ * 双泛型 `<UserInfo, LoginParams>` 纯透传给入参 `CoreBridge` 签名(避免 app 侧
18
+ * 具体类型 bridge 赋给 `CoreBridge<unknown,unknown>` 时的逆变位置类型冲突,
19
+ * 与 createUserStore / createAppStore 范式对齐),core setup 内 [MUST NOT] 消费双泛型字段。
20
+ * #C 期:删第 3 泛型 RefreshTokenParams 透传(bridge 签名已删第 3 泛型)。
21
+ */
3
22
  export interface CreateRoutePermissionStoreDeps<UserInfo = unknown, LoginParams = unknown> {
23
+ /** app 侧 bridge 单例(注入而非 core 持单例,守规则 8;APP_ROUTER_META_DEFAULT_CONFIG 经此直读 + register goToLogin 经此注册) */
4
24
  bridge: CoreBridge<UserInfo, LoginParams>;
25
+ /**
26
+ * 业务侧 createUserStore 实例化结果(hook 形态)。
27
+ * core setup 内调 `useUserStore()` 取响应式 store 实例;本字段仅约束最小消费面,
28
+ * [MUST NOT] 扩展为全 user store API surface(保 core 对 UserInfo shape 不透明)。
29
+ */
5
30
  useUserStore: () => {
6
31
  isLogin: boolean;
7
32
  havePermissionByPath: (path: string) => boolean;
8
33
  noApiLogout: () => void;
9
34
  };
35
+ /**
36
+ * 4 业务路径常量(业务路径非通用 layout config,[MUST NOT] 内化到 bridge schema)。
37
+ * core 不知具体路径值,经 deps 注入;业务层在 packages/app/src/router/config.ts 维护。
38
+ */
10
39
  paths: {
40
+ /** 登录路径 */
11
41
  login: string;
42
+ /** 无权限路径 */
12
43
  noPermission: string;
44
+ /** 登录免检路径列表 */
13
45
  loginNoCheck: string[];
46
+ /** 权限免检路径列表 */
14
47
  authNoCheck: string[];
15
48
  };
16
49
  }
50
+ /**
51
+ * 路由权限 store 泛型工厂下沉 core。
52
+ *
53
+ * 返回 `defineStore("ROUTE_PERMISSION", setup)` 结果(store id 保持 `"ROUTE_PERMISSION"`;
54
+ * core 工厂无状态,store 实例由 app 侧 pinia 管理,规则 8)。setup 内 1:1 镜像原
55
+ * `packages/app/src/store/router-permission.ts` 全部 139 行运行时行为
56
+ * (checkRouteNeedLogin / checkNeedGoToLoginPage / needGoToLoginPage /
57
+ * checkNeedGoToAuthPage / needGoToAuthPage / goToLoginPage / register goToLogin /
58
+ * 2 watch redirect),[MUST NOT] 重构 / 精简 / 调整顺序。
59
+ *
60
+ * `bridge.APP_ROUTER_META_DEFAULT_CONFIG` 直读取代原 `from "@/config"` import;
61
+ * `getRoutePermissionKey` 走 `@/utils` 复用。
62
+ *
63
+ * @example
64
+ * export const useRoutePermission = createRoutePermissionStore({
65
+ * bridge: appBridge,
66
+ * useUserStore,
67
+ * paths: { login: loginPath, noPermission: noPermissionPath, loginNoCheck: loginNoCheckPath, authNoCheck: authNoCheckPath },
68
+ * });
69
+ */
17
70
  export declare function createRoutePermissionStore<UserInfo = unknown, LoginParams = unknown>(deps: CreateRoutePermissionStoreDeps<UserInfo, LoginParams>): import('pinia').StoreDefinition<"ROUTE_PERMISSION", Pick<{
18
71
  checkNeedGoToAuthPage: (routeInfo: Pick<RouteLocationNormalizedLoaded, "path">) => boolean;
19
72
  checkNeedGoToLoginPage: (routeInfo: RouteLocationNormalizedLoaded) => boolean;
@@ -1,9 +1,33 @@
1
1
  import { ComputedRef } from 'vue';
2
2
  import { CoreBridge } from '../bridge';
3
3
  import { RoutePermission } from '../types';
4
+ /**
5
+ * createUserStore 工厂依赖(v3 终锁 Δ1:deps 收敛单字段 `{ bridge }`)。
6
+ *
7
+ * 业务类型 shape 经泛型 `<UserInfo, LoginParams>` 注入(core 不锁 shape,规则 8);
8
+ * 运行时配置 + 注入面全部经 `bridge`——`getAppConfig` / `getRoutes` / 4 业务 api /
9
+ * `getUserInfoInitFn()`(用户信息空保底工厂,替代 0fd94cc `userInfoInit` deps 字段)。
10
+ *
11
+ * 第一宪法:token / refreshToken / permission 三字段经 `bridge.userInfoAccess.<字段>`
12
+ * 业务注入访问器读写(纯函数 get/set,core 零字面字段名耦合,业务 UserInfo shape 自由)。
13
+ */
4
14
  export interface CreateUserStoreDeps<UserInfo, LoginParams = unknown> {
15
+ /** app 侧 bridge 单例(注入而非 core 持单例,守规则 8;getUserInfoInitFn 经 bridge.init 注入,本工厂经 bridge.getUserInfoInitFn() 读) */
5
16
  bridge: CoreBridge<UserInfo, LoginParams>;
6
17
  }
18
+ /**
19
+ * 用户 store 泛型工厂下沉 core。
20
+ *
21
+ * 返回 `defineStore("USER", setup)` 结果(store id 保持 `"USER"`;core 工厂
22
+ * 无状态,store 实例由 app 侧 pinia 管理,规则 8)。setup 内 1:1 镜像原
23
+ * `packages/app/src/store/user.ts` 全部运行时行为(actions / computed / watch /
24
+ * return / 路由权限计算),[MUST NOT] 重构 / 精简 / 调整顺序。
25
+ *
26
+ * @example
27
+ * export const useUserStore = createUserStore<LoginAccountInfo, AccountLoginParams>({
28
+ * bridge: appBridge,
29
+ * });
30
+ */
7
31
  export declare function createUserStore<UserInfo, LoginParams = unknown>(deps: CreateUserStoreDeps<UserInfo, LoginParams>): import('pinia').StoreDefinition<"USER", Pick<{
8
32
  userInfo: ComputedRef<UserInfo>;
9
33
  token: ComputedRef<string>;
@@ -1,3 +1,11 @@
1
+ /**
2
+ * 字符串点路径转嵌套对象类型
3
+ * ---
4
+ * @example
5
+ * DotToObject<"page.page", number> -> { page: { page: number } }
6
+ * DotToObject<"items", T[]> -> { items: T[] }
7
+ * DotToObject<"a.b.c", string> -> { a: { b: { c: string } } }
8
+ */
1
9
  export type DotToObject<P extends string, V> = P extends `${infer Head}.${infer Tail}` ? {
2
10
  [K in Head]: DotToObject<Tail, V>;
3
11
  } : {
@@ -1,48 +1,93 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
2
  import { DefineComponent } from 'vue';
3
+ /** 路由权限配置 */
3
4
  export type RoutePermission = Partial<{
5
+ /** 是否需要登录 */
4
6
  login: boolean;
7
+ /**
8
+ * 权限key
9
+ * 若为number 期望!=0
10
+ * 若为string 期望!=""
11
+ */
5
12
  key: number | string;
13
+ /** 权限key使用路径 */
6
14
  keyUsePath: boolean;
15
+ /** 权限编辑时是否展示 默认配置权限key就会展示 */
7
16
  editShow: boolean;
8
17
  }>;
18
+ /**
19
+ * 路由 meta 扩展形状(与 app 端 vue-router declaration merging 对齐)
20
+ * ---
21
+ * core 不做全局 declaration merging,仅作 core 内部类型自洽用;
22
+ * app 端仍通过自身 router-meta.d.ts 做 vue-router declaration merging,获得 vue-router RouteMeta 的扩展类型
23
+ */
9
24
  export interface AppRouteMeta {
25
+ /** 页面名称 */
10
26
  title: string;
27
+ /** 是否缓存 */
11
28
  keepAlive?: boolean;
29
+ /** 是否重定向到第一个有权限的子路由 */
12
30
  redirectToFirstChildRoute?: boolean;
31
+ /** 页面布局 */
13
32
  layout?: Partial<{
14
33
  header: boolean;
15
34
  sidebar: boolean;
35
+ /** 右侧 aside 补充区显隐(additive;默认 false,仅自定义 shell 渲染) */
16
36
  aside: boolean;
17
37
  footer: boolean;
18
38
  breadcrumb: boolean;
19
39
  bodyShimPadding: number;
20
40
  }>;
41
+ /** 菜单 */
21
42
  menu?: Partial<{
22
43
  show: boolean;
23
44
  sort: number;
45
+ /** 图标 (element-plus 等图标实例的 DefineComponent 签名差异较大,这里用 any 兼容) */
24
46
  icon: any;
25
47
  }>;
48
+ /** 权限 */
26
49
  permission?: RoutePermission;
27
50
  }
51
+ /** 获取路由权限key入参 */
28
52
  export interface GetRoutePermissionParams {
53
+ /** 路由路径 */
29
54
  path: string;
55
+ /** 权限配置 */
30
56
  permission: RoutePermission | undefined;
31
57
  }
58
+ /** 路由元信息解析raw */
32
59
  export interface RouteMetaResolveRaw {
60
+ /** 路由地址 */
33
61
  path: string;
62
+ /** 页面名称 */
34
63
  title: string;
64
+ /** 路由级别 */
35
65
  routeLevel: number;
66
+ /**
67
+ * 是否重定向到第一个有权限的子路由
68
+ * 详见 RouteMeta.redirectToFirstChildRoute
69
+ */
36
70
  redirectToFirstChildRoute: boolean;
71
+ /** 是否在菜单展示 */
37
72
  menuShow: boolean;
73
+ /** 菜单icon */
38
74
  menuIcon?: DefineComponent;
75
+ /** 菜单排序 */
39
76
  menuSort: number;
77
+ /** 子路由原始配置 */
40
78
  childrenRaw: RouteRecordRaw[];
79
+ /** 子路由元信息解析raw */
41
80
  children: RouteMetaResolveRaw[];
81
+ /** 父路由地址 */
42
82
  parentPath: string;
83
+ /** 父路由地址列表 */
43
84
  parentPathList: string[];
85
+ /** 权限key */
44
86
  permissionKey?: string | number;
87
+ /** 是否检测权限 */
45
88
  checkPermission: boolean;
89
+ /** (配置权限的前提下)权限编辑时是否展示 */
46
90
  permissionEditShow: boolean;
91
+ /** 是否需要登录 */
47
92
  needLogin: boolean;
48
93
  }
@@ -1 +1,8 @@
1
+ /**
2
+ * 联合类型转交叉类型
3
+ * ---
4
+ * 用于多个 DotToObject 结果合并:
5
+ * { page: { page: number } } | { page: { pageSize: number } }
6
+ * -> { page: { page: number; pageSize: number } }
7
+ */
1
8
  export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;