xto-fronted 0.3.4 → 0.3.6

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.
@@ -5,6 +5,8 @@ import { useAppStore } from '@/stores/app'
5
5
  import { useUserStore } from '@/stores/user'
6
6
  import { useAuthStore } from '@/stores/auth'
7
7
  import { useMenuStore } from '@/stores/menu'
8
+ import { Icon } from '@xto/base'
9
+ import { Drawer } from '@xto/feedback'
8
10
 
9
11
  type LayoutMode = 'sidebar' | 'top' | 'mix'
10
12
 
@@ -16,18 +18,21 @@ const authStore = useAuthStore()
16
18
  const menuStore = useMenuStore()
17
19
 
18
20
  const dropdownVisible = ref(false)
19
- const layoutDropdownVisible = ref(false)
21
+ const drawerVisible = ref(false)
20
22
  const dropdownRef = ref<HTMLElement | null>(null)
21
23
  const isFullscreen = ref(false)
22
24
  const searchVisible = ref(false)
23
25
  const searchKeyword = ref('')
24
26
  const searchRef = ref<HTMLElement | null>(null)
25
27
 
28
+ // 灰色模式状态
29
+ const greyMode = ref(false)
30
+
26
31
  // 布局模式选项
27
32
  const layoutOptions: { value: LayoutMode; label: string; icon: string }[] = [
28
- { value: 'sidebar', label: '左侧菜单', icon: '📋' },
29
- { value: 'top', label: '顶部菜单', icon: '' },
30
- { value: 'mix', label: '混合菜单', icon: '' }
33
+ { value: 'sidebar', label: '左侧菜单', icon: 'sidebar-left' },
34
+ { value: 'top', label: '顶部菜单', icon: 'menu' },
35
+ { value: 'mix', label: '混合菜单', icon: 'grid' }
31
36
  ]
32
37
 
33
38
  // 主题色选项
@@ -84,19 +89,24 @@ const toggleTheme = () => {
84
89
  appStore.toggleTheme()
85
90
  }
86
91
 
92
+ // 打开设置抽屉
93
+ const openSettingsDrawer = () => {
94
+ drawerVisible.value = true
95
+ }
96
+
87
97
  // 切换布局模式
88
98
  const handleLayoutChange = (mode: LayoutMode) => {
89
99
  appStore.setLayout(mode)
90
- layoutDropdownVisible.value = false
91
100
  }
92
101
 
93
102
  // 切换灰色模式
94
- const toggleGreyMode = () => {
103
+ const handleGreyModeChange = (value: boolean) => {
104
+ greyMode.value = value
95
105
  const html = document.documentElement
96
- if (html.classList.contains('grey-mode')) {
97
- html.classList.remove('grey-mode')
98
- } else {
106
+ if (value) {
99
107
  html.classList.add('grey-mode')
108
+ } else {
109
+ html.classList.remove('grey-mode')
100
110
  }
101
111
  }
102
112
 
@@ -117,19 +127,11 @@ const handleFullscreenChange = () => {
117
127
  // 切换下拉菜单
118
128
  const toggleDropdown = () => {
119
129
  dropdownVisible.value = !dropdownVisible.value
120
- layoutDropdownVisible.value = false
121
- }
122
-
123
- // 切换布局下拉菜单
124
- const toggleLayoutDropdown = () => {
125
- layoutDropdownVisible.value = !layoutDropdownVisible.value
126
- dropdownVisible.value = false
127
130
  }
128
131
 
129
132
  // 关闭下拉菜单
130
133
  const closeDropdowns = () => {
131
134
  dropdownVisible.value = false
132
- layoutDropdownVisible.value = false
133
135
  }
134
136
 
135
137
  // 显示搜索
@@ -203,6 +205,8 @@ onMounted(() => {
203
205
  document.addEventListener('fullscreenchange', handleFullscreenChange)
204
206
  document.addEventListener('keydown', handleKeydown)
205
207
  appStore.initTheme()
208
+ // 初始化灰色模式状态
209
+ greyMode.value = document.documentElement.classList.contains('grey-mode')
206
210
  })
207
211
 
208
212
  onUnmounted(() => {
@@ -218,10 +222,7 @@ onUnmounted(() => {
218
222
  <div class="header__left">
219
223
  <!-- 折叠按钮 -->
220
224
  <div class="header__collapse" @click="toggleCollapse">
221
- <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor">
222
- <path v-if="appStore.isCollapsed" d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
223
- <path v-else d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
224
- </svg>
225
+ <Icon :name="appStore.isCollapsed ? 'menu-unfold' : 'menu-fold'" :size="18" />
225
226
  </div>
226
227
 
227
228
  <!-- 面包屑 -->
@@ -239,73 +240,22 @@ onUnmounted(() => {
239
240
  <div class="header__right">
240
241
  <!-- 搜索按钮 -->
241
242
  <div class="header__action" @click="showSearch" title="搜索 (Ctrl+K)">
242
- <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
243
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
244
- </svg>
243
+ <Icon name="search" :size="16" />
245
244
  </div>
246
245
 
247
246
  <!-- 全屏切换 -->
248
247
  <div class="header__action" @click="toggleFullscreen" :title="isFullscreen ? '退出全屏' : '全屏'">
249
- <svg v-if="isFullscreen" viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
250
- <path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"/>
251
- </svg>
252
- <svg v-else viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
253
- <path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/>
254
- </svg>
248
+ <Icon :name="isFullscreen ? 'fullscreen-exit' : 'fullscreen'" :size="16" />
255
249
  </div>
256
250
 
257
- <!-- 布局切换 -->
258
- <div class="header__action header__layout" ref="dropdownRef">
259
- <div class="header__action-trigger" @click.stop="toggleLayoutDropdown">
260
- <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
261
- <path d="M3 3h18v18H3V3zm2 2v6h14V5H5zm0 8v6h6v-6H5zm8 0v6h6v-6h-6z"/>
262
- </svg>
263
- </div>
264
-
265
- <!-- 布局下拉菜单 -->
266
- <Transition name="dropdown">
267
- <div v-if="layoutDropdownVisible" class="header__layout-dropdown">
268
- <div class="header__layout-title">布局模式</div>
269
- <div class="header__layout-options">
270
- <div
271
- v-for="option in layoutOptions"
272
- :key="option.value"
273
- :class="['header__layout-option', { 'is-active': currentLayout === option.value }]"
274
- @click="handleLayoutChange(option.value)"
275
- >
276
- <span class="layout-icon">{{ option.icon }}</span>
277
- <span>{{ option.label }}</span>
278
- </div>
279
- </div>
280
- <div class="header__layout-divider"></div>
281
- <div class="header__layout-title">主题色</div>
282
- <div class="header__color-options">
283
- <div
284
- v-for="color in colorOptions"
285
- :key="color.value"
286
- :class="['header__color-option', { 'is-active': appStore.primaryColor === color.value }]"
287
- :style="{ backgroundColor: color.value }"
288
- :title="color.label"
289
- @click="handleColorChange(color.value)"
290
- ></div>
291
- </div>
292
- <div class="header__layout-divider"></div>
293
- <div class="header__layout-item" @click="toggleGreyMode">
294
- <span class="layout-icon">🌫️</span>
295
- <span>灰色模式</span>
296
- </div>
297
- </div>
298
- </Transition>
251
+ <!-- 换肤设置 -->
252
+ <div class="header__action" @click="openSettingsDrawer" title="换肤设置">
253
+ <Icon name="setting" :size="16" />
299
254
  </div>
300
255
 
301
256
  <!-- 主题切换 -->
302
257
  <div class="header__action" @click="toggleTheme" title="切换主题">
303
- <svg v-if="appStore.isDark" viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
304
- <path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-3.03 0-5.5-2.47-5.5-5.5 0-1.82.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1z"/>
305
- </svg>
306
- <svg v-else viewBox="0 0 24 24" width="16" height="16" fill="currentColor">
307
- <path d="M6.76 4.84l-1.4-1.4-1.41 1.41 1.4 1.4 1.41-1.41zm10.49 10.49l-1.4-1.4-1.41 1.41 1.4 1.4 1.41-1.41zM12 4c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-9h-2v4h2v-4zm0-6h-2v2h2V5zM4.84 17.24l-1.41 1.41 1.4 1.4 1.41-1.41-1.4-1.4z"/>
308
- </svg>
258
+ <Icon :name="appStore.isDark ? 'sun' : 'moon'" :size="16" />
309
259
  </div>
310
260
 
311
261
  <!-- 用户头像 -->
@@ -333,16 +283,16 @@ onUnmounted(() => {
333
283
  <div class="header__dropdown-divider"></div>
334
284
  <div class="header__dropdown-menu">
335
285
  <div class="header__dropdown-item" @click="handleProfile">
336
- <span class="header__dropdown-icon">👤</span>
286
+ <Icon name="user" :size="16" />
337
287
  <span>个人信息</span>
338
288
  </div>
339
289
  <div class="header__dropdown-item" @click="handleChangePassword">
340
- <span class="header__dropdown-icon">🔐</span>
290
+ <Icon name="lock" :size="16" />
341
291
  <span>修改密码</span>
342
292
  </div>
343
293
  <div class="header__dropdown-divider"></div>
344
294
  <div class="header__dropdown-item header__dropdown-item--danger" @click="handleLogout">
345
- <span class="header__dropdown-icon">🚪</span>
295
+ <Icon name="logout" :size="16" />
346
296
  <span>退出登录</span>
347
297
  </div>
348
298
  </div>
@@ -356,9 +306,7 @@ onUnmounted(() => {
356
306
  <div v-if="searchVisible" class="header__search-modal" ref="searchRef">
357
307
  <div class="search-container">
358
308
  <div class="search-input-wrapper">
359
- <svg class="search-icon" viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
360
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
361
- </svg>
309
+ <Icon class="search-icon" name="search" :size="20" />
362
310
  <input
363
311
  v-model="searchKeyword"
364
312
  type="text"
@@ -376,7 +324,7 @@ onUnmounted(() => {
376
324
  :class="['search-result-item', { 'is-first': index === 0 }]"
377
325
  @click="handleSearchItemClick(item.path)"
378
326
  >
379
- <span class="search-result-icon">{{ item.icon || '📄' }}</span>
327
+ <Icon class="search-result-icon" :name="item.icon || 'file'" :size="20" />
380
328
  <div class="search-result-info">
381
329
  <span class="search-result-title">{{ item.title }}</span>
382
330
  <span v-if="item.parentTitle" class="search-result-parent">{{ item.parentTitle }}</span>
@@ -389,6 +337,89 @@ onUnmounted(() => {
389
337
  </div>
390
338
  </div>
391
339
  </Transition>
340
+
341
+ <!-- 换肤设置抽屉 -->
342
+ <Drawer
343
+ v-model="drawerVisible"
344
+ title="换肤设置"
345
+ direction="rtl"
346
+ size="320px"
347
+ >
348
+ <div class="settings-drawer">
349
+ <!-- 布局模式 -->
350
+ <div class="settings-section">
351
+ <div class="settings-title">布局模式</div>
352
+ <div class="settings-layout-options">
353
+ <div
354
+ v-for="option in layoutOptions"
355
+ :key="option.value"
356
+ :class="['layout-option', { 'is-active': currentLayout === option.value }]"
357
+ @click="handleLayoutChange(option.value)"
358
+ >
359
+ <div class="layout-option__preview">
360
+ <div v-if="option.value === 'sidebar'" class="layout-preview-sidebar">
361
+ <div class="preview-aside"></div>
362
+ <div class="preview-main">
363
+ <div class="preview-header"></div>
364
+ <div class="preview-content"></div>
365
+ </div>
366
+ </div>
367
+ <div v-else-if="option.value === 'top'" class="layout-preview-top">
368
+ <div class="preview-header-full"></div>
369
+ <div class="preview-content-full"></div>
370
+ </div>
371
+ <div v-else class="layout-preview-mix">
372
+ <div class="preview-header-mix">
373
+ <div class="preview-mix-left"></div>
374
+ </div>
375
+ <div class="preview-mix-body">
376
+ <div class="preview-mix-aside"></div>
377
+ <div class="preview-mix-content"></div>
378
+ </div>
379
+ </div>
380
+ </div>
381
+ <span class="layout-option__label">{{ option.label }}</span>
382
+ </div>
383
+ </div>
384
+ </div>
385
+
386
+ <!-- 主题色 -->
387
+ <div class="settings-section">
388
+ <div class="settings-title">主题色</div>
389
+ <div class="settings-color-options">
390
+ <div
391
+ v-for="color in colorOptions"
392
+ :key="color.value"
393
+ :class="['color-option', { 'is-active': appStore.primaryColor === color.value }]"
394
+ :style="{ backgroundColor: color.value }"
395
+ :title="color.label"
396
+ @click="handleColorChange(color.value)"
397
+ >
398
+ <Icon v-if="appStore.primaryColor === color.value" name="check" :size="12" color="#fff" />
399
+ </div>
400
+ </div>
401
+ </div>
402
+
403
+ <!-- 功能开关 -->
404
+ <div class="settings-section">
405
+ <div class="settings-title">功能设置</div>
406
+ <div class="settings-switch-list">
407
+ <div class="settings-switch-item">
408
+ <span>灰色模式</span>
409
+ <div class="switch-wrapper" :class="{ 'is-checked': greyMode }" @click="handleGreyModeChange(!greyMode)">
410
+ <span class="switch-core"></span>
411
+ </div>
412
+ </div>
413
+ <div class="settings-switch-item">
414
+ <span>暗黑模式</span>
415
+ <div class="switch-wrapper" :class="{ 'is-checked': appStore.isDark }" @click="toggleTheme">
416
+ <span class="switch-core"></span>
417
+ </div>
418
+ </div>
419
+ </div>
420
+ </div>
421
+ </div>
422
+ </Drawer>
392
423
  </div>
393
424
  </template>
394
425
 
@@ -461,104 +492,6 @@ onUnmounted(() => {
461
492
  }
462
493
  }
463
494
 
464
- &__layout {
465
- position: relative;
466
- }
467
-
468
- &__layout-dropdown {
469
- position: absolute;
470
- top: calc(100% + 8px);
471
- right: 0;
472
- min-width: 200px;
473
- background-color: var(--bg-color);
474
- border-radius: var(--border-radius-base);
475
- box-shadow: var(--box-shadow);
476
- padding: 12px;
477
- z-index: 100;
478
- }
479
-
480
- &__layout-title {
481
- font-size: 12px;
482
- color: var(--color-text-secondary);
483
- margin-bottom: 8px;
484
- padding-left: 4px;
485
- }
486
-
487
- &__layout-options {
488
- display: flex;
489
- flex-direction: column;
490
- gap: 4px;
491
- }
492
-
493
- &__layout-option {
494
- display: flex;
495
- align-items: center;
496
- gap: 8px;
497
- padding: 8px 12px;
498
- cursor: pointer;
499
- border-radius: var(--border-radius-base);
500
- font-size: 14px;
501
- color: var(--color-text-regular);
502
- transition: all 0.2s;
503
-
504
- &:hover {
505
- background-color: var(--color-fill);
506
- }
507
-
508
- &.is-active {
509
- color: var(--color-primary);
510
- background-color: var(--color-primary-light-9);
511
- }
512
-
513
- .layout-icon {
514
- font-size: 16px;
515
- }
516
- }
517
-
518
- &__color-options {
519
- display: flex;
520
- gap: 8px;
521
- padding: 8px 0;
522
- }
523
-
524
- &__color-option {
525
- width: 20px;
526
- height: 20px;
527
- border-radius: 50%;
528
- cursor: pointer;
529
- transition: transform 0.2s;
530
-
531
- &:hover {
532
- transform: scale(1.2);
533
- }
534
-
535
- &.is-active {
536
- box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px currentColor;
537
- }
538
- }
539
-
540
- &__layout-divider {
541
- height: 1px;
542
- background-color: var(--color-border-lighter);
543
- margin: 8px 0;
544
- }
545
-
546
- &__layout-item {
547
- display: flex;
548
- align-items: center;
549
- gap: 8px;
550
- padding: 8px 12px;
551
- cursor: pointer;
552
- border-radius: var(--border-radius-base);
553
- font-size: 14px;
554
- color: var(--color-text-regular);
555
- transition: all 0.2s;
556
-
557
- &:hover {
558
- background-color: var(--color-fill);
559
- }
560
- }
561
-
562
495
  &__user {
563
496
  position: relative;
564
497
  margin-left: 8px;
@@ -690,10 +623,6 @@ onUnmounted(() => {
690
623
  }
691
624
  }
692
625
  }
693
-
694
- &-icon {
695
- font-size: 16px;
696
- }
697
626
  }
698
627
 
699
628
  &__search-modal {
@@ -777,7 +706,7 @@ onUnmounted(() => {
777
706
  }
778
707
 
779
708
  .search-result-icon {
780
- font-size: 20px;
709
+ color: var(--color-text-secondary);
781
710
  }
782
711
 
783
712
  .search-result-info {
@@ -805,6 +734,216 @@ onUnmounted(() => {
805
734
  font-size: 14px;
806
735
  }
807
736
 
737
+ // 设置抽屉内容
738
+ .settings-drawer {
739
+ .settings-section {
740
+ margin-bottom: 24px;
741
+ }
742
+
743
+ .settings-title {
744
+ font-size: 14px;
745
+ font-weight: 500;
746
+ color: var(--color-text-primary);
747
+ margin-bottom: 12px;
748
+ }
749
+
750
+ .settings-layout-options {
751
+ display: flex;
752
+ gap: 12px;
753
+ }
754
+
755
+ .layout-option {
756
+ flex: 1;
757
+ display: flex;
758
+ flex-direction: column;
759
+ align-items: center;
760
+ gap: 8px;
761
+ padding: 12px;
762
+ border: 1px solid var(--color-border);
763
+ border-radius: var(--border-radius-base);
764
+ cursor: pointer;
765
+ transition: all 0.2s;
766
+
767
+ &:hover {
768
+ border-color: var(--color-primary-light-5);
769
+ }
770
+
771
+ &.is-active {
772
+ border-color: var(--color-primary);
773
+ background-color: var(--color-primary-light-9);
774
+ }
775
+
776
+ &__preview {
777
+ width: 48px;
778
+ height: 36px;
779
+ border: 1px solid var(--color-border-light);
780
+ border-radius: 2px;
781
+ overflow: hidden;
782
+ }
783
+
784
+ &__label {
785
+ font-size: 12px;
786
+ color: var(--color-text-regular);
787
+ }
788
+ }
789
+
790
+ // 布局预览样式
791
+ .layout-preview-sidebar {
792
+ display: flex;
793
+ height: 100%;
794
+
795
+ .preview-aside {
796
+ width: 25%;
797
+ height: 100%;
798
+ background-color: var(--color-primary-light-7);
799
+ }
800
+
801
+ .preview-main {
802
+ flex: 1;
803
+ display: flex;
804
+ flex-direction: column;
805
+
806
+ .preview-header {
807
+ height: 20%;
808
+ background-color: var(--color-border-light);
809
+ }
810
+
811
+ .preview-content {
812
+ flex: 1;
813
+ background-color: var(--bg-color-page);
814
+ }
815
+ }
816
+ }
817
+
818
+ .layout-preview-top {
819
+ display: flex;
820
+ flex-direction: column;
821
+ height: 100%;
822
+
823
+ .preview-header-full {
824
+ height: 25%;
825
+ background-color: var(--color-primary-light-7);
826
+ }
827
+
828
+ .preview-content-full {
829
+ flex: 1;
830
+ background-color: var(--bg-color-page);
831
+ }
832
+ }
833
+
834
+ .layout-preview-mix {
835
+ display: flex;
836
+ flex-direction: column;
837
+ height: 100%;
838
+
839
+ .preview-header-mix {
840
+ height: 25%;
841
+ background-color: var(--color-primary-light-7);
842
+ display: flex;
843
+
844
+ .preview-mix-left {
845
+ width: 30%;
846
+ background-color: var(--color-primary);
847
+ }
848
+ }
849
+
850
+ .preview-mix-body {
851
+ flex: 1;
852
+ display: flex;
853
+
854
+ .preview-mix-aside {
855
+ width: 25%;
856
+ background-color: var(--color-primary-light-8);
857
+ }
858
+
859
+ .preview-mix-content {
860
+ flex: 1;
861
+ background-color: var(--bg-color-page);
862
+ }
863
+ }
864
+ }
865
+
866
+ .settings-color-options {
867
+ display: flex;
868
+ gap: 12px;
869
+ }
870
+
871
+ .color-option {
872
+ width: 24px;
873
+ height: 24px;
874
+ border-radius: 4px;
875
+ cursor: pointer;
876
+ display: flex;
877
+ align-items: center;
878
+ justify-content: center;
879
+ transition: transform 0.2s;
880
+
881
+ &:hover {
882
+ transform: scale(1.1);
883
+ }
884
+
885
+ &.is-active {
886
+ box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--color-primary);
887
+ }
888
+ }
889
+
890
+ .settings-switch-list {
891
+ display: flex;
892
+ flex-direction: column;
893
+ gap: 12px;
894
+ }
895
+
896
+ .settings-switch-item {
897
+ display: flex;
898
+ align-items: center;
899
+ justify-content: space-between;
900
+
901
+ span {
902
+ font-size: 14px;
903
+ color: var(--color-text-regular);
904
+ }
905
+ }
906
+
907
+ .switch-wrapper {
908
+ width: 44px;
909
+ height: 22px;
910
+ display: flex;
911
+ align-items: center;
912
+ cursor: pointer;
913
+
914
+ .switch-core {
915
+ width: 100%;
916
+ height: 100%;
917
+ border-radius: 11px;
918
+ background-color: var(--color-border);
919
+ position: relative;
920
+ transition: background-color 0.2s;
921
+
922
+ &::after {
923
+ content: '';
924
+ position: absolute;
925
+ top: 2px;
926
+ left: 2px;
927
+ width: 18px;
928
+ height: 18px;
929
+ background-color: #fff;
930
+ border-radius: 50%;
931
+ transition: left 0.2s;
932
+ }
933
+ }
934
+
935
+ &.is-checked {
936
+ .switch-core {
937
+ background-color: var(--color-primary);
938
+
939
+ &::after {
940
+ left: 24px;
941
+ }
942
+ }
943
+ }
944
+ }
945
+ }
946
+
808
947
  // 下拉动画
809
948
  .dropdown-enter-active,
810
949
  .dropdown-leave-active {