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,59 +0,0 @@
1
- import { onBeforeUnmount as w, nextTick as y } from "vue";
2
- const S = "drag-handle", h = 10, k = 80;
3
- function L(e) {
4
- let r = null, c = null, s;
5
- function l() {
6
- clearTimeout(s), r == null || r.destroy(), r = null, c = null;
7
- }
8
- async function i(d = 0) {
9
- var f;
10
- if (e.disabled()) {
11
- l();
12
- return;
13
- }
14
- await y();
15
- const t = (f = e.container.value) == null ? void 0 : f.querySelector(".n-data-table-tbody");
16
- if (!t) {
17
- l(), d < h && (s = setTimeout(() => void i(d + 1), k));
18
- return;
19
- }
20
- if (t === c) return;
21
- clearTimeout(s), l();
22
- const { default: m } = await import("sortablejs");
23
- r = m.create(t, {
24
- handle: `.${S}`,
25
- draggable: ".n-data-table-tr",
26
- animation: 180,
27
- easing: "cubic-bezier(0.22, 0.61, 0.36, 1)",
28
- chosenClass: "row-chosen",
29
- ghostClass: "row-ghost",
30
- fallbackClass: "row-fallback",
31
- // 自绘拖拽层(而不是浏览器的原生拖影),配合样式里的隐藏才能把拖拽锁在表内
32
- forceFallback: !0,
33
- // 手柄上的轻微抖动不该被当成拖拽,否则点一下就误触发
34
- fallbackTolerance: 4,
35
- scroll: !0,
36
- forceAutoScrollFallback: !0,
37
- scrollSensitivity: 64,
38
- scrollSpeed: 12,
39
- onStart: () => {
40
- var a;
41
- return (a = e.container.value) == null ? void 0 : a.classList.add("is-dragging");
42
- },
43
- onEnd: (a) => {
44
- var g, T;
45
- (g = e.container.value) == null || g.classList.remove("is-dragging");
46
- const { oldIndex: n, newIndex: o } = a;
47
- if (n == null || o == null || n === o) return;
48
- const b = e.rows(), [u] = b.splice(n, 1);
49
- u && (b.splice(o, 0, u), (T = e.onSorted) == null || T.call(e, u, n, o));
50
- }
51
- }), c = t;
52
- }
53
- return w(l), { sync: i, destroy: l };
54
- }
55
- export {
56
- S as DRAG_HANDLE_CLASS,
57
- L as useTableRowSort
58
- };
59
- //# sourceMappingURL=useTableRowSort.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTableRowSort.js","sources":["../../src/composables/useTableRowSort.ts"],"sourcesContent":["// n-data-table 的行拖拽排序:sortablejs 的挂载/重建/销毁与重排回调都收在这里。\n//\n// 为什么不用原生 HTML5 拖放(<tr draggable> + dragstart/drop):那个半透明拖影由浏览器绘制,\n// 能跟着鼠标飘到表格外、弹窗外甚至窗口外,CSS 一点都管不到。这里用 sortablejs 的\n// forceFallback + 隐藏浮层(样式里 .row-fallback { display: none }),拖拽全靠行本身移动来表达,\n// 视觉上永远出不了表体;让位动画与自动滚动交给 sortablejs。\nimport { nextTick, onBeforeUnmount, type Ref } from 'vue'\nimport type Sortable from 'sortablejs'\n\nexport interface TableRowSortOptions<T> {\n /**\n * 表格所在的容器元素,从中找 tbody;拖拽期间它会被打上 .is-dragging。\n * 该元素要套全局类 <code>.row-sort</code>(styles/table.css)才有配套外观。\n */\n container: Ref<HTMLElement | null>\n /** 被排序的数组,原地重排(reactive 数组直接传函数返回值即可) */\n rows: () => T[]\n /** 为真时不可拖(只读态、详情态) */\n disabled: () => boolean\n /** 重排完成:落位的行 + 原始/目标下标 */\n onSorted?: (row: T, from: number, to: number) => void\n}\n\n/** 拖拽手柄的类名,列渲染和样式两边都按它对齐 */\nexport const DRAG_HANDLE_CLASS = 'drag-handle'\n\n/** tbody 还没渲染出来时的重试次数与间隔:弹窗有开场动画,首帧往往取不到表体 */\nconst RETRY_LIMIT = 10\nconst RETRY_DELAY = 80\n\nexport function useTableRowSort<T>(options: TableRowSortOptions<T>) {\n let sortable: Sortable | null = null\n let boundTbody: HTMLElement | null = null\n let retryTimer: ReturnType<typeof setTimeout> | undefined\n\n function destroy() {\n clearTimeout(retryTimer)\n sortable?.destroy()\n sortable = null\n boundTbody = null\n }\n\n /**\n * 重新绑定拖拽。表格换了一个 tbody(弹窗重开、只读态切换)才需要真的重建,\n * 行的增删不动 tbody 元素本身,重复调用是廉价的。\n */\n async function sync(attempt = 0) {\n if (options.disabled()) {\n destroy()\n return\n }\n await nextTick()\n const tbody = options.container.value?.querySelector<HTMLElement>('.n-data-table-tbody')\n if (!tbody) {\n destroy()\n // 弹窗开场动画期间表体还没挂上,过一会儿再试,别把拖拽丢了\n if (attempt < RETRY_LIMIT) {\n retryTimer = setTimeout(() => void sync(attempt + 1), RETRY_DELAY)\n }\n return\n }\n if (tbody === boundTbody) return\n clearTimeout(retryTimer)\n\n destroy()\n const { default: SortableCtor } = await import('sortablejs')\n sortable = SortableCtor.create(tbody, {\n handle: `.${DRAG_HANDLE_CLASS}`,\n draggable: '.n-data-table-tr',\n animation: 180,\n easing: 'cubic-bezier(0.22, 0.61, 0.36, 1)',\n chosenClass: 'row-chosen',\n ghostClass: 'row-ghost',\n fallbackClass: 'row-fallback',\n // 自绘拖拽层(而不是浏览器的原生拖影),配合样式里的隐藏才能把拖拽锁在表内\n forceFallback: true,\n // 手柄上的轻微抖动不该被当成拖拽,否则点一下就误触发\n fallbackTolerance: 4,\n scroll: true,\n forceAutoScrollFallback: true,\n scrollSensitivity: 64,\n scrollSpeed: 12,\n onStart: () => options.container.value?.classList.add('is-dragging'),\n onEnd: event => {\n options.container.value?.classList.remove('is-dragging')\n const { oldIndex: from, newIndex: to } = event\n if (from == null || to == null || from === to) return\n // sortablejs 已经把 DOM 挪好了,这里同步数据;表格带 row-key,Vue 按键重排不会串行\n const rows = options.rows()\n const [row] = rows.splice(from, 1)\n if (!row) return\n rows.splice(to, 0, row)\n options.onSorted?.(row, from, to)\n },\n })\n boundTbody = tbody\n }\n\n onBeforeUnmount(destroy)\n\n return { sync, destroy }\n}\n"],"names":["DRAG_HANDLE_CLASS","RETRY_LIMIT","RETRY_DELAY","useTableRowSort","options","sortable","boundTbody","retryTimer","destroy","sync","attempt","nextTick","tbody","_a","SortableCtor","event","from","to","rows","row","_b","onBeforeUnmount"],"mappings":";AAwBO,MAAMA,IAAoB,eAG3BC,IAAc,IACdC,IAAc;AAEb,SAASC,EAAmBC,GAAiC;AAClE,MAAIC,IAA4B,MAC5BC,IAAiC,MACjCC;AAEJ,WAASC,IAAU;AACjB,iBAAaD,CAAU,GACvBF,KAAA,QAAAA,EAAU,WACVA,IAAW,MACXC,IAAa;AAAA,EACf;AAMA,iBAAeG,EAAKC,IAAU,GAAG;;AAC/B,QAAIN,EAAQ,YAAY;AACtB,MAAAI,EAAA;AACA;AAAA,IACF;AACA,UAAMG,EAAA;AACN,UAAMC,KAAQC,IAAAT,EAAQ,UAAU,UAAlB,gBAAAS,EAAyB,cAA2B;AAClE,QAAI,CAACD,GAAO;AACV,MAAAJ,EAAA,GAEIE,IAAUT,MACZM,IAAa,WAAW,MAAM,KAAKE,EAAKC,IAAU,CAAC,GAAGR,CAAW;AAEnE;AAAA,IACF;AACA,QAAIU,MAAUN,EAAY;AAC1B,iBAAaC,CAAU,GAEvBC,EAAA;AACA,UAAM,EAAE,SAASM,MAAiB,MAAM,OAAO,YAAY;AAC3D,IAAAT,IAAWS,EAAa,OAAOF,GAAO;AAAA,MACpC,QAAQ,IAAIZ,CAAiB;AAAA,MAC7B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA;AAAA,MAEf,eAAe;AAAA;AAAA,MAEf,mBAAmB;AAAA,MACnB,QAAQ;AAAA,MACR,yBAAyB;AAAA,MACzB,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,SAAS,MAAA;;AAAM,gBAAAa,IAAAT,EAAQ,UAAU,UAAlB,gBAAAS,EAAyB,UAAU,IAAI;AAAA;AAAA,MACtD,OAAO,CAAAE,MAAS;;AACd,SAAAF,IAAAT,EAAQ,UAAU,UAAlB,QAAAS,EAAyB,UAAU,OAAO;AAC1C,cAAM,EAAE,UAAUG,GAAM,UAAUC,MAAOF;AACzC,YAAIC,KAAQ,QAAQC,KAAM,QAAQD,MAASC,EAAI;AAE/C,cAAMC,IAAOd,EAAQ,KAAA,GACf,CAACe,CAAG,IAAID,EAAK,OAAOF,GAAM,CAAC;AACjC,QAAKG,MACLD,EAAK,OAAOD,GAAI,GAAGE,CAAG,IACtBC,IAAAhB,EAAQ,aAAR,QAAAgB,EAAA,KAAAhB,GAAmBe,GAAKH,GAAMC;AAAA,MAChC;AAAA,IAAA,CACD,GACDX,IAAaM;AAAA,EACf;AAEA,SAAAS,EAAgBb,CAAO,GAEhB,EAAE,MAAAC,GAAM,SAAAD,EAAA;AACjB;"}
@@ -1,8 +0,0 @@
1
- import o from "./LayoutModeCards2.vue.js";
2
- /* empty css */
3
- import t from "../_virtual/_plugin-vue_export-helper.js";
4
- const d = /* @__PURE__ */ t(o, [["__scopeId", "data-v-66443dff"]]);
5
- export {
6
- d as default
7
- };
8
- //# sourceMappingURL=LayoutModeCards.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LayoutModeCards.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,67 +0,0 @@
1
- import { defineComponent as c, openBlock as l, createElementBlock as t, Fragment as r, renderList as v, unref as e, createElementVNode as a, normalizeClass as n, createStaticVNode as f, toDisplayString as y } from "vue";
2
- import { useI18n as b } from "vue-i18n";
3
- import { useAppStore as g, LAYOUT_MODES as k } from "../stores/app.js";
4
- const m = { class: "grid" }, w = ["onClick"], C = ["aria-label", "aria-pressed"], z = /* @__PURE__ */ c({
5
- __name: "LayoutModeCards",
6
- setup(M) {
7
- const o = g(), { t: u } = b();
8
- function d(p) {
9
- const s = p.split("-").map((i) => i[0].toUpperCase() + i.slice(1)).join("");
10
- return u("settings.layout" + s);
11
- }
12
- return (p, s) => (l(), t("div", m, [
13
- (l(!0), t(r, null, v(e(k), (i) => (l(), t("div", {
14
- key: i,
15
- class: "cell",
16
- onClick: (L) => e(o).setLayoutMode(i)
17
- }, [
18
- a("button", {
19
- type: "button",
20
- class: n(["card", { on: e(o).layoutMode === i }]),
21
- "aria-label": d(i),
22
- "aria-pressed": e(o).layoutMode === i
23
- }, [
24
- a("span", {
25
- class: n(["inner", i.includes("vertical") ? "row" : "col"])
26
- }, [
27
- i === "vertical" ? (l(), t(r, { key: 0 }, [
28
- s[0] || (s[0] = a("i", { class: "sider strong" }, null, -1)),
29
- s[1] || (s[1] = a("i", { class: "vwrap" }, [
30
- a("i", { class: "header p200" }),
31
- a("i", { class: "main p200" })
32
- ], -1))
33
- ], 64)) : i === "vertical-mix" ? (l(), t(r, { key: 1 }, [
34
- s[2] || (s[2] = f('<i class="rail strong" data-v-66443dff></i><i class="subsider p300" data-v-66443dff></i><i class="vwrap" data-v-66443dff><i class="header p200" data-v-66443dff></i><i class="main p200" data-v-66443dff></i></i>', 3))
35
- ], 64)) : i === "vertical-hybrid-header-first" ? (l(), t(r, { key: 2 }, [
36
- s[3] || (s[3] = f('<i class="rail strong" data-v-66443dff></i><i class="subsider p300" data-v-66443dff></i><i class="vwrap" data-v-66443dff><i class="header strong" data-v-66443dff></i><i class="main p200" data-v-66443dff></i></i>', 3))
37
- ], 64)) : i === "horizontal" ? (l(), t(r, { key: 3 }, [
38
- s[4] || (s[4] = a("i", { class: "header full strong" }, null, -1)),
39
- s[5] || (s[5] = a("i", { class: "hwrap" }, [
40
- a("i", { class: "main p200" })
41
- ], -1))
42
- ], 64)) : i === "top-hybrid-sidebar-first" ? (l(), t(r, { key: 4 }, [
43
- s[6] || (s[6] = a("i", { class: "header full p300" }, null, -1)),
44
- s[7] || (s[7] = a("i", { class: "hwrap" }, [
45
- a("i", { class: "sider strong" }),
46
- a("i", { class: "main p200" })
47
- ], -1))
48
- ], 64)) : (l(), t(r, { key: 5 }, [
49
- s[8] || (s[8] = a("i", { class: "header full strong" }, null, -1)),
50
- s[9] || (s[9] = a("i", { class: "hwrap" }, [
51
- a("i", { class: "sider p300" }),
52
- a("i", { class: "main p200" })
53
- ], -1))
54
- ], 64))
55
- ], 2)
56
- ], 10, C),
57
- a("p", {
58
- class: n(["label", { on: e(o).layoutMode === i }])
59
- }, y(d(i)), 3)
60
- ], 8, w))), 128))
61
- ]));
62
- }
63
- });
64
- export {
65
- z as default
66
- };
67
- //# sourceMappingURL=LayoutModeCards2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LayoutModeCards2.vue.js","sources":["../../src/layouts/LayoutModeCards.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore, LAYOUT_MODES, type LayoutMode } from '#/stores/app'\n\n// 布局模式彩色线框卡片(对齐 SoybeanAdmin theme-drawer/layout-mode.vue)。\n// 三档主色 strong(500)/p300/p200 由实时 --color-primary 派生;形状与 soybean 逐模式一致。\nconst app = useAppStore()\nconst { t } = useI18n()\n\nfunction label(m: LayoutMode) {\n const pascal = m\n .split('-')\n .map(w => w[0]!.toUpperCase() + w.slice(1))\n .join('')\n return t('settings.layout' + pascal)\n}\n</script>\n\n<template>\n <div class=\"grid\">\n <div v-for=\"m in LAYOUT_MODES\" :key=\"m\" class=\"cell\" @click=\"app.setLayoutMode(m)\">\n <button\n type=\"button\"\n class=\"card\"\n :class=\"{ on: app.layoutMode === m }\"\n :aria-label=\"label(m)\"\n :aria-pressed=\"app.layoutMode === m\"\n >\n <span class=\"inner\" :class=\"m.includes('vertical') ? 'row' : 'col'\">\n <!-- 左侧菜单:满高侧栏 + (头 / 内容) -->\n <template v-if=\"m === 'vertical'\">\n <i class=\"sider strong\" />\n <i class=\"vwrap\">\n <i class=\"header p200\" />\n <i class=\"main p200\" />\n </i>\n </template>\n <!-- 左侧混合:一级 rail + 二级列 + (头 / 内容) -->\n <template v-else-if=\"m === 'vertical-mix'\">\n <i class=\"rail strong\" />\n <i class=\"subsider p300\" />\n <i class=\"vwrap\">\n <i class=\"header p200\" />\n <i class=\"main p200\" />\n </i>\n </template>\n <!-- 左侧混合-顶部优先:一级上顶,rail(二级) + 三级列 + (强调头 / 内容) -->\n <template v-else-if=\"m === 'vertical-hybrid-header-first'\">\n <i class=\"rail strong\" />\n <i class=\"subsider p300\" />\n <i class=\"vwrap\">\n <i class=\"header strong\" />\n <i class=\"main p200\" />\n </i>\n </template>\n <!-- 顶部菜单:通栏头 + 内容 -->\n <template v-else-if=\"m === 'horizontal'\">\n <i class=\"header full strong\" />\n <i class=\"hwrap\"><i class=\"main p200\" /></i>\n </template>\n <!-- 顶部混合-侧边优先:头(二级)+ (强调 rail(一级) / 内容) -->\n <template v-else-if=\"m === 'top-hybrid-sidebar-first'\">\n <i class=\"header full p300\" />\n <i class=\"hwrap\">\n <i class=\"sider strong\" />\n <i class=\"main p200\" />\n </i>\n </template>\n <!-- 顶部混合-顶部优先:强调头(一级)+ (侧栏(二级) / 内容) -->\n <template v-else>\n <i class=\"header full strong\" />\n <i class=\"hwrap\">\n <i class=\"sider p300\" />\n <i class=\"main p200\" />\n </i>\n </template>\n </span>\n </button>\n <p class=\"label\" :class=\"{ on: app.layoutMode === m }\">{{ label(m) }}</p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n /* animated tab 的 .n-tabs-pane-wrapper 是 overflow:hidden,会裁掉边列卡片的 2px 选中环;内缩 3px 让环留在裁剪框内 */\n padding-inline: 3px;\n}\n.cell {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n}\n\n/* 卡片:soybean = shadow + ring-2(默认透明,hover/选中转主色) */\n.card {\n width: 100%;\n height: 62px;\n padding: 6px;\n border: none;\n border-radius: 4px;\n background: var(--color-bg-container);\n box-shadow:\n 0 1px 3px rgba(20, 27, 45, 0.1),\n 0 0 0 2px transparent;\n cursor: pointer;\n transition: box-shadow 0.15s ease;\n}\n.cell:hover .card {\n box-shadow:\n 0 1px 3px rgba(20, 27, 45, 0.1),\n 0 0 0 2px var(--color-primary);\n}\n.card.on {\n box-shadow:\n 0 1px 3px rgba(20, 27, 45, 0.1),\n 0 0 0 2px var(--color-primary);\n}\n\n/* 线框:三档主色派生跟随实时 --color-primary */\n.inner {\n --strong: var(--color-primary);\n --p300: color-mix(in srgb, var(--color-primary) 58%, var(--color-bg-container));\n --p200: color-mix(in srgb, var(--color-primary) 34%, var(--color-bg-container));\n display: flex;\n gap: 5px;\n width: 100%;\n height: 100%;\n}\n.inner.row {\n flex-direction: row;\n}\n.inner.col {\n flex-direction: column;\n}\n.inner i,\n.inner .vwrap,\n.inner .hwrap {\n border-radius: 3px;\n}\n.strong {\n background: var(--strong);\n}\n.p300 {\n background: var(--p300);\n}\n.p200 {\n background: var(--p200);\n}\n.sider {\n width: 18%;\n flex-shrink: 0;\n}\n.rail {\n width: 9%;\n flex-shrink: 0;\n}\n.subsider {\n width: 16%;\n flex-shrink: 0;\n}\n.header {\n flex-shrink: 0;\n height: 13px;\n}\n.header.full {\n width: 100%;\n}\n.main {\n flex: 1;\n}\n.vwrap {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n.vwrap .header {\n width: 100%;\n}\n.hwrap {\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: 5px;\n}\n\n.label {\n margin: 0;\n text-align: center;\n font-size: var(--font-size-xs);\n line-height: var(--line-height-xs);\n color: var(--color-text-secondary);\n}\n.label.on {\n color: var(--color-primary);\n font-weight: var(--font-weight-medium);\n}\n</style>\n"],"names":["app","useAppStore","t","useI18n","label","m","pascal","w","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","_unref","LAYOUT_MODES","$event","_createElementVNode","_normalizeClass","_toDisplayString"],"mappings":";;;;;;AAMA,UAAMA,IAAMC,EAAA,GACN,EAAE,GAAAC,EAAA,IAAMC,EAAA;AAEd,aAASC,EAAMC,GAAe;AAC5B,YAAMC,IAASD,EACZ,MAAM,GAAG,EACT,IAAI,OAAKE,EAAE,CAAC,EAAG,YAAA,IAAgBA,EAAE,MAAM,CAAC,CAAC,EACzC,KAAK,EAAE;AACV,aAAOL,EAAE,oBAAoBI,CAAM;AAAA,IACrC;sBAIEE,EAAA,GAAAC,EA6DM,OA7DNC,GA6DM;AAAA,cA5DJD,EA2DME,GAAA,MAAAC,EA3DWC,EAAAC,CAAA,GAAY,CAAjBT,YAAZI,EA2DM,OAAA;AAAA,QA3D0B,KAAKJ;AAAA,QAAG,OAAM;AAAA,QAAQ,SAAK,CAAAU,MAAEF,EAAAb,CAAA,EAAI,cAAcK,CAAC;AAAA,MAAA;QAC9EW,EAwDS,UAAA;AAAA,UAvDP,MAAK;AAAA,UACL,UAAM,QAAM,EAAA,IACEH,KAAI,eAAeR,EAAA,CAAC,CAAA;AAAA,UACjC,cAAYD,EAAMC,CAAC;AAAA,UACnB,gBAAcQ,EAAAb,CAAA,EAAI,eAAeK;AAAA,QAAA;UAElCW,EAgDO,QAAA;AAAA,YAhDD,OAAKC,EAAA,CAAC,SAAgBZ,EAAE,SAAQ,UAAA,IAAA,QAAA,KAAA,CAAA;AAAA,UAAA;YAEpBA,MAAC,mBAAjBI,EAMWE,GAAA,EAAA,KAAA,KAAA;AAAA,8BALTK,EAA0B,KAAA,EAAvB,OAAM,eAAA,GAAc,MAAA,EAAA;AAAA,8BACvBA,EAGI,KAAA,EAHD,OAAM,WAAO;AAAA,gBACdA,EAAyB,KAAA,EAAtB,OAAM,eAAa;AAAA,gBACtBA,EAAuB,KAAA,EAApB,OAAM,aAAW;AAAA,cAAA;sBAIHX,MAAC,uBAAtBI,EAOWE,GAAA,EAAA,KAAA,KAAA;AAAA;sBAEUN,MAAC,uCAAtBI,EAOWE,GAAA,EAAA,KAAA,KAAA;AAAA;sBAEUN,MAAC,qBAAtBI,EAGWE,GAAA,EAAA,KAAA,KAAA;AAAA,8BAFTK,EAAgC,KAAA,EAA7B,OAAM,qBAAA,GAAoB,MAAA,EAAA;AAAA,8BAC7BA,EAA4C,KAAA,EAAzC,OAAM,WAAO;AAAA,gBAACA,EAAuB,KAAA,EAApB,OAAM,aAAW;AAAA,cAAA;sBAGlBX,MAAC,mCAAtBI,EAMWE,GAAA,EAAA,KAAA,KAAA;AAAA,8BALTK,EAA8B,KAAA,EAA3B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,8BAC3BA,EAGI,KAAA,EAHD,OAAM,WAAO;AAAA,gBACdA,EAA0B,KAAA,EAAvB,OAAM,gBAAc;AAAA,gBACvBA,EAAuB,KAAA,EAApB,OAAM,aAAW;AAAA,cAAA;4BAIxBP,EAMWE,GAAA,EAAA,KAAA,KAAA;AAAA,8BALTK,EAAgC,KAAA,EAA7B,OAAM,qBAAA,GAAoB,MAAA,EAAA;AAAA,8BAC7BA,EAGI,KAAA,EAHD,OAAM,WAAO;AAAA,gBACdA,EAAwB,KAAA,EAArB,OAAM,cAAY;AAAA,gBACrBA,EAAuB,KAAA,EAApB,OAAM,aAAW;AAAA,cAAA;;;;QAK5BA,EAAyE,KAAA;AAAA,UAAtE,UAAM,SAAO,EAAA,IAAeH,KAAI,eAAeR,GAAC,CAAA;AAAA,QAAA,GAAOa,EAAAd,EAAMC,CAAC,CAAA,GAAA,CAAA;AAAA,MAAA;;;;"}
@@ -1,16 +0,0 @@
1
- type __VLS_Props = {
2
- label: string;
3
- };
4
- declare var __VLS_1: {};
5
- type __VLS_Slots = {} & {
6
- default?: (props: typeof __VLS_1) => any;
7
- };
8
- declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
9
- declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
10
- declare const _default: typeof __VLS_export;
11
- export default _default;
12
- type __VLS_WithSlots<T, S> = T & {
13
- new (): {
14
- $slots: S;
15
- };
16
- };
@@ -1,8 +0,0 @@
1
- import o from "./SettingRow2.vue.js";
2
- /* empty css */
3
- import t from "../_virtual/_plugin-vue_export-helper.js";
4
- const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-195679a9"]]);
5
- export {
6
- p as default
7
- };
8
- //# sourceMappingURL=SettingRow.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingRow.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,23 +0,0 @@
1
- import { defineComponent as o, openBlock as a, createElementBlock as s, createElementVNode as t, toDisplayString as n, renderSlot as r } from "vue";
2
- const c = ["aria-label"], i = { class: "lbl" }, d = { class: "ctl" }, m = /* @__PURE__ */ o({
3
- __name: "SettingRow",
4
- props: {
5
- label: {}
6
- },
7
- setup(e) {
8
- return (l, _) => (a(), s("div", {
9
- class: "row",
10
- role: "group",
11
- "aria-label": e.label
12
- }, [
13
- t("span", i, n(e.label), 1),
14
- t("div", d, [
15
- r(l.$slots, "default", {}, void 0, !0)
16
- ])
17
- ], 8, c));
18
- }
19
- });
20
- export {
21
- m as default
22
- };
23
- //# sourceMappingURL=SettingRow2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingRow2.vue.js","sources":["../../src/layouts/SettingRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 设置项行:左标签 + 右控件槽。槽内是 Naive 自绘控件(n-switch/n-select),无法用原生 <label for> 绑定,\n// 故给整行 role=\"group\" + aria-label,让读屏聚焦控件时能读到这项设置名(可见 span 仍留给视觉)。\ndefineProps<{ label: string }>()\n</script>\n\n<template>\n <div class=\"row\" role=\"group\" :aria-label=\"label\">\n <span class=\"lbl\">{{ label }}</span>\n <div class=\"ctl\"><slot /></div>\n </div>\n</template>\n\n<style scoped>\n.row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 40px;\n}\n.lbl {\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n white-space: nowrap;\n}\n.ctl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n</style>\n"],"names":["_createElementBlock","__props","_createElementVNode","_hoisted_2","_toDisplayString","_hoisted_3","_renderSlot","_ctx"],"mappings":";;;;;;;2BAOEA,EAGM,OAAA;AAAA,MAHD,OAAM;AAAA,MAAM,MAAK;AAAA,MAAS,cAAYC,EAAA;AAAA,IAAA;MACzCC,EAAoC,QAApCC,GAAoCC,EAAfH,EAAA,KAAK,GAAA,CAAA;AAAA,MAC1BC,EAA+B,OAA/BG,GAA+B;AAAA,QAAdC,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;"}
@@ -1,8 +0,0 @@
1
- import o from "./AuroraGlass2.vue.js";
2
- /* empty css */
3
- import r from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-e994c489"]]);
5
- export {
6
- m as default
7
- };
8
- //# sourceMappingURL=AuroraGlass.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuroraGlass.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,80 +0,0 @@
1
- import { defineComponent as v, computed as t, openBlock as b, createElementBlock as p, normalizeStyle as u, normalizeClass as C, unref as s, createStaticVNode as x, createElementVNode as c, createVNode as i, withCtx as g } from "vue";
2
- import { darkTheme as f, NConfigProvider as h } from "naive-ui";
3
- import { useAppStore as F } from "../../../stores/app.js";
4
- import { rgba as r, mix as a } from "../../../theme/mix.js";
5
- import k from "../LoginForm.vue.js";
6
- const E = { class: "aurora-content" }, _ = { class: "glass-card" }, B = /* @__PURE__ */ v({
7
- __name: "AuroraGlass",
8
- setup($) {
9
- const o = F(), n = t(() => ({
10
- "--a1": r(o.accent, 0.55),
11
- "--a2": r(a(o.accent, "#8B5CF6", 0.65), 0.5),
12
- "--a3": r(a(o.accent, "#22D3EE", 0.55), 0.45),
13
- "--a4": r(a(o.accent, "#EC4899", 0.6), 0.4)
14
- })), d = t(() => o.isDark ? f : null), l = t(() => ({
15
- primaryColor: o.accent,
16
- primaryColorHover: a(o.accent, "#ffffff", 0.16),
17
- primaryColorPressed: a(o.accent, "#000000", 0.18)
18
- })), m = t(
19
- () => o.isDark ? {
20
- common: l.value,
21
- Input: {
22
- color: "rgba(255, 255, 255, 0.06)",
23
- colorFocus: "rgba(255, 255, 255, 0.1)",
24
- textColor: "rgba(255, 255, 255, 0.92)",
25
- placeholderColor: "rgba(255, 255, 255, 0.4)",
26
- iconColor: "rgba(255, 255, 255, 0.5)",
27
- border: "1px solid rgba(255, 255, 255, 0.14)",
28
- borderHover: `1px solid ${r(o.accent, 0.6)}`,
29
- borderFocus: `1px solid ${o.accent}`,
30
- boxShadowFocus: `0 0 0 2px ${r(o.accent, 0.25)}`,
31
- caretColor: o.accent
32
- },
33
- Form: { labelTextColor: "rgba(255, 255, 255, 0.78)" },
34
- Checkbox: { textColor: "rgba(255, 255, 255, 0.7)" }
35
- } : {
36
- common: l.value,
37
- Input: {
38
- color: "rgba(255, 255, 255, 0.5)",
39
- colorFocus: "rgba(255, 255, 255, 0.8)",
40
- textColor: "#1D2129",
41
- placeholderColor: "rgba(0, 0, 0, 0.4)",
42
- iconColor: "rgba(0, 0, 0, 0.4)",
43
- border: "1px solid rgba(0, 0, 0, 0.1)",
44
- borderHover: `1px solid ${r(o.accent, 0.5)}`,
45
- borderFocus: `1px solid ${o.accent}`,
46
- boxShadowFocus: `0 0 0 2px ${r(o.accent, 0.2)}`,
47
- caretColor: o.accent
48
- },
49
- Form: { labelTextColor: "#4E5969" },
50
- Checkbox: { textColor: "#4E5969" }
51
- }
52
- );
53
- return (y, e) => (b(), p("div", {
54
- class: C(["aurora", { light: !s(o).isDark }]),
55
- style: u(n.value)
56
- }, [
57
- e[1] || (e[1] = x('<div class="aurora-bg" data-v-e994c489></div><div class="stars" data-v-e994c489></div><div class="orb orb-1" data-v-e994c489></div><div class="orb orb-2" data-v-e994c489></div><div class="orb orb-3" data-v-e994c489></div>', 5)),
58
- c("div", E, [
59
- e[0] || (e[0] = c("div", { class: "halo" }, null, -1)),
60
- i(s(h), {
61
- theme: d.value,
62
- "theme-overrides": m.value,
63
- "inherit-theme-overrides": !1
64
- }, {
65
- default: g(() => [
66
- c("div", _, [
67
- i(k)
68
- ])
69
- ]),
70
- _: 1
71
- }, 8, ["theme", "theme-overrides"])
72
- ]),
73
- e[2] || (e[2] = c("div", { class: "grain" }, null, -1))
74
- ], 6));
75
- }
76
- });
77
- export {
78
- B as default
79
- };
80
- //# sourceMappingURL=AuroraGlass2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuroraGlass2.vue.js","sources":["../../../../src/views/login/skins/AuroraGlass.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { NConfigProvider, darkTheme } from 'naive-ui'\nimport type { GlobalThemeOverrides } from 'naive-ui'\nimport { useAppStore } from '#/stores/app'\nimport { mix, rgba } from '#/theme/mix'\nimport LoginForm from '../LoginForm.vue'\n\nconst app = useAppStore()\n\n// 极光四色:accent + 派生紫/青/品红,随主题色联动。\nconst vars = computed(() => ({\n '--a1': rgba(app.accent, 0.55),\n '--a2': rgba(mix(app.accent, '#8B5CF6', 0.65), 0.5),\n '--a3': rgba(mix(app.accent, '#22D3EE', 0.55), 0.45),\n '--a4': rgba(mix(app.accent, '#EC4899', 0.6), 0.4),\n}))\n\n// 跟随应用明暗:深色用 darkTheme,浅色用 Naive 默认(null)。inherit=false 隔离应用根 overrides。\nconst naiveTheme = computed(() => (app.isDark ? darkTheme : null))\n\n// accent 派生主色两套共用。\nconst common = computed(() => ({\n primaryColor: app.accent,\n primaryColorHover: mix(app.accent, '#ffffff', 0.16),\n primaryColorPressed: mix(app.accent, '#000000', 0.18),\n}))\n\n// 输入框做成玻璃上的半透明观感 + accent 聚焦,深/浅两套。\n// ponytail: 浅色分支硬编码了 text-primary(#1D2129)/secondary(#4E5969) 令牌值,tokens 若改需同步\nconst glassTheme = computed<GlobalThemeOverrides>(() =>\n app.isDark\n ? {\n common: common.value,\n Input: {\n color: 'rgba(255, 255, 255, 0.06)',\n colorFocus: 'rgba(255, 255, 255, 0.1)',\n textColor: 'rgba(255, 255, 255, 0.92)',\n placeholderColor: 'rgba(255, 255, 255, 0.4)',\n iconColor: 'rgba(255, 255, 255, 0.5)',\n border: '1px solid rgba(255, 255, 255, 0.14)',\n borderHover: `1px solid ${rgba(app.accent, 0.6)}`,\n borderFocus: `1px solid ${app.accent}`,\n boxShadowFocus: `0 0 0 2px ${rgba(app.accent, 0.25)}`,\n caretColor: app.accent,\n },\n Form: { labelTextColor: 'rgba(255, 255, 255, 0.78)' },\n Checkbox: { textColor: 'rgba(255, 255, 255, 0.7)' },\n }\n : {\n common: common.value,\n Input: {\n color: 'rgba(255, 255, 255, 0.5)',\n colorFocus: 'rgba(255, 255, 255, 0.8)',\n textColor: '#1D2129',\n placeholderColor: 'rgba(0, 0, 0, 0.4)',\n iconColor: 'rgba(0, 0, 0, 0.4)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n borderHover: `1px solid ${rgba(app.accent, 0.5)}`,\n borderFocus: `1px solid ${app.accent}`,\n boxShadowFocus: `0 0 0 2px ${rgba(app.accent, 0.2)}`,\n caretColor: app.accent,\n },\n Form: { labelTextColor: '#4E5969' },\n Checkbox: { textColor: '#4E5969' },\n },\n)\n</script>\n\n<template>\n <div class=\"aurora\" :class=\"{ light: !app.isDark }\" :style=\"vars\">\n <div class=\"aurora-bg\" />\n <div class=\"stars\" />\n <div class=\"orb orb-1\" />\n <div class=\"orb orb-2\" />\n <div class=\"orb orb-3\" />\n <div class=\"aurora-content\">\n <div class=\"halo\" />\n <n-config-provider\n :theme=\"naiveTheme\"\n :theme-overrides=\"glassTheme\"\n :inherit-theme-overrides=\"false\"\n >\n <div class=\"glass-card\">\n <LoginForm />\n </div>\n </n-config-provider>\n </div>\n <div class=\"grain\" />\n </div>\n</template>\n\n<style scoped>\n.aurora {\n position: relative;\n height: 100dvh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background: radial-gradient(140% 120% at 50% 0%, #12162b 0%, #0a0b12 55%, #06060c 100%);\n}\n/* 细网格,中心遮罩淡出 */\n.aurora::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background-image:\n linear-gradient(rgba(255, 255, 255, 0.045) 1px, transparent 1px),\n linear-gradient(90deg, rgba(255, 255, 255, 0.045) 1px, transparent 1px);\n background-size: 46px 46px;\n -webkit-mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 72%);\n mask-image: radial-gradient(circle at 50% 45%, #000 0%, transparent 72%);\n}\n/* 暗角,聚焦中心 */\n.aurora::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n background: radial-gradient(120% 120% at 50% 42%, transparent 52%, rgba(0, 0, 0, 0.6) 100%);\n}\n.aurora-bg {\n position: absolute;\n inset: -20%;\n z-index: 0;\n background:\n radial-gradient(38% 38% at 18% 22%, var(--a1), transparent 68%),\n radial-gradient(42% 42% at 82% 18%, var(--a2), transparent 70%),\n radial-gradient(48% 48% at 60% 88%, var(--a3), transparent 72%),\n radial-gradient(34% 34% at 88% 68%, var(--a4), transparent 66%);\n filter: blur(28px);\n animation: aurora-move 18s ease-in-out infinite alternate;\n}\n@keyframes aurora-move {\n 0% {\n transform: translate3d(-3%, -2%, 0) rotate(0deg) scale(1.05);\n }\n 50% {\n transform: translate3d(3%, 2%, 0) rotate(4deg) scale(1.16);\n }\n 100% {\n transform: translate3d(-2%, 3%, 0) rotate(-3deg) scale(1.08);\n }\n}\n/* 星点微闪 */\n.stars {\n position: absolute;\n inset: 0;\n z-index: 0;\n background-image:\n radial-gradient(1.5px 1.5px at 20% 30%, rgba(255, 255, 255, 0.7), transparent 60%),\n radial-gradient(1px 1px at 70% 62%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1.5px 1.5px at 42% 82%, rgba(255, 255, 255, 0.6), transparent 60%),\n radial-gradient(1px 1px at 85% 22%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1px 1px at 55% 14%, rgba(255, 255, 255, 0.55), transparent 60%),\n radial-gradient(1.5px 1.5px at 12% 66%, rgba(255, 255, 255, 0.5), transparent 60%),\n radial-gradient(1px 1px at 92% 48%, rgba(255, 255, 255, 0.45), transparent 60%);\n animation: twinkle 5s ease-in-out infinite;\n}\n@keyframes twinkle {\n 0%,\n 100% {\n opacity: 0.45;\n }\n 50% {\n opacity: 0.9;\n }\n}\n.orb {\n position: absolute;\n z-index: 0;\n border-radius: 50%;\n filter: blur(55px);\n opacity: 0.55;\n}\n.orb-1 {\n width: 340px;\n height: 340px;\n background: var(--a1);\n top: -60px;\n left: -40px;\n animation: float-y 14s ease-in-out infinite;\n}\n.orb-2 {\n width: 280px;\n height: 280px;\n background: var(--a4);\n bottom: -80px;\n right: -40px;\n animation: float-y 16s ease-in-out infinite reverse;\n}\n.orb-3 {\n width: 200px;\n height: 200px;\n background: var(--a3);\n top: 38%;\n right: 18%;\n animation: float-y 20s ease-in-out infinite;\n}\n@keyframes float-y {\n 0%,\n 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-30px);\n }\n}\n.aurora-content {\n position: relative;\n z-index: 3;\n width: 100%;\n max-width: 520px;\n padding: 24px;\n}\n/* 卡后旋转极光光环(略大于卡片,溢出成辉光环) */\n.halo {\n position: absolute;\n z-index: 0;\n inset: 8px;\n border-radius: 36px;\n background: conic-gradient(from 0deg, var(--a1), var(--a2), var(--a3), var(--a4), var(--a1));\n filter: blur(48px);\n opacity: 0.6;\n animation: spin 16s linear infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.glass-card {\n /* 覆盖共享表单文字色为浅色(玻璃是深的) */\n --lf-title: #fff;\n --lf-hint: rgba(255, 255, 255, 0.5);\n position: relative;\n z-index: 1;\n width: 100%;\n padding: 46px 46px;\n border-radius: 20px;\n background: rgba(255, 255, 255, 0.07);\n border: 1px solid rgba(255, 255, 255, 0.14);\n backdrop-filter: blur(26px) saturate(150%);\n -webkit-backdrop-filter: blur(26px) saturate(150%);\n box-shadow:\n 0 30px 80px rgba(0, 0, 0, 0.55),\n 0 0 60px -12px var(--a2),\n inset 0 1px 0 rgba(255, 255, 255, 0.2);\n overflow: hidden;\n}\n/* accent 渐变发光边框 */\n.glass-card::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 20px;\n padding: 1px;\n background: linear-gradient(135deg, var(--a1), transparent 45%, var(--a2));\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n pointer-events: none;\n opacity: 0.9;\n}\n/* 玻璃表面缓慢流光 */\n.glass-card::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 2;\n pointer-events: none;\n background: linear-gradient(\n 120deg,\n transparent 36%,\n rgba(255, 255, 255, 0.1) 48%,\n transparent 60%\n );\n background-size: 220% 100%;\n background-repeat: no-repeat;\n animation: sheen 8s ease-in-out infinite;\n}\n@keyframes sheen {\n 0% {\n background-position: 180% 0;\n }\n 55%,\n 100% {\n background-position: -60% 0;\n }\n}\n/* 胶片颗粒,消除色带 + 质感 */\n.grain {\n position: absolute;\n inset: 0;\n z-index: 5;\n pointer-events: none;\n opacity: 0.05;\n mix-blend-mode: overlay;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\");\n}\n/* ── 浅色变体(应用浅色主题时)──────────────────────── */\n.aurora.light {\n background: radial-gradient(140% 120% at 50% 0%, #eef1fb 0%, #f6f7fc 55%, #ffffff 100%);\n}\n/* 网格线改深(浅底上可见) */\n.aurora.light::before {\n background-image:\n linear-gradient(rgba(0, 0, 0, 0.05) 1px, transparent 1px),\n linear-gradient(90deg, rgba(0, 0, 0, 0.05) 1px, transparent 1px);\n}\n/* 暗角柔化为冷色微晕(黑暗角在浅底像脏) */\n.aurora.light::after {\n background: radial-gradient(\n 120% 120% at 50% 42%,\n transparent 55%,\n rgba(120, 130, 180, 0.12) 100%\n );\n}\n/* 白星点在浅底不可见,隐藏 */\n.aurora.light .stars {\n display: none;\n}\n/* 光环稍收敛 */\n.aurora.light .halo {\n opacity: 0.5;\n}\n/* 玻璃卡:浅色玻璃 + 深色文字 */\n.aurora.light .glass-card {\n --lf-title: var(--color-text-primary);\n --lf-hint: var(--color-text-tertiary);\n background: rgba(255, 255, 255, 0.62);\n border: 1px solid rgba(214, 218, 235, 0.9);\n box-shadow:\n 0 30px 80px rgba(80, 90, 160, 0.18),\n 0 0 60px -12px var(--a2),\n inset 0 1px 0 rgba(255, 255, 255, 0.9);\n}\n/* 浅色下关掉 accent 遮罩渐变环:mask-composite 在圆角处有细毛边,深色靠辉光盖住、浅色会暴露成\"一层毛边\" */\n.aurora.light .glass-card::before {\n display: none;\n}\n/* 白色流光在浅玻璃上几乎不可见,浅色下关掉 */\n.aurora.light .glass-card::after {\n display: none;\n}\n\n/* 窄屏收紧内边距:默认 46px 卡内边距在 ~360px 手机上会挤压表单 */\n@media (max-width: 480px) {\n .aurora-content {\n padding: 16px;\n }\n .glass-card {\n padding: 32px 24px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .aurora-bg,\n .orb,\n .stars,\n .halo,\n .glass-card::after {\n animation: none;\n }\n .glass-card::after {\n display: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","vars","computed","rgba","mix","naiveTheme","darkTheme","common","glassTheme","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_createVNode","NConfigProvider","_hoisted_2","LoginForm"],"mappings":";;;;;;;;AAQA,UAAMA,IAAMC,EAAA,GAGNC,IAAOC,EAAS,OAAO;AAAA,MAC3B,QAAQC,EAAKJ,EAAI,QAAQ,IAAI;AAAA,MAC7B,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,IAAI,GAAG,GAAG;AAAA,MAClD,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,IAAI,GAAG,IAAI;AAAA,MACnD,QAAQI,EAAKC,EAAIL,EAAI,QAAQ,WAAW,GAAG,GAAG,GAAG;AAAA,IAAA,EACjD,GAGIM,IAAaH,EAAS,MAAOH,EAAI,SAASO,IAAY,IAAK,GAG3DC,IAASL,EAAS,OAAO;AAAA,MAC7B,cAAcH,EAAI;AAAA,MAClB,mBAAmBK,EAAIL,EAAI,QAAQ,WAAW,IAAI;AAAA,MAClD,qBAAqBK,EAAIL,EAAI,QAAQ,WAAW,IAAI;AAAA,IAAA,EACpD,GAIIS,IAAaN;AAAA,MAA+B,MAChDH,EAAI,SACA;AAAA,QACE,QAAQQ,EAAO;AAAA,QACf,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,aAAa,aAAaJ,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAC/C,aAAa,aAAaA,EAAI,MAAM;AAAA,UACpC,gBAAgB,aAAaI,EAAKJ,EAAI,QAAQ,IAAI,CAAC;AAAA,UACnD,YAAYA,EAAI;AAAA,QAAA;AAAA,QAElB,MAAM,EAAE,gBAAgB,4BAAA;AAAA,QACxB,UAAU,EAAE,WAAW,2BAAA;AAAA,MAA2B,IAEpD;AAAA,QACE,QAAQQ,EAAO;AAAA,QACf,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,aAAa,aAAaJ,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAC/C,aAAa,aAAaA,EAAI,MAAM;AAAA,UACpC,gBAAgB,aAAaI,EAAKJ,EAAI,QAAQ,GAAG,CAAC;AAAA,UAClD,YAAYA,EAAI;AAAA,QAAA;AAAA,QAElB,MAAM,EAAE,gBAAgB,UAAA;AAAA,QACxB,UAAU,EAAE,WAAW,UAAA;AAAA,MAAU;AAAA,IACnC;2BAKJU,EAmBM,OAAA;AAAA,MAnBD,OAAKC,EAAA,CAAC,UAAQ,EAAA,OAAA,CAAmBC,EAAAZ,CAAA,EAAI,OAAA,CAAM,CAAA;AAAA,MAAK,SAAOE,EAAA,KAAI;AAAA,IAAA;;MAM9DW,EAWM,OAXNC,GAWM;AAAA,wBAVJD,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,QACjBE,EAQoBH,EAAAI,CAAA,GAAA;AAAA,UAPjB,OAAOV,EAAA;AAAA,UACP,mBAAiBG,EAAA;AAAA,UACjB,2BAAyB;AAAA,QAAA;qBAE1B,MAEM;AAAA,YAFNI,EAEM,OAFNI,GAEM;AAAA,cADJF,EAAaG,CAAA;AAAA,YAAA;;;;;sBAInBL,EAAqB,OAAA,EAAhB,OAAM,WAAO,MAAA,EAAA;AAAA,IAAA;;;"}
@@ -1,3 +0,0 @@
1
- declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
- declare const _default: typeof __VLS_export;
3
- export default _default;
@@ -1,8 +0,0 @@
1
- import o from "./SplitPanel2.vue.js";
2
- /* empty css */
3
- import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-b4c7728a"]]);
5
- export {
6
- m as default
7
- };
8
- //# sourceMappingURL=SplitPanel.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SplitPanel.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,65 +0,0 @@
1
- import { defineComponent as u, computed as g, openBlock as r, createElementBlock as i, normalizeStyle as v, createElementVNode as t, createVNode as m, unref as e, toDisplayString as s, createTextVNode as h, Fragment as y, createCommentVNode as b } from "vue";
2
- import { useI18n as w } from "vue-i18n";
3
- import { useLoginHero as k } from "../../../composables/useLoginHero.js";
4
- import { useAppStore as S } from "../../../stores/app.js";
5
- import { useSite as V } from "../../../composables/useSite.js";
6
- import { rgba as d, mix as x } from "../../../theme/mix.js";
7
- import F from "../LoginForm.vue.js";
8
- import N from "../components/LoginHeroPanel.vue.js";
9
- const B = { class: "panel" }, C = { class: "panel-inner" }, L = { class: "form-wrap" }, D = { class: "mid" }, E = { class: "form-inner" }, H = { class: "greet" }, P = { class: "greet-sub" }, U = { class: "foot" }, z = ["href"], A = {
10
- key: 2,
11
- class: "foot-ver"
12
- }, Q = /* @__PURE__ */ u({
13
- __name: "SplitPanel",
14
- setup(I) {
15
- const { t: n } = w(), a = S(), { site: o, appVersion: c } = V(), l = k(), _ = (/* @__PURE__ */ new Date()).getFullYear(), f = g(() => ({
16
- "--a1": d(a.accent, 0.5),
17
- "--a2": d(x(a.accent, "#8B5CF6", 0.6), 0.4)
18
- }));
19
- return (T, p) => (r(), i("div", {
20
- class: "split",
21
- style: v(f.value)
22
- }, [
23
- t("div", B, [
24
- p[0] || (p[0] = t("div", { class: "panel-aurora" }, null, -1)),
25
- t("div", C, [
26
- m(N, {
27
- headline: e(l).headline,
28
- highlight: e(l).highlight,
29
- subtitle: e(o).subtitle || e(n)("login.subtitle"),
30
- features: e(l).features
31
- }, null, 8, ["headline", "highlight", "subtitle", "features"])
32
- ])
33
- ]),
34
- t("div", L, [
35
- t("div", D, [
36
- t("div", E, [
37
- t("p", H, s(e(n)("login.welcome")), 1),
38
- t("p", P, s(e(n)("login.welcomeSub")), 1),
39
- m(F, {
40
- "show-logo": !1,
41
- "show-title": !1,
42
- "show-footer": !1
43
- })
44
- ])
45
- ]),
46
- t("p", U, [
47
- h(" © " + s(e(_)) + " ", 1),
48
- e(o).copyrightUrl ? (r(), i("a", {
49
- key: 0,
50
- href: e(o).copyrightUrl,
51
- target: "_blank",
52
- rel: "noopener"
53
- }, s(e(o).copyright || e(o).title), 9, z)) : (r(), i(y, { key: 1 }, [
54
- h(s(e(o).copyright || e(o).title), 1)
55
- ], 64)),
56
- e(c) ? (r(), i("span", A, "v" + s(e(c)), 1)) : b("", !0)
57
- ])
58
- ])
59
- ], 4));
60
- }
61
- });
62
- export {
63
- Q as default
64
- };
65
- //# sourceMappingURL=SplitPanel2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SplitPanel2.vue.js","sources":["../../../../src/views/login/skins/SplitPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useLoginHero } from '#/composables/useLoginHero'\nimport { useAppStore } from '#/stores/app'\nimport { useSite } from '#/composables/useSite'\nimport { mix, rgba } from '#/theme/mix'\nimport LoginForm from '../LoginForm.vue'\nimport LoginHeroPanel from '../components/LoginHeroPanel.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst { site, appVersion } = useSite()\nconst hero = useLoginHero()\nconst year = new Date().getFullYear()\n\nconst vars = computed(() => ({\n '--a1': rgba(app.accent, 0.5),\n '--a2': rgba(mix(app.accent, '#8B5CF6', 0.6), 0.4),\n}))\n</script>\n\n<template>\n <div class=\"split\" :style=\"vars\">\n <!-- 左:品牌面板(窄屏隐藏)-->\n <div class=\"panel\">\n <div class=\"panel-aurora\" />\n <div class=\"panel-inner\">\n <LoginHeroPanel\n :headline=\"hero.headline\"\n :highlight=\"hero.highlight\"\n :subtitle=\"site.subtitle || t('login.subtitle')\"\n :features=\"hero.features\"\n />\n </div>\n </div>\n\n <!-- 右:全高工作区(居中表单 + 版权页脚);主题/语言切换在外壳全局工具药丸 -->\n <div class=\"form-wrap\">\n <div class=\"mid\">\n <div class=\"form-inner\">\n <p class=\"greet\">{{ t('login.welcome') }}</p>\n <p class=\"greet-sub\">{{ t('login.welcomeSub') }}</p>\n <LoginForm :show-logo=\"false\" :show-title=\"false\" :show-footer=\"false\" />\n </div>\n </div>\n\n <p class=\"foot\">\n © {{ year }}\n <a v-if=\"site.copyrightUrl\" :href=\"site.copyrightUrl\" target=\"_blank\" rel=\"noopener\">\n {{ site.copyright || site.title }}\n </a>\n <template v-else>{{ site.copyright || site.title }}</template>\n <span v-if=\"appVersion\" class=\"foot-ver\">v{{ appVersion }}</span>\n </p>\n </div>\n </div>\n</template>\n\n<style scoped>\n.split {\n height: 100dvh;\n display: grid;\n grid-template-columns: 1.15fr 0.85fr;\n background: var(--color-bg-body);\n}\n/* 左栏 = recessed 品牌面(body 底 + 极光),与右栏 clean container 拉开图/底关系 */\n.panel {\n position: relative;\n overflow: hidden;\n background: var(--color-bg-body);\n border-right: 1px solid var(--color-border);\n}\n/* 细网格纹理,左上淡出 */\n.panel::before {\n content: '';\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(127, 127, 127, 0.08) 1px, transparent 1px),\n linear-gradient(90deg, rgba(127, 127, 127, 0.08) 1px, transparent 1px);\n background-size: 40px 40px;\n -webkit-mask-image: radial-gradient(circle at 30% 40%, #000, transparent 72%);\n mask-image: radial-gradient(circle at 30% 40%, #000, transparent 72%);\n}\n.panel-aurora {\n position: absolute;\n inset: -20%;\n background:\n radial-gradient(40% 40% at 25% 20%, var(--a1), transparent 68%),\n radial-gradient(45% 45% at 80% 78%, var(--a2), transparent 70%);\n filter: blur(45px);\n opacity: 0.9;\n animation: panel-move 22s ease-in-out infinite alternate;\n}\n@keyframes panel-move {\n 0% {\n transform: translate3d(-3%, -2%, 0) scale(1.05);\n }\n 100% {\n transform: translate3d(3%, 3%, 0) scale(1.12);\n }\n}\n.panel-inner {\n position: relative;\n z-index: 1;\n padding: 64px 56px;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n}\n/* 右栏 = 全高工作区:居中表单 + 页脚(主题/语言切换在外壳全局工具) */\n.form-wrap {\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--color-bg-container);\n}\n.mid {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n}\n.form-inner {\n width: 100%;\n max-width: 340px;\n animation: fade-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.greet {\n font-size: 26px;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-text-primary);\n margin: 0 0 6px;\n}\n.greet-sub {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n margin: 0 0 26px;\n}\n.foot {\n margin: 0;\n padding: 18px 24px 22px;\n text-align: center;\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.foot a {\n color: inherit;\n text-decoration: none;\n}\n.foot a:hover {\n color: var(--color-primary);\n}\n.foot-ver {\n margin-left: 8px;\n opacity: 0.75;\n}\n@keyframes fade-up {\n from {\n opacity: 0;\n transform: translateY(16px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n@media (max-width: 900px) {\n .split {\n grid-template-columns: 1fr;\n }\n .panel {\n display: none;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .panel-aurora,\n .form-inner {\n animation: none;\n }\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","site","appVersion","useSite","hero","useLoginHero","year","vars","computed","rgba","mix","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_createVNode","LoginHeroPanel","_unref","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","LoginForm","_hoisted_8","_hoisted_9","_Fragment","_createTextVNode","_openBlock","_hoisted_10"],"mappings":";;;;;;;;;;;;;;AAUA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA,GACRC,IAAMC,EAAA,GACN,EAAE,MAAAC,GAAM,YAAAC,EAAA,IAAeC,EAAA,GACvBC,IAAOC,EAAA,GACPC,KAAO,oBAAI,KAAA,GAAO,YAAA,GAElBC,IAAOC,EAAS,OAAO;AAAA,MAC3B,QAAQC,EAAKV,EAAI,QAAQ,GAAG;AAAA,MAC5B,QAAQU,EAAKC,EAAIX,EAAI,QAAQ,WAAW,GAAG,GAAG,GAAG;AAAA,IAAA,EACjD;2BAIAY,EAiCM,OAAA;AAAA,MAjCD,OAAM;AAAA,MAAS,SAAOJ,EAAA,KAAI;AAAA,IAAA;MAE7BK,EAUM,OAVNC,GAUM;AAAA,wBATJD,EAA4B,OAAA,EAAvB,OAAM,eAAA,GAAc,MAAA,EAAA;AAAA,QACzBA,EAOM,OAPNE,GAOM;AAAA,UANJC,EAKEC,GAAA;AAAA,YAJC,UAAUC,EAAAb,CAAA,EAAK;AAAA,YACf,WAAWa,EAAAb,CAAA,EAAK;AAAA,YAChB,UAAUa,EAAAhB,CAAA,EAAK,YAAYgB,EAAApB,CAAA,EAAC,gBAAA;AAAA,YAC5B,UAAUoB,EAAAb,CAAA,EAAK;AAAA,UAAA;;;MAMtBQ,EAiBM,OAjBNM,GAiBM;AAAA,QAhBJN,EAMM,OANNO,GAMM;AAAA,UALJP,EAIM,OAJNQ,GAIM;AAAA,YAHJR,EAA6C,KAA7CS,GAA6CC,EAAzBL,EAAApB,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,YACrBe,EAAoD,KAApDW,GAAoDD,EAA5BL,EAAApB,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,YACzBkB,EAAyES,GAAA;AAAA,cAA7D,aAAW;AAAA,cAAQ,cAAY;AAAA,cAAQ,eAAa;AAAA,YAAA;;;QAIpEZ,EAOI,KAPJa,GAOI;AAAA,YAPY,QACZH,EAAGL,EAAAX,CAAA,CAAI,IAAG,KACZ,CAAA;AAAA,UAASW,EAAAhB,CAAA,EAAK,qBAAdU,EAEI,KAAA;AAAA;YAFyB,MAAMM,EAAAhB,CAAA,EAAK;AAAA,YAAc,QAAO;AAAA,YAAS,KAAI;AAAA,UAAA,GACrEqB,EAAAL,EAAAhB,CAAA,EAAK,aAAagB,EAAAhB,CAAA,EAAK,KAAK,GAAA,GAAAyB,CAAA,WAEjCf,EAA8DgB,GAAA,EAAA,KAAA,KAAA;AAAA,YAA1CC,EAAAN,EAAAL,EAAAhB,CAAA,EAAK,aAAagB,EAAAhB,CAAA,EAAK,KAAK,GAAA,CAAA;AAAA,UAAA;UACpCgB,EAAAf,CAAA,KAAZ2B,KAAAlB,EAAiE,QAAjEmB,GAAyC,QAAIb,EAAAf,CAAA,CAAU,GAAA,CAAA;;;;;;"}
@@ -1,3 +0,0 @@
1
- declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
- declare const _default: typeof __VLS_export;
3
- export default _default;
@@ -1,8 +0,0 @@
1
- import o from "./Spotlight2.vue.js";
2
- /* empty css */
3
- import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-2d0bde1c"]]);
5
- export {
6
- _ as default
7
- };
8
- //# sourceMappingURL=Spotlight.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Spotlight.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,36 +0,0 @@
1
- import { defineComponent as c, ref as l, onMounted as p, onBeforeUnmount as d, computed as u, openBlock as v, createElementBlock as f, normalizeStyle as w, createElementVNode as n, createVNode as _ } from "vue";
2
- import { useAppStore as g } from "../../../stores/app.js";
3
- import { rgba as s, mix as x } from "../../../theme/mix.js";
4
- import y from "../LoginForm.vue.js";
5
- const B = { class: "card" }, C = /* @__PURE__ */ c({
6
- __name: "Spotlight",
7
- setup(E) {
8
- const e = g(), r = l(50), i = l(38);
9
- function m(t) {
10
- r.value = t.clientX / window.innerWidth * 100, i.value = t.clientY / window.innerHeight * 100;
11
- }
12
- p(() => window.addEventListener("mousemove", m, { passive: !0 })), d(() => window.removeEventListener("mousemove", m));
13
- const a = u(() => ({
14
- "--mx": r.value + "%",
15
- "--my": i.value + "%",
16
- "--s1": s(e.accent, 0.28),
17
- "--s2": s(x(e.accent, "#8B5CF6", 0.6), 0.22),
18
- // 跟随光晕独立取色:亮色近白底下 0.28 几乎不可见,提到 0.5 才读得出;暗底 0.28 已够。
19
- "--spot": s(e.accent, e.isDark ? 0.3 : 0.5)
20
- }));
21
- return (t, o) => (v(), f("div", {
22
- class: "spotlight",
23
- style: w(a.value)
24
- }, [
25
- o[0] || (o[0] = n("div", { class: "mesh" }, null, -1)),
26
- o[1] || (o[1] = n("div", { class: "spot" }, null, -1)),
27
- n("div", B, [
28
- _(y)
29
- ])
30
- ], 4));
31
- }
32
- });
33
- export {
34
- C as default
35
- };
36
- //# sourceMappingURL=Spotlight2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Spotlight2.vue.js","sources":["../../../../src/views/login/skins/Spotlight.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue'\nimport { useAppStore } from '#/stores/app'\nimport { mix, rgba } from '#/theme/mix'\nimport LoginForm from '../LoginForm.vue'\n\nconst app = useAppStore()\n\n// 聚光位置(百分比),默认略偏上居中;鼠标移动时跟随。\nconst mx = ref(50)\nconst my = ref(38)\nfunction onMove(e: MouseEvent) {\n mx.value = (e.clientX / window.innerWidth) * 100\n my.value = (e.clientY / window.innerHeight) * 100\n}\nonMounted(() => window.addEventListener('mousemove', onMove, { passive: true }))\nonBeforeUnmount(() => window.removeEventListener('mousemove', onMove))\n\nconst vars = computed(() => ({\n '--mx': mx.value + '%',\n '--my': my.value + '%',\n '--s1': rgba(app.accent, 0.28),\n '--s2': rgba(mix(app.accent, '#8B5CF6', 0.6), 0.22),\n // 跟随光晕独立取色:亮色近白底下 0.28 几乎不可见,提到 0.5 才读得出;暗底 0.28 已够。\n '--spot': rgba(app.accent, app.isDark ? 0.3 : 0.5),\n}))\n</script>\n\n<template>\n <div class=\"spotlight\" :style=\"vars\">\n <div class=\"mesh\" />\n <div class=\"spot\" />\n <div class=\"card\">\n <LoginForm />\n </div>\n </div>\n</template>\n\n<style scoped>\n.spotlight {\n position: relative;\n height: 100dvh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-bg-body);\n}\n.mesh {\n position: absolute;\n inset: 0;\n background:\n radial-gradient(30% 40% at 15% 20%, var(--s1), transparent 60%),\n radial-gradient(30% 40% at 85% 80%, var(--s2), transparent 60%);\n opacity: 0.9;\n}\n.spot {\n position: absolute;\n inset: 0;\n pointer-events: none;\n background: radial-gradient(340px 340px at var(--mx) var(--my), var(--spot), transparent 60%);\n transition: background 0.12s ease-out;\n}\n.card {\n position: relative;\n z-index: 2;\n width: 100%;\n max-width: 460px;\n padding: 46px 46px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-3);\n animation: fade-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n@keyframes fade-up {\n from {\n opacity: 0;\n transform: translateY(16px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n/* 窄屏:给卡片侧边留白 + 收紧内边距(默认 46px 在 ~360px 手机上挤压表单、卡片贴边) */\n@media (max-width: 480px) {\n .spotlight {\n padding: 0 16px;\n }\n .card {\n padding: 32px 24px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spot {\n /* 光晕仍跟随指针(指针驱动的位移,非自发动画);仅去掉缓动过渡。\n Windows Server 等默认关动画的环境会命中此分支;若连指针跟随一并禁掉,会退化为静态居中,\n 表现为\"光晕不跟鼠标\",故此处只去缓动、保留跟随。 */\n transition: none;\n }\n .card {\n animation: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","mx","ref","my","onMove","e","onMounted","onBeforeUnmount","vars","computed","rgba","mix","_createElementBlock","_createElementVNode","_hoisted_1","_createVNode","LoginForm"],"mappings":";;;;;;;AAMA,UAAMA,IAAMC,EAAA,GAGNC,IAAKC,EAAI,EAAE,GACXC,IAAKD,EAAI,EAAE;AACjB,aAASE,EAAOC,GAAe;AAC7B,MAAAJ,EAAG,QAASI,EAAE,UAAU,OAAO,aAAc,KAC7CF,EAAG,QAASE,EAAE,UAAU,OAAO,cAAe;AAAA,IAChD;AACA,IAAAC,EAAU,MAAM,OAAO,iBAAiB,aAAaF,GAAQ,EAAE,SAAS,GAAA,CAAM,CAAC,GAC/EG,EAAgB,MAAM,OAAO,oBAAoB,aAAaH,CAAM,CAAC;AAErE,UAAMI,IAAOC,EAAS,OAAO;AAAA,MAC3B,QAAQR,EAAG,QAAQ;AAAA,MACnB,QAAQE,EAAG,QAAQ;AAAA,MACnB,QAAQO,EAAKX,EAAI,QAAQ,IAAI;AAAA,MAC7B,QAAQW,EAAKC,EAAIZ,EAAI,QAAQ,WAAW,GAAG,GAAG,IAAI;AAAA;AAAA,MAElD,UAAUW,EAAKX,EAAI,QAAQA,EAAI,SAAS,MAAM,GAAG;AAAA,IAAA,EACjD;2BAIAa,EAMM,OAAA;AAAA,MAND,OAAM;AAAA,MAAa,SAAOJ,EAAA,KAAI;AAAA,IAAA;sBACjCK,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,sBACjBA,EAAoB,OAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,MACjBA,EAEM,OAFNC,GAEM;AAAA,QADJC,EAAaC,CAAA;AAAA,MAAA;;;;"}
@@ -1,8 +0,0 @@
1
- import { Component } from 'vue';
2
- export interface LoginSkin {
3
- id: string;
4
- label: string;
5
- component: Component;
6
- }
7
- export declare const LOGIN_SKINS: LoginSkin[];
8
- export declare const DEFAULT_SKIN = "aurora";
@@ -1,13 +0,0 @@
1
- import o from "./skins/AuroraGlass.vue.js";
2
- import i from "./skins/SplitPanel.vue.js";
3
- import t from "./skins/Spotlight.vue.js";
4
- const p = [
5
- { id: "aurora", label: "login.skinAurora", component: o },
6
- { id: "split", label: "login.skinSplit", component: i },
7
- { id: "spotlight", label: "login.skinSpotlight", component: t }
8
- ], a = "aurora";
9
- export {
10
- a as DEFAULT_SKIN,
11
- p as LOGIN_SKINS
12
- };
13
- //# sourceMappingURL=skins.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skins.js","sources":["../../../src/views/login/skins.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport AuroraGlass from './skins/AuroraGlass.vue'\nimport SplitPanel from './skins/SplitPanel.vue'\nimport Spotlight from './skins/Spotlight.vue'\n\nexport interface LoginSkin {\n id: string\n label: string\n component: Component\n}\n\nexport const LOGIN_SKINS: LoginSkin[] = [\n { id: 'aurora', label: 'login.skinAurora', component: AuroraGlass },\n { id: 'split', label: 'login.skinSplit', component: SplitPanel },\n { id: 'spotlight', label: 'login.skinSpotlight', component: Spotlight },\n]\n\nexport const DEFAULT_SKIN = 'aurora'\n"],"names":["LOGIN_SKINS","AuroraGlass","SplitPanel","Spotlight","DEFAULT_SKIN"],"mappings":";;;AAWO,MAAMA,IAA2B;AAAA,EACtC,EAAE,IAAI,UAAU,OAAO,oBAAoB,WAAWC,EAAA;AAAA,EACtD,EAAE,IAAI,SAAS,OAAO,mBAAmB,WAAWC,EAAA;AAAA,EACpD,EAAE,IAAI,aAAa,OAAO,uBAAuB,WAAWC,EAAA;AAC9D,GAEaC,IAAe;"}