dashboard-shell-shell 3.0.5-test.6 → 3.0.5-test.9

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 (218) hide show
  1. package/assets/brand/harvester/favicon.png +0 -0
  2. package/assets/brand/suse/favicon.png +0 -0
  3. package/assets/icons/demo.css +539 -0
  4. package/assets/icons/demo.css:Zone.Identifier +0 -0
  5. package/assets/icons/demo_index.html +1131 -0
  6. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.css +216 -0
  8. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.js +1 -0
  10. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  11. package/assets/icons/iconfont.json +324 -0
  12. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  13. package/assets/icons/iconfont.ttf +0 -0
  14. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  15. package/assets/icons/iconfont.woff +0 -0
  16. package/assets/icons/iconfont.woff2 +0 -0
  17. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  18. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  19. package/assets/images/API.svg +3 -0
  20. package/assets/images/action.svg +6 -0
  21. package/assets/images/login/password.svg +20 -0
  22. package/assets/images/login/user.svg +6 -0
  23. package/assets/images/login-bg.png +0 -0
  24. package/assets/images/login-left.png +0 -0
  25. package/assets/images/login-logo.svg +19 -0
  26. package/assets/images/logo.png +0 -0
  27. package/assets/images/pl/half-logo.svg +2 -23
  28. package/assets/images/pl/harvester.png +0 -0
  29. package/assets/images/pl/logo.png +0 -0
  30. package/assets/images/promp-yellow.svg +5 -0
  31. package/assets/images/user.png +0 -0
  32. package/assets/styles/all.scss +63 -0
  33. package/assets/styles/app.scss +4 -0
  34. package/assets/styles/base/_basic.scss +2 -2
  35. package/assets/styles/base/_mixins.scss +1 -1
  36. package/assets/styles/base/_typography.scss +2 -1
  37. package/assets/styles/base/_variables.scss +14 -7
  38. package/assets/styles/global/_button.scss +43 -25
  39. package/assets/styles/global/_columns.scss +3 -1
  40. package/assets/styles/global/_form.scss +45 -13
  41. package/assets/styles/global/_labeled-input.scss +54 -26
  42. package/assets/styles/global/_layout.scss +8 -3
  43. package/assets/styles/global/_select.scss +25 -17
  44. package/assets/styles/global/_table.scss +7 -1
  45. package/assets/styles/global/_tooltip.scss +56 -8
  46. package/assets/styles/themes/_dark.scss +3 -0
  47. package/assets/styles/themes/_light.scss +66 -43
  48. package/assets/styles/vendor/vue-select.scss +22 -9
  49. package/assets/translations/en-us.yaml +28 -4
  50. package/assets/translations/zh-hans.yaml +452 -189
  51. package/components/ActionDropdown.vue +2 -1
  52. package/components/ActionMenu.vue +2 -2
  53. package/components/ActionMenuShell.vue +2 -0
  54. package/components/AppModal.vue +46 -5
  55. package/components/BrandImage.vue +1 -0
  56. package/components/ButtonDropdown.vue +26 -4
  57. package/components/ButtonMultiAction.vue +1 -0
  58. package/components/ClusterIconMenu.vue +1 -1
  59. package/components/CodeMirror.vue +20 -6
  60. package/components/ConsumptionGauge.vue +24 -5
  61. package/components/CopyToClipboard.vue +15 -0
  62. package/components/CruResource.vue +9 -8
  63. package/components/CruResourceFooter.vue +2 -2
  64. package/components/DashboardOptions.vue +29 -17
  65. package/components/DotState.vue +84 -0
  66. package/components/Drawer/Chrome.vue +2 -2
  67. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +22 -22
  68. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +1 -1
  69. package/components/Drawer/ResourceDetailDrawer/index.vue +2 -1
  70. package/components/ExplorerMembers.vue +18 -3
  71. package/components/ExplorerProjectsNamespaces.vue +19 -5
  72. package/components/GlobalRoleBindings.vue +112 -48
  73. package/components/GrafanaDashboard.vue +4 -4
  74. package/components/GrowlManager.vue +3 -1
  75. package/components/HardwareResourceGauge.vue +39 -3
  76. package/components/IndentedPanel.vue +4 -10
  77. package/components/InfoBox.vue +3 -3
  78. package/components/InputOrDisplay.vue +28 -2
  79. package/components/LabelValue.vue +20 -1
  80. package/components/ModalWithCard.vue +12 -3
  81. package/components/PodSecurityAdmission.vue +1 -1
  82. package/components/PromptModal.vue +1 -1
  83. package/components/PromptRemove.vue +30 -11
  84. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +1 -3
  85. package/components/Resource/Detail/Metadata/KeyValue.vue +8 -4
  86. package/components/Resource/Detail/Metadata/index.vue +3 -1
  87. package/components/Resource/Detail/TitleBar/Title.vue +4 -3
  88. package/components/Resource/Detail/TitleBar/Top.vue +2 -0
  89. package/components/Resource/Detail/TitleBar/index.vue +109 -24
  90. package/components/ResourceDetail/Masthead/legacy.vue +181 -38
  91. package/components/ResourceDetail/legacy.vue +32 -14
  92. package/components/ResourceList/Masthead.vue +226 -54
  93. package/components/ResourceList/ResourceLoadingIndicator.vue +5 -2
  94. package/components/ResourceTable.vue +24 -2
  95. package/components/SideNav.vue +74 -20
  96. package/components/SortableTable/THead.vue +33 -3
  97. package/components/SortableTable/index.vue +1016 -463
  98. package/components/SortableTable/paging.js +26 -16
  99. package/components/SortableTable/selection.js +2 -2
  100. package/components/Tabbed/Tab.vue +3 -3
  101. package/components/Tabbed/index.vue +47 -29
  102. package/components/YamlEditor.vue +0 -1
  103. package/components/auth/Principal.vue +37 -13
  104. package/components/auth/RoleDetailEdit.vue +58 -7
  105. package/components/auth/SelectPrincipal.vue +1 -0
  106. package/components/breadcrumb/index.vue +316 -0
  107. package/components/form/ArrayList.vue +41 -33
  108. package/components/form/ArrayListGrouped.vue +10 -2
  109. package/components/form/ArrayListSelect.vue +1 -1
  110. package/components/form/BannerSettings.vue +64 -59
  111. package/components/form/ChangePassword.vue +4 -4
  112. package/components/form/ColorInput.vue +32 -8
  113. package/components/form/Footer.vue +11 -8
  114. package/components/form/InputWithSelect.vue +8 -5
  115. package/components/form/KeyValue.vue +47 -7
  116. package/components/form/LabeledSelect.vue +214 -242
  117. package/components/form/Labels.vue +3 -3
  118. package/components/form/MatchExpressions.vue +24 -7
  119. package/components/form/Members/ClusterPermissionsEditor.vue +1 -2
  120. package/components/form/Members/MembershipEditor.vue +1 -1
  121. package/components/form/NameNsDescription.vue +59 -20
  122. package/components/form/Password.vue +16 -7
  123. package/components/form/PodAffinity.vue +4 -5
  124. package/components/form/ResourceQuota/Namespace.vue +4 -4
  125. package/components/form/ResourceQuota/NamespaceRow.vue +18 -17
  126. package/components/form/ResourceQuota/Project.vue +4 -4
  127. package/components/form/ResourceQuota/ProjectRow.vue +3 -6
  128. package/components/form/Select.vue +5 -2
  129. package/components/form/SimpleSecretSelector.vue +29 -9
  130. package/components/form/Taints.vue +2 -1
  131. package/components/form/UnitInput.vue +8 -3
  132. package/components/form/WorkloadPorts.vue +143 -123
  133. package/components/formatter/BadgeStateFormatter.vue +8 -5
  134. package/components/formatter/LiveDate.vue +3 -3
  135. package/components/nav/Favorite.vue +5 -1
  136. package/components/nav/Group.vue +132 -99
  137. package/components/nav/Header.vue +124 -27
  138. package/components/nav/HeaderPageActionMenu.vue +1 -0
  139. package/components/nav/NamespaceFilter.vue +20 -17
  140. package/components/nav/TopLevelMenu.vue +182 -119
  141. package/components/nav/Type.vue +63 -41
  142. package/composables/useClickOutside.ts +1 -1
  143. package/config/private-label.js +15 -11
  144. package/config/product/auth.js +17 -7
  145. package/config/product/settings.js +19 -9
  146. package/config/settings.ts +28 -0
  147. package/config/table-headers.js +3 -2
  148. package/dialog/ForceMachineRemoveDialog.vue +2 -2
  149. package/dialog/ScalePoolDownDialog.vue +2 -2
  150. package/edit/management.cattle.io.user.vue +17 -4
  151. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  152. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  153. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  154. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  155. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  158. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  159. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  160. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  161. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  162. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  163. package/edit/namespace.vue +1 -2
  164. package/edit/token.vue +31 -12
  165. package/edit/workload/index.vue +4 -4
  166. package/list/management.cattle.io.setting.vue +22 -13
  167. package/list/management.cattle.io.user.vue +7 -3
  168. package/list/namespace.vue +3 -0
  169. package/list/provisioning.cattle.io.cluster.vue +6 -7
  170. package/mixins/brand.js +17 -0
  171. package/package.json +1 -1
  172. package/pages/account/pri.vue +229 -0
  173. package/pages/auth/login.vue +220 -52
  174. package/pages/auth/setup.vue +142 -19
  175. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  176. package/pages/c/_cluster/auth/roles/index.vue +56 -5
  177. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  178. package/pages/c/_cluster/settings/banners.vue +174 -102
  179. package/pages/c/_cluster/settings/brand.vue +350 -302
  180. package/pages/c/_cluster/settings/performance.vue +61 -38
  181. package/pages/home.vue +70 -30
  182. package/pages/prefs.vue +27 -25
  183. package/pkg/tsconfig.json +9 -9
  184. package/pkg/vue.config.js +1 -1
  185. package/plugins/dashboard-store/resource-class.js +28 -27
  186. package/promptRemove/mixin/roleDeletionCheck.js +2 -2
  187. package/public/index.html +4 -4
  188. package/rancher-components/BadgeState/BadgeState.vue +38 -55
  189. package/rancher-components/Banner/Banner.vue +12 -8
  190. package/rancher-components/Card/Card.vue +7 -8
  191. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  192. package/rancher-components/Form/LabeledInput/LabeledInput.vue +42 -3
  193. package/rancher-components/Form/Radio/RadioButton.vue +35 -11
  194. package/rancher-components/Form/Radio/RadioGroup.vue +13 -5
  195. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +3 -3
  196. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +1 -0
  197. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +12 -4
  198. package/rancher-components/RcDropdown/RcDropdown.vue +35 -7
  199. package/rancher-components/RcDropdown/RcDropdownItem.vue +2 -2
  200. package/rancher-components/RcDropdown/RcDropdownMenu.vue +12 -6
  201. package/rancher-components/RcDropdown/types.ts +1 -0
  202. package/rancher-components/StringList/StringList.vue +1 -1
  203. package/scripts/publish-shell.sh +1 -1
  204. package/static/favicon.ico +0 -0
  205. package/static/favicon.png +0 -0
  206. package/static/loading-indicator.html +3 -3
  207. package/store/i18n.js +5 -2
  208. package/store/modal.ts +3 -3
  209. package/store/prefs.js +11 -4
  210. package/store/type-map.js +32 -2
  211. package/types/shell/index.d.ts +78 -97
  212. package/utils/error.js +89 -8
  213. package/utils/errorTranslate.json +1351 -0
  214. package/utils/router.js +21 -0
  215. package/utils/select.js +26 -3
  216. package/utils/string.js +8 -5
  217. package/utils/title.ts +1 -1
  218. package/vue.config.js +1 -1
@@ -34,8 +34,8 @@ export default {
34
34
  uiBannerLightSetting: fetchOrCreateSetting(this.$store, SETTING.BANNER_LIGHT, ''),
35
35
  uiLoginBackgroundDarkSetting: fetchOrCreateSetting(this.$store, SETTING.LOGIN_BACKGROUND_DARK, ''),
36
36
  uiLoginBackgroundLightSetting: fetchOrCreateSetting(this.$store, SETTING.LOGIN_BACKGROUND_LIGHT, ''),
37
- uiColorSetting: fetchOrCreateSetting(this.$store, SETTING.PRIMARY_COLOR, ''),
38
- uiLinkColorSetting: fetchOrCreateSetting(this.$store, SETTING.LINK_COLOR, ''),
37
+ uiColorSetting: fetchOrCreateSetting(this.$store, SETTING.PRIMARY_COLOR, 'rgb(24, 144, 255)'),
38
+ uiLinkColorSetting: fetchOrCreateSetting(this.$store, SETTING.LINK_COLOR, 'rgb(24, 144, 255)'),
39
39
  uiFaviconSetting: fetchOrCreateSetting(this.$store, SETTING.FAVICON, ''),
40
40
  });
41
41
 
@@ -249,329 +249,358 @@ export default {
249
249
 
250
250
  <template>
251
251
  <Loading v-if="$fetchState.pending" />
252
- <div v-else>
252
+ <div v-else style="padding-bottom:60px;">
253
+
254
+ <!-- 面包屑 -->
255
+ <div class="excram-list">全局设置 / <span style="color: #1890FF;">界面</span></div>
253
256
  <h1 class="mb-20">
254
257
  <TabTitle>{{ t('branding.label') }}</TabTitle>
255
258
  </h1>
259
+ <div style="margin-bottom: 16px;">用于统一配置系统形象与视觉主题,可管理登录页与操作界面的Logo、背景、色彩等核心元素,实现全局自定义UI界面。</div>
260
+ <div data-v-d7fbd5e8="" style="width: 110%; height: 1px; background-color: rgb(215, 215, 215); margin-bottom: 16px; margin-left: -20px; margin-right: -20px;"></div>
256
261
  <TypeDescription resource="branding" />
257
262
  <div>
258
- <div class="row mb-20">
259
- <div class="col span-6">
260
- <LabeledInput
261
- v-model:value="uiPLSetting.value"
262
- :label="t('branding.uiPL.label')"
263
- :mode="mode"
264
- :maxlength="100"
265
- />
266
- </div>
267
- </div>
268
- <h3 class="mt-20 mb-5 pb-5">
269
- {{ t('branding.logos.label') }}
270
- </h3>
271
- <label class="text-label">
272
- {{ t('branding.logos.tip', {}, true) }}
273
- </label>
274
-
275
- <div class="row mt-10 mb-20">
276
- <Checkbox
277
- v-model:value="customizeLogo"
278
- :label="t('branding.logos.useCustom')"
279
- :mode="mode"
280
- />
281
- </div>
282
-
283
- <div
284
- v-if="customizeLogo"
285
- class="row mb-20"
286
- >
287
- <div class="col preview-container logo span-6">
288
- <div class="mb-10">
289
- <FileImageSelector
290
- :byte-limit="20000"
291
- :read-as-data-url="true"
292
- class="role-secondary"
293
- :label="t('branding.logos.uploadLight')"
294
- :mode="mode"
295
- accept="image/jpeg,image/png,image/svg+xml"
296
- @error="setError"
297
- @update:value="updateBranding($event, 'uiLogoLight')"
298
- />
299
- </div>
300
- <SimpleBox
301
- v-if="uiLogoLight || uiLogoDark"
302
- class="theme-light mb-10"
303
- >
304
- <label class="text-muted">{{ t('branding.logos.lightPreview') }}</label>
305
- <img
306
- class="img-preview"
307
- data-testid="branding-logo-light-preview"
308
- :src="uiLogoLight ? uiLogoLight : uiLogoDark"
309
- >
310
- </SimpleBox>
311
- </div>
312
- <div class="col preview-container logo span-6">
313
- <div class="mb-10">
314
- <FileImageSelector
315
- :byte-limit="20000"
316
- :read-as-data-url="true"
317
- class="role-secondary"
318
- :label="t('branding.logos.uploadDark')"
263
+ <!-- 系统名称 -->
264
+ <div class="row">
265
+ <div class="mb-20 pl-20 pt-20" style="border: 1px solid var(--nav-border);width: 100%;">
266
+ <h3 class="mb-20">系统名称</h3>
267
+ <div class="col span-6">
268
+ <LabeledInput
269
+ v-model:value="uiPLSetting.value"
270
+ :label="'名称'"
319
271
  :mode="mode"
320
- accept="image/jpeg,image/png,image/svg+xml"
321
- @error="setError"
322
- @update:value="updateBranding($event, 'uiLogoDark')"
272
+ :maxlength="100"
323
273
  />
324
274
  </div>
325
- <SimpleBox
326
- v-if="uiLogoDark || uiLogoLight"
327
- class="theme-dark mb-10"
328
- >
329
- <label class="text-muted">{{ t('branding.logos.darkPreview') }}</label>
330
- <img
331
- class="img-preview"
332
- data-testid="branding-logo-dark-preview"
333
- :src="uiLogoDark ? uiLogoDark : uiLogoLight"
334
- >
335
- </SimpleBox>
336
275
  </div>
337
276
  </div>
338
277
 
339
- <h3 class="mt-20 mb-5 pb-5">
340
- {{ t('branding.banner.label') }}
341
- </h3>
342
- <label class="text-label">
343
- {{ t('branding.banner.tip', {}, true) }}
344
- </label>
345
-
346
- <div class="row mt-10 mb-20">
347
- <Checkbox
348
- v-model:value="customizeBanner"
349
- :label="t('branding.banner.useCustom')"
350
- :mode="mode"
351
- />
352
- </div>
353
-
354
- <div
355
- v-if="customizeBanner"
356
- class="row mb-20"
357
- >
358
- <div class="col preview-container banner span-6">
359
- <div class="mb-10">
360
- <FileImageSelector
361
- :byte-limit="200000"
362
- :read-as-data-url="true"
363
- class="role-secondary"
364
- :label="t('branding.banner.uploadLight')"
365
- :mode="mode"
366
- accept="image/jpeg,image/png,image/svg+xml"
367
- @error="setError"
368
- @update:value="updateBranding($event, 'uiBannerLight')"
369
- />
370
- </div>
371
- <SimpleBox
372
- v-if="uiBannerLight || uiBannerDark"
373
- class="theme-light mb-10"
374
- >
375
- <label class="text-muted">{{ t('branding.banner.lightPreview') }}</label>
376
- <img
377
- class="img-preview"
378
- data-testid="branding-banner-light-preview"
379
- :src="uiBannerLight ? uiBannerLight : uiBannerDark"
380
- >
381
- </SimpleBox>
278
+ <!-- Logo -->
279
+ <div class="mb-20 pl-20" style="border: 1px solid var(--nav-border);">
280
+ <h3 class="mt-20 mb-20">
281
+ {{ t('branding.logos.label') }}
282
+ </h3>
283
+ <label class="text-label">
284
+ {{ t('branding.logos.tip', {}, true) }}
285
+ </label>
286
+
287
+ <div class="row mt-10 mb-20">
288
+ <Checkbox
289
+ v-model:value="customizeLogo"
290
+ :label="t('branding.logos.useCustom')"
291
+ :mode="mode"
292
+ />
382
293
  </div>
383
- <div class="col preview-container banner span-6">
384
- <div class="mb-10">
385
- <FileImageSelector
386
- :byte-limit="200000"
387
- :read-as-data-url="true"
388
- class="role-secondary"
389
- :label="t('branding.banner.uploadDark')"
390
- :mode="mode"
391
- accept="image/jpeg,image/png,image/svg+xml"
392
- @error="setError"
393
- @update:value="updateBranding($event, 'uiBannerDark')"
394
- />
294
+
295
+ <div
296
+ v-if="customizeLogo"
297
+ class="row mb-20"
298
+ >
299
+ <div class="col preview-container logo span-6">
300
+ <div class="mb-10">
301
+ <FileImageSelector
302
+ :byte-limit="20000"
303
+ :read-as-data-url="true"
304
+ class="role-secondary"
305
+ :label="t('branding.logos.uploadLight')"
306
+ :mode="mode"
307
+ accept="image/jpeg,image/png,image/svg+xml"
308
+ @error="setError"
309
+ @update:value="updateBranding($event, 'uiLogoLight')"
310
+ />
311
+ </div>
312
+ <SimpleBox
313
+ v-if="uiLogoLight || uiLogoDark"
314
+ class="theme-light mb-10"
315
+ >
316
+ <label class="text-muted">{{ t('branding.logos.lightPreview') }}</label>
317
+ <img
318
+ class="img-preview"
319
+ data-testid="branding-logo-light-preview"
320
+ :src="uiLogoLight ? uiLogoLight : uiLogoDark"
321
+ >
322
+ </SimpleBox>
395
323
  </div>
396
- <SimpleBox
397
- v-if="uiBannerDark || uiBannerLight"
398
- class="theme-dark mb-10"
399
- >
400
- <label class="text-muted">{{ t('branding.banner.darkPreview') }}</label>
401
- <img
402
- class="img-preview"
403
- data-testid="branding-banner-dark-preview"
404
- :src="uiBannerDark ? uiBannerDark : uiBannerLight"
324
+ <div class="col preview-container logo span-6">
325
+ <div class="mb-10">
326
+ <FileImageSelector
327
+ :byte-limit="20000"
328
+ :read-as-data-url="true"
329
+ class="role-secondary"
330
+ :label="t('branding.logos.uploadDark')"
331
+ :mode="mode"
332
+ accept="image/jpeg,image/png,image/svg+xml"
333
+ @error="setError"
334
+ @update:value="updateBranding($event, 'uiLogoDark')"
335
+ />
336
+ </div>
337
+ <SimpleBox
338
+ v-if="uiLogoDark || uiLogoLight"
339
+ class="theme-dark mb-10"
405
340
  >
406
- </SimpleBox>
341
+ <label class="text-muted">{{ t('branding.logos.darkPreview') }}</label>
342
+ <img
343
+ class="img-preview"
344
+ data-testid="branding-logo-dark-preview"
345
+ :src="uiLogoDark ? uiLogoDark : uiLogoLight"
346
+ >
347
+ </SimpleBox>
348
+ </div>
407
349
  </div>
408
350
  </div>
409
351
 
410
- <h3 class="mt-20 mb-5 pb-5">
411
- {{ t('branding.loginBackground.label') }}
412
- </h3>
413
- <label class="text-label">
414
- {{ t('branding.loginBackground.tip', {}, true) }}
415
- </label>
416
-
417
- <div class="row mt-10 mb-20">
418
- <Checkbox
419
- v-model:value="customizeLoginBackground"
420
- :label="t('branding.loginBackground.useCustom')"
421
- :mode="mode"
422
- />
423
- </div>
424
-
425
- <div
426
- v-if="customizeLoginBackground"
427
- class="row mb-20"
428
- >
429
- <div class="col preview-container login-background span-6">
430
- <div class="mb-10">
431
- <FileImageSelector
432
- :byte-limit="200000"
433
- :read-as-data-url="true"
434
- class="role-secondary"
435
- :label="t('branding.loginBackground.uploadLight')"
352
+ <!-- Banner -->
353
+ <div class="mb-20 pl-20" style="border: 1px solid var(--nav-border);">
354
+ <h3 class="mt-20 mb-20">
355
+ {{ t('branding.banner.label') }}
356
+ </h3>
357
+ <label class="text-label">
358
+ {{ t('branding.banner.tip', {}, true) }}
359
+ </label>
360
+
361
+ <div class="row mt-10 mb-20">
362
+ <Checkbox
363
+ v-model:value="customizeBanner"
364
+ :label="t('branding.banner.useCustom')"
365
+ :mode="mode"
366
+ />
367
+ </div>
368
+
369
+ <div
370
+ v-if="customizeBanner"
371
+ class="row mb-20"
372
+ >
373
+ <div class="col preview-container banner span-6">
374
+ <div class="mb-10">
375
+ <FileImageSelector
376
+ :byte-limit="200000"
377
+ :read-as-data-url="true"
378
+ class="role-secondary"
379
+ :label="t('branding.banner.uploadLight')"
380
+ :mode="mode"
381
+ accept="image/jpeg,image/png,image/svg+xml"
382
+ @error="setError"
383
+ @update:value="updateBranding($event, 'uiBannerLight')"
384
+ />
385
+ </div>
386
+ <SimpleBox
387
+ v-if="uiBannerLight || uiBannerDark"
388
+ class="theme-light mb-10"
389
+ >
390
+ <label class="text-muted">{{ t('branding.banner.lightPreview') }}</label>
391
+ <img
392
+ class="img-preview"
393
+ data-testid="branding-banner-light-preview"
394
+ :src="uiBannerLight ? uiBannerLight : uiBannerDark"
395
+ >
396
+ </SimpleBox>
397
+ </div>
398
+ <div class="col preview-container banner span-6">
399
+ <div class="mb-10">
400
+ <FileImageSelector
401
+ :byte-limit="200000"
402
+ :read-as-data-url="true"
403
+ class="role-secondary"
404
+ :label="t('branding.banner.uploadDark')"
405
+ :mode="mode"
406
+ accept="image/jpeg,image/png,image/svg+xml"
407
+ @error="setError"
408
+ @update:value="updateBranding($event, 'uiBannerDark')"
409
+ />
410
+ </div>
411
+ <SimpleBox
412
+ v-if="uiBannerDark || uiBannerLight"
413
+ class="theme-dark mb-10"
414
+ >
415
+ <label class="text-muted">{{ t('branding.banner.darkPreview') }}</label>
416
+ <img
417
+ class="img-preview"
418
+ data-testid="branding-banner-dark-preview"
419
+ :src="uiBannerDark ? uiBannerDark : uiBannerLight"
420
+ >
421
+ </SimpleBox>
422
+ </div>
423
+ </div>
424
+ </div>
425
+
426
+ <!-- Login Background -->
427
+ <div class="mb-20 pl-20" style="border: 1px solid var(--nav-border);">
428
+ <h3 class="mt-20 mb-20">
429
+ {{ t('branding.loginBackground.label') }}
430
+ </h3>
431
+ <label class="text-label">
432
+ {{ t('branding.loginBackground.tip', {}, true) }}
433
+ </label>
434
+
435
+ <div class="row mt-10 mb-20">
436
+ <Checkbox
437
+ v-model:value="customizeLoginBackground"
438
+ :label="t('branding.loginBackground.useCustom')"
439
+ :mode="mode"
440
+ />
441
+ </div>
442
+
443
+ <div
444
+ v-if="customizeLoginBackground"
445
+ class="row mb-20"
446
+ >
447
+ <div class="col preview-container login-background span-6">
448
+ <div class="mb-10">
449
+ <FileImageSelector
450
+ :byte-limit="200000"
451
+ :read-as-data-url="true"
452
+ class="role-secondary"
453
+ :label="t('branding.loginBackground.uploadLight')"
454
+ :mode="mode"
455
+ accept="image/jpeg,image/png,image/svg+xml"
456
+ @error="setError"
457
+ @update:value="updateBranding($event, 'uiLoginBackgroundLight')"
458
+ />
459
+ </div>
460
+ <SimpleBox
461
+ v-if="uiLoginBackgroundLight || uiLoginBackgroundDark"
462
+ class="theme-light mb-10"
463
+ >
464
+ <label class="text-muted">{{ t('branding.loginBackground.lightPreview') }}</label>
465
+ <img
466
+ class="img-preview"
467
+ data-testid="branding-login-background-light-preview"
468
+ :src="uiLoginBackgroundLight ? uiLoginBackgroundLight : uiLoginBackgroundDark"
469
+ >
470
+ </SimpleBox>
471
+ </div>
472
+ <div class="col preview-container login-background span-6">
473
+ <div class="mb-10">
474
+ <FileImageSelector
475
+ :byte-limit="200000"
476
+ :read-as-data-url="true"
477
+ class="role-secondary"
478
+ :label="t('branding.loginBackground.uploadDark')"
479
+ :mode="mode"
480
+ accept="image/jpeg,image/png,image/svg+xml"
481
+ @error="setError"
482
+ @update:value="updateBranding($event, 'uiLoginBackgroundDark')"
483
+ />
484
+ </div>
485
+ <SimpleBox
486
+ v-if="uiLoginBackgroundDark || uiLoginBackgroundLight"
487
+ class="theme-dark mb-10"
488
+ >
489
+ <label class="text-muted">{{ t('branding.loginBackground.darkPreview') }}</label>
490
+ <img
491
+ class="img-preview"
492
+ data-testid="branding-login-background-dark-preview"
493
+ :src="uiLoginBackgroundDark ? uiLoginBackgroundDark : uiLoginBackgroundLight"
494
+ >
495
+ </SimpleBox>
496
+ </div>
497
+ </div>
498
+ </div>
499
+
500
+ <!-- 网站图标 -->
501
+ <div class="mb-20 pl-20" style="border: 1px solid var(--nav-border);">
502
+ <h3 class="mt-20 mb-20">
503
+ {{ t('branding.favicon.label') }}
504
+ </h3>
505
+ <label class="text-label">
506
+ {{ t('branding.favicon.tip', {}, true) }}
507
+ </label>
508
+
509
+ <div class="row mt-10 mb-20">
510
+ <Checkbox
511
+ v-model:value="customizeFavicon"
512
+ :label="t('branding.favicon.useCustom')"
513
+ :mode="mode"
514
+ />
515
+ </div>
516
+
517
+ <div
518
+ v-if="customizeFavicon"
519
+ class="row mb-20"
520
+ >
521
+ <div class="col favicon-container span-12">
522
+ <div class="mb-10">
523
+ <FileImageSelector
524
+ :byte-limit="20000"
525
+ :read-as-data-url="true"
526
+ class="role-secondary"
527
+ :label="t('branding.favicon.upload')"
528
+ :mode="mode"
529
+ accept="image/jpeg,image/png,image/svg+xml"
530
+ @error="setError"
531
+ @update:value="updateBranding($event, 'uiFavicon')"
532
+ />
533
+ </div>
534
+ <SimpleBox v-if="uiFavicon">
535
+ <label class="text-muted">{{ t('branding.favicon.preview') }}</label>
536
+ <img
537
+ class="favicon-preview"
538
+ data-testid="branding-favicon-preview"
539
+ :src="uiFavicon"
540
+ >
541
+ </SimpleBox>
542
+ </div>
543
+ </div>
544
+ </div>
545
+
546
+ <!-- 主题色 -->
547
+ <div class="mb-20 pl-20 pb-20" style="border: 1px solid var(--nav-border);">
548
+ <h3 class="mt-20 mb-20">
549
+ {{ t('branding.color.label') }}
550
+ </h3>
551
+ <label class="text-label">
552
+ {{ t('branding.color.tip', {}, true) }}
553
+ </label>
554
+ <div class="row mt-20">
555
+ <Checkbox
556
+ v-model:value="customizeColor"
557
+ :label="t('branding.color.useCustom')"
558
+ :mode="mode"
559
+ />
560
+ </div>
561
+ <div
562
+ v-if="customizeColor"
563
+ class="row mt-20 mb-20"
564
+ >
565
+ <ColorInput
566
+ v-model:value="uiColor"
567
+ component-testid="primary"
568
+ />
569
+ </div>
570
+ </div>
571
+
572
+ <!-- 链接颜色 -->
573
+ <div class="mb-20 pl-20 pb-20" style="border: 1px solid var(--nav-border);">
574
+ <h3 class="mt-20 mb-20">
575
+ {{ t('branding.linkColor.label') }}
576
+ </h3>
577
+ <label class="text-label">
578
+ {{ t('branding.linkColor.tip', {}, true) }}
579
+ </label>
580
+ <div class="row mt-20">
581
+ <Checkbox
582
+ v-model:value="customizeLinkColor"
583
+ :label="t('branding.linkColor.useCustom')"
436
584
  :mode="mode"
437
- accept="image/jpeg,image/png,image/svg+xml"
438
- @error="setError"
439
- @update:value="updateBranding($event, 'uiLoginBackgroundLight')"
440
585
  />
441
586
  </div>
442
- <SimpleBox
443
- v-if="uiLoginBackgroundLight || uiLoginBackgroundDark"
444
- class="theme-light mb-10"
587
+ <div
588
+ v-if="customizeLinkColor"
589
+ class="row mt-20 mb-20"
445
590
  >
446
- <label class="text-muted">{{ t('branding.loginBackground.lightPreview') }}</label>
447
- <img
448
- class="img-preview"
449
- data-testid="branding-login-background-light-preview"
450
- :src="uiLoginBackgroundLight ? uiLoginBackgroundLight : uiLoginBackgroundDark"
451
- >
452
- </SimpleBox>
453
- </div>
454
- <div class="col preview-container login-background span-6">
455
- <div class="mb-10">
456
- <FileImageSelector
457
- :byte-limit="200000"
458
- :read-as-data-url="true"
459
- class="role-secondary"
460
- :label="t('branding.loginBackground.uploadDark')"
461
- :mode="mode"
462
- accept="image/jpeg,image/png,image/svg+xml"
463
- @error="setError"
464
- @update:value="updateBranding($event, 'uiLoginBackgroundDark')"
591
+ <ColorInput
592
+ v-model:value="uiLinkColor"
593
+ class="col"
594
+ component-testid="link"
465
595
  />
596
+ <span class="col link-example">
597
+ <a :style="customLinkColor">
598
+ {{ t('branding.linkColor.example') }}
599
+ </a>
600
+ </span>
466
601
  </div>
467
- <SimpleBox
468
- v-if="uiLoginBackgroundDark || uiLoginBackgroundLight"
469
- class="theme-dark mb-10"
470
- >
471
- <label class="text-muted">{{ t('branding.loginBackground.darkPreview') }}</label>
472
- <img
473
- class="img-preview"
474
- data-testid="branding-login-background-dark-preview"
475
- :src="uiLoginBackgroundDark ? uiLoginBackgroundDark : uiLoginBackgroundLight"
476
- >
477
- </SimpleBox>
478
602
  </div>
479
- </div>
480
-
481
- <h3 class="mt-20 mb-5 pb-5">
482
- {{ t('branding.favicon.label') }}
483
- </h3>
484
- <label class="text-label">
485
- {{ t('branding.favicon.tip', {}, true) }}
486
- </label>
487
-
488
- <div class="row mt-10 mb-20">
489
- <Checkbox
490
- v-model:value="customizeFavicon"
491
- :label="t('branding.favicon.useCustom')"
492
- :mode="mode"
493
- />
494
- </div>
495
603
 
496
- <div
497
- v-if="customizeFavicon"
498
- class="row mb-20"
499
- >
500
- <div class="col favicon-container span-12">
501
- <div class="mb-10">
502
- <FileImageSelector
503
- :byte-limit="20000"
504
- :read-as-data-url="true"
505
- class="role-secondary"
506
- :label="t('branding.favicon.upload')"
507
- :mode="mode"
508
- accept="image/jpeg,image/png,image/svg+xml"
509
- @error="setError"
510
- @update:value="updateBranding($event, 'uiFavicon')"
511
- />
512
- </div>
513
- <SimpleBox v-if="uiFavicon">
514
- <label class="text-muted">{{ t('branding.favicon.preview') }}</label>
515
- <img
516
- class="favicon-preview"
517
- data-testid="branding-favicon-preview"
518
- :src="uiFavicon"
519
- >
520
- </SimpleBox>
521
- </div>
522
- </div>
523
-
524
- <h3 class="mt-40 mb-5 pb-0">
525
- {{ t('branding.color.label') }}
526
- </h3>
527
- <label class="text-label">
528
- {{ t('branding.color.tip', {}, true) }}
529
- </label>
530
- <div class="row mt-20">
531
- <Checkbox
532
- v-model:value="customizeColor"
533
- :label="t('branding.color.useCustom')"
534
- :mode="mode"
535
- />
536
- </div>
537
- <div
538
- v-if="customizeColor"
539
- class="row mt-20 mb-20"
540
- >
541
- <ColorInput
542
- v-model:value="uiColor"
543
- component-testid="primary"
544
- />
545
- </div>
546
-
547
- <h3 class="mt-40 mb-5 pb-0">
548
- {{ t('branding.linkColor.label') }}
549
- </h3>
550
- <label class="text-label">
551
- {{ t('branding.linkColor.tip', {}, true) }}
552
- </label>
553
- <div class="row mt-20">
554
- <Checkbox
555
- v-model:value="customizeLinkColor"
556
- :label="t('branding.linkColor.useCustom')"
557
- :mode="mode"
558
- />
559
- </div>
560
- <div
561
- v-if="customizeLinkColor"
562
- class="row mt-20 mb-20"
563
- >
564
- <ColorInput
565
- v-model:value="uiLinkColor"
566
- class="col"
567
- component-testid="link"
568
- />
569
- <span class="col link-example">
570
- <a :style="customLinkColor">
571
- {{ t('branding.linkColor.example') }}
572
- </a>
573
- </span>
574
- </div>
575
604
  </div>
576
605
  <template
577
606
  v-for="(err, i) in errors"
@@ -582,10 +611,10 @@ export default {
582
611
  :label="err"
583
612
  />
584
613
  </template>
585
- <div v-if="mode === 'edit'">
614
+ <div class="action-btn" v-if="mode === 'edit'">
586
615
  <AsyncButton
587
616
  component-testid="branding-apply"
588
- class="pull-right mt-20"
617
+ class="pull-right"
589
618
  mode="apply"
590
619
  @click="save"
591
620
  />
@@ -594,6 +623,16 @@ export default {
594
623
  </template>
595
624
 
596
625
  <style scoped lang='scss'>
626
+ .action-btn {
627
+ padding: 10px 30px;
628
+ position: fixed;
629
+ bottom: 0;
630
+ left: 0;
631
+ width: 100%;
632
+ background: var(--body-bg);
633
+ border-top: 1px solid var(--nav-border);
634
+ }
635
+
597
636
  .link-example {
598
637
  display: flex;
599
638
  align-content: center;
@@ -645,4 +684,13 @@ export default {
645
684
  left: 10px;
646
685
  }
647
686
  }
687
+ h3 {
688
+ font-size: 14px;
689
+ }
690
+ .excram-list{
691
+ font-size: 14px;
692
+ line-height: 22px;
693
+ margin-bottom: 20px;
694
+ font-family: 'Microsoft YaHei';
695
+ }
648
696
  </style>