wui-components-v2 1.1.69 → 1.1.71

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 (117) hide show
  1. package/api/core/index.ts +74 -74
  2. package/api/feishu.ts +20 -20
  3. package/api/index.ts +4 -4
  4. package/api/login.ts +51 -51
  5. package/api/menu.ts +45 -45
  6. package/api/page.ts +114 -114
  7. package/api/sys.ts +12 -12
  8. package/api/tree.ts +28 -28
  9. package/components/action-popup/action-popup.vue +116 -116
  10. package/components/add-address-list/add-address-list.vue +187 -187
  11. package/components/add-address-page/add-address-page.vue +77 -77
  12. package/components/add-address-page/config.ts +297 -297
  13. package/components/audio-play/audio-play.vue +220 -220
  14. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  15. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  16. package/components/custom-date-picker/custom-date-picker.vue +106 -106
  17. package/components/custom-select-picker/custom-select-picker.vue +95 -95
  18. package/components/demo-block/demo-block.vue +63 -63
  19. package/components/demo-card/demo-card.vue +44 -44
  20. package/components/detail-popup/detail-popup.vue +99 -99
  21. package/components/evaluation-page/evaluation-page.vue +196 -196
  22. package/components/fold-card/fold-card.vue +171 -171
  23. package/components/form-control/form-control.vue +661 -661
  24. package/components/global-loading/GlobalLoading.md +366 -366
  25. package/components/global-loading/global-loading.vue +55 -55
  26. package/components/global-message/GlobalMessage.md +570 -570
  27. package/components/global-message/global-message.vue +68 -68
  28. package/components/global-toast/GlobalToast.md +261 -261
  29. package/components/global-toast/global-toast.vue +56 -56
  30. package/components/label-value/label-value.vue +144 -144
  31. package/components/label-value/open-value-more.vue +56 -56
  32. package/components/list-top-buttons/list-top-buttons.vue +19 -19
  33. package/components/loading/loading.vue +5 -5
  34. package/components/login-form/login-form.vue +126 -126
  35. package/components/login-form-box/login-form-box.vue +65 -65
  36. package/components/mulselect-picker/mulselect-picker.vue +86 -86
  37. package/components/phone-login-form/phone-login-form.vue +204 -204
  38. package/components/privacy-popup/privacy-popup.vue +191 -191
  39. package/components/product-card/product-card.vue +201 -201
  40. package/components/scan-input/scan-input.vue +406 -406
  41. package/components/search/search.vue +128 -128
  42. package/components/select-col-picker/select-col-picker.vue +168 -168
  43. package/components/tab-search/tab-search.vue +73 -73
  44. package/components/tree-select/components/TreeNode.vue +200 -200
  45. package/components/tree-select/components/index.vue +471 -471
  46. package/components/tree-select/components/tree-select.vue +56 -56
  47. package/components/tree-select/index.vue +93 -93
  48. package/components/user-choose/user-choose.vue +169 -151
  49. package/components/video-play/video-play.vue +56 -56
  50. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  51. package/components/wui-default/wui-default.vue +49 -49
  52. package/components/wui-details-page/wui-details-page.vue +147 -147
  53. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  54. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  55. package/components/wui-enume-select-control/wui-enume-select-control.vue +92 -92
  56. package/components/wui-list/wui-list.vue +235 -235
  57. package/components/wui-login/wui-login.vue +43 -43
  58. package/components/wui-login1/wui-login.vue +41 -41
  59. package/components/wui-menus/wui-menus-top.vue +137 -137
  60. package/components/wui-menus/wui-menus-top1.vue +8 -8
  61. package/components/wui-menus/wui-menus.vue +247 -247
  62. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  63. package/components/wui-menus1/components/navbar.vue +43 -43
  64. package/components/wui-menus1/components/quick-panel.vue +55 -55
  65. package/components/wui-menus1/components/search-bar.vue +49 -49
  66. package/components/wui-menus1/components/section-menus.vue +208 -208
  67. package/components/wui-menus1/wui-menus-top.vue +718 -718
  68. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  69. package/components/wui-menus1/wui-menus.vue +564 -564
  70. package/components/wui-notify-info/notify-handle.vue +53 -53
  71. package/components/wui-notify-info/wui-notify-info.vue +280 -280
  72. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  73. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  74. package/components/wui-search-history-babbar/wui-search-history-babbar.vue +204 -204
  75. package/components/wui-select-list/wui-select-list.vue +310 -310
  76. package/components/wui-select-popup/wui-select-popup.vue +613 -612
  77. package/components/wui-system-settings/wui-system-settings.vue +144 -144
  78. package/components/wui-tabbar/wui-tabbar.vue +106 -106
  79. package/components/wui-tree-page/components/tree-item.vue +238 -238
  80. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  81. package/components/wui-update-component/wui-update-component.vue +221 -221
  82. package/components/wui-user/wui-user.vue +202 -202
  83. package/composables/types/theme.ts +65 -65
  84. package/composables/types/user.ts +5 -5
  85. package/composables/useColorGenerator.ts +221 -221
  86. package/composables/useCompanyFieldFilter.ts +91 -91
  87. package/composables/useEnumes.ts +43 -43
  88. package/composables/useEventBus.ts +37 -37
  89. package/composables/useGlobalLoading.ts +47 -47
  90. package/composables/useGlobalMessage.ts +53 -53
  91. package/composables/useGlobalToast.ts +63 -63
  92. package/composables/useLocale.ts +54 -54
  93. package/composables/useManualTheme.ts +179 -179
  94. package/composables/useMenus.ts +193 -193
  95. package/composables/useSectionMenus.ts +120 -120
  96. package/composables/useTabbar.ts +50 -50
  97. package/composables/useTheme.ts +74 -74
  98. package/composables/useUser.ts +24 -24
  99. package/index.d.ts +90 -90
  100. package/index.ts +83 -83
  101. package/package.json +24 -24
  102. package/static/iconfont/iconfont.css +63 -63
  103. package/store/language.ts +151 -151
  104. package/store/manualThemeStore.ts +143 -143
  105. package/store/persist.ts +41 -41
  106. package/store/themeStore.ts +74 -74
  107. package/store/userStore.ts +22 -22
  108. package/styles/dark-mode.css +523 -523
  109. package/styles/dark-mode.min.css +1 -1
  110. package/styles/dark-mode.scss +498 -498
  111. package/type.ts +154 -154
  112. package/utils/control-tree.ts +353 -353
  113. package/utils/control-type-supportor.ts +148 -148
  114. package/utils/eventBus.ts +36 -36
  115. package/utils/idata-scan.ts +99 -99
  116. package/utils/index.ts +979 -979
  117. package/utils/rsaEncrypt.ts +10 -10
@@ -1,718 +1,718 @@
1
- <script setup lang="ts">
2
- import { computed, defineOptions } from 'vue'
3
- import { useManualTheme } from '../../composables/useManualTheme'
4
- import { useUser } from '../../composables/useUser'
5
- import { formatChineseDate } from '../../utils'
6
- import { useSectionMenus } from '../../composables/useSectionMenus'
7
-
8
- defineOptions({
9
- name: 'WuiMenusTop',
10
- })
11
-
12
- const user = useUser().getUserInfo()
13
-
14
- const {
15
- currentThemeColor,
16
- } = useManualTheme()
17
-
18
- const { messageBar, quickPanel } = useSectionMenus()
19
- const quickPanelcomputed = computed(() => {
20
- return quickPanel.value.slice(0, 2)
21
- })
22
- </script>
23
-
24
- <template>
25
- <view class="header-container position-relative">
26
- <!-- 背景层 -->
27
- <view
28
- class="header-background"
29
- :style="{ background: `linear-gradient(160deg, ${currentThemeColor.primary} 0%, ${currentThemeColor.primary}dd 50%, ${currentThemeColor.primary}aa 100%)` }"
30
- >
31
- <!-- 装饰背景元素 -->
32
- <view class="header-bg-pattern" />
33
- <view class="header-bg-dots" />
34
- <view class="header-bg-glow" />
35
-
36
- <!-- 用户信息区域 -->
37
- <view class="user-section">
38
- <view class="user-info">
39
- <view class="avatar-wrapper">
40
- <image class="user-avatar" src="../../static/hader.png" mode="aspectFill" />
41
- <!-- <view class="avatar-status" /> -->
42
- <view class="avatar-ring" />
43
- </view>
44
- <view class="user-details">
45
- <view class="greeting-text">
46
- <text class="greeting-label">
47
- 欢迎回来,
48
- </text>
49
- <text class="user-name">
50
- {{ user.name }}
51
- </text>
52
- </view>
53
- <view class="date-badge">
54
- <text class="i-carbon:calendar text-sm" />
55
- <text class="date-text">
56
- {{ formatChineseDate() }}
57
- </text>
58
- <!-- <view class="date-divider" />
59
- <text class="i-carbon:time text-sm" />
60
- <text class="work-status">
61
- 工作中
62
- </text> -->
63
- </view>
64
- </view>
65
- </view>
66
- </view>
67
-
68
- <!-- 统计卡片区域 -->
69
- <view class="stats-section">
70
- <view class="stats-card">
71
- <view class="stat-item">
72
- <view class="stat-icon-wrapper blue">
73
- <text class="i-carbon:notification text-lg" />
74
- </view>
75
- <view class="stat-info">
76
- <text class="stat-value">
77
- {{ messageBar?.count }}
78
- </text>
79
- <text class="stat-label">
80
- 新消息
81
- </text>
82
- </view>
83
- </view>
84
- <!-- <view class="stat-divider" v-if="quickPanelcomputed.length > 0" /> -->
85
- <view v-for="item in quickPanelcomputed" :key="item.id" class="stat-item">
86
- <view class="stat-icon-wrapper orange">
87
- <text class="i-carbon:document text-lg" />
88
- </view>
89
- <view class="stat-info">
90
- <text class="stat-value">
91
- {{ item.count }}
92
- </text>
93
- <text class="stat-label">
94
- {{ item.title }}
95
- </text>
96
- </view>
97
- </view>
98
- </view>
99
- </view>
100
- </view>
101
-
102
- <!-- 装饰元素 -->
103
- <view class="dashboard-illustration">
104
- <view class="illustration-circle circle-1" />
105
- <view class="illustration-circle circle-2" />
106
- <view class="illustration-circle circle-3" />
107
- <view class="illustration-hexagon" />
108
- <view class="illustration-line line-1" />
109
- <view class="illustration-line line-2" />
110
- </view>
111
-
112
- <!-- 快捷入口区域 -->
113
- <!-- <view class="quick-actions">
114
- <view class="quick-action-item" style="animation-delay: 0.1s">
115
- <view class="blue quick-icon">
116
- <text class="i-carbon:add text-xl" />
117
- </view>
118
- <text class="quick-label">
119
- 新建
120
- </text>
121
- </view>
122
- <view class="quick-action-item" style="animation-delay: 0.2s">
123
- <view class="quick-icon purple">
124
- <text class="i-carbon:search text-xl" />
125
- </view>
126
- <text class="quick-label">
127
- 查询
128
- </text>
129
- </view>
130
- <view class="quick-action-item" style="animation-delay: 0.3s">
131
- <view class="quick-icon teal">
132
- <text class="i-carbon:chart-pie text-xl" />
133
- </view>
134
- <text class="quick-label">
135
- 报表
136
- </text>
137
- </view>
138
- <view class="quick-action-item" style="animation-delay: 0.4s">
139
- <view class="quick-icon rose">
140
- <text class="i-carbon:settings text-xl" />
141
- </view>
142
- <text class="quick-label">
143
- 设置
144
- </text>
145
- </view>
146
- </view> -->
147
- </view>
148
- </template>
149
-
150
- <style lang="scss" scoped>
151
- // 头部容器
152
- .header-container {
153
- position: relative;
154
- overflow: hidden;
155
- padding-bottom: 24rpx;
156
- }
157
-
158
- // 背景层
159
- .header-background {
160
- position: relative;
161
- z-index: 0;
162
- // min-height: 380rpx;
163
- width: 100%;
164
- box-sizing: border-box;
165
- padding: 48rpx 32rpx;
166
- border-radius: 0 0 48rpx 48rpx;
167
- // box-shadow:
168
- // 0 12rpx 40rpx rgba(0, 0, 0, 0.12),
169
- // 0 4rpx 12rpx rgba(0, 0, 0, 0.08),
170
- // inset 0 1rpx 0 rgba(255, 255, 255, 0.25);
171
- overflow: hidden;
172
- }
173
-
174
- // 背景纹理 - 网格点阵
175
- .header-bg-pattern {
176
- position: absolute;
177
- top: 0;
178
- left: 0;
179
- right: 0;
180
- bottom: 0;
181
- background-image:
182
- radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.15) 0%, transparent 50%),
183
- radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 40%),
184
- radial-gradient(circle at 60% 60%, rgba(255, 255, 255, 0.08) 0%, transparent 30%);
185
- pointer-events: none;
186
- }
187
-
188
- // 点阵装饰
189
- .header-bg-dots {
190
- position: absolute;
191
- top: 0;
192
- left: 0;
193
- right: 0;
194
- bottom: 0;
195
- background-image: radial-gradient(rgba(255, 255, 255, 0.15) 1rpx, transparent 1rpx);
196
- background-size: 24rpx 24rpx;
197
- opacity: 0.5;
198
- pointer-events: none;
199
- }
200
-
201
- // 光晕效果
202
- .header-bg-glow {
203
- position: absolute;
204
- top: -100rpx;
205
- right: -100rpx;
206
- width: 400rpx;
207
- height: 400rpx;
208
- background: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0%, transparent 70%);
209
- pointer-events: none;
210
- }
211
-
212
- // 用户信息区域
213
- .user-section {
214
- position: relative;
215
- z-index: 1;
216
- }
217
-
218
- .user-info {
219
- display: flex;
220
- align-items: center;
221
- gap: 28rpx;
222
- }
223
-
224
- // 头像包装器
225
- .avatar-wrapper {
226
- position: relative;
227
- flex-shrink: 0;
228
- }
229
-
230
- .user-avatar {
231
- width: 108rpx;
232
- height: 108rpx;
233
- border-radius: 50%;
234
- border: 4rpx solid rgba(255, 255, 255, 0.95);
235
- box-shadow:
236
- 0 8rpx 24rpx rgba(0, 0, 0, 0.2),
237
- 0 0 0 6rpx rgba(255, 255, 255, 0.15),
238
- inset 0 2rpx 4rpx rgba(255, 255, 255, 0.3);
239
- object-fit: cover;
240
- transition: transform 0.3s ease;
241
- }
242
-
243
- .avatar-status {
244
- position: absolute;
245
- bottom: 4rpx;
246
- right: 4rpx;
247
- width: 24rpx;
248
- height: 24rpx;
249
- background: linear-gradient(135deg, #10b981, #059669);
250
- border-radius: 50%;
251
- border: 3rpx solid rgba(255, 255, 255, 0.95);
252
- box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.2);
253
- z-index: 2;
254
- }
255
-
256
- .avatar-ring {
257
- position: absolute;
258
- top: -7rpx;
259
- left: -7rpx;
260
- right: -7rpx;
261
- bottom: -7rpx;
262
- border-radius: 50%;
263
- border: 2rpx solid rgba(255, 255, 255, 0.25);
264
- animation: pulse 3s ease-in-out infinite;
265
- }
266
-
267
- // 用户详情
268
- .user-details {
269
- display: flex;
270
- flex-direction: column;
271
- gap: 16rpx;
272
- }
273
-
274
- .greeting-text {
275
- display: flex;
276
- align-items: baseline;
277
- gap: 12rpx;
278
- flex-wrap: wrap;
279
- }
280
-
281
- .greeting-label {
282
- font-size: 26rpx;
283
- color: rgba(255, 255, 255, 0.8);
284
- font-weight: 400;
285
- letter-spacing: 0.02em;
286
- }
287
-
288
- .user-name {
289
- font-size: 40rpx;
290
- color: #fff;
291
- font-weight: 700;
292
- text-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.15);
293
- letter-spacing: 0.02em;
294
- }
295
-
296
- // 日期徽章
297
- .date-badge {
298
- display: inline-flex;
299
- align-items: center;
300
- gap: 10rpx;
301
- padding: 10rpx 20rpx;
302
- background: rgba(255, 255, 255, 0.18);
303
- backdrop-filter: blur(12rpx);
304
- -webkit-backdrop-filter: blur(12rpx);
305
- border-radius: 32rpx;
306
- border: 1rpx solid rgba(255, 255, 255, 0.25);
307
- color: rgba(255, 255, 255, 0.95);
308
- }
309
-
310
- .date-text {
311
- font-size: 22rpx;
312
- font-weight: 500;
313
- }
314
-
315
- .date-divider {
316
- width: 1rpx;
317
- height: 20rpx;
318
- background: rgba(255, 255, 255, 0.4);
319
- margin: 0 4rpx;
320
- }
321
-
322
- .work-status {
323
- font-size: 22rpx;
324
- font-weight: 500;
325
- color: rgba(255, 255, 255, 0.95);
326
- }
327
-
328
- // 统计卡片区域
329
- .stats-section {
330
- // position: absolute;
331
- // bottom: 30rpx;
332
- // left: 32rpx;
333
- // right: 32rpx;
334
- padding-top: 32rpx ;
335
- z-index: 10;
336
- }
337
-
338
- .stats-card {
339
- display: flex;
340
- align-items: center;
341
- justify-content: space-between;
342
- background: rgba(255, 255, 255, 0.98);
343
- border-radius: 24rpx;
344
- padding: 28rpx 20rpx;
345
- box-shadow:
346
- 0 8rpx 32rpx rgba(0, 0, 0, 0.1),
347
- 0 2rpx 8rpx rgba(0, 0, 0, 0.06),
348
- inset 0 1rpx 0 rgba(255, 255, 255, 1);
349
- backdrop-filter: blur(20rpx);
350
- -webkit-backdrop-filter: blur(20rpx);
351
- border: 1rpx solid rgba(255, 255, 255, 0.8);
352
- animation: slideUp 0.6s ease-out 0.3s both;
353
- }
354
-
355
- .stat-item {
356
- flex: 1;
357
- display: flex;
358
- align-items: center;
359
- gap: 16rpx;
360
- padding: 0 16rpx;
361
- }
362
-
363
- .stat-icon-wrapper {
364
- width: 72rpx;
365
- height: 72rpx;
366
- border-radius: 18rpx;
367
- display: flex;
368
- align-items: center;
369
- justify-content: center;
370
- flex-shrink: 0;
371
- transition: transform 0.2s ease;
372
-
373
- &.blue {
374
- background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
375
- color: #fff;
376
- box-shadow: 0 4rpx 16rpx rgba(59, 130, 246, 0.35);
377
- }
378
-
379
- &.orange {
380
- background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
381
- color: #fff;
382
- box-shadow: 0 4rpx 16rpx rgba(245, 158, 11, 0.35);
383
- }
384
-
385
- &.green {
386
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
387
- color: #fff;
388
- box-shadow: 0 4rpx 16rpx rgba(16, 185, 129, 0.35);
389
- }
390
-
391
- &:active {
392
- transform: scale(0.95);
393
- }
394
- }
395
-
396
- .stat-info {
397
- display: flex;
398
- flex-direction: column;
399
- gap: 4rpx;
400
- }
401
-
402
- .stat-value {
403
- font-size: 36rpx;
404
- font-weight: 700;
405
- color: #1f2937;
406
- line-height: 1;
407
- }
408
-
409
- .stat-label {
410
- font-size: 22rpx;
411
- color: #6b7280;
412
- font-weight: 500;
413
- }
414
-
415
- .stat-divider {
416
- width: 1rpx;
417
- height: 60rpx;
418
- background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.1), transparent);
419
- }
420
-
421
- // 快捷入口区域
422
- .quick-actions {
423
- display: flex;
424
- justify-content: space-between;
425
- padding: 40rpx 40rpx 24rpx;
426
- gap: 20rpx;
427
- }
428
-
429
- .quick-action-item {
430
- display: flex;
431
- flex-direction: column;
432
- align-items: center;
433
- gap: 12rpx;
434
- animation: fadeInScale 0.5s ease-out backwards;
435
- transition: transform 0.2s ease;
436
-
437
- &:active {
438
- transform: scale(0.95);
439
- }
440
- }
441
-
442
- .quick-icon {
443
- width: 100rpx;
444
- height: 100rpx;
445
- border-radius: 28rpx;
446
- display: flex;
447
- align-items: center;
448
- justify-content: center;
449
- transition: all 0.3s ease;
450
-
451
- &.blue {
452
- background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);
453
- color: #3b82f6;
454
- box-shadow:
455
- 0 4rpx 16rpx rgba(59, 130, 246, 0.2),
456
- inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
457
- }
458
-
459
- &.purple {
460
- background: linear-gradient(135deg, #f5f3ff 0%, #ede9fe 100%);
461
- color: #8b5cf6;
462
- box-shadow:
463
- 0 4rpx 16rpx rgba(139, 92, 246, 0.2),
464
- inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
465
- }
466
-
467
- &.teal {
468
- background: linear-gradient(135deg, #f0fdfa 0%, #ccfbf1 100%);
469
- color: #14b8a6;
470
- box-shadow:
471
- 0 4rpx 16rpx rgba(20, 184, 166, 0.2),
472
- inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
473
- }
474
-
475
- &.rose {
476
- background: linear-gradient(135deg, #fff1f2 0%, #ffe4e6 100%);
477
- color: #f43f5e;
478
- box-shadow:
479
- 0 4rpx 16rpx rgba(244, 63, 94, 0.2),
480
- inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
481
- }
482
-
483
- &:active {
484
- transform: scale(0.92);
485
- }
486
- }
487
-
488
- .quick-label {
489
- font-size: 24rpx;
490
- color: #4b5563;
491
- font-weight: 500;
492
- }
493
-
494
- // 装饰插图区域
495
- .dashboard-illustration {
496
- position: absolute;
497
- right: 32rpx;
498
- top: 48rpx;
499
- width: 200rpx;
500
- height: 200rpx;
501
- opacity: 0.6;
502
- pointer-events: none;
503
- z-index: 1;
504
- }
505
-
506
- .illustration-circle {
507
- position: absolute;
508
- border-radius: 50%;
509
- background: rgba(255, 255, 255, 0.12);
510
- backdrop-filter: blur(4rpx);
511
- border: 1rpx solid rgba(255, 255, 255, 0.15);
512
- }
513
-
514
- .circle-1 {
515
- width: 140rpx;
516
- height: 140rpx;
517
- right: 0;
518
- top: 0;
519
- animation: float 6s ease-in-out infinite;
520
- }
521
-
522
- .circle-2 {
523
- width: 70rpx;
524
- height: 70rpx;
525
- left: 0;
526
- bottom: 30rpx;
527
- background: rgba(255, 255, 255, 0.18);
528
- animation: float 4s ease-in-out infinite reverse;
529
- }
530
-
531
- .circle-3 {
532
- width: 36rpx;
533
- height: 36rpx;
534
- right: 50rpx;
535
- bottom: 0;
536
- background: rgba(255, 255, 255, 0.22);
537
- animation: float 5s ease-in-out infinite 1s;
538
- }
539
-
540
- .illustration-hexagon {
541
- position: absolute;
542
- top: 40rpx;
543
- left: 40rpx;
544
- width: 70rpx;
545
- height: 70rpx;
546
- background: linear-gradient(135deg, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1));
547
- clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
548
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
549
- animation: floatHex 10s ease-in-out infinite;
550
- }
551
-
552
- .illustration-line {
553
- position: absolute;
554
- background: rgba(255, 255, 255, 0.2);
555
- border-radius: 2rpx;
556
- }
557
-
558
- .line-1 {
559
- width: 60rpx;
560
- height: 4rpx;
561
- top: 80rpx;
562
- right: 20rpx;
563
- animation: slideLine 3s ease-in-out infinite;
564
- }
565
-
566
- .line-2 {
567
- width: 40rpx;
568
- height: 4rpx;
569
- top: 100rpx;
570
- right: 40rpx;
571
- animation: slideLine 3s ease-in-out infinite 0.5s;
572
- }
573
-
574
- // 动画定义
575
- @keyframes pulse {
576
-
577
- 0%,
578
- 100% {
579
- transform: scale(1);
580
- opacity: 0.4;
581
- }
582
-
583
- 50% {
584
- transform: scale(1.08);
585
- opacity: 0.7;
586
- }
587
- }
588
-
589
- @keyframes float {
590
-
591
- 0%,
592
- 100% {
593
- transform: translateY(0) scale(1);
594
- }
595
-
596
- 50% {
597
- transform: translateY(-20rpx) scale(1.03);
598
- }
599
- }
600
-
601
- @keyframes floatHex {
602
-
603
- 0%,
604
- 100% {
605
- transform: translateY(0) rotate(0deg);
606
- }
607
-
608
- 33% {
609
- transform: translateY(-16rpx) rotate(6deg);
610
- }
611
-
612
- 66% {
613
- transform: translateY(-8rpx) rotate(-4deg);
614
- }
615
- }
616
-
617
- @keyframes slideLine {
618
-
619
- 0%,
620
- 100% {
621
- transform: translateX(0);
622
- opacity: 0.3;
623
- }
624
-
625
- 50% {
626
- transform: translateX(10rpx);
627
- opacity: 0.6;
628
- }
629
- }
630
-
631
- @keyframes slideUp {
632
- from {
633
- opacity: 0;
634
- transform: translateY(30rpx);
635
- }
636
-
637
- to {
638
- opacity: 1;
639
- transform: translateY(0);
640
- }
641
- }
642
-
643
- @keyframes fadeInScale {
644
- from {
645
- opacity: 0;
646
- transform: scale(0.9);
647
- }
648
-
649
- to {
650
- opacity: 1;
651
- transform: scale(1);
652
- }
653
- }
654
-
655
- // 暗黑模式适配
656
- :global(.wot-theme-dark) {
657
- .header-background {
658
- box-shadow:
659
- 0 12rpx 40rpx rgba(0, 0, 0, 0.3),
660
- 0 4rpx 12rpx rgba(0, 0, 0, 0.2),
661
- inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
662
- }
663
-
664
- .stats-card {
665
- background: rgba(30, 30, 35, 0.98);
666
- border-color: rgba(255, 255, 255, 0.08);
667
- box-shadow:
668
- 0 8rpx 32rpx rgba(0, 0, 0, 0.3),
669
- 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
670
- }
671
-
672
- .stat-value {
673
- color: #f3f4f6;
674
- }
675
-
676
- .stat-label {
677
- color: #9ca3af;
678
- }
679
-
680
- .quick-icon {
681
- &.blue {
682
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.2) 0%, rgba(37, 99, 235, 0.15) 100%);
683
- box-shadow:
684
- 0 4rpx 16rpx rgba(59, 130, 246, 0.25),
685
- inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
686
- }
687
-
688
- &.purple {
689
- background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(124, 58, 237, 0.15) 100%);
690
- box-shadow:
691
- 0 4rpx 16rpx rgba(139, 92, 246, 0.25),
692
- inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
693
- }
694
-
695
- &.teal {
696
- background: linear-gradient(135deg, rgba(20, 184, 166, 0.2) 0%, rgba(13, 148, 136, 0.15) 100%);
697
- box-shadow:
698
- 0 4rpx 16rpx rgba(20, 184, 166, 0.25),
699
- inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
700
- }
701
-
702
- &.rose {
703
- background: linear-gradient(135deg, rgba(244, 63, 94, 0.2) 0%, rgba(225, 29, 72, 0.15) 100%);
704
- box-shadow:
705
- 0 4rpx 16rpx rgba(244, 63, 94, 0.25),
706
- inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
707
- }
708
- }
709
-
710
- .quick-label {
711
- color: #d1d5db;
712
- }
713
-
714
- .stat-divider {
715
- background: linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.1), transparent);
716
- }
717
- }
718
- </style>
1
+ <script setup lang="ts">
2
+ import { computed, defineOptions } from 'vue'
3
+ import { useManualTheme } from '../../composables/useManualTheme'
4
+ import { useUser } from '../../composables/useUser'
5
+ import { formatChineseDate } from '../../utils'
6
+ import { useSectionMenus } from '../../composables/useSectionMenus'
7
+
8
+ defineOptions({
9
+ name: 'WuiMenusTop',
10
+ })
11
+
12
+ const user = useUser().getUserInfo()
13
+
14
+ const {
15
+ currentThemeColor,
16
+ } = useManualTheme()
17
+
18
+ const { messageBar, quickPanel } = useSectionMenus()
19
+ const quickPanelcomputed = computed(() => {
20
+ return quickPanel.value.slice(0, 2)
21
+ })
22
+ </script>
23
+
24
+ <template>
25
+ <view class="header-container position-relative">
26
+ <!-- 背景层 -->
27
+ <view
28
+ class="header-background"
29
+ :style="{ background: `linear-gradient(160deg, ${currentThemeColor.primary} 0%, ${currentThemeColor.primary}dd 50%, ${currentThemeColor.primary}aa 100%)` }"
30
+ >
31
+ <!-- 装饰背景元素 -->
32
+ <view class="header-bg-pattern" />
33
+ <view class="header-bg-dots" />
34
+ <view class="header-bg-glow" />
35
+
36
+ <!-- 用户信息区域 -->
37
+ <view class="user-section">
38
+ <view class="user-info">
39
+ <view class="avatar-wrapper">
40
+ <image class="user-avatar" src="../../static/hader.png" mode="aspectFill" />
41
+ <!-- <view class="avatar-status" /> -->
42
+ <view class="avatar-ring" />
43
+ </view>
44
+ <view class="user-details">
45
+ <view class="greeting-text">
46
+ <text class="greeting-label">
47
+ 欢迎回来,
48
+ </text>
49
+ <text class="user-name">
50
+ {{ user.name }}
51
+ </text>
52
+ </view>
53
+ <view class="date-badge">
54
+ <text class="i-carbon:calendar text-sm" />
55
+ <text class="date-text">
56
+ {{ formatChineseDate() }}
57
+ </text>
58
+ <!-- <view class="date-divider" />
59
+ <text class="i-carbon:time text-sm" />
60
+ <text class="work-status">
61
+ 工作中
62
+ </text> -->
63
+ </view>
64
+ </view>
65
+ </view>
66
+ </view>
67
+
68
+ <!-- 统计卡片区域 -->
69
+ <view class="stats-section">
70
+ <view class="stats-card">
71
+ <view class="stat-item">
72
+ <view class="stat-icon-wrapper blue">
73
+ <text class="i-carbon:notification text-lg" />
74
+ </view>
75
+ <view class="stat-info">
76
+ <text class="stat-value">
77
+ {{ messageBar?.count }}
78
+ </text>
79
+ <text class="stat-label">
80
+ 新消息
81
+ </text>
82
+ </view>
83
+ </view>
84
+ <!-- <view class="stat-divider" v-if="quickPanelcomputed.length > 0" /> -->
85
+ <view v-for="item in quickPanelcomputed" :key="item.id" class="stat-item">
86
+ <view class="stat-icon-wrapper orange">
87
+ <text class="i-carbon:document text-lg" />
88
+ </view>
89
+ <view class="stat-info">
90
+ <text class="stat-value">
91
+ {{ item.count }}
92
+ </text>
93
+ <text class="stat-label">
94
+ {{ item.title }}
95
+ </text>
96
+ </view>
97
+ </view>
98
+ </view>
99
+ </view>
100
+ </view>
101
+
102
+ <!-- 装饰元素 -->
103
+ <view class="dashboard-illustration">
104
+ <view class="illustration-circle circle-1" />
105
+ <view class="illustration-circle circle-2" />
106
+ <view class="illustration-circle circle-3" />
107
+ <view class="illustration-hexagon" />
108
+ <view class="illustration-line line-1" />
109
+ <view class="illustration-line line-2" />
110
+ </view>
111
+
112
+ <!-- 快捷入口区域 -->
113
+ <!-- <view class="quick-actions">
114
+ <view class="quick-action-item" style="animation-delay: 0.1s">
115
+ <view class="blue quick-icon">
116
+ <text class="i-carbon:add text-xl" />
117
+ </view>
118
+ <text class="quick-label">
119
+ 新建
120
+ </text>
121
+ </view>
122
+ <view class="quick-action-item" style="animation-delay: 0.2s">
123
+ <view class="quick-icon purple">
124
+ <text class="i-carbon:search text-xl" />
125
+ </view>
126
+ <text class="quick-label">
127
+ 查询
128
+ </text>
129
+ </view>
130
+ <view class="quick-action-item" style="animation-delay: 0.3s">
131
+ <view class="quick-icon teal">
132
+ <text class="i-carbon:chart-pie text-xl" />
133
+ </view>
134
+ <text class="quick-label">
135
+ 报表
136
+ </text>
137
+ </view>
138
+ <view class="quick-action-item" style="animation-delay: 0.4s">
139
+ <view class="quick-icon rose">
140
+ <text class="i-carbon:settings text-xl" />
141
+ </view>
142
+ <text class="quick-label">
143
+ 设置
144
+ </text>
145
+ </view>
146
+ </view> -->
147
+ </view>
148
+ </template>
149
+
150
+ <style lang="scss" scoped>
151
+ // 头部容器
152
+ .header-container {
153
+ position: relative;
154
+ overflow: hidden;
155
+ padding-bottom: 24rpx;
156
+ }
157
+
158
+ // 背景层
159
+ .header-background {
160
+ position: relative;
161
+ z-index: 0;
162
+ // min-height: 380rpx;
163
+ width: 100%;
164
+ box-sizing: border-box;
165
+ padding: 48rpx 32rpx;
166
+ border-radius: 0 0 48rpx 48rpx;
167
+ // box-shadow:
168
+ // 0 12rpx 40rpx rgba(0, 0, 0, 0.12),
169
+ // 0 4rpx 12rpx rgba(0, 0, 0, 0.08),
170
+ // inset 0 1rpx 0 rgba(255, 255, 255, 0.25);
171
+ overflow: hidden;
172
+ }
173
+
174
+ // 背景纹理 - 网格点阵
175
+ .header-bg-pattern {
176
+ position: absolute;
177
+ top: 0;
178
+ left: 0;
179
+ right: 0;
180
+ bottom: 0;
181
+ background-image:
182
+ radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.15) 0%, transparent 50%),
183
+ radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 40%),
184
+ radial-gradient(circle at 60% 60%, rgba(255, 255, 255, 0.08) 0%, transparent 30%);
185
+ pointer-events: none;
186
+ }
187
+
188
+ // 点阵装饰
189
+ .header-bg-dots {
190
+ position: absolute;
191
+ top: 0;
192
+ left: 0;
193
+ right: 0;
194
+ bottom: 0;
195
+ background-image: radial-gradient(rgba(255, 255, 255, 0.15) 1rpx, transparent 1rpx);
196
+ background-size: 24rpx 24rpx;
197
+ opacity: 0.5;
198
+ pointer-events: none;
199
+ }
200
+
201
+ // 光晕效果
202
+ .header-bg-glow {
203
+ position: absolute;
204
+ top: -100rpx;
205
+ right: -100rpx;
206
+ width: 400rpx;
207
+ height: 400rpx;
208
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0%, transparent 70%);
209
+ pointer-events: none;
210
+ }
211
+
212
+ // 用户信息区域
213
+ .user-section {
214
+ position: relative;
215
+ z-index: 1;
216
+ }
217
+
218
+ .user-info {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 28rpx;
222
+ }
223
+
224
+ // 头像包装器
225
+ .avatar-wrapper {
226
+ position: relative;
227
+ flex-shrink: 0;
228
+ }
229
+
230
+ .user-avatar {
231
+ width: 108rpx;
232
+ height: 108rpx;
233
+ border-radius: 50%;
234
+ border: 4rpx solid rgba(255, 255, 255, 0.95);
235
+ box-shadow:
236
+ 0 8rpx 24rpx rgba(0, 0, 0, 0.2),
237
+ 0 0 0 6rpx rgba(255, 255, 255, 0.15),
238
+ inset 0 2rpx 4rpx rgba(255, 255, 255, 0.3);
239
+ object-fit: cover;
240
+ transition: transform 0.3s ease;
241
+ }
242
+
243
+ .avatar-status {
244
+ position: absolute;
245
+ bottom: 4rpx;
246
+ right: 4rpx;
247
+ width: 24rpx;
248
+ height: 24rpx;
249
+ background: linear-gradient(135deg, #10b981, #059669);
250
+ border-radius: 50%;
251
+ border: 3rpx solid rgba(255, 255, 255, 0.95);
252
+ box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.2);
253
+ z-index: 2;
254
+ }
255
+
256
+ .avatar-ring {
257
+ position: absolute;
258
+ top: -7rpx;
259
+ left: -7rpx;
260
+ right: -7rpx;
261
+ bottom: -7rpx;
262
+ border-radius: 50%;
263
+ border: 2rpx solid rgba(255, 255, 255, 0.25);
264
+ animation: pulse 3s ease-in-out infinite;
265
+ }
266
+
267
+ // 用户详情
268
+ .user-details {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 16rpx;
272
+ }
273
+
274
+ .greeting-text {
275
+ display: flex;
276
+ align-items: baseline;
277
+ gap: 12rpx;
278
+ flex-wrap: wrap;
279
+ }
280
+
281
+ .greeting-label {
282
+ font-size: 26rpx;
283
+ color: rgba(255, 255, 255, 0.8);
284
+ font-weight: 400;
285
+ letter-spacing: 0.02em;
286
+ }
287
+
288
+ .user-name {
289
+ font-size: 40rpx;
290
+ color: #fff;
291
+ font-weight: 700;
292
+ text-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.15);
293
+ letter-spacing: 0.02em;
294
+ }
295
+
296
+ // 日期徽章
297
+ .date-badge {
298
+ display: inline-flex;
299
+ align-items: center;
300
+ gap: 10rpx;
301
+ padding: 10rpx 20rpx;
302
+ background: rgba(255, 255, 255, 0.18);
303
+ backdrop-filter: blur(12rpx);
304
+ -webkit-backdrop-filter: blur(12rpx);
305
+ border-radius: 32rpx;
306
+ border: 1rpx solid rgba(255, 255, 255, 0.25);
307
+ color: rgba(255, 255, 255, 0.95);
308
+ }
309
+
310
+ .date-text {
311
+ font-size: 22rpx;
312
+ font-weight: 500;
313
+ }
314
+
315
+ .date-divider {
316
+ width: 1rpx;
317
+ height: 20rpx;
318
+ background: rgba(255, 255, 255, 0.4);
319
+ margin: 0 4rpx;
320
+ }
321
+
322
+ .work-status {
323
+ font-size: 22rpx;
324
+ font-weight: 500;
325
+ color: rgba(255, 255, 255, 0.95);
326
+ }
327
+
328
+ // 统计卡片区域
329
+ .stats-section {
330
+ // position: absolute;
331
+ // bottom: 30rpx;
332
+ // left: 32rpx;
333
+ // right: 32rpx;
334
+ padding-top: 32rpx ;
335
+ z-index: 10;
336
+ }
337
+
338
+ .stats-card {
339
+ display: flex;
340
+ align-items: center;
341
+ justify-content: space-between;
342
+ background: rgba(255, 255, 255, 0.98);
343
+ border-radius: 24rpx;
344
+ padding: 28rpx 20rpx;
345
+ box-shadow:
346
+ 0 8rpx 32rpx rgba(0, 0, 0, 0.1),
347
+ 0 2rpx 8rpx rgba(0, 0, 0, 0.06),
348
+ inset 0 1rpx 0 rgba(255, 255, 255, 1);
349
+ backdrop-filter: blur(20rpx);
350
+ -webkit-backdrop-filter: blur(20rpx);
351
+ border: 1rpx solid rgba(255, 255, 255, 0.8);
352
+ animation: slideUp 0.6s ease-out 0.3s both;
353
+ }
354
+
355
+ .stat-item {
356
+ flex: 1;
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 16rpx;
360
+ padding: 0 16rpx;
361
+ }
362
+
363
+ .stat-icon-wrapper {
364
+ width: 72rpx;
365
+ height: 72rpx;
366
+ border-radius: 18rpx;
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ flex-shrink: 0;
371
+ transition: transform 0.2s ease;
372
+
373
+ &.blue {
374
+ background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
375
+ color: #fff;
376
+ box-shadow: 0 4rpx 16rpx rgba(59, 130, 246, 0.35);
377
+ }
378
+
379
+ &.orange {
380
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
381
+ color: #fff;
382
+ box-shadow: 0 4rpx 16rpx rgba(245, 158, 11, 0.35);
383
+ }
384
+
385
+ &.green {
386
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
387
+ color: #fff;
388
+ box-shadow: 0 4rpx 16rpx rgba(16, 185, 129, 0.35);
389
+ }
390
+
391
+ &:active {
392
+ transform: scale(0.95);
393
+ }
394
+ }
395
+
396
+ .stat-info {
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: 4rpx;
400
+ }
401
+
402
+ .stat-value {
403
+ font-size: 36rpx;
404
+ font-weight: 700;
405
+ color: #1f2937;
406
+ line-height: 1;
407
+ }
408
+
409
+ .stat-label {
410
+ font-size: 22rpx;
411
+ color: #6b7280;
412
+ font-weight: 500;
413
+ }
414
+
415
+ .stat-divider {
416
+ width: 1rpx;
417
+ height: 60rpx;
418
+ background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.1), transparent);
419
+ }
420
+
421
+ // 快捷入口区域
422
+ .quick-actions {
423
+ display: flex;
424
+ justify-content: space-between;
425
+ padding: 40rpx 40rpx 24rpx;
426
+ gap: 20rpx;
427
+ }
428
+
429
+ .quick-action-item {
430
+ display: flex;
431
+ flex-direction: column;
432
+ align-items: center;
433
+ gap: 12rpx;
434
+ animation: fadeInScale 0.5s ease-out backwards;
435
+ transition: transform 0.2s ease;
436
+
437
+ &:active {
438
+ transform: scale(0.95);
439
+ }
440
+ }
441
+
442
+ .quick-icon {
443
+ width: 100rpx;
444
+ height: 100rpx;
445
+ border-radius: 28rpx;
446
+ display: flex;
447
+ align-items: center;
448
+ justify-content: center;
449
+ transition: all 0.3s ease;
450
+
451
+ &.blue {
452
+ background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);
453
+ color: #3b82f6;
454
+ box-shadow:
455
+ 0 4rpx 16rpx rgba(59, 130, 246, 0.2),
456
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
457
+ }
458
+
459
+ &.purple {
460
+ background: linear-gradient(135deg, #f5f3ff 0%, #ede9fe 100%);
461
+ color: #8b5cf6;
462
+ box-shadow:
463
+ 0 4rpx 16rpx rgba(139, 92, 246, 0.2),
464
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
465
+ }
466
+
467
+ &.teal {
468
+ background: linear-gradient(135deg, #f0fdfa 0%, #ccfbf1 100%);
469
+ color: #14b8a6;
470
+ box-shadow:
471
+ 0 4rpx 16rpx rgba(20, 184, 166, 0.2),
472
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
473
+ }
474
+
475
+ &.rose {
476
+ background: linear-gradient(135deg, #fff1f2 0%, #ffe4e6 100%);
477
+ color: #f43f5e;
478
+ box-shadow:
479
+ 0 4rpx 16rpx rgba(244, 63, 94, 0.2),
480
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
481
+ }
482
+
483
+ &:active {
484
+ transform: scale(0.92);
485
+ }
486
+ }
487
+
488
+ .quick-label {
489
+ font-size: 24rpx;
490
+ color: #4b5563;
491
+ font-weight: 500;
492
+ }
493
+
494
+ // 装饰插图区域
495
+ .dashboard-illustration {
496
+ position: absolute;
497
+ right: 32rpx;
498
+ top: 48rpx;
499
+ width: 200rpx;
500
+ height: 200rpx;
501
+ opacity: 0.6;
502
+ pointer-events: none;
503
+ z-index: 1;
504
+ }
505
+
506
+ .illustration-circle {
507
+ position: absolute;
508
+ border-radius: 50%;
509
+ background: rgba(255, 255, 255, 0.12);
510
+ backdrop-filter: blur(4rpx);
511
+ border: 1rpx solid rgba(255, 255, 255, 0.15);
512
+ }
513
+
514
+ .circle-1 {
515
+ width: 140rpx;
516
+ height: 140rpx;
517
+ right: 0;
518
+ top: 0;
519
+ animation: float 6s ease-in-out infinite;
520
+ }
521
+
522
+ .circle-2 {
523
+ width: 70rpx;
524
+ height: 70rpx;
525
+ left: 0;
526
+ bottom: 30rpx;
527
+ background: rgba(255, 255, 255, 0.18);
528
+ animation: float 4s ease-in-out infinite reverse;
529
+ }
530
+
531
+ .circle-3 {
532
+ width: 36rpx;
533
+ height: 36rpx;
534
+ right: 50rpx;
535
+ bottom: 0;
536
+ background: rgba(255, 255, 255, 0.22);
537
+ animation: float 5s ease-in-out infinite 1s;
538
+ }
539
+
540
+ .illustration-hexagon {
541
+ position: absolute;
542
+ top: 40rpx;
543
+ left: 40rpx;
544
+ width: 70rpx;
545
+ height: 70rpx;
546
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1));
547
+ clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
548
+ box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
549
+ animation: floatHex 10s ease-in-out infinite;
550
+ }
551
+
552
+ .illustration-line {
553
+ position: absolute;
554
+ background: rgba(255, 255, 255, 0.2);
555
+ border-radius: 2rpx;
556
+ }
557
+
558
+ .line-1 {
559
+ width: 60rpx;
560
+ height: 4rpx;
561
+ top: 80rpx;
562
+ right: 20rpx;
563
+ animation: slideLine 3s ease-in-out infinite;
564
+ }
565
+
566
+ .line-2 {
567
+ width: 40rpx;
568
+ height: 4rpx;
569
+ top: 100rpx;
570
+ right: 40rpx;
571
+ animation: slideLine 3s ease-in-out infinite 0.5s;
572
+ }
573
+
574
+ // 动画定义
575
+ @keyframes pulse {
576
+
577
+ 0%,
578
+ 100% {
579
+ transform: scale(1);
580
+ opacity: 0.4;
581
+ }
582
+
583
+ 50% {
584
+ transform: scale(1.08);
585
+ opacity: 0.7;
586
+ }
587
+ }
588
+
589
+ @keyframes float {
590
+
591
+ 0%,
592
+ 100% {
593
+ transform: translateY(0) scale(1);
594
+ }
595
+
596
+ 50% {
597
+ transform: translateY(-20rpx) scale(1.03);
598
+ }
599
+ }
600
+
601
+ @keyframes floatHex {
602
+
603
+ 0%,
604
+ 100% {
605
+ transform: translateY(0) rotate(0deg);
606
+ }
607
+
608
+ 33% {
609
+ transform: translateY(-16rpx) rotate(6deg);
610
+ }
611
+
612
+ 66% {
613
+ transform: translateY(-8rpx) rotate(-4deg);
614
+ }
615
+ }
616
+
617
+ @keyframes slideLine {
618
+
619
+ 0%,
620
+ 100% {
621
+ transform: translateX(0);
622
+ opacity: 0.3;
623
+ }
624
+
625
+ 50% {
626
+ transform: translateX(10rpx);
627
+ opacity: 0.6;
628
+ }
629
+ }
630
+
631
+ @keyframes slideUp {
632
+ from {
633
+ opacity: 0;
634
+ transform: translateY(30rpx);
635
+ }
636
+
637
+ to {
638
+ opacity: 1;
639
+ transform: translateY(0);
640
+ }
641
+ }
642
+
643
+ @keyframes fadeInScale {
644
+ from {
645
+ opacity: 0;
646
+ transform: scale(0.9);
647
+ }
648
+
649
+ to {
650
+ opacity: 1;
651
+ transform: scale(1);
652
+ }
653
+ }
654
+
655
+ // 暗黑模式适配
656
+ :global(.wot-theme-dark) {
657
+ .header-background {
658
+ box-shadow:
659
+ 0 12rpx 40rpx rgba(0, 0, 0, 0.3),
660
+ 0 4rpx 12rpx rgba(0, 0, 0, 0.2),
661
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
662
+ }
663
+
664
+ .stats-card {
665
+ background: rgba(30, 30, 35, 0.98);
666
+ border-color: rgba(255, 255, 255, 0.08);
667
+ box-shadow:
668
+ 0 8rpx 32rpx rgba(0, 0, 0, 0.3),
669
+ 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
670
+ }
671
+
672
+ .stat-value {
673
+ color: #f3f4f6;
674
+ }
675
+
676
+ .stat-label {
677
+ color: #9ca3af;
678
+ }
679
+
680
+ .quick-icon {
681
+ &.blue {
682
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.2) 0%, rgba(37, 99, 235, 0.15) 100%);
683
+ box-shadow:
684
+ 0 4rpx 16rpx rgba(59, 130, 246, 0.25),
685
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
686
+ }
687
+
688
+ &.purple {
689
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(124, 58, 237, 0.15) 100%);
690
+ box-shadow:
691
+ 0 4rpx 16rpx rgba(139, 92, 246, 0.25),
692
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
693
+ }
694
+
695
+ &.teal {
696
+ background: linear-gradient(135deg, rgba(20, 184, 166, 0.2) 0%, rgba(13, 148, 136, 0.15) 100%);
697
+ box-shadow:
698
+ 0 4rpx 16rpx rgba(20, 184, 166, 0.25),
699
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
700
+ }
701
+
702
+ &.rose {
703
+ background: linear-gradient(135deg, rgba(244, 63, 94, 0.2) 0%, rgba(225, 29, 72, 0.15) 100%);
704
+ box-shadow:
705
+ 0 4rpx 16rpx rgba(244, 63, 94, 0.25),
706
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
707
+ }
708
+ }
709
+
710
+ .quick-label {
711
+ color: #d1d5db;
712
+ }
713
+
714
+ .stat-divider {
715
+ background: linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.1), transparent);
716
+ }
717
+ }
718
+ </style>