@utogether/udp-core 1.0.1 → 1.0.2

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 (239) hide show
  1. package/build/plugins.ts +13 -2
  2. package/dist/{403-JWjatlxJ.js → 403-B1rIjAAu.js} +7 -6
  3. package/dist/{404-BcdMJfPb.js → 404-mBqc2y4t.js} +14 -13
  4. package/dist/{500-bsa3F_cc.js → 500-BoI45Zdh.js} +10 -9
  5. package/dist/{AuthorityInfo-CqItgNs5.js → AuthorityInfo-B08NBIIn.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BLP1SaiH.js +100 -0
  7. package/dist/{AuthorityPanel-BaLMwMgW.js → AuthorityPanel-BeBNiwqc.js} +1 -1
  8. package/dist/{AuthorityPanel.vue_vue_type_style_index_0_lang-C_bkqLD9.js → AuthorityPanel.vue_vue_type_style_index_0_lang-CIYmnP9-.js} +6 -6
  9. package/dist/{Company-DVff9IA7.js → Company-JGGyWEWH.js} +3 -3
  10. package/dist/{CompanyPanel-CNrdq4XE.js → CompanyPanel-BQ_cCmDx.js} +16 -16
  11. package/dist/{Department-CqcpfL4i.js → Department-z2iO6hwM.js} +10 -10
  12. package/dist/{DepartmentPanel-Bvti4LGu.js → DepartmentPanel-BtQe7zwU.js} +108 -78
  13. package/dist/{DesignPanel-CjykspE1.js → DesignPanel-7mhtVWas.js} +1 -1
  14. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BK9EERdd.js → DesignPanel.vue_vue_type_style_index_0_lang-4EsHemj_.js} +24 -26
  15. package/dist/DictView-CjchV2Yk.js +109 -0
  16. package/dist/InvOrganization-Pn1O_XP0.js +74 -0
  17. package/dist/Org-BqytV_vi.js +39 -0
  18. package/dist/{Preview-Cm_7RhYU.js → Preview-CLpUUMay.js} +2 -2
  19. package/dist/{ReportDefine-CJVlQ--7.js → ReportDefine-Cz1KtEUF.js} +1 -1
  20. package/dist/{ReportDesign-B0unlrkt.js → ReportDesign-BaORYud4.js} +46 -46
  21. package/dist/{ReportQuery-BKuMCEvF.js → ReportQuery-CPCPXiXz.js} +5 -5
  22. package/dist/{ReportQueryFrom-DAngMJLU.js → ReportQueryFrom-C_AcrfkJ.js} +1 -1
  23. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CPpwmztJ.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Bm67ejay.js} +6 -5
  24. package/dist/{ReportTemplate-8YH3L8Pv.js → ReportTemplate-CFiNMz79.js} +26 -26
  25. package/dist/{Role-MxI30-0W.js → Role-B-XDoJd5.js} +6 -6
  26. package/dist/{RoleAssign-BzUY_y_y.js → RoleAssign-BolW8YVs.js} +9 -9
  27. package/dist/{RolePanel-DS_TErTn.js → RolePanel-2kfs5tw9.js} +1 -1
  28. package/dist/{RolePanel-CXdcvsR5.js → RolePanel-HilSuYns.js} +1 -1
  29. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CE4gApUY.js +132 -0
  30. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Ddl-A7Zh.js → RolePanel.vue_vue_type_script_setup_true_lang-DPzgfAyV.js} +42 -36
  31. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-DnchUgIF.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCTH4RkH.js} +20 -20
  32. package/dist/{Staff-D7tXo_Gn.js → Staff-BTk3whFC.js} +3 -3
  33. package/dist/{StaffInfo-Bk8BY8PO.js → StaffInfo-d3AuSzlA.js} +1 -1
  34. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DqKwZi5f.js → StaffInfo.vue_vue_type_script_setup_true_lang-eOL4VlfE.js} +13 -13
  35. package/dist/{StaffPanel-VtpGCTIq.js → StaffPanel-DV-D4jjz.js} +1 -1
  36. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-4sFq3CEo.js +135 -0
  37. package/dist/{SysUser-D0Q6OvD7.js → SysUser-BnjYytws.js} +2 -2
  38. package/dist/{SysUserPanel-1_vrsANQ.js → SysUserPanel-CBoyD-Qi.js} +1 -1
  39. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-PrTlTZR-.js +341 -0
  40. package/dist/{SystemMenu-9PG3vESE.js → SystemMenu-kYB_ZaUt.js} +49 -47
  41. package/dist/{UserInfo-qgXUEGwi.js → UserInfo-4dx97VBL.js} +1 -1
  42. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CN0C5rVk.js → UserInfo.vue_vue_type_style_index_0_lang-BpbC_ZDm.js} +35 -33
  43. package/dist/{childView-C7ZSA5fR.js → childView-CHPNfTEb.js} +1 -1
  44. package/dist/{childView-yV2QLwfA.js → childView-CKA_JgVZ.js} +1 -1
  45. package/dist/{childView.vue_vue_type_style_index_0_lang-DdKxPGdh.js → childView.vue_vue_type_style_index_0_lang-Bym2fQRd.js} +7 -7
  46. package/dist/childView.vue_vue_type_style_index_0_lang-W7bCtXeu.js +177 -0
  47. package/dist/{code-rule-95K1jr-u.js → code-rule-CbxuZg0-.js} +42 -41
  48. package/dist/core.es.js +19 -10
  49. package/dist/{cron-task-DGrQwOHs.js → cron-task-nTOpqQYf.js} +5 -5
  50. package/dist/flow-task-B07st2aD.js +10 -0
  51. package/dist/{frameView-7SmME93D.js → frameView-Z1tPUyCh.js} +15 -14
  52. package/dist/img/l_img.svg +1 -1
  53. package/dist/img/minicolors.png +0 -0
  54. package/dist/img/v_img.svg +1 -1
  55. package/dist/index-C3q8HoJM.js +4650 -0
  56. package/dist/{layoutView-C6WIVWGZ.js → layoutView--MGA9zUB.js} +1776 -1764
  57. package/dist/{log-in-e7D5Ss1P.js → log-in-CSYJDA6m.js} +36 -29
  58. package/dist/log-out-DiwGCg7p.js +130 -0
  59. package/dist/login-C6Y0ajDp.js +251 -0
  60. package/dist/{login-log-CvVnyGi3.js → login-log-C0V-_l3F.js} +6 -4
  61. package/dist/{lov-view-DoF5LqFQ.js → lov-view-Cmv7wZZ9.js} +9 -9
  62. package/dist/{menuInfo-CNzGQwOD.js → menuInfo-UeutJpOa.js} +1 -1
  63. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-51SYxVc_.js → menuInfo.vue_vue_type_style_index_0_lang-CWX4Mu67.js} +144 -121
  64. package/dist/pda-app-B6w99SJo.js +710 -0
  65. package/dist/redirect-BqegffKC.js +15 -0
  66. package/dist/{resource-gVFFMO9l.js → resource-BybJvUv0.js} +17 -17
  67. package/dist/{su-welcome-BN_s_RX_.js → su-welcome-C1bmxHoY.js} +124 -126
  68. package/dist/sys-config-BnmIDnCj.js +370 -0
  69. package/dist/udp-core.css +1 -9
  70. package/dist/utogether-MlnyYtNS.js +4 -0
  71. package/index.ts +19 -6
  72. package/package.json +18 -17
  73. package/src/App.vue +2 -7
  74. package/src/api/http.ts +1 -4
  75. package/src/api/index.ts +5 -3
  76. package/src/api/user.ts +2 -2
  77. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  78. package/src/components/SuScrollTree/ScrollPanel.vue +4 -9
  79. package/src/components/udp/content/index.vue +88 -0
  80. package/src/components/udp/form/form.vue +109 -0
  81. package/src/components/udp/grid/index.vue +524 -0
  82. package/src/components/udp/index.ts +5 -4
  83. package/src/components/udp/ut-stamp-badge/index.vue +271 -0
  84. package/src/components/udp/utils.ts +408 -40
  85. package/src/directives/permission/index.ts +1 -1
  86. package/src/layout/components/lay-navbar/index.vue +9 -7
  87. package/src/layout/components/lay-panel/index.vue +3 -3
  88. package/src/layout/components/lay-search/index.vue +1 -1
  89. package/src/layout/components/lay-select-org/index.vue +4 -9
  90. package/src/layout/components/lay-setting/index.vue +503 -510
  91. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  92. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  93. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  94. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -98
  95. package/src/layout/components/lay-tag/index.vue +598 -625
  96. package/src/layout/hooks/useDataThemeChange.ts +1 -1
  97. package/src/layout/hooks/useNav.ts +176 -173
  98. package/src/layout/hooks/useTag.ts +227 -233
  99. package/src/layout/layoutView.vue +215 -215
  100. package/src/layout/types.ts +93 -92
  101. package/src/main.ts +115 -109
  102. package/src/plugins/i18n/en.ts +26 -13
  103. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  104. package/src/plugins/i18n/zh.ts +363 -337
  105. package/src/plugins/vxe-table/index.ts +74 -4
  106. package/src/plugins/vxe-table/render.tsx +186 -58
  107. package/src/router/index.ts +187 -183
  108. package/src/router/modules/flow.ts +35 -0
  109. package/src/router/modules/home.ts +32 -32
  110. package/src/router/modules/remaining.ts +1 -26
  111. package/src/router/utils.ts +420 -377
  112. package/src/store/modules/app.ts +2 -4
  113. package/src/store/modules/epTheme.ts +48 -49
  114. package/src/store/modules/multiTags.ts +15 -14
  115. package/src/store/modules/permission.ts +25 -15
  116. package/src/store/modules/system.ts +1 -3
  117. package/src/style/button.scss +11 -4
  118. package/src/style/login.css +1 -1
  119. package/src/style/tailwind.css +1 -68
  120. package/src/style/vxetable.scss +103 -11
  121. package/src/utils/authority/index.ts +1 -1
  122. package/src/utils/dataFormat/index.ts +223 -223
  123. package/src/utils/index.ts +3 -1
  124. package/src/utils/lifecycle.ts +39 -20
  125. package/src/utils/propTypes.ts +1 -6
  126. package/src/utils/storage/index.ts +2 -2
  127. package/src/utils/{http → udp/http}/index.ts +27 -30
  128. package/src/utils/{http → udp/http}/types.d.ts +2 -6
  129. package/src/views/login/login-view.vue +6 -20
  130. package/src/views/organization/company/CompanyPanel.vue +2 -2
  131. package/src/views/organization/department/Department.vue +58 -58
  132. package/src/views/organization/department/DepartmentPanel.vue +303 -283
  133. package/src/views/organization/inv-org/InvOrganization.vue +23 -9
  134. package/src/views/organization/org/Org.vue +9 -5
  135. package/src/views/organization/staff/StaffInfo.vue +127 -133
  136. package/src/views/organization/staff/StaffPanel.vue +162 -145
  137. package/src/views/system/cron/cron-task.vue +2 -12
  138. package/src/views/system/menu/AuthorityPanel.vue +2 -2
  139. package/src/views/system/menu/SystemMenu.vue +14 -20
  140. package/src/views/system/menu/menuInfo.vue +39 -23
  141. package/src/views/system/role/AuthorityInfo.vue +19 -15
  142. package/src/views/system/role/Role.vue +1 -5
  143. package/src/views/system/role/RolePanel.vue +11 -2
  144. package/src/views/system/role/UserInfo.vue +11 -9
  145. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  146. package/src/views/system/role-assign/RolePanel.vue +12 -9
  147. package/src/views/system/sys/sys-config.vue +70 -21
  148. package/src/views/system/sysUser/SysUserPanel.vue +347 -278
  149. package/src/views/uapp/pda/pda-app.vue +48 -16
  150. package/src/views/udev/coderule/code-rule.vue +132 -121
  151. package/src/views/udev/dict/DictView.vue +118 -106
  152. package/src/views/udev/dict/childView.vue +183 -222
  153. package/src/views/udev/lov/childView.vue +1 -7
  154. package/src/views/ufile/aggregation/File.vue +5 -5
  155. package/src/views/ufile/file/water-mark.vue +14 -14
  156. package/src/views/uhome/components/menu-favorite.vue +314 -331
  157. package/src/views/uhome/su-welcome.vue +319 -339
  158. package/src/views/ulogin/login.vue +325 -316
  159. package/src/views/upms/interface/log-in.vue +100 -106
  160. package/src/views/upms/interface/log-out.vue +104 -107
  161. package/src/views/upms/user/login-log.vue +54 -60
  162. package/src/views/urpt/design/DesignPanel.vue +16 -35
  163. package/src/views/urpt/design/Preview.vue +1 -0
  164. package/src/views/urpt/design/ReportDesign.vue +17 -23
  165. package/src/views/urpt/static-resource/resource.vue +3 -3
  166. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  167. package/src/views/utask/flow-task.vue +18 -0
  168. package/types/global.d.ts +231 -236
  169. package/vite.config.ts +13 -2
  170. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-32L40GY2.js +0 -102
  171. package/dist/DictView-q7kR9K--.js +0 -95
  172. package/dist/InvOrganization-DI45LqZV.js +0 -260
  173. package/dist/Org-CZju_ZiR.js +0 -35
  174. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DJKu6PXz.js +0 -126
  175. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-C3Ixs12y.js +0 -111
  176. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-C5XEmxsV.js +0 -288
  177. package/dist/childView.vue_vue_type_style_index_0_lang-bkmucBUL.js +0 -187
  178. package/dist/core.umd.js +0 -173
  179. package/dist/index-OswH7SsT.js +0 -9937
  180. package/dist/log-out--RRncZhN.js +0 -120
  181. package/dist/login-BhCMeCLS.js +0 -251
  182. package/dist/pda-app-nn3llDUx.js +0 -2209
  183. package/dist/redirect-CmMplDV4.js +0 -15
  184. package/dist/sys-config-DGutV-VX.js +0 -277
  185. package/dist/utogether-wFDCI28t.js +0 -182
  186. package/src/assets/images/empty.png +0 -0
  187. package/src/assets/images/logo.png +0 -0
  188. package/src/components/ReCountTo/README.md +0 -2
  189. package/src/components/ReCountTo/index.ts +0 -18
  190. package/src/components/ReCountTo/src/normal/index.tsx +0 -165
  191. package/src/components/ReCountTo/src/normal/props.ts +0 -37
  192. package/src/components/ReCountTo/src/rebound/index.tsx +0 -67
  193. package/src/components/ReCountTo/src/rebound/props.ts +0 -14
  194. package/src/components/ReCountTo/src/rebound/rebound.css +0 -77
  195. package/src/components/ReCropper/index.ts +0 -14
  196. package/src/components/ReCropper/src/index.tsx +0 -141
  197. package/src/components/ReFlicker/index.css +0 -39
  198. package/src/components/ReFlicker/index.ts +0 -50
  199. package/src/components/ReFlop/index.ts +0 -14
  200. package/src/components/ReFlop/src/Filpper.tsx +0 -99
  201. package/src/components/ReFlop/src/filpper.css +0 -184
  202. package/src/components/ReFlop/src/index.vue +0 -126
  203. package/src/components/ReFlowChart/index.ts +0 -24
  204. package/src/components/ReFlowChart/src/Control.vue +0 -139
  205. package/src/components/ReFlowChart/src/DataDialog.vue +0 -12
  206. package/src/components/ReFlowChart/src/NodePanel.vue +0 -151
  207. package/src/components/ReFlowChart/src/adpterForTurbo.ts +0 -160
  208. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.css +0 -49
  209. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.eot +0 -0
  210. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.js +0 -61
  211. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.json +0 -58
  212. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.svg +0 -47
  213. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.ttf +0 -0
  214. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff +0 -0
  215. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff2 +0 -0
  216. package/src/components/ReFlowChart/src/config.ts +0 -62
  217. package/src/components/ReSplitPane/index.css +0 -49
  218. package/src/components/ReSplitPane/index.tsx +0 -119
  219. package/src/components/ReSplitPane/resizer.css +0 -45
  220. package/src/components/ReSplitPane/resizer.tsx +0 -30
  221. package/src/components/SuCommon/card/components/Card.vue +0 -148
  222. package/src/components/SuCommon/card/components/DialogForm.vue +0 -127
  223. package/src/components/SuCommon/card/index.vue +0 -142
  224. package/src/components/SuCommon/icon-select/index.vue +0 -241
  225. package/src/components/SuCommon/table/index.vue +0 -208
  226. package/src/components/SuCommon/utils/index.ts +0 -103
  227. package/src/components/SuCommon/utils/slot.tsx +0 -50
  228. package/src/components/udp/form-upload.vue +0 -132
  229. package/src/components/udp/modal-form.vue +0 -180
  230. package/src/utils/udp/useRender.ts +0 -420
  231. package/src/views/components/contextmenu/basic.vue +0 -74
  232. package/src/views/components/contextmenu/context-menu.vue +0 -40
  233. package/src/views/components/contextmenu/menuDynamic.vue +0 -99
  234. package/src/views/components/contextmenu/menuGroup.vue +0 -71
  235. package/src/views/components/count-to/index.vue +0 -43
  236. package/src/views/components/cropping/index.vue +0 -59
  237. package/src/views/components/cropping/picture.jpeg +0 -0
  238. package/src/views/components/split-pane/index.vue +0 -82
  239. package/src/views/components/video/index.vue +0 -57
@@ -1,510 +1,503 @@
1
- <script setup lang="ts">
2
- import { reactive, ref, unref, watch, computed, nextTick, onUnmounted, onBeforeMount } from 'vue';
3
- import { templateRef } from '@vueuse/core';
4
- import { useI18n } from 'vue-i18n';
5
- import { useDark, useGlobal, useDebounce } from '@utogether/utils';
6
- import panel from '../lay-panel/index.vue';
7
- import { emitter } from '../../../utils/mitt';
8
- import { useAppStoreHook } from '../../../store/modules/app';
9
- import { useMultiTagsStoreHook } from '../../../store/modules/multiTags';
10
- import { useDataThemeChange } from '../../hooks/useDataThemeChange';
11
- import { useNav } from '../../hooks/useNav';
12
- import { useRenderIcon } from '../../../components/ReIcon/src/hooks';
13
- import dayIcon from '../../../assets/svg/day.svg?component';
14
- import darkIcon from '../../../assets/svg/dark.svg?component';
15
- import systemIcon from '../../../assets/svg/system.svg?component';
16
-
17
- interface IThemeOption {
18
- label: string;
19
- icon: any;
20
- theme: string;
21
- value: number;
22
- iconAttrs: { fill: string };
23
- }
24
-
25
- const { device } = useNav();
26
- const { t } = useI18n();
27
- const { isDark } = useDark();
28
- const { $storage } = useGlobal();
29
-
30
- const mixRef = templateRef<HTMLElement | null>('mixRef', null);
31
- const verticalRef = templateRef<HTMLElement | null>('verticalRef', null);
32
- const horizontalRef = templateRef<HTMLElement | null>('horizontalRef', null);
33
-
34
- const {
35
- dataTheme,
36
- overallStyle,
37
- layoutTheme,
38
- themeColors,
39
- toggleClass,
40
- dataThemeChange,
41
- setLayoutThemeColor
42
- } = useDataThemeChange();
43
-
44
- /* body添加layout属性,作用于src/style/sidebar.scss */
45
- if (unref(layoutTheme)) {
46
- const layout = unref(layoutTheme).layout;
47
- const theme = unref(layoutTheme).theme;
48
- document.documentElement.setAttribute('data-theme', theme);
49
- setLayoutModel(layout);
50
- }
51
-
52
- /** 默认灵动模式 */
53
- const markValue = ref($storage.configure?.showModel ?? 'smart');
54
-
55
- const logoVal = ref($storage.configure?.showLogo ?? true);
56
-
57
- const settings = reactive({
58
- greyVal: $storage.configure.grey,
59
- weakVal: $storage.configure.weak,
60
- tabsVal: $storage.configure.hideTabs,
61
- showLogo: $storage.configure.showLogo,
62
- showModel: $storage.configure.showModel,
63
- multiTagsCache: $storage.configure.multiTagsCache
64
- });
65
-
66
- const getThemeColorStyle = computed(() => {
67
- return color => {
68
- return { background: color };
69
- };
70
- });
71
-
72
- /** 当网页整体为暗色风格时不显示亮白色主题配色切换选项 */
73
- const showThemeColors = computed(() => {
74
- return themeColor => {
75
- return themeColor === 'light' && isDark.value ? false : true;
76
- };
77
- });
78
-
79
- function storageConfigureChange<T>(key: string, val: T): void {
80
- const storageConfigure = $storage.configure;
81
- storageConfigure[key] = val;
82
- $storage.configure = storageConfigure;
83
- }
84
-
85
- /** 灰色模式设置 */
86
- const greyChange = (value): void => {
87
- const htmlEl = document.querySelector('html');
88
- toggleClass(settings.greyVal, 'html-grey', htmlEl);
89
- storageConfigureChange('grey', value);
90
- };
91
-
92
- /** 色弱模式设置 */
93
- const weekChange = (value): void => {
94
- const htmlEl = document.querySelector('html');
95
- toggleClass(settings.weakVal, 'html-weakness', htmlEl);
96
- storageConfigureChange('weak', value);
97
- };
98
-
99
- /** 隐藏标签页设置 */
100
- const tagsChange = () => {
101
- const showVal = settings.tabsVal;
102
- storageConfigureChange('hideTabs', showVal);
103
- emitter.emit('tagViewsChange', showVal as unknown as string);
104
- };
105
-
106
- /** 标签页持久化设置 */
107
- const multiTagsCacheChange = () => {
108
- const multiTagsCache = settings.multiTagsCache;
109
- storageConfigureChange('multiTagsCache', multiTagsCache);
110
- useMultiTagsStoreHook().multiTagsCacheChange(multiTagsCache);
111
- };
112
-
113
- function onChange(value) {
114
- markValue.value = value;
115
- storageConfigureChange('showModel', value);
116
- emitter.emit('tagViewsShowModel', value);
117
- }
118
- /** 主题切换 */
119
- function onThemeChange(theme) {
120
- // dataTheme.value = !dataTheme.value;
121
- // dataThemeChange();
122
- theme === 1 && theme !== 2 ? (dataTheme.value = true) : (dataTheme.value = false);
123
- overallStyle.value = themeOptions.value[theme].theme;
124
- dataThemeChange(overallStyle.value);
125
- theme === 2 && watchSystemThemeChange();
126
- }
127
- /** 侧边栏Logo */
128
- function logoChange() {
129
- unref(logoVal) ? storageConfigureChange('showLogo', true) : storageConfigureChange('showLogo', false);
130
- emitter.emit('logoChange', unref(logoVal));
131
- }
132
-
133
- function setFalse(Doms): any {
134
- Doms.forEach(v => {
135
- toggleClass(false, 'is-select', unref(v));
136
- });
137
- }
138
-
139
- /** 主题色 激活选择项 */
140
- const getThemeColor = computed(() => {
141
- return current => {
142
- if (current === layoutTheme.value.theme && layoutTheme.value.theme !== 'light') {
143
- return '#fff';
144
- } else if (current === layoutTheme.value.theme && layoutTheme.value.theme === 'light') {
145
- return '#1d2b45';
146
- } else {
147
- return 'transparent';
148
- }
149
- };
150
- });
151
-
152
- const themeOptions = computed<IThemeOption[]>(() => {
153
- return [
154
- {
155
- label: t('message.udp.light'),
156
- icon: dayIcon,
157
- theme: 'light',
158
- value: 0,
159
- iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
160
- },
161
- {
162
- label: t('message.udp.dark'),
163
- icon: darkIcon,
164
- theme: 'dark',
165
- value: 1,
166
- iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
167
- },
168
- {
169
- label: '自动',
170
- icon: systemIcon,
171
- theme: 'system',
172
- value: 2,
173
- iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
174
- }
175
- ];
176
- });
177
-
178
- const markOptions = [
179
- { label: t('message.udp.smart'), value: 'smart' },
180
- { label: t('message.udp.card'), value: 'card' },
181
- { label: '丝滑', value: 'chrome' }
182
- ];
183
-
184
- /** 设置导航模式 */
185
- function setLayoutModel(layout: string) {
186
- layoutTheme.value.layout = layout;
187
- window.document.body.setAttribute('layout', layout);
188
- window.document.body.setAttribute('layoutType', window.top === window.self ? 'normal' : 'iframe');
189
- $storage.layout = {
190
- layout,
191
- theme: layoutTheme.value.theme,
192
- darkMode: $storage.layout?.darkMode,
193
- sidebarStatus: $storage.layout?.sidebarStatus,
194
- epThemeColor: $storage.layout?.epThemeColor,
195
- themeColor: layoutTheme.value.theme,
196
- overallStyle: $storage.layout?.overallStyle
197
- };
198
- useAppStoreHook().setLayout(layout);
199
- }
200
-
201
- watch($storage, ({ layout }) => {
202
- switch (layout['layout']) {
203
- case 'vertical':
204
- toggleClass(true, 'is-select', unref(verticalRef));
205
- useDebounce(setFalse([horizontalRef]), 50);
206
- useDebounce(setFalse([mixRef]), 50);
207
- break;
208
- case 'horizontal':
209
- toggleClass(true, 'is-select', unref(horizontalRef));
210
- useDebounce(setFalse([verticalRef]), 50);
211
- useDebounce(setFalse([mixRef]), 50);
212
- break;
213
- case 'mix':
214
- toggleClass(true, 'is-select', unref(mixRef));
215
- useDebounce(setFalse([verticalRef]), 50);
216
- useDebounce(setFalse([horizontalRef]), 50);
217
- break;
218
- }
219
- });
220
-
221
- const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
222
-
223
- /** 根据操作系统主题设置平台整体风格 */
224
- function updateTheme() {
225
- if (overallStyle.value !== 'system') return;
226
- if (mediaQueryList.matches) {
227
- dataTheme.value = true;
228
- } else {
229
- dataTheme.value = false;
230
- }
231
- dataThemeChange(overallStyle.value);
232
- }
233
-
234
- function removeMatchMedia() {
235
- mediaQueryList.removeEventListener('change', updateTheme);
236
- }
237
-
238
- /** 监听操作系统主题改变 */
239
- function watchSystemThemeChange() {
240
- updateTheme();
241
- removeMatchMedia();
242
- mediaQueryList.addEventListener('change', updateTheme);
243
- }
244
-
245
- onBeforeMount(() => {
246
- /* 初始化项目配置 */
247
- nextTick(() => {
248
- watchSystemThemeChange();
249
- settings.greyVal && document.querySelector('html')?.classList.add('html-grey');
250
- settings.weakVal && document.querySelector('html')?.classList.add('html-weakness');
251
- settings.tabsVal && tagsChange();
252
- });
253
- });
254
-
255
- onUnmounted(() => removeMatchMedia);
256
- </script>
257
- <script lang="ts">
258
- export default { name: 'SettingPanel' };
259
- </script>
260
- <template>
261
- <panel>
262
- <div class="p-6">
263
- <p class="mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.pageStyle') }}</p>
264
- <el-segmented
265
- :model-value="overallStyle === 'system' ? 2 : dataTheme ? 1 : 0"
266
- :options="themeOptions"
267
- @change="onThemeChange"
268
- >
269
- <template #default="{ item }">
270
- <div class="flex items-center gap-2 p-2">
271
- <component :is="useRenderIcon(item.icon)" />
272
- <span class="pl-1">{{ item.label }}</span>
273
- </div>
274
- </template>
275
- </el-segmented>
276
-
277
- <p class="mt-5 mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.theme') }}</p>
278
- <ul class="theme-color">
279
- <li
280
- v-for="(item, index) in themeColors"
281
- v-show="showThemeColors(item.themeColor)"
282
- :key="index"
283
- :style="getThemeColorStyle(item.color)"
284
- @click="setLayoutThemeColor(item.themeColor)"
285
- >
286
- <el-icon style="margin: 0.1em 0.1em 0 0" :size="17" :color="getThemeColor(item.themeColor)">
287
- <IconifyIconOffline icon="ri:check-line" />
288
- </el-icon>
289
- </li>
290
- </ul>
291
-
292
- <p class="mt-5 mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.navigationMode') }}</p>
293
- <ul class="udp-theme">
294
- <li
295
- ref="verticalRef"
296
- v-tippy="{
297
- content: '左侧菜单',
298
- zIndex: 41000
299
- }"
300
- :class="layoutTheme.layout === 'vertical' ? 'is-select' : ''"
301
- @click="setLayoutModel('vertical')"
302
- >
303
- <div />
304
- <div />
305
- </li>
306
- <li
307
- v-if="device !== 'mobile'"
308
- ref="horizontalRef"
309
- v-tippy="{
310
- content: '顶部菜单',
311
- zIndex: 41000
312
- }"
313
- :class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''"
314
- @click="setLayoutModel('horizontal')"
315
- >
316
- <div />
317
- <div />
318
- </li>
319
- <li
320
- v-if="device !== 'mobile'"
321
- ref="mixRef"
322
- v-tippy="{
323
- content: '混合菜单',
324
- zIndex: 41000
325
- }"
326
- :class="layoutTheme.layout === 'mix' ? 'is-select' : ''"
327
- @click="setLayoutModel('mix')"
328
- >
329
- <div />
330
- <div />
331
- </li>
332
- </ul>
333
-
334
- <p class="mt-5 mb-3 text-base font-medium dark:text-white">{{ $t('message.udp.tagStyle') }}</p>
335
- <el-segmented :model-value="markValue" :options="markOptions" @change="onChange" />
336
-
337
- <p class="mt-5 mb-1 text-base font-medium dark:text-white">界面显示</p>
338
- <ul class="setting">
339
- <li>
340
- <span class="dark:text-white">灰色模式</span>
341
- <el-switch
342
- v-model="settings.greyVal"
343
- inline-prompt
344
- active-text="开"
345
- inactive-text=""
346
- @change="greyChange"
347
- />
348
- </li>
349
- <li>
350
- <span class="dark:text-white">色弱模式</span>
351
- <el-switch
352
- v-model="settings.weakVal"
353
- inline-prompt
354
- active-text="开"
355
- inactive-text=""
356
- @change="weekChange"
357
- />
358
- </li>
359
- <li>
360
- <span class="dark:text-white">隐藏标签页</span>
361
- <el-switch
362
- v-model="settings.tabsVal"
363
- inline-prompt
364
- active-text="开"
365
- inactive-text=""
366
- @change="tagsChange"
367
- />
368
- </li>
369
- <li>
370
- <span class="dark:text-white">Logo</span>
371
- <el-switch
372
- v-model="logoVal"
373
- inline-prompt
374
- :active-value="true"
375
- :inactive-value="false"
376
- active-text="开"
377
- inactive-text=""
378
- @change="logoChange"
379
- />
380
- </li>
381
- <li>
382
- <span class="dark:text-white">页签持久化</span>
383
- <el-switch
384
- v-model="settings.multiTagsCache"
385
- inline-prompt
386
- active-text="开"
387
- inactive-text="关"
388
- @change="multiTagsCacheChange"
389
- />
390
- </li>
391
- </ul>
392
- </div>
393
- </panel>
394
- </template>
395
-
396
- <style lang="scss" scoped>
397
- ::v-deep(.el-divider__text) {
398
- font-size: 16px;
399
- font-weight: 700;
400
- }
401
-
402
- ::v-deep(.el-switch__core) {
403
- --el-switch-off-color: var(--udp-switch-off-color);
404
-
405
- min-width: 36px;
406
- height: 18px;
407
- }
408
-
409
- ::v-deep(.el-switch__core .el-switch__action) {
410
- height: 14px;
411
- }
412
-
413
- .theme-color {
414
- height: 20px;
415
-
416
- li {
417
- float: left;
418
- height: 20px;
419
- margin-right: 8px;
420
- cursor: pointer;
421
- border-radius: 4px;
422
-
423
- &:nth-child(2) {
424
- border: 1px solid #ddd;
425
- }
426
- }
427
- }
428
-
429
- .udp-theme {
430
- display: flex;
431
- gap: 12px;
432
-
433
- li {
434
- position: relative;
435
- width: 46px;
436
- height: 36px;
437
- overflow: hidden;
438
- cursor: pointer;
439
- background: #f0f2f5;
440
- border-radius: 4px;
441
- box-shadow: 0 1px 2.5px 0 rgb(0 0 0 / 18%);
442
-
443
- &:nth-child(1) {
444
- div {
445
- &:nth-child(1) {
446
- width: 30%;
447
- height: 100%;
448
- background: #1b2a47;
449
- }
450
-
451
- &:nth-child(2) {
452
- position: absolute;
453
- top: 0;
454
- right: 0;
455
- width: 70%;
456
- height: 30%;
457
- background: #fff;
458
- box-shadow: 0 0 1px #888;
459
- }
460
- }
461
- }
462
-
463
- &:nth-child(2) {
464
- div {
465
- &:nth-child(1) {
466
- width: 100%;
467
- height: 30%;
468
- background: #1b2a47;
469
- box-shadow: 0 0 1px #888;
470
- }
471
- }
472
- }
473
-
474
- &:nth-child(3) {
475
- div {
476
- &:nth-child(1) {
477
- width: 100%;
478
- height: 30%;
479
- background: #1b2a47;
480
- box-shadow: 0 0 1px #888;
481
- }
482
-
483
- &:nth-child(2) {
484
- position: absolute;
485
- bottom: 0;
486
- left: 0;
487
- width: 30%;
488
- height: 70%;
489
- background: #fff;
490
- box-shadow: 0 0 1px #888;
491
- }
492
- }
493
- }
494
- }
495
- }
496
-
497
- .is-select {
498
- border: 2px solid var(--el-color-primary);
499
- }
500
-
501
- .setting {
502
- li {
503
- display: flex;
504
- align-items: center;
505
- justify-content: space-between;
506
- padding: 4px 0;
507
- font-size: 14px;
508
- }
509
- }
510
- </style>
1
+ <script setup lang="ts">
2
+ import { reactive, ref, unref, watch, computed, nextTick, onUnmounted, onBeforeMount } from 'vue';
3
+ import { templateRef } from '@vueuse/core';
4
+ import { useI18n } from 'vue-i18n';
5
+ import { useDark, useGlobal, useDebounce } from '@utogether/utils';
6
+ import panel from '../lay-panel/index.vue';
7
+ import { emitter } from '../../../utils/mitt';
8
+ import { useAppStoreHook } from '../../../store/modules/app';
9
+ import { useMultiTagsStoreHook } from '../../../store/modules/multiTags';
10
+ import { useDataThemeChange } from '../../hooks/useDataThemeChange';
11
+ import { useNav } from '../../hooks/useNav';
12
+ import { useRenderIcon } from '../../../components/ReIcon/src/hooks';
13
+ import dayIcon from '../../../assets/svg/day.svg?component';
14
+ import darkIcon from '../../../assets/svg/dark.svg?component';
15
+ import systemIcon from '../../../assets/svg/system.svg?component';
16
+
17
+ interface IThemeOption {
18
+ label: string;
19
+ icon: any;
20
+ theme: string;
21
+ value: number;
22
+ iconAttrs: { fill: string };
23
+ }
24
+
25
+ const { device } = useNav();
26
+ const { t } = useI18n();
27
+ const { isDark } = useDark();
28
+ const { $storage } = useGlobal();
29
+
30
+ const mixRef = templateRef<HTMLElement | null>('mixRef', null);
31
+ const verticalRef = templateRef<HTMLElement | null>('verticalRef', null);
32
+ const horizontalRef = templateRef<HTMLElement | null>('horizontalRef', null);
33
+
34
+ const { dataTheme, overallStyle, layoutTheme, themeColors, toggleClass, dataThemeChange, setLayoutThemeColor } =
35
+ useDataThemeChange();
36
+
37
+ /* body添加layout属性,作用于src/style/sidebar.scss */
38
+ if (unref(layoutTheme)) {
39
+ const layout = unref(layoutTheme).layout;
40
+ const theme = unref(layoutTheme).theme;
41
+ document.documentElement.setAttribute('data-theme', theme);
42
+ setLayoutModel(layout);
43
+ }
44
+
45
+ /** 默认灵动模式 */
46
+ const markValue = ref($storage.configure?.showModel ?? 'smart');
47
+
48
+ const logoVal = ref($storage.configure?.showLogo ?? true);
49
+
50
+ const settings = reactive({
51
+ greyVal: $storage.configure.grey,
52
+ weakVal: $storage.configure.weak,
53
+ tabsVal: $storage.configure.hideTabs,
54
+ showLogo: $storage.configure.showLogo,
55
+ showModel: $storage.configure.showModel,
56
+ multiTagsCache: $storage.configure.multiTagsCache
57
+ });
58
+
59
+ const getThemeColorStyle = computed(() => {
60
+ return color => {
61
+ return { background: color };
62
+ };
63
+ });
64
+
65
+ /** 当网页整体为暗色风格时不显示亮白色主题配色切换选项 */
66
+ const showThemeColors = computed(() => {
67
+ return themeColor => {
68
+ return themeColor === 'light' && isDark.value ? false : true;
69
+ };
70
+ });
71
+
72
+ function storageConfigureChange<T>(key: string, val: T): void {
73
+ const storageConfigure = $storage.configure;
74
+ storageConfigure[key] = val;
75
+ $storage.configure = storageConfigure;
76
+ }
77
+
78
+ /** 灰色模式设置 */
79
+ const greyChange = (value): void => {
80
+ const htmlEl = document.querySelector('html');
81
+ toggleClass(settings.greyVal, 'html-grey', htmlEl);
82
+ storageConfigureChange('grey', value);
83
+ };
84
+
85
+ /** 色弱模式设置 */
86
+ const weekChange = (value): void => {
87
+ const htmlEl = document.querySelector('html');
88
+ toggleClass(settings.weakVal, 'html-weakness', htmlEl);
89
+ storageConfigureChange('weak', value);
90
+ };
91
+
92
+ /** 隐藏标签页设置 */
93
+ const tagsChange = () => {
94
+ const showVal = settings.tabsVal;
95
+ storageConfigureChange('hideTabs', showVal);
96
+ emitter.emit('tagViewsChange', showVal as unknown as string);
97
+ };
98
+
99
+ /** 标签页持久化设置 */
100
+ const multiTagsCacheChange = () => {
101
+ const multiTagsCache = settings.multiTagsCache;
102
+ storageConfigureChange('multiTagsCache', multiTagsCache);
103
+ useMultiTagsStoreHook().multiTagsCacheChange(multiTagsCache);
104
+ };
105
+
106
+ function onChange(value) {
107
+ markValue.value = value;
108
+ storageConfigureChange('showModel', value);
109
+ emitter.emit('tagViewsShowModel', value);
110
+ }
111
+ /** 主题切换 */
112
+ function onThemeChange(theme) {
113
+ // dataTheme.value = !dataTheme.value;
114
+ // dataThemeChange();
115
+ theme === 1 && theme !== 2 ? (dataTheme.value = true) : (dataTheme.value = false);
116
+ overallStyle.value = themeOptions.value[theme].theme;
117
+ dataThemeChange(overallStyle.value);
118
+ theme === 2 && watchSystemThemeChange();
119
+ }
120
+ /** 侧边栏Logo */
121
+ function logoChange() {
122
+ unref(logoVal) ? storageConfigureChange('showLogo', true) : storageConfigureChange('showLogo', false);
123
+ emitter.emit('logoChange', unref(logoVal));
124
+ }
125
+
126
+ function setFalse(Doms): any {
127
+ Doms.forEach(v => {
128
+ toggleClass(false, 'is-select', unref(v));
129
+ });
130
+ }
131
+
132
+ /** 主题色 激活选择项 */
133
+ const getThemeColor = computed(() => {
134
+ return current => {
135
+ if (current === layoutTheme.value.theme && layoutTheme.value.theme !== 'light') {
136
+ return '#fff';
137
+ } else if (current === layoutTheme.value.theme && layoutTheme.value.theme === 'light') {
138
+ return '#1d2b45';
139
+ } else {
140
+ return 'transparent';
141
+ }
142
+ };
143
+ });
144
+
145
+ const themeOptions = computed<IThemeOption[]>(() => {
146
+ return [
147
+ {
148
+ label: t('message.udp.light'),
149
+ icon: dayIcon,
150
+ theme: 'light',
151
+ value: 0,
152
+ iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
153
+ },
154
+ {
155
+ label: t('message.udp.dark'),
156
+ icon: darkIcon,
157
+ theme: 'dark',
158
+ value: 1,
159
+ iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
160
+ },
161
+ {
162
+ label: '自动',
163
+ icon: systemIcon,
164
+ theme: 'system',
165
+ value: 2,
166
+ iconAttrs: { fill: isDark.value ? '#fff' : '#000' }
167
+ }
168
+ ];
169
+ });
170
+
171
+ const markOptions = [
172
+ { label: t('message.udp.smart'), value: 'smart' },
173
+ { label: t('message.udp.card'), value: 'card' },
174
+ { label: '丝滑', value: 'chrome' }
175
+ ];
176
+
177
+ /** 设置菜单布局 */
178
+ function setLayoutModel(layout: string) {
179
+ layoutTheme.value.layout = layout;
180
+ window.document.body.setAttribute('layout', layout);
181
+ window.document.body.setAttribute('layoutType', window.top === window.self ? 'normal' : 'iframe');
182
+ $storage.layout = {
183
+ layout,
184
+ theme: layoutTheme.value.theme,
185
+ darkMode: $storage.layout?.darkMode,
186
+ sidebarStatus: $storage.layout?.sidebarStatus,
187
+ epThemeColor: $storage.layout?.epThemeColor,
188
+ themeColor: layoutTheme.value.theme,
189
+ overallStyle: $storage.layout?.overallStyle
190
+ };
191
+ useAppStoreHook().setLayout(layout);
192
+ }
193
+
194
+ watch($storage, ({ layout }) => {
195
+ switch (layout['layout']) {
196
+ case 'vertical':
197
+ toggleClass(true, 'is-select', unref(verticalRef));
198
+ useDebounce(setFalse([horizontalRef]), 50);
199
+ useDebounce(setFalse([mixRef]), 50);
200
+ break;
201
+ case 'horizontal':
202
+ toggleClass(true, 'is-select', unref(horizontalRef));
203
+ useDebounce(setFalse([verticalRef]), 50);
204
+ useDebounce(setFalse([mixRef]), 50);
205
+ break;
206
+ case 'mix':
207
+ toggleClass(true, 'is-select', unref(mixRef));
208
+ useDebounce(setFalse([verticalRef]), 50);
209
+ useDebounce(setFalse([horizontalRef]), 50);
210
+ break;
211
+ }
212
+ });
213
+
214
+ const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
215
+
216
+ /** 根据操作系统主题设置平台主题模式 */
217
+ function updateTheme() {
218
+ if (overallStyle.value !== 'system') return;
219
+ if (mediaQueryList.matches) {
220
+ dataTheme.value = true;
221
+ } else {
222
+ dataTheme.value = false;
223
+ }
224
+ dataThemeChange(overallStyle.value);
225
+ }
226
+
227
+ function removeMatchMedia() {
228
+ mediaQueryList.removeEventListener('change', updateTheme);
229
+ }
230
+
231
+ /** 监听操作系统主题改变 */
232
+ function watchSystemThemeChange() {
233
+ updateTheme();
234
+ removeMatchMedia();
235
+ mediaQueryList.addEventListener('change', updateTheme);
236
+ }
237
+
238
+ onBeforeMount(() => {
239
+ /* 初始化项目配置 */
240
+ nextTick(() => {
241
+ watchSystemThemeChange();
242
+ settings.greyVal && document.querySelector('html')?.classList.add('html-grey');
243
+ settings.weakVal && document.querySelector('html')?.classList.add('html-weakness');
244
+ settings.tabsVal && tagsChange();
245
+ });
246
+ });
247
+
248
+ onUnmounted(() => removeMatchMedia);
249
+ </script>
250
+ <script lang="ts">
251
+ export default { name: 'SettingPanel' };
252
+ </script>
253
+ <template>
254
+ <panel>
255
+ <div class="p-6">
256
+ <p class="mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.pageStyle') }}</p>
257
+ <el-segmented
258
+ :model-value="overallStyle === 'system' ? 2 : dataTheme ? 1 : 0"
259
+ :options="themeOptions"
260
+ @change="onThemeChange"
261
+ >
262
+ <template #default="{ item }">
263
+ <div class="flex items-center gap-2 p-2">
264
+ <component :is="useRenderIcon(item.icon)" />
265
+ <span class="pl-1">{{ item.label }}</span>
266
+ </div>
267
+ </template>
268
+ </el-segmented>
269
+
270
+ <p class="mt-5 mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.theme') }}</p>
271
+ <ul class="theme-color">
272
+ <li
273
+ v-for="(item, index) in themeColors"
274
+ v-show="showThemeColors(item.themeColor)"
275
+ :key="index"
276
+ :style="getThemeColorStyle(item.color)"
277
+ @click="setLayoutThemeColor(item.themeColor)"
278
+ >
279
+ <el-icon style="margin: 0.1em 0.1em 0 0" :size="17" :color="getThemeColor(item.themeColor)">
280
+ <IconifyIconOffline icon="ri:check-line" />
281
+ </el-icon>
282
+ </li>
283
+ </ul>
284
+
285
+ <p class="mt-5 mb-3 text-sm font-medium dark:text-white">{{ $t('message.udp.navigationMode') }}</p>
286
+ <ul class="udp-theme">
287
+ <li
288
+ ref="verticalRef"
289
+ v-tippy="{
290
+ content: '左侧菜单',
291
+ zIndex: 41000
292
+ }"
293
+ :class="layoutTheme.layout === 'vertical' ? 'is-select' : ''"
294
+ @click="setLayoutModel('vertical')"
295
+ >
296
+ <div />
297
+ <div />
298
+ </li>
299
+ <li
300
+ v-if="device !== 'mobile'"
301
+ ref="horizontalRef"
302
+ v-tippy="{
303
+ content: '顶部菜单',
304
+ zIndex: 41000
305
+ }"
306
+ :class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''"
307
+ @click="setLayoutModel('horizontal')"
308
+ >
309
+ <div />
310
+ <div />
311
+ </li>
312
+ <li
313
+ v-if="device !== 'mobile'"
314
+ ref="mixRef"
315
+ v-tippy="{
316
+ content: '混合菜单',
317
+ zIndex: 41000
318
+ }"
319
+ :class="layoutTheme.layout === 'mix' ? 'is-select' : ''"
320
+ @click="setLayoutModel('mix')"
321
+ >
322
+ <div />
323
+ <div />
324
+ </li>
325
+ </ul>
326
+
327
+ <p class="mt-5 mb-3 text-base font-medium dark:text-white">{{ $t('message.udp.tagStyle') }}</p>
328
+ <el-segmented :model-value="markValue" :options="markOptions" @change="onChange" />
329
+
330
+ <p class="mt-5 mb-1 text-base font-medium dark:text-white">界面显示</p>
331
+ <ul class="setting">
332
+ <li>
333
+ <span class="dark:text-white">灰色模式</span>
334
+ <el-switch
335
+ v-model="settings.greyVal"
336
+ inline-prompt
337
+ active-text="开"
338
+ inactive-text=""
339
+ @change="greyChange"
340
+ />
341
+ </li>
342
+ <li>
343
+ <span class="dark:text-white">色弱模式</span>
344
+ <el-switch
345
+ v-model="settings.weakVal"
346
+ inline-prompt
347
+ active-text="开"
348
+ inactive-text="关"
349
+ @change="weekChange"
350
+ />
351
+ </li>
352
+ <li>
353
+ <span class="dark:text-white">隐藏标签页</span>
354
+ <el-switch
355
+ v-model="settings.tabsVal"
356
+ inline-prompt
357
+ active-text="开"
358
+ inactive-text="关"
359
+ @change="tagsChange"
360
+ />
361
+ </li>
362
+ <li>
363
+ <span class="dark:text-white">Logo</span>
364
+ <el-switch
365
+ v-model="logoVal"
366
+ inline-prompt
367
+ :active-value="true"
368
+ :inactive-value="false"
369
+ active-text="开"
370
+ inactive-text=""
371
+ @change="logoChange"
372
+ />
373
+ </li>
374
+ <li>
375
+ <span class="dark:text-white">页签持久化</span>
376
+ <el-switch
377
+ v-model="settings.multiTagsCache"
378
+ inline-prompt
379
+ active-text="开"
380
+ inactive-text="关"
381
+ @change="multiTagsCacheChange"
382
+ />
383
+ </li>
384
+ </ul>
385
+ </div>
386
+ </panel>
387
+ </template>
388
+
389
+ <style lang="scss" scoped>
390
+ ::v-deep(.el-divider__text) {
391
+ font-size: 16px;
392
+ font-weight: 700;
393
+ }
394
+
395
+ ::v-deep(.el-switch__core) {
396
+ --el-switch-off-color: var(--udp-switch-off-color);
397
+
398
+ min-width: 36px;
399
+ height: 18px;
400
+ }
401
+
402
+ ::v-deep(.el-switch__core .el-switch__action) {
403
+ height: 14px;
404
+ }
405
+
406
+ .theme-color {
407
+ height: 20px;
408
+
409
+ li {
410
+ float: left;
411
+ height: 20px;
412
+ margin-right: 8px;
413
+ cursor: pointer;
414
+ border-radius: 4px;
415
+
416
+ &:nth-child(2) {
417
+ border: 1px solid #ddd;
418
+ }
419
+ }
420
+ }
421
+
422
+ .udp-theme {
423
+ display: flex;
424
+ gap: 12px;
425
+
426
+ li {
427
+ position: relative;
428
+ width: 46px;
429
+ height: 36px;
430
+ overflow: hidden;
431
+ cursor: pointer;
432
+ background: #f0f2f5;
433
+ border-radius: 4px;
434
+ box-shadow: 0 1px 2.5px 0 rgb(0 0 0 / 18%);
435
+
436
+ &:nth-child(1) {
437
+ div {
438
+ &:nth-child(1) {
439
+ width: 30%;
440
+ height: 100%;
441
+ background: #1b2a47;
442
+ }
443
+
444
+ &:nth-child(2) {
445
+ position: absolute;
446
+ top: 0;
447
+ right: 0;
448
+ width: 70%;
449
+ height: 30%;
450
+ background: #fff;
451
+ box-shadow: 0 0 1px #888;
452
+ }
453
+ }
454
+ }
455
+
456
+ &:nth-child(2) {
457
+ div {
458
+ &:nth-child(1) {
459
+ width: 100%;
460
+ height: 30%;
461
+ background: #1b2a47;
462
+ box-shadow: 0 0 1px #888;
463
+ }
464
+ }
465
+ }
466
+
467
+ &:nth-child(3) {
468
+ div {
469
+ &:nth-child(1) {
470
+ width: 100%;
471
+ height: 30%;
472
+ background: #1b2a47;
473
+ box-shadow: 0 0 1px #888;
474
+ }
475
+
476
+ &:nth-child(2) {
477
+ position: absolute;
478
+ bottom: 0;
479
+ left: 0;
480
+ width: 30%;
481
+ height: 70%;
482
+ background: #fff;
483
+ box-shadow: 0 0 1px #888;
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+
490
+ .is-select {
491
+ border: 2px solid var(--el-color-primary);
492
+ }
493
+
494
+ .setting {
495
+ li {
496
+ display: flex;
497
+ align-items: center;
498
+ justify-content: space-between;
499
+ padding: 4px 0;
500
+ font-size: 14px;
501
+ }
502
+ }
503
+ </style>