xto-fronted 0.6.3 → 0.8.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.
- package/dist/{index-DydABgae.js → index-D73_-C9m.js} +13 -13
- package/dist/index-DBjV4kzh.js +249 -0
- package/dist/{index-IOKG7Gwo.js → index-DJ1oHe08.js} +973 -918
- package/dist/{index-BKO6Hzba.js → index-D_TGEwDg.js} +192 -140
- package/dist/{index-BZSZ3bx2.js → index-DauAWAHG.js} +28 -28
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +9 -9
- package/src/App.vue +4 -4
- package/src/assets/styles/_dark.scss +176 -176
- package/src/assets/styles/_reset.scss +8 -8
- package/src/assets/styles/_root.scss +131 -125
- package/src/assets/styles/_variables.scss +17 -17
- package/src/assets/styles/index.scss +39 -39
- package/src/components/Layout/Footer.vue +1 -1
- package/src/components/Layout/Header.vue +59 -60
- package/src/components/Layout/MixTopMenu.vue +42 -43
- package/src/components/Layout/Sidebar.vue +8 -8
- package/src/components/Layout/SidebarMenuItem.vue +2 -2
- package/src/components/Layout/Tabs.vue +6 -6
- package/src/components/Layout/TopMenu.vue +42 -43
- package/src/components/Layout/index.vue +4 -4
- package/src/stores/app.ts +26 -2
- package/src/style.scss +2 -2
- package/src/views/dashboard/index.vue +125 -104
- package/src/views/error/403.vue +13 -13
- package/src/views/error/404.vue +14 -14
- package/src/views/login/index.vue +21 -54
- package/src/views/system/menu/index.vue +30 -30
- package/src/views/system/role/index.vue +20 -20
- package/src/views/system/user/index.vue +23 -23
- package/vite.config.ts +4 -1
- package/dist/index-BXHwCe22.js +0 -189
|
@@ -105,9 +105,9 @@ watch(displayMenuList, (newList, oldList) => {
|
|
|
105
105
|
}, { immediate: false })
|
|
106
106
|
|
|
107
107
|
// 菜单主题相关(浅色模式走 CSS 变量,深色模式保留深底硬编码以配合暗色覆盖)
|
|
108
|
-
const menuBgColor = computed(() => appStore.isDark ? '#
|
|
109
|
-
const menuTextColor = computed(() => appStore.isDark ? '#
|
|
110
|
-
const menuActiveTextColor = computed(() => appStore.isDark ? '#
|
|
108
|
+
const menuBgColor = computed(() => appStore.isDark ? '#161B21' : '#fff')
|
|
109
|
+
const menuTextColor = computed(() => appStore.isDark ? '#D9DCE1' : '#4E5566')
|
|
110
|
+
const menuActiveTextColor = computed(() => appStore.isDark ? '#818CF8' : '#4F46E5')
|
|
111
111
|
|
|
112
112
|
// 菜单选择
|
|
113
113
|
const handleMenuSelect = (index: string) => {
|
|
@@ -168,7 +168,7 @@ const handleLogout = () => {
|
|
|
168
168
|
display: flex;
|
|
169
169
|
flex-direction: column;
|
|
170
170
|
background-color: var(--xto-bg-color, #FFFFFF);
|
|
171
|
-
border-right: 1px solid var(--xto-border-color-light, #
|
|
171
|
+
border-right: 1px solid var(--xto-border-color-light, #E5E6EB);
|
|
172
172
|
|
|
173
173
|
&--collapsed {
|
|
174
174
|
.sidebar__logo {
|
|
@@ -183,7 +183,7 @@ const handleLogout = () => {
|
|
|
183
183
|
align-items: center;
|
|
184
184
|
padding: 0 20px;
|
|
185
185
|
gap: 10px;
|
|
186
|
-
border-bottom: 1px solid var(--xto-border-color-light, #
|
|
186
|
+
border-bottom: 1px solid var(--xto-border-color-light, #E5E6EB);
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
&__logo-img {
|
|
@@ -194,7 +194,7 @@ const handleLogout = () => {
|
|
|
194
194
|
&__logo-text {
|
|
195
195
|
font-size: 16px;
|
|
196
196
|
font-weight: 600;
|
|
197
|
-
color: var(--xto-color-primary, #
|
|
197
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
&__menu {
|
|
@@ -220,7 +220,7 @@ const handleLogout = () => {
|
|
|
220
220
|
|
|
221
221
|
&__user {
|
|
222
222
|
padding: 10px;
|
|
223
|
-
border-top: 1px solid var(--xto-border-color-light, #
|
|
223
|
+
border-top: 1px solid var(--xto-border-color-light, #E5E6EB);
|
|
224
224
|
display: flex;
|
|
225
225
|
align-items: center;
|
|
226
226
|
justify-content: space-between;
|
|
@@ -239,7 +239,7 @@ const handleLogout = () => {
|
|
|
239
239
|
|
|
240
240
|
&__user-role {
|
|
241
241
|
font-size: 12px;
|
|
242
|
-
color: var(--xto-color-text-secondary, #
|
|
242
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
</style>
|
|
@@ -156,8 +156,8 @@ const hasChildren = computed(() => {
|
|
|
156
156
|
height: 16px;
|
|
157
157
|
font-size: 12px;
|
|
158
158
|
font-weight: 600;
|
|
159
|
-
color: var(--xto-color-primary, #
|
|
160
|
-
background-color: var(--xto-color-primary-light-8, #
|
|
159
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
160
|
+
background-color: var(--xto-color-primary-light-8, #DCDAFC);
|
|
161
161
|
border-radius: var(--xto-border-radius-small, 4px);
|
|
162
162
|
}
|
|
163
163
|
</style>
|
|
@@ -83,7 +83,7 @@ const handleClose = (path: string) => {
|
|
|
83
83
|
height: 100%;
|
|
84
84
|
padding: 0 16px;
|
|
85
85
|
background-color: var(--xto-bg-color, #FFFFFF);
|
|
86
|
-
border-bottom: 1px solid var(--xto-border-color-light, #
|
|
86
|
+
border-bottom: 1px solid var(--xto-border-color-light, #E5E6EB);
|
|
87
87
|
box-sizing: border-box;
|
|
88
88
|
|
|
89
89
|
:deep(.t-tabs) {
|
|
@@ -106,17 +106,17 @@ const handleClose = (path: string) => {
|
|
|
106
106
|
margin-right: 4px;
|
|
107
107
|
border-radius: 0;
|
|
108
108
|
padding: 0 16px;
|
|
109
|
-
color: var(--xto-color-text-regular, #
|
|
109
|
+
color: var(--xto-color-text-regular, #4E5566);
|
|
110
110
|
position: relative;
|
|
111
111
|
transition: color 0.2s;
|
|
112
112
|
|
|
113
113
|
&:hover {
|
|
114
|
-
color: var(--xto-color-primary, #
|
|
114
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
&.is-active {
|
|
118
118
|
background-color: transparent;
|
|
119
|
-
color: var(--xto-color-primary, #
|
|
119
|
+
color: var(--xto-color-primary, #4F46E5);
|
|
120
120
|
font-weight: 600;
|
|
121
121
|
|
|
122
122
|
&::after {
|
|
@@ -127,7 +127,7 @@ const handleClose = (path: string) => {
|
|
|
127
127
|
right: 12px;
|
|
128
128
|
height: 2px;
|
|
129
129
|
border-radius: 2px;
|
|
130
|
-
background-color: var(--xto-color-primary, #
|
|
130
|
+
background-color: var(--xto-color-primary, #4F46E5);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
}
|
|
@@ -150,7 +150,7 @@ const handleClose = (path: string) => {
|
|
|
150
150
|
|
|
151
151
|
&:hover {
|
|
152
152
|
background-color: var(--xto-color-danger-light, #FEE2E2);
|
|
153
|
-
color: var(--xto-color-danger, #
|
|
153
|
+
color: var(--xto-color-danger, #F53F3F);
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
</style>
|
|
@@ -233,11 +233,10 @@ const handleLayoutChange = (mode: LayoutMode) => {
|
|
|
233
233
|
// 主题色选项
|
|
234
234
|
const colorOptions = [
|
|
235
235
|
{ value: '#409eff', label: '默认蓝' },
|
|
236
|
-
{ value: '#
|
|
237
|
-
{ value: '#
|
|
238
|
-
{ value: '#
|
|
239
|
-
{ value: '#
|
|
240
|
-
{ value: '#722ed1', label: '酱紫' }
|
|
236
|
+
{ value: '#0F6FDE', label: '企业蓝' },
|
|
237
|
+
{ value: '#00A870', label: '翡翠绿' },
|
|
238
|
+
{ value: '#D46B08', label: '琥珀橙' },
|
|
239
|
+
{ value: '#1F2329', label: '石墨黑' }
|
|
241
240
|
]
|
|
242
241
|
|
|
243
242
|
// 设置主题色
|
|
@@ -440,7 +439,7 @@ onUnmounted(() => {
|
|
|
440
439
|
<span>{{ userStore.userName?.charAt(0) || 'U' }}</span>
|
|
441
440
|
</div>
|
|
442
441
|
<span class="top-menu__user-name">{{ userStore.userName }}</span>
|
|
443
|
-
<span class="top-menu__user-arrow" :class="{ 'is-active': dropdownVisible }"
|
|
442
|
+
<span class="top-menu__user-arrow" :class="{ 'is-active': dropdownVisible }"><svg viewBox="0 0 12 12" width="10" height="10" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 4.5 6 8l3.5-3.5"/></svg></span>
|
|
444
443
|
</div>
|
|
445
444
|
|
|
446
445
|
<!-- 下拉菜单 -->
|
|
@@ -677,7 +676,7 @@ onUnmounted(() => {
|
|
|
677
676
|
font-size: 12px;
|
|
678
677
|
font-weight: 600;
|
|
679
678
|
color: var(--xto-color-primary, #4F46E5);
|
|
680
|
-
background-color: var(--xto-color-primary-light-8, #
|
|
679
|
+
background-color: var(--xto-color-primary-light-8, #CAC7F9);
|
|
681
680
|
border-radius: var(--xto-border-radius-small, 4px);
|
|
682
681
|
}
|
|
683
682
|
|
|
@@ -692,28 +691,28 @@ onUnmounted(() => {
|
|
|
692
691
|
position: relative;
|
|
693
692
|
display: flex;
|
|
694
693
|
align-items: center;
|
|
695
|
-
background-color: var(--xto-fill-color-light, #
|
|
694
|
+
background-color: var(--xto-fill-color-light, #F7F8FA);
|
|
696
695
|
border-radius: var(--xto-border-radius-base, 6px);
|
|
697
696
|
padding: 0 12px;
|
|
698
697
|
height: 32px;
|
|
699
698
|
width: 200px;
|
|
700
699
|
|
|
701
700
|
&-icon {
|
|
702
|
-
color: var(--xto-color-text-secondary, #
|
|
701
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
703
702
|
}
|
|
704
703
|
|
|
705
704
|
&-input {
|
|
706
705
|
flex: 1;
|
|
707
706
|
height: 100%;
|
|
708
707
|
font-size: 14px;
|
|
709
|
-
color: var(--xto-color-text-primary, #
|
|
708
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
710
709
|
background: transparent;
|
|
711
710
|
border: none;
|
|
712
711
|
outline: none;
|
|
713
712
|
padding-left: 8px;
|
|
714
713
|
|
|
715
714
|
&::placeholder {
|
|
716
|
-
color: var(--xto-color-text-placeholder, #
|
|
715
|
+
color: var(--xto-color-text-placeholder, #A9AEB8);
|
|
717
716
|
}
|
|
718
717
|
}
|
|
719
718
|
|
|
@@ -744,17 +743,17 @@ onUnmounted(() => {
|
|
|
744
743
|
transition: background-color 0.2s;
|
|
745
744
|
|
|
746
745
|
&:hover {
|
|
747
|
-
background-color: var(--xto-fill-color, #
|
|
746
|
+
background-color: var(--xto-fill-color, #EDEEF1);
|
|
748
747
|
}
|
|
749
748
|
|
|
750
749
|
&-title {
|
|
751
750
|
font-size: 14px;
|
|
752
|
-
color: var(--xto-color-text-primary, #
|
|
751
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
753
752
|
}
|
|
754
753
|
|
|
755
754
|
&-parent {
|
|
756
755
|
font-size: 12px;
|
|
757
|
-
color: var(--xto-color-text-secondary, #
|
|
756
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
758
757
|
margin-left: auto;
|
|
759
758
|
}
|
|
760
759
|
}
|
|
@@ -777,14 +776,14 @@ onUnmounted(() => {
|
|
|
777
776
|
font-size: 12px;
|
|
778
777
|
font-weight: 600;
|
|
779
778
|
color: var(--xto-color-primary, #4F46E5);
|
|
780
|
-
background-color: var(--xto-color-primary-light-8, #
|
|
779
|
+
background-color: var(--xto-color-primary-light-8, #CAC7F9);
|
|
781
780
|
border-radius: var(--xto-border-radius-small, 4px);
|
|
782
781
|
}
|
|
783
782
|
|
|
784
783
|
&-empty {
|
|
785
784
|
padding: 16px 12px;
|
|
786
785
|
text-align: center;
|
|
787
|
-
color: var(--xto-color-text-secondary, #
|
|
786
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
788
787
|
font-size: 14px;
|
|
789
788
|
}
|
|
790
789
|
}
|
|
@@ -797,11 +796,11 @@ onUnmounted(() => {
|
|
|
797
796
|
justify-content: center;
|
|
798
797
|
cursor: pointer;
|
|
799
798
|
border-radius: var(--xto-border-radius-base, 6px);
|
|
800
|
-
color: var(--xto-color-text-regular, #
|
|
799
|
+
color: var(--xto-color-text-regular, #4E5566);
|
|
801
800
|
transition: all 0.2s;
|
|
802
801
|
|
|
803
802
|
&:hover {
|
|
804
|
-
background-color: var(--xto-fill-color, #
|
|
803
|
+
background-color: var(--xto-fill-color, #EDEEF1);
|
|
805
804
|
color: var(--xto-color-primary, #4F46E5);
|
|
806
805
|
}
|
|
807
806
|
}
|
|
@@ -821,13 +820,13 @@ onUnmounted(() => {
|
|
|
821
820
|
transition: background-color 0.2s;
|
|
822
821
|
|
|
823
822
|
&:hover {
|
|
824
|
-
background-color: var(--xto-fill-color, #
|
|
823
|
+
background-color: var(--xto-fill-color, #EDEEF1);
|
|
825
824
|
}
|
|
826
825
|
}
|
|
827
826
|
|
|
828
827
|
&-name {
|
|
829
828
|
font-size: 14px;
|
|
830
|
-
color: var(--xto-color-text-primary, #
|
|
829
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
831
830
|
max-width: 100px;
|
|
832
831
|
overflow: hidden;
|
|
833
832
|
text-overflow: ellipsis;
|
|
@@ -836,7 +835,7 @@ onUnmounted(() => {
|
|
|
836
835
|
|
|
837
836
|
&-arrow {
|
|
838
837
|
font-size: 10px;
|
|
839
|
-
color: var(--xto-color-text-secondary, #
|
|
838
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
840
839
|
transition: transform 0.2s;
|
|
841
840
|
|
|
842
841
|
&.is-active {
|
|
@@ -849,7 +848,7 @@ onUnmounted(() => {
|
|
|
849
848
|
width: 32px;
|
|
850
849
|
height: 32px;
|
|
851
850
|
border-radius: 50%;
|
|
852
|
-
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5), var(--xto-color-primary-light-3, #
|
|
851
|
+
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5), var(--xto-color-primary-light-3, #847DEC));
|
|
853
852
|
display: flex;
|
|
854
853
|
align-items: center;
|
|
855
854
|
justify-content: center;
|
|
@@ -881,7 +880,7 @@ onUnmounted(() => {
|
|
|
881
880
|
width: 40px;
|
|
882
881
|
height: 40px;
|
|
883
882
|
border-radius: 50%;
|
|
884
|
-
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5), var(--xto-color-primary-light-3, #
|
|
883
|
+
background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5), var(--xto-color-primary-light-3, #847DEC));
|
|
885
884
|
display: flex;
|
|
886
885
|
align-items: center;
|
|
887
886
|
justify-content: center;
|
|
@@ -897,18 +896,18 @@ onUnmounted(() => {
|
|
|
897
896
|
&-name {
|
|
898
897
|
font-size: 14px;
|
|
899
898
|
font-weight: 500;
|
|
900
|
-
color: var(--xto-color-text-primary, #
|
|
899
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
901
900
|
}
|
|
902
901
|
|
|
903
902
|
&-role {
|
|
904
903
|
font-size: 12px;
|
|
905
|
-
color: var(--xto-color-text-secondary, #
|
|
904
|
+
color: var(--xto-color-text-secondary, #86909C);
|
|
906
905
|
margin-top: 2px;
|
|
907
906
|
}
|
|
908
907
|
|
|
909
908
|
&-divider {
|
|
910
909
|
height: 1px;
|
|
911
|
-
background-color: var(--xto-border-color-lighter, #
|
|
910
|
+
background-color: var(--xto-border-color-lighter, #EDEEF1);
|
|
912
911
|
}
|
|
913
912
|
|
|
914
913
|
&-menu {
|
|
@@ -922,20 +921,20 @@ onUnmounted(() => {
|
|
|
922
921
|
padding: 10px 16px;
|
|
923
922
|
cursor: pointer;
|
|
924
923
|
font-size: 14px;
|
|
925
|
-
color: var(--xto-color-text-regular, #
|
|
924
|
+
color: var(--xto-color-text-regular, #4E5566);
|
|
926
925
|
transition: all 0.2s;
|
|
927
926
|
|
|
928
927
|
&:hover {
|
|
929
|
-
background-color: var(--xto-fill-color, #
|
|
930
|
-
color: var(--xto-color-text-primary, #
|
|
928
|
+
background-color: var(--xto-fill-color, #EDEEF1);
|
|
929
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
931
930
|
}
|
|
932
931
|
|
|
933
932
|
&--danger {
|
|
934
|
-
color: var(--xto-color-danger, #
|
|
933
|
+
color: var(--xto-color-danger, #F53F3F);
|
|
935
934
|
|
|
936
935
|
&:hover {
|
|
937
936
|
background-color: var(--xto-color-danger-light, #FEE2E2);
|
|
938
|
-
color: var(--xto-color-danger, #
|
|
937
|
+
color: var(--xto-color-danger, #F53F3F);
|
|
939
938
|
}
|
|
940
939
|
}
|
|
941
940
|
}
|
|
@@ -951,7 +950,7 @@ onUnmounted(() => {
|
|
|
951
950
|
.settings-title {
|
|
952
951
|
font-size: 14px;
|
|
953
952
|
font-weight: 500;
|
|
954
|
-
color: var(--xto-color-text-primary, #
|
|
953
|
+
color: var(--xto-color-text-primary, #1F2329);
|
|
955
954
|
margin-bottom: 12px;
|
|
956
955
|
}
|
|
957
956
|
|
|
@@ -967,13 +966,13 @@ onUnmounted(() => {
|
|
|
967
966
|
align-items: center;
|
|
968
967
|
gap: 8px;
|
|
969
968
|
padding: 12px;
|
|
970
|
-
border: 1px solid var(--xto-border-color, #
|
|
969
|
+
border: 1px solid var(--xto-border-color, #D9DCE1);
|
|
971
970
|
border-radius: var(--xto-border-radius-base, 6px);
|
|
972
971
|
cursor: pointer;
|
|
973
972
|
transition: all 0.2s;
|
|
974
973
|
|
|
975
974
|
&:hover {
|
|
976
|
-
border-color: var(--xto-color-primary-light-5, #
|
|
975
|
+
border-color: var(--xto-color-primary-light-5, #B9B5F5);
|
|
977
976
|
}
|
|
978
977
|
|
|
979
978
|
&.is-active {
|
|
@@ -984,14 +983,14 @@ onUnmounted(() => {
|
|
|
984
983
|
&__preview {
|
|
985
984
|
width: 48px;
|
|
986
985
|
height: 36px;
|
|
987
|
-
border: 1px solid var(--xto-border-color-light, #
|
|
986
|
+
border: 1px solid var(--xto-border-color-light, #E5E6EB);
|
|
988
987
|
border-radius: 2px;
|
|
989
988
|
overflow: hidden;
|
|
990
989
|
}
|
|
991
990
|
|
|
992
991
|
&__label {
|
|
993
992
|
font-size: 12px;
|
|
994
|
-
color: var(--xto-color-text-regular, #
|
|
993
|
+
color: var(--xto-color-text-regular, #4E5566);
|
|
995
994
|
}
|
|
996
995
|
}
|
|
997
996
|
|
|
@@ -1013,12 +1012,12 @@ onUnmounted(() => {
|
|
|
1013
1012
|
|
|
1014
1013
|
.preview-header {
|
|
1015
1014
|
height: 20%;
|
|
1016
|
-
background-color: var(--xto-border-color-light, #
|
|
1015
|
+
background-color: var(--xto-border-color-light, #E5E6EB);
|
|
1017
1016
|
}
|
|
1018
1017
|
|
|
1019
1018
|
.preview-content {
|
|
1020
1019
|
flex: 1;
|
|
1021
|
-
background-color: var(--xto-bg-color-page, #
|
|
1020
|
+
background-color: var(--xto-bg-color-page, #F7F8FA);
|
|
1022
1021
|
}
|
|
1023
1022
|
}
|
|
1024
1023
|
}
|
|
@@ -1035,7 +1034,7 @@ onUnmounted(() => {
|
|
|
1035
1034
|
|
|
1036
1035
|
.preview-content-full {
|
|
1037
1036
|
flex: 1;
|
|
1038
|
-
background-color: var(--xto-bg-color-page, #
|
|
1037
|
+
background-color: var(--xto-bg-color-page, #F7F8FA);
|
|
1039
1038
|
}
|
|
1040
1039
|
}
|
|
1041
1040
|
|
|
@@ -1061,12 +1060,12 @@ onUnmounted(() => {
|
|
|
1061
1060
|
|
|
1062
1061
|
.preview-mix-aside {
|
|
1063
1062
|
width: 25%;
|
|
1064
|
-
background-color: var(--xto-color-primary-light-8, #
|
|
1063
|
+
background-color: var(--xto-color-primary-light-8, #CAC7F9);
|
|
1065
1064
|
}
|
|
1066
1065
|
|
|
1067
1066
|
.preview-mix-content {
|
|
1068
1067
|
flex: 1;
|
|
1069
|
-
background-color: var(--xto-bg-color-page, #
|
|
1068
|
+
background-color: var(--xto-bg-color-page, #F7F8FA);
|
|
1070
1069
|
}
|
|
1071
1070
|
}
|
|
1072
1071
|
}
|
|
@@ -1108,7 +1107,7 @@ onUnmounted(() => {
|
|
|
1108
1107
|
|
|
1109
1108
|
span {
|
|
1110
1109
|
font-size: 14px;
|
|
1111
|
-
color: var(--xto-color-text-regular, #
|
|
1110
|
+
color: var(--xto-color-text-regular, #4E5566);
|
|
1112
1111
|
}
|
|
1113
1112
|
}
|
|
1114
1113
|
|
|
@@ -1123,7 +1122,7 @@ onUnmounted(() => {
|
|
|
1123
1122
|
width: 100%;
|
|
1124
1123
|
height: 100%;
|
|
1125
1124
|
border-radius: 11px;
|
|
1126
|
-
background-color: var(--xto-border-color, #
|
|
1125
|
+
background-color: var(--xto-border-color, #D9DCE1);
|
|
1127
1126
|
position: relative;
|
|
1128
1127
|
transition: background-color 0.2s;
|
|
1129
1128
|
|
|
@@ -139,7 +139,7 @@ const showMixSidebar = computed(() => {
|
|
|
139
139
|
width: 100%;
|
|
140
140
|
height: 50px;
|
|
141
141
|
background-color: var(--xto-bg-color, #FFFFFF);
|
|
142
|
-
border-bottom: 1px solid var(--xto-border-color-lighter, #
|
|
142
|
+
border-bottom: 1px solid var(--xto-border-color-lighter, #EDEEF1);
|
|
143
143
|
flex-shrink: 0;
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -163,7 +163,7 @@ const showMixSidebar = computed(() => {
|
|
|
163
163
|
height: 50px;
|
|
164
164
|
box-sizing: border-box;
|
|
165
165
|
background-color: var(--xto-bg-color, #FFFFFF);
|
|
166
|
-
border-bottom: 1px solid var(--xto-border-color-lighter, #
|
|
166
|
+
border-bottom: 1px solid var(--xto-border-color-lighter, #EDEEF1);
|
|
167
167
|
flex-shrink: 0;
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -186,14 +186,14 @@ const showMixSidebar = computed(() => {
|
|
|
186
186
|
height: 50px;
|
|
187
187
|
box-sizing: border-box;
|
|
188
188
|
background-color: var(--xto-bg-color, #FFFFFF);
|
|
189
|
-
border-bottom: 1px solid var(--xto-border-color-lighter, #
|
|
189
|
+
border-bottom: 1px solid var(--xto-border-color-lighter, #EDEEF1);
|
|
190
190
|
flex-shrink: 0;
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
&__content {
|
|
194
194
|
flex: 1;
|
|
195
195
|
overflow: auto;
|
|
196
|
-
background-color: var(--xto-bg-color-page, #
|
|
196
|
+
background-color: var(--xto-bg-color-page, #F7F8FA);
|
|
197
197
|
padding: 0;
|
|
198
198
|
}
|
|
199
199
|
}
|
package/src/stores/app.ts
CHANGED
|
@@ -9,6 +9,14 @@ import { local } from '@/utils/storage'
|
|
|
9
9
|
export type ThemeMode = 'light' | 'dark'
|
|
10
10
|
export type LayoutMode = 'sidebar' | 'top' | 'mix'
|
|
11
11
|
|
|
12
|
+
/** hex → rgb 数组,非法输入返回 null */
|
|
13
|
+
function hexToRgb(hex: string): [number, number, number] | null {
|
|
14
|
+
const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim())
|
|
15
|
+
if (!m) return null
|
|
16
|
+
const n = parseInt(m[1], 16)
|
|
17
|
+
return [(n >> 16) & 255, (n >> 8) & 255, n & 255]
|
|
18
|
+
}
|
|
19
|
+
|
|
12
20
|
export const useAppStore = defineStore('app', () => {
|
|
13
21
|
// 状态
|
|
14
22
|
const appName = ref<string>(local.get<string>('appName') || 'XTO App')
|
|
@@ -102,10 +110,26 @@ export const useAppStore = defineStore('app', () => {
|
|
|
102
110
|
local.set('showBreadcrumb', showBreadcrumb.value)
|
|
103
111
|
}
|
|
104
112
|
|
|
105
|
-
//
|
|
113
|
+
// 设置主题色(同时生成 light-1..9 / dark-1..3 色阶,保证浅色变体跟随)
|
|
106
114
|
const setPrimaryColor = (color: string) => {
|
|
107
115
|
primaryColor.value = color
|
|
108
|
-
document.documentElement
|
|
116
|
+
const root = document.documentElement
|
|
117
|
+
root.style.setProperty('--xto-color-primary', color)
|
|
118
|
+
const rgb = hexToRgb(color)
|
|
119
|
+
if (rgb) {
|
|
120
|
+
const mix = (t: number, toWhite: boolean) => {
|
|
121
|
+
const target = toWhite ? [255, 255, 255] : [0, 0, 0]
|
|
122
|
+
const c = rgb.map((v, i) => Math.round(v + (target[i] - v) * t))
|
|
123
|
+
return `#${c.map((v) => v.toString(16).padStart(2, '0')).join('')}`
|
|
124
|
+
}
|
|
125
|
+
for (let n = 1; n <= 9; n++) {
|
|
126
|
+
root.style.setProperty(`--xto-color-primary-light-${n}`, mix(n * 0.1, true))
|
|
127
|
+
}
|
|
128
|
+
root.style.setProperty('--xto-color-primary-dark-1', mix(0.12, false))
|
|
129
|
+
root.style.setProperty('--xto-color-primary-dark-2', mix(0.28, false))
|
|
130
|
+
root.style.setProperty('--xto-color-primary-dark-3', mix(0.45, false))
|
|
131
|
+
root.style.setProperty('--xto-color-ring', color)
|
|
132
|
+
}
|
|
109
133
|
local.set('primaryColor', color)
|
|
110
134
|
}
|
|
111
135
|
|
package/src/style.scss
CHANGED