smart-admin-web 10.14.0 → 10.20.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 (538) hide show
  1. package/README.md +6 -6
  2. package/dist/api/index.d.ts +41 -2
  3. package/dist/api/index.js +36 -15
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +418 -6
  6. package/dist/assets/icons/ph-subset.json.js +7 -7
  7. package/dist/assets/smart-logo.svg.js +5 -0
  8. package/dist/assets/smart-logo.svg.js.map +1 -0
  9. package/dist/components/AppIcon.vue.js +9 -9
  10. package/dist/components/AppIcon.vue.js.map +1 -1
  11. package/dist/components/AppWatermark.vue.d.ts +14 -0
  12. package/dist/components/AppWatermark.vue.js +38 -0
  13. package/dist/components/AppWatermark.vue.js.map +1 -0
  14. package/dist/components/AppWatermark2.vue.js +5 -0
  15. package/dist/components/AppWatermark2.vue.js.map +1 -0
  16. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  17. package/dist/components/Chart/echarts.js +15 -20
  18. package/dist/components/Chart/echarts.js.map +1 -1
  19. package/dist/components/CronEditor/index.vue.js +1 -1
  20. package/dist/components/CronEditor/index2.vue.js +2 -1
  21. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  22. package/dist/components/DetailPage/index.vue.js +2 -2
  23. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  24. package/dist/components/DictTag/index.vue.js.map +1 -1
  25. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  26. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  27. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  28. package/dist/components/FormContainer/index.vue.js +91 -56
  29. package/dist/components/FormContainer/index.vue.js.map +1 -1
  30. package/dist/components/ImportWizard/index.vue.js +1 -1
  31. package/dist/components/ImportWizard/index2.vue.js +44 -41
  32. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  33. package/dist/components/MenuSearch.vue.js +2 -2
  34. package/dist/components/MenuSearch2.vue.js +19 -18
  35. package/dist/components/MenuSearch2.vue.js.map +1 -1
  36. package/dist/components/PasswordStrength/index.vue.js +2 -2
  37. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  38. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  39. package/dist/components/SmartLogo.vue.d.ts +3 -0
  40. package/dist/components/SmartLogo.vue.js +1 -1
  41. package/dist/components/SmartLogo2.vue.js +22 -64
  42. package/dist/components/SmartLogo2.vue.js.map +1 -1
  43. package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
  44. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  45. package/dist/components/TableTotal/index2.vue.js +16 -0
  46. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  47. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  48. package/dist/components/UserPicker/index.vue.js +2 -2
  49. package/dist/components/UserPicker/index2.vue.js +176 -117
  50. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  51. package/dist/composables/useBatchDelete.js.map +1 -1
  52. package/dist/composables/useLayoutMenu.js +17 -16
  53. package/dist/composables/useLayoutMenu.js.map +1 -1
  54. package/dist/composables/useLoginHero.d.ts +2 -0
  55. package/dist/composables/useLoginHero.js +22 -0
  56. package/dist/composables/useLoginHero.js.map +1 -0
  57. package/dist/composables/useModule.js +39 -29
  58. package/dist/composables/useModule.js.map +1 -1
  59. package/dist/composables/usePageTitle.js +16 -14
  60. package/dist/composables/usePageTitle.js.map +1 -1
  61. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  62. package/dist/composables/useShellBreakpoint.js +37 -0
  63. package/dist/composables/useShellBreakpoint.js.map +1 -0
  64. package/dist/composables/useSite.d.ts +20 -0
  65. package/dist/composables/useSite.js +18 -13
  66. package/dist/composables/useSite.js.map +1 -1
  67. package/dist/composables/useTabTitle.js.map +1 -1
  68. package/dist/composables/useTableTitle.d.ts +6 -0
  69. package/dist/composables/useTableTitle.js +11 -0
  70. package/dist/composables/useTableTitle.js.map +1 -0
  71. package/dist/composables/useTableZoom.d.ts +5 -0
  72. package/dist/composables/useTableZoom.js.map +1 -1
  73. package/dist/composables/useTheme.d.ts +2 -2
  74. package/dist/composables/useTheme.js +23 -20
  75. package/dist/composables/useTheme.js.map +1 -1
  76. package/dist/createSmartAdmin.d.ts +12 -2
  77. package/dist/createSmartAdmin.js +72 -60
  78. package/dist/createSmartAdmin.js.map +1 -1
  79. package/dist/index.d.ts +5 -2
  80. package/dist/index.js +223 -208
  81. package/dist/index.js.map +1 -1
  82. package/dist/layouts/AccentPicker.vue.js +8 -0
  83. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  84. package/dist/layouts/AccentPicker2.vue.js +131 -0
  85. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  86. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  87. package/dist/layouts/AppHeader.vue.js +2 -2
  88. package/dist/layouts/AppHeader2.vue.js +317 -235
  89. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  90. package/dist/layouts/NoticeBell.vue.js +2 -2
  91. package/dist/layouts/NoticeBell2.vue.js +1 -1
  92. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  93. package/dist/layouts/PersonalLayout.vue.js +2 -2
  94. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  95. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  96. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  97. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  98. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  99. package/dist/layouts/TabsBar.vue.js +2 -2
  100. package/dist/layouts/TabsBar2.vue.js +97 -69
  101. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  102. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  103. package/dist/layouts/components/SideNav.vue.js +1 -1
  104. package/dist/layouts/components/SideNav2.vue.js +54 -26
  105. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  106. package/dist/layouts/default.vue.js +1 -1
  107. package/dist/layouts/default2.vue.js +170 -140
  108. package/dist/layouts/default2.vue.js.map +1 -1
  109. package/dist/lib/favicon.d.ts +1 -0
  110. package/dist/lib/favicon.js +12 -0
  111. package/dist/lib/favicon.js.map +1 -0
  112. package/dist/lib/loginHero.d.ts +16 -0
  113. package/dist/lib/loginHero.js +33 -0
  114. package/dist/lib/loginHero.js.map +1 -0
  115. package/dist/lib/logoCrop.d.ts +25 -0
  116. package/dist/lib/logoCrop.js +22 -0
  117. package/dist/lib/logoCrop.js.map +1 -0
  118. package/dist/lib/runtime.d.ts +2 -0
  119. package/dist/lib/runtime.js +1 -1
  120. package/dist/lib/runtime.js.map +1 -1
  121. package/dist/lib/securityRules.d.ts +26 -0
  122. package/dist/lib/securityRules.js +86 -0
  123. package/dist/lib/securityRules.js.map +1 -0
  124. package/dist/lib/watermark.d.ts +110 -0
  125. package/dist/lib/watermark.js +151 -0
  126. package/dist/lib/watermark.js.map +1 -0
  127. package/dist/locales/en-US.d.ts +462 -42
  128. package/dist/locales/en-US.js +491 -78
  129. package/dist/locales/en-US.js.map +1 -1
  130. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  131. package/dist/locales/kernelMenuTitles.js +128 -0
  132. package/dist/locales/kernelMenuTitles.js.map +1 -0
  133. package/dist/locales/menuTitle.d.ts +3 -0
  134. package/dist/locales/menuTitle.js +14 -12
  135. package/dist/locales/menuTitle.js.map +1 -1
  136. package/dist/locales/zh-CN.d.ts +462 -42
  137. package/dist/locales/zh-CN.js +490 -81
  138. package/dist/locales/zh-CN.js.map +1 -1
  139. package/dist/router/index.js +41 -32
  140. package/dist/router/index.js.map +1 -1
  141. package/dist/router/namedPage.d.ts +4 -0
  142. package/dist/router/namedPage.js +7 -7
  143. package/dist/router/namedPage.js.map +1 -1
  144. package/dist/router/viewRegistry.js +12 -12
  145. package/dist/router/viewRegistry.js.map +1 -1
  146. package/dist/stores/app.d.ts +0 -12
  147. package/dist/stores/app.js +11 -12
  148. package/dist/stores/app.js.map +1 -1
  149. package/dist/stores/tabs.js.map +1 -1
  150. package/dist/stores/user.d.ts +10 -0
  151. package/dist/stores/user.js.map +1 -1
  152. package/dist/style.css +1 -1
  153. package/dist/theme/accentTokens.d.ts +27 -0
  154. package/dist/theme/accentTokens.js +54 -0
  155. package/dist/theme/accentTokens.js.map +1 -0
  156. package/dist/theme/accents.d.ts +21 -1
  157. package/dist/theme/accents.js +11 -2
  158. package/dist/theme/accents.js.map +1 -1
  159. package/dist/theme/mix.d.ts +58 -7
  160. package/dist/theme/mix.js +115 -30
  161. package/dist/theme/mix.js.map +1 -1
  162. package/dist/theme/naive-theme.d.ts +5 -2
  163. package/dist/theme/naive-theme.js +405 -75
  164. package/dist/theme/naive-theme.js.map +1 -1
  165. package/dist/utils/jwt.d.ts +8 -0
  166. package/dist/utils/jwt.js +14 -0
  167. package/dist/utils/jwt.js.map +1 -0
  168. package/dist/utils/menuIcon.d.ts +2 -0
  169. package/dist/utils/menuIcon.js +8 -0
  170. package/dist/utils/menuIcon.js.map +1 -0
  171. package/dist/utils/oauthBrand.d.ts +34 -9
  172. package/dist/utils/oauthBrand.js +70 -74
  173. package/dist/utils/oauthBrand.js.map +1 -1
  174. package/dist/utils/tableFilter.d.ts +88 -0
  175. package/dist/utils/tableFilter.js +116 -0
  176. package/dist/utils/tableFilter.js.map +1 -0
  177. package/dist/utils/tableToolbar.d.ts +18 -0
  178. package/dist/utils/tableToolbar.js +11 -0
  179. package/dist/utils/tableToolbar.js.map +1 -0
  180. package/dist/utils/treeFilter.d.ts +20 -0
  181. package/dist/utils/treeFilter.js +24 -0
  182. package/dist/utils/treeFilter.js.map +1 -0
  183. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  184. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  185. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  186. package/dist/views/dashboard/biz.vue.js +1 -1
  187. package/dist/views/dashboard/biz2.vue.js +310 -257
  188. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  189. package/dist/views/dashboard/workbench.vue.js +2 -2
  190. package/dist/views/dashboard/workbench2.vue.js +141 -155
  191. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  192. package/dist/views/embed/iframe.vue.js +2 -2
  193. package/dist/views/embed/iframe2.vue.js +22 -15
  194. package/dist/views/embed/iframe2.vue.js.map +1 -1
  195. package/dist/views/error/404.vue.js +2 -2
  196. package/dist/views/error/4042.vue.js +33 -24
  197. package/dist/views/error/4042.vue.js.map +1 -1
  198. package/dist/views/error/BootError.vue.js +1 -1
  199. package/dist/views/error/BootError2.vue.js +59 -48
  200. package/dist/views/error/BootError2.vue.js.map +1 -1
  201. package/dist/views/error/MissingRoute.vue.js +2 -2
  202. package/dist/views/error/MissingRoute2.vue.js +34 -15
  203. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  204. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  205. package/dist/views/login/LoginForm.vue.js +2 -2
  206. package/dist/views/login/LoginForm2.vue.js +580 -488
  207. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  208. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  209. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  210. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  211. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  212. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  213. package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
  214. package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
  215. package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
  216. package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
  217. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
  218. package/dist/views/login/index.vue.js +1 -1
  219. package/dist/views/login/index2.vue.js +141 -71
  220. package/dist/views/login/index2.vue.js.map +1 -1
  221. package/dist/views/login/layout.d.ts +11 -0
  222. package/dist/views/login/layout.js +27 -0
  223. package/dist/views/login/layout.js.map +1 -0
  224. package/dist/views/mfa/index.vue.js +2 -2
  225. package/dist/views/mfa/index2.vue.js +367 -321
  226. package/dist/views/mfa/index2.vue.js.map +1 -1
  227. package/dist/views/module/index.vue.js +2 -2
  228. package/dist/views/module/index2.vue.js +132 -99
  229. package/dist/views/module/index2.vue.js.map +1 -1
  230. package/dist/views/oauth/callback.vue.js +2 -2
  231. package/dist/views/oauth/callback2.vue.js +65 -51
  232. package/dist/views/oauth/callback2.vue.js.map +1 -1
  233. package/dist/views/personal/bindings.vue.js +2 -2
  234. package/dist/views/personal/bindings2.vue.js +98 -94
  235. package/dist/views/personal/bindings2.vue.js.map +1 -1
  236. package/dist/views/personal/notice2.vue.js +103 -76
  237. package/dist/views/personal/notice2.vue.js.map +1 -1
  238. package/dist/views/personal/password2.vue.js +47 -40
  239. package/dist/views/personal/password2.vue.js.map +1 -1
  240. package/dist/views/personal/profile.vue.js +3 -3
  241. package/dist/views/personal/profile2.vue.js +24 -18
  242. package/dist/views/personal/profile2.vue.js.map +1 -1
  243. package/dist/views/personal/security.vue.js +2 -2
  244. package/dist/views/personal/security2.vue.js +65 -53
  245. package/dist/views/personal/security2.vue.js.map +1 -1
  246. package/dist/views/personal/sessions.vue.js +2 -2
  247. package/dist/views/personal/sessions2.vue.js +67 -62
  248. package/dist/views/personal/sessions2.vue.js.map +1 -1
  249. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  250. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  251. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  252. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  253. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  254. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  255. package/dist/views/system/ai-model/index.vue.js +2 -2
  256. package/dist/views/system/ai-model/index2.vue.js +99 -99
  257. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  258. package/dist/views/system/ai-model/presets.d.ts +1 -1
  259. package/dist/views/system/ai-model/presets.js +18 -18
  260. package/dist/views/system/ai-model/presets.js.map +1 -1
  261. package/dist/views/system/ai-usage/index.vue.js +2 -2
  262. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  263. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  264. package/dist/views/system/api-docs/index.vue.js +5 -2
  265. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  266. package/dist/views/system/api-docs/index2.vue.js +92 -42
  267. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  268. package/dist/views/system/cache/index.vue.js +2 -2
  269. package/dist/views/system/cache/index2.vue.js +74 -80
  270. package/dist/views/system/cache/index2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/AdminMock.vue.js +8 -0
  272. package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
  273. package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
  274. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
  275. package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
  276. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
  277. package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
  278. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
  279. package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
  280. package/dist/views/system/config/components/BrandSection.vue.js +8 -0
  281. package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
  282. package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
  283. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
  284. package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
  285. package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
  286. package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
  287. package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
  288. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
  289. package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
  290. package/dist/views/system/config/components/CfgRow.vue.js +9 -0
  291. package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
  292. package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
  293. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
  294. package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
  295. package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
  296. package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
  297. package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
  298. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
  299. package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
  300. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
  301. package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
  302. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  303. package/dist/views/system/config/components/JobSection.vue.js +8 -0
  304. package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
  305. package/dist/views/system/config/components/JobSection2.vue.js +140 -0
  306. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
  307. package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
  308. package/dist/views/system/config/components/LoginMock.vue.js +8 -0
  309. package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
  310. package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
  311. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
  312. package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
  313. package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
  314. package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
  315. package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
  316. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
  317. package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
  318. package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
  319. package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
  320. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
  321. package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
  322. package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
  323. package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
  324. package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
  325. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
  326. package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
  327. package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
  328. package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
  329. package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
  330. package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
  331. package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
  332. package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
  333. package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
  334. package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
  335. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
  336. package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
  337. package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
  338. package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
  339. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
  340. package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
  341. package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
  342. package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
  343. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
  344. package/dist/views/system/config/components/SigninSection.vue.js +8 -0
  345. package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
  346. package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
  347. package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
  348. package/dist/views/system/config/components/UploadSection.vue.js +8 -0
  349. package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
  350. package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
  351. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
  352. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  353. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  354. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  355. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  356. package/dist/views/system/config/draft.d.ts +148 -0
  357. package/dist/views/system/config/draft.js +170 -0
  358. package/dist/views/system/config/draft.js.map +1 -0
  359. package/dist/views/system/config/flash.d.ts +2 -0
  360. package/dist/views/system/config/flash.js +9 -0
  361. package/dist/views/system/config/flash.js.map +1 -0
  362. package/dist/views/system/config/groups.d.ts +38 -7
  363. package/dist/views/system/config/groups.js +104 -14
  364. package/dist/views/system/config/groups.js.map +1 -1
  365. package/dist/views/system/config/index.vue.js +6 -2
  366. package/dist/views/system/config/index.vue.js.map +1 -1
  367. package/dist/views/system/config/index2.vue.js +201 -111
  368. package/dist/views/system/config/index2.vue.js.map +1 -1
  369. package/dist/views/system/config/layoutMode.d.ts +23 -0
  370. package/dist/views/system/config/layoutMode.js +28 -0
  371. package/dist/views/system/config/layoutMode.js.map +1 -0
  372. package/dist/views/system/config/providerForm.d.ts +33 -0
  373. package/dist/views/system/config/providerForm.js +63 -0
  374. package/dist/views/system/config/providerForm.js.map +1 -0
  375. package/dist/views/system/dict/index.vue.js +2 -2
  376. package/dist/views/system/dict/index2.vue.js +471 -366
  377. package/dist/views/system/dict/index2.vue.js.map +1 -1
  378. package/dist/views/system/file/index2.vue.js +91 -76
  379. package/dist/views/system/file/index2.vue.js.map +1 -1
  380. package/dist/views/system/job/index.vue.js +3 -3
  381. package/dist/views/system/job/index2.vue.js +897 -828
  382. package/dist/views/system/job/index2.vue.js.map +1 -1
  383. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  384. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  385. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  386. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  387. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  388. package/dist/views/system/job-log/index.vue.js +2 -2
  389. package/dist/views/system/job-log/index2.vue.js +193 -207
  390. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  391. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  392. package/dist/views/system/job-log/runStatus.js +26 -0
  393. package/dist/views/system/job-log/runStatus.js.map +1 -0
  394. package/dist/views/system/job-monitor/index.vue.js +2 -2
  395. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  396. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  397. package/dist/views/system/log/exception/index.vue.js +2 -2
  398. package/dist/views/system/log/exception/index2.vue.js +135 -96
  399. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  400. package/dist/views/system/log/login/index2.vue.js +62 -41
  401. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  402. package/dist/views/system/log/op/index.vue.js +2 -2
  403. package/dist/views/system/log/op/index2.vue.js +200 -162
  404. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  405. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  406. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  407. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  408. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  409. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  410. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  411. package/dist/views/system/menu/index.vue.js +1 -1
  412. package/dist/views/system/menu/index2.vue.js +216 -183
  413. package/dist/views/system/menu/index2.vue.js.map +1 -1
  414. package/dist/views/system/module/index.vue.js +1 -1
  415. package/dist/views/system/module/index2.vue.js +177 -144
  416. package/dist/views/system/module/index2.vue.js.map +1 -1
  417. package/dist/views/system/monitor/index.vue.js +2 -2
  418. package/dist/views/system/monitor/index2.vue.js +134 -149
  419. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  420. package/dist/views/system/notice/index.vue.js +1 -1
  421. package/dist/views/system/notice/index2.vue.js +209 -181
  422. package/dist/views/system/notice/index2.vue.js.map +1 -1
  423. package/dist/views/system/org/index.vue.js +1 -1
  424. package/dist/views/system/org/index2.vue.js +278 -248
  425. package/dist/views/system/org/index2.vue.js.map +1 -1
  426. package/dist/views/system/position/index.vue.js +5 -2
  427. package/dist/views/system/position/index.vue.js.map +1 -1
  428. package/dist/views/system/position/index2.vue.js +128 -92
  429. package/dist/views/system/position/index2.vue.js.map +1 -1
  430. package/dist/views/system/recycle/index.vue.js +2 -2
  431. package/dist/views/system/recycle/index2.vue.js +90 -67
  432. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  433. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  434. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  435. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  436. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  437. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  438. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  439. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  440. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  441. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  442. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  443. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  444. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  445. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  446. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  447. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  448. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  449. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  450. package/dist/views/system/role/index.vue.js +5 -2
  451. package/dist/views/system/role/index.vue.js.map +1 -1
  452. package/dist/views/system/role/index2.vue.js +181 -165
  453. package/dist/views/system/role/index2.vue.js.map +1 -1
  454. package/dist/views/system/session/index2.vue.js +75 -49
  455. package/dist/views/system/session/index2.vue.js.map +1 -1
  456. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  457. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  458. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  459. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  460. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  461. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  462. package/dist/views/system/user/index.vue.js +2 -2
  463. package/dist/views/system/user/index2.vue.js +362 -275
  464. package/dist/views/system/user/index2.vue.js.map +1 -1
  465. package/package.json +6 -8
  466. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  467. package/dist/components/SelectTable/index2.vue.js +0 -256
  468. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  469. package/dist/composables/useTableRowSort.d.ts +0 -20
  470. package/dist/composables/useTableRowSort.js +0 -59
  471. package/dist/composables/useTableRowSort.js.map +0 -1
  472. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  473. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  474. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  475. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  476. package/dist/layouts/SettingRow.vue.js +0 -8
  477. package/dist/layouts/SettingRow.vue.js.map +0 -1
  478. package/dist/layouts/SettingRow2.vue.js +0 -23
  479. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  480. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  481. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  482. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  483. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  484. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  485. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  486. package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
  487. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  488. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  489. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  490. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  491. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  492. package/dist/views/login/skins.d.ts +0 -8
  493. package/dist/views/login/skins.js +0 -13
  494. package/dist/views/login/skins.js.map +0 -1
  495. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
  496. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
  497. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
  498. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
  499. package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
  500. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
  501. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
  502. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
  503. package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
  504. package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
  505. package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
  506. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
  507. package/dist/views/system/config/components/JobConfig.vue.js +0 -5
  508. package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
  509. package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
  510. package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
  511. package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
  512. package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
  513. package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
  514. package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
  515. package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
  516. package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
  517. package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
  518. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
  519. package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
  520. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
  521. package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
  522. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
  523. package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
  524. package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
  525. package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
  526. package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
  527. package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
  528. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  529. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  530. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/AdminMock.vue.d.ts} +0 -0
  531. /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
  532. /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
  533. /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
  534. /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
  535. /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
  536. /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
  537. /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
  538. /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → WatermarkSection.vue.d.ts} +0 -0
@@ -1,27 +1,32 @@
1
1
  import { reactive as l } from "vue";
2
- import { configApi as r } from "../api/index.js";
3
- import { runtime as n } from "../lib/runtime.js";
4
- const i = l({
2
+ import { configApi as a } from "../api/index.js";
3
+ import { normalizeLoginHero as n } from "../lib/loginHero.js";
4
+ import { runtime as m } from "../lib/runtime.js";
5
+ import { normalizeWatermark as c, DEFAULT_WATERMARK as o } from "../lib/watermark.js";
6
+ const e = l({
5
7
  title: "SmartAdmin",
6
8
  subtitle: "",
7
9
  copyright: "",
8
10
  copyrightUrl: "",
9
11
  logo: "",
12
+ loginHero: {},
13
+ showFeatures: !0,
10
14
  captchaEnabled: !1,
11
- smsLoginEnabled: !1
15
+ smsLoginEnabled: !1,
16
+ watermark: { ...o, fields: [...o.fields] }
12
17
  });
13
- let e = null;
14
- function a(o = !1) {
15
- return e && !o || (e = r.siteInfo().then((t) => {
16
- t.title && (i.title = t.title), i.subtitle = t.subtitle ?? "", i.copyright = t.copyright ?? "", i.copyrightUrl = t.copyrightUrl ?? "", i.logo = t.logo ?? "", i.captchaEnabled = !!t.captchaEnabled, i.smsLoginEnabled = !!t.smsLoginEnabled;
18
+ let r = null;
19
+ function f(i = !1) {
20
+ return r && !i || (r = a.siteInfo().then((t) => {
21
+ t.title && (e.title = t.title), e.subtitle = t.subtitle ?? "", e.copyright = t.copyright ?? "", e.copyrightUrl = t.copyrightUrl ?? "", e.logo = t.logo ?? "", e.loginHero = n(t.loginHero), e.showFeatures = t.showFeatures !== !1, e.captchaEnabled = !!t.captchaEnabled, e.smsLoginEnabled = !!t.smsLoginEnabled, e.watermark = c(t.watermark);
17
22
  }).catch(() => {
18
- })), e;
23
+ })), r;
19
24
  }
20
- function f() {
21
- return { site: i, appVersion: n.version, loadSite: a };
25
+ function d() {
26
+ return { site: e, appVersion: m.version, loadSite: f };
22
27
  }
23
28
  export {
24
- a as loadSite,
25
- f as useSite
29
+ f as loadSite,
30
+ d as useSite
26
31
  };
27
32
  //# sourceMappingURL=useSite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSite.js","sources":["../../src/composables/useSite.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport { configApi } from '#/api'\nimport { runtime } from '#/lib/runtime'\n\n// 站点品牌信息(匿名 GET /sys/config/site 下发)。App.vue 启动、登录页各皮肤、登录后框架(侧栏/顶栏/水印)\n// 共用同一份响应式数据,只拉一次(模块级缓存);改配置保存后 loadSite(true) 强制重取即时生效。\nexport interface SiteInfo {\n title: string\n subtitle: string\n copyright: string\n copyrightUrl: string\n logo: string\n captchaEnabled: boolean\n smsLoginEnabled: boolean\n}\n\n// title 初值给内置名,防 siteInfo 到达前品牌词首帧空白;createSmartAdmin({ brand.title }) 会在挂载前改写它。\nconst site = reactive<SiteInfo>({\n title: 'SmartAdmin',\n subtitle: '',\n copyright: '',\n copyrightUrl: '',\n logo: '',\n captchaEnabled: false,\n smsLoginEnabled: false,\n})\n\nlet inflight: Promise<void> | null = null\n\nexport function loadSite(force = false): Promise<void> {\n if (inflight && !force) return inflight\n inflight = configApi\n .siteInfo()\n .then(s => {\n if (s.title) site.title = s.title\n site.subtitle = s.subtitle ?? ''\n site.copyright = s.copyright ?? ''\n site.copyrightUrl = s.copyrightUrl ?? ''\n site.logo = s.logo ?? ''\n site.captchaEnabled = !!s.captchaEnabled\n site.smsLoginEnabled = !!s.smsLoginEnabled\n })\n .catch(() => {\n // 拉取失败保留内置默认(title=SmartAdmin),不阻塞登录/渲染\n })\n return inflight\n}\n\n/** 版本号不走后端配置:默认是内核版本(库构建期常量),消费方经 createSmartAdmin({ version }) 换成应用版本。 */\nexport function useSite() {\n return { site, appVersion: runtime.version, loadSite }\n}\n"],"names":["site","reactive","inflight","loadSite","force","configApi","s","useSite","runtime"],"mappings":";;;AAiBA,MAAMA,IAAOC,EAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,CAAC;AAED,IAAIC,IAAiC;AAE9B,SAASC,EAASC,IAAQ,IAAsB;AACrD,SAAIF,KAAY,CAACE,MACjBF,IAAWG,EACR,SAAA,EACA,KAAK,CAAAC,MAAK;AACT,IAAIA,EAAE,UAAON,EAAK,QAAQM,EAAE,QAC5BN,EAAK,WAAWM,EAAE,YAAY,IAC9BN,EAAK,YAAYM,EAAE,aAAa,IAChCN,EAAK,eAAeM,EAAE,gBAAgB,IACtCN,EAAK,OAAOM,EAAE,QAAQ,IACtBN,EAAK,iBAAiB,CAAC,CAACM,EAAE,gBAC1BN,EAAK,kBAAkB,CAAC,CAACM,EAAE;AAAA,EAC7B,CAAC,EACA,MAAM,MAAM;AAAA,EAEb,CAAC,IACIJ;AACT;AAGO,SAASK,IAAU;AACxB,SAAO,EAAE,MAAAP,GAAM,YAAYQ,EAAQ,SAAS,UAAAL,EAAA;AAC9C;"}
1
+ {"version":3,"file":"useSite.js","sources":["../../src/composables/useSite.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport { configApi } from '#/api'\nimport { normalizeLoginHero, type LoginHeroCopy } from '#/lib/loginHero'\nimport { runtime } from '#/lib/runtime'\nimport { DEFAULT_WATERMARK, normalizeWatermark, type WatermarkSettings } from '#/lib/watermark'\n\n// 站点品牌信息(匿名 GET /sys/config/site 下发)。App.vue 启动、登录页各皮肤、登录后框架(侧栏/顶栏/水印)\n// 共用同一份响应式数据,只拉一次(模块级缓存);改配置保存后 loadSite(true) 强制重取即时生效。\nexport interface SiteInfo {\n title: string\n subtitle: string\n copyright: string\n copyrightUrl: string\n logo: string\n loginHero: Record<string, LoginHeroCopy>\n showFeatures: boolean\n captchaEnabled: boolean\n smsLoginEnabled: boolean\n /** 登录后页面的水印设置(只有版式;每个人印什么由壳层按登录用户拼) */\n watermark: WatermarkSettings\n}\n\n// title 初值给内置名,防 siteInfo 到达前品牌词首帧空白;createSmartAdmin({ brand.title }) 会在挂载前改写它。\nconst site = reactive<SiteInfo>({\n title: 'SmartAdmin',\n subtitle: '',\n copyright: '',\n copyrightUrl: '',\n logo: '',\n loginHero: {},\n showFeatures: true,\n captchaEnabled: false,\n smsLoginEnabled: false,\n watermark: { ...DEFAULT_WATERMARK, fields: [...DEFAULT_WATERMARK.fields] },\n})\n\nlet inflight: Promise<void> | null = null\n\nexport function loadSite(force = false): Promise<void> {\n if (inflight && !force) return inflight\n inflight = configApi\n .siteInfo()\n .then(s => {\n if (s.title) site.title = s.title\n site.subtitle = s.subtitle ?? ''\n site.copyright = s.copyright ?? ''\n site.copyrightUrl = s.copyrightUrl ?? ''\n site.logo = s.logo ?? ''\n site.loginHero = normalizeLoginHero(s.loginHero)\n site.showFeatures = s.showFeatures !== false\n site.captchaEnabled = !!s.captchaEnabled\n site.smsLoginEnabled = !!s.smsLoginEnabled\n site.watermark = normalizeWatermark(s.watermark)\n })\n .catch(() => {\n // 拉取失败保留内置默认(title=SmartAdmin),不阻塞登录/渲染\n })\n return inflight\n}\n\n/** 版本号不走后端配置:默认是内核版本(库构建期常量),消费方经 createSmartAdmin({ version }) 换成应用版本。 */\nexport function useSite() {\n return { site, appVersion: runtime.version, loadSite }\n}\n"],"names":["site","reactive","DEFAULT_WATERMARK","inflight","loadSite","force","configApi","s","normalizeLoginHero","normalizeWatermark","useSite","runtime"],"mappings":";;;;;AAuBA,MAAMA,IAAOC,EAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM;AAAA,EACN,WAAW,CAAA;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,WAAW,EAAE,GAAGC,GAAmB,QAAQ,CAAC,GAAGA,EAAkB,MAAM,EAAA;AACzE,CAAC;AAED,IAAIC,IAAiC;AAE9B,SAASC,EAASC,IAAQ,IAAsB;AACrD,SAAIF,KAAY,CAACE,MACjBF,IAAWG,EACR,SAAA,EACA,KAAK,CAAAC,MAAK;AACT,IAAIA,EAAE,UAAOP,EAAK,QAAQO,EAAE,QAC5BP,EAAK,WAAWO,EAAE,YAAY,IAC9BP,EAAK,YAAYO,EAAE,aAAa,IAChCP,EAAK,eAAeO,EAAE,gBAAgB,IACtCP,EAAK,OAAOO,EAAE,QAAQ,IACtBP,EAAK,YAAYQ,EAAmBD,EAAE,SAAS,GAC/CP,EAAK,eAAeO,EAAE,iBAAiB,IACvCP,EAAK,iBAAiB,CAAC,CAACO,EAAE,gBAC1BP,EAAK,kBAAkB,CAAC,CAACO,EAAE,iBAC3BP,EAAK,YAAYS,EAAmBF,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,MAAM,MAAM;AAAA,EAEb,CAAC,IACIJ;AACT;AAGO,SAASO,IAAU;AACxB,SAAO,EAAE,MAAAV,GAAM,YAAYW,EAAQ,SAAS,UAAAP,EAAA;AAC9C;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTabTitle.js","sources":["../../src/composables/useTabTitle.ts"],"sourcesContent":["import { useRoute } from 'vue-router'\nimport { useTabsStore } from '#/stores/tabs'\n\n// 详情页动态标签标题:数据加载后调用返回的 setter,把当前标签标题改成记录名(如「张三」「工单 #123」)。\n// 内部走 tabsStore.setTitle → 置 titleFixed,addTab 复访不再用静态 meta.title 覆盖它;标题随 tab 持久化,F5 无闪复原。\n// 就地态(列表页内切换详情)不要调用它:那时 route.path 是列表标签,改名会改错标签。\nexport function useTabTitle() {\n const route = useRoute()\n const tabs = useTabsStore()\n return (title: string) => tabs.setTitle(route.path, title)\n}\n"],"names":["useTabTitle","route","useRoute","tabs","useTabsStore","title"],"mappings":";;AAMO,SAASA,IAAc;AAC5B,QAAMC,IAAQC,EAAA,GACRC,IAAOC,EAAA;AACb,SAAO,CAACC,MAAkBF,EAAK,SAASF,EAAM,MAAMI,CAAK;AAC3D;"}
1
+ {"version":3,"file":"useTabTitle.js","sources":["../../src/composables/useTabTitle.ts"],"sourcesContent":["import { useRoute } from 'vue-router'\nimport { useTabsStore } from '#/stores/tabs'\n\n// 详情页动态标签标题:数据加载后调用返回的 setter,把当前标签标题改成记录名(如「张三」「工单 #123」)。\n// 内部走 tabsStore.setTitle → 置 titleFixed,addTab 复访时不会用静态 meta.title 覆盖它;标题随 tab 持久化,F5 无闪复原。\n// 就地态(列表页内切换详情)不要调用它:那时 route.path 是列表标签,改名会改错标签。\nexport function useTabTitle() {\n const route = useRoute()\n const tabs = useTabsStore()\n return (title: string) => tabs.setTitle(route.path, title)\n}\n"],"names":["useTabTitle","route","useRoute","tabs","useTabsStore","title"],"mappings":";;AAMO,SAASA,IAAc;AAC5B,QAAMC,IAAQC,EAAA,GACRC,IAAOC,EAAA;AACb,SAAO,CAACC,MAAkBF,EAAK,SAASF,EAAM,MAAMI,CAAK;AAC3D;"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 当前页面的菜单标题。表格工具栏不放标题,内核页面不调用它;保留给下游应用在页面自己需要标题文案时使用。
3
+ * 与侧栏 / 面包屑 / 多标签走同一个翻译入口,切语言即时生效。
4
+ * 同页多张表需要各自的标题时,用各自已有的 i18n 文案,不要共用这个值。
5
+ */
6
+ export declare function useTableTitle(): import('vue').ComputedRef<string>;
@@ -0,0 +1,11 @@
1
+ import { computed as e } from "vue";
2
+ import { useRoute as o } from "vue-router";
3
+ import { translateMenuTitle as r } from "../locales/menuTitle.js";
4
+ function n() {
5
+ const t = o();
6
+ return e(() => r(String(t.meta.title ?? ""), t.path));
7
+ }
8
+ export {
9
+ n as useTableTitle
10
+ };
11
+ //# sourceMappingURL=useTableTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableTitle.js","sources":["../../src/composables/useTableTitle.ts"],"sourcesContent":["import { computed } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { translateMenuTitle } from '#/locales/menuTitle'\n\n/**\n * 当前页面的菜单标题。表格工具栏不放标题,内核页面不调用它;保留给下游应用在页面自己需要标题文案时使用。\n * 与侧栏 / 面包屑 / 多标签走同一个翻译入口,切语言即时生效。\n * 同页多张表需要各自的标题时,用各自已有的 i18n 文案,不要共用这个值。\n */\nexport function useTableTitle() {\n const route = useRoute()\n return computed(() => translateMenuTitle(String(route.meta.title ?? ''), route.path))\n}\n"],"names":["useTableTitle","route","useRoute","computed","translateMenuTitle"],"mappings":";;;AASO,SAASA,IAAgB;AAC9B,QAAMC,IAAQC,EAAA;AACd,SAAOC,EAAS,MAAMC,EAAmB,OAAOH,EAAM,KAAK,SAAS,EAAE,GAAGA,EAAM,IAAI,CAAC;AACtF;"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @deprecated smart-naive-table 3.0 起 SmartTable 自带放大按钮:`:toolbar="{ maximize: true }"`
3
+ * (Teleport 到 body、盖住侧栏与顶栏、不调用浏览器全屏 API,与本实现是同一思路)。
4
+ * 本 composable 与 TableZoomButton 没有内核页面在用,仅为已依赖它们的下游应用保留,下一个 .NET 大版本删除。
5
+ */
1
6
  export declare function useTableZoom(): {
2
7
  zoomed: import('vue').Ref<boolean, boolean>;
3
8
  toggle: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useTableZoom.js","sources":["../../src/composables/useTableZoom.ts"],"sourcesContent":["// 表格「放大」:把某块区域临时铺满视口,给笔记本等窄屏看宽表用。\n//\n// 刻意不用 Fullscreen API(VueUse 的 useFullscreen):Naive 的 NSelect / NPopover 把浮层 teleport 到\n// body,而原生全屏只渲染被全屏那棵子树,浮层会整个看不见 —— 带下拉、气泡的宽表必然踩中。\n// 固定定位遮罩没这个问题:浮层照旧挂在 body 上,z-index 比遮罩高就行(遮罩 50,Naive 浮层 2000+)。\n//\n// 用法:\n// const { zoomed, toggle } = useTableZoom()\n// <div :class=\"{ 'table-zoom': zoomed }\"> ...表格... </div>\n// <n-button @click=\"toggle\">放大/还原</n-button>\n// `.table-zoom` 的样式在 styles/table.css。\nimport { onScopeDispose, ref, watch } from 'vue'\n\n/**\n * body 滚动锁的引用计数。`document.body.style.overflow` 是全局单例,而一个页面上会有多个\n * useTableZoom 实例,各自无条件置/清会互相踩:先退出的那个会在另一个遮罩仍铺满时\n * 把背景滚动放开,正是这把锁要防的现象。\n *\n * 当前 UI 下同时只可能有一个放大态(遮罩不透明且铺满视口,挡住了其它放大按钮),\n * 所以这个计数眼下是防御性的 —— 但别让后来者依赖那个巧合:一旦出现并排/画中画放大就会踩中。\n */\nlet bodyLockCount = 0\nfunction lockBodyScroll() {\n if (bodyLockCount === 0) document.body.style.overflow = 'hidden'\n bodyLockCount++\n}\nfunction unlockBodyScroll() {\n if (bodyLockCount === 0) return\n bodyLockCount--\n if (bodyLockCount === 0) document.body.style.overflow = ''\n}\n\nexport function useTableZoom() {\n const zoomed = ref(false)\n /** 本实例是否持有 body 锁:避免重复加锁/重复解锁把计数带偏 */\n let holdsLock = false\n\n function toggle() {\n zoomed.value = !zoomed.value\n }\n function exit() {\n zoomed.value = false\n }\n\n function onKeydown(e: KeyboardEvent) {\n // 只在放大态拦 Esc;Naive 的下拉/气泡自己也吃 Esc,已经打开时先关浮层再关放大,交给冒泡顺序即可。\n if (e.key === 'Escape') exit()\n }\n\n // 放大时锁掉 body 滚动:遮罩是 fixed,底下的页面还能滚会让滚轮行为很怪。\n watch(zoomed, value => {\n if (value && !holdsLock) {\n holdsLock = true\n lockBodyScroll()\n window.addEventListener('keydown', onKeydown)\n } else if (!value && holdsLock) {\n holdsLock = false\n unlockBodyScroll()\n window.removeEventListener('keydown', onKeydown)\n }\n })\n\n // 组件卸载时(含放大态下直接切路由)务必还锁,否则整站 body 会一直锁着。\n onScopeDispose(() => {\n if (holdsLock) {\n holdsLock = false\n unlockBodyScroll()\n }\n window.removeEventListener('keydown', onKeydown)\n })\n\n return { zoomed, toggle, exit }\n}\n"],"names":["bodyLockCount","lockBodyScroll","unlockBodyScroll","useTableZoom","zoomed","ref","holdsLock","toggle","exit","onKeydown","e","watch","value","onScopeDispose"],"mappings":";AAqBA,IAAIA,IAAgB;AACpB,SAASC,IAAiB;AACxB,EAAID,MAAkB,MAAG,SAAS,KAAK,MAAM,WAAW,WACxDA;AACF;AACA,SAASE,IAAmB;AAC1B,EAAIF,MAAkB,MACtBA,KACIA,MAAkB,MAAG,SAAS,KAAK,MAAM,WAAW;AAC1D;AAEO,SAASG,IAAe;AAC7B,QAAMC,IAASC,EAAI,EAAK;AAExB,MAAIC,IAAY;AAEhB,WAASC,IAAS;AAChB,IAAAH,EAAO,QAAQ,CAACA,EAAO;AAAA,EACzB;AACA,WAASI,IAAO;AACd,IAAAJ,EAAO,QAAQ;AAAA,EACjB;AAEA,WAASK,EAAUC,GAAkB;AAEnC,IAAIA,EAAE,QAAQ,YAAUF,EAAA;AAAA,EAC1B;AAGA,SAAAG,EAAMP,GAAQ,CAAAQ,MAAS;AACrB,IAAIA,KAAS,CAACN,KACZA,IAAY,IACZL,EAAA,GACA,OAAO,iBAAiB,WAAWQ,CAAS,KACnC,CAACG,KAASN,MACnBA,IAAY,IACZJ,EAAA,GACA,OAAO,oBAAoB,WAAWO,CAAS;AAAA,EAEnD,CAAC,GAGDI,EAAe,MAAM;AACnB,IAAIP,MACFA,IAAY,IACZJ,EAAA,IAEF,OAAO,oBAAoB,WAAWO,CAAS;AAAA,EACjD,CAAC,GAEM,EAAE,QAAAL,GAAQ,QAAAG,GAAQ,MAAAC,EAAA;AAC3B;"}
1
+ {"version":3,"file":"useTableZoom.js","sources":["../../src/composables/useTableZoom.ts"],"sourcesContent":["// 表格「放大」:把某块区域临时铺满视口,给笔记本等窄屏看宽表用。\n//\n// 刻意不用 Fullscreen API(VueUse 的 useFullscreen):Naive 的 NSelect / NPopover 把浮层 teleport 到\n// body,而原生全屏只渲染被全屏那棵子树,浮层会整个看不见 —— 带下拉、气泡的宽表必然踩中。\n// 固定定位遮罩没这个问题:浮层照旧挂在 body 上,z-index 比遮罩高就行(遮罩 50,Naive 浮层 2000+)。\n//\n// 用法:\n// const { zoomed, toggle } = useTableZoom()\n// <div :class=\"{ 'table-zoom': zoomed }\"> ...表格... </div>\n// <n-button @click=\"toggle\">放大/还原</n-button>\n// `.table-zoom` 的样式在 styles/table.css。\nimport { onScopeDispose, ref, watch } from 'vue'\n\n/**\n * body 滚动锁的引用计数。`document.body.style.overflow` 是全局单例,而一个页面上会有多个\n * useTableZoom 实例,各自无条件置/清会互相踩:先退出的那个会在另一个遮罩仍铺满时\n * 把背景滚动放开,正是这把锁要防的现象。\n *\n * 当前 UI 下同时只可能有一个放大态(遮罩不透明且铺满视口,挡住了其它放大按钮),\n * 所以这个计数眼下是防御性的 —— 但别让后来者依赖那个巧合:一旦出现并排/画中画放大就会踩中。\n */\nlet bodyLockCount = 0\nfunction lockBodyScroll() {\n if (bodyLockCount === 0) document.body.style.overflow = 'hidden'\n bodyLockCount++\n}\nfunction unlockBodyScroll() {\n if (bodyLockCount === 0) return\n bodyLockCount--\n if (bodyLockCount === 0) document.body.style.overflow = ''\n}\n\n/**\n * @deprecated smart-naive-table 3.0 起 SmartTable 自带放大按钮:`:toolbar=\"{ maximize: true }\"`\n * (Teleport 到 body、盖住侧栏与顶栏、不调用浏览器全屏 API,与本实现是同一思路)。\n * 本 composable 与 TableZoomButton 没有内核页面在用,仅为已依赖它们的下游应用保留,下一个 .NET 大版本删除。\n */\nexport function useTableZoom() {\n const zoomed = ref(false)\n /** 本实例是否持有 body 锁:避免重复加锁/重复解锁把计数带偏 */\n let holdsLock = false\n\n function toggle() {\n zoomed.value = !zoomed.value\n }\n function exit() {\n zoomed.value = false\n }\n\n function onKeydown(e: KeyboardEvent) {\n // 只在放大态拦 Esc;Naive 的下拉/气泡自己也吃 Esc,已经打开时先关浮层再关放大,交给冒泡顺序即可。\n if (e.key === 'Escape') exit()\n }\n\n // 放大时锁掉 body 滚动:遮罩是 fixed,底下的页面还能滚会让滚轮行为很怪。\n watch(zoomed, value => {\n if (value && !holdsLock) {\n holdsLock = true\n lockBodyScroll()\n window.addEventListener('keydown', onKeydown)\n } else if (!value && holdsLock) {\n holdsLock = false\n unlockBodyScroll()\n window.removeEventListener('keydown', onKeydown)\n }\n })\n\n // 组件卸载时(含放大态下直接切路由)务必还锁,否则整站 body 会一直锁着。\n onScopeDispose(() => {\n if (holdsLock) {\n holdsLock = false\n unlockBodyScroll()\n }\n window.removeEventListener('keydown', onKeydown)\n })\n\n return { zoomed, toggle, exit }\n}\n"],"names":["bodyLockCount","lockBodyScroll","unlockBodyScroll","useTableZoom","zoomed","ref","holdsLock","toggle","exit","onKeydown","e","watch","value","onScopeDispose"],"mappings":";AAqBA,IAAIA,IAAgB;AACpB,SAASC,IAAiB;AACxB,EAAID,MAAkB,MAAG,SAAS,KAAK,MAAM,WAAW,WACxDA;AACF;AACA,SAASE,IAAmB;AAC1B,EAAIF,MAAkB,MACtBA,KACIA,MAAkB,MAAG,SAAS,KAAK,MAAM,WAAW;AAC1D;AAOO,SAASG,IAAe;AAC7B,QAAMC,IAASC,EAAI,EAAK;AAExB,MAAIC,IAAY;AAEhB,WAASC,IAAS;AAChB,IAAAH,EAAO,QAAQ,CAACA,EAAO;AAAA,EACzB;AACA,WAASI,IAAO;AACd,IAAAJ,EAAO,QAAQ;AAAA,EACjB;AAEA,WAASK,EAAUC,GAAkB;AAEnC,IAAIA,EAAE,QAAQ,YAAUF,EAAA;AAAA,EAC1B;AAGA,SAAAG,EAAMP,GAAQ,CAAAQ,MAAS;AACrB,IAAIA,KAAS,CAACN,KACZA,IAAY,IACZL,EAAA,GACA,OAAO,iBAAiB,WAAWQ,CAAS,KACnC,CAACG,KAASN,MACnBA,IAAY,IACZJ,EAAA,GACA,OAAO,oBAAoB,WAAWO,CAAS;AAAA,EAEnD,CAAC,GAGDI,EAAe,MAAM;AACnB,IAAIP,MACFA,IAAY,IACZJ,EAAA,IAEF,OAAO,oBAAoB,WAAWO,CAAS;AAAA,EACjD,CAAC,GAEM,EAAE,QAAAL,GAAQ,QAAAG,GAAQ,MAAAC,EAAA;AAC3B;"}
@@ -1,9 +1,9 @@
1
1
  import { Ref } from 'vue';
2
2
  import { GlobalTheme, GlobalThemeOverrides } from 'naive-ui';
3
3
  /**
4
- * 主题落地:随 app.isDark / app.accent / app.density / app.grayscale 变化,
4
+ * 主题落地:随 app.isDark / app.accent / app.density 变化,
5
5
  * 1) 打 data-theme / data-density 到 <html>(裸 CSS 与 tokens 跟着翻);
6
- * 2) 把 accent 派生的 --color-primary* 写到 <html>(令消费 tokens 的裸 CSS 换色);
6
+ * 2) 把 accent 派生的强调色令牌(--accent / --acc-solid / --sel-* 等,见 theme/accentTokens.ts)写到 <html>(令消费 tokens 的裸 CSS 换色);
7
7
  * 3) 重建 Naive themeOverrides(新对象触发 n-config-provider 重渲染)。
8
8
  * 返回类型显式写出:推断出的 Naive 主题类型展开后超出 d.ts 序列化上限,包的类型声明会不完整。
9
9
  */
@@ -1,30 +1,33 @@
1
- import { ref as s, watch as p } from "vue";
2
- import { darkTheme as u } from "naive-ui";
3
- import { useAppStore as d } from "../stores/app.js";
1
+ import { ref as i, watch as l, nextTick as p } from "vue";
2
+ import { darkTheme as f } from "naive-ui";
3
+ import { useAppStore as k } from "../stores/app.js";
4
4
  import { buildThemeOverrides as y } from "../theme/naive-theme.js";
5
- import { derivePrimary as h } from "../theme/mix.js";
6
- function P() {
7
- const e = d(), n = s({}), a = s(null);
8
- let i = null;
5
+ import { deriveAccentTokens as h } from "../theme/accentTokens.js";
6
+ function D() {
7
+ return typeof document.startViewTransition == "function" && !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
8
+ }
9
+ function x() {
10
+ const e = k(), o = i({}), a = i(null);
11
+ let r = null;
12
+ function s() {
13
+ const t = document.documentElement, { css: n } = h(e.accent, e.isDark);
14
+ for (const [u, d] of Object.entries(n)) t.style.setProperty(u, d);
15
+ }
9
16
  function c() {
10
- const t = document.documentElement;
11
- t.classList.add("theme-switching"), i && clearTimeout(i), i = setTimeout(() => t.classList.remove("theme-switching"), 280);
17
+ const t = e.isDark, n = document.documentElement;
18
+ n.setAttribute("data-theme", t ? "dark" : ""), n.setAttribute("data-density", e.density), s(), n.style.colorScheme = t ? "dark" : "light", a.value = e.isDark ? f : null, o.value = y({ dark: e.isDark, accent: e.accent });
12
19
  }
13
20
  function m() {
14
- const t = document.documentElement, r = getComputedStyle(t).getPropertyValue("--color-bg-container").trim() || void 0, o = h(e.accent, e.isDark, r);
15
- t.style.setProperty("--color-primary", o.primary), t.style.setProperty("--color-primary-hover", o.hover), t.style.setProperty("--color-primary-pressed", o.pressed), t.style.setProperty("--color-primary-light", o.light);
16
- }
17
- function l() {
18
- const t = e.isDark;
19
- c();
20
- const r = document.documentElement;
21
- r.setAttribute("data-theme", t ? "dark" : ""), r.setAttribute("data-density", e.density), r.toggleAttribute("data-gray", e.grayscale), m(), a.value = e.isDark ? u : null, n.value = y({ dark: e.isDark, accent: e.accent });
21
+ const t = r !== null && r !== e.isDark;
22
+ r = e.isDark, t && D() ? document.startViewTransition(async () => {
23
+ c(), await p();
24
+ }) : c();
22
25
  }
23
- return p([() => e.isDark, () => e.accent, () => e.density, () => e.grayscale], l, {
26
+ return l([() => e.isDark, () => e.accent, () => e.density], m, {
24
27
  immediate: !0
25
- }), { overrides: n, naiveTheme: a };
28
+ }), { overrides: o, naiveTheme: a };
26
29
  }
27
30
  export {
28
- P as useTheme
31
+ x as useTheme
29
32
  };
30
33
  //# sourceMappingURL=useTheme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTheme.js","sources":["../../src/composables/useTheme.ts"],"sourcesContent":["import { ref, watch, type Ref } from 'vue'\nimport { darkTheme, type GlobalTheme, type GlobalThemeOverrides } from 'naive-ui'\nimport { useAppStore } from '#/stores/app'\nimport { buildThemeOverrides } from '#/theme/naive-theme'\nimport { derivePrimary } from '#/theme/mix'\n\n/**\n * 主题落地:随 app.isDark / app.accent / app.density / app.grayscale 变化,\n * 1) 打 data-theme / data-density 到 <html>(裸 CSS 与 tokens 跟着翻);\n * 2) 把 accent 派生的 --color-primary* 写到 <html>(令消费 tokens 的裸 CSS 换色);\n * 3) 重建 Naive themeOverrides(新对象触发 n-config-provider 重渲染)。\n * 返回类型显式写出:推断出的 Naive 主题类型展开后超出 d.ts 序列化上限,包的类型声明会不完整。\n */\nexport function useTheme(): {\n overrides: Ref<GlobalThemeOverrides>\n naiveTheme: Ref<GlobalTheme | null>\n} {\n const app = useAppStore()\n const overrides = ref<GlobalThemeOverrides>({}) as Ref<GlobalThemeOverrides>\n const naiveTheme = ref<GlobalTheme | null>(null) as Ref<GlobalTheme | null>\n\n // 主题切换过渡:短暂给 <html> 加 theme-switching,让颜色平滑过渡且不盖整屏淡化层,文字不会短暂发糊。\n let transitionTimer: ReturnType<typeof setTimeout> | null = null\n\n function beginThemeTransition() {\n const el = document.documentElement\n el.classList.add('theme-switching')\n if (transitionTimer) clearTimeout(transitionTimer)\n transitionTimer = setTimeout(() => el.classList.remove('theme-switching'), 280)\n }\n\n function applyPrimaryVars() {\n const el = document.documentElement\n // 容器色要在 data-theme 打上之后读(apply() 里的顺序),否则暗色首帧会拿到亮色容器。\n const container =\n getComputedStyle(el).getPropertyValue('--color-bg-container').trim() || undefined\n const p = derivePrimary(app.accent, app.isDark, container)\n el.style.setProperty('--color-primary', p.primary)\n el.style.setProperty('--color-primary-hover', p.hover)\n el.style.setProperty('--color-primary-pressed', p.pressed)\n el.style.setProperty('--color-primary-light', p.light)\n }\n\n function apply() {\n const nextDark = app.isDark\n beginThemeTransition() // 主题切换瞬间启用颜色过渡,不做整屏淡化\n const el = document.documentElement\n el.setAttribute('data-theme', nextDark ? 'dark' : '')\n el.setAttribute('data-density', app.density)\n el.toggleAttribute('data-gray', app.grayscale) // 灰阶滤镜(styles/index.css)\n applyPrimaryVars()\n naiveTheme.value = app.isDark ? darkTheme : null\n overrides.value = buildThemeOverrides({ dark: app.isDark, accent: app.accent })\n }\n\n watch([() => app.isDark, () => app.accent, () => app.density, () => app.grayscale], apply, {\n immediate: true,\n })\n\n return { overrides, naiveTheme }\n}\n"],"names":["useTheme","app","useAppStore","overrides","ref","naiveTheme","transitionTimer","beginThemeTransition","el","applyPrimaryVars","container","p","derivePrimary","apply","nextDark","darkTheme","buildThemeOverrides","watch"],"mappings":";;;;;AAaO,SAASA,IAGd;AACA,QAAMC,IAAMC,EAAA,GACNC,IAAYC,EAA0B,EAAE,GACxCC,IAAaD,EAAwB,IAAI;AAG/C,MAAIE,IAAwD;AAE5D,WAASC,IAAuB;AAC9B,UAAMC,IAAK,SAAS;AACpB,IAAAA,EAAG,UAAU,IAAI,iBAAiB,GAC9BF,kBAA8BA,CAAe,GACjDA,IAAkB,WAAW,MAAME,EAAG,UAAU,OAAO,iBAAiB,GAAG,GAAG;AAAA,EAChF;AAEA,WAASC,IAAmB;AAC1B,UAAMD,IAAK,SAAS,iBAEdE,IACJ,iBAAiBF,CAAE,EAAE,iBAAiB,sBAAsB,EAAE,UAAU,QACpEG,IAAIC,EAAcX,EAAI,QAAQA,EAAI,QAAQS,CAAS;AACzD,IAAAF,EAAG,MAAM,YAAY,mBAAmBG,EAAE,OAAO,GACjDH,EAAG,MAAM,YAAY,yBAAyBG,EAAE,KAAK,GACrDH,EAAG,MAAM,YAAY,2BAA2BG,EAAE,OAAO,GACzDH,EAAG,MAAM,YAAY,yBAAyBG,EAAE,KAAK;AAAA,EACvD;AAEA,WAASE,IAAQ;AACf,UAAMC,IAAWb,EAAI;AACrB,IAAAM,EAAA;AACA,UAAMC,IAAK,SAAS;AACpB,IAAAA,EAAG,aAAa,cAAcM,IAAW,SAAS,EAAE,GACpDN,EAAG,aAAa,gBAAgBP,EAAI,OAAO,GAC3CO,EAAG,gBAAgB,aAAaP,EAAI,SAAS,GAC7CQ,EAAA,GACAJ,EAAW,QAAQJ,EAAI,SAASc,IAAY,MAC5CZ,EAAU,QAAQa,EAAoB,EAAE,MAAMf,EAAI,QAAQ,QAAQA,EAAI,QAAQ;AAAA,EAChF;AAEA,SAAAgB,EAAM,CAAC,MAAMhB,EAAI,QAAQ,MAAMA,EAAI,QAAQ,MAAMA,EAAI,SAAS,MAAMA,EAAI,SAAS,GAAGY,GAAO;AAAA,IACzF,WAAW;AAAA,EAAA,CACZ,GAEM,EAAE,WAAAV,GAAW,YAAAE,EAAA;AACtB;"}
1
+ {"version":3,"file":"useTheme.js","sources":["../../src/composables/useTheme.ts"],"sourcesContent":["import { nextTick, ref, watch, type Ref } from 'vue'\nimport { darkTheme, type GlobalTheme, type GlobalThemeOverrides } from 'naive-ui'\nimport { useAppStore } from '#/stores/app'\nimport { buildThemeOverrides } from '#/theme/naive-theme'\nimport { deriveAccentTokens } from '#/theme/accentTokens'\n\n// 浏览器支持 View Transitions 且系统没开「减少动态效果」才做交叉淡入\nfunction canCrossFade(): boolean {\n return (\n typeof document.startViewTransition === 'function' &&\n !window.matchMedia('(prefers-reduced-motion: reduce)').matches\n )\n}\n\n/**\n * 主题落地:随 app.isDark / app.accent / app.density 变化,\n * 1) 打 data-theme / data-density 到 <html>(裸 CSS 与 tokens 跟着翻);\n * 2) 把 accent 派生的强调色令牌(--accent / --acc-solid / --sel-* 等,见 theme/accentTokens.ts)写到 <html>(令消费 tokens 的裸 CSS 换色);\n * 3) 重建 Naive themeOverrides(新对象触发 n-config-provider 重渲染)。\n * 返回类型显式写出:推断出的 Naive 主题类型展开后超出 d.ts 序列化上限,包的类型声明会不完整。\n */\nexport function useTheme(): {\n overrides: Ref<GlobalThemeOverrides>\n naiveTheme: Ref<GlobalTheme | null>\n} {\n const app = useAppStore()\n const overrides = ref<GlobalThemeOverrides>({}) as Ref<GlobalThemeOverrides>\n const naiveTheme = ref<GlobalTheme | null>(null) as Ref<GlobalTheme | null>\n\n // 明暗切换的过渡:像 macOS 那样把整屏旧画面与新画面做一次交叉淡入(View Transitions 的快照)。\n // 不给每个元素单独挂颜色过渡——Naive 输入框由边框层 / 状态边框层 / 阴影叠成,各层半透明边框色\n // 各自在中间色上插值,暗→亮时会闪出一圈忽明忽暗的线;快照淡入没有逐元素的中间态。\n // 浏览器不支持、或系统开了「减少动态效果」时直接瞬切。\n let lastDark: boolean | null = null\n\n // 强调色令牌(--accent / --signal / --acc-solid / --sel-* / --tab-* / --ambient-* / --desk-* 等):\n // 写到 <html> 的 style 上,令消费 tokens 的裸 CSS 换色。兼容别名 --color-primary* 在 tokens.css 里引用它们,不用单独写。\n function applyAccentVars() {\n const el = document.documentElement\n const { css } = deriveAccentTokens(app.accent, app.isDark)\n for (const [name, value] of Object.entries(css)) el.style.setProperty(name, value)\n }\n\n function applyNow() {\n const nextDark = app.isDark\n const el = document.documentElement\n el.setAttribute('data-theme', nextDark ? 'dark' : '')\n el.setAttribute('data-density', app.density)\n applyAccentVars()\n el.style.colorScheme = nextDark ? 'dark' : 'light' // 原生滚动条 / 表单控件跟着翻\n naiveTheme.value = app.isDark ? darkTheme : null\n overrides.value = buildThemeOverrides({ dark: app.isDark, accent: app.accent })\n }\n\n function apply() {\n // 只有明暗翻面才做交叉淡入;首次落地、换强调色、换密度都瞬切\n const flipped = lastDark !== null && lastDark !== app.isDark\n lastDark = app.isDark\n if (flipped && canCrossFade()) {\n // 回调里改 DOM,并等 Vue 把 Naive 的新主题渲染完再返回,新快照才是完整的新画面\n document.startViewTransition(async () => {\n applyNow()\n await nextTick()\n })\n } else {\n applyNow()\n }\n }\n\n watch([() => app.isDark, () => app.accent, () => app.density], apply, {\n immediate: true,\n })\n\n return { overrides, naiveTheme }\n}\n"],"names":["canCrossFade","useTheme","app","useAppStore","overrides","ref","naiveTheme","lastDark","applyAccentVars","el","css","deriveAccentTokens","name","value","applyNow","nextDark","darkTheme","buildThemeOverrides","apply","flipped","nextTick","watch"],"mappings":";;;;;AAOA,SAASA,IAAwB;AAC/B,SACE,OAAO,SAAS,uBAAwB,cACxC,CAAC,OAAO,WAAW,kCAAkC,EAAE;AAE3D;AASO,SAASC,IAGd;AACA,QAAMC,IAAMC,EAAA,GACNC,IAAYC,EAA0B,EAAE,GACxCC,IAAaD,EAAwB,IAAI;AAM/C,MAAIE,IAA2B;AAI/B,WAASC,IAAkB;AACzB,UAAMC,IAAK,SAAS,iBACd,EAAE,KAAAC,EAAA,IAAQC,EAAmBT,EAAI,QAAQA,EAAI,MAAM;AACzD,eAAW,CAACU,GAAMC,CAAK,KAAK,OAAO,QAAQH,CAAG,EAAG,CAAAD,EAAG,MAAM,YAAYG,GAAMC,CAAK;AAAA,EACnF;AAEA,WAASC,IAAW;AAClB,UAAMC,IAAWb,EAAI,QACfO,IAAK,SAAS;AACpB,IAAAA,EAAG,aAAa,cAAcM,IAAW,SAAS,EAAE,GACpDN,EAAG,aAAa,gBAAgBP,EAAI,OAAO,GAC3CM,EAAA,GACAC,EAAG,MAAM,cAAcM,IAAW,SAAS,SAC3CT,EAAW,QAAQJ,EAAI,SAASc,IAAY,MAC5CZ,EAAU,QAAQa,EAAoB,EAAE,MAAMf,EAAI,QAAQ,QAAQA,EAAI,QAAQ;AAAA,EAChF;AAEA,WAASgB,IAAQ;AAEf,UAAMC,IAAUZ,MAAa,QAAQA,MAAaL,EAAI;AACtD,IAAAK,IAAWL,EAAI,QACXiB,KAAWnB,MAEb,SAAS,oBAAoB,YAAY;AACvC,MAAAc,EAAA,GACA,MAAMM,EAAA;AAAA,IACR,CAAC,IAEDN,EAAA;AAAA,EAEJ;AAEA,SAAAO,EAAM,CAAC,MAAMnB,EAAI,QAAQ,MAAMA,EAAI,QAAQ,MAAMA,EAAI,OAAO,GAAGgB,GAAO;AAAA,IACpE,WAAW;AAAA,EAAA,CACZ,GAEM,EAAE,WAAAd,GAAW,YAAAE,EAAA;AACtB;"}
@@ -1,6 +1,7 @@
1
1
  import { App } from 'vue';
2
2
  import { Pinia } from 'pinia';
3
3
  import { RouteRecordRaw } from 'vue-router';
4
+ import { FilterSerializer } from 'smart-naive-table';
4
5
  import { IconifyJSON } from 'smart-naive-icon';
5
6
  import { router } from './router';
6
7
  import { i18n, ExtModule } from './locales';
@@ -17,7 +18,7 @@ export interface SmartAdminPlugin {
17
18
  locales?: Record<string, ExtModule>;
18
19
  /** 布局壳之外的顶级静态路由(整屏看板、独立打印页等)。 */
19
20
  routes?: RouteRecordRaw[];
20
- /** 菜单 path → i18n key(存量库菜单标题是中文时用)。 */
21
+ /** 菜单标题 → i18n key(存量库菜单标题是中文时用):键以 / 开头按路由 path 登记,其余按标题原文登记。内核种子标题已自带。 */
21
22
  menuTitles?: Record<string, string>;
22
23
  /** 本地 SVG 图标:`import.meta.glob('./assets/svg/*.svg', { query: '?raw', import: 'default', eager: true })`。 */
23
24
  icons?: Record<string, string>;
@@ -37,10 +38,19 @@ export interface SmartAdminOptions extends SmartAdminPlugin {
37
38
  dev?: boolean;
38
39
  /** 品牌默认值:sys.site.* 配置有值时以配置为准,为空时用这里。 */
39
40
  brand?: BrandOptions;
40
- /** SmartTable 全局默认。 */
41
+ /**
42
+ * SmartTable 全局默认。
43
+ * `filterSerializer`:条件构造器 / 表头过滤的过滤态 → 请求参数。内核默认用 `flatFilterSerializer`
44
+ * (只翻后端真正支持的那一小撮条件,摊平成扁平参数,见 utils/tableFilter.ts)。
45
+ * 应用的后端已经实现了 3.0 默认的 `filters` 协议(`[{ field, logic, conditions }]`)时,传 `defaultFilterSerializer`
46
+ * (从 smart-naive-table 导入)即可保持原样;自定义形状就传自己的函数。
47
+ */
41
48
  table?: {
42
49
  density?: 'comfortable' | 'compact';
43
50
  pageSizes?: number[];
51
+ filterSerializer?: FilterSerializer;
52
+ /** 所有数据列默认可拖拽列宽。内核默认 true;设 false 全局关掉,单列用列上的 `resizable` 覆盖。 */
53
+ resizable?: boolean;
44
54
  };
45
55
  }
46
56
  export interface SmartAdminApp {
@@ -1,77 +1,89 @@
1
- import { createApp as v, computed as S } from "vue";
2
- import { createPinia as h } from "pinia";
3
- import x from "pinia-plugin-persistedstate";
4
- import { SMART_TABLE_DEFAULTS as T, createSmartTableDefaults as w } from "smart-naive-table";
5
- import y from "./App.vue.js";
6
- import { router as a } from "./router/index.js";
7
- import { registerLocales as A, i18n as i } from "./locales/index.js";
8
- import { registerMenuTitles as L } from "./locales/menuTitle.js";
9
- import { registerViews as E } from "./router/viewRegistry.js";
10
- import { vAuth as R } from "./directives/auth.js";
11
- import { setupIcons as _ } from "./lib/icons.js";
12
- import { reloadOnChunkError as b, reloadOnce as D } from "./lib/chunkReload.js";
1
+ import { createApp as L, computed as z } from "vue";
2
+ import { createPinia as E } from "pinia";
3
+ import T from "pinia-plugin-persistedstate";
4
+ import { SMART_TABLE_DEFAULTS as x, createSmartTableDefaults as w, zhCNLabels as R, defaultLabels as y } from "smart-naive-table";
5
+ import A from "./App.vue.js";
6
+ import { router as n } from "./router/index.js";
7
+ import { registerLocales as _, i18n as a } from "./locales/index.js";
8
+ import { registerMenuTitles as S } from "./locales/menuTitle.js";
9
+ import { KERNEL_MENU_TITLES as N } from "./locales/kernelMenuTitles.js";
10
+ import { registerViews as B } from "./router/viewRegistry.js";
11
+ import { vAuth as C } from "./directives/auth.js";
12
+ import { setupIcons as D } from "./lib/icons.js";
13
+ import { reloadOnChunkError as v, reloadOnce as P } from "./lib/chunkReload.js";
13
14
  import { runtime as o } from "./lib/runtime.js";
14
- import { useSite as B } from "./composables/useSite.js";
15
- import { trimTrailingSlashes as C } from "./utils/url.js";
16
- function K(t = {}) {
17
- var c, f, d, p;
18
- o.apiBase = C(t.apiBase ?? ""), t.version && (o.version = t.version), o.dev = !!t.dev, o.brand = t.brand ?? {}, (c = t.brand) != null && c.title && (B().site.title = t.brand.title);
19
- const s = [...t.plugins ?? [], t], l = {}, m = [];
20
- for (const e of s) {
21
- e.views && E(e.views), e.locales && A(e.locales), e.menuTitles && L(e.menuTitles), e.icons && Object.assign(l, e.icons), e.iconSets && m.push(...e.iconSets);
22
- for (const u of e.routes ?? []) a.addRoute(u);
15
+ import { useSite as M } from "./composables/useSite.js";
16
+ import { flatFilterSerializer as O } from "./utils/tableFilter.js";
17
+ import { trimTrailingSlashes as j } from "./utils/url.js";
18
+ function te(r = {}) {
19
+ var c, d, u, p, b, g;
20
+ o.apiBase = j(r.apiBase ?? ""), r.version && (o.version = r.version), o.dev = !!r.dev, o.brand = r.brand ?? {}, (c = r.brand) != null && c.title && (M().site.title = r.brand.title), S(N);
21
+ const l = [...r.plugins ?? [], r], m = {}, f = [];
22
+ for (const e of l) {
23
+ e.views && B(e.views), e.locales && _(e.locales), e.menuTitles && S(e.menuTitles), e.icons && Object.assign(m, e.icons), e.iconSets && f.push(...e.iconSets);
24
+ for (const t of e.routes ?? []) n.addRoute(t);
23
25
  }
24
- _(l, m), window.addEventListener("unhandledrejection", (e) => {
25
- b(e.reason) && e.preventDefault();
26
+ D(m, f), window.addEventListener("unhandledrejection", (e) => {
27
+ v(e.reason) && e.preventDefault();
26
28
  }), window.addEventListener("vite:preloadError", (e) => {
27
- D() && e.preventDefault();
29
+ P() && e.preventDefault();
28
30
  });
29
- const n = h();
30
- n.use(x);
31
- const r = v(y);
32
- r.use(n), r.use(a), r.use(i), r.directive("auth", R), r.config.errorHandler = (e, u, g) => {
33
- b(e) || console.error("[SmartAdmin] 未捕获异常", g, e);
34
- }, r.provide(
35
- T,
31
+ const s = E();
32
+ s.use(T);
33
+ const i = L(A);
34
+ i.use(s), i.use(n), i.use(a), i.directive("auth", C), i.config.errorHandler = (e, t, h) => {
35
+ v(e) || console.error("[SmartAdmin] 未捕获异常", h, e);
36
+ }, i.provide(
37
+ x,
36
38
  w({
37
39
  // 表格工具栏密度默认使用紧凑档;已有 storage-key 的用户选择仍按本地缓存优先。
38
- density: ((f = t.table) == null ? void 0 : f.density) ?? "compact",
39
- // 内置兜底是 [10,20,50],后台列表动辄上千行,翻页翻不过来。
40
- // 上限 200:内核 Api:MaxPageSize 的默认值,选更大的后端会回 48001。
41
- // 注意 SmartTable 的**初始**每页条数走 default-page-size prop(不在这份可注入的 defaults 里),
42
- // 没传那个 prop 的页面初始仍是 10,条数选择器会显示一个不在列表里的值。
43
- pageSizes: ((d = t.table) == null ? void 0 : d.pageSizes) ?? [20, 50, 100, 200],
44
- labels: S(() => {
45
- i.global.locale.value;
46
- const e = i.global.t;
40
+ density: ((d = r.table) == null ? void 0 : d.density) ?? "compact",
41
+ // 初始每页条数。它在可注入的 defaults 里(smart-naive-table 3.0 及以上),页面不用各写 :default-page-size。
42
+ defaultPageSize: 100,
43
+ // 列宽拖拽全站统一开:表头右缘拖动改宽,宽度跟着 storage-key 记忆。库内置默认是 false;
44
+ // 某列不想让拖(操作列、序号列)在列上写 resizable: false,列上的值永远优先于这里。
45
+ resizable: ((u = r.table) == null ? void 0 : u.resizable) ?? !0,
46
+ // 当前行(activeRowKey)高亮:指向选中态令牌(强调色淡底,跟强调色与明暗走),不用库默认的主色 9%。
47
+ // 库用 background-image 叠色、不覆盖行底色,所以半透明的令牌值也不会让固定列透底。
48
+ activeRowBg: "var(--sel-bg)",
49
+ // 可选条数不手写,交给 smart-naive-table 3.0 按 fillHeight 选档:没开 [100,500,1000],开了 [100,1000,10000]。
50
+ // 上限是后端 SmartAdmin:Api:MaxPageSize,默认 10000;应用把它调小的话,要用 table.pageSizes
51
+ // 把这里的档位也压下去,否则用户选到超限档会被后端回 48001。undefined 不会覆盖内置档位。
52
+ pageSizes: (p = r.table) == null ? void 0 : p.pageSizes,
53
+ // 条件构造器的过滤态 → 后端扁平参数(见 utils/tableFilter.ts);有日期区间或改名需求的页面传自己的 :filter-serializer
54
+ filterSerializer: ((b = r.table) == null ? void 0 : b.filterSerializer) ?? O,
55
+ labels: z(() => {
56
+ const e = a.global.locale.value, t = a.global.t;
47
57
  return {
48
- search: e("common.search"),
49
- reset: e("common.reset"),
50
- refresh: e("table.refresh"),
51
- density: e("app.density"),
52
- densityComfortable: e("app.comfortable"),
53
- densityCompact: e("app.compact"),
54
- columnSettings: e("table.columnSettings"),
55
- columnSettingsReset: e("table.columnSettingsReset"),
56
- fixedLeft: e("table.fixedLeft"),
57
- fixedRight: e("table.fixedRight"),
58
- fixedNone: e("table.fixedNone"),
59
- expand: e("table.expand"),
60
- collapse: e("table.collapse")
58
+ // 底子用 3.0 自带的整套文案(含条件构造器、批量栏等新键),再叠上项目 i18n 里已有的几个键。
59
+ ...e.startsWith("zh") ? R : y,
60
+ search: t("common.search"),
61
+ reset: t("common.reset"),
62
+ refresh: t("table.refresh"),
63
+ density: t("app.density"),
64
+ densityComfortable: t("app.comfortable"),
65
+ densityCompact: t("app.compact"),
66
+ columnSettings: t("table.columnSettings"),
67
+ columnSettingsReset: t("table.columnSettingsReset"),
68
+ fixedLeft: t("table.fixedLeft"),
69
+ fixedRight: t("table.fixedRight"),
70
+ fixedNone: t("table.fixedNone"),
71
+ expand: t("table.expand"),
72
+ collapse: t("table.collapse")
61
73
  };
62
74
  })
63
75
  })
64
76
  );
65
- for (const e of s) (p = e.install) == null || p.call(e, r);
77
+ for (const e of l) (g = e.install) == null || g.call(e, i);
66
78
  return {
67
- app: r,
68
- router: a,
69
- pinia: n,
70
- i18n: i,
71
- mount: (e) => (r.mount(e), r)
79
+ app: i,
80
+ router: n,
81
+ pinia: s,
82
+ i18n: a,
83
+ mount: (e) => (i.mount(e), i)
72
84
  };
73
85
  }
74
86
  export {
75
- K as createSmartAdmin
87
+ te as createSmartAdmin
76
88
  };
77
89
  //# sourceMappingURL=createSmartAdmin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSmartAdmin.js","sources":["../src/createSmartAdmin.ts"],"sourcesContent":["import { computed, createApp, type App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\nimport type { RouteRecordRaw } from 'vue-router'\nimport { SMART_TABLE_DEFAULTS, createSmartTableDefaults } from 'smart-naive-table'\nimport type { IconifyJSON } from 'smart-naive-icon'\nimport AppRoot from '#/App.vue'\nimport { router } from '#/router'\nimport { i18n, registerLocales, type ExtModule } from '#/locales'\nimport { registerMenuTitles } from '#/locales/menuTitle'\nimport { registerViews, type ViewLoader } from '#/router/viewRegistry'\nimport { vAuth } from '#/directives/auth'\nimport { setupIcons } from '#/lib/icons'\nimport { reloadOnChunkError, reloadOnce } from '#/lib/chunkReload'\nimport { runtime, type BrandOptions } from '#/lib/runtime'\nimport { useSite } from '#/composables/useSite'\nimport { trimTrailingSlashes } from '#/utils/url'\n\n/**\n * 一个插件(或应用自身)能往内核里注册的东西。页面、语言包、图标这类文件集合由消费方在自己的代码里\n * 写 import.meta.glob、把结果交进来 —— 内核是预编译的包,自己扫不到消费方的文件。\n */\nexport interface SmartAdminPlugin {\n /** 页面表:`import.meta.glob('./views/**\\/*.vue')`。键取 `/views/` 之后去掉 .vue(如 system/user/index),同名覆盖先注册者。 */\n views?: Record<string, ViewLoader>\n /** 语言包:`import.meta.glob('./locales/ext/*\\/*.ts', { eager: true })`,键尾形如 `<locale>/<命名空间>.ts`,按命名空间深合并。 */\n locales?: Record<string, ExtModule>\n /** 布局壳之外的顶级静态路由(整屏看板、独立打印页等)。 */\n routes?: RouteRecordRaw[]\n /** 菜单 path → i18n key(存量库菜单标题是中文时用)。 */\n menuTitles?: Record<string, string>\n /** 本地 SVG 图标:`import.meta.glob('./assets/svg/*.svg', { query: '?raw', import: 'default', eager: true })`。 */\n icons?: Record<string, string>\n /** 离线图标子集:`smart-admin-icons` 从自己的 src 生成的 JSON(模板里是 npm run gen:icons),启动时同步注册。 */\n iconSets?: IconifyJSON[]\n /** 需要 app 实例的注册动作(registerHeaderTool / registerMenuBadge / 自己的 app.use 等),在 mount 前调用。 */\n install?: (app: App) => void\n}\n\nexport interface SmartAdminOptions extends SmartAdminPlugin {\n /** 插件按顺序注册,后者覆盖前者;应用自身(本对象的 views/locales 等)最后注册,优先级最高。 */\n plugins?: SmartAdminPlugin[]\n /** API 根地址;默认空串 = 同源。跨源时后端还要配 SmartAdmin:Api:Cors:AllowedOrigins。 */\n apiBase?: string\n /** 登录页页脚展示的版本号;默认内核版本。 */\n version?: string\n /** 开发态(登录页预填超管账号、设置抽屉「复制配置」);消费方传 import.meta.env.DEV。 */\n dev?: boolean\n /** 品牌默认值:sys.site.* 配置有值时以配置为准,为空时用这里。 */\n brand?: BrandOptions\n /** SmartTable 全局默认。 */\n table?: { density?: 'comfortable' | 'compact'; pageSizes?: number[] }\n}\n\nexport interface SmartAdminApp {\n app: App\n router: typeof router\n pinia: Pinia\n i18n: typeof i18n\n /** 挂载到选择器或元素;返回 Vue app 实例。 */\n mount: (target: string | Element) => App\n}\n\n/**\n * 组装内核应用:写入运行期配置 → 并入插件与应用的页面/文案/路由/图标 → 建 pinia/router/i18n → 返回可挂载的 app。\n * 按 内核内置 < 插件(按数组顺序)< 应用自身 的顺序注册,同 key 后者覆盖前者。结果与后端相同(应用压过内核),\n * 机制相反:后端 TryAdd 是消费方先注册者胜。\n */\nexport function createSmartAdmin(options: SmartAdminOptions = {}): SmartAdminApp {\n // apiBase 写入即生效:各处客户端在下一次调用时按新地址重建(见 api/client.ts 的 followApiBase)\n runtime.apiBase = trimTrailingSlashes(options.apiBase ?? '')\n if (options.version) runtime.version = options.version\n runtime.dev = !!options.dev\n runtime.brand = options.brand ?? {}\n if (options.brand?.title) useSite().site.title = options.brand.title\n\n const layers: SmartAdminPlugin[] = [...(options.plugins ?? []), options]\n const icons: Record<string, string> = {}\n const iconSets: IconifyJSON[] = []\n for (const layer of layers) {\n if (layer.views) registerViews(layer.views)\n if (layer.locales) registerLocales(layer.locales)\n if (layer.menuTitles) registerMenuTitles(layer.menuTitles)\n if (layer.icons) Object.assign(icons, layer.icons)\n if (layer.iconSets) iconSets.push(...layer.iconSets)\n for (const route of layer.routes ?? []) router.addRoute(route)\n }\n setupIcons(icons, iconSets) // 注册离线图标集(ph 子集同步入库)+ 本地 SVG,不预热整集\n\n // 全局兜底:没有这两个监听的话,未捕获异常和发版后旧 chunk 404 都是白屏,控制台之外不留痕迹。\n // 渲染期异常由内容区的 ErrorBoundary 收口,这里管它够不着的两类:游离的 Promise 拒绝与预加载失败。\n window.addEventListener('unhandledrejection', e => {\n if (reloadOnChunkError(e.reason)) e.preventDefault()\n })\n // Vite 预加载新 chunk 失败时派发;能走到这个事件就一定是 chunk 问题,不必再判文案。\n window.addEventListener('vite:preloadError', e => {\n if (reloadOnce()) e.preventDefault()\n })\n\n const pinia = createPinia()\n pinia.use(piniaPluginPersistedstate)\n\n const app = createApp(AppRoot)\n app.use(pinia) // 必须在 router 之前:守卫用到 store\n // 深浅色默认 themeScheme:'auto' → 首访自动跟随系统,用户手选 light/dark 后固定(见 stores/app.ts)。\n app.use(router)\n app.use(i18n)\n app.directive('auth', vAuth)\n app.config.errorHandler = (err, _instance, info) => {\n if (reloadOnChunkError(err)) return\n console.error('[SmartAdmin] 未捕获异常', info, err)\n }\n\n // SmartTable 全局默认:labels 一次注入,各页面不用手传 :labels(切语言即时生效)。\n // 只能在这里注入一次:Vue 的 inject 取最近的 provide、不合并 —— 在 App.vue 或任何祖先组件里\n // 再 provide 一次 SMART_TABLE_DEFAULTS,会把这里的 labels/density 整份挡掉。要加默认值就往下面这个对象里加。\n app.provide(\n SMART_TABLE_DEFAULTS,\n createSmartTableDefaults({\n // 表格工具栏密度默认使用紧凑档;已有 storage-key 的用户选择仍按本地缓存优先。\n density: options.table?.density ?? 'compact',\n // 内置兜底是 [10,20,50],后台列表动辄上千行,翻页翻不过来。\n // 上限 200:内核 Api:MaxPageSize 的默认值,选更大的后端会回 48001。\n // 注意 SmartTable 的**初始**每页条数走 default-page-size prop(不在这份可注入的 defaults 里),\n // 没传那个 prop 的页面初始仍是 10,条数选择器会显示一个不在列表里的值。\n pageSizes: options.table?.pageSizes ?? [20, 50, 100, 200],\n labels: computed(() => {\n void i18n.global.locale.value // 触发 locale 依赖收集\n const t = i18n.global.t\n return {\n search: t('common.search'),\n reset: t('common.reset'),\n refresh: t('table.refresh'),\n density: t('app.density'),\n densityComfortable: t('app.comfortable'),\n densityCompact: t('app.compact'),\n columnSettings: t('table.columnSettings'),\n columnSettingsReset: t('table.columnSettingsReset'),\n fixedLeft: t('table.fixedLeft'),\n fixedRight: t('table.fixedRight'),\n fixedNone: t('table.fixedNone'),\n expand: t('table.expand'),\n collapse: t('table.collapse'),\n }\n }),\n }),\n )\n\n for (const layer of layers) layer.install?.(app)\n\n return {\n app,\n router,\n pinia,\n i18n,\n mount: target => {\n app.mount(target)\n return app\n },\n }\n}\n"],"names":["createSmartAdmin","options","runtime","trimTrailingSlashes","_a","useSite","layers","icons","iconSets","layer","registerViews","registerLocales","registerMenuTitles","route","router","setupIcons","reloadOnChunkError","reloadOnce","pinia","createPinia","piniaPluginPersistedstate","app","createApp","AppRoot","i18n","vAuth","err","_instance","info","SMART_TABLE_DEFAULTS","createSmartTableDefaults","_b","_c","computed","t","_d","target"],"mappings":"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"}
1
+ {"version":3,"file":"createSmartAdmin.js","sources":["../src/createSmartAdmin.ts"],"sourcesContent":["import { computed, createApp, type App } from 'vue'\nimport { createPinia, type Pinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\nimport type { RouteRecordRaw } from 'vue-router'\nimport {\n SMART_TABLE_DEFAULTS,\n createSmartTableDefaults,\n defaultLabels,\n zhCNLabels,\n type FilterSerializer,\n} from 'smart-naive-table'\nimport type { IconifyJSON } from 'smart-naive-icon'\nimport AppRoot from '#/App.vue'\nimport { router } from '#/router'\nimport { i18n, registerLocales, type ExtModule } from '#/locales'\nimport { registerMenuTitles } from '#/locales/menuTitle'\nimport { KERNEL_MENU_TITLES } from '#/locales/kernelMenuTitles'\nimport { registerViews, type ViewLoader } from '#/router/viewRegistry'\nimport { vAuth } from '#/directives/auth'\nimport { setupIcons } from '#/lib/icons'\nimport { reloadOnChunkError, reloadOnce } from '#/lib/chunkReload'\nimport { runtime, type BrandOptions } from '#/lib/runtime'\nimport { useSite } from '#/composables/useSite'\nimport { flatFilterSerializer } from '#/utils/tableFilter'\nimport { trimTrailingSlashes } from '#/utils/url'\n\n/**\n * 一个插件(或应用自身)能往内核里注册的东西。页面、语言包、图标这类文件集合由消费方在自己的代码里\n * 写 import.meta.glob、把结果交进来 —— 内核是预编译的包,自己扫不到消费方的文件。\n */\nexport interface SmartAdminPlugin {\n /** 页面表:`import.meta.glob('./views/**\\/*.vue')`。键取 `/views/` 之后去掉 .vue(如 system/user/index),同名覆盖先注册者。 */\n views?: Record<string, ViewLoader>\n /** 语言包:`import.meta.glob('./locales/ext/*\\/*.ts', { eager: true })`,键尾形如 `<locale>/<命名空间>.ts`,按命名空间深合并。 */\n locales?: Record<string, ExtModule>\n /** 布局壳之外的顶级静态路由(整屏看板、独立打印页等)。 */\n routes?: RouteRecordRaw[]\n /** 菜单标题 → i18n key(存量库菜单标题是中文时用):键以 / 开头按路由 path 登记,其余按标题原文登记。内核种子标题已自带。 */\n menuTitles?: Record<string, string>\n /** 本地 SVG 图标:`import.meta.glob('./assets/svg/*.svg', { query: '?raw', import: 'default', eager: true })`。 */\n icons?: Record<string, string>\n /** 离线图标子集:`smart-admin-icons` 从自己的 src 生成的 JSON(模板里是 npm run gen:icons),启动时同步注册。 */\n iconSets?: IconifyJSON[]\n /** 需要 app 实例的注册动作(registerHeaderTool / registerMenuBadge / 自己的 app.use 等),在 mount 前调用。 */\n install?: (app: App) => void\n}\n\nexport interface SmartAdminOptions extends SmartAdminPlugin {\n /** 插件按顺序注册,后者覆盖前者;应用自身(本对象的 views/locales 等)最后注册,优先级最高。 */\n plugins?: SmartAdminPlugin[]\n /** API 根地址;默认空串 = 同源。跨源时后端还要配 SmartAdmin:Api:Cors:AllowedOrigins。 */\n apiBase?: string\n /** 登录页页脚展示的版本号;默认内核版本。 */\n version?: string\n /** 开发态(登录页预填超管账号、设置抽屉「复制配置」);消费方传 import.meta.env.DEV。 */\n dev?: boolean\n /** 品牌默认值:sys.site.* 配置有值时以配置为准,为空时用这里。 */\n brand?: BrandOptions\n /**\n * SmartTable 全局默认。\n * `filterSerializer`:条件构造器 / 表头过滤的过滤态 → 请求参数。内核默认用 `flatFilterSerializer`\n * (只翻后端真正支持的那一小撮条件,摊平成扁平参数,见 utils/tableFilter.ts)。\n * 应用的后端已经实现了 3.0 默认的 `filters` 协议(`[{ field, logic, conditions }]`)时,传 `defaultFilterSerializer`\n * (从 smart-naive-table 导入)即可保持原样;自定义形状就传自己的函数。\n */\n table?: {\n density?: 'comfortable' | 'compact'\n pageSizes?: number[]\n filterSerializer?: FilterSerializer\n /** 所有数据列默认可拖拽列宽。内核默认 true;设 false 全局关掉,单列用列上的 `resizable` 覆盖。 */\n resizable?: boolean\n }\n}\n\nexport interface SmartAdminApp {\n app: App\n router: typeof router\n pinia: Pinia\n i18n: typeof i18n\n /** 挂载到选择器或元素;返回 Vue app 实例。 */\n mount: (target: string | Element) => App\n}\n\n/**\n * 组装内核应用:写入运行期配置 → 并入插件与应用的页面/文案/路由/图标 → 建 pinia/router/i18n → 返回可挂载的 app。\n * 按 内核内置 < 插件(按数组顺序)< 应用自身 的顺序注册,同 key 后者覆盖前者。结果与后端相同(应用压过内核),\n * 机制相反:后端 TryAdd 是消费方先注册者胜。\n */\nexport function createSmartAdmin(options: SmartAdminOptions = {}): SmartAdminApp {\n // apiBase 写入即生效:各处客户端在下一次调用时按新地址重建(见 api/client.ts 的 followApiBase)\n runtime.apiBase = trimTrailingSlashes(options.apiBase ?? '')\n if (options.version) runtime.version = options.version\n runtime.dev = !!options.dev\n runtime.brand = options.brand ?? {}\n if (options.brand?.title) useSite().site.title = options.brand.title\n\n // 内核种子菜单 / 应用标题的译名表垫在最底层:库里存的是中文标题,不登记的话侧栏在英文下仍是中文。\n registerMenuTitles(KERNEL_MENU_TITLES)\n const layers: SmartAdminPlugin[] = [...(options.plugins ?? []), options]\n const icons: Record<string, string> = {}\n const iconSets: IconifyJSON[] = []\n for (const layer of layers) {\n if (layer.views) registerViews(layer.views)\n if (layer.locales) registerLocales(layer.locales)\n if (layer.menuTitles) registerMenuTitles(layer.menuTitles)\n if (layer.icons) Object.assign(icons, layer.icons)\n if (layer.iconSets) iconSets.push(...layer.iconSets)\n for (const route of layer.routes ?? []) router.addRoute(route)\n }\n setupIcons(icons, iconSets) // 注册离线图标集(ph 子集同步入库)+ 本地 SVG,不预热整集\n\n // 全局兜底:没有这两个监听的话,未捕获异常和发版后旧 chunk 404 都是白屏,控制台之外不留痕迹。\n // 渲染期异常由内容区的 ErrorBoundary 收口,这里管它够不着的两类:游离的 Promise 拒绝与预加载失败。\n window.addEventListener('unhandledrejection', e => {\n if (reloadOnChunkError(e.reason)) e.preventDefault()\n })\n // Vite 预加载新 chunk 失败时派发;能走到这个事件就一定是 chunk 问题,不必再判文案。\n window.addEventListener('vite:preloadError', e => {\n if (reloadOnce()) e.preventDefault()\n })\n\n const pinia = createPinia()\n pinia.use(piniaPluginPersistedstate)\n\n const app = createApp(AppRoot)\n app.use(pinia) // 必须在 router 之前:守卫用到 store\n // 深浅色默认 themeScheme:'auto' → 首访自动跟随系统,用户手选 light/dark 后固定(见 stores/app.ts)。\n app.use(router)\n app.use(i18n)\n app.directive('auth', vAuth)\n app.config.errorHandler = (err, _instance, info) => {\n if (reloadOnChunkError(err)) return\n console.error('[SmartAdmin] 未捕获异常', info, err)\n }\n\n // SmartTable 全局默认:labels 一次注入,各页面不用手传 :labels(切语言即时生效)。\n // 只能在这里注入一次:Vue 的 inject 取最近的 provide、不合并 —— 在 App.vue 或任何祖先组件里\n // 再 provide 一次 SMART_TABLE_DEFAULTS,会把这里的 labels/density 整份挡掉。要加默认值就往下面这个对象里加。\n app.provide(\n SMART_TABLE_DEFAULTS,\n createSmartTableDefaults({\n // 表格工具栏密度默认使用紧凑档;已有 storage-key 的用户选择仍按本地缓存优先。\n density: options.table?.density ?? 'compact',\n // 初始每页条数。它在可注入的 defaults 里(smart-naive-table 3.0 及以上),页面不用各写 :default-page-size。\n defaultPageSize: 100,\n // 列宽拖拽全站统一开:表头右缘拖动改宽,宽度跟着 storage-key 记忆。库内置默认是 false;\n // 某列不想让拖(操作列、序号列)在列上写 resizable: false,列上的值永远优先于这里。\n resizable: options.table?.resizable ?? true,\n // 当前行(activeRowKey)高亮:指向选中态令牌(强调色淡底,跟强调色与明暗走),不用库默认的主色 9%。\n // 库用 background-image 叠色、不覆盖行底色,所以半透明的令牌值也不会让固定列透底。\n activeRowBg: 'var(--sel-bg)',\n // 可选条数不手写,交给 smart-naive-table 3.0 按 fillHeight 选档:没开 [100,500,1000],开了 [100,1000,10000]。\n // 上限是后端 SmartAdmin:Api:MaxPageSize,默认 10000;应用把它调小的话,要用 table.pageSizes\n // 把这里的档位也压下去,否则用户选到超限档会被后端回 48001。undefined 不会覆盖内置档位。\n pageSizes: options.table?.pageSizes,\n // 条件构造器的过滤态 → 后端扁平参数(见 utils/tableFilter.ts);有日期区间或改名需求的页面传自己的 :filter-serializer\n filterSerializer: options.table?.filterSerializer ?? flatFilterSerializer,\n labels: computed(() => {\n const locale = i18n.global.locale.value // 触发 locale 依赖收集\n const t = i18n.global.t\n return {\n // 底子用 3.0 自带的整套文案(含条件构造器、批量栏等新键),再叠上项目 i18n 里已有的几个键。\n ...(locale.startsWith('zh') ? zhCNLabels : defaultLabels),\n search: t('common.search'),\n reset: t('common.reset'),\n refresh: t('table.refresh'),\n density: t('app.density'),\n densityComfortable: t('app.comfortable'),\n densityCompact: t('app.compact'),\n columnSettings: t('table.columnSettings'),\n columnSettingsReset: t('table.columnSettingsReset'),\n fixedLeft: t('table.fixedLeft'),\n fixedRight: t('table.fixedRight'),\n fixedNone: t('table.fixedNone'),\n expand: t('table.expand'),\n collapse: t('table.collapse'),\n }\n }),\n }),\n )\n\n for (const layer of layers) layer.install?.(app)\n\n return {\n app,\n router,\n pinia,\n i18n,\n mount: target => {\n app.mount(target)\n return app\n },\n }\n}\n"],"names":["createSmartAdmin","options","runtime","trimTrailingSlashes","_a","useSite","registerMenuTitles","KERNEL_MENU_TITLES","layers","icons","iconSets","layer","registerViews","registerLocales","route","router","setupIcons","reloadOnChunkError","reloadOnce","pinia","createPinia","piniaPluginPersistedstate","app","createApp","AppRoot","i18n","vAuth","err","_instance","info","SMART_TABLE_DEFAULTS","createSmartTableDefaults","_b","_c","_d","_e","flatFilterSerializer","computed","locale","zhCNLabels","defaultLabels","_f","target"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -34,9 +34,10 @@ export { noticeActionButtonType, useNoticeAction } from './composables/useNotice
34
34
  export { usePageTitle } from './composables/usePageTitle';
35
35
  export { noticeBus, onRealtime, beginVoluntaryLogout, useRealtime, type RealtimeHandler, } from './composables/useRealtime';
36
36
  export { loadSite, useSite, type SiteInfo } from './composables/useSite';
37
- export { DRAG_HANDLE_CLASS, useTableRowSort, type TableRowSortOptions, } from './composables/useTableRowSort';
38
37
  export { useTableZoom } from './composables/useTableZoom';
39
38
  export { useTabTitle } from './composables/useTabTitle';
39
+ export { useTableTitle } from './composables/useTableTitle';
40
+ export { useShellBreakpoint } from './composables/useShellBreakpoint';
40
41
  export { useTheme } from './composables/useTheme';
41
42
  export { useVisualViewportHeight } from './composables/useVisualViewportHeight';
42
43
  export { default as ApiSelect } from './components/ApiSelect/index.vue';
@@ -63,8 +64,8 @@ export { default as MarkdownView } from './components/MarkdownEditor/MarkdownVie
63
64
  export { default as OrgTreeSelect } from './components/OrgTreeSelect/index.vue';
64
65
  export { default as PasswordStrength } from './components/PasswordStrength/index.vue';
65
66
  export { default as RoleSelect } from './components/RoleSelect/index.vue';
66
- export { default as SelectTable } from './components/SelectTable/index.vue';
67
67
  export { default as StatusSwitch } from './components/StatusSwitch/index.vue';
68
+ export { default as TableTotal } from './components/TableTotal/index.vue';
68
69
  export { default as TableZoomButton } from './components/TableZoomButton/index.vue';
69
70
  export { default as UserPicker } from './components/UserPicker/index.vue';
70
71
  export { default as UserSelect } from './components/UserSelect/index.vue';
@@ -78,6 +79,8 @@ export * from './utils/error';
78
79
  export * from './utils/format';
79
80
  export * from './utils/importDup';
80
81
  export * from './utils/oauthBrand';
82
+ export * from './utils/tableFilter';
83
+ export * from './utils/tableToolbar';
81
84
  export * from './utils/tree';
82
85
  export * from './utils/ua';
83
86
  export * from './utils/url';