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,131 +1,132 @@
1
- import { defineComponent as T, computed as v, openBlock as r, createBlock as U, unref as e, withCtx as c, createVNode as u, isRef as w, createElementVNode as s, createElementBlock as d, Fragment as S, renderList as y, toDisplayString as p, withDirectives as z, createTextVNode as h, normalizeClass as O } from "vue";
2
- import { NSlider as A, NInputNumber as P, NDynamicTags as j } from "naive-ui";
3
- import { useI18n as $ } from "vue-i18n";
4
- import F from "../../../../components/AppIcon.vue.js";
5
- import { UPLOAD_MAX_KEY as C, UPLOAD_EXTS_KEY as g } from "../groups.js";
6
- import { useConfigDraft as I, useDraftFields as R } from "../draft.js";
7
- import { vFlash as E } from "../flash.js";
8
- import V from "./SectionLayout.vue.js";
9
- import K from "./CfgGroup.vue.js";
10
- import x from "./CfgRow.vue.js";
11
- const X = { class: "presets" }, Y = ["onClick"], q = {
1
+ import { defineComponent as A, computed as g, openBlock as m, createBlock as P, unref as e, withCtx as u, createVNode as s, isRef as S, createElementVNode as p, createElementBlock as d, Fragment as C, renderList as y, createTextVNode as f, toDisplayString as r, withDirectives as E, normalizeClass as j } from "vue";
2
+ import { NSlider as $, NInputNumber as F, NDynamicTags as I, NButton as D } from "naive-ui";
3
+ import { useI18n as R } from "vue-i18n";
4
+ import V from "../../../../components/AppIcon.vue.js";
5
+ import { UPLOAD_MAX_KEY as B, UPLOAD_EXTS_KEY as x } from "../groups.js";
6
+ import { useConfigDraft as K, useDraftFields as X } from "../draft.js";
7
+ import { useConfigLayout as Y } from "../layoutMode.js";
8
+ import { vFlash as L } from "../flash.js";
9
+ import q from "./SectionLayout.vue.js";
10
+ import G from "./CfgGroup.vue.js";
11
+ import b from "./CfgRow.vue.js";
12
+ const W = { class: "presets" }, H = {
12
13
  class: "drop",
13
14
  "data-testid": "upload-preview"
14
- }, G = { class: "files" }, W = { class: "fi" }, H = { class: "nm" }, ue = /* @__PURE__ */ T({
15
+ }, J = { class: "files" }, Q = { class: "fi" }, Z = { class: "nm" }, ce = /* @__PURE__ */ A({
15
16
  __name: "UploadSection",
16
- setup(J) {
17
- const { t: l } = $(), { values: b } = I(), { num: D } = R(), i = D(C, 20);
18
- function B(a) {
17
+ setup(ee) {
18
+ const { t: l } = R(), { values: k } = K(), { num: h } = X(), { ctl: M, sm: _ } = Y(), i = h(B, 20);
19
+ function N(a) {
19
20
  const t = a.trim().toLowerCase();
20
21
  return t.startsWith(".") ? t : "." + t;
21
22
  }
22
- const n = v({
23
- get: () => (b[g] ?? "").split(",").map((a) => a.trim()).filter(Boolean),
23
+ const n = g({
24
+ get: () => (k[x] ?? "").split(",").map((a) => a.trim()).filter(Boolean),
24
25
  set: (a) => {
25
- b[g] = [...new Set(a.map(B).filter((t) => t !== "."))].join(",");
26
+ k[x] = [...new Set(a.map(N).filter((t) => t !== "."))].join(",");
26
27
  }
27
- }), k = {
28
+ }), w = {
28
29
  images: [".jpg", ".jpeg", ".png", ".gif", ".webp"],
29
30
  docs: [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx"],
30
31
  archives: [".zip", ".rar", ".7z"]
31
32
  };
32
- function L(a) {
33
- n.value = [...n.value, ...k[a]];
33
+ function T(a) {
34
+ n.value = [...n.value, ...w[a]];
34
35
  }
35
- const M = [
36
+ const U = [
36
37
  { name: "report.pdf", mb: 3.2 },
37
38
  { name: "photo.png", mb: 1.4 },
38
39
  { name: "demo.mp4", mb: 48 },
39
40
  { name: "setup.exe", mb: 12 }
40
- ], N = v(
41
- () => M.map((a) => {
42
- const t = a.name.slice(a.name.lastIndexOf(".")), o = n.value.length ? n.value.includes(t) : void 0, m = a.mb <= i.value, _ = o === !1 ? { ok: !1, text: l("config.upload.fileBadExt", { ext: t }) } : m ? o ? { ok: !0, text: l("config.upload.fileOk") } : { ok: void 0, text: l("config.upload.fileDefault") } : { ok: !1, text: l("config.upload.fileTooBig", { mb: i.value }) };
43
- return { ...a, ext: t.slice(1).toUpperCase(), status: _ };
41
+ ], O = g(
42
+ () => U.map((a) => {
43
+ const t = a.name.slice(a.name.lastIndexOf(".")), o = n.value.length ? n.value.includes(t) : void 0, c = a.mb <= i.value, z = o === !1 ? { ok: !1, text: l("config.upload.fileBadExt", { ext: t }) } : c ? o ? { ok: !0, text: l("config.upload.fileOk") } : { ok: void 0, text: l("config.upload.fileDefault") } : { ok: !1, text: l("config.upload.fileTooBig", { mb: i.value }) };
44
+ return { ...a, ext: t.slice(1).toUpperCase(), status: z };
44
45
  })
45
- ), f = v(
46
+ ), v = g(
46
47
  () => l("config.upload.previewLimit", {
47
48
  exts: n.value.length ? n.value.join(" ") : l("config.upload.previewDefault"),
48
49
  mb: i.value
49
50
  })
50
51
  );
51
- return (a, t) => (r(), U(V, {
52
+ return (a, t) => (m(), P(q, {
52
53
  title: e(l)("config.tab.upload"),
53
54
  desc: e(l)("config.upload.desc"),
54
55
  "preview-title": e(l)("config.upload.preview"),
55
56
  layout: "slim"
56
57
  }, {
57
- preview: c(() => [
58
- s("div", q, [
59
- u(F, {
58
+ preview: u(() => [
59
+ p("div", H, [
60
+ s(V, {
60
61
  icon: "ph:cloud-arrow-up",
61
62
  size: 30,
62
63
  class: "ic"
63
64
  }),
64
- s("b", null, p(e(l)("config.upload.previewDrop")), 1),
65
- z((r(), d("small", null, [
66
- h(p(f.value), 1)
65
+ p("b", null, r(e(l)("config.upload.previewDrop")), 1),
66
+ E((m(), d("small", null, [
67
+ f(r(v.value), 1)
67
68
  ])), [
68
- [e(E), f.value]
69
+ [e(L), v.value]
69
70
  ])
70
71
  ]),
71
- z((r(), d("ul", G, [
72
- (r(!0), d(S, null, y(N.value, (o) => (r(), d("li", {
72
+ E((m(), d("ul", J, [
73
+ (m(!0), d(C, null, y(O.value, (o) => (m(), d("li", {
73
74
  key: o.name
74
75
  }, [
75
- s("span", W, p(o.ext), 1),
76
- s("span", H, [
77
- h(p(o.name) + " ", 1),
78
- s("small", null, p(o.mb) + " MB", 1)
76
+ p("span", Q, r(o.ext), 1),
77
+ p("span", Z, [
78
+ f(r(o.name) + " ", 1),
79
+ p("small", null, r(o.mb) + " MB", 1)
79
80
  ]),
80
- s("span", {
81
- class: O(["st", { ok: o.status.ok === !0, no: o.status.ok === !1 }])
82
- }, p(o.status.text), 3)
81
+ p("span", {
82
+ class: j(["st", { ok: o.status.ok === !0, no: o.status.ok === !1 }])
83
+ }, r(o.status.text), 3)
83
84
  ]))), 128))
84
85
  ])), [
85
- [e(E), f.value]
86
+ [e(L), v.value]
86
87
  ])
87
88
  ]),
88
- default: c(() => [
89
- u(K, {
89
+ default: u(() => [
90
+ s(G, {
90
91
  title: e(l)("config.upload.groupLimit")
91
92
  }, {
92
- default: c(() => [
93
- u(x, {
93
+ default: u(() => [
94
+ s(b, {
94
95
  label: e(l)("config.upload.maxSizeMb"),
95
- keys: [e(C)]
96
+ keys: [e(B)]
96
97
  }, {
97
- default: c(() => [
98
- u(e(A), {
98
+ default: u(() => [
99
+ s(e($), {
99
100
  value: e(i),
100
- "onUpdate:value": t[0] || (t[0] = (o) => w(i) ? i.value = o : null),
101
+ "onUpdate:value": t[0] || (t[0] = (o) => S(i) ? i.value = o : null),
101
102
  class: "slider",
102
103
  min: 1,
103
104
  max: 200,
104
105
  tooltip: !1,
105
106
  "aria-label": e(l)("config.upload.maxSizeMb")
106
107
  }, null, 8, ["value", "aria-label"]),
107
- u(e(P), {
108
+ s(e(F), {
108
109
  value: e(i),
109
- "onUpdate:value": t[1] || (t[1] = (o) => w(i) ? i.value = o : null),
110
- class: "num",
111
- size: "small",
110
+ "onUpdate:value": t[1] || (t[1] = (o) => S(i) ? i.value = o : null),
111
+ class: "num sm",
112
+ size: e(M),
112
113
  min: 1,
113
114
  "show-button": !1,
114
115
  "input-props": { "aria-label": e(l)("config.upload.maxSizeMb") }
115
- }, null, 8, ["value", "input-props"]),
116
- t[4] || (t[4] = s("span", { class: "unit" }, "MB", -1))
116
+ }, null, 8, ["value", "size", "input-props"]),
117
+ t[4] || (t[4] = p("span", { class: "unit" }, "MB", -1))
117
118
  ]),
118
119
  _: 1
119
120
  }, 8, ["label", "keys"]),
120
- u(x, {
121
+ s(b, {
121
122
  label: e(l)("config.upload.allowedExtensions"),
122
123
  hint: e(l)("config.upload.extTip"),
123
- keys: [e(g)],
124
+ keys: [e(x)],
124
125
  tall: "",
125
126
  class: "exts"
126
127
  }, {
127
- default: c(() => [
128
- u(e(j), {
128
+ default: u(() => [
129
+ s(e(I), {
129
130
  value: n.value,
130
131
  "onUpdate:value": t[2] || (t[2] = (o) => n.value = o),
131
132
  size: "small"
@@ -133,22 +134,30 @@ const X = { class: "presets" }, Y = ["onClick"], q = {
133
134
  ]),
134
135
  _: 1
135
136
  }, 8, ["label", "hint", "keys"]),
136
- u(x, {
137
+ s(b, {
137
138
  label: e(l)("config.upload.quickAdd")
138
139
  }, {
139
- default: c(() => [
140
- s("span", X, [
141
- (r(), d(S, null, y(k, (o, m) => s("button", {
142
- key: m,
143
- type: "button",
144
- class: "chip",
145
- onClick: (_) => L(m)
146
- }, p(e(l)(`config.upload.preset.${m}`)), 9, Y)), 64)),
147
- s("button", {
148
- type: "button",
149
- class: "chip",
140
+ default: u(() => [
141
+ p("span", W, [
142
+ (m(), d(C, null, y(w, (o, c) => s(e(D), {
143
+ key: c,
144
+ size: e(_),
145
+ onClick: (z) => T(c)
146
+ }, {
147
+ default: u(() => [
148
+ f(r(e(l)(`config.upload.preset.${c}`)), 1)
149
+ ]),
150
+ _: 2
151
+ }, 1032, ["size", "onClick"])), 64)),
152
+ s(e(D), {
153
+ size: e(_),
150
154
  onClick: t[3] || (t[3] = (o) => n.value = [])
151
- }, p(e(l)("config.upload.preset.clear")), 1)
155
+ }, {
156
+ default: u(() => [
157
+ f(r(e(l)("config.upload.preset.clear")), 1)
158
+ ]),
159
+ _: 1
160
+ }, 8, ["size"])
152
161
  ])
153
162
  ]),
154
163
  _: 1
@@ -162,6 +171,6 @@ const X = { class: "presets" }, Y = ["onClick"], q = {
162
171
  }
163
172
  });
164
173
  export {
165
- ue as default
174
+ ce as default
166
175
  };
167
176
  //# sourceMappingURL=UploadSection2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UploadSection2.vue.js","sources":["../../../../../src/views/system/config/components/UploadSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件上传:大小上限 + 后缀白名单。后端 FileService 读这两键强制执行,保存即生效。\n// 后缀以逗号分隔落库,输入时补前导点、转小写(与后端 ParseExts 对齐)。\n// 预览是用户看到的上传框,再拿几个示例文件按新规则判一遍,能不能传、为什么不能一目了然。\nimport { computed } from 'vue'\nimport { NDynamicTags, NInputNumber, NSlider } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { UPLOAD_EXTS_KEY, UPLOAD_MAX_KEY } from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\n\nconst { t } = useI18n()\nconst { values } = useConfigDraft()\nconst { num } = useDraftFields()\nconst maxSizeMb = num(UPLOAD_MAX_KEY, 20)\n\nfunction normalizeExt(v: string): string {\n const s = v.trim().toLowerCase()\n return s.startsWith('.') ? s : '.' + s\n}\nconst exts = computed({\n get: () =>\n (values[UPLOAD_EXTS_KEY] ?? '')\n .split(',')\n .map(e => e.trim())\n .filter(Boolean),\n set: (list: string[]) => {\n values[UPLOAD_EXTS_KEY] = [...new Set(list.map(normalizeExt).filter(e => e !== '.'))].join(',')\n },\n})\n\nconst PRESETS = {\n images: ['.jpg', '.jpeg', '.png', '.gif', '.webp'],\n docs: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx'],\n archives: ['.zip', '.rar', '.7z'],\n} as const\nfunction addPreset(name: keyof typeof PRESETS) {\n exts.value = [...exts.value, ...PRESETS[name]]\n}\n\nconst SAMPLES = [\n { name: 'report.pdf', mb: 3.2 },\n { name: 'photo.png', mb: 1.4 },\n { name: 'demo.mp4', mb: 48 },\n { name: 'setup.exe', mb: 12 },\n]\nconst samples = computed(() =>\n SAMPLES.map(f => {\n const ext = f.name.slice(f.name.lastIndexOf('.'))\n // 白名单留空时格式以服务端默认为准,这里不替它下结论\n const extOk = exts.value.length ? exts.value.includes(ext) : undefined\n const sizeOk = f.mb <= maxSizeMb.value\n const status =\n extOk === false\n ? { ok: false, text: t('config.upload.fileBadExt', { ext }) }\n : !sizeOk\n ? { ok: false, text: t('config.upload.fileTooBig', { mb: maxSizeMb.value }) }\n : extOk\n ? { ok: true, text: t('config.upload.fileOk') }\n : { ok: undefined, text: t('config.upload.fileDefault') }\n return { ...f, ext: ext.slice(1).toUpperCase(), status }\n }),\n)\nconst limitText = computed(() =>\n t('config.upload.previewLimit', {\n exts: exts.value.length ? exts.value.join(' ') : t('config.upload.previewDefault'),\n mb: maxSizeMb.value,\n }),\n)\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.upload')\"\n :desc=\"t('config.upload.desc')\"\n :preview-title=\"t('config.upload.preview')\"\n layout=\"slim\"\n >\n <CfgGroup :title=\"t('config.upload.groupLimit')\">\n <CfgRow :label=\"t('config.upload.maxSizeMb')\" :keys=\"[UPLOAD_MAX_KEY]\">\n <n-slider\n v-model:value=\"maxSizeMb\"\n class=\"slider\"\n :min=\"1\"\n :max=\"200\"\n :tooltip=\"false\"\n :aria-label=\"t('config.upload.maxSizeMb')\"\n />\n <n-input-number\n v-model:value=\"maxSizeMb\"\n class=\"num\"\n size=\"small\"\n :min=\"1\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': t('config.upload.maxSizeMb') }\"\n />\n <span class=\"unit\">MB</span>\n </CfgRow>\n <CfgRow\n :label=\"t('config.upload.allowedExtensions')\"\n :hint=\"t('config.upload.extTip')\"\n :keys=\"[UPLOAD_EXTS_KEY]\"\n tall\n class=\"exts\"\n >\n <n-dynamic-tags v-model:value=\"exts\" size=\"small\" />\n </CfgRow>\n <CfgRow :label=\"t('config.upload.quickAdd')\">\n <span class=\"presets\">\n <button\n v-for=\"(_, name) in PRESETS\"\n :key=\"name\"\n type=\"button\"\n class=\"chip\"\n @click=\"addPreset(name)\"\n >\n {{ t(`config.upload.preset.${name}`) }}\n </button>\n <button type=\"button\" class=\"chip\" @click=\"exts = []\">\n {{ t('config.upload.preset.clear') }}\n </button>\n </span>\n </CfgRow>\n </CfgGroup>\n\n <template #preview>\n <div class=\"drop\" data-testid=\"upload-preview\">\n <AppIcon icon=\"ph:cloud-arrow-up\" :size=\"30\" class=\"ic\" />\n <b>{{ t('config.upload.previewDrop') }}</b>\n <small v-flash=\"limitText\">{{ limitText }}</small>\n </div>\n <ul v-flash=\"limitText\" class=\"files\">\n <li v-for=\"f in samples\" :key=\"f.name\">\n <span class=\"fi\">{{ f.ext }}</span>\n <span class=\"nm\">\n {{ f.name }}\n <small>{{ f.mb }} MB</small>\n </span>\n <span :class=\"['st', { ok: f.status.ok === true, no: f.status.ok === false }]\">\n {{ f.status.text }}\n </span>\n </li>\n </ul>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.slider {\n width: 160px;\n}\n.num {\n width: 72px;\n}\n.num :deep(input) {\n text-align: right;\n}\n.unit {\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n.exts :deep(.ctl) {\n flex: 1.4;\n}\n.exts :deep(.n-dynamic-tags) {\n justify-content: flex-end;\n}\n.presets {\n display: inline-flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 5px;\n}\n.chip {\n padding: 2px 9px;\n border: 0;\n border-radius: 6px;\n background: var(--color-fill);\n font: inherit;\n font-size: var(--font-size-sm);\n line-height: 20px;\n color: var(--color-text-secondary);\n cursor: pointer;\n}\n.chip:hover {\n background: var(--color-fill-hover);\n}\n.chip:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 1px;\n}\n.drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 24px 16px;\n border: 1.5px dashed var(--color-border-strong);\n border-radius: 14px;\n background: var(--color-bg-container);\n text-align: center;\n}\n.drop .ic {\n color: var(--color-primary);\n}\n.drop b {\n font-weight: 500;\n}\n.drop small {\n padding: 1px 6px;\n border-radius: 6px;\n color: var(--color-text-secondary);\n}\n.files {\n margin: 0;\n padding: 0;\n list-style: none;\n border-radius: 12px;\n background: var(--color-bg-container);\n}\n.files li {\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 14px;\n font-size: var(--font-size-base);\n}\n.files li + li::before {\n content: '';\n position: absolute;\n top: 0;\n left: 50px;\n right: 0;\n border-top: 0.5px solid var(--color-border);\n}\n.fi {\n display: grid;\n flex: none;\n place-items: center;\n width: 26px;\n height: 30px;\n border-radius: 5px;\n background: var(--color-fill);\n font-size: 9px;\n font-weight: 700;\n color: var(--color-text-secondary);\n}\n.nm {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n}\n.nm small {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.st {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.st.ok {\n color: var(--color-success);\n}\n.st.no {\n color: var(--color-danger);\n}\n</style>\n"],"names":["t","useI18n","values","useConfigDraft","num","useDraftFields","maxSizeMb","UPLOAD_MAX_KEY","normalizeExt","v","s","exts","computed","UPLOAD_EXTS_KEY","e","list","PRESETS","addPreset","name","SAMPLES","samples","f","ext","extOk","sizeOk","status","limitText","_createBlock","SectionLayout","_unref","_createElementVNode","_hoisted_3","_createVNode","AppIcon","_createElementBlock","_withDirectives","_openBlock","_hoisted_4","_Fragment","_renderList","_hoisted_5","_toDisplayString","_hoisted_6","_normalizeClass","CfgGroup","CfgRow","NSlider","$event","NInputNumber","_cache","NDynamicTags","_hoisted_1","_","_hoisted_2"],"mappings":"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"}
1
+ {"version":3,"file":"UploadSection2.vue.js","sources":["../../../../../src/views/system/config/components/UploadSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件上传:大小上限 + 后缀白名单。后端 FileService 读这两键强制执行,保存即生效。\n// 后缀以逗号分隔落库,输入时补前导点、转小写(与后端 ParseExts 对齐)。\n// 预览是用户看到的上传框,再拿几个示例文件按新规则判一遍,能不能传、为什么不能一目了然。\nimport { computed } from 'vue'\nimport { NButton, NDynamicTags, NInputNumber, NSlider } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { UPLOAD_EXTS_KEY, UPLOAD_MAX_KEY } from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\n\nconst { t } = useI18n()\nconst { values } = useConfigDraft()\nconst { num } = useDraftFields()\nconst { ctl, sm } = useConfigLayout()\nconst maxSizeMb = num(UPLOAD_MAX_KEY, 20)\n\nfunction normalizeExt(v: string): string {\n const s = v.trim().toLowerCase()\n return s.startsWith('.') ? s : '.' + s\n}\nconst exts = computed({\n get: () =>\n (values[UPLOAD_EXTS_KEY] ?? '')\n .split(',')\n .map(e => e.trim())\n .filter(Boolean),\n set: (list: string[]) => {\n values[UPLOAD_EXTS_KEY] = [...new Set(list.map(normalizeExt).filter(e => e !== '.'))].join(',')\n },\n})\n\nconst PRESETS = {\n images: ['.jpg', '.jpeg', '.png', '.gif', '.webp'],\n docs: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx'],\n archives: ['.zip', '.rar', '.7z'],\n} as const\nfunction addPreset(name: keyof typeof PRESETS) {\n exts.value = [...exts.value, ...PRESETS[name]]\n}\n\nconst SAMPLES = [\n { name: 'report.pdf', mb: 3.2 },\n { name: 'photo.png', mb: 1.4 },\n { name: 'demo.mp4', mb: 48 },\n { name: 'setup.exe', mb: 12 },\n]\nconst samples = computed(() =>\n SAMPLES.map(f => {\n const ext = f.name.slice(f.name.lastIndexOf('.'))\n // 白名单留空时格式以服务端默认为准,这里不替它下结论\n const extOk = exts.value.length ? exts.value.includes(ext) : undefined\n const sizeOk = f.mb <= maxSizeMb.value\n const status =\n extOk === false\n ? { ok: false, text: t('config.upload.fileBadExt', { ext }) }\n : !sizeOk\n ? { ok: false, text: t('config.upload.fileTooBig', { mb: maxSizeMb.value }) }\n : extOk\n ? { ok: true, text: t('config.upload.fileOk') }\n : { ok: undefined, text: t('config.upload.fileDefault') }\n return { ...f, ext: ext.slice(1).toUpperCase(), status }\n }),\n)\nconst limitText = computed(() =>\n t('config.upload.previewLimit', {\n exts: exts.value.length ? exts.value.join(' ') : t('config.upload.previewDefault'),\n mb: maxSizeMb.value,\n }),\n)\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.upload')\"\n :desc=\"t('config.upload.desc')\"\n :preview-title=\"t('config.upload.preview')\"\n layout=\"slim\"\n >\n <CfgGroup :title=\"t('config.upload.groupLimit')\">\n <CfgRow :label=\"t('config.upload.maxSizeMb')\" :keys=\"[UPLOAD_MAX_KEY]\">\n <n-slider\n v-model:value=\"maxSizeMb\"\n class=\"slider\"\n :min=\"1\"\n :max=\"200\"\n :tooltip=\"false\"\n :aria-label=\"t('config.upload.maxSizeMb')\"\n />\n <n-input-number\n v-model:value=\"maxSizeMb\"\n class=\"num sm\"\n :size=\"ctl\"\n :min=\"1\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': t('config.upload.maxSizeMb') }\"\n />\n <span class=\"unit\">MB</span>\n </CfgRow>\n <CfgRow\n :label=\"t('config.upload.allowedExtensions')\"\n :hint=\"t('config.upload.extTip')\"\n :keys=\"[UPLOAD_EXTS_KEY]\"\n tall\n class=\"exts\"\n >\n <n-dynamic-tags v-model:value=\"exts\" size=\"small\" />\n </CfgRow>\n <CfgRow :label=\"t('config.upload.quickAdd')\">\n <span class=\"presets\">\n <n-button v-for=\"(_, name) in PRESETS\" :key=\"name\" :size=\"sm\" @click=\"addPreset(name)\">\n {{ t(`config.upload.preset.${name}`) }}\n </n-button>\n <n-button :size=\"sm\" @click=\"exts = []\">\n {{ t('config.upload.preset.clear') }}\n </n-button>\n </span>\n </CfgRow>\n </CfgGroup>\n\n <template #preview>\n <div class=\"drop\" data-testid=\"upload-preview\">\n <AppIcon icon=\"ph:cloud-arrow-up\" :size=\"30\" class=\"ic\" />\n <b>{{ t('config.upload.previewDrop') }}</b>\n <small v-flash=\"limitText\">{{ limitText }}</small>\n </div>\n <ul v-flash=\"limitText\" class=\"files\">\n <li v-for=\"f in samples\" :key=\"f.name\">\n <span class=\"fi\">{{ f.ext }}</span>\n <span class=\"nm\">\n {{ f.name }}\n <small>{{ f.mb }} MB</small>\n </span>\n <span :class=\"['st', { ok: f.status.ok === true, no: f.status.ok === false }]\">\n {{ f.status.text }}\n </span>\n </li>\n </ul>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.slider {\n width: 160px;\n}\n.num {\n width: 96px;\n}\n.num.sm {\n width: 72px;\n}\n.num :deep(input) {\n text-align: right;\n}\n.unit {\n flex: none;\n min-width: 32px;\n font-size: 13px;\n color: var(--text-2);\n}\n.exts :deep(.ctl) {\n flex: 1.4 1 0;\n}\n.exts :deep(.n-dynamic-tags) {\n justify-content: flex-end;\n}\n.presets {\n display: inline-flex;\n flex: none;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 5px;\n}\n.drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 24px 16px;\n border: 1.5px dashed var(--hairline-strong);\n border-radius: var(--radius-lg);\n background: var(--cfg-card);\n text-align: center;\n}\n.drop .ic {\n color: var(--signal);\n}\n.drop b {\n font-size: 14px;\n font-weight: 600;\n}\n.drop small {\n border-radius: 6px;\n font-size: 13px;\n color: var(--text-3);\n}\n.files {\n margin: 0;\n padding: 4px 0;\n list-style: none;\n border-radius: var(--radius-lg);\n background: var(--cfg-card);\n}\n.files li {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 14px;\n font-size: 14px;\n}\n.files li + li {\n border-top: 1px solid var(--separator);\n}\n.fi {\n display: grid;\n flex: none;\n place-items: center;\n width: 34px;\n height: 24px;\n border-radius: 6px;\n background: var(--glass-strong);\n font-size: 11px;\n font-weight: 600;\n color: var(--text-2);\n}\n.nm {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n}\n.nm small {\n font-size: 13px;\n color: var(--text-3);\n}\n.st {\n flex: none;\n font-size: 13px;\n color: var(--text-3);\n}\n.st.ok {\n color: var(--ok);\n}\n.st.no {\n color: var(--err);\n}\n</style>\n"],"names":["t","useI18n","values","useConfigDraft","num","useDraftFields","ctl","sm","useConfigLayout","maxSizeMb","UPLOAD_MAX_KEY","normalizeExt","v","s","exts","computed","UPLOAD_EXTS_KEY","e","list","PRESETS","addPreset","name","SAMPLES","samples","f","ext","extOk","sizeOk","status","limitText","_createBlock","SectionLayout","_unref","_createElementVNode","_hoisted_2","_createVNode","AppIcon","_createElementBlock","_withDirectives","_openBlock","_hoisted_3","_Fragment","_renderList","_hoisted_4","_toDisplayString","_hoisted_5","_normalizeClass","CfgGroup","CfgRow","NSlider","$event","NInputNumber","_cache","NDynamicTags","_hoisted_1","_","NButton","_createTextVNode"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import o from "./WatermarkSection2.vue.js";
2
+ /* empty css */
3
+ import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-f22dc314"]]);
5
+ export {
6
+ c as default
7
+ };
8
+ //# sourceMappingURL=WatermarkSection.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WatermarkSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,284 @@
1
+ import { defineComponent as G, computed as u, openBlock as R, createBlock as h, unref as e, withCtx as s, createVNode as t, isRef as f, createElementVNode as p, createElementBlock as P, Fragment as j, renderList as Y, normalizeClass as $, toDisplayString as y } from "vue";
2
+ import { NSwitch as D, NCheckboxGroup as q, NCheckbox as J, NInput as Q, NSelect as X, NSlider as A } from "naive-ui";
3
+ import { useI18n as Z } from "vue-i18n";
4
+ import { WATERMARK_KEY as i, DEFAULT_WATERMARK as c, normalizeWatermarkFields as V, WATERMARK_FIELDS as ee, WATERMARK_TIME_FORMATS as ae, formatWatermarkTime as le, watermarkParts as te, watermarkFromValues as ie, WATERMARK_LIMITS as b } from "../../../../lib/watermark.js";
5
+ import { useConfigDraft as oe, useDraftFields as ne } from "../draft.js";
6
+ import { useConfigLayout as se } from "../layoutMode.js";
7
+ import re from "./SectionLayout.vue.js";
8
+ import L from "./CfgGroup.vue.js";
9
+ import m from "./CfgRow.vue.js";
10
+ import N from "./CfgSegment.vue.js";
11
+ import me from "./ScaleToFit.vue.js";
12
+ import de from "./AdminMock.vue.js";
13
+ const ue = { class: "wm-fields" }, fe = { class: "unit" }, be = { class: "unit" }, ce = { class: "unit" }, Re = /* @__PURE__ */ G({
14
+ __name: "WatermarkSection",
15
+ setup(pe) {
16
+ const { t: a } = Z(), { values: d } = oe(), { str: W, num: x, bool: O } = ne(), { ctl: C } = se(), n = O(i.enabled), S = u({
17
+ get: () => d[i.fields] === void 0 ? [...c.fields] : V(d[i.fields]),
18
+ set: (r) => {
19
+ d[i.fields] = V(r).join(",");
20
+ }
21
+ }), F = W(i.text), _ = (r, o) => u({
22
+ get: () => d[r] || o,
23
+ set: (l) => {
24
+ d[r] = l;
25
+ }
26
+ }), T = _(
27
+ i.timeFormat,
28
+ c.timeFormat
29
+ ), z = _(i.layout, c.layout), E = _(i.density, c.density), w = x(i.fontSize, c.fontSize), k = x(i.opacity, c.opacity), v = x(i.rotate, c.rotate), U = u({
30
+ get: () => d[i.cross] !== "false",
31
+ set: (r) => {
32
+ d[i.cross] = r ? "true" : "false";
33
+ }
34
+ }), g = (r) => S.value.includes(r), H = u(
35
+ () => ee.map((r) => ({ value: r, label: a(`config.watermark.field.${r}`) }))
36
+ ), I = u(
37
+ () => ae.map((r) => ({ value: r, label: le(r, /* @__PURE__ */ new Date()) }))
38
+ ), K = u(() => [
39
+ { value: "single", label: a("config.watermark.layoutSingle") },
40
+ { value: "multi", label: a("config.watermark.layoutMulti") }
41
+ ]), B = u(() => [
42
+ { value: "sparse", label: a("config.watermark.sparse") },
43
+ { value: "normal", label: a("config.watermark.normal") },
44
+ { value: "dense", label: a("config.watermark.dense") }
45
+ ]), M = u(
46
+ () => n.value && te(
47
+ ie(d),
48
+ { name: "x", account: "x", org: "x", phoneTail: "x" },
49
+ /* @__PURE__ */ new Date()
50
+ ).length === 0
51
+ );
52
+ return (r, o) => (R(), h(re, {
53
+ title: e(a)("config.tab.watermark"),
54
+ desc: e(a)("config.watermark.desc"),
55
+ "preview-title": e(a)("config.brand.preview")
56
+ }, {
57
+ preview: s(() => [
58
+ t(me, {
59
+ width: 880,
60
+ height: 540
61
+ }, {
62
+ default: s(() => [
63
+ t(de)
64
+ ]),
65
+ _: 1
66
+ })
67
+ ]),
68
+ default: s(() => [
69
+ t(L, {
70
+ title: e(a)("config.watermark.groupContent")
71
+ }, {
72
+ default: s(() => [
73
+ t(m, {
74
+ label: e(a)("config.watermark.enable"),
75
+ hint: e(a)("config.watermark.enableHint"),
76
+ keys: [e(i).enabled]
77
+ }, {
78
+ default: s(() => [
79
+ t(e(D), {
80
+ value: e(n),
81
+ "onUpdate:value": o[0] || (o[0] = (l) => f(n) ? n.value = l : null),
82
+ "aria-label": e(a)("config.watermark.enable")
83
+ }, null, 8, ["value", "aria-label"])
84
+ ]),
85
+ _: 1
86
+ }, 8, ["label", "hint", "keys"]),
87
+ t(m, {
88
+ label: e(a)("config.watermark.content"),
89
+ keys: [e(i).fields],
90
+ disabled: !e(n),
91
+ tall: "",
92
+ class: "wm-content"
93
+ }, {
94
+ hint: s(() => [
95
+ p("span", {
96
+ class: $({ warn: M.value })
97
+ }, y(M.value ? e(a)("config.watermark.contentEmpty") : e(a)("config.watermark.contentHint")), 3)
98
+ ]),
99
+ default: s(() => [
100
+ t(e(q), {
101
+ value: S.value,
102
+ "onUpdate:value": o[1] || (o[1] = (l) => S.value = l),
103
+ disabled: !e(n)
104
+ }, {
105
+ default: s(() => [
106
+ p("div", ue, [
107
+ (R(!0), P(j, null, Y(H.value, (l) => (R(), h(e(J), {
108
+ key: l.value,
109
+ value: l.value,
110
+ label: l.label
111
+ }, null, 8, ["value", "label"]))), 128))
112
+ ])
113
+ ]),
114
+ _: 1
115
+ }, 8, ["value", "disabled"])
116
+ ]),
117
+ _: 1
118
+ }, 8, ["label", "keys", "disabled"]),
119
+ t(m, {
120
+ label: e(a)("config.watermark.text"),
121
+ hint: e(a)("config.watermark.textHint"),
122
+ keys: [e(i).text],
123
+ disabled: !e(n) || !g("text"),
124
+ sub: ""
125
+ }, {
126
+ default: s(() => [
127
+ t(e(Q), {
128
+ value: e(F),
129
+ "onUpdate:value": o[2] || (o[2] = (l) => f(F) ? F.value = l : null),
130
+ size: e(C),
131
+ maxlength: e(b).text,
132
+ "show-count": "",
133
+ disabled: !e(n) || !g("text"),
134
+ placeholder: e(a)("config.watermark.textPlaceholder", { max: e(b).text }),
135
+ "input-props": { "aria-label": e(a)("config.watermark.text") }
136
+ }, null, 8, ["value", "size", "maxlength", "disabled", "placeholder", "input-props"])
137
+ ]),
138
+ _: 1
139
+ }, 8, ["label", "hint", "keys", "disabled"]),
140
+ t(m, {
141
+ label: e(a)("config.watermark.timeFormat"),
142
+ keys: [e(i).timeFormat],
143
+ disabled: !e(n) || !g("time"),
144
+ sub: ""
145
+ }, {
146
+ default: s(() => [
147
+ t(e(X), {
148
+ value: e(T),
149
+ "onUpdate:value": o[3] || (o[3] = (l) => f(T) ? T.value = l : null),
150
+ size: e(C),
151
+ options: I.value,
152
+ disabled: !e(n) || !g("time"),
153
+ "aria-label": e(a)("config.watermark.timeFormat")
154
+ }, null, 8, ["value", "size", "options", "disabled", "aria-label"])
155
+ ]),
156
+ _: 1
157
+ }, 8, ["label", "keys", "disabled"])
158
+ ]),
159
+ _: 1
160
+ }, 8, ["title"]),
161
+ t(L, {
162
+ title: e(a)("config.watermark.groupStyle")
163
+ }, {
164
+ default: s(() => [
165
+ t(m, {
166
+ label: e(a)("config.watermark.layout"),
167
+ keys: [e(i).layout],
168
+ disabled: !e(n)
169
+ }, {
170
+ default: s(() => [
171
+ t(N, {
172
+ modelValue: e(z),
173
+ "onUpdate:modelValue": o[4] || (o[4] = (l) => f(z) ? z.value = l : null),
174
+ options: K.value,
175
+ label: e(a)("config.watermark.layout")
176
+ }, null, 8, ["modelValue", "options", "label"])
177
+ ]),
178
+ _: 1
179
+ }, 8, ["label", "keys", "disabled"]),
180
+ t(m, {
181
+ label: e(a)("config.watermark.fontSize"),
182
+ keys: [e(i).fontSize],
183
+ disabled: !e(n)
184
+ }, {
185
+ default: s(() => [
186
+ t(e(A), {
187
+ value: e(w),
188
+ "onUpdate:value": o[5] || (o[5] = (l) => f(w) ? w.value = l : null),
189
+ class: "slider",
190
+ min: e(b).fontSize.min,
191
+ max: e(b).fontSize.max,
192
+ tooltip: !1,
193
+ disabled: !e(n),
194
+ "aria-label": e(a)("config.watermark.fontSize")
195
+ }, null, 8, ["value", "min", "max", "disabled", "aria-label"]),
196
+ p("span", fe, y(e(w)) + " px", 1)
197
+ ]),
198
+ _: 1
199
+ }, 8, ["label", "keys", "disabled"]),
200
+ t(m, {
201
+ label: e(a)("config.watermark.opacity"),
202
+ hint: e(a)("config.watermark.opacityHint"),
203
+ keys: [e(i).opacity],
204
+ disabled: !e(n)
205
+ }, {
206
+ default: s(() => [
207
+ t(e(A), {
208
+ value: e(k),
209
+ "onUpdate:value": o[6] || (o[6] = (l) => f(k) ? k.value = l : null),
210
+ class: "slider",
211
+ min: e(b).opacity.min,
212
+ max: e(b).opacity.max,
213
+ tooltip: !1,
214
+ disabled: !e(n),
215
+ "aria-label": e(a)("config.watermark.opacity")
216
+ }, null, 8, ["value", "min", "max", "disabled", "aria-label"]),
217
+ p("span", be, y(e(k)) + "%", 1)
218
+ ]),
219
+ _: 1
220
+ }, 8, ["label", "hint", "keys", "disabled"]),
221
+ t(m, {
222
+ label: e(a)("config.watermark.rotate"),
223
+ keys: [e(i).rotate],
224
+ disabled: !e(n)
225
+ }, {
226
+ default: s(() => [
227
+ t(e(A), {
228
+ value: e(v),
229
+ "onUpdate:value": o[7] || (o[7] = (l) => f(v) ? v.value = l : null),
230
+ class: "slider",
231
+ min: e(b).rotate.min,
232
+ max: e(b).rotate.max,
233
+ step: 5,
234
+ tooltip: !1,
235
+ disabled: !e(n),
236
+ "aria-label": e(a)("config.watermark.rotate")
237
+ }, null, 8, ["value", "min", "max", "disabled", "aria-label"]),
238
+ p("span", ce, y(e(v)) + "°", 1)
239
+ ]),
240
+ _: 1
241
+ }, 8, ["label", "keys", "disabled"]),
242
+ t(m, {
243
+ label: e(a)("config.watermark.density"),
244
+ keys: [e(i).density],
245
+ disabled: !e(n)
246
+ }, {
247
+ default: s(() => [
248
+ t(N, {
249
+ modelValue: e(E),
250
+ "onUpdate:modelValue": o[8] || (o[8] = (l) => f(E) ? E.value = l : null),
251
+ options: B.value,
252
+ label: e(a)("config.watermark.density")
253
+ }, null, 8, ["modelValue", "options", "label"])
254
+ ]),
255
+ _: 1
256
+ }, 8, ["label", "keys", "disabled"]),
257
+ t(m, {
258
+ label: e(a)("config.watermark.cross"),
259
+ hint: e(a)("config.watermark.crossHint"),
260
+ keys: [e(i).cross],
261
+ disabled: !e(n)
262
+ }, {
263
+ default: s(() => [
264
+ t(e(D), {
265
+ value: U.value,
266
+ "onUpdate:value": o[9] || (o[9] = (l) => U.value = l),
267
+ disabled: !e(n),
268
+ "aria-label": e(a)("config.watermark.cross")
269
+ }, null, 8, ["value", "disabled", "aria-label"])
270
+ ]),
271
+ _: 1
272
+ }, 8, ["label", "hint", "keys", "disabled"])
273
+ ]),
274
+ _: 1
275
+ }, 8, ["title"])
276
+ ]),
277
+ _: 1
278
+ }, 8, ["title", "desc", "preview-title"]));
279
+ }
280
+ });
281
+ export {
282
+ Re as default
283
+ };
284
+ //# sourceMappingURL=WatermarkSection2.vue.js.map