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,252 +1,254 @@
1
- import { defineComponent as $, ref as x, computed as u, openBlock as W, createBlock as X, unref as e, withCtx as i, createVNode as a, isRef as p, createElementVNode as R, normalizeClass as _, toDisplayString as M, withDirectives as O, vShow as T } from "vue";
2
- import { NInput as g, NSwitch as Z } from "naive-ui";
3
- import { useI18n as j } from "vue-i18n";
4
- import { splitLoginHeroFeatures as q } from "../../../../lib/loginHero.js";
5
- import { useAppStore as J } from "../../../../stores/app.js";
6
- import { SUBTITLE_KEY as K, LOGIN_LOCALES as V, heroKeys as B, SHOW_FEATURES_KEY as C, LOGO_KEY as Q, BRAND_KEYS as ee } from "../groups.js";
7
- import { useConfigDraft as le, useDraftFields as oe } from "../draft.js";
1
+ import { defineComponent as W, ref as x, computed as p, openBlock as X, createBlock as Z, unref as e, withCtx as a, createVNode as i, isRef as g, createElementVNode as R, normalizeClass as _, toDisplayString as M, withDirectives as O, vShow as T } from "vue";
2
+ import { NInput as f, NSwitch as j } from "naive-ui";
3
+ import { useI18n as q } from "vue-i18n";
4
+ import { splitLoginHeroFeatures as J } from "../../../../lib/loginHero.js";
5
+ import { useAppStore as Q } from "../../../../stores/app.js";
6
+ import { SUBTITLE_KEY as K, LOGIN_LOCALES as V, heroKeys as B, SHOW_FEATURES_KEY as C, LOGO_KEY as ee, BRAND_KEYS as le } from "../groups.js";
7
+ import { useConfigDraft as oe, useDraftFields as ie } from "../draft.js";
8
+ import { useConfigLayout as te } from "../layoutMode.js";
8
9
  import ae from "./SectionLayout.vue.js";
9
10
  import D from "./CfgGroup.vue.js";
10
11
  import s from "./CfgRow.vue.js";
11
12
  import H from "./CfgSegment.vue.js";
12
13
  import I from "./ScaleToFit.vue.js";
13
- import te from "./LogoEditor.vue.js";
14
- import ie from "./AdminMock.vue.js";
15
- import ne from "./LoginMock.vue.js";
16
- const Ue = /* @__PURE__ */ $({
14
+ import ne from "./LogoEditor.vue.js";
15
+ import se from "./AdminMock.vue.js";
16
+ import re from "./LoginMock.vue.js";
17
+ const Le = /* @__PURE__ */ W({
17
18
  __name: "BrandSection",
18
- setup(se, { expose: z }) {
19
- const { t: l } = j(), G = J(), { values: f } = le(), { str: c } = oe(), m = c("sys.site.title"), y = c("sys.site.copyright"), w = c("sys.site.copyrightUrl"), k = c(K), r = x("admin"), P = u(() => [
19
+ setup(ue, { expose: G }) {
20
+ const { t: l } = q(), P = Q(), { values: c } = oe(), { str: v } = ie(), { ctl: r } = te(), y = v("sys.site.title"), w = v("sys.site.copyright"), k = v("sys.site.copyrightUrl"), S = v(K), u = x("admin"), Y = p(() => [
20
21
  { value: "admin", label: l("config.brand.previewAdmin") },
21
22
  { value: "login", label: l("config.brand.previewLogin") }
22
- ]), d = x(G.locale === "en-US" ? "en-US" : "zh-CN"), Y = u(
23
+ ]), d = x(P.locale === "en-US" ? "en-US" : "zh-CN"), $ = p(
23
24
  () => V.map((n) => ({
24
25
  value: n,
25
26
  label: l(`config.login.locale${n === "zh-CN" ? "Zh" : "En"}`)
26
27
  }))
27
28
  );
28
29
  function N(n) {
29
- d.value = n, r.value = "login";
30
+ d.value = n, u.value = "login";
30
31
  }
31
- const A = u(() => B(d.value)), S = (n) => u({
32
- get: () => f[A.value[n]] ?? "",
32
+ const A = p(() => B(d.value)), U = (n) => p({
33
+ get: () => c[A.value[n]] ?? "",
33
34
  set: (o) => {
34
- f[A.value[n]] = o;
35
+ c[A.value[n]] = o;
35
36
  }
36
- }), v = S("headline"), h = S("highlight"), b = S("features"), U = u({
37
- get: () => f[C] !== "false",
37
+ }), h = U("headline"), b = U("highlight"), m = U("features"), z = p({
38
+ get: () => c[C] !== "false",
38
39
  set: (n) => {
39
- f[C] = n ? "true" : "false";
40
+ c[C] = n ? "true" : "false";
40
41
  }
41
- }), E = u(() => {
42
- const n = v.value.trim(), o = h.value.trim();
42
+ }), E = p(() => {
43
+ const n = h.value.trim(), o = b.value.trim();
43
44
  return !!n && !!o && !n.includes(o);
44
- }), F = u(
45
- () => q(b.value, Number.MAX_SAFE_INTEGER).length > 5
46
- ), L = (n) => V.map((o) => B(o)[n]);
47
- return z({ setLocale: N }), (n, o) => (W(), X(ae, {
45
+ }), L = p(
46
+ () => J(m.value, Number.MAX_SAFE_INTEGER).length > 5
47
+ ), F = (n) => V.map((o) => B(o)[n]);
48
+ return G({ setLocale: N }), (n, o) => (X(), Z(ae, {
48
49
  title: e(l)("config.tab.brand"),
49
50
  desc: e(l)("config.brand.desc"),
50
51
  "preview-title": e(l)("config.brand.preview")
51
52
  }, {
52
- "preview-extra": i(() => [
53
- a(H, {
54
- modelValue: r.value,
55
- "onUpdate:modelValue": o[10] || (o[10] = (t) => r.value = t),
56
- options: P.value,
53
+ "preview-extra": a(() => [
54
+ i(H, {
55
+ modelValue: u.value,
56
+ "onUpdate:modelValue": o[10] || (o[10] = (t) => u.value = t),
57
+ options: Y.value,
57
58
  label: e(l)("config.brand.preview")
58
59
  }, null, 8, ["modelValue", "options", "label"])
59
60
  ]),
60
- preview: i(() => [
61
- O(a(I, {
61
+ preview: a(() => [
62
+ O(i(I, {
62
63
  width: 880,
63
64
  height: 540
64
65
  }, {
65
- default: i(() => [
66
- a(ie)
66
+ default: a(() => [
67
+ i(se)
67
68
  ]),
68
69
  _: 1
69
70
  }, 512), [
70
- [T, r.value === "admin"]
71
+ [T, u.value === "admin"]
71
72
  ]),
72
- O(a(I, {
73
+ O(i(I, {
73
74
  width: 880,
74
75
  height: 540
75
76
  }, {
76
- default: i(() => [
77
- a(ne, { locale: d.value }, null, 8, ["locale"])
77
+ default: a(() => [
78
+ i(re, { locale: d.value }, null, 8, ["locale"])
78
79
  ]),
79
80
  _: 1
80
81
  }, 512), [
81
- [T, r.value === "login"]
82
+ [T, u.value === "login"]
82
83
  ])
83
84
  ]),
84
- default: i(() => [
85
- a(D, {
85
+ default: a(() => [
86
+ i(D, {
86
87
  title: e(l)("config.brand.groupSite"),
87
- onFocusin: o[3] || (o[3] = (t) => r.value = "admin")
88
+ onFocusin: o[3] || (o[3] = (t) => u.value = "admin")
88
89
  }, {
89
- default: i(() => [
90
- a(s, {
90
+ default: a(() => [
91
+ i(s, {
91
92
  label: e(l)("config.logo.title"),
92
93
  hint: e(l)("config.logo.help"),
93
- keys: [e(Q)],
94
+ keys: [e(ee)],
94
95
  class: "logo-row"
95
96
  }, {
96
- default: i(() => [
97
- a(te)
97
+ default: a(() => [
98
+ i(ne)
98
99
  ]),
99
100
  _: 1
100
101
  }, 8, ["label", "hint", "keys"]),
101
- a(s, {
102
+ i(s, {
102
103
  label: e(l)("config.base.siteTitle"),
103
- keys: [e(ee)[0]]
104
+ keys: [e(le)[0]]
104
105
  }, {
105
- default: i(() => [
106
- a(e(g), {
107
- value: e(m),
108
- "onUpdate:value": o[0] || (o[0] = (t) => p(m) ? m.value = t : null),
109
- class: "fld",
106
+ default: a(() => [
107
+ i(e(f), {
108
+ value: e(y),
109
+ "onUpdate:value": o[0] || (o[0] = (t) => g(y) ? y.value = t : null),
110
+ size: e(r),
110
111
  placeholder: "SmartAdmin",
111
112
  "input-props": { "aria-label": e(l)("config.base.siteTitle") }
112
- }, null, 8, ["value", "input-props"])
113
+ }, null, 8, ["value", "size", "input-props"])
113
114
  ]),
114
115
  _: 1
115
116
  }, 8, ["label", "keys"]),
116
- a(s, {
117
+ i(s, {
117
118
  label: e(l)("config.base.copyright"),
118
119
  keys: ["sys.site.copyright"]
119
120
  }, {
120
- default: i(() => [
121
- a(e(g), {
122
- value: e(y),
123
- "onUpdate:value": o[1] || (o[1] = (t) => p(y) ? y.value = t : null),
124
- class: "fld",
121
+ default: a(() => [
122
+ i(e(f), {
123
+ value: e(w),
124
+ "onUpdate:value": o[1] || (o[1] = (t) => g(w) ? w.value = t : null),
125
+ size: e(r),
125
126
  placeholder: e(l)("config.brand.copyrightPh"),
126
127
  "input-props": { "aria-label": e(l)("config.base.copyright") }
127
- }, null, 8, ["value", "placeholder", "input-props"])
128
+ }, null, 8, ["value", "size", "placeholder", "input-props"])
128
129
  ]),
129
130
  _: 1
130
131
  }, 8, ["label"]),
131
- a(s, {
132
+ i(s, {
132
133
  label: e(l)("config.base.copyrightUrl"),
133
134
  hint: e(l)("config.brand.copyrightUrlHint"),
134
135
  keys: ["sys.site.copyrightUrl"]
135
136
  }, {
136
- default: i(() => [
137
- a(e(g), {
138
- value: e(w),
139
- "onUpdate:value": o[2] || (o[2] = (t) => p(w) ? w.value = t : null),
140
- class: "fld",
137
+ default: a(() => [
138
+ i(e(f), {
139
+ value: e(k),
140
+ "onUpdate:value": o[2] || (o[2] = (t) => g(k) ? k.value = t : null),
141
+ size: e(r),
141
142
  placeholder: "https://",
142
143
  "input-props": { "aria-label": e(l)("config.base.copyrightUrl") }
143
- }, null, 8, ["value", "input-props"])
144
+ }, null, 8, ["value", "size", "input-props"])
144
145
  ]),
145
146
  _: 1
146
147
  }, 8, ["label", "hint"])
147
148
  ]),
148
149
  _: 1
149
150
  }, 8, ["title"]),
150
- a(D, {
151
+ i(D, {
151
152
  title: e(l)("config.brand.groupLogin"),
152
- onFocusin: o[9] || (o[9] = (t) => r.value = "login")
153
+ onFocusin: o[9] || (o[9] = (t) => u.value = "login")
153
154
  }, {
154
- extra: i(() => [
155
- a(H, {
155
+ extra: a(() => [
156
+ i(H, {
156
157
  "model-value": d.value,
157
- options: Y.value,
158
+ options: $.value,
158
159
  label: e(l)("config.login.language"),
159
160
  "data-testid": "login-locale",
160
161
  "onUpdate:modelValue": N
161
162
  }, null, 8, ["model-value", "options", "label"])
162
163
  ]),
163
- default: i(() => [
164
- a(s, {
164
+ default: a(() => [
165
+ i(s, {
165
166
  label: e(l)("config.base.siteSubtitle"),
166
167
  keys: [e(K)]
167
168
  }, {
168
- default: i(() => [
169
- a(e(g), {
170
- value: e(k),
171
- "onUpdate:value": o[4] || (o[4] = (t) => p(k) ? k.value = t : null),
172
- class: "fld",
169
+ default: a(() => [
170
+ i(e(f), {
171
+ value: e(S),
172
+ "onUpdate:value": o[4] || (o[4] = (t) => g(S) ? S.value = t : null),
173
+ size: e(r),
173
174
  placeholder: e(l)("login.subtitle", {}, { locale: d.value }),
174
175
  "input-props": { "aria-label": e(l)("config.base.siteSubtitle") }
175
- }, null, 8, ["value", "placeholder", "input-props"])
176
+ }, null, 8, ["value", "size", "placeholder", "input-props"])
176
177
  ]),
177
178
  _: 1
178
179
  }, 8, ["label", "keys"]),
179
- a(s, {
180
+ i(s, {
180
181
  label: e(l)("config.login.headline"),
181
- keys: L("headline")
182
+ keys: F("headline")
182
183
  }, {
183
- default: i(() => [
184
- a(e(g), {
185
- value: e(v),
186
- "onUpdate:value": o[5] || (o[5] = (t) => p(v) ? v.value = t : null),
187
- class: "fld",
184
+ default: a(() => [
185
+ i(e(f), {
186
+ value: e(h),
187
+ "onUpdate:value": o[5] || (o[5] = (t) => g(h) ? h.value = t : null),
188
+ size: e(r),
188
189
  placeholder: e(l)("config.login.headlinePlaceholder"),
189
190
  "input-props": { "aria-label": e(l)("config.login.headline") }
190
- }, null, 8, ["value", "placeholder", "input-props"])
191
+ }, null, 8, ["value", "size", "placeholder", "input-props"])
191
192
  ]),
192
193
  _: 1
193
194
  }, 8, ["label", "keys"]),
194
- a(s, {
195
+ i(s, {
195
196
  label: e(l)("config.login.highlight"),
196
- keys: L("highlight")
197
+ keys: F("highlight")
197
198
  }, {
198
- hint: i(() => [
199
+ hint: a(() => [
199
200
  R("span", {
200
201
  class: _({ warn: E.value })
201
202
  }, M(E.value ? e(l)("config.login.highlightMissing") : e(l)("config.login.highlightHint")), 3)
202
203
  ]),
203
- default: i(() => [
204
- a(e(g), {
205
- value: e(h),
206
- "onUpdate:value": o[6] || (o[6] = (t) => p(h) ? h.value = t : null),
207
- class: "fld",
204
+ default: a(() => [
205
+ i(e(f), {
206
+ value: e(b),
207
+ "onUpdate:value": o[6] || (o[6] = (t) => g(b) ? b.value = t : null),
208
+ size: e(r),
208
209
  status: E.value ? "warning" : void 0,
209
210
  placeholder: e(l)("config.login.highlightPlaceholder"),
210
211
  "input-props": { "aria-label": e(l)("config.login.highlight") }
211
- }, null, 8, ["value", "status", "placeholder", "input-props"])
212
+ }, null, 8, ["value", "size", "status", "placeholder", "input-props"])
212
213
  ]),
213
214
  _: 1
214
215
  }, 8, ["label", "keys"]),
215
- a(s, {
216
+ i(s, {
216
217
  label: e(l)("config.login.showFeatures"),
217
218
  keys: [e(C)]
218
219
  }, {
219
- default: i(() => [
220
- a(e(Z), {
221
- value: U.value,
222
- "onUpdate:value": o[7] || (o[7] = (t) => U.value = t),
220
+ default: a(() => [
221
+ i(e(j), {
222
+ value: z.value,
223
+ "onUpdate:value": o[7] || (o[7] = (t) => z.value = t),
223
224
  "aria-label": e(l)("config.login.showFeatures")
224
225
  }, null, 8, ["value", "aria-label"])
225
226
  ]),
226
227
  _: 1
227
228
  }, 8, ["label", "keys"]),
228
- a(s, {
229
+ i(s, {
229
230
  label: e(l)("config.login.features"),
230
- keys: L("features"),
231
- disabled: !U.value,
231
+ keys: F("features"),
232
+ disabled: !z.value,
232
233
  tall: "",
233
234
  class: "feat"
234
235
  }, {
235
- hint: i(() => [
236
+ hint: a(() => [
236
237
  R("span", {
237
- class: _({ err: F.value })
238
- }, M(F.value ? e(l)("config.login.tooManyFeatures") : e(l)("config.login.featuresHint")), 3)
238
+ class: _({ err: L.value })
239
+ }, M(L.value ? e(l)("config.login.tooManyFeatures") : e(l)("config.login.featuresHint")), 3)
239
240
  ]),
240
- default: i(() => [
241
- a(e(g), {
242
- value: e(b),
243
- "onUpdate:value": o[8] || (o[8] = (t) => p(b) ? b.value = t : null),
241
+ default: a(() => [
242
+ i(e(f), {
243
+ value: e(m),
244
+ "onUpdate:value": o[8] || (o[8] = (t) => g(m) ? m.value = t : null),
244
245
  type: "textarea",
245
- status: F.value ? "error" : void 0,
246
+ size: e(r),
247
+ status: L.value ? "error" : void 0,
246
248
  autosize: { minRows: 2, maxRows: 4 },
247
249
  placeholder: e(l)("config.login.featuresPlaceholder"),
248
250
  "input-props": { "aria-label": e(l)("config.login.features") }
249
- }, null, 8, ["value", "status", "placeholder", "input-props"])
251
+ }, null, 8, ["value", "size", "status", "placeholder", "input-props"])
250
252
  ]),
251
253
  _: 1
252
254
  }, 8, ["label", "keys", "disabled"])
@@ -259,6 +261,6 @@ const Ue = /* @__PURE__ */ $({
259
261
  }
260
262
  });
261
263
  export {
262
- Ue as default
264
+ Le as default
263
265
  };
264
266
  //# sourceMappingURL=BrandSection2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrandSection2.vue.js","sources":["../../../../../src/views/system/config/components/BrandSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 品牌与登录页:左边「站点」「登录页」两组设置,右边一块预览,用分段控件切「后台 / 登录页」。\n// 预览跟着焦点走:编辑站点组时看后台,编辑登录页组时看登录页,也可手动切。\n// 登录页文案中英文分开配,组名右侧切语言,预览同步切到该语言。\nimport { computed, ref } from 'vue'\nimport { NInput, NSwitch } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { splitLoginHeroFeatures } from '#/lib/loginHero'\nimport { useAppStore } from '#/stores/app'\nimport {\n BRAND_KEYS,\n heroKeys,\n LOGIN_LOCALES,\n LOGO_KEY,\n SHOW_FEATURES_KEY,\n SUBTITLE_KEY,\n type LoginLocale,\n} from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport CfgSegment from './CfgSegment.vue'\nimport ScaleToFit from './ScaleToFit.vue'\nimport LogoEditor from './LogoEditor.vue'\nimport AdminMock from './AdminMock.vue'\nimport LoginMock from './LoginMock.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst { values } = useConfigDraft()\nconst { str } = useDraftFields()\n\nconst title = str('sys.site.title')\nconst copyright = str('sys.site.copyright')\nconst copyrightUrl = str('sys.site.copyrightUrl')\nconst subtitle = str(SUBTITLE_KEY)\n\nconst view = ref<'admin' | 'login'>('admin')\nconst viewOptions = computed(() => [\n { value: 'admin' as const, label: t('config.brand.previewAdmin') },\n { value: 'login' as const, label: t('config.brand.previewLogin') },\n])\n\nconst locale = ref<LoginLocale>(app.locale === 'en-US' ? 'en-US' : 'zh-CN')\nconst localeOptions = computed(() =>\n LOGIN_LOCALES.map(l => ({\n value: l,\n label: t(`config.login.locale${l === 'zh-CN' ? 'Zh' : 'En'}`),\n })),\n)\nfunction setLocale(l: LoginLocale) {\n locale.value = l\n view.value = 'login'\n}\nconst keys = computed(() => heroKeys(locale.value))\nconst field = (name: 'headline' | 'highlight' | 'features') =>\n computed({\n get: () => values[keys.value[name]] ?? '',\n set: (v: string) => {\n values[keys.value[name]] = v\n },\n })\nconst headline = field('headline')\nconst highlight = field('highlight')\nconst features = field('features')\n// 缺省视为开:库里没有这个键时登录页照常显示卖点\nconst showFeatures = computed({\n get: () => values[SHOW_FEATURES_KEY] !== 'false',\n set: v => {\n values[SHOW_FEATURES_KEY] = v ? 'true' : 'false'\n },\n})\nconst highlightMissing = computed(() => {\n const h = headline.value.trim()\n const k = highlight.value.trim()\n return !!h && !!k && !h.includes(k)\n})\nconst tooManyFeatures = computed(\n () => splitLoginHeroFeatures(features.value, Number.MAX_SAFE_INTEGER).length > 5,\n)\nconst heroRowKeys = (name: 'headline' | 'highlight' | 'features') =>\n LOGIN_LOCALES.map(l => heroKeys(l)[name])\n\ndefineExpose({ setLocale })\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.brand')\"\n :desc=\"t('config.brand.desc')\"\n :preview-title=\"t('config.brand.preview')\"\n >\n <CfgGroup :title=\"t('config.brand.groupSite')\" @focusin=\"view = 'admin'\">\n <CfgRow\n :label=\"t('config.logo.title')\"\n :hint=\"t('config.logo.help')\"\n :keys=\"[LOGO_KEY]\"\n class=\"logo-row\"\n >\n <LogoEditor />\n </CfgRow>\n <CfgRow :label=\"t('config.base.siteTitle')\" :keys=\"[BRAND_KEYS[0]]\">\n <n-input\n v-model:value=\"title\"\n class=\"fld\"\n placeholder=\"SmartAdmin\"\n :input-props=\"{ 'aria-label': t('config.base.siteTitle') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.base.copyright')\" :keys=\"['sys.site.copyright']\">\n <n-input\n v-model:value=\"copyright\"\n class=\"fld\"\n :placeholder=\"t('config.brand.copyrightPh')\"\n :input-props=\"{ 'aria-label': t('config.base.copyright') }\"\n />\n </CfgRow>\n <CfgRow\n :label=\"t('config.base.copyrightUrl')\"\n :hint=\"t('config.brand.copyrightUrlHint')\"\n :keys=\"['sys.site.copyrightUrl']\"\n >\n <n-input\n v-model:value=\"copyrightUrl\"\n class=\"fld\"\n placeholder=\"https://\"\n :input-props=\"{ 'aria-label': t('config.base.copyrightUrl') }\"\n />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.brand.groupLogin')\" @focusin=\"view = 'login'\">\n <template #extra>\n <CfgSegment\n :model-value=\"locale\"\n :options=\"localeOptions\"\n :label=\"t('config.login.language')\"\n data-testid=\"login-locale\"\n @update:model-value=\"setLocale\"\n />\n </template>\n <CfgRow :label=\"t('config.base.siteSubtitle')\" :keys=\"[SUBTITLE_KEY]\">\n <n-input\n v-model:value=\"subtitle\"\n class=\"fld\"\n :placeholder=\"t('login.subtitle', {}, { locale })\"\n :input-props=\"{ 'aria-label': t('config.base.siteSubtitle') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.headline')\" :keys=\"heroRowKeys('headline')\">\n <n-input\n v-model:value=\"headline\"\n class=\"fld\"\n :placeholder=\"t('config.login.headlinePlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.headline') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.highlight')\" :keys=\"heroRowKeys('highlight')\">\n <template #hint>\n <span :class=\"{ warn: highlightMissing }\">\n {{\n highlightMissing\n ? t('config.login.highlightMissing')\n : t('config.login.highlightHint')\n }}\n </span>\n </template>\n <n-input\n v-model:value=\"highlight\"\n class=\"fld\"\n :status=\"highlightMissing ? 'warning' : undefined\"\n :placeholder=\"t('config.login.highlightPlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.highlight') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.showFeatures')\" :keys=\"[SHOW_FEATURES_KEY]\">\n <n-switch v-model:value=\"showFeatures\" :aria-label=\"t('config.login.showFeatures')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.login.features')\"\n :keys=\"heroRowKeys('features')\"\n :disabled=\"!showFeatures\"\n tall\n class=\"feat\"\n >\n <template #hint>\n <span :class=\"{ err: tooManyFeatures }\">\n {{\n tooManyFeatures ? t('config.login.tooManyFeatures') : t('config.login.featuresHint')\n }}\n </span>\n </template>\n <n-input\n v-model:value=\"features\"\n type=\"textarea\"\n :status=\"tooManyFeatures ? 'error' : undefined\"\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\n :placeholder=\"t('config.login.featuresPlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.features') }\"\n />\n </CfgRow>\n </CfgGroup>\n\n <template #preview-extra>\n <CfgSegment v-model=\"view\" :options=\"viewOptions\" :label=\"t('config.brand.preview')\" />\n </template>\n <template #preview>\n <ScaleToFit v-show=\"view === 'admin'\" :width=\"880\" :height=\"540\">\n <AdminMock />\n </ScaleToFit>\n <ScaleToFit v-show=\"view === 'login'\" :width=\"880\" :height=\"540\">\n <LoginMock :locale=\"locale\" />\n </ScaleToFit>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.fld {\n width: 240px;\n}\n.logo-row {\n min-height: 64px;\n}\n.feat :deep(.ctl) {\n flex: 1.6;\n}\n.warn {\n color: var(--color-warning);\n}\n.err {\n color: var(--color-danger);\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","values","useConfigDraft","str","useDraftFields","title","copyright","copyrightUrl","subtitle","SUBTITLE_KEY","view","ref","viewOptions","computed","locale","localeOptions","LOGIN_LOCALES","l","setLocale","keys","heroKeys","field","name","v","headline","highlight","features","showFeatures","SHOW_FEATURES_KEY","highlightMissing","h","k","tooManyFeatures","splitLoginHeroFeatures","heroRowKeys","__expose","_createBlock","SectionLayout","_unref","_createVNode","CfgSegment","$event","ScaleToFit","AdminMock","LoginMock","CfgGroup","CfgRow","LOGO_KEY","LogoEditor","BRAND_KEYS","NInput","_createElementVNode","NSwitch"],"mappings":"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"}
1
+ {"version":3,"file":"BrandSection2.vue.js","sources":["../../../../../src/views/system/config/components/BrandSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 品牌与登录页:左边「站点」「登录页」两组设置,右边一块预览,用分段控件切「后台 / 登录页」。\n// 预览跟着焦点走:编辑站点组时看后台,编辑登录页组时看登录页,也可手动切。\n// 登录页文案中英文分开配,组名右侧切语言,预览同步切到该语言。\nimport { computed, ref } from 'vue'\nimport { NInput, NSwitch } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { splitLoginHeroFeatures } from '#/lib/loginHero'\nimport { useAppStore } from '#/stores/app'\nimport {\n BRAND_KEYS,\n heroKeys,\n LOGIN_LOCALES,\n LOGO_KEY,\n SHOW_FEATURES_KEY,\n SUBTITLE_KEY,\n type LoginLocale,\n} from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport CfgSegment from './CfgSegment.vue'\nimport ScaleToFit from './ScaleToFit.vue'\nimport LogoEditor from './LogoEditor.vue'\nimport AdminMock from './AdminMock.vue'\nimport LoginMock from './LoginMock.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst { values } = useConfigDraft()\nconst { str } = useDraftFields()\nconst { ctl } = useConfigLayout()\n\nconst title = str('sys.site.title')\nconst copyright = str('sys.site.copyright')\nconst copyrightUrl = str('sys.site.copyrightUrl')\nconst subtitle = str(SUBTITLE_KEY)\n\nconst view = ref<'admin' | 'login'>('admin')\nconst viewOptions = computed(() => [\n { value: 'admin' as const, label: t('config.brand.previewAdmin') },\n { value: 'login' as const, label: t('config.brand.previewLogin') },\n])\n\nconst locale = ref<LoginLocale>(app.locale === 'en-US' ? 'en-US' : 'zh-CN')\nconst localeOptions = computed(() =>\n LOGIN_LOCALES.map(l => ({\n value: l,\n label: t(`config.login.locale${l === 'zh-CN' ? 'Zh' : 'En'}`),\n })),\n)\nfunction setLocale(l: LoginLocale) {\n locale.value = l\n view.value = 'login'\n}\nconst keys = computed(() => heroKeys(locale.value))\nconst field = (name: 'headline' | 'highlight' | 'features') =>\n computed({\n get: () => values[keys.value[name]] ?? '',\n set: (v: string) => {\n values[keys.value[name]] = v\n },\n })\nconst headline = field('headline')\nconst highlight = field('highlight')\nconst features = field('features')\n// 缺省视为开:库里没有这个键时登录页照常显示亮点\nconst showFeatures = computed({\n get: () => values[SHOW_FEATURES_KEY] !== 'false',\n set: v => {\n values[SHOW_FEATURES_KEY] = v ? 'true' : 'false'\n },\n})\nconst highlightMissing = computed(() => {\n const h = headline.value.trim()\n const k = highlight.value.trim()\n return !!h && !!k && !h.includes(k)\n})\nconst tooManyFeatures = computed(\n () => splitLoginHeroFeatures(features.value, Number.MAX_SAFE_INTEGER).length > 5,\n)\nconst heroRowKeys = (name: 'headline' | 'highlight' | 'features') =>\n LOGIN_LOCALES.map(l => heroKeys(l)[name])\n\ndefineExpose({ setLocale })\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.brand')\"\n :desc=\"t('config.brand.desc')\"\n :preview-title=\"t('config.brand.preview')\"\n >\n <CfgGroup :title=\"t('config.brand.groupSite')\" @focusin=\"view = 'admin'\">\n <CfgRow\n :label=\"t('config.logo.title')\"\n :hint=\"t('config.logo.help')\"\n :keys=\"[LOGO_KEY]\"\n class=\"logo-row\"\n >\n <LogoEditor />\n </CfgRow>\n <CfgRow :label=\"t('config.base.siteTitle')\" :keys=\"[BRAND_KEYS[0]]\">\n <n-input\n v-model:value=\"title\"\n :size=\"ctl\"\n placeholder=\"SmartAdmin\"\n :input-props=\"{ 'aria-label': t('config.base.siteTitle') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.base.copyright')\" :keys=\"['sys.site.copyright']\">\n <n-input\n v-model:value=\"copyright\"\n :size=\"ctl\"\n :placeholder=\"t('config.brand.copyrightPh')\"\n :input-props=\"{ 'aria-label': t('config.base.copyright') }\"\n />\n </CfgRow>\n <CfgRow\n :label=\"t('config.base.copyrightUrl')\"\n :hint=\"t('config.brand.copyrightUrlHint')\"\n :keys=\"['sys.site.copyrightUrl']\"\n >\n <n-input\n v-model:value=\"copyrightUrl\"\n :size=\"ctl\"\n placeholder=\"https://\"\n :input-props=\"{ 'aria-label': t('config.base.copyrightUrl') }\"\n />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.brand.groupLogin')\" @focusin=\"view = 'login'\">\n <template #extra>\n <CfgSegment\n :model-value=\"locale\"\n :options=\"localeOptions\"\n :label=\"t('config.login.language')\"\n data-testid=\"login-locale\"\n @update:model-value=\"setLocale\"\n />\n </template>\n <CfgRow :label=\"t('config.base.siteSubtitle')\" :keys=\"[SUBTITLE_KEY]\">\n <n-input\n v-model:value=\"subtitle\"\n :size=\"ctl\"\n :placeholder=\"t('login.subtitle', {}, { locale })\"\n :input-props=\"{ 'aria-label': t('config.base.siteSubtitle') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.headline')\" :keys=\"heroRowKeys('headline')\">\n <n-input\n v-model:value=\"headline\"\n :size=\"ctl\"\n :placeholder=\"t('config.login.headlinePlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.headline') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.highlight')\" :keys=\"heroRowKeys('highlight')\">\n <template #hint>\n <span :class=\"{ warn: highlightMissing }\">\n {{\n highlightMissing\n ? t('config.login.highlightMissing')\n : t('config.login.highlightHint')\n }}\n </span>\n </template>\n <n-input\n v-model:value=\"highlight\"\n :size=\"ctl\"\n :status=\"highlightMissing ? 'warning' : undefined\"\n :placeholder=\"t('config.login.highlightPlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.highlight') }\"\n />\n </CfgRow>\n <CfgRow :label=\"t('config.login.showFeatures')\" :keys=\"[SHOW_FEATURES_KEY]\">\n <n-switch v-model:value=\"showFeatures\" :aria-label=\"t('config.login.showFeatures')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.login.features')\"\n :keys=\"heroRowKeys('features')\"\n :disabled=\"!showFeatures\"\n tall\n class=\"feat\"\n >\n <template #hint>\n <span :class=\"{ err: tooManyFeatures }\">\n {{\n tooManyFeatures ? t('config.login.tooManyFeatures') : t('config.login.featuresHint')\n }}\n </span>\n </template>\n <n-input\n v-model:value=\"features\"\n type=\"textarea\"\n :size=\"ctl\"\n :status=\"tooManyFeatures ? 'error' : undefined\"\n :autosize=\"{ minRows: 2, maxRows: 4 }\"\n :placeholder=\"t('config.login.featuresPlaceholder')\"\n :input-props=\"{ 'aria-label': t('config.login.features') }\"\n />\n </CfgRow>\n </CfgGroup>\n\n <template #preview-extra>\n <CfgSegment v-model=\"view\" :options=\"viewOptions\" :label=\"t('config.brand.preview')\" />\n </template>\n <template #preview>\n <ScaleToFit v-show=\"view === 'admin'\" :width=\"880\" :height=\"540\">\n <AdminMock />\n </ScaleToFit>\n <ScaleToFit v-show=\"view === 'login'\" :width=\"880\" :height=\"540\">\n <LoginMock :locale=\"locale\" />\n </ScaleToFit>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.logo-row {\n min-height: 72px;\n}\n.feat :deep(.ctl) {\n flex: 1.8 1 0;\n}\n.warn {\n color: var(--warn);\n}\n.err {\n color: var(--err);\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","values","useConfigDraft","str","useDraftFields","ctl","useConfigLayout","title","copyright","copyrightUrl","subtitle","SUBTITLE_KEY","view","ref","viewOptions","computed","locale","localeOptions","LOGIN_LOCALES","l","setLocale","keys","heroKeys","field","name","v","headline","highlight","features","showFeatures","SHOW_FEATURES_KEY","highlightMissing","h","k","tooManyFeatures","splitLoginHeroFeatures","heroRowKeys","__expose","_createBlock","SectionLayout","_unref","_createVNode","CfgSegment","$event","ScaleToFit","AdminMock","LoginMock","CfgGroup","CfgRow","LOGO_KEY","LogoEditor","BRAND_KEYS","NInput","_createElementVNode","NSwitch"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./CfgGroup2.vue.js";
2
2
  /* empty css */
3
- import r from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const f = /* @__PURE__ */ r(o, [["__scopeId", "data-v-85a7c281"]]);
3
+ import f from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ f(o, [["__scopeId", "data-v-b7e2ff62"]]);
5
5
  export {
6
- f as default
6
+ m as default
7
7
  };
8
8
  //# sourceMappingURL=CfgGroup.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CfgGroup2.vue.js","sources":["../../../../../src/views/system/config/components/CfgGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 圆角分组列表(仿 macOS「系统设置」):组名在卡片外的左上方,#extra 放在组名右侧(如语言切换)。\ndefineProps<{ title?: string }>()\n</script>\n\n<template>\n <div class=\"cfg-group\">\n <h4 v-if=\"title || $slots.extra\">\n <span>{{ title }}</span>\n <slot name=\"extra\" />\n </h4>\n <div class=\"cfg-list\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.cfg-group {\n flex: none;\n min-width: 0;\n}\nh4 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-height: 22px;\n margin: 0 0 6px 12px;\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-text-secondary);\n}\n.cfg-list {\n border-radius: 12px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","__props","$slots","_hoisted_2","_createElementVNode","_renderSlot","_ctx","_hoisted_3"],"mappings":";;;;;;;sBAMEA,EAAA,GAAAC,EAQM,OARNC,GAQM;AAAA,MAPMC,EAAA,SAASC,EAAAA,OAAO,cAA1BH,EAGK,MAAAI,GAAA;AAAA,QAFHC,EAAwB,gBAAfH,EAAA,KAAK,GAAA,CAAA;AAAA,QACdI,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;MAEvBF,EAEM,OAFNG,GAEM;AAAA,QADJF,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"CfgGroup2.vue.js","sources":["../../../../../src/views/system/config/components/CfgGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 圆角分组列表(仿 macOS「系统设置」):组名在卡片外的左上方,#extra 放在组名右侧(如语言切换)。\ndefineProps<{ title?: string }>()\n</script>\n\n<template>\n <div class=\"cfg-group\">\n <h4 v-if=\"title || $slots.extra\">\n <span>{{ title }}</span>\n <slot name=\"extra\" />\n </h4>\n <div class=\"cfg-list\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.cfg-group {\n flex: none;\n min-width: 0;\n}\nh4 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-height: 28px;\n margin: 0 0 4px 12px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-2);\n}\n/* 列表卡:不描边、不投影,靠半透明填充底和卡片拉开层次 */\n.cfg-list {\n border-radius: var(--radius-lg);\n background: var(--fill);\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","__props","$slots","_hoisted_2","_createElementVNode","_renderSlot","_ctx","_hoisted_3"],"mappings":";;;;;;;sBAMEA,EAAA,GAAAC,EAQM,OARNC,GAQM;AAAA,MAPMC,EAAA,SAASC,EAAAA,OAAO,cAA1BH,EAGK,MAAAI,GAAA;AAAA,QAFHC,EAAwB,gBAAfH,EAAA,KAAK,GAAA,CAAA;AAAA,QACdI,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;MAEvBF,EAEM,OAFNG,GAEM;AAAA,QADJF,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;"}
@@ -2,7 +2,7 @@ import o from "./CfgRow2.vue.js";
2
2
  /* empty css */
3
3
  /* empty css */
4
4
  import t from "../../../../_virtual/_plugin-vue_export-helper.js";
5
- const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-bd8e29b3"]]);
5
+ const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-2191e0b7"]]);
6
6
  export {
7
7
  _ as default
8
8
  };
@@ -1,14 +1,15 @@
1
- import { defineComponent as h, computed as b, openBlock as s, createElementBlock as o, normalizeClass as y, createElementVNode as l, createCommentVNode as n, renderSlot as d, createTextVNode as r, toDisplayString as i, unref as v } from "vue";
2
- import { useI18n as g } from "vue-i18n";
3
- import { useConfigDraft as k } from "../draft.js";
4
- const B = ["aria-disabled"], C = { class: "lb" }, p = { class: "name" }, $ = {
1
+ import { defineComponent as y, computed as v, openBlock as s, createElementBlock as o, normalizeClass as g, unref as c, createElementVNode as n, createCommentVNode as l, renderSlot as i, createTextVNode as u, toDisplayString as d } from "vue";
2
+ import { useI18n as k } from "vue-i18n";
3
+ import { useConfigDraft as C } from "../draft.js";
4
+ import { useConfigLayout as p } from "../layoutMode.js";
5
+ const B = ["aria-disabled"], $ = { class: "lb" }, N = { class: "name" }, V = {
5
6
  key: 0,
6
7
  class: "dot",
7
8
  "aria-hidden": "true"
8
- }, N = {
9
+ }, w = {
9
10
  key: 1,
10
11
  class: "sr-only"
11
- }, V = { key: 0 }, w = { class: "ctl" }, T = /* @__PURE__ */ h({
12
+ }, D = { key: 0 }, E = { class: "ctl" }, I = /* @__PURE__ */ y({
12
13
  __name: "CfgRow",
13
14
  props: {
14
15
  label: {},
@@ -19,35 +20,35 @@ const B = ["aria-disabled"], C = { class: "lb" }, p = { class: "name" }, $ = {
19
20
  tall: { type: Boolean }
20
21
  },
21
22
  setup(e) {
22
- const u = e, { t: m } = g(), f = k(), a = b(() => {
23
+ const m = e, { t: f } = k(), h = C(), { nar: b } = p(), a = v(() => {
23
24
  var t;
24
- return !!((t = u.keys) != null && t.some((c) => f.dirtyKeys.value.includes(c)));
25
+ return !!((t = m.keys) != null && t.some((r) => h.dirtyKeys.value.includes(r)));
25
26
  });
26
- return (t, c) => (s(), o("div", {
27
- class: y(["cfg-row", { sub: e.sub, off: e.disabled, tall: e.tall, changed: a.value }]),
27
+ return (t, r) => (s(), o("div", {
28
+ class: g(["cfg-row", { sub: e.sub, off: e.disabled, tall: e.tall, changed: a.value, nar: c(b) }]),
28
29
  "aria-disabled": e.disabled || void 0
29
30
  }, [
30
- l("div", C, [
31
- l("span", p, [
32
- a.value ? (s(), o("i", $)) : n("", !0),
33
- d(t.$slots, "label", {}, () => [
34
- r(i(e.label), 1)
31
+ n("div", $, [
32
+ n("span", N, [
33
+ a.value ? (s(), o("i", V)) : l("", !0),
34
+ i(t.$slots, "label", {}, () => [
35
+ u(d(e.label), 1)
35
36
  ], !0),
36
- a.value ? (s(), o("span", N, i(v(m)("config.unsavedTab")), 1)) : n("", !0)
37
+ a.value ? (s(), o("span", w, d(c(f)("config.unsavedTab")), 1)) : l("", !0)
37
38
  ]),
38
- e.hint || t.$slots.hint ? (s(), o("small", V, [
39
- d(t.$slots, "hint", {}, () => [
40
- r(i(e.hint), 1)
39
+ e.hint || t.$slots.hint ? (s(), o("small", D, [
40
+ i(t.$slots, "hint", {}, () => [
41
+ u(d(e.hint), 1)
41
42
  ], !0)
42
- ])) : n("", !0)
43
+ ])) : l("", !0)
43
44
  ]),
44
- l("div", w, [
45
- d(t.$slots, "default", {}, void 0, !0)
45
+ n("div", E, [
46
+ i(t.$slots, "default", {}, void 0, !0)
46
47
  ])
47
48
  ], 10, B));
48
49
  }
49
50
  });
50
51
  export {
51
- T as default
52
+ I as default
52
53
  };
53
54
  //# sourceMappingURL=CfgRow2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CfgRow2.vue.js","sources":["../../../../../src/views/system/config/components/CfgRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 分组列表里的一行:左边标签(可带一行灰色说明),右边控件。\n// keys 里任一键有未保存改动,标签前出现橙点——用户一眼看出改了哪几项。\n// sub 是缩进的从属项(如「验证码类型」),disabled 让整行变灰不可操作(从属的总开关关着)。\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useConfigDraft } from '../draft'\n\nconst props = defineProps<{\n label?: string\n hint?: string\n keys?: readonly string[]\n sub?: boolean\n disabled?: boolean\n /** 控件比一行高(多行输入、标签组):顶端对齐 */\n tall?: boolean\n}>()\n\nconst { t } = useI18n()\nconst draft = useConfigDraft()\nconst changed = computed(() => !!props.keys?.some(key => draft.dirtyKeys.value.includes(key)))\n</script>\n\n<template>\n <div\n :class=\"['cfg-row', { sub, off: disabled, tall, changed }]\"\n :aria-disabled=\"disabled || undefined\"\n >\n <div class=\"lb\">\n <span class=\"name\">\n <i v-if=\"changed\" class=\"dot\" aria-hidden=\"true\" />\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"changed\" class=\"sr-only\">{{ t('config.unsavedTab') }}</span>\n </span>\n <small v-if=\"hint || $slots.hint\">\n <slot name=\"hint\">{{ hint }}</slot>\n </small>\n </div>\n <div class=\"ctl\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.cfg-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 12px;\n min-height: 48px;\n padding: 6px 14px;\n font-size: var(--font-size-base);\n}\n.cfg-row + .cfg-row::before {\n content: '';\n position: absolute;\n top: 0;\n left: 14px;\n right: 0;\n border-top: 0.5px solid var(--color-border);\n}\n.cfg-row.sub {\n padding-left: 34px;\n}\n.cfg-row.sub::before {\n left: 34px;\n}\n.cfg-row.tall {\n align-items: flex-start;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n.cfg-row.off .lb,\n.cfg-row.off .ctl {\n opacity: 0.45;\n pointer-events: none;\n}\n.lb {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 130px;\n}\n.name {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n color: var(--color-text-primary);\n}\n.dot {\n position: absolute;\n left: -11px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--color-warning);\n}\nsmall {\n font-size: var(--font-size-sm);\n line-height: 1.4;\n color: var(--color-text-tertiary);\n}\n.ctl {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n min-width: 0;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n</style>\n\n<style>\n/* 带文本输入框的行:标签与输入按 1:1.8 分(输入框是主角,要宽),输入框铺满自己那一份。\n 放在非 scoped 块里::has() 要看子孙里有没有输入框,scoped 的属性选择器改写会打乱它。 */\n.cfg-row:has(> .ctl > :is(.n-input, .n-select)) > .lb {\n flex: 1 1 0;\n}\n.cfg-row:has(> .ctl > :is(.n-input, .n-select)) > .ctl {\n flex: 1.8 1 0;\n}\n.cfg-row > .ctl > :is(.n-input, .n-select) {\n flex: 1;\n min-width: 0;\n}\n</style>\n"],"names":["props","__props","t","useI18n","draft","useConfigDraft","changed","computed","_a","key","_createElementBlock","_createElementVNode","_hoisted_2","_hoisted_3","_openBlock","_hoisted_4","_renderSlot","_ctx","_hoisted_5","_toDisplayString","_unref","$slots","_hoisted_6","_hoisted_7"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA,UAAMA,IAAQC,GAUR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAQC,EAAA,GACRC,IAAUC,EAAS,MAAA;;AAAM,cAAC,GAACC,IAAAR,EAAM,SAAN,QAAAQ,EAAY,KAAK,CAAAC,MAAOL,EAAM,UAAU,MAAM,SAASK,CAAG;AAAA,KAAE;2BAI3FC,EAiBM,OAAA;AAAA,MAhBH,4BAAqBT,EAAA,KAAG,KAAOA,YAAQ,MAAEA,EAAA,eAAMK,EAAA,MAAA,CAAO,CAAA;AAAA,MACtD,iBAAeL,EAAA,YAAY;AAAA,IAAA;MAE5BU,EASM,OATNC,GASM;AAAA,QARJD,EAIO,QAJPE,GAIO;AAAA,UAHIP,EAAA,SAATQ,EAAA,GAAAJ,EAAmD,KAAnDK,CAAmD;UACnDC,EAAqCC,uBAArC,MAAqC;AAAA,gBAAfhB,EAAA,KAAK,GAAA,CAAA;AAAA,UAAA;UACfK,EAAA,cAAZI,EAAwE,QAAxEQ,GAAwEC,EAAhCC,EAAAlB,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;;QAE9BD,EAAA,QAAQoB,EAAAA,OAAO,aAA5BX,EAEQ,SAAAY,GAAA;AAAA,UADNN,EAAmCC,sBAAnC,MAAmC;AAAA,gBAAdhB,EAAA,IAAI,GAAA,CAAA;AAAA,UAAA;;;MAG7BU,EAEM,OAFNY,GAEM;AAAA,QADJP,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"CfgRow2.vue.js","sources":["../../../../../src/views/system/config/components/CfgRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 分组列表里的一行:左边标签(可带一行灰色说明),右边控件。\n// keys 里任一键有未保存改动,标签前出现橙点——用户一眼看出改了哪几项。\n// sub 是缩进的从属项(如「验证码类型」),disabled 让整行变灰不可操作(从属的总开关关着)。\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useConfigDraft } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\n\nconst props = defineProps<{\n label?: string\n hint?: string\n keys?: readonly string[]\n sub?: boolean\n disabled?: boolean\n /** 控件比一行高(多行输入、标签组):顶端对齐 */\n tall?: boolean\n}>()\n\nconst { t } = useI18n()\nconst draft = useConfigDraft()\nconst { nar } = useConfigLayout()\nconst changed = computed(() => !!props.keys?.some(key => draft.dirtyKeys.value.includes(key)))\n</script>\n\n<template>\n <div\n :class=\"['cfg-row', { sub, off: disabled, tall, changed, nar }]\"\n :aria-disabled=\"disabled || undefined\"\n >\n <div class=\"lb\">\n <span class=\"name\">\n <i v-if=\"changed\" class=\"dot\" aria-hidden=\"true\" />\n <slot name=\"label\">{{ label }}</slot>\n <span v-if=\"changed\" class=\"sr-only\">{{ t('config.unsavedTab') }}</span>\n </span>\n <small v-if=\"hint || $slots.hint\">\n <slot name=\"hint\">{{ hint }}</slot>\n </small>\n </div>\n <div class=\"ctl\">\n <slot />\n </div>\n </div>\n</template>\n\n<style scoped>\n.cfg-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 12px;\n min-height: 48px;\n padding: 6px 14px;\n font-size: 14px;\n}\n.cfg-row + .cfg-row::before {\n content: '';\n position: absolute;\n top: 0;\n left: 14px;\n right: 0;\n border-top: 1px solid var(--separator);\n}\n.cfg-row.sub {\n padding-left: 34px;\n}\n.cfg-row.sub::before {\n left: 34px;\n}\n.cfg-row.tall {\n align-items: flex-start;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n.cfg-row.off .lb,\n.cfg-row.off .ctl {\n opacity: 0.45;\n pointer-events: none;\n}\n.lb {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 130px;\n}\n.name {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n color: var(--text-1);\n}\n.dot {\n position: absolute;\n left: -11px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--warn);\n}\nsmall {\n font-size: 13px;\n line-height: 1.4;\n color: var(--text-3);\n}\n.ctl {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n min-width: 0;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n/* 窄档:从属项的缩进收一点 */\n.cfg-row.nar.sub {\n padding-left: 24px;\n}\n.cfg-row.nar.sub::before {\n left: 24px;\n}\n</style>\n\n<style>\n/* 带文本输入框的行:标签与输入按 1:1.8 分(输入框是主角,要宽),输入框铺满自己那一份。\n 放在非 scoped 块里::has() 要看子孙里有没有输入框,scoped 的属性选择器改写会打乱它。 */\n.cfg-row:has(> .ctl > :is(.n-input, .n-select)) > .lb {\n flex: 1 1 0;\n}\n.cfg-row:has(> .ctl > :is(.n-input, .n-select)) > .ctl {\n flex: 1.8 1 0;\n}\n.cfg-row > .ctl > :is(.n-input, .n-select) {\n flex: 1;\n min-width: 0;\n}\n/* 窄档:设置行上下排,标签一行、控件占满一行(带开关的行保持左右一行,开关本来就小) */\n.cfg-row.nar:not(:has(> .ctl > .n-switch)) {\n flex-wrap: wrap;\n row-gap: 8px;\n}\n.cfg-row.nar:not(:has(> .ctl > .n-switch)) > .lb {\n flex: 1 1 100%;\n}\n.cfg-row.nar:not(:has(> .ctl > .n-switch)) > .ctl,\n.cfg-row.nar:has(> .ctl > :is(.n-input, .n-select)) > .ctl {\n flex: 1 1 100%;\n}\n.cfg-row.nar:not(:has(> .ctl > .n-switch)) > .ctl {\n justify-content: flex-start;\n}\n.cfg-row.nar > .ctl > .n-input-number {\n width: 120px;\n}\n.cfg-row.nar > .ctl > .n-slider {\n flex: 1;\n width: auto;\n}\n</style>\n"],"names":["props","__props","t","useI18n","draft","useConfigDraft","nar","useConfigLayout","changed","computed","_a","key","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_2","_hoisted_3","_openBlock","_hoisted_4","_renderSlot","_ctx","_hoisted_5","_toDisplayString","$slots","_hoisted_6","_hoisted_7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AASA,UAAMA,IAAQC,GAUR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAQC,EAAA,GACR,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAUC,EAAS,MAAA;;AAAM,cAAC,GAACC,IAAAV,EAAM,SAAN,QAAAU,EAAY,KAAK,CAAAC,MAAOP,EAAM,UAAU,MAAM,SAASO,CAAG;AAAA,KAAE;2BAI3FC,EAiBM,OAAA;AAAA,MAhBH,OAAKC,EAAA,CAAA,WAAA,EAAA,KAAgBZ,OAAG,KAAOA,EAAA,gBAAUA,EAAA,MAAI,SAAEO,EAAA,OAAO,KAAEM,EAAAR,CAAA,EAAA,CAAG,CAAA;AAAA,MAC3D,iBAAeL,EAAA,YAAY;AAAA,IAAA;MAE5Bc,EASM,OATNC,GASM;AAAA,QARJD,EAIO,QAJPE,GAIO;AAAA,UAHIT,EAAA,SAATU,EAAA,GAAAN,EAAmD,KAAnDO,CAAmD;UACnDC,EAAqCC,uBAArC,MAAqC;AAAA,gBAAfpB,EAAA,KAAK,GAAA,CAAA;AAAA,UAAA;UACfO,EAAA,cAAZI,EAAwE,QAAxEU,GAAwEC,EAAhCT,EAAAZ,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;;QAE9BD,EAAA,QAAQuB,EAAAA,OAAO,aAA5BZ,EAEQ,SAAAa,GAAA;AAAA,UADNL,EAAmCC,sBAAnC,MAAmC;AAAA,gBAAdpB,EAAA,IAAI,GAAA,CAAA;AAAA,UAAA;;;MAG7Bc,EAEM,OAFNW,GAEM;AAAA,QADJN,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;"}
@@ -1,7 +1,7 @@
1
1
  import o from "./CfgSegment2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const r = /* @__PURE__ */ t(o, [["__scopeId", "data-v-aedf9324"]]);
4
+ const r = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0e49f97e"]]);
5
5
  export {
6
6
  r as default
7
7
  };