smart-admin-web 10.15.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 (432) hide show
  1. package/README.md +1 -1
  2. package/dist/api/index.d.ts +4 -2
  3. package/dist/api/index.js +1 -1
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +39 -5
  6. package/dist/assets/icons/ph-subset.json.js +5 -5
  7. package/dist/components/AppIcon.vue.js +9 -9
  8. package/dist/components/AppIcon.vue.js.map +1 -1
  9. package/dist/components/AppWatermark.vue.d.ts +14 -0
  10. package/dist/components/AppWatermark.vue.js +38 -0
  11. package/dist/components/AppWatermark.vue.js.map +1 -0
  12. package/dist/components/AppWatermark2.vue.js +5 -0
  13. package/dist/components/AppWatermark2.vue.js.map +1 -0
  14. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  15. package/dist/components/Chart/echarts.js +15 -20
  16. package/dist/components/Chart/echarts.js.map +1 -1
  17. package/dist/components/CronEditor/index.vue.js +1 -1
  18. package/dist/components/CronEditor/index2.vue.js +2 -1
  19. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  20. package/dist/components/DetailPage/index.vue.js +2 -2
  21. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  22. package/dist/components/DictTag/index.vue.js.map +1 -1
  23. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  24. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  25. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  26. package/dist/components/FormContainer/index.vue.js +91 -56
  27. package/dist/components/FormContainer/index.vue.js.map +1 -1
  28. package/dist/components/ImportWizard/index.vue.js +1 -1
  29. package/dist/components/ImportWizard/index2.vue.js +44 -41
  30. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  31. package/dist/components/MenuSearch.vue.js +2 -2
  32. package/dist/components/MenuSearch2.vue.js +19 -18
  33. package/dist/components/MenuSearch2.vue.js.map +1 -1
  34. package/dist/components/PasswordStrength/index.vue.js +2 -2
  35. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  36. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  37. package/dist/components/TableTotal/index.vue.d.ts +6 -0
  38. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  39. package/dist/components/TableTotal/index2.vue.js +16 -0
  40. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  41. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  42. package/dist/components/UserPicker/index.vue.js +2 -2
  43. package/dist/components/UserPicker/index2.vue.js +176 -117
  44. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  45. package/dist/composables/useBatchDelete.js.map +1 -1
  46. package/dist/composables/useLayoutMenu.js +17 -16
  47. package/dist/composables/useLayoutMenu.js.map +1 -1
  48. package/dist/composables/useModule.js +39 -29
  49. package/dist/composables/useModule.js.map +1 -1
  50. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  51. package/dist/composables/useShellBreakpoint.js +37 -0
  52. package/dist/composables/useShellBreakpoint.js.map +1 -0
  53. package/dist/composables/useSite.d.ts +15 -0
  54. package/dist/composables/useSite.js +16 -14
  55. package/dist/composables/useSite.js.map +1 -1
  56. package/dist/composables/useTabTitle.js.map +1 -1
  57. package/dist/composables/useTableTitle.d.ts +6 -0
  58. package/dist/composables/useTableTitle.js +11 -0
  59. package/dist/composables/useTableTitle.js.map +1 -0
  60. package/dist/composables/useTableZoom.d.ts +5 -0
  61. package/dist/composables/useTableZoom.js.map +1 -1
  62. package/dist/composables/useTheme.d.ts +2 -2
  63. package/dist/composables/useTheme.js +23 -20
  64. package/dist/composables/useTheme.js.map +1 -1
  65. package/dist/createSmartAdmin.d.ts +12 -2
  66. package/dist/createSmartAdmin.js +72 -60
  67. package/dist/createSmartAdmin.js.map +1 -1
  68. package/dist/index.d.ts +5 -2
  69. package/dist/index.js +219 -205
  70. package/dist/index.js.map +1 -1
  71. package/dist/layouts/AccentPicker.vue.js +8 -0
  72. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  73. package/dist/layouts/AccentPicker2.vue.js +131 -0
  74. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  75. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  76. package/dist/layouts/AppHeader.vue.js +2 -2
  77. package/dist/layouts/AppHeader2.vue.js +317 -235
  78. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  79. package/dist/layouts/NoticeBell.vue.js +2 -2
  80. package/dist/layouts/NoticeBell2.vue.js +1 -1
  81. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  82. package/dist/layouts/PersonalLayout.vue.js +2 -2
  83. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  84. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  85. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  86. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  87. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  88. package/dist/layouts/TabsBar.vue.js +2 -2
  89. package/dist/layouts/TabsBar2.vue.js +97 -69
  90. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  91. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  92. package/dist/layouts/components/SideNav.vue.js +1 -1
  93. package/dist/layouts/components/SideNav2.vue.js +54 -26
  94. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  95. package/dist/layouts/default.vue.js +1 -1
  96. package/dist/layouts/default2.vue.js +170 -140
  97. package/dist/layouts/default2.vue.js.map +1 -1
  98. package/dist/lib/loginHero.d.ts +2 -2
  99. package/dist/lib/loginHero.js.map +1 -1
  100. package/dist/lib/runtime.js +1 -1
  101. package/dist/lib/watermark.d.ts +110 -0
  102. package/dist/lib/watermark.js +151 -0
  103. package/dist/lib/watermark.js.map +1 -0
  104. package/dist/locales/en-US.d.ts +221 -15
  105. package/dist/locales/en-US.js +230 -21
  106. package/dist/locales/en-US.js.map +1 -1
  107. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  108. package/dist/locales/kernelMenuTitles.js +128 -0
  109. package/dist/locales/kernelMenuTitles.js.map +1 -0
  110. package/dist/locales/menuTitle.d.ts +3 -0
  111. package/dist/locales/menuTitle.js +14 -12
  112. package/dist/locales/menuTitle.js.map +1 -1
  113. package/dist/locales/zh-CN.d.ts +221 -15
  114. package/dist/locales/zh-CN.js +238 -28
  115. package/dist/locales/zh-CN.js.map +1 -1
  116. package/dist/router/index.js +41 -32
  117. package/dist/router/index.js.map +1 -1
  118. package/dist/router/namedPage.d.ts +4 -0
  119. package/dist/router/namedPage.js +7 -7
  120. package/dist/router/namedPage.js.map +1 -1
  121. package/dist/router/viewRegistry.js +8 -8
  122. package/dist/router/viewRegistry.js.map +1 -1
  123. package/dist/stores/app.d.ts +0 -12
  124. package/dist/stores/app.js +11 -12
  125. package/dist/stores/app.js.map +1 -1
  126. package/dist/stores/tabs.js.map +1 -1
  127. package/dist/stores/user.d.ts +10 -0
  128. package/dist/stores/user.js.map +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/theme/accentTokens.d.ts +27 -0
  131. package/dist/theme/accentTokens.js +54 -0
  132. package/dist/theme/accentTokens.js.map +1 -0
  133. package/dist/theme/accents.d.ts +21 -1
  134. package/dist/theme/accents.js +11 -2
  135. package/dist/theme/accents.js.map +1 -1
  136. package/dist/theme/mix.d.ts +58 -7
  137. package/dist/theme/mix.js +115 -30
  138. package/dist/theme/mix.js.map +1 -1
  139. package/dist/theme/naive-theme.d.ts +5 -2
  140. package/dist/theme/naive-theme.js +405 -75
  141. package/dist/theme/naive-theme.js.map +1 -1
  142. package/dist/utils/jwt.d.ts +8 -0
  143. package/dist/utils/jwt.js +14 -0
  144. package/dist/utils/jwt.js.map +1 -0
  145. package/dist/utils/menuIcon.d.ts +2 -0
  146. package/dist/utils/menuIcon.js +8 -0
  147. package/dist/utils/menuIcon.js.map +1 -0
  148. package/dist/utils/oauthBrand.js.map +1 -1
  149. package/dist/utils/tableFilter.d.ts +88 -0
  150. package/dist/utils/tableFilter.js +116 -0
  151. package/dist/utils/tableFilter.js.map +1 -0
  152. package/dist/utils/tableToolbar.d.ts +18 -0
  153. package/dist/utils/tableToolbar.js +11 -0
  154. package/dist/utils/tableToolbar.js.map +1 -0
  155. package/dist/utils/treeFilter.d.ts +20 -0
  156. package/dist/utils/treeFilter.js +24 -0
  157. package/dist/utils/treeFilter.js.map +1 -0
  158. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  159. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  160. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  161. package/dist/views/dashboard/biz.vue.js +1 -1
  162. package/dist/views/dashboard/biz2.vue.js +310 -257
  163. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  164. package/dist/views/dashboard/workbench.vue.js +2 -2
  165. package/dist/views/dashboard/workbench2.vue.js +141 -155
  166. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  167. package/dist/views/embed/iframe.vue.js +2 -2
  168. package/dist/views/embed/iframe2.vue.js +22 -15
  169. package/dist/views/embed/iframe2.vue.js.map +1 -1
  170. package/dist/views/error/404.vue.js +2 -2
  171. package/dist/views/error/4042.vue.js +33 -24
  172. package/dist/views/error/4042.vue.js.map +1 -1
  173. package/dist/views/error/BootError.vue.js +1 -1
  174. package/dist/views/error/BootError2.vue.js +59 -48
  175. package/dist/views/error/BootError2.vue.js.map +1 -1
  176. package/dist/views/error/MissingRoute.vue.js +2 -2
  177. package/dist/views/error/MissingRoute2.vue.js +34 -15
  178. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  179. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  180. package/dist/views/login/LoginForm.vue.js +2 -2
  181. package/dist/views/login/LoginForm2.vue.js +580 -488
  182. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  183. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  184. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  185. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  186. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  187. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  188. package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
  189. package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
  190. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  191. package/dist/views/login/index.vue.js +1 -1
  192. package/dist/views/login/index2.vue.js +141 -71
  193. package/dist/views/login/index2.vue.js.map +1 -1
  194. package/dist/views/login/layout.d.ts +11 -0
  195. package/dist/views/login/layout.js +27 -0
  196. package/dist/views/login/layout.js.map +1 -0
  197. package/dist/views/mfa/index.vue.js +2 -2
  198. package/dist/views/mfa/index2.vue.js +367 -321
  199. package/dist/views/mfa/index2.vue.js.map +1 -1
  200. package/dist/views/module/index.vue.js +2 -2
  201. package/dist/views/module/index2.vue.js +132 -99
  202. package/dist/views/module/index2.vue.js.map +1 -1
  203. package/dist/views/oauth/callback.vue.js +2 -2
  204. package/dist/views/oauth/callback2.vue.js +65 -51
  205. package/dist/views/oauth/callback2.vue.js.map +1 -1
  206. package/dist/views/personal/bindings.vue.js +2 -2
  207. package/dist/views/personal/bindings2.vue.js +98 -94
  208. package/dist/views/personal/bindings2.vue.js.map +1 -1
  209. package/dist/views/personal/notice2.vue.js +103 -76
  210. package/dist/views/personal/notice2.vue.js.map +1 -1
  211. package/dist/views/personal/password2.vue.js +47 -40
  212. package/dist/views/personal/password2.vue.js.map +1 -1
  213. package/dist/views/personal/profile.vue.js +3 -3
  214. package/dist/views/personal/profile2.vue.js +24 -18
  215. package/dist/views/personal/profile2.vue.js.map +1 -1
  216. package/dist/views/personal/security.vue.js +2 -2
  217. package/dist/views/personal/security2.vue.js +65 -53
  218. package/dist/views/personal/security2.vue.js.map +1 -1
  219. package/dist/views/personal/sessions.vue.js +2 -2
  220. package/dist/views/personal/sessions2.vue.js +67 -62
  221. package/dist/views/personal/sessions2.vue.js.map +1 -1
  222. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  223. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  224. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  225. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  226. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  227. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  228. package/dist/views/system/ai-model/index.vue.js +2 -2
  229. package/dist/views/system/ai-model/index2.vue.js +99 -99
  230. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  231. package/dist/views/system/ai-model/presets.d.ts +1 -1
  232. package/dist/views/system/ai-model/presets.js +18 -18
  233. package/dist/views/system/ai-model/presets.js.map +1 -1
  234. package/dist/views/system/ai-usage/index.vue.js +2 -2
  235. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  236. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  237. package/dist/views/system/api-docs/index.vue.js +5 -2
  238. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  239. package/dist/views/system/api-docs/index2.vue.js +92 -42
  240. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  241. package/dist/views/system/cache/index.vue.js +2 -2
  242. package/dist/views/system/cache/index2.vue.js +74 -80
  243. package/dist/views/system/cache/index2.vue.js.map +1 -1
  244. package/dist/views/system/config/components/AdminMock.vue.js +2 -2
  245. package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
  246. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
  247. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
  248. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
  249. package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
  250. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  251. package/dist/views/system/config/components/BrandSection.vue.js +2 -2
  252. package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
  253. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
  254. package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
  255. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
  256. package/dist/views/system/config/components/CfgRow.vue.js +1 -1
  257. package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
  258. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
  259. package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
  260. package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
  261. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
  262. package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
  263. package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
  264. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  265. package/dist/views/system/config/components/JobSection.vue.js +2 -2
  266. package/dist/views/system/config/components/JobSection2.vue.js +46 -44
  267. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
  268. package/dist/views/system/config/components/LoginMock.vue.js +3 -3
  269. package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
  270. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
  272. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
  273. package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
  274. package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
  275. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
  276. package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
  277. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
  278. package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
  279. package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
  280. package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
  281. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
  282. package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
  283. package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
  284. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
  285. package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
  286. package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
  287. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
  288. package/dist/views/system/config/components/UploadSection.vue.js +2 -2
  289. package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
  290. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
  291. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  292. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  293. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  294. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  295. package/dist/views/system/config/draft.d.ts +2 -2
  296. package/dist/views/system/config/draft.js.map +1 -1
  297. package/dist/views/system/config/groups.d.ts +4 -1
  298. package/dist/views/system/config/groups.js +54 -49
  299. package/dist/views/system/config/groups.js.map +1 -1
  300. package/dist/views/system/config/index.vue.js +3 -2
  301. package/dist/views/system/config/index.vue.js.map +1 -1
  302. package/dist/views/system/config/index2.vue.js +173 -148
  303. package/dist/views/system/config/index2.vue.js.map +1 -1
  304. package/dist/views/system/config/layoutMode.d.ts +23 -0
  305. package/dist/views/system/config/layoutMode.js +28 -0
  306. package/dist/views/system/config/layoutMode.js.map +1 -0
  307. package/dist/views/system/dict/index.vue.js +2 -2
  308. package/dist/views/system/dict/index2.vue.js +471 -366
  309. package/dist/views/system/dict/index2.vue.js.map +1 -1
  310. package/dist/views/system/file/index2.vue.js +91 -76
  311. package/dist/views/system/file/index2.vue.js.map +1 -1
  312. package/dist/views/system/job/index.vue.js +3 -3
  313. package/dist/views/system/job/index2.vue.js +897 -828
  314. package/dist/views/system/job/index2.vue.js.map +1 -1
  315. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  316. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  317. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  318. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  319. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  320. package/dist/views/system/job-log/index.vue.js +2 -2
  321. package/dist/views/system/job-log/index2.vue.js +193 -207
  322. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  323. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  324. package/dist/views/system/job-log/runStatus.js +26 -0
  325. package/dist/views/system/job-log/runStatus.js.map +1 -0
  326. package/dist/views/system/job-monitor/index.vue.js +2 -2
  327. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  328. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  329. package/dist/views/system/log/exception/index.vue.js +2 -2
  330. package/dist/views/system/log/exception/index2.vue.js +135 -96
  331. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  332. package/dist/views/system/log/login/index2.vue.js +62 -41
  333. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  334. package/dist/views/system/log/op/index.vue.js +2 -2
  335. package/dist/views/system/log/op/index2.vue.js +200 -162
  336. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  337. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  338. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  339. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  340. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  341. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  342. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  343. package/dist/views/system/menu/index.vue.js +1 -1
  344. package/dist/views/system/menu/index2.vue.js +216 -183
  345. package/dist/views/system/menu/index2.vue.js.map +1 -1
  346. package/dist/views/system/module/index.vue.js +1 -1
  347. package/dist/views/system/module/index2.vue.js +177 -144
  348. package/dist/views/system/module/index2.vue.js.map +1 -1
  349. package/dist/views/system/monitor/index.vue.js +2 -2
  350. package/dist/views/system/monitor/index2.vue.js +134 -149
  351. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  352. package/dist/views/system/notice/index.vue.js +1 -1
  353. package/dist/views/system/notice/index2.vue.js +209 -181
  354. package/dist/views/system/notice/index2.vue.js.map +1 -1
  355. package/dist/views/system/org/index.vue.js +1 -1
  356. package/dist/views/system/org/index2.vue.js +278 -248
  357. package/dist/views/system/org/index2.vue.js.map +1 -1
  358. package/dist/views/system/position/index.vue.js +5 -2
  359. package/dist/views/system/position/index.vue.js.map +1 -1
  360. package/dist/views/system/position/index2.vue.js +128 -92
  361. package/dist/views/system/position/index2.vue.js.map +1 -1
  362. package/dist/views/system/recycle/index.vue.js +2 -2
  363. package/dist/views/system/recycle/index2.vue.js +90 -67
  364. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  365. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  366. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  367. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  368. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  369. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  370. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  371. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  372. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  373. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  374. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  375. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  376. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  377. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  378. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  379. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  380. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  381. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  382. package/dist/views/system/role/index.vue.js +5 -2
  383. package/dist/views/system/role/index.vue.js.map +1 -1
  384. package/dist/views/system/role/index2.vue.js +181 -165
  385. package/dist/views/system/role/index2.vue.js.map +1 -1
  386. package/dist/views/system/session/index2.vue.js +75 -49
  387. package/dist/views/system/session/index2.vue.js.map +1 -1
  388. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  389. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  390. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  391. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  392. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  393. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  394. package/dist/views/system/user/index.vue.js +2 -2
  395. package/dist/views/system/user/index2.vue.js +362 -275
  396. package/dist/views/system/user/index2.vue.js.map +1 -1
  397. package/package.json +3 -5
  398. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  399. package/dist/components/SelectTable/index2.vue.js +0 -256
  400. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  401. package/dist/composables/useTableRowSort.d.ts +0 -20
  402. package/dist/composables/useTableRowSort.js +0 -59
  403. package/dist/composables/useTableRowSort.js.map +0 -1
  404. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  405. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  406. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  407. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  408. package/dist/layouts/SettingRow.vue.d.ts +0 -16
  409. package/dist/layouts/SettingRow.vue.js +0 -8
  410. package/dist/layouts/SettingRow.vue.js.map +0 -1
  411. package/dist/layouts/SettingRow2.vue.js +0 -23
  412. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  413. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  414. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  415. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  416. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  417. package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
  418. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  419. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  420. package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
  421. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  422. package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
  423. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  424. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  425. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  426. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  427. package/dist/views/login/skins.d.ts +0 -8
  428. package/dist/views/login/skins.js +0 -13
  429. package/dist/views/login/skins.js.map +0 -1
  430. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  431. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  432. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsDrawer2.vue.js","sources":["../../src/layouts/SettingsDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n NDrawer,\n NDrawerContent,\n NTabs,\n NTabPane,\n NDivider,\n NRadioGroup,\n NRadioButton,\n NColorPicker,\n NSwitch,\n NSelect,\n NInput,\n NPopconfirm,\n NButton,\n} from 'naive-ui'\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useMessage } from 'naive-ui'\nimport { useWindowSize, useClipboard } from '@vueuse/core'\nimport { useAppStore } from '#/stores/app'\nimport { ACCENTS } from '#/theme/accents'\nimport { runtime } from '#/lib/runtime'\nimport SettingRow from './SettingRow.vue'\nimport LayoutModeCards from './LayoutModeCards.vue'\n\nconst show = defineModel<boolean>('show', { default: false })\nconst app = useAppStore()\nconst { t } = useI18n()\nconst message = useMessage()\nconst { copy, isSupported } = useClipboard()\n// 「复制配置」是给内核开发者改 stores/app.ts 的 DEFAULTS 用的开发期动作,不该出现在终端管理员的设置里——仅开发态显示。\nconst showCopyConfig = isSupported && runtime.dev\n\n// 复制当前外观配置(内核开发者粘回 stores/app.ts 的 DEFAULTS 即为新默认)。\nasync function copyConfig() {\n await copy(JSON.stringify(app.exportSettings(), null, 2))\n message.success(t('settings.configCopied'))\n}\n\n// 窄屏不溢出:抽屉宽度取 min(400, 90vw)。加宽给布局卡片两列留出余量。\nconst { width } = useWindowSize()\nconst drawerWidth = computed(() => Math.min(400, Math.round(width.value * 0.9)))\n\n// computed:t() 一次求值不随语言切换更新,故包 computed 让下拉标签跟随 locale。\nconst transitionOptions = computed(() => [\n { label: t('settings.transitionNone'), value: 'none' },\n { label: t('settings.transitionFade'), value: 'fade' },\n { label: t('settings.transitionFadeSlide'), value: 'fade-slide' },\n])\n</script>\n\n<template>\n <n-drawer v-model:show=\"show\" :width=\"drawerWidth\" placement=\"right\">\n <n-drawer-content :title=\"t('settings.title')\" closable :native-scrollbar=\"false\">\n <n-tabs type=\"segment\" size=\"small\" animated class=\"tabs\">\n <!-- 外观 -->\n <n-tab-pane name=\"appearance\" :tab=\"t('settings.tabAppearance')\">\n <n-divider title-placement=\"left\">{{ t('settings.themeMode') }}</n-divider>\n <n-radio-group v-model:value=\"app.themeScheme\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"light\">\n <Icon icon=\"ph:sun\" class=\"ri\" />\n {{ t('app.light') }}\n </n-radio-button>\n <n-radio-button value=\"dark\">\n <Icon icon=\"ph:moon-stars\" class=\"ri\" />\n {{ t('app.dark') }}\n </n-radio-button>\n <n-radio-button value=\"auto\">\n <Icon icon=\"ph:circle-half\" class=\"ri\" />\n {{ t('settings.auto') }}\n </n-radio-button>\n </n-radio-group>\n\n <n-divider title-placement=\"left\">{{ t('settings.themeColor') }}</n-divider>\n <div class=\"accents\">\n <button\n v-for=\"c in ACCENTS\"\n :key=\"c\"\n type=\"button\"\n class=\"dot\"\n :class=\"{ on: app.accent === c }\"\n :style=\"{ background: c }\"\n :aria-label=\"`${t('settings.themeColor')} ${c}`\"\n :aria-pressed=\"app.accent === c\"\n @click=\"app.setAccent(c)\"\n >\n <Icon v-if=\"app.accent === c\" icon=\"ph:check-bold\" class=\"tick\" />\n </button>\n </div>\n <n-color-picker\n :value=\"app.accent\"\n :modes=\"['hex']\"\n :show-alpha=\"false\"\n :swatches=\"[...ACCENTS]\"\n @update:value=\"app.setAccent\"\n />\n\n <n-divider title-placement=\"left\">{{ t('app.density') }}</n-divider>\n <n-radio-group v-model:value=\"app.density\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"comfortable\">{{ t('app.comfortable') }}</n-radio-button>\n <n-radio-button value=\"compact\">{{ t('app.compact') }}</n-radio-button>\n </n-radio-group>\n </n-tab-pane>\n\n <!-- 布局 -->\n <n-tab-pane name=\"layout\" :tab=\"t('settings.tabLayout')\">\n <n-divider title-placement=\"left\">{{ t('settings.layout') }}</n-divider>\n <LayoutModeCards />\n\n <n-divider title-placement=\"left\">{{ t('settings.interface') }}</n-divider>\n <SettingRow :label=\"t('settings.showBreadcrumb')\">\n <n-switch v-model:value=\"app.showBreadcrumb\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.showTabs')\">\n <n-switch v-model:value=\"app.showTabs\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.fixedHeader')\">\n <n-switch v-model:value=\"app.fixedHeader\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.pageTransition')\">\n <n-select\n v-model:value=\"app.pageTransition\"\n :options=\"transitionOptions\"\n size=\"small\"\n style=\"width: 120px\"\n />\n </SettingRow>\n <SettingRow :label=\"t('settings.grayscale')\">\n <n-switch v-model:value=\"app.grayscale\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('app.collapse')\">\n <n-switch v-model:value=\"app.collapsed\" size=\"small\" />\n </SettingRow>\n </n-tab-pane>\n\n <!-- 通用 -->\n <n-tab-pane name=\"general\" :tab=\"t('settings.tabGeneral')\">\n <n-divider title-placement=\"left\">{{ t('settings.watermark') }}</n-divider>\n <SettingRow :label=\"t('settings.watermark')\">\n <n-switch v-model:value=\"app.watermark\" size=\"small\" />\n </SettingRow>\n <SettingRow v-if=\"app.watermark\" :label=\"t('settings.watermarkText')\">\n <n-input\n v-model:value=\"app.watermarkText\"\n size=\"small\"\n :placeholder=\"t('settings.watermarkPlaceholder')\"\n style=\"width: 140px\"\n />\n </SettingRow>\n\n <n-divider title-placement=\"left\">{{ t('settings.formStyle') }}</n-divider>\n <!-- FormContainer 全局形态:所有 CRUD 表单弹层一键在弹窗/抽屉间切换 -->\n <n-radio-group v-model:value=\"app.formStyle\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"modal\">{{ t('settings.formStyleModal') }}</n-radio-button>\n <n-radio-button value=\"drawer\">{{ t('settings.formStyleDrawer') }}</n-radio-button>\n </n-radio-group>\n </n-tab-pane>\n </n-tabs>\n\n <template #footer>\n <div class=\"footer-actions\">\n <n-button v-if=\"showCopyConfig\" block tertiary @click=\"copyConfig\">\n <Icon icon=\"ph:clipboard-text\" class=\"ri\" />\n {{ t('settings.copyConfig') }}\n </n-button>\n <n-popconfirm @positive-click=\"app.resetSettings()\">\n <template #trigger>\n <n-button block secondary>\n <Icon icon=\"ph:arrow-counter-clockwise\" class=\"ri\" />\n {{ t('common.reset') }}\n </n-button>\n </template>\n {{ t('settings.resetConfirm') }}\n </n-popconfirm>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.tabs {\n height: 100%;\n}\n.footer-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n}\n.ri {\n margin-right: 5px;\n font-size: 15px;\n}\n\n/* 满宽三等分分段控件(主题模式 / 密度) */\n.seg {\n display: flex;\n width: 100%;\n}\n.seg :deep(.n-radio-button) {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 精致色板 */\n.accents {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 10px;\n margin-bottom: 12px;\n}\n.dot {\n position: relative;\n width: 100%;\n max-width: 30px;\n margin: 0 auto;\n aspect-ratio: 1;\n padding: 0;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n transform 0.15s ease,\n box-shadow 0.15s ease;\n}\n.dot:hover {\n transform: scale(1.12);\n}\n.dot.on {\n transform: scale(1.1);\n box-shadow:\n 0 0 0 2px var(--color-bg-container),\n 0 0 0 4px var(--color-primary);\n}\n.tick {\n color: #fff;\n font-size: 14px;\n filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.35));\n}\n</style>\n"],"names":["show","_useModel","__props","app","useAppStore","t","useI18n","message","useMessage","copy","isSupported","useClipboard","showCopyConfig","runtime","copyConfig","width","useWindowSize","drawerWidth","computed","transitionOptions","_createBlock","_unref","NDrawer","$event","_createVNode","NDrawerContent","_createElementVNode","_hoisted_3","NButton","Icon","_createTextVNode","NPopconfirm","_cache","NTabs","NTabPane","NDivider","NRadioGroup","NRadioButton","_hoisted_1","_createElementBlock","_Fragment","_renderList","ACCENTS","c","NColorPicker","LayoutModeCards","SettingRow","NSwitch","NSelect","NInput"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsDrawer2.vue.js","sources":["../../src/layouts/SettingsDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 外观抽屉:外观模式 / 强调色 / 密度 / 布局(下拉) / 界面,一页滚完,不分页签——\n// 页签里套分段控件(外观模式本身就是分段控件)是两层同形的东西叠在一起。\n// 模式 / 页内切换用 NTabs type=\"segment\"(轨道 + 滑块,和 macOS 的外观切换同一种控件),\n// 不用 NRadioGroup + NRadioButton(那是描边按钮组,只用在筛选类取值上)。\nimport {\n NDrawer,\n NDrawerContent,\n NTabs,\n NTab,\n NList,\n NListItem,\n NSwitch,\n NSelect,\n NPopconfirm,\n NButton,\n} from 'naive-ui'\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useMessage } from 'naive-ui'\nimport { useClipboard } from '@vueuse/core'\nimport { useAppStore, LAYOUT_MODES, type LayoutMode } from '#/stores/app'\nimport { runtime } from '#/lib/runtime'\nimport AccentPicker from './AccentPicker.vue'\n\nconst show = defineModel<boolean>('show', { default: false })\nconst app = useAppStore()\nconst { t } = useI18n()\nconst message = useMessage()\nconst { copy, isSupported } = useClipboard()\n// 「复制配置」是给内核开发者改 stores/app.ts 的 DEFAULTS 用的开发期动作,不该出现在终端管理员的设置里——仅开发态显示。\nconst showCopyConfig = isSupported && runtime.dev\n\n// 复制当前外观配置(内核开发者粘回 stores/app.ts 的 DEFAULTS 即为新默认)。\nasync function copyConfig() {\n await copy(JSON.stringify(app.exportSettings(), null, 2))\n message.success(t('settings.configCopied'))\n}\n\n// 布局:下拉选六种 layoutMode,六种变体一个都不能少。\n// 标签键由模式名派生:vertical-mix → settings.layoutVerticalMix。\nconst layoutOptions = computed(() =>\n LAYOUT_MODES.map(m => ({\n label: t(\n 'settings.layout' +\n m\n .split('-')\n .map(w => w[0]!.toUpperCase() + w.slice(1))\n .join(''),\n ),\n value: m,\n })),\n)\n\n// computed:t() 一次求值不随语言切换更新,故包 computed 让下拉标签跟随 locale。\nconst transitionOptions = computed(() => [\n { label: t('settings.transitionNone'), value: 'none' },\n { label: t('settings.transitionFade'), value: 'fade' },\n { label: t('settings.transitionFadeSlide'), value: 'fade-slide' },\n])\n</script>\n\n<template>\n <n-drawer v-model:show=\"show\" width=\"min(360px, 100vw)\" placement=\"right\">\n <n-drawer-content :title=\"t('app.appearance')\" closable :native-scrollbar=\"false\">\n <div class=\"section-title first\">{{ t('settings.themeMode') }}</div>\n <n-tabs v-model:value=\"app.themeScheme\" type=\"segment\">\n <n-tab name=\"light\">{{ t('app.light') }}</n-tab>\n <n-tab name=\"dark\">{{ t('app.dark') }}</n-tab>\n <n-tab name=\"auto\">{{ t('settings.auto') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.themeColor') }}</div>\n <AccentPicker />\n\n <div class=\"section-title\">{{ t('app.density') }}</div>\n <n-tabs v-model:value=\"app.density\" type=\"segment\">\n <n-tab name=\"comfortable\">{{ t('app.comfortable') }}</n-tab>\n <n-tab name=\"compact\">{{ t('app.compact') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.layout') }}</div>\n <n-select\n :value=\"app.layoutMode\"\n :options=\"layoutOptions\"\n @update:value=\"(v: LayoutMode) => app.setLayoutMode(v)\"\n />\n\n <div class=\"section-title\">{{ t('settings.formStyle') }}</div>\n <!-- FormContainer 全局形态:所有 CRUD 表单一键在弹窗 / 抽屉间切换(个别页面按实例写死的除外) -->\n <n-tabs v-model:value=\"app.formStyle\" type=\"segment\">\n <n-tab name=\"modal\">{{ t('settings.formStyleModal') }}</n-tab>\n <n-tab name=\"drawer\">{{ t('settings.formStyleDrawer') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.interface') }}</div>\n <n-list class=\"set-group\" hoverable :bordered=\"false\" :show-divider=\"false\">\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:caret-double-right\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.showBreadcrumb') }}</b>\n <span>{{ t('settings.descBreadcrumb') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.showBreadcrumb\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:browsers\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.showTabs') }}</b>\n <span>{{ t('settings.descTabs') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.showTabs\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:push-pin\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.fixedHeader') }}</b>\n <span>{{ t('settings.descFixedHeader') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.fixedHeader\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:sidebar-simple\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('app.collapse') }}</b>\n <span>{{ t('settings.descCollapse') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.collapsed\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:sparkle\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.pageTransition') }}</b>\n <span>{{ t('settings.descPageTransition') }}</span>\n </div>\n <template #suffix>\n <n-select\n v-model:value=\"app.pageTransition\"\n :options=\"transitionOptions\"\n size=\"small\"\n class=\"sel\"\n />\n </template>\n </n-list-item>\n </n-list>\n\n <template #footer>\n <div class=\"footer-actions\">\n <n-button v-if=\"showCopyConfig\" block secondary @click=\"copyConfig\">\n <template #icon><Icon icon=\"ph:clipboard-text\" :width=\"16\" /></template>\n {{ t('settings.copyConfig') }}\n </n-button>\n <n-popconfirm @positive-click=\"app.resetSettings()\">\n <template #trigger>\n <n-button block secondary>\n <template #icon><Icon icon=\"ph:arrow-counter-clockwise\" :width=\"16\" /></template>\n {{ t('common.reset') }}\n </n-button>\n </template>\n {{ t('settings.resetConfirm') }}\n </n-popconfirm>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.footer-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n}\n\n/* 分节标题走正文字体、正常字距:等宽 + 大写 + 宽字距是只对拉丁字母成立的手法,落在汉字上会把「界面」撑成「界 面」 */\n.section-title {\n margin: 22px 0 8px 4px;\n font-size: var(--font-size-base);\n font-weight: 500;\n letter-spacing: -0.01em;\n color: var(--text-3);\n}\n.section-title.first {\n margin-top: 0;\n}\n\n/* 设置组:不用 NCard embedded(那块平灰底和整站玻璃语言无关,四行加粗标签配四个同权开关像一张通用设置表)。\n 玻璃底 + 行首单色图标 + 标题下一行说明把权重压开。分隔线关掉 NList 自带的通栏 show-divider,\n 自己从文字起始处起、右边留白地画,悬停时淡出——macOS 系统设置的做法。 */\n.set-group.n-list {\n border-radius: 14px;\n background: var(--glass);\n box-shadow:\n inset 0 0 0 1px var(--hairline),\n inset 0 1px 0 var(--edge-light);\n}\n.set-group :deep(.n-list-item) {\n position: relative;\n padding: 10px 12px !important;\n border-radius: var(--radius-lg);\n}\n.set-group :deep(.n-list-item + .n-list-item::before) {\n content: '';\n position: absolute;\n left: 52px;\n right: 12px;\n top: 0;\n height: 1px;\n background: var(--separator);\n transition: opacity var(--transition-fast);\n}\n.set-group :deep(.n-list-item:hover::before),\n.set-group :deep(.n-list-item:hover + .n-list-item::before) {\n opacity: 0;\n}\n.sym {\n display: grid;\n place-items: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: var(--radius-sm);\n background: var(--glass-strong);\n color: var(--text-1);\n box-shadow:\n inset 0 0 0 1px var(--hairline),\n inset 0 1px 0 var(--edge-light);\n}\n.txt b {\n display: block;\n font-size: var(--font-size-md);\n font-weight: 500;\n line-height: 1.3;\n}\n.txt span {\n display: block;\n margin-top: 2px;\n font-size: var(--font-size-sm);\n line-height: 1.4;\n color: var(--text-3);\n}\n.sel {\n width: 112px;\n}\n</style>\n"],"names":["show","_useModel","__props","app","useAppStore","t","useI18n","message","useMessage","copy","isSupported","useClipboard","showCopyConfig","runtime","copyConfig","layoutOptions","computed","LAYOUT_MODES","w","transitionOptions","_createBlock","_unref","NDrawer","$event","_createVNode","NDrawerContent","_createElementVNode","_hoisted_17","NButton","Icon","_createTextVNode","NPopconfirm","_cache","_hoisted_1","_toDisplayString","NTabs","NTab","_hoisted_2","AccentPicker","_hoisted_3","_hoisted_4","NSelect","v","_hoisted_5","_hoisted_6","NList","NListItem","_hoisted_7","NSwitch","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./TabsBar2.vue.js";
2
2
  /* empty css */
3
3
  import a from "../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ a(o, [["__scopeId", "data-v-8fc6542a"]]);
4
+ const f = /* @__PURE__ */ a(o, [["__scopeId", "data-v-06aee79f"]]);
5
5
  export {
6
- m as default
6
+ f as default
7
7
  };
8
8
  //# sourceMappingURL=TabsBar.vue.js.map
@@ -1,40 +1,41 @@
1
- import { defineComponent as I, computed as _, ref as h, watch as V, nextTick as T, openBlock as c, createElementBlock as v, createVNode as g, unref as a, withCtx as z, createElementVNode as $, Fragment as D, renderList as L, withModifiers as p, withKeys as f, normalizeClass as M, createBlock as d, createCommentVNode as S, toDisplayString as O, h as P } from "vue";
2
- import { useRoute as E, useRouter as X } from "vue-router";
3
- import { NScrollbar as Y, NDropdown as q } from "naive-ui";
4
- import { Icon as x } from "@iconify/vue";
5
- import F from "../components/AppIcon.vue.js";
6
- import { useI18n as j } from "vue-i18n";
7
- import { useTabsStore as G } from "../stores/tabs.js";
8
- import { translateMenuTitle as H } from "../locales/menuTitle.js";
9
- const J = { class: "tabsbar" }, Q = ["onClick", "onKeydown", "onContextmenu", "onAuxclick"], U = { class: "chip-label" }, re = /* @__PURE__ */ I({
1
+ import { defineComponent as D, computed as B, ref as c, watch as N, nextTick as S, onMounted as V, onBeforeUnmount as Y, openBlock as h, createElementBlock as x, createElementVNode as M, normalizeClass as L, createVNode as z, TransitionGroup as X, withCtx as F, Fragment as q, renderList as G, unref as a, withModifiers as u, withKeys as v, createBlock as w, createCommentVNode as E, toDisplayString as U, h as j } from "vue";
2
+ import { useRoute as H, useRouter as J } from "vue-router";
3
+ import { NDropdown as Q } from "naive-ui";
4
+ import { Icon as k } from "@iconify/vue";
5
+ import Z from "../components/AppIcon.vue.js";
6
+ import { useI18n as ee } from "vue-i18n";
7
+ import { useTabsStore as te } from "../stores/tabs.js";
8
+ import { translateMenuTitle as ne } from "../locales/menuTitle.js";
9
+ import { lineIcon as oe } from "../utils/menuIcon.js";
10
+ const le = { class: "tabsbar" }, ae = ["title", "onClick", "onKeydown", "onContextmenu", "onAuxclick"], se = { class: "chip-label" }, me = /* @__PURE__ */ D({
10
11
  __name: "TabsBar",
11
- setup(W) {
12
- const n = G(), m = E(), R = X(), { t: s } = j(), w = _(() => m.path), k = h();
13
- function K(e) {
14
- return H(e.title, e.path);
12
+ setup(ie) {
13
+ const o = te(), y = H(), I = J(), { t: s } = ee(), C = B(() => y.path), i = c();
14
+ function g(e) {
15
+ return ne(e.title, e.path);
15
16
  }
16
17
  function b(e) {
17
- e.path !== m.path && R.push(e.fullPath);
18
+ e.path !== y.path && I.push(e.fullPath);
18
19
  }
19
20
  function r(e) {
20
- return () => P(x, { icon: e, width: 16 });
21
+ return () => j(k, { icon: e, width: 16 });
21
22
  }
22
- const u = h(!1), y = h(0), C = h(0), i = h(), N = _(() => {
23
- var e, t, o, l;
23
+ const d = c(!1), T = c(0), _ = c(0), p = c(), K = B(() => {
24
+ var e, t, n, l;
24
25
  return [
25
26
  { label: s("tabs.refresh"), key: "refresh", icon: r("ph:arrow-clockwise") },
26
27
  // 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。
27
28
  {
28
- label: (e = i.value) != null && e.pinned ? s("tabs.unpin") : s("tabs.pin"),
29
+ label: (e = p.value) != null && e.pinned ? s("tabs.unpin") : s("tabs.pin"),
29
30
  key: "pin",
30
31
  icon: r("ph:push-pin"),
31
- disabled: (t = i.value) == null ? void 0 : t.affix
32
+ disabled: (t = p.value) == null ? void 0 : t.affix
32
33
  },
33
34
  {
34
35
  label: s("tabs.close"),
35
36
  key: "close",
36
37
  icon: r("ph:x"),
37
- disabled: ((o = i.value) == null ? void 0 : o.affix) || ((l = i.value) == null ? void 0 : l.pinned)
38
+ disabled: ((n = p.value) == null ? void 0 : n.affix) || ((l = p.value) == null ? void 0 : l.pinned)
38
39
  },
39
40
  { label: s("tabs.closeOthers"), key: "others", icon: r("ph:arrows-in-line-horizontal") },
40
41
  { label: s("tabs.closeLeft"), key: "left", icon: r("ph:arrow-line-left") },
@@ -42,59 +43,84 @@ const J = { class: "tabsbar" }, Q = ["onClick", "onKeydown", "onContextmenu", "o
42
43
  { label: s("tabs.closeAll"), key: "all", icon: r("ph:list-dashes") }
43
44
  ];
44
45
  });
45
- function A(e, t) {
46
- e.preventDefault(), i.value = t, u.value = !1, T(() => {
47
- y.value = e.clientX, C.value = e.clientY, u.value = !0;
46
+ function O(e, t) {
47
+ e.preventDefault(), p.value = t, d.value = !1, S(() => {
48
+ T.value = e.clientX, _.value = e.clientY, d.value = !0;
48
49
  });
49
50
  }
50
- function B(e) {
51
- u.value = !1;
52
- const t = i.value;
53
- t && (e === "refresh" ? n.refreshTab(t.name) : e === "pin" ? n.togglePin(t.path) : e === "close" ? n.removeTab(t.path) : e === "others" ? n.closeOthers(t.path) : e === "left" ? n.closeLeft(t.path) : e === "right" ? n.closeRight(t.path) : e === "all" && n.closeAll());
51
+ function P(e) {
52
+ d.value = !1;
53
+ const t = p.value;
54
+ t && (e === "refresh" ? o.refreshTab(t.name) : e === "pin" ? o.togglePin(t.path) : e === "close" ? o.removeTab(t.path) : e === "others" ? o.closeOthers(t.path) : e === "left" ? o.closeLeft(t.path) : e === "right" ? o.closeRight(t.path) : e === "all" && o.closeAll());
54
55
  }
55
- return V(w, () => {
56
- T(
56
+ N(C, () => {
57
+ S(
57
58
  () => {
58
59
  var e, t;
59
- return (t = (e = k.value) == null ? void 0 : e.querySelector(".chip.active")) == null ? void 0 : t.scrollIntoView({ block: "nearest", inline: "nearest" });
60
+ return (t = (e = i.value) == null ? void 0 : e.querySelector(".chip.active")) == null ? void 0 : t.scrollIntoView({ block: "nearest", inline: "nearest" });
60
61
  }
61
62
  );
62
- }), (e, t) => (c(), v("div", J, [
63
- g(a(Y), { "x-scrollable": "" }, {
64
- default: z(() => [
65
- $("div", {
66
- ref_key: "stripRef",
67
- ref: k,
68
- class: "strip"
69
- }, [
70
- (c(!0), v(D, null, L(a(n).tabs, (o) => (c(), v("div", {
71
- key: o.path,
72
- class: M(["chip", { active: o.path === w.value }]),
63
+ });
64
+ const $ = c(!1), R = c(!1);
65
+ function m() {
66
+ const e = i.value;
67
+ e && ($.value = e.scrollLeft > 1, R.value = e.scrollLeft + e.clientWidth < e.scrollWidth - 1);
68
+ }
69
+ function W(e) {
70
+ const t = i.value;
71
+ !t || t.scrollWidth <= t.clientWidth || Math.abs(e.deltaY) <= Math.abs(e.deltaX) || (e.preventDefault(), t.scrollBy({ left: e.deltaY, behavior: "instant" }));
72
+ }
73
+ function A(e) {
74
+ e.style.setProperty("--chip-w", `${e.getBoundingClientRect().width}px`);
75
+ }
76
+ let f;
77
+ return V(() => {
78
+ var e;
79
+ m(), !(typeof ResizeObserver > "u") && (f = new ResizeObserver(m), i.value && f.observe(i.value), (e = i.value) != null && e.firstElementChild && f.observe(i.value.firstElementChild));
80
+ }), Y(() => f == null ? void 0 : f.disconnect()), (e, t) => (h(), x("div", le, [
81
+ M("div", {
82
+ ref_key: "scrollerRef",
83
+ ref: i,
84
+ class: L(["scroller", { "fade-start": $.value, "fade-end": R.value }]),
85
+ onScrollPassive: m,
86
+ onWheel: W
87
+ }, [
88
+ z(X, {
89
+ tag: "div",
90
+ name: "chip",
91
+ class: "strip",
92
+ onBeforeLeave: A
93
+ }, {
94
+ default: F(() => [
95
+ (h(!0), x(q, null, G(a(o).tabs, (n) => (h(), x("div", {
96
+ key: n.path,
97
+ class: L(["chip", { active: n.path === C.value, "chip--fixed": n.affix || n.pinned }]),
98
+ title: g(n),
73
99
  role: "button",
74
100
  tabindex: "0",
75
- onClick: (l) => b(o),
101
+ onClick: (l) => b(n),
76
102
  onKeydown: [
77
- f((l) => b(o), ["enter"]),
78
- f(p((l) => b(o), ["prevent"]), ["space"])
103
+ v((l) => b(n), ["enter"]),
104
+ v(u((l) => b(n), ["prevent"]), ["space"])
79
105
  ],
80
- onContextmenu: (l) => A(l, o),
81
- onMousedown: t[0] || (t[0] = p(() => {
106
+ onContextmenu: (l) => O(l, n),
107
+ onMousedown: t[1] || (t[1] = u(() => {
82
108
  }, ["middle", "prevent"])),
83
- onAuxclick: p((l) => a(n).removeTab(o.path), ["middle", "prevent"])
109
+ onAuxclick: u((l) => a(o).removeTab(n.path), ["middle", "prevent"])
84
110
  }, [
85
- o.icon ? (c(), d(F, {
111
+ n.icon ? (h(), w(Z, {
86
112
  key: 0,
87
- icon: o.icon,
113
+ icon: a(oe)(n.icon),
88
114
  size: 15,
89
115
  class: "chip-icon"
90
- }, null, 8, ["icon"])) : S("", !0),
91
- $("span", U, O(K(o)), 1),
92
- o.pinned ? (c(), d(a(x), {
116
+ }, null, 8, ["icon"])) : E("", !0),
117
+ M("span", se, U(g(n)), 1),
118
+ n.pinned ? (h(), w(a(k), {
93
119
  key: 1,
94
120
  icon: "ph:push-pin-fill",
95
121
  width: 12,
96
122
  class: "chip-pin"
97
- })) : o.affix ? S("", !0) : (c(), d(a(x), {
123
+ })) : n.affix ? E("", !0) : (h(), w(a(k), {
98
124
  key: 2,
99
125
  icon: "ph:x",
100
126
  width: 13,
@@ -102,31 +128,33 @@ const J = { class: "tabsbar" }, Q = ["onClick", "onKeydown", "onContextmenu", "o
102
128
  role: "button",
103
129
  tabindex: "0",
104
130
  "aria-label": a(s)("tabs.close"),
105
- onClick: p((l) => a(n).removeTab(o.path), ["stop"]),
131
+ onMousedown: t[0] || (t[0] = u(() => {
132
+ }, ["prevent"])),
133
+ onClick: u((l) => a(o).removeTab(n.path), ["stop"]),
106
134
  onKeydown: [
107
- f(p((l) => a(n).removeTab(o.path), ["stop"]), ["enter"]),
108
- f(p((l) => a(n).removeTab(o.path), ["stop", "prevent"]), ["space"])
135
+ v(u((l) => a(o).removeTab(n.path), ["stop"]), ["enter"]),
136
+ v(u((l) => a(o).removeTab(n.path), ["stop", "prevent"]), ["space"])
109
137
  ]
110
138
  }, null, 8, ["aria-label", "onClick", "onKeydown"]))
111
- ], 42, Q))), 128))
112
- ], 512)
113
- ]),
114
- _: 1
115
- }),
116
- g(a(q), {
139
+ ], 42, ae))), 128))
140
+ ]),
141
+ _: 1
142
+ })
143
+ ], 34),
144
+ z(a(Q), {
117
145
  trigger: "manual",
118
146
  placement: "bottom-start",
119
- show: u.value,
120
- x: y.value,
121
- y: C.value,
122
- options: N.value,
123
- onSelect: B,
124
- onClickoutside: t[1] || (t[1] = (o) => u.value = !1)
147
+ show: d.value,
148
+ x: T.value,
149
+ y: _.value,
150
+ options: K.value,
151
+ onSelect: P,
152
+ onClickoutside: t[2] || (t[2] = (n) => d.value = !1)
125
153
  }, null, 8, ["show", "x", "y", "options"])
126
154
  ]));
127
155
  }
128
156
  });
129
157
  export {
130
- re as default
158
+ me as default
131
159
  };
132
160
  //# sourceMappingURL=TabsBar2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabsBar2.vue.js","sources":["../../src/layouts/TabsBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { NDropdown, NScrollbar, type DropdownOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useTabsStore, type TabItem } from '#/stores/tabs'\nimport { translateMenuTitle } from '#/locales/menuTitle'\n\nconst tabs = useTabsStore()\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\n\nconst activePath = computed(() => route.path)\nconst stripRef = ref<HTMLElement>()\n\nfunction tabTitle(item: TabItem) {\n return translateMenuTitle(item.title, item.path)\n}\nfunction onClick(item: TabItem) {\n if (item.path !== route.path) router.push(item.fullPath)\n}\n\nfunction renderIcon(name: string) {\n return () => h(Icon, { icon: name, width: 16 })\n}\n\nconst ctxShow = ref(false)\nconst ctxX = ref(0)\nconst ctxY = ref(0)\nconst ctxTab = ref<TabItem>()\nconst ctxOptions = computed<DropdownOption[]>(() => [\n { label: t('tabs.refresh'), key: 'refresh', icon: renderIcon('ph:arrow-clockwise') },\n // 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。\n {\n label: ctxTab.value?.pinned ? t('tabs.unpin') : t('tabs.pin'),\n key: 'pin',\n icon: renderIcon('ph:push-pin'),\n disabled: ctxTab.value?.affix,\n },\n {\n label: t('tabs.close'),\n key: 'close',\n icon: renderIcon('ph:x'),\n disabled: ctxTab.value?.affix || ctxTab.value?.pinned,\n },\n { label: t('tabs.closeOthers'), key: 'others', icon: renderIcon('ph:arrows-in-line-horizontal') },\n { label: t('tabs.closeLeft'), key: 'left', icon: renderIcon('ph:arrow-line-left') },\n { label: t('tabs.closeRight'), key: 'right', icon: renderIcon('ph:arrow-line-right') },\n { label: t('tabs.closeAll'), key: 'all', icon: renderIcon('ph:list-dashes') },\n])\n\nfunction onContext(e: MouseEvent, item: TabItem) {\n e.preventDefault()\n ctxTab.value = item\n // 先关再于 nextTick 重开:菜单已展开时右键切到别的标签,只改坐标 NDropdown 不会重定位。\n ctxShow.value = false\n nextTick(() => {\n ctxX.value = e.clientX\n ctxY.value = e.clientY\n ctxShow.value = true\n })\n}\nfunction onCtxSelect(key: string) {\n ctxShow.value = false\n const tab = ctxTab.value\n if (!tab) return\n if (key === 'refresh') tabs.refreshTab(tab.name)\n else if (key === 'pin') tabs.togglePin(tab.path)\n else if (key === 'close') tabs.removeTab(tab.path)\n else if (key === 'others') tabs.closeOthers(tab.path)\n else if (key === 'left') tabs.closeLeft(tab.path)\n else if (key === 'right') tabs.closeRight(tab.path)\n else if (key === 'all') tabs.closeAll()\n}\n\n// 激活标签滚入视野\nwatch(activePath, () => {\n nextTick(() =>\n stripRef.value\n ?.querySelector('.chip.active')\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' }),\n )\n})\n</script>\n\n<template>\n <div class=\"tabsbar\">\n <n-scrollbar x-scrollable>\n <div ref=\"stripRef\" class=\"strip\">\n <!-- chip 与关闭 X 均为可点非按钮元素:补 role/tabindex/键盘激活,键盘用户也能切换/关闭标签(右键菜单是鼠标专属) -->\n <div\n v-for=\"item in tabs.tabs\"\n :key=\"item.path\"\n class=\"chip\"\n :class=\"{ active: item.path === activePath }\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"onClick(item)\"\n @keydown.enter=\"onClick(item)\"\n @keydown.space.prevent=\"onClick(item)\"\n @contextmenu=\"onContext($event, item)\"\n @mousedown.middle.prevent\n @auxclick.middle.prevent=\"tabs.removeTab(item.path)\"\n >\n <!-- 标签图标沿用菜单元数据,可能不在离线子集内 → 走 AppIcon 的懒加载兜底 -->\n <AppIcon v-if=\"item.icon\" :icon=\"item.icon\" :size=\"15\" class=\"chip-icon\" />\n <span class=\"chip-label\">{{ tabTitle(item) }}</span>\n <!-- 固定标签(用户 pin)显示图钉、不显示关闭 X;应用首页 affix 两者都不显示 -->\n <Icon v-if=\"item.pinned\" icon=\"ph:push-pin-fill\" :width=\"12\" class=\"chip-pin\" />\n <Icon\n v-else-if=\"!item.affix\"\n icon=\"ph:x\"\n :width=\"13\"\n class=\"chip-close\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('tabs.close')\"\n @click.stop=\"tabs.removeTab(item.path)\"\n @keydown.enter.stop=\"tabs.removeTab(item.path)\"\n @keydown.space.stop.prevent=\"tabs.removeTab(item.path)\"\n />\n </div>\n </div>\n </n-scrollbar>\n <n-dropdown\n trigger=\"manual\"\n placement=\"bottom-start\"\n :show=\"ctxShow\"\n :x=\"ctxX\"\n :y=\"ctxY\"\n :options=\"ctxOptions\"\n @select=\"onCtxSelect\"\n @clickoutside=\"ctxShow = false\"\n />\n </div>\n</template>\n\n<style scoped>\n.tabsbar {\n height: 42px;\n display: flex;\n align-items: center;\n padding: 0 8px;\n background: var(--color-bg-container);\n border-bottom: 1px solid var(--color-border);\n}\n.strip {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 0;\n}\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-fill);\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n color 0.15s,\n background 0.15s,\n border-color 0.15s;\n}\n.chip:hover {\n color: var(--color-text-primary);\n}\n.chip.active {\n background: var(--color-primary-light);\n border-color: var(--color-primary);\n color: var(--color-primary);\n}\n.chip:focus-visible,\n.chip-close:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 1px;\n}\n.chip-pin {\n opacity: 0.7;\n}\n.chip-close {\n border-radius: 50%;\n opacity: 0.6;\n}\n.chip-close:hover {\n opacity: 1;\n background: var(--color-fill);\n}\n</style>\n"],"names":["tabs","useTabsStore","route","useRoute","router","useRouter","t","useI18n","activePath","computed","stripRef","ref","tabTitle","item","translateMenuTitle","onClick","renderIcon","name","h","Icon","ctxShow","ctxX","ctxY","ctxTab","ctxOptions","_a","_b","_c","_d","onContext","nextTick","onCtxSelect","key","tab","watch","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NScrollbar","_createElementVNode","_Fragment","_renderList","$event","_withKeys","_withModifiers","_createBlock","AppIcon","_hoisted_3","_toDisplayString","NDropdown"],"mappings":"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"}
1
+ {"version":3,"file":"TabsBar2.vue.js","sources":["../../src/layouts/TabsBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { NDropdown, type DropdownOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useTabsStore, type TabItem } from '#/stores/tabs'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nimport { lineIcon } from '#/utils/menuIcon'\n\nconst tabs = useTabsStore()\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\n\nconst activePath = computed(() => route.path)\nconst scrollerRef = ref<HTMLElement>()\n\nfunction tabTitle(item: TabItem) {\n return translateMenuTitle(item.title, item.path)\n}\nfunction onClick(item: TabItem) {\n if (item.path !== route.path) router.push(item.fullPath)\n}\n\nfunction renderIcon(name: string) {\n return () => h(Icon, { icon: name, width: 16 })\n}\n\nconst ctxShow = ref(false)\nconst ctxX = ref(0)\nconst ctxY = ref(0)\nconst ctxTab = ref<TabItem>()\nconst ctxOptions = computed<DropdownOption[]>(() => [\n { label: t('tabs.refresh'), key: 'refresh', icon: renderIcon('ph:arrow-clockwise') },\n // 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。\n {\n label: ctxTab.value?.pinned ? t('tabs.unpin') : t('tabs.pin'),\n key: 'pin',\n icon: renderIcon('ph:push-pin'),\n disabled: ctxTab.value?.affix,\n },\n {\n label: t('tabs.close'),\n key: 'close',\n icon: renderIcon('ph:x'),\n disabled: ctxTab.value?.affix || ctxTab.value?.pinned,\n },\n { label: t('tabs.closeOthers'), key: 'others', icon: renderIcon('ph:arrows-in-line-horizontal') },\n { label: t('tabs.closeLeft'), key: 'left', icon: renderIcon('ph:arrow-line-left') },\n { label: t('tabs.closeRight'), key: 'right', icon: renderIcon('ph:arrow-line-right') },\n { label: t('tabs.closeAll'), key: 'all', icon: renderIcon('ph:list-dashes') },\n])\n\nfunction onContext(e: MouseEvent, item: TabItem) {\n e.preventDefault()\n ctxTab.value = item\n // 先关再于 nextTick 重开:菜单已展开时右键切到别的标签,只改坐标 NDropdown 不会重定位。\n ctxShow.value = false\n nextTick(() => {\n ctxX.value = e.clientX\n ctxY.value = e.clientY\n ctxShow.value = true\n })\n}\nfunction onCtxSelect(key: string) {\n ctxShow.value = false\n const tab = ctxTab.value\n if (!tab) return\n if (key === 'refresh') tabs.refreshTab(tab.name)\n else if (key === 'pin') tabs.togglePin(tab.path)\n else if (key === 'close') tabs.removeTab(tab.path)\n else if (key === 'others') tabs.closeOthers(tab.path)\n else if (key === 'left') tabs.closeLeft(tab.path)\n else if (key === 'right') tabs.closeRight(tab.path)\n else if (key === 'all') tabs.closeAll()\n}\n\n// 激活标签滚入视野\nwatch(activePath, () => {\n nextTick(() =>\n scrollerRef.value\n ?.querySelector('.chip.active')\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' }),\n )\n})\n\n// 页签溢出时两端各 18px 柔和渐隐(没有硬边):量滚动容器,哪一端还有内容就渐隐哪一端。\n// 滚动容器就是 scrollerRef 本身(原生滚动、滚动条隐藏:macOS 的滚动条是 overlay,静止时不可见)。\nconst fadeStart = ref(false)\nconst fadeEnd = ref(false)\nfunction measureFade() {\n const c = scrollerRef.value\n if (!c) return\n fadeStart.value = c.scrollLeft > 1\n fadeEnd.value = c.scrollLeft + c.clientWidth < c.scrollWidth - 1\n}\n// 没有滚动条可拖,鼠标滚轮的竖向滚动转成横向(触控板的横向手势 deltaX 浏览器自己处理)。\n// 没有溢出时不接管,免得吞掉本该给页面的滚轮。\nfunction onWheel(e: WheelEvent) {\n const c = scrollerRef.value\n if (!c || c.scrollWidth <= c.clientWidth || Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return\n e.preventDefault()\n c.scrollBy({ left: e.deltaY, behavior: 'instant' })\n}\n\n// 关页签:宽度收拢 + 淡出,右边的页签随之滑过来(Safari 关标签的做法)。\n// 收拢要从「当前宽度」起步,而页签宽度是 flex 算出来的,CSS 里没有现成值 → 离场前量一下,交给 CSS 变量。\nfunction onBeforeLeave(el: Element) {\n ;(el as HTMLElement).style.setProperty('--chip-w', `${el.getBoundingClientRect().width}px`)\n}\n\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n measureFade()\n if (typeof ResizeObserver === 'undefined') return\n ro = new ResizeObserver(measureFade)\n if (scrollerRef.value) ro.observe(scrollerRef.value)\n // 页签条本身(scroller 的唯一子元素):页签增删、收缩时它的宽度变,渐隐要跟着重量\n if (scrollerRef.value?.firstElementChild) ro.observe(scrollerRef.value.firstElementChild)\n})\nonBeforeUnmount(() => ro?.disconnect())\n</script>\n\n<template>\n <div class=\"tabsbar\">\n <div\n ref=\"scrollerRef\"\n class=\"scroller\"\n :class=\"{ 'fade-start': fadeStart, 'fade-end': fadeEnd }\"\n @scroll.passive=\"measureFade\"\n @wheel=\"onWheel\"\n >\n <transition-group tag=\"div\" name=\"chip\" class=\"strip\" @before-leave=\"onBeforeLeave\">\n <!-- chip 与关闭 X 均为可点非按钮元素:补 role/tabindex/键盘激活,键盘用户也能切换/关闭标签(右键菜单是鼠标专属) -->\n <div\n v-for=\"item in tabs.tabs\"\n :key=\"item.path\"\n class=\"chip\"\n :class=\"{ active: item.path === activePath, 'chip--fixed': item.affix || item.pinned }\"\n :title=\"tabTitle(item)\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"onClick(item)\"\n @keydown.enter=\"onClick(item)\"\n @keydown.space.prevent=\"onClick(item)\"\n @contextmenu=\"onContext($event, item)\"\n @mousedown.middle.prevent\n @auxclick.middle.prevent=\"tabs.removeTab(item.path)\"\n >\n <!-- 标签图标沿用菜单元数据,可能不在离线子集内 → 走 AppIcon 的懒加载兜底;统一线条款 -->\n <AppIcon v-if=\"item.icon\" :icon=\"lineIcon(item.icon)\" :size=\"15\" class=\"chip-icon\" />\n <span class=\"chip-label\">{{ tabTitle(item) }}</span>\n <!-- 固定标签(用户 pin)显示图钉、不显示关闭 X;应用首页 affix 两者都不显示 -->\n <Icon v-if=\"item.pinned\" icon=\"ph:push-pin-fill\" :width=\"12\" class=\"chip-pin\" />\n <Icon\n v-else-if=\"!item.affix\"\n icon=\"ph:x\"\n :width=\"13\"\n class=\"chip-close\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('tabs.close')\"\n @mousedown.prevent\n @click.stop=\"tabs.removeTab(item.path)\"\n @keydown.enter.stop=\"tabs.removeTab(item.path)\"\n @keydown.space.stop.prevent=\"tabs.removeTab(item.path)\"\n />\n </div>\n </transition-group>\n </div>\n <n-dropdown\n trigger=\"manual\"\n placement=\"bottom-start\"\n :show=\"ctxShow\"\n :x=\"ctxX\"\n :y=\"ctxY\"\n :options=\"ctxOptions\"\n @select=\"onCtxSelect\"\n @clickoutside=\"ctxShow = false\"\n />\n </div>\n</template>\n\n<style scoped>\n/* 页签条在顶栏玻璃面板里(default.vue 的 .shell-head),自己不画底、不画上下边线以外的东西;\n 右端不放刷新 / 页签操作按钮:那些操作都在右键菜单里。 */\n.tabsbar {\n height: 40px;\n display: flex;\n align-items: center;\n padding: 0 10px 0 12px;\n background: transparent;\n box-shadow: inset 0 1px 0 var(--hairline);\n}\n/* 原生滚动 + 隐藏滚动条:页签先收缩,收到最小宽度才溢出,溢出时靠两端渐隐暗示、滚轮 / 触控板横划。\n scroll-behavior: smooth 让激活页签滚入视野是一段缓动而不是跳变(系统开了减少动态效果时由全局规则压成瞬时)。 */\n.scroller {\n flex: 1;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scroll-behavior: smooth;\n scrollbar-width: none;\n}\n.scroller::-webkit-scrollbar {\n display: none;\n}\n.fade-start:not(.fade-end) {\n -webkit-mask-image: linear-gradient(to right, transparent 0, #000 18px);\n mask-image: linear-gradient(to right, transparent 0, #000 18px);\n}\n.fade-end:not(.fade-start) {\n -webkit-mask-image: linear-gradient(to left, transparent 0, #000 18px);\n mask-image: linear-gradient(to left, transparent 0, #000 18px);\n}\n.fade-start.fade-end {\n -webkit-mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 18px,\n #000 calc(100% - 18px),\n transparent 100%\n );\n mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 18px,\n #000 calc(100% - 18px),\n transparent 100%\n );\n}\n.strip {\n display: flex;\n align-items: center;\n width: 100%; /* 撑满容器才会触发页签收缩;页签少时靠左,各自保持自然宽度 */\n padding: 5px 0;\n}\n/* 未选中:带一点淡底(--fill),否则看起来像一排纯文字;选中:强调色淡底 + 强调色文字加粗,\n 无下划线、无描边、无发光。 */\n.chip {\n position: relative;\n display: inline-flex;\n margin-right: 4px; /* 不用 gap:关闭时间距要和页签一起收拢 */\n align-items: center;\n gap: 7px;\n flex: 0 1 auto; /* 可收缩:标题放不下就截断,收到 min-width 才轮到滚动 */\n min-width: 104px;\n max-width: 180px;\n height: 30px;\n padding: 0 11px;\n border: none;\n border-radius: var(--radius-md);\n background: var(--fill);\n color: var(--text-3);\n font-size: 14px;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n color var(--transition-fast),\n background-color var(--transition-fast);\n}\n.chip:hover {\n color: var(--text-1);\n background: var(--hover);\n}\n.chip.active {\n background: var(--tab-on-bg);\n color: var(--tab-on-fg);\n font-weight: 600;\n}\n.chip :deep(svg) {\n flex-shrink: 0;\n}\n.chip-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* 首页(affix)与用户固定的页签保持自然宽度,不参与收缩 */\n.chip--fixed {\n flex: none;\n min-width: 0;\n max-width: none;\n}\n/* 鼠标点击不画聚焦环:× 是带 border-radius:50% 的 svg,浏览器默认聚焦环会被圆角化成一个黑圈(关闭瞬间闪现);\n 键盘聚焦(:focus-visible)仍然画。点击 × 时另由 mousedown.prevent 阻止它抢焦点。 */\n.chip:focus:not(:focus-visible),\n.chip-close:focus:not(:focus-visible) {\n outline: none;\n}\n.chip:focus-visible,\n.chip-close:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: 1px;\n}\n.chip-pin {\n opacity: 0.7;\n}\n.chip-icon {\n transition: opacity var(--transition-fast);\n}\n.chip-close {\n border-radius: 50%;\n transition: opacity var(--transition-fast);\n}\n\n/* 桌面(有悬停):× 盖在左侧图标的位置上,悬停 / 键盘聚焦到页签时才出现(图标淡出让位),不占布局宽度。\n 这是 Safari 标签栏的做法:标题多得 20px,收缩后四个汉字的页签名仍放得下。\n 没有图标的页签没有可盖的位置,× 退回流内、仍只在悬停时出现。 */\n@media (hover: hover) {\n .chip-close {\n position: absolute;\n left: 12px;\n top: 50%;\n margin-top: -6.5px;\n opacity: 0;\n pointer-events: none;\n }\n .chip:hover .chip-close,\n .chip:focus-within .chip-close {\n opacity: 0.75;\n pointer-events: auto;\n }\n .chip:hover .chip-close:hover,\n .chip-close:focus-visible {\n opacity: 1;\n }\n .chip:hover .chip-icon,\n .chip:focus-within .chip-icon {\n opacity: 0;\n }\n .chip:not(:has(.chip-icon)) .chip-close {\n position: static;\n margin-top: 0;\n }\n}\n\n/* 触屏没有悬停:× 常显在右侧(仍占宽度),保证关得掉 */\n@media (hover: none) {\n .chip {\n padding-right: 8px;\n }\n .chip-close {\n opacity: 0.7;\n }\n}\n\n/* 页签增删:宽度 / 内边距 / 间距一起收拢或展开,右边的页签随布局平滑滑动(flex 实时重排,不需要 FLIP)。\n 曲线取 macOS 切换外观同款 ease-in-out;系统开了减少动态效果时由全局规则压成瞬时。 */\n.chip-enter-active,\n.chip-leave-active {\n overflow: hidden;\n transition-property:\n width, max-width, min-width, padding-left, padding-right, margin-right, opacity;\n transition-duration: 0.22s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.chip-enter-from {\n max-width: 0;\n min-width: 0;\n padding-left: 0;\n padding-right: 0;\n margin-right: 0;\n opacity: 0;\n}\n.chip-leave-active {\n flex: none;\n pointer-events: none;\n}\n.chip-leave-from {\n width: var(--chip-w);\n}\n.chip-leave-to {\n width: 0;\n min-width: 0;\n padding-left: 0;\n padding-right: 0;\n margin-right: 0;\n opacity: 0;\n}\n</style>\n"],"names":["tabs","useTabsStore","route","useRoute","router","useRouter","t","useI18n","activePath","computed","scrollerRef","ref","tabTitle","item","translateMenuTitle","onClick","renderIcon","name","h","Icon","ctxShow","ctxX","ctxY","ctxTab","ctxOptions","_a","_b","_c","_d","onContext","nextTick","onCtxSelect","key","tab","watch","fadeStart","fadeEnd","measureFade","c","onWheel","onBeforeLeave","el","ro","onMounted","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_createVNode","_TransitionGroup","_Fragment","_renderList","_unref","$event","_withKeys","_withModifiers","_createBlock","AppIcon","lineIcon","_hoisted_3","_toDisplayString","NDropdown"],"mappings":"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"}
@@ -5,10 +5,13 @@ type __VLS_Props = {
5
5
  collapsed?: boolean;
6
6
  rail?: boolean;
7
7
  showBrand?: boolean;
8
+ showSearch?: boolean;
8
9
  };
9
10
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
+ search: () => any;
10
12
  select: (key: string) => any;
11
13
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
14
+ onSearch?: (() => any) | undefined;
12
15
  onSelect?: ((key: string) => any) | undefined;
13
16
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
14
17
  declare const _default: typeof __VLS_export;
@@ -1,7 +1,7 @@
1
1
  import o from "./SideNav2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0b56822a"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0b541618"]]);
5
5
  export {
6
6
  p as default
7
7
  };
@@ -1,41 +1,69 @@
1
- import { defineComponent as c, openBlock as a, createElementBlock as s, normalizeClass as m, createVNode as o, withDirectives as u, createElementVNode as v, toDisplayString as f, unref as t, vShow as h, createCommentVNode as w, withCtx as B } from "vue";
2
- import { NScrollbar as _, NMenu as N } from "naive-ui";
3
- import S from "../../components/SmartLogo.vue.js";
4
- import { useSite as y } from "../../composables/useSite.js";
5
- const C = {
1
+ import { defineComponent as v, computed as f, openBlock as i, createElementBlock as r, normalizeClass as y, createVNode as s, withDirectives as w, createElementVNode as B, toDisplayString as S, unref as o, vShow as N, createCommentVNode as p, withKeys as _, withCtx as d } from "vue";
2
+ import { NInput as b, NScrollbar as g, NMenu as k } from "naive-ui";
3
+ import { Icon as z } from "@iconify/vue";
4
+ import { useI18n as C } from "vue-i18n";
5
+ import x from "../../components/SmartLogo.vue.js";
6
+ import { useSite as I } from "../../composables/useSite.js";
7
+ const V = {
6
8
  key: 0,
7
9
  class: "brand"
8
- }, z = /* @__PURE__ */ c({
10
+ }, D = {
11
+ key: 1,
12
+ class: "side-search"
13
+ }, j = /* @__PURE__ */ v({
9
14
  __name: "SideNav",
10
15
  props: {
11
16
  options: {},
12
17
  value: {},
13
18
  collapsed: { type: Boolean },
14
19
  rail: { type: Boolean },
15
- showBrand: { type: Boolean }
20
+ showBrand: { type: Boolean },
21
+ showSearch: { type: Boolean }
16
22
  },
17
- emits: ["select"],
18
- setup(n, { emit: i }) {
19
- const { site: r } = y(), e = n, p = i;
20
- return (b, l) => (a(), s("div", {
21
- class: m(["sidenav", { rail: e.rail }])
23
+ emits: ["select", "search"],
24
+ setup(m, { emit: u }) {
25
+ const { site: h } = I(), { t: c } = C(), e = m, l = u, t = f(() => e.collapsed || e.rail);
26
+ return (E, a) => (i(), r("div", {
27
+ class: y(["sidenav", { rail: e.rail, "icon-only": t.value }])
22
28
  }, [
23
- e.showBrand ? (a(), s("div", C, [
24
- o(S, { size: 30 }),
25
- u(v("span", { class: "brand-name" }, f(t(r).title), 513), [
26
- [h, !e.collapsed && !e.rail]
29
+ e.showBrand ? (i(), r("div", V, [
30
+ s(x, { size: 28 }),
31
+ w(B("span", { class: "brand-name" }, S(o(h).title), 513), [
32
+ [N, !t.value]
27
33
  ])
28
- ])) : w("", !0),
29
- o(t(_), null, {
30
- default: B(() => [
31
- o(t(N), {
34
+ ])) : p("", !0),
35
+ e.showSearch && !t.value ? (i(), r("div", D, [
36
+ s(o(b), {
37
+ size: "small",
38
+ readonly: "",
39
+ class: "search-input",
40
+ placeholder: o(c)("app.search"),
41
+ "aria-label": o(c)("app.search"),
42
+ onClick: a[0] || (a[0] = (n) => l("search")),
43
+ onKeydown: a[1] || (a[1] = _((n) => l("search"), ["enter"]))
44
+ }, {
45
+ prefix: d(() => [
46
+ s(o(z), {
47
+ icon: "ph:magnifying-glass",
48
+ width: 15,
49
+ class: "search-ico"
50
+ })
51
+ ]),
52
+ _: 1
53
+ }, 8, ["placeholder", "aria-label"])
54
+ ])) : p("", !0),
55
+ s(o(g), { class: "side-menu" }, {
56
+ default: d(() => [
57
+ s(o(k), {
32
58
  options: e.options,
33
59
  value: e.value,
34
- collapsed: e.collapsed || e.rail,
35
- "collapsed-width": e.rail ? 64 : 76,
36
- indent: 20,
37
- "root-indent": 20,
38
- "onUpdate:value": l[0] || (l[0] = (d) => p("select", d))
60
+ collapsed: t.value,
61
+ "collapsed-width": e.rail ? 64 : 68,
62
+ "collapsed-icon-size": 20,
63
+ "icon-size": 18,
64
+ indent: 14,
65
+ "root-indent": 14,
66
+ "onUpdate:value": a[2] || (a[2] = (n) => l("select", n))
39
67
  }, null, 8, ["options", "value", "collapsed", "collapsed-width"])
40
68
  ]),
41
69
  _: 1
@@ -44,6 +72,6 @@ const C = {
44
72
  }
45
73
  });
46
74
  export {
47
- z as default
75
+ j as default
48
76
  };
49
77
  //# sourceMappingURL=SideNav2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\nimport { NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n}>()\nconst emit = defineEmits<{ select: [key: string] }>()\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"30\" />\n <span v-show=\"!props.collapsed && !props.rail\" class=\"brand-name\">{{ site.title }}</span>\n </div>\n <n-scrollbar>\n <n-menu\n :options=\"props.options\"\n :value=\"props.value\"\n :collapsed=\"props.collapsed || props.rail\"\n :collapsed-width=\"props.rail ? 64 : 76\"\n :indent=\"20\"\n :root-indent=\"20\"\n @update:value=\"(k: string) => emit('select', k)\"\n />\n </n-scrollbar>\n </div>\n</template>\n\n<style scoped>\n.sidenav {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--color-bg-container);\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n height: var(--header-h);\n padding: 0 22px;\n color: var(--color-text-primary);\n font-weight: 600;\n overflow: hidden;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.rail .brand {\n padding: 0;\n justify-content: center;\n}\n.brand-name {\n font-size: 20px;\n font-weight: 700;\n color: var(--color-text-primary); /* 品牌文字跟随主题文字色:固定深蓝在暗色下看不清 */\n}\n.sidenav :deep(.n-scrollbar) {\n flex: 1;\n min-height: 0;\n}\n</style>\n"],"names":["site","useSite","props","__props","emit","__emit","_createElementBlock","_normalizeClass","_openBlock","_hoisted_1","_createVNode","SmartLogo","_withDirectives","_createElementVNode","_toDisplayString","_unref","_vShow","NScrollbar","NMenu","_cache","k"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,UAAM,EAAE,MAAAA,EAAA,IAASC,EAAA,GAEXC,IAAQC,GAORC,IAAOC;2BAIXC,EAgBM,OAAA;AAAA,MAhBD,OAAKC,EAAA,CAAC,WAAS,EAAA,MAAiBL,EAAM,MAAI,CAAA;AAAA,IAAA;MAClCA,EAAM,aAAjBM,EAAA,GAAAF,EAGM,OAHNG,GAGM;AAAA,QAFJC,EAAwBC,GAAA,EAAZ,MAAM,IAAE;AAAA,QACpBC,EAAAC,EAAyF,UAA1C,OAAM,aAAA,GAAYC,EAAIC,EAAAf,CAAA,EAAK,KAAK,GAAA,GAAA,GAAA;AAAA,UAAhE,CAAAgB,GAAA,CAAAd,EAAM,aAAS,CAAKA,EAAM,IAAI;AAAA,QAAA;;MAE/CQ,EAUcK,EAAAE,CAAA,GAAA,MAAA;AAAA,mBATZ,MAQE;AAAA,UARFP,EAQEK,EAAAG,CAAA,GAAA;AAAA,YAPC,SAAShB,EAAM;AAAA,YACf,OAAOA,EAAM;AAAA,YACb,WAAWA,EAAM,aAAaA,EAAM;AAAA,YACpC,mBAAiBA,EAAM,OAAI,KAAA;AAAA,YAC3B,QAAQ;AAAA,YACR,eAAa;AAAA,YACb,kBAAYiB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAchB,YAAegB,CAAC;AAAA,UAAA;;;;;;;"}
1
+ {"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\n// 玻璃底由外层 aside / 抽屉提供,这里保持透明,不自带底色(否则两层半透明叠出一块灰)。\nimport { computed } from 'vue'\nimport { NInput, NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\nconst { t } = useI18n()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n showSearch?: boolean // 品牌下方的菜单搜索入口(只读输入框,点开 Ctrl+K 同一个面板)\n}>()\nconst emit = defineEmits<{ select: [key: string]; search: [] }>()\n\nconst iconOnly = computed(() => props.collapsed || props.rail)\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail, 'icon-only': iconOnly }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"28\" />\n <span v-show=\"!iconOnly\" class=\"brand-name\">\n {{ site.title }}\n </span>\n </div>\n <div v-if=\"props.showSearch && !iconOnly\" class=\"side-search\">\n <n-input\n size=\"small\"\n readonly\n class=\"search-input\"\n :placeholder=\"t('app.search')\"\n :aria-label=\"t('app.search')\"\n @click=\"emit('search')\"\n @keydown.enter=\"emit('search')\"\n >\n <template #prefix>\n <Icon icon=\"ph:magnifying-glass\" :width=\"15\" class=\"search-ico\" />\n </template>\n </n-input>\n </div>\n <n-scrollbar class=\"side-menu\">\n <n-menu\n :options=\"props.options\"\n :value=\"props.value\"\n :collapsed=\"iconOnly\"\n :collapsed-width=\"props.rail ? 64 : 68\"\n :collapsed-icon-size=\"20\"\n :icon-size=\"18\"\n :indent=\"14\"\n :root-indent=\"14\"\n @update:value=\"(k: string) => emit('select', k)\"\n />\n </n-scrollbar>\n </div>\n</template>\n\n<style scoped>\n.sidenav {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: transparent;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 50px;\n padding: 0 18px;\n color: var(--text-1);\n overflow: hidden;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.icon-only .brand {\n padding: 0;\n justify-content: center;\n}\n.brand-name {\n min-width: 0;\n font-size: 15px;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.2;\n color: var(--text-1); /* 品牌文字跟随主题文字色:固定深色在暗色下看不清 */\n}\n.side-search {\n flex-shrink: 0;\n padding: 0 12px 12px;\n}\n.search-input {\n cursor: pointer;\n}\n/* 只读输入框:光标也是手型,点哪都能打开面板 */\n.search-input :deep(.n-input__input-el) {\n cursor: pointer;\n}\n.search-ico {\n color: var(--text-3);\n}\n\n.side-menu {\n flex: 1;\n min-height: 0;\n /* 菜单滚到底时最后一行淡出,不被圆角面板的下沿硬切 */\n -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n}\n/* 选中项只靠行底色 + 强调色文字 / 图标 + 加粗到 600 表达(与横向页签栏的选中页签同一字重),不画左侧竖条 */\n.sidenav :deep(.n-menu-item-content--selected .n-menu-item-content-header) {\n font-weight: 600;\n}\n</style>\n"],"names":["site","useSite","t","useI18n","props","__props","emit","__emit","iconOnly","computed","_createElementBlock","_openBlock","_hoisted_1","_createVNode","SmartLogo","_withDirectives","_createElementVNode","_toDisplayString","_unref","_hoisted_2","NInput","Icon","NScrollbar","NMenu","_cache","k"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAYA,UAAM,EAAE,MAAAA,EAAA,IAASC,EAAA,GACX,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAAQC,GAQRC,IAAOC,GAEPC,IAAWC,EAAS,MAAML,EAAM,aAAaA,EAAM,IAAI;2BAI3DM,EAmCM,OAAA;AAAA,MAnCD,UAAM,WAAS,EAAA,MAAiBN,EAAM,mBAAmBI,EAAA,OAAQ,CAAA;AAAA,IAAA;MACzDJ,EAAM,aAAjBO,EAAA,GAAAD,EAKM,OALNE,GAKM;AAAA,QAJJC,EAAwBC,GAAA,EAAZ,MAAM,IAAE;AAAA,QACpBC,EAAAC,EAEO,UAFkB,OAAM,aAAA,GAAYC,EACtCC,EAAAlB,CAAA,EAAK,KAAK,GAAA,GAAA,GAAA;AAAA,eADAQ,EAAA,KAAQ;AAAA,QAAA;;MAIdJ,EAAM,cAAU,CAAKI,EAAA,SAAhCG,KAAAD,EAcM,OAdNS,GAcM;AAAA,QAbJN,EAYUK,EAAAE,CAAA,GAAA;AAAA,UAXR,MAAK;AAAA,UACL,UAAA;AAAA,UACA,OAAM;AAAA,UACL,aAAaF,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACd,cAAYgB,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACb,gCAAOI,EAAI,QAAA;AAAA,UACX,oCAAeA,EAAI,QAAA,GAAA,CAAA,OAAA,CAAA;AAAA,QAAA;UAET,UACT,MAAkE;AAAA,YAAlEO,EAAkEK,EAAAG,CAAA,GAAA;AAAA,cAA5D,MAAK;AAAA,cAAuB,OAAO;AAAA,cAAI,OAAM;AAAA,YAAA;;;;;MAIzDR,EAYcK,EAAAI,CAAA,GAAA,EAZD,OAAM,eAAW;AAAA,mBAC5B,MAUE;AAAA,UAVFT,EAUEK,EAAAK,CAAA,GAAA;AAAA,YATC,SAASnB,EAAM;AAAA,YACf,OAAOA,EAAM;AAAA,YACb,WAAWI,EAAA;AAAA,YACX,mBAAiBJ,EAAM,OAAI,KAAA;AAAA,YAC3B,uBAAqB;AAAA,YACrB,aAAW;AAAA,YACX,QAAQ;AAAA,YACR,eAAa;AAAA,YACb,kBAAYoB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAcnB,YAAemB,CAAC;AAAA,UAAA;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import o from "./default2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../_virtual/_plugin-vue_export-helper.js";
4
- const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-aa6e9642"]]);
4
+ const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-167bced3"]]);
5
5
  export {
6
6
  e as default
7
7
  };