smart-admin-web 10.14.0 → 10.15.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 (194) hide show
  1. package/README.md +5 -5
  2. package/dist/api/index.d.ts +37 -0
  3. package/dist/api/index.js +35 -14
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +381 -3
  6. package/dist/assets/icons/ph-subset.json.js +3 -3
  7. package/dist/assets/smart-logo.svg.js +5 -0
  8. package/dist/assets/smart-logo.svg.js.map +1 -0
  9. package/dist/components/SmartLogo.vue.d.ts +3 -0
  10. package/dist/components/SmartLogo.vue.js +1 -1
  11. package/dist/components/SmartLogo2.vue.js +22 -64
  12. package/dist/components/SmartLogo2.vue.js.map +1 -1
  13. package/dist/composables/useLoginHero.d.ts +2 -0
  14. package/dist/composables/useLoginHero.js +22 -0
  15. package/dist/composables/useLoginHero.js.map +1 -0
  16. package/dist/composables/usePageTitle.js +16 -14
  17. package/dist/composables/usePageTitle.js.map +1 -1
  18. package/dist/composables/useSite.d.ts +5 -0
  19. package/dist/composables/useSite.js +16 -13
  20. package/dist/composables/useSite.js.map +1 -1
  21. package/dist/index.js +92 -91
  22. package/dist/lib/favicon.d.ts +1 -0
  23. package/dist/lib/favicon.js +12 -0
  24. package/dist/lib/favicon.js.map +1 -0
  25. package/dist/lib/loginHero.d.ts +16 -0
  26. package/dist/lib/loginHero.js +33 -0
  27. package/dist/lib/loginHero.js.map +1 -0
  28. package/dist/lib/logoCrop.d.ts +25 -0
  29. package/dist/lib/logoCrop.js +22 -0
  30. package/dist/lib/logoCrop.js.map +1 -0
  31. package/dist/lib/runtime.d.ts +2 -0
  32. package/dist/lib/runtime.js +1 -1
  33. package/dist/lib/runtime.js.map +1 -1
  34. package/dist/lib/securityRules.d.ts +26 -0
  35. package/dist/lib/securityRules.js +86 -0
  36. package/dist/lib/securityRules.js.map +1 -0
  37. package/dist/locales/en-US.d.ts +242 -28
  38. package/dist/locales/en-US.js +262 -58
  39. package/dist/locales/en-US.js.map +1 -1
  40. package/dist/locales/zh-CN.d.ts +242 -28
  41. package/dist/locales/zh-CN.js +257 -58
  42. package/dist/locales/zh-CN.js.map +1 -1
  43. package/dist/router/viewRegistry.js +10 -10
  44. package/dist/router/viewRegistry.js.map +1 -1
  45. package/dist/style.css +1 -1
  46. package/dist/utils/oauthBrand.d.ts +34 -9
  47. package/dist/utils/oauthBrand.js +70 -74
  48. package/dist/utils/oauthBrand.js.map +1 -1
  49. package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
  50. package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
  51. package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
  52. package/dist/views/login/components/LoginHeroPanel2.vue.js +66 -0
  53. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
  54. package/dist/views/login/skins/SplitPanel.vue.js +1 -1
  55. package/dist/views/login/skins/SplitPanel2.vue.js +39 -59
  56. package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -1
  57. package/dist/views/system/config/components/AdminMock.vue.js +8 -0
  58. package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
  59. package/dist/views/system/config/components/AdminMock2.vue.js +76 -0
  60. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
  61. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -0
  62. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
  63. package/dist/views/system/config/components/AdvancedSection2.vue.js +135 -0
  64. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
  65. package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
  66. package/dist/views/system/config/components/BrandSection.vue.js +8 -0
  67. package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
  68. package/dist/views/system/config/components/BrandSection2.vue.js +264 -0
  69. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
  70. package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
  71. package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
  72. package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
  73. package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
  74. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
  75. package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
  76. package/dist/views/system/config/components/CfgRow.vue.js +9 -0
  77. package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
  78. package/dist/views/system/config/components/CfgRow2.vue.js +53 -0
  79. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
  80. package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
  81. package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
  82. package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
  83. package/dist/views/system/config/components/CfgSegment2.vue.js +44 -0
  84. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
  85. package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -2
  86. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
  87. package/dist/views/system/config/components/ConfigFormModal2.vue.js +66 -56
  88. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  89. package/dist/views/system/config/components/JobSection.vue.js +8 -0
  90. package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
  91. package/dist/views/system/config/components/JobSection2.vue.js +138 -0
  92. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
  93. package/dist/views/system/config/components/{GroupExtraConfig.vue.d.ts → LoginMock.vue.d.ts} +3 -4
  94. package/dist/views/system/config/components/LoginMock.vue.js +8 -0
  95. package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
  96. package/dist/views/system/config/components/LoginMock2.vue.js +121 -0
  97. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
  98. package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
  99. package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
  100. package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
  101. package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
  102. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
  103. package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
  104. package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
  105. package/dist/views/system/config/components/LogoEditor2.vue.js +163 -0
  106. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
  107. package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
  108. package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
  109. package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
  110. package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
  111. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
  112. package/dist/views/system/config/components/ScaleToFit.vue.d.ts +17 -0
  113. package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
  114. package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
  115. package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
  116. package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
  117. package/dist/views/system/config/components/SectionLayout.vue.d.ts +28 -0
  118. package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
  119. package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
  120. package/dist/views/system/config/components/SectionLayout2.vue.js +45 -0
  121. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
  122. package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
  123. package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
  124. package/dist/views/system/config/components/SecuritySection2.vue.js +416 -0
  125. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
  126. package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
  127. package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
  128. package/dist/views/system/config/components/SensitiveSection2.vue.js +209 -0
  129. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
  130. package/dist/views/system/config/components/SigninSection.vue.js +8 -0
  131. package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
  132. package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
  133. package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
  134. package/dist/views/system/config/components/UploadSection.vue.d.ts +3 -0
  135. package/dist/views/system/config/components/UploadSection.vue.js +8 -0
  136. package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
  137. package/dist/views/system/config/components/UploadSection2.vue.js +167 -0
  138. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
  139. package/dist/views/system/config/draft.d.ts +148 -0
  140. package/dist/views/system/config/draft.js +170 -0
  141. package/dist/views/system/config/draft.js.map +1 -0
  142. package/dist/views/system/config/flash.d.ts +2 -0
  143. package/dist/views/system/config/flash.js +9 -0
  144. package/dist/views/system/config/flash.js.map +1 -0
  145. package/dist/views/system/config/groups.d.ts +35 -7
  146. package/dist/views/system/config/groups.js +99 -14
  147. package/dist/views/system/config/groups.js.map +1 -1
  148. package/dist/views/system/config/index.vue.js +4 -1
  149. package/dist/views/system/config/index.vue.js.map +1 -1
  150. package/dist/views/system/config/index2.vue.js +180 -115
  151. package/dist/views/system/config/index2.vue.js.map +1 -1
  152. package/dist/views/system/config/providerForm.d.ts +33 -0
  153. package/dist/views/system/config/providerForm.js +63 -0
  154. package/dist/views/system/config/providerForm.js.map +1 -0
  155. package/package.json +4 -4
  156. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
  157. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
  158. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
  159. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
  160. package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
  161. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
  162. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
  163. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
  164. package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
  165. package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
  166. package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
  167. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
  168. package/dist/views/system/config/components/JobConfig.vue.js +0 -5
  169. package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
  170. package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
  171. package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
  172. package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
  173. package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
  174. package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
  175. package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
  176. package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
  177. package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
  178. package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
  179. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
  180. package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
  181. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
  182. package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
  183. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
  184. package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
  185. package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
  186. package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
  187. package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
  188. /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → AdminMock.vue.d.ts} +0 -0
  189. /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → AdvancedSection.vue.d.ts} +0 -0
  190. /package/dist/views/system/config/components/{JobConfig.vue.d.ts → JobSection.vue.d.ts} +0 -0
  191. /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
  192. /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
  193. /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
  194. /package/dist/views/system/config/components/{UploadConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminMock2.vue.js","sources":["../../../../../src/views/system/config/components/AdminMock.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 缩小版后台(880×540 设计尺寸,外面 ScaleToFit 等比缩放):浏览器标签页、侧栏品牌位、页脚版权,\n// 都读草稿,改一项对应位置即时变并闪一下。\nimport { computed } from 'vue'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { LOGO_KEY } from '../groups'\nimport { useConfigDraft } from '../draft'\nimport { vFlash } from '../flash'\n\nconst { values } = useConfigDraft()\nconst title = computed(() => values['sys.site.title']?.trim() || 'SmartAdmin')\n// 版权留空时和登录页页脚一样回退到站点名\nconst copyright = computed(() => values['sys.site.copyright']?.trim() || title.value)\nconst hasUrl = computed(() => !!values['sys.site.copyrightUrl']?.trim())\nconst logo = computed(() => values[LOGO_KEY] ?? '')\n</script>\n\n<template>\n <div class=\"mock\">\n <div class=\"chrome\">\n <span class=\"lights\">\n <i />\n <i />\n <i />\n </span>\n <span v-flash=\"`${title}|${logo}`\" class=\"btab\">\n <SmartLogo :size=\"16\" :src=\"logo\" />\n <span>{{ title }}</span>\n </span>\n </div>\n <div class=\"app\">\n <div class=\"side\">\n <div v-flash=\"`${title}|${logo}`\" class=\"brand\" data-testid=\"preview-brand\">\n <SmartLogo :size=\"30\" :src=\"logo\" />\n <span>{{ title }}</span>\n </div>\n <i v-for=\"n in 5\" :key=\"n\" :style=\"{ width: n % 2 ? '80%' : '62%' }\" />\n </div>\n <div class=\"main\">\n <div class=\"top\" />\n <div class=\"body\">\n <i class=\"w\" />\n <i />\n <i />\n <i />\n </div>\n <div v-flash=\"`${copyright}|${hasUrl}`\" class=\"foot\">\n <a v-if=\"hasUrl\">© {{ copyright }}</a>\n <span v-else>© {{ copyright }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.mock {\n display: flex;\n flex-direction: column;\n width: 880px;\n height: 540px;\n overflow: hidden;\n border-radius: 10px;\n background: var(--color-bg-container);\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\n font-size: 14px;\n}\n.chrome {\n display: flex;\n flex: none;\n align-items: flex-end;\n gap: 10px;\n height: 38px;\n padding: 0 12px;\n background: var(--color-fill);\n}\n.lights {\n display: flex;\n align-self: center;\n gap: 6px;\n}\n.lights i {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background: #ff5f57;\n}\n.lights i:nth-child(2) {\n background: #febc2e;\n}\n.lights i:nth-child(3) {\n background: #28c840;\n}\n.btab {\n display: flex;\n align-items: center;\n gap: 7px;\n max-width: 260px;\n height: 30px;\n padding: 0 14px;\n border-radius: 8px 8px 0 0;\n background: var(--color-bg-container);\n font-size: 12.5px;\n}\n.btab span {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.app {\n display: grid;\n flex: 1;\n grid-template-columns: 196px 1fr;\n min-height: 0;\n}\n.side {\n padding: 16px 12px;\n border-right: 1px solid var(--color-border);\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 4px 6px;\n margin-bottom: 14px;\n overflow: hidden;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 600;\n white-space: nowrap;\n}\n.side i {\n display: block;\n height: 10px;\n margin: 16px 8px;\n border-radius: 5px;\n background: var(--color-fill);\n}\n.main {\n display: flex;\n flex-direction: column;\n background: var(--color-bg-body);\n}\n.top {\n height: 48px;\n border-bottom: 1px solid var(--color-border);\n background: var(--color-bg-container);\n}\n.body {\n display: grid;\n flex: 1;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 90px;\n gap: 14px;\n padding: 20px;\n}\n.body i {\n border-radius: 10px;\n background: var(--color-bg-container);\n}\n.body i.w {\n grid-column: span 3;\n grid-row: span 2;\n}\n.foot {\n display: grid;\n place-items: center;\n height: 42px;\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--color-text-tertiary);\n}\n.foot a {\n color: var(--color-primary);\n}\n</style>\n"],"names":["values","useConfigDraft","title","computed","_a","copyright","hasUrl","logo","LOGO_KEY","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_withDirectives","_hoisted_3","_createVNode","SmartLogo","_unref","vFlash","_hoisted_4","_hoisted_5","_hoisted_6","_Fragment","_renderList","n","_hoisted_7","_hoisted_8","_hoisted_9","_toDisplayString","_hoisted_10"],"mappings":";;;;;;;;;;;AASA,UAAM,EAAE,QAAAA,EAAA,IAAWC,EAAA,GACbC,IAAQC,EAAS,MAAA;;AAAM,eAAAC,IAAAJ,EAAO,gBAAgB,MAAvB,gBAAAI,EAA0B,WAAU;AAAA,KAAY,GAEvEC,IAAYF,EAAS;;AAAM,eAAAC,IAAAJ,EAAO,oBAAoB,MAA3B,gBAAAI,EAA8B,WAAUF,EAAM;AAAA,KAAK,GAC9EI,IAASH,EAAS,MAAA;;AAAM,cAAC,GAACC,IAAAJ,EAAO,uBAAuB,MAA9B,QAAAI,EAAiC;AAAA,KAAM,GACjEG,IAAOJ,EAAS,MAAMH,EAAOQ,CAAQ,KAAK,EAAE;sBAIhDC,EAAA,GAAAC,EAkCM,OAlCNC,GAkCM;AAAA,MAjCJC,EAUM,OAVNC,GAUM;AAAA,wBATJD,EAIO,QAAA,EAJD,OAAM,YAAQ;AAAA,UAClBA,EAAK,GAAA;AAAA,UACLA,EAAK,GAAA;AAAA,UACLA,EAAK,GAAA;AAAA,QAAA;QAEPE,GAAAL,EAAA,GAAAC,EAGO,QAHPK,GAGO;AAAA,UAFLC,EAAoCC,GAAA;AAAA,YAAxB,MAAM;AAAA,YAAK,KAAKV,EAAA;AAAA,UAAA;UAC5BK,EAAwB,gBAAfV,EAAA,KAAK,GAAA,CAAA;AAAA,QAAA;UAFE,CAAAgB,EAAAC,CAAA,GAAA,GAAAjB,EAAA,KAAK,IAAIK,EAAA,KAAI,EAAA;AAAA,QAAA;;MAKjCK,EAqBM,OArBNQ,GAqBM;AAAA,QApBJR,EAMM,OANNS,GAMM;AAAA,UALJP,GAAAL,EAAA,GAAAC,EAGM,OAHNY,GAGM;AAAA,YAFJN,EAAoCC,GAAA;AAAA,cAAxB,MAAM;AAAA,cAAK,KAAKV,EAAA;AAAA,YAAA;YAC5BK,EAAwB,gBAAfV,EAAA,KAAK,GAAA,CAAA;AAAA,UAAA;YAFC,CAAAgB,EAAAC,CAAA,GAAA,GAAAjB,EAAA,KAAK,IAAIK,EAAA,KAAI,EAAA;AAAA,UAAA;gBAI9BG,EAAuEa,GAAA,MAAAC,EAAxD,GAAC,CAANC,MAAVb,EAAuE,KAAA;AAAA,YAApD,KAAKa;AAAA,YAAI,kBAAgBA,IAAC,IAAA,QAAA,OAAA;AAAA,UAAA;;QAE/Cb,EAYM,OAZNc,GAYM;AAAA,0BAXJd,EAAmB,OAAA,EAAd,OAAM,MAAA,GAAK,MAAA,EAAA;AAAA,0BAChBA,EAKM,OAAA,EALD,OAAM,UAAM;AAAA,YACfA,EAAe,KAAA,EAAZ,OAAM,KAAG;AAAA,YACZA,EAAK,GAAA;AAAA,YACLA,EAAK,GAAA;AAAA,YACLA,EAAK,GAAA;AAAA,UAAA;UAEPE,GAAAL,EAAA,GAAAC,EAGM,OAHNiB,GAGM;AAAA,YAFKrB,EAAA,cAATI,EAAsC,KAAAkB,GAArB,OAAEC,EAAGxB,EAAA,KAAS,GAAA,CAAA,WAC/BK,EAAqC,QAAAoB,GAAxB,OAAED,EAAGxB,EAAA,KAAS,GAAA,CAAA;AAAA,UAAA;YAFZ,CAAAa,EAAAC,CAAA,GAAA,GAAAd,EAAA,KAAS,IAAIC,EAAA,KAAM,EAAA;AAAA,UAAA;;;;;;"}
@@ -0,0 +1,5 @@
1
+ import f from "./AdvancedSection2.vue.js";
2
+ export {
3
+ f as default
4
+ };
5
+ //# sourceMappingURL=AdvancedSection.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdvancedSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,135 @@
1
+ import { defineComponent as x, ref as m, watch as E, resolveDirective as N, openBlock as p, createElementBlock as T, Fragment as b, createVNode as n, unref as o, withCtx as a, createElementVNode as P, withDirectives as z, createBlock as D, createTextVNode as V, toDisplayString as A, h as l } from "vue";
2
+ import { useMessage as B, NButton as f, NSpace as R, NPopconfirm as I } from "naive-ui";
3
+ import { useI18n as K } from "vue-i18n";
4
+ import { SmartTable as q } from "smart-naive-table";
5
+ import F from "../../../../components/AppIcon.vue.js";
6
+ import { useConfirm as L } from "../../../../composables/useConfirm.js";
7
+ import { useAuthStore as M } from "../../../../stores/auth.js";
8
+ import { configApi as g } from "../../../../api/index.js";
9
+ import { translateError as U } from "../../../../utils/error.js";
10
+ import O from "./ConfigFormModal.vue.js";
11
+ import $ from "./SectionLayout.vue.js";
12
+ import { configRevision as j, bumpConfigRevision as G } from "../groups.js";
13
+ import { useConfigDraft as H } from "../draft.js";
14
+ const J = { class: "fill-main" }, ce = /* @__PURE__ */ x({
15
+ __name: "AdvancedSection",
16
+ setup(Q) {
17
+ const { t: e } = K(), h = B(), { run: y } = L(), u = M(), v = H(), d = m(), k = (t) => g.page({ ...t, excludedKeys: v.claimedKeys.value });
18
+ E(j, () => {
19
+ var t;
20
+ return (t = d.value) == null ? void 0 : t.refresh();
21
+ });
22
+ const w = [
23
+ { type: "index", title: () => e("common.rowNo"), width: 64, align: "center" },
24
+ { key: "configKey", title: () => e("config.key"), search: !0, ellipsis: { tooltip: !0 } },
25
+ { key: "name", title: () => e("config.name"), search: !0, ellipsis: { tooltip: !0 } },
26
+ {
27
+ key: "configValue",
28
+ title: () => e("config.value"),
29
+ ellipsis: { tooltip: !0 },
30
+ render: (t) => t.configValue || "—"
31
+ },
32
+ {
33
+ key: "groupCode",
34
+ title: () => e("config.group"),
35
+ search: !0,
36
+ render: (t) => t.groupCode || "—"
37
+ },
38
+ { key: "sort", title: () => e("config.sort"), width: 80 },
39
+ { key: "createTime", title: () => e("common.createTime"), format: "datetime" },
40
+ {
41
+ key: "op",
42
+ title: () => e("common.operation"),
43
+ width: 140,
44
+ fixed: "right",
45
+ hideInSetting: !0,
46
+ render: (t) => l(R, { size: 4, wrapItem: !1 }, () => [
47
+ u.hasPerm("PUT:/api/v1/sys/config/{id}") ? l(
48
+ f,
49
+ { size: "small", quaternary: !0, type: "primary", onClick: () => C(t) },
50
+ () => e("common.edit")
51
+ ) : null,
52
+ u.hasPerm("DELETE:/api/v1/sys/config/{id}") ? l(
53
+ I,
54
+ {
55
+ // popconfirm 当触发器,「执行→toast」交给 useConfirm().run(与 module 页一致)。
56
+ onPositiveClick: () => y(() => g.remove(t.id), e("config.deleted")).then((i) => {
57
+ i && G();
58
+ })
59
+ },
60
+ {
61
+ trigger: () => l(
62
+ f,
63
+ { size: "small", quaternary: !0, type: "error" },
64
+ () => e("common.delete")
65
+ ),
66
+ default: () => e("config.deleteConfirm", { name: t.name })
67
+ }
68
+ ) : null
69
+ ])
70
+ }
71
+ ], r = m(!1), s = m(null);
72
+ function _() {
73
+ s.value = null, r.value = !0;
74
+ }
75
+ function C(t) {
76
+ s.value = t, r.value = !0;
77
+ }
78
+ return (t, i) => {
79
+ const S = N("auth");
80
+ return p(), T(b, null, [
81
+ n($, {
82
+ title: o(e)("config.tab.advanced"),
83
+ desc: o(e)("config.advanced.desc")
84
+ }, {
85
+ default: a(() => [
86
+ P("div", J, [
87
+ n(o(q), {
88
+ "flex-height": "",
89
+ "virtual-scroll": "",
90
+ "default-page-size": 100,
91
+ ref_key: "tableRef",
92
+ ref: d,
93
+ columns: w,
94
+ fetcher: k,
95
+ "storage-key": "sys-config",
96
+ onError: i[0] || (i[0] = (c) => o(h).error(o(U)(c)))
97
+ }, {
98
+ toolbar: a(() => [
99
+ z((p(), D(o(f), {
100
+ type: "primary",
101
+ onClick: _
102
+ }, {
103
+ icon: a(() => [
104
+ n(F, {
105
+ icon: "ph:plus",
106
+ size: 16
107
+ })
108
+ ]),
109
+ default: a(() => [
110
+ V(" " + A(o(e)("common.add")), 1)
111
+ ]),
112
+ _: 1
113
+ })), [
114
+ [S, "POST:/api/v1/sys/config"]
115
+ ])
116
+ ]),
117
+ _: 1
118
+ }, 512)
119
+ ])
120
+ ]),
121
+ _: 1
122
+ }, 8, ["title", "desc"]),
123
+ n(O, {
124
+ show: r.value,
125
+ "onUpdate:show": i[1] || (i[1] = (c) => r.value = c),
126
+ row: s.value
127
+ }, null, 8, ["show", "row"])
128
+ ], 64);
129
+ };
130
+ }
131
+ });
132
+ export {
133
+ ce as default
134
+ };
135
+ //# sourceMappingURL=AdvancedSection2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdvancedSection2.vue.js","sources":["../../../../../src/views/system/config/components/AdvancedSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 高级:给开发者看的原始键值表。列出所有没被结构化表单认领的配置行——\n// 结构化分组里的零散键、业务模块自己加的配置都在这里;认领清单来自草稿(draft.claimedKeys)。\n// 列驱动搜索/分页/竞态交 SmartTable,新增/编辑弹窗是 ConfigFormModal。\nimport { h, ref, watch } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { configApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport type { SysConfig } from '#/types/api'\nimport ConfigFormModal from './ConfigFormModal.vue'\nimport SectionLayout from './SectionLayout.vue'\nimport { bumpConfigRevision, configRevision } from '../groups'\nimport { useConfigDraft } from '../draft'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst draft = useConfigDraft()\nconst tableRef = ref<SmartTableInst<SysConfig>>()\n\n// 在库里排除已认领的键,分页总数才准\nconst fetchConfigs = (params: Parameters<typeof configApi.page>[0]) =>\n configApi.page({ ...params, excludedKeys: draft.claimedKeys.value })\n\n// 保存或增删改了配置行都刷当前页(不回第 1 页)\nwatch(configRevision, () => tableRef.value?.refresh())\n\nconst columns: SmartTableColumn<SysConfig>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'configKey', title: () => t('config.key'), search: true, ellipsis: { tooltip: true } },\n { key: 'name', title: () => t('config.name'), search: true, ellipsis: { tooltip: true } },\n {\n key: 'configValue',\n title: () => t('config.value'),\n ellipsis: { tooltip: true },\n render: r => r.configValue || '—',\n },\n {\n key: 'groupCode',\n title: () => t('config.group'),\n search: true,\n render: r => r.groupCode || '—',\n },\n { key: 'sort', title: () => t('config.sort'), width: 80 },\n { key: 'createTime', title: () => t('common.createTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/config/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/config/{id}')\n ? h(\n NPopconfirm,\n {\n // popconfirm 当触发器,「执行→toast」交给 useConfirm().run(与 module 页一致)。\n onPositiveClick: () =>\n run(() => configApi.remove(r.id), t('config.deleted')).then(ok => {\n if (ok) bumpConfigRevision()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('config.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n\nconst show = ref(false)\nconst editing = ref<SysConfig | null>(null)\nfunction openAdd() {\n editing.value = null\n show.value = true\n}\nfunction openEdit(r: SysConfig) {\n editing.value = r\n show.value = true\n}\n</script>\n\n<template>\n <SectionLayout :title=\"t('config.tab.advanced')\" :desc=\"t('config.advanced.desc')\">\n <!-- .fill-main 接上内核的高度链(styles/layout.css):页面不滚,只有表体滚 -->\n <div class=\"fill-main\">\n <SmartTable\n flex-height\n virtual-scroll\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fetchConfigs\"\n storage-key=\"sys-config\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/config'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n </div>\n </SectionLayout>\n\n <ConfigFormModal v-model:show=\"show\" :row=\"editing\" />\n</template>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","draft","useConfigDraft","tableRef","ref","fetchConfigs","params","configApi","watch","configRevision","_a","columns","r","h","NSpace","NButton","openEdit","NPopconfirm","ok","bumpConfigRevision","show","editing","openAdd","_createVNode","SectionLayout","_unref","_createElementVNode","_hoisted_1","SmartTable","_cache","e","translateError","_createBlock","AppIcon","_createTextVNode","ConfigFormModal","$event"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { LoginLocale } from '../groups';
2
+ declare function setLocale(l: LoginLocale): void;
3
+ declare const __VLS_export: import('vue').DefineComponent<{}, {
4
+ setLocale: typeof setLocale;
5
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./BrandSection2.vue.js";
2
+ /* empty css */
3
+ import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-8627a064"]]);
5
+ export {
6
+ p as default
7
+ };
8
+ //# sourceMappingURL=BrandSection.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,264 @@
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";
8
+ import ae from "./SectionLayout.vue.js";
9
+ import D from "./CfgGroup.vue.js";
10
+ import s from "./CfgRow.vue.js";
11
+ import H from "./CfgSegment.vue.js";
12
+ 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__ */ $({
17
+ __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(() => [
20
+ { value: "admin", label: l("config.brand.previewAdmin") },
21
+ { value: "login", label: l("config.brand.previewLogin") }
22
+ ]), d = x(G.locale === "en-US" ? "en-US" : "zh-CN"), Y = u(
23
+ () => V.map((n) => ({
24
+ value: n,
25
+ label: l(`config.login.locale${n === "zh-CN" ? "Zh" : "En"}`)
26
+ }))
27
+ );
28
+ function N(n) {
29
+ d.value = n, r.value = "login";
30
+ }
31
+ const A = u(() => B(d.value)), S = (n) => u({
32
+ get: () => f[A.value[n]] ?? "",
33
+ set: (o) => {
34
+ f[A.value[n]] = o;
35
+ }
36
+ }), v = S("headline"), h = S("highlight"), b = S("features"), U = u({
37
+ get: () => f[C] !== "false",
38
+ set: (n) => {
39
+ f[C] = n ? "true" : "false";
40
+ }
41
+ }), E = u(() => {
42
+ const n = v.value.trim(), o = h.value.trim();
43
+ 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, {
48
+ title: e(l)("config.tab.brand"),
49
+ desc: e(l)("config.brand.desc"),
50
+ "preview-title": e(l)("config.brand.preview")
51
+ }, {
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,
57
+ label: e(l)("config.brand.preview")
58
+ }, null, 8, ["modelValue", "options", "label"])
59
+ ]),
60
+ preview: i(() => [
61
+ O(a(I, {
62
+ width: 880,
63
+ height: 540
64
+ }, {
65
+ default: i(() => [
66
+ a(ie)
67
+ ]),
68
+ _: 1
69
+ }, 512), [
70
+ [T, r.value === "admin"]
71
+ ]),
72
+ O(a(I, {
73
+ width: 880,
74
+ height: 540
75
+ }, {
76
+ default: i(() => [
77
+ a(ne, { locale: d.value }, null, 8, ["locale"])
78
+ ]),
79
+ _: 1
80
+ }, 512), [
81
+ [T, r.value === "login"]
82
+ ])
83
+ ]),
84
+ default: i(() => [
85
+ a(D, {
86
+ title: e(l)("config.brand.groupSite"),
87
+ onFocusin: o[3] || (o[3] = (t) => r.value = "admin")
88
+ }, {
89
+ default: i(() => [
90
+ a(s, {
91
+ label: e(l)("config.logo.title"),
92
+ hint: e(l)("config.logo.help"),
93
+ keys: [e(Q)],
94
+ class: "logo-row"
95
+ }, {
96
+ default: i(() => [
97
+ a(te)
98
+ ]),
99
+ _: 1
100
+ }, 8, ["label", "hint", "keys"]),
101
+ a(s, {
102
+ label: e(l)("config.base.siteTitle"),
103
+ keys: [e(ee)[0]]
104
+ }, {
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",
110
+ placeholder: "SmartAdmin",
111
+ "input-props": { "aria-label": e(l)("config.base.siteTitle") }
112
+ }, null, 8, ["value", "input-props"])
113
+ ]),
114
+ _: 1
115
+ }, 8, ["label", "keys"]),
116
+ a(s, {
117
+ label: e(l)("config.base.copyright"),
118
+ keys: ["sys.site.copyright"]
119
+ }, {
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",
125
+ placeholder: e(l)("config.brand.copyrightPh"),
126
+ "input-props": { "aria-label": e(l)("config.base.copyright") }
127
+ }, null, 8, ["value", "placeholder", "input-props"])
128
+ ]),
129
+ _: 1
130
+ }, 8, ["label"]),
131
+ a(s, {
132
+ label: e(l)("config.base.copyrightUrl"),
133
+ hint: e(l)("config.brand.copyrightUrlHint"),
134
+ keys: ["sys.site.copyrightUrl"]
135
+ }, {
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",
141
+ placeholder: "https://",
142
+ "input-props": { "aria-label": e(l)("config.base.copyrightUrl") }
143
+ }, null, 8, ["value", "input-props"])
144
+ ]),
145
+ _: 1
146
+ }, 8, ["label", "hint"])
147
+ ]),
148
+ _: 1
149
+ }, 8, ["title"]),
150
+ a(D, {
151
+ title: e(l)("config.brand.groupLogin"),
152
+ onFocusin: o[9] || (o[9] = (t) => r.value = "login")
153
+ }, {
154
+ extra: i(() => [
155
+ a(H, {
156
+ "model-value": d.value,
157
+ options: Y.value,
158
+ label: e(l)("config.login.language"),
159
+ "data-testid": "login-locale",
160
+ "onUpdate:modelValue": N
161
+ }, null, 8, ["model-value", "options", "label"])
162
+ ]),
163
+ default: i(() => [
164
+ a(s, {
165
+ label: e(l)("config.base.siteSubtitle"),
166
+ keys: [e(K)]
167
+ }, {
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",
173
+ placeholder: e(l)("login.subtitle", {}, { locale: d.value }),
174
+ "input-props": { "aria-label": e(l)("config.base.siteSubtitle") }
175
+ }, null, 8, ["value", "placeholder", "input-props"])
176
+ ]),
177
+ _: 1
178
+ }, 8, ["label", "keys"]),
179
+ a(s, {
180
+ label: e(l)("config.login.headline"),
181
+ keys: L("headline")
182
+ }, {
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",
188
+ placeholder: e(l)("config.login.headlinePlaceholder"),
189
+ "input-props": { "aria-label": e(l)("config.login.headline") }
190
+ }, null, 8, ["value", "placeholder", "input-props"])
191
+ ]),
192
+ _: 1
193
+ }, 8, ["label", "keys"]),
194
+ a(s, {
195
+ label: e(l)("config.login.highlight"),
196
+ keys: L("highlight")
197
+ }, {
198
+ hint: i(() => [
199
+ R("span", {
200
+ class: _({ warn: E.value })
201
+ }, M(E.value ? e(l)("config.login.highlightMissing") : e(l)("config.login.highlightHint")), 3)
202
+ ]),
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",
208
+ status: E.value ? "warning" : void 0,
209
+ placeholder: e(l)("config.login.highlightPlaceholder"),
210
+ "input-props": { "aria-label": e(l)("config.login.highlight") }
211
+ }, null, 8, ["value", "status", "placeholder", "input-props"])
212
+ ]),
213
+ _: 1
214
+ }, 8, ["label", "keys"]),
215
+ a(s, {
216
+ label: e(l)("config.login.showFeatures"),
217
+ keys: [e(C)]
218
+ }, {
219
+ default: i(() => [
220
+ a(e(Z), {
221
+ value: U.value,
222
+ "onUpdate:value": o[7] || (o[7] = (t) => U.value = t),
223
+ "aria-label": e(l)("config.login.showFeatures")
224
+ }, null, 8, ["value", "aria-label"])
225
+ ]),
226
+ _: 1
227
+ }, 8, ["label", "keys"]),
228
+ a(s, {
229
+ label: e(l)("config.login.features"),
230
+ keys: L("features"),
231
+ disabled: !U.value,
232
+ tall: "",
233
+ class: "feat"
234
+ }, {
235
+ hint: i(() => [
236
+ R("span", {
237
+ class: _({ err: F.value })
238
+ }, M(F.value ? e(l)("config.login.tooManyFeatures") : e(l)("config.login.featuresHint")), 3)
239
+ ]),
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),
244
+ type: "textarea",
245
+ status: F.value ? "error" : void 0,
246
+ autosize: { minRows: 2, maxRows: 4 },
247
+ placeholder: e(l)("config.login.featuresPlaceholder"),
248
+ "input-props": { "aria-label": e(l)("config.login.features") }
249
+ }, null, 8, ["value", "status", "placeholder", "input-props"])
250
+ ]),
251
+ _: 1
252
+ }, 8, ["label", "keys", "disabled"])
253
+ ]),
254
+ _: 1
255
+ }, 8, ["title"])
256
+ ]),
257
+ _: 1
258
+ }, 8, ["title", "desc", "preview-title"]));
259
+ }
260
+ });
261
+ export {
262
+ Ue as default
263
+ };
264
+ //# sourceMappingURL=BrandSection2.vue.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,18 @@
1
+ type __VLS_Props = {
2
+ title?: string;
3
+ };
4
+ declare var __VLS_1: {}, __VLS_3: {};
5
+ type __VLS_Slots = {} & {
6
+ extra?: (props: typeof __VLS_1) => any;
7
+ } & {
8
+ default?: (props: typeof __VLS_3) => any;
9
+ };
10
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
11
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
14
+ type __VLS_WithSlots<T, S> = T & {
15
+ new (): {
16
+ $slots: S;
17
+ };
18
+ };
@@ -0,0 +1,8 @@
1
+ import o from "./CfgGroup2.vue.js";
2
+ /* empty css */
3
+ import r from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const f = /* @__PURE__ */ r(o, [["__scopeId", "data-v-85a7c281"]]);
5
+ export {
6
+ f as default
7
+ };
8
+ //# sourceMappingURL=CfgGroup.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CfgGroup.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,22 @@
1
+ import { defineComponent as n, openBlock as o, createElementBlock as s, createElementVNode as r, toDisplayString as i, renderSlot as l, createCommentVNode as a } from "vue";
2
+ const c = { class: "cfg-group" }, d = { key: 0 }, u = { class: "cfg-list" }, f = /* @__PURE__ */ n({
3
+ __name: "CfgGroup",
4
+ props: {
5
+ title: {}
6
+ },
7
+ setup(t) {
8
+ return (e, m) => (o(), s("div", c, [
9
+ t.title || e.$slots.extra ? (o(), s("h4", d, [
10
+ r("span", null, i(t.title), 1),
11
+ l(e.$slots, "extra", {}, void 0, !0)
12
+ ])) : a("", !0),
13
+ r("div", u, [
14
+ l(e.$slots, "default", {}, void 0, !0)
15
+ ])
16
+ ]));
17
+ }
18
+ });
19
+ export {
20
+ f as default
21
+ };
22
+ //# sourceMappingURL=CfgGroup2.vue.js.map
@@ -0,0 +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;;;;"}
@@ -0,0 +1,26 @@
1
+ type __VLS_Props = {
2
+ label?: string;
3
+ hint?: string;
4
+ keys?: readonly string[];
5
+ sub?: boolean;
6
+ disabled?: boolean;
7
+ /** 控件比一行高(多行输入、标签组):顶端对齐 */
8
+ tall?: boolean;
9
+ };
10
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {};
11
+ type __VLS_Slots = {} & {
12
+ label?: (props: typeof __VLS_1) => any;
13
+ } & {
14
+ hint?: (props: typeof __VLS_3) => any;
15
+ } & {
16
+ default?: (props: typeof __VLS_5) => any;
17
+ };
18
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
19
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
20
+ declare const _default: typeof __VLS_export;
21
+ export default _default;
22
+ type __VLS_WithSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
@@ -0,0 +1,9 @@
1
+ import o from "./CfgRow2.vue.js";
2
+ /* empty css */
3
+ /* empty css */
4
+ import t from "../../../../_virtual/_plugin-vue_export-helper.js";
5
+ const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-bd8e29b3"]]);
6
+ export {
7
+ _ as default
8
+ };
9
+ //# sourceMappingURL=CfgRow.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CfgRow.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}