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.
- package/dist/components/Layout/Sidebar.vue.d.ts +1 -8
- package/dist/index-B6DTsC6l.js +1715 -0
- package/dist/index-B7etKk33.js +372 -0
- package/dist/index-BBqvHkzE.js +475 -0
- package/dist/index-BGmUwemj.js +372 -0
- package/dist/index-C0VN9nFF.js +142 -0
- package/dist/index-Cb-SxHJp.js +345 -0
- package/dist/index-CeCysOnl.js +345 -0
- package/dist/index-D7TZamyY.js +1664 -0
- package/dist/index-DnJ481u1.js +475 -0
- package/dist/index-YDlNLFVk.js +142 -0
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/Layout/Header.vue +327 -188
- package/src/components/Layout/Sidebar.vue +25 -190
- package/src/components/Layout/index.vue +8 -180
|
@@ -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
|
|
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
|
|
103
|
+
const handleGreyModeChange = (value: boolean) => {
|
|
104
|
+
greyMode.value = value
|
|
95
105
|
const html = document.documentElement
|
|
96
|
-
if (
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
|
259
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
286
|
+
<Icon name="user" :size="16" />
|
|
337
287
|
<span>个人信息</span>
|
|
338
288
|
</div>
|
|
339
289
|
<div class="header__dropdown-item" @click="handleChangePassword">
|
|
340
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
|
|
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 {
|