weifuwu 0.36.2 → 0.38.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.
Files changed (51) hide show
  1. package/README.md +141 -3
  2. package/dist/client/app.d.ts +4 -7
  3. package/dist/client/confirm.d.ts +26 -0
  4. package/dist/client/focus-trap.d.ts +4 -0
  5. package/dist/client/i18n.d.ts +27 -0
  6. package/dist/client/index.d.ts +8 -0
  7. package/dist/client/index.js +322 -60
  8. package/dist/client/locale/en_US.d.ts +34 -0
  9. package/dist/client/locale/zh_CN.d.ts +34 -0
  10. package/dist/client/scroll-lock.d.ts +5 -0
  11. package/dist/components/Accordion/Accordion.d.ts +11 -0
  12. package/dist/components/Alert/Alert.d.ts +9 -0
  13. package/dist/components/Avatar/Avatar.d.ts +7 -0
  14. package/dist/components/Badge/Badge.d.ts +8 -0
  15. package/dist/components/Breadcrumb/Breadcrumb.d.ts +9 -0
  16. package/dist/components/Button/Button.d.ts +12 -0
  17. package/dist/components/Card/Card.d.ts +9 -0
  18. package/dist/components/Checkbox/Checkbox.d.ts +8 -0
  19. package/dist/components/Divider/Divider.d.ts +6 -0
  20. package/dist/components/Drawer/Drawer.d.ts +14 -0
  21. package/dist/components/Dropdown/Dropdown.d.ts +14 -0
  22. package/dist/components/EmptyState/EmptyState.d.ts +8 -0
  23. package/dist/components/Field/Field.d.ts +9 -0
  24. package/dist/components/FileUpload/FileUpload.d.ts +13 -0
  25. package/dist/components/Form/Form.d.ts +6 -0
  26. package/dist/components/Img/Img.d.ts +17 -0
  27. package/dist/components/Input/Input.d.ts +14 -0
  28. package/dist/components/Loading/Loading.d.ts +5 -0
  29. package/dist/components/Modal/Modal.d.ts +12 -0
  30. package/dist/components/PageHeader/PageHeader.d.ts +7 -0
  31. package/dist/components/Pagination/Pagination.d.ts +8 -0
  32. package/dist/components/Popover/Popover.d.ts +26 -0
  33. package/dist/components/ProgressBar/ProgressBar.d.ts +8 -0
  34. package/dist/components/RadioGroup/RadioGroup.d.ts +14 -0
  35. package/dist/components/SearchInput/SearchInput.d.ts +8 -0
  36. package/dist/components/Select/Select.d.ts +18 -0
  37. package/dist/components/Skeleton/Skeleton.d.ts +21 -0
  38. package/dist/components/Slider/Slider.d.ts +10 -0
  39. package/dist/components/StatCard/StatCard.d.ts +9 -0
  40. package/dist/components/Steps/Steps.d.ts +12 -0
  41. package/dist/components/Switch/Switch.d.ts +8 -0
  42. package/dist/components/Table/Table.d.ts +13 -0
  43. package/dist/components/Tabs/Tabs.d.ts +12 -0
  44. package/dist/components/Tag/Tag.d.ts +8 -0
  45. package/dist/components/Textarea/Textarea.d.ts +13 -0
  46. package/dist/components/Toast/Toast.d.ts +12 -0
  47. package/dist/components/Tooltip/Tooltip.d.ts +9 -0
  48. package/dist/components/index.d.ts +81 -0
  49. package/dist/components/index.js +1064 -0
  50. package/dist/components/style.css +2005 -0
  51. package/package.json +7 -2
@@ -0,0 +1,2005 @@
1
+ /* weifuwu/components — Button */
2
+ /* 所有颜色/间距/字号引用 layout 的 --wf-* 变量,不硬编码 */
3
+
4
+ .wf-btn {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ gap: var(--wf-gap-xs);
9
+ font-family: var(--wf-font-sans);
10
+ font-size: var(--wf-font-size-sm);
11
+ font-weight: var(--wf-font-weight-medium);
12
+ padding: var(--wf-space-sm) var(--wf-space-md);
13
+ border-radius: var(--wf-radius);
14
+ border: var(--wf-border-width) solid transparent;
15
+ cursor: pointer;
16
+ transition: all var(--wf-transition);
17
+ line-height: 1;
18
+ white-space: nowrap;
19
+ user-select: none;
20
+ text-decoration: none;
21
+ }
22
+
23
+ .wf-btn--primary { background: var(--wf-color-primary); color: #fff; border-color: var(--wf-color-primary); }
24
+ .wf-btn--primary:hover { background: var(--wf-color-primary-hover); }
25
+
26
+ .wf-btn--secondary { background: var(--wf-color-bg); color: var(--wf-color-text); border-color: var(--wf-color-border); }
27
+ .wf-btn--secondary:hover { border-color: var(--wf-color-primary); color: var(--wf-color-primary); }
28
+
29
+ .wf-btn--ghost { background: transparent; color: var(--wf-color-primary); border-color: transparent; }
30
+ .wf-btn--ghost:hover { background: var(--wf-color-primary-bg); }
31
+
32
+ .wf-btn--danger { background: var(--wf-color-error); color: #fff; border-color: var(--wf-color-error); }
33
+ .wf-btn--danger:hover { opacity: 0.9; }
34
+
35
+ .wf-btn--sm { padding: var(--wf-space-xs) var(--wf-space-sm); font-size: var(--wf-font-size-xs); }
36
+ .wf-btn--lg { padding: var(--wf-space) var(--wf-space-lg); font-size: var(--wf-font-size-base); }
37
+
38
+ .wf-btn--block { display: flex; width: 100%; }
39
+
40
+ .wf-btn--loading { opacity: 0.7; pointer-events: none; }
41
+
42
+ .wf-btn:disabled { opacity: var(--wf-opacity-disabled); cursor: not-allowed; }
43
+
44
+ /* weifuwu/components — Input */
45
+
46
+ .wf-input-wrap {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: var(--wf-gap-xs);
50
+ }
51
+
52
+ .wf-input-label {
53
+ font-size: var(--wf-font-size-sm);
54
+ font-weight: var(--wf-font-weight-medium);
55
+ color: var(--wf-color-text);
56
+ }
57
+
58
+ .wf-input-req {
59
+ color: var(--wf-color-error);
60
+ margin-left: 2px;
61
+ }
62
+
63
+ .wf-input {
64
+ font-family: var(--wf-font-sans);
65
+ font-size: var(--wf-font-size-sm);
66
+ padding: var(--wf-space-sm) var(--wf-space);
67
+ border: var(--wf-border-width) solid var(--wf-color-border);
68
+ border-radius: var(--wf-radius);
69
+ background: var(--wf-color-bg);
70
+ color: var(--wf-color-text);
71
+ outline: none;
72
+ transition: all var(--wf-transition);
73
+ width: 100%;
74
+ }
75
+
76
+ .wf-input:focus {
77
+ border-color: var(--wf-color-primary);
78
+ box-shadow: var(--wf-focus-ring);
79
+ }
80
+
81
+ .wf-input:disabled {
82
+ opacity: var(--wf-opacity-disabled);
83
+ cursor: not-allowed;
84
+ }
85
+
86
+ .wf-input::placeholder {
87
+ color: var(--wf-color-text-tertiary);
88
+ }
89
+
90
+ .wf-input-err {
91
+ font-size: var(--wf-font-size-xs);
92
+ color: var(--wf-color-error);
93
+ }
94
+
95
+ .wf-input-hint {
96
+ font-size: var(--wf-font-size-xs);
97
+ color: var(--wf-color-text-tertiary);
98
+ }
99
+
100
+ .wf-input--err .wf-input {
101
+ border-color: var(--wf-color-error);
102
+ }
103
+
104
+ .wf-input--err .wf-input:focus {
105
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
106
+ }
107
+
108
+ /* number input — 隐藏原生步进按钮 */
109
+ .wf-input[type=number] {
110
+ -moz-appearance: textfield;
111
+ }
112
+
113
+ .wf-input[type=number]::-webkit-inner-spin-button,
114
+ .wf-input[type=number]::-webkit-outer-spin-button {
115
+ -webkit-appearance: none;
116
+ margin: 0;
117
+ }
118
+
119
+ /* number input — 显示自定义步进按钮 */
120
+ .wf-input-number-wrap {
121
+ position: relative;
122
+ display: inline-flex;
123
+ align-items: stretch;
124
+ }
125
+
126
+ .wf-input-number-wrap .wf-input {
127
+ padding-right: calc(var(--wf-space) + 1.5em);
128
+ -moz-appearance: none;
129
+ }
130
+
131
+ .wf-input-number-stepper {
132
+ position: absolute;
133
+ right: 0;
134
+ top: 0;
135
+ bottom: 0;
136
+ display: flex;
137
+ flex-direction: column;
138
+ width: 1.5em;
139
+ border-left: 1px solid var(--wf-color-border);
140
+ }
141
+
142
+ .wf-input-number-step {
143
+ flex: 1;
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ border: none;
148
+ background: transparent;
149
+ color: var(--wf-color-text-secondary);
150
+ font-size: 10px;
151
+ cursor: pointer;
152
+ padding: 0;
153
+ line-height: 1;
154
+ transition: all var(--wf-transition);
155
+ }
156
+
157
+ .wf-input-number-step:hover {
158
+ background: var(--wf-color-bg-secondary);
159
+ color: var(--wf-color-text);
160
+ }
161
+
162
+ .wf-input-number-step:active {
163
+ background: var(--wf-color-bg-tertiary);
164
+ }
165
+
166
+ .wf-input-number-step:disabled {
167
+ opacity: var(--wf-opacity-disabled);
168
+ cursor: not-allowed;
169
+ }
170
+
171
+ .wf-input-number-step + .wf-input-number-step {
172
+ border-top: 1px solid var(--wf-color-border);
173
+ }
174
+
175
+ /* weifuwu/components — Textarea */
176
+
177
+ .wf-textarea-wrap {
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: var(--wf-gap-xs);
181
+ }
182
+
183
+ .wf-textarea-label {
184
+ font-size: var(--wf-font-size-sm);
185
+ font-weight: var(--wf-font-weight-medium);
186
+ color: var(--wf-color-text);
187
+ }
188
+
189
+ .wf-textarea-req {
190
+ color: var(--wf-color-error);
191
+ margin-left: 2px;
192
+ }
193
+
194
+ .wf-textarea {
195
+ font-family: var(--wf-font-sans);
196
+ font-size: var(--wf-font-size-sm);
197
+ padding: var(--wf-space-sm) var(--wf-space);
198
+ border: var(--wf-border-width) solid var(--wf-color-border);
199
+ border-radius: var(--wf-radius);
200
+ background: var(--wf-color-bg);
201
+ color: var(--wf-color-text);
202
+ outline: none;
203
+ transition: all var(--wf-transition);
204
+ width: 100%;
205
+ resize: vertical;
206
+ line-height: var(--wf-line-height);
207
+ }
208
+
209
+ .wf-textarea:focus {
210
+ border-color: var(--wf-color-primary);
211
+ box-shadow: var(--wf-focus-ring);
212
+ }
213
+
214
+ .wf-textarea:disabled {
215
+ opacity: var(--wf-opacity-disabled);
216
+ cursor: not-allowed;
217
+ }
218
+
219
+ .wf-textarea::placeholder {
220
+ color: var(--wf-color-text-tertiary);
221
+ }
222
+
223
+ .wf-textarea-err {
224
+ font-size: var(--wf-font-size-xs);
225
+ color: var(--wf-color-error);
226
+ }
227
+
228
+ .wf-textarea-hint {
229
+ font-size: var(--wf-font-size-xs);
230
+ color: var(--wf-color-text-tertiary);
231
+ }
232
+
233
+ .wf-textarea--err .wf-textarea {
234
+ border-color: var(--wf-color-error);
235
+ }
236
+
237
+ /* weifuwu/components — Select */
238
+
239
+ .wf-select-wrap {
240
+ display: flex;
241
+ flex-direction: column;
242
+ gap: var(--wf-gap-xs);
243
+ }
244
+
245
+ .wf-select-label {
246
+ font-size: var(--wf-font-size-sm);
247
+ font-weight: var(--wf-font-weight-medium);
248
+ color: var(--wf-color-text);
249
+ }
250
+
251
+ .wf-select-req {
252
+ color: var(--wf-color-error);
253
+ margin-left: 2px;
254
+ }
255
+
256
+ .wf-select {
257
+ font-family: var(--wf-font-sans);
258
+ font-size: var(--wf-font-size-sm);
259
+ padding: var(--wf-space-sm) var(--wf-space);
260
+ border: var(--wf-border-width) solid var(--wf-color-border);
261
+ border-radius: var(--wf-radius);
262
+ background: var(--wf-color-bg);
263
+ color: var(--wf-color-text);
264
+ outline: none;
265
+ transition: all var(--wf-transition);
266
+ width: 100%;
267
+ cursor: pointer;
268
+ appearance: auto;
269
+ }
270
+
271
+ .wf-select:focus {
272
+ border-color: var(--wf-color-primary);
273
+ box-shadow: var(--wf-focus-ring);
274
+ }
275
+
276
+ .wf-select:disabled {
277
+ opacity: var(--wf-opacity-disabled);
278
+ cursor: not-allowed;
279
+ }
280
+
281
+ .wf-select-err {
282
+ font-size: var(--wf-font-size-xs);
283
+ color: var(--wf-color-error);
284
+ }
285
+
286
+ .wf-select--err .wf-select {
287
+ border-color: var(--wf-color-error);
288
+ }
289
+
290
+ /* weifuwu/components — Checkbox */
291
+
292
+ .wf-checkbox {
293
+ display: inline-flex;
294
+ align-items: center;
295
+ gap: var(--wf-gap-sm);
296
+ cursor: pointer;
297
+ font-family: var(--wf-font-sans);
298
+ font-size: var(--wf-font-size-sm);
299
+ user-select: none;
300
+ }
301
+
302
+ .wf-checkbox-input {
303
+ position: absolute;
304
+ opacity: 0;
305
+ width: 0;
306
+ height: 0;
307
+ }
308
+
309
+ .wf-checkbox-visual {
310
+ width: 16px;
311
+ height: 16px;
312
+ border: var(--wf-border-width) solid var(--wf-color-border);
313
+ border-radius: var(--wf-radius-sm);
314
+ display: inline-flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ flex-shrink: 0;
318
+ transition: all var(--wf-transition);
319
+ background: var(--wf-color-bg);
320
+ }
321
+
322
+ .wf-checkbox-input:checked + .wf-checkbox-visual {
323
+ background: var(--wf-color-primary);
324
+ border-color: var(--wf-color-primary);
325
+ }
326
+
327
+ .wf-checkbox-input:checked + .wf-checkbox-visual::after {
328
+ content: '✓';
329
+ color: #fff;
330
+ font-size: 11px;
331
+ font-weight: bold;
332
+ }
333
+
334
+ .wf-checkbox-input:focus-visible + .wf-checkbox-visual {
335
+ box-shadow: var(--wf-focus-ring);
336
+ }
337
+
338
+ .wf-checkbox-input:disabled ~ * {
339
+ opacity: var(--wf-opacity-disabled);
340
+ cursor: not-allowed;
341
+ }
342
+
343
+ .wf-checkbox-label {
344
+ color: var(--wf-color-text);
345
+ }
346
+
347
+ /* weifuwu/components — Switch */
348
+
349
+ .wf-switch {
350
+ display: inline-flex;
351
+ align-items: center;
352
+ gap: var(--wf-gap-sm);
353
+ cursor: pointer;
354
+ font-family: var(--wf-font-sans);
355
+ font-size: var(--wf-font-size-sm);
356
+ user-select: none;
357
+ }
358
+
359
+ .wf-switch-input {
360
+ position: absolute;
361
+ opacity: 0;
362
+ width: 0;
363
+ height: 0;
364
+ }
365
+
366
+ .wf-switch-track {
367
+ position: relative;
368
+ width: 36px;
369
+ height: 20px;
370
+ background: var(--wf-color-border-dark);
371
+ border-radius: 10px;
372
+ transition: background var(--wf-transition);
373
+ flex-shrink: 0;
374
+ }
375
+
376
+ .wf-switch-track::after {
377
+ content: '';
378
+ position: absolute;
379
+ top: 2px;
380
+ left: 2px;
381
+ width: 16px;
382
+ height: 16px;
383
+ background: #fff;
384
+ border-radius: 50%;
385
+ transition: transform var(--wf-transition);
386
+ box-shadow: 0 1px 2px rgba(0,0,0,0.15);
387
+ }
388
+
389
+ .wf-switch-input:checked + .wf-switch-track {
390
+ background: var(--wf-color-primary);
391
+ }
392
+
393
+ .wf-switch-input:checked + .wf-switch-track::after {
394
+ transform: translateX(16px);
395
+ }
396
+
397
+ .wf-switch-input:focus-visible + .wf-switch-track {
398
+ box-shadow: var(--wf-focus-ring);
399
+ }
400
+
401
+ .wf-switch-input:disabled ~ * {
402
+ opacity: var(--wf-opacity-disabled);
403
+ cursor: not-allowed;
404
+ }
405
+
406
+ .wf-switch-label {
407
+ color: var(--wf-color-text);
408
+ }
409
+
410
+ /* weifuwu/components — RadioGroup */
411
+
412
+ .wf-radio-group {
413
+ display: flex;
414
+ flex-direction: column;
415
+ gap: var(--wf-gap-sm);
416
+ }
417
+
418
+ .wf-radio-group--inline {
419
+ flex-direction: row;
420
+ flex-wrap: wrap;
421
+ }
422
+
423
+ .wf-radio {
424
+ display: inline-flex;
425
+ align-items: center;
426
+ gap: var(--wf-gap-sm);
427
+ cursor: pointer;
428
+ font-family: var(--wf-font-sans);
429
+ font-size: var(--wf-font-size-sm);
430
+ user-select: none;
431
+ }
432
+
433
+ .wf-radio-input {
434
+ position: absolute;
435
+ opacity: 0;
436
+ width: 0;
437
+ height: 0;
438
+ }
439
+
440
+ .wf-radio-visual {
441
+ width: 16px;
442
+ height: 16px;
443
+ border: var(--wf-border-width) solid var(--wf-color-border);
444
+ border-radius: 50%;
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ flex-shrink: 0;
449
+ transition: all var(--wf-transition);
450
+ background: var(--wf-color-bg);
451
+ }
452
+
453
+ .wf-radio-input:checked + .wf-radio-visual {
454
+ border-color: var(--wf-color-primary);
455
+ border-width: 5px;
456
+ }
457
+
458
+ .wf-radio-input:focus-visible + .wf-radio-visual {
459
+ box-shadow: var(--wf-focus-ring);
460
+ }
461
+
462
+ .wf-radio-input:disabled ~ * {
463
+ opacity: var(--wf-opacity-disabled);
464
+ cursor: not-allowed;
465
+ }
466
+
467
+ .wf-radio-label-text {
468
+ color: var(--wf-color-text);
469
+ }
470
+
471
+ /* weifuwu/components — Table */
472
+
473
+ .wf-table {
474
+ width: 100%;
475
+ border-collapse: collapse;
476
+ font-family: var(--wf-font-sans);
477
+ font-size: var(--wf-font-size-sm);
478
+ }
479
+
480
+ .wf-table-thead {
481
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
482
+ }
483
+
484
+ .wf-table-th {
485
+ text-align: left;
486
+ font-weight: var(--wf-font-weight-medium);
487
+ font-size: var(--wf-font-size-xs);
488
+ color: var(--wf-color-text-tertiary);
489
+ text-transform: uppercase;
490
+ letter-spacing: 0.5px;
491
+ padding: var(--wf-space) var(--wf-space-sm);
492
+ background: var(--wf-color-bg-secondary);
493
+ white-space: nowrap;
494
+ }
495
+
496
+ .wf-table-td {
497
+ padding: var(--wf-space) var(--wf-space-sm);
498
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
499
+ color: var(--wf-color-text);
500
+ font-size: var(--wf-font-size-base);
501
+ }
502
+
503
+ .wf-table-tr:last-child .wf-table-td {
504
+ border-bottom: none;
505
+ }
506
+
507
+ .wf-table-tr:hover .wf-table-td {
508
+ background: var(--wf-color-bg-tertiary);
509
+ }
510
+
511
+ /* weifuwu/components — Modal */
512
+
513
+ .wf-modal {
514
+ position: fixed;
515
+ inset: 0;
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: center;
519
+ z-index: var(--wf-cover-z);
520
+ }
521
+
522
+ .wf-modal--enter {
523
+ animation: wf-modal-fadein 0.2s ease-out;
524
+ }
525
+
526
+ .wf-modal--exit {
527
+ animation: wf-modal-fadeout 0.2s ease-out forwards;
528
+ }
529
+
530
+ @keyframes wf-modal-fadein {
531
+ from { opacity: 0; }
532
+ to { opacity: 1; }
533
+ }
534
+
535
+ @keyframes wf-modal-fadeout {
536
+ from { opacity: 1; }
537
+ to { opacity: 0; }
538
+ }
539
+
540
+ .wf-modal-overlay {
541
+ position: fixed;
542
+ inset: 0;
543
+ background: rgba(0, 0, 0, 0.4);
544
+ z-index: -1;
545
+ }
546
+
547
+ .wf-modal-content {
548
+ background: var(--wf-color-bg);
549
+ border-radius: var(--wf-radius-md);
550
+ box-shadow: var(--wf-shadow-lg);
551
+ min-width: 400px;
552
+ max-width: 90vw;
553
+ max-height: 80vh;
554
+ display: flex;
555
+ flex-direction: column;
556
+ z-index: 1;
557
+ }
558
+
559
+ .wf-modal-header {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: space-between;
563
+ padding: var(--wf-space-md) var(--wf-space-lg);
564
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
565
+ font-size: var(--wf-font-size-lg);
566
+ font-weight: var(--wf-font-weight-semibold);
567
+ }
568
+
569
+ .wf-modal-close {
570
+ background: none;
571
+ border: none;
572
+ font-size: var(--wf-font-size-lg);
573
+ cursor: pointer;
574
+ color: var(--wf-color-text-secondary);
575
+ padding: 4px;
576
+ line-height: 1;
577
+ }
578
+ .wf-modal-close:hover {
579
+ color: var(--wf-color-text);
580
+ }
581
+
582
+ .wf-modal-body {
583
+ padding: var(--wf-space-lg);
584
+ overflow-y: auto;
585
+ flex: 1;
586
+ }
587
+
588
+ .wf-modal-footer {
589
+ display: flex;
590
+ justify-content: flex-end;
591
+ gap: var(--wf-gap-sm);
592
+ padding: var(--wf-space-md) var(--wf-space-lg);
593
+ border-top: var(--wf-border-width) solid var(--wf-color-border);
594
+ }
595
+
596
+ /* weifuwu/components — Toast */
597
+
598
+ .wf-toast-container {
599
+ position: fixed;
600
+ top: var(--wf-space-lg);
601
+ right: var(--wf-space-lg);
602
+ display: flex;
603
+ flex-direction: column;
604
+ gap: var(--wf-gap-sm);
605
+ z-index: var(--wf-cover-z, 100);
606
+ pointer-events: none;
607
+ }
608
+
609
+ .wf-toast {
610
+ display: flex;
611
+ align-items: center;
612
+ gap: var(--wf-gap-sm);
613
+ padding: var(--wf-space) var(--wf-space-md);
614
+ border-radius: var(--wf-radius);
615
+ box-shadow: var(--wf-shadow-md);
616
+ font-family: var(--wf-font-sans);
617
+ font-size: var(--wf-font-size-sm);
618
+ min-width: 260px;
619
+ max-width: 400px;
620
+ cursor: pointer;
621
+ pointer-events: auto;
622
+ animation: wf-toast-in 0.2s ease;
623
+ }
624
+
625
+ @keyframes wf-toast-in {
626
+ from { opacity: 0; transform: translateX(20px); }
627
+ to { opacity: 1; transform: translateX(0); }
628
+ }
629
+
630
+ .wf-toast--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
631
+ .wf-toast--error { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
632
+ .wf-toast--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
633
+ .wf-toast--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
634
+
635
+ .wf-toast-icon {
636
+ font-size: var(--wf-font-size-lg);
637
+ font-weight: var(--wf-font-weight-bold);
638
+ }
639
+
640
+ .wf-toast-msg {
641
+ flex: 1;
642
+ color: var(--wf-color-text);
643
+ }
644
+
645
+ /* weifuwu/components — Alert */
646
+
647
+ .wf-alert {
648
+ display: flex;
649
+ align-items: flex-start;
650
+ gap: var(--wf-gap-sm);
651
+ padding: var(--wf-space) var(--wf-space-md);
652
+ border-radius: var(--wf-radius);
653
+ font-family: var(--wf-font-sans);
654
+ font-size: var(--wf-font-size-sm);
655
+ line-height: var(--wf-line-height);
656
+ }
657
+
658
+ .wf-alert--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
659
+ .wf-alert--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
660
+ .wf-alert--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
661
+ .wf-alert--error { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
662
+
663
+ .wf-alert-icon {
664
+ font-weight: var(--wf-font-weight-bold);
665
+ flex-shrink: 0;
666
+ }
667
+
668
+ .wf-alert-msg {
669
+ flex: 1;
670
+ color: var(--wf-color-text);
671
+ }
672
+
673
+ .wf-alert-close {
674
+ background: none;
675
+ border: none;
676
+ cursor: pointer;
677
+ font-size: var(--wf-font-size-sm);
678
+ opacity: 0.6;
679
+ color: inherit;
680
+ padding: 2px;
681
+ line-height: 1;
682
+ flex-shrink: 0;
683
+ }
684
+ .wf-alert-close:hover {
685
+ opacity: 1;
686
+ }
687
+
688
+ /* weifuwu/components — Loading */
689
+
690
+ .wf-loading {
691
+ display: flex;
692
+ flex-direction: column;
693
+ align-items: center;
694
+ justify-content: center;
695
+ gap: var(--wf-gap-sm);
696
+ padding: var(--wf-space-2xl);
697
+ color: var(--wf-color-text-secondary);
698
+ }
699
+
700
+ .wf-loading-spinner {
701
+ width: 24px;
702
+ height: 24px;
703
+ border: 3px solid var(--wf-color-border);
704
+ border-top-color: var(--wf-color-primary);
705
+ border-radius: 50%;
706
+ animation: wf-spin 0.6s linear infinite;
707
+ }
708
+
709
+ @keyframes wf-spin {
710
+ to { transform: rotate(360deg); }
711
+ }
712
+
713
+ .wf-loading-text {
714
+ font-family: var(--wf-font-sans);
715
+ font-size: var(--wf-font-size-sm);
716
+ }
717
+
718
+ /* weifuwu/components — EmptyState */
719
+
720
+ .wf-empty {
721
+ display: flex;
722
+ flex-direction: column;
723
+ align-items: center;
724
+ justify-content: center;
725
+ gap: var(--wf-gap-sm);
726
+ padding: var(--wf-space-2xl) var(--wf-space-lg);
727
+ text-align: center;
728
+ }
729
+
730
+ .wf-empty-icon {
731
+ font-size: 48px;
732
+ line-height: 1;
733
+ margin-bottom: var(--wf-gap-xs);
734
+ }
735
+
736
+ .wf-empty-text {
737
+ font-family: var(--wf-font-sans);
738
+ font-size: var(--wf-font-size-base);
739
+ font-weight: var(--wf-font-weight-medium);
740
+ color: var(--wf-color-text-secondary);
741
+ }
742
+
743
+ .wf-empty-hint {
744
+ font-family: var(--wf-font-sans);
745
+ font-size: var(--wf-font-size-sm);
746
+ color: var(--wf-color-text-tertiary);
747
+ max-width: 320px;
748
+ line-height: var(--wf-line-height);
749
+ }
750
+
751
+ .wf-empty-action {
752
+ margin-top: var(--wf-gap-sm);
753
+ }
754
+
755
+ /* weifuwu/components — Tabs */
756
+
757
+ .wf-tabs {
758
+ font-family: var(--wf-font-sans);
759
+ }
760
+
761
+ .wf-tab-list {
762
+ display: flex;
763
+ gap: 0;
764
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
765
+ }
766
+
767
+ .wf-tab {
768
+ padding: var(--wf-space) var(--wf-space-md);
769
+ border: none;
770
+ background: none;
771
+ font-family: inherit;
772
+ font-size: var(--wf-font-size-sm);
773
+ font-weight: var(--wf-font-weight-medium);
774
+ color: var(--wf-color-text-secondary);
775
+ cursor: pointer;
776
+ border-bottom: 2px solid transparent;
777
+ margin-bottom: -1px;
778
+ transition: all var(--wf-transition);
779
+ white-space: nowrap;
780
+ }
781
+
782
+ .wf-tab:hover {
783
+ color: var(--wf-color-text);
784
+ }
785
+
786
+ .wf-tab--active {
787
+ color: var(--wf-color-primary);
788
+ border-bottom-color: var(--wf-color-primary);
789
+ }
790
+
791
+ .wf-tab-content {
792
+ padding-top: var(--wf-space-md);
793
+ }
794
+
795
+ /* weifuwu/components — Dropdown */
796
+
797
+ .wf-dropdown {
798
+ position: relative;
799
+ display: inline-block;
800
+ }
801
+
802
+ .wf-dropdown-menu {
803
+ position: absolute;
804
+ top: 100%;
805
+ left: 0;
806
+ margin-top: var(--wf-gap-xs);
807
+ min-width: 140px;
808
+ background: var(--wf-color-bg);
809
+ border: var(--wf-border-width) solid var(--wf-color-border);
810
+ border-radius: var(--wf-radius);
811
+ box-shadow: var(--wf-shadow-md);
812
+ z-index: var(--wf-pop-z);
813
+ padding: var(--wf-space-xs) 0;
814
+ }
815
+
816
+ .wf-dropdown--open {
817
+ z-index: var(--wf-cover-z);
818
+ }
819
+ }
820
+
821
+ .wf-dropdown-item {
822
+ display: block;
823
+ width: 100%;
824
+ text-align: left;
825
+ padding: var(--wf-space-sm) var(--wf-space-md);
826
+ border: none;
827
+ background: none;
828
+ font-family: var(--wf-font-sans);
829
+ font-size: var(--wf-font-size-sm);
830
+ color: var(--wf-color-text);
831
+ cursor: pointer;
832
+ white-space: nowrap;
833
+ }
834
+
835
+ .wf-dropdown-item:hover {
836
+ background: var(--wf-color-bg-tertiary);
837
+ }
838
+
839
+ .wf-dropdown-item:disabled {
840
+ opacity: var(--wf-opacity-disabled);
841
+ cursor: not-allowed;
842
+ }
843
+
844
+ .wf-dropdown-item--danger {
845
+ color: var(--wf-color-error);
846
+ }
847
+
848
+ /* weifuwu/components — Pagination */
849
+
850
+ .wf-pagination {
851
+ display: flex;
852
+ align-items: center;
853
+ gap: var(--wf-gap-xs);
854
+ font-family: var(--wf-font-sans);
855
+ font-size: var(--wf-font-size-sm);
856
+ }
857
+
858
+ .wf-page-btn {
859
+ display: inline-flex;
860
+ align-items: center;
861
+ justify-content: center;
862
+ min-width: 32px;
863
+ height: 32px;
864
+ padding: 0 var(--wf-space-xs);
865
+ border: var(--wf-border-width) solid var(--wf-color-border);
866
+ border-radius: var(--wf-radius);
867
+ background: var(--wf-color-bg);
868
+ color: var(--wf-color-text);
869
+ cursor: pointer;
870
+ font-family: inherit;
871
+ font-size: inherit;
872
+ transition: all var(--wf-transition);
873
+ }
874
+
875
+ .wf-page-btn:hover:not(:disabled):not(.wf-page-btn--active) {
876
+ border-color: var(--wf-color-primary);
877
+ color: var(--wf-color-primary);
878
+ }
879
+
880
+ .wf-page-btn--active {
881
+ background: var(--wf-color-primary);
882
+ border-color: var(--wf-color-primary);
883
+ color: #fff;
884
+ }
885
+
886
+ .wf-page-btn--disabled {
887
+ opacity: var(--wf-opacity-disabled);
888
+ cursor: not-allowed;
889
+ }
890
+
891
+ .wf-page-ellipsis {
892
+ padding: 0 var(--wf-space-xs);
893
+ color: var(--wf-color-text-tertiary);
894
+ }
895
+
896
+ /* weifuwu/components — Card */
897
+
898
+ .wf-card {
899
+ border-radius: var(--wf-surface-radius);
900
+ background: var(--wf-surface-bg);
901
+ font-family: var(--wf-font-sans);
902
+ }
903
+
904
+ .wf-card--default {
905
+ box-shadow: var(--wf-surface-shadow);
906
+ }
907
+
908
+ .wf-card--outlined {
909
+ border: var(--wf-border-width) solid var(--wf-color-border);
910
+ }
911
+
912
+ .wf-card--pad-sm { padding: var(--wf-space-sm); }
913
+ .wf-card--pad-md { padding: var(--wf-space-md); }
914
+ .wf-card--pad-lg { padding: var(--wf-space-lg); }
915
+
916
+ .wf-card--clickable {
917
+ cursor: pointer;
918
+ transition: box-shadow var(--wf-transition);
919
+ }
920
+
921
+ .wf-card--clickable:hover {
922
+ box-shadow: var(--wf-shadow-md);
923
+ }
924
+
925
+ /* weifuwu/components — Badge */
926
+
927
+ .wf-badge {
928
+ display: inline-flex;
929
+ align-items: center;
930
+ padding: 2px var(--wf-space-sm);
931
+ border-radius: 10px;
932
+ font-family: var(--wf-font-sans);
933
+ font-size: var(--wf-font-size-xs);
934
+ font-weight: var(--wf-font-weight-medium);
935
+ line-height: 1.4;
936
+ white-space: nowrap;
937
+ }
938
+
939
+ .wf-badge--default { background: var(--wf-color-bg-tertiary); color: var(--wf-color-text-secondary); }
940
+ .wf-badge--primary { background: var(--wf-color-primary-bg); color: var(--wf-color-primary); }
941
+ .wf-badge--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
942
+ .wf-badge--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
943
+ .wf-badge--danger { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
944
+ .wf-badge--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
945
+
946
+ /* Dot variant */
947
+ .wf-badge-dot {
948
+ display: inline-block;
949
+ width: 8px;
950
+ height: 8px;
951
+ border-radius: 50%;
952
+ }
953
+
954
+ .wf-badge-dot--default { background: var(--wf-color-text-tertiary); }
955
+ .wf-badge-dot--primary { background: var(--wf-color-primary); }
956
+ .wf-badge-dot--success { background: var(--wf-color-success); }
957
+ .wf-badge-dot--warning { background: var(--wf-color-warning); }
958
+ .wf-badge-dot--danger { background: var(--wf-color-error); }
959
+ .wf-badge-dot--info { background: var(--wf-color-info); }
960
+
961
+ /* weifuwu/components — Avatar */
962
+
963
+ .wf-avatar {
964
+ display: inline-flex;
965
+ align-items: center;
966
+ justify-content: center;
967
+ border-radius: 50%;
968
+ font-family: var(--wf-font-sans);
969
+ font-weight: var(--wf-font-weight-semibold);
970
+ color: #fff;
971
+ flex-shrink: 0;
972
+ overflow: hidden;
973
+ object-fit: cover;
974
+ }
975
+
976
+ .wf-avatar--sm { width: 24px; height: 24px; font-size: 11px; }
977
+ .wf-avatar--md { width: 32px; height: 32px; font-size: 13px; }
978
+ .wf-avatar--lg { width: 40px; height: 40px; font-size: 16px; }
979
+
980
+ /* weifuwu/components — Tag */
981
+
982
+ .wf-tag {
983
+ display: inline-flex;
984
+ align-items: center;
985
+ gap: var(--wf-gap-xs);
986
+ padding: 2px var(--wf-space-sm);
987
+ border-radius: var(--wf-radius-sm);
988
+ font-family: var(--wf-font-sans);
989
+ font-size: var(--wf-font-size-xs);
990
+ line-height: 1.5;
991
+ }
992
+
993
+ .wf-tag--default { background: var(--wf-color-bg-tertiary); color: var(--wf-color-text-secondary); }
994
+ .wf-tag--primary { background: var(--wf-color-primary-bg); color: var(--wf-color-primary); }
995
+ .wf-tag--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
996
+ .wf-tag--danger { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
997
+
998
+ .wf-tag-text { }
999
+
1000
+ .wf-tag-close {
1001
+ background: none;
1002
+ border: none;
1003
+ cursor: pointer;
1004
+ font-size: 10px;
1005
+ padding: 0;
1006
+ line-height: 1;
1007
+ opacity: 0.6;
1008
+ color: inherit;
1009
+ }
1010
+ .wf-tag-close:hover { opacity: 1; }
1011
+
1012
+ /* weifuwu/components — StatCard */
1013
+
1014
+ .wf-stat {
1015
+ display: flex;
1016
+ flex-direction: column;
1017
+ gap: var(--wf-gap-xs);
1018
+ padding: var(--wf-space-md);
1019
+ border-radius: var(--wf-radius-md);
1020
+ background: var(--wf-surface-bg);
1021
+ box-shadow: var(--wf-surface-shadow);
1022
+ font-family: var(--wf-font-sans);
1023
+ }
1024
+
1025
+ .wf-stat-icon {
1026
+ font-size: 24px;
1027
+ line-height: 1;
1028
+ margin-bottom: var(--wf-gap-xs);
1029
+ }
1030
+
1031
+ .wf-stat-value {
1032
+ font-size: var(--wf-font-size-3xl);
1033
+ font-weight: var(--wf-font-weight-bold);
1034
+ color: var(--wf-color-text);
1035
+ line-height: 1;
1036
+ }
1037
+
1038
+ .wf-stat-label {
1039
+ font-size: var(--wf-font-size-sm);
1040
+ color: var(--wf-color-text-secondary);
1041
+ }
1042
+
1043
+ .wf-stat-trend {
1044
+ display: flex;
1045
+ align-items: center;
1046
+ gap: var(--wf-gap-xs);
1047
+ font-size: var(--wf-font-size-xs);
1048
+ margin-top: var(--wf-gap-xs);
1049
+ }
1050
+
1051
+ .wf-stat-trend--up { color: var(--wf-color-success); }
1052
+ .wf-stat-trend--down { color: var(--wf-color-error); }
1053
+
1054
+ .wf-stat-trend-arrow {
1055
+ font-weight: var(--wf-font-weight-bold);
1056
+ }
1057
+
1058
+ /* weifuwu/components — Steps */
1059
+
1060
+ .wf-steps {
1061
+ display: flex;
1062
+ align-items: flex-start;
1063
+ font-family: var(--wf-font-sans);
1064
+ }
1065
+
1066
+ .wf-step {
1067
+ display: flex;
1068
+ flex-direction: column;
1069
+ align-items: center;
1070
+ flex: 1;
1071
+ position: relative;
1072
+ gap: var(--wf-gap-xs);
1073
+ }
1074
+
1075
+ .wf-step-num {
1076
+ width: 28px;
1077
+ height: 28px;
1078
+ border-radius: 50%;
1079
+ display: flex;
1080
+ align-items: center;
1081
+ justify-content: center;
1082
+ font-size: var(--wf-font-size-sm);
1083
+ font-weight: var(--wf-font-weight-semibold);
1084
+ background: var(--wf-color-bg-tertiary);
1085
+ color: var(--wf-color-text-secondary);
1086
+ flex-shrink: 0;
1087
+ }
1088
+
1089
+ .wf-step--done .wf-step-num {
1090
+ background: var(--wf-color-primary);
1091
+ color: #fff;
1092
+ font-size: 14px;
1093
+ }
1094
+
1095
+ .wf-step--current .wf-step-num {
1096
+ background: var(--wf-color-primary);
1097
+ color: #fff;
1098
+ box-shadow: 0 0 0 3px var(--wf-color-primary-bg);
1099
+ }
1100
+
1101
+ .wf-step-label {
1102
+ font-size: var(--wf-font-size-sm);
1103
+ font-weight: var(--wf-font-weight-medium);
1104
+ color: var(--wf-color-text);
1105
+ text-align: center;
1106
+ }
1107
+
1108
+ .wf-step--current .wf-step-label {
1109
+ color: var(--wf-color-primary);
1110
+ }
1111
+
1112
+ .wf-step-desc {
1113
+ font-size: var(--wf-font-size-xs);
1114
+ color: var(--wf-color-text-tertiary);
1115
+ text-align: center;
1116
+ }
1117
+
1118
+ .wf-step-connector {
1119
+ position: absolute;
1120
+ top: 14px;
1121
+ left: calc(50% + 18px);
1122
+ right: calc(-50% + 18px);
1123
+ height: 2px;
1124
+ background: var(--wf-color-border);
1125
+ }
1126
+
1127
+ .wf-step-connector--done {
1128
+ background: var(--wf-color-primary);
1129
+ }
1130
+
1131
+ /* weifuwu/components — Form */
1132
+
1133
+ .wf-form {
1134
+ display: flex;
1135
+ flex-direction: column;
1136
+ gap: var(--wf-gap-md);
1137
+ }
1138
+
1139
+ /* weifuwu/components — Field */
1140
+
1141
+ .wf-field {
1142
+ display: flex;
1143
+ flex-direction: column;
1144
+ gap: var(--wf-gap-xs);
1145
+ }
1146
+
1147
+ .wf-field-label {
1148
+ font-size: var(--wf-font-size-sm);
1149
+ font-weight: var(--wf-font-weight-medium);
1150
+ color: var(--wf-color-text);
1151
+ }
1152
+
1153
+ .wf-field-req {
1154
+ color: var(--wf-color-error);
1155
+ margin-left: 2px;
1156
+ }
1157
+
1158
+ .wf-field-err {
1159
+ font-size: var(--wf-font-size-xs);
1160
+ color: var(--wf-color-error);
1161
+ }
1162
+
1163
+ .wf-field-hint {
1164
+ font-size: var(--wf-font-size-xs);
1165
+ color: var(--wf-color-text-tertiary);
1166
+ }
1167
+
1168
+ .wf-field--err .wf-field-label {
1169
+ color: var(--wf-color-error);
1170
+ }
1171
+
1172
+ /* weifuwu/components — Slider */
1173
+
1174
+ .wf-slider-wrap {
1175
+ display: flex;
1176
+ flex-direction: column;
1177
+ gap: var(--wf-gap-xs);
1178
+ }
1179
+
1180
+ .wf-slider-label {
1181
+ font-size: var(--wf-font-size-sm);
1182
+ font-weight: var(--wf-font-weight-medium);
1183
+ color: var(--wf-color-text);
1184
+ }
1185
+
1186
+ .wf-slider {
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: var(--wf-gap-md);
1190
+ }
1191
+
1192
+ .wf-slider-input {
1193
+ flex: 1;
1194
+ height: 6px;
1195
+ appearance: none;
1196
+ background: var(--wf-color-border);
1197
+ border-radius: 3px;
1198
+ outline: none;
1199
+ cursor: pointer;
1200
+ }
1201
+
1202
+ .wf-slider-input::-webkit-slider-thumb {
1203
+ appearance: none;
1204
+ width: 18px;
1205
+ height: 18px;
1206
+ border-radius: 50%;
1207
+ background: var(--wf-color-primary);
1208
+ cursor: pointer;
1209
+ border: 2px solid #fff;
1210
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
1211
+ }
1212
+
1213
+ .wf-slider-input:focus-visible {
1214
+ box-shadow: var(--wf-focus-ring);
1215
+ }
1216
+
1217
+ .wf-slider-value {
1218
+ font-size: var(--wf-font-size-sm);
1219
+ font-weight: var(--wf-font-weight-semibold);
1220
+ color: var(--wf-color-text);
1221
+ min-width: 30px;
1222
+ text-align: center;
1223
+ }
1224
+
1225
+ /* weifuwu/components — SearchInput */
1226
+
1227
+ .wf-search {
1228
+ display: flex;
1229
+ align-items: center;
1230
+ gap: var(--wf-gap-sm);
1231
+ padding: var(--wf-space-sm) var(--wf-space);
1232
+ border: var(--wf-border-width) solid var(--wf-color-border);
1233
+ border-radius: var(--wf-radius);
1234
+ background: var(--wf-color-bg);
1235
+ transition: all var(--wf-transition);
1236
+ }
1237
+
1238
+ .wf-search:focus-within {
1239
+ border-color: var(--wf-color-primary);
1240
+ box-shadow: var(--wf-focus-ring);
1241
+ }
1242
+
1243
+ .wf-search-icon {
1244
+ font-size: var(--wf-font-size-sm);
1245
+ flex-shrink: 0;
1246
+ line-height: 1;
1247
+ }
1248
+
1249
+ .wf-search-input {
1250
+ flex: 1;
1251
+ border: none;
1252
+ outline: none;
1253
+ background: none;
1254
+ font-family: var(--wf-font-sans);
1255
+ font-size: var(--wf-font-size-sm);
1256
+ color: var(--wf-color-text);
1257
+ padding: 0;
1258
+ }
1259
+
1260
+ .wf-search-input::placeholder {
1261
+ color: var(--wf-color-text-tertiary);
1262
+ }
1263
+
1264
+ .wf-search-clear {
1265
+ background: none;
1266
+ border: none;
1267
+ cursor: pointer;
1268
+ font-size: 12px;
1269
+ color: var(--wf-color-text-tertiary);
1270
+ padding: 2px;
1271
+ line-height: 1;
1272
+ flex-shrink: 0;
1273
+ }
1274
+
1275
+ .wf-search-clear:hover {
1276
+ color: var(--wf-color-text);
1277
+ }
1278
+
1279
+ /* weifuwu/components — ProgressBar */
1280
+
1281
+ .wf-progress-wrap {
1282
+ display: flex;
1283
+ align-items: center;
1284
+ gap: var(--wf-gap-sm);
1285
+ }
1286
+
1287
+ .wf-progress-label {
1288
+ font-size: var(--wf-font-size-sm);
1289
+ color: var(--wf-color-text-secondary);
1290
+ white-space: nowrap;
1291
+ min-width: 60px;
1292
+ }
1293
+
1294
+ .wf-progress {
1295
+ flex: 1;
1296
+ height: 8px;
1297
+ background: var(--wf-color-bg-tertiary);
1298
+ border-radius: 4px;
1299
+ overflow: hidden;
1300
+ }
1301
+
1302
+ .wf-progress-fill {
1303
+ height: 100%;
1304
+ background: var(--wf-color-primary);
1305
+ border-radius: 4px;
1306
+ transition: width var(--wf-transition);
1307
+ }
1308
+
1309
+ .wf-progress-value {
1310
+ font-size: var(--wf-font-size-sm);
1311
+ font-weight: var(--wf-font-weight-medium);
1312
+ color: var(--wf-color-text-secondary);
1313
+ min-width: 40px;
1314
+ text-align: right;
1315
+ }
1316
+
1317
+ /* weifuwu/components — Accordion */
1318
+
1319
+ .wf-accordion {
1320
+ display: flex;
1321
+ flex-direction: column;
1322
+ border: var(--wf-border-width) solid var(--wf-color-border);
1323
+ border-radius: var(--wf-radius);
1324
+ overflow: hidden;
1325
+ font-family: var(--wf-font-sans);
1326
+ }
1327
+
1328
+ .wf-accordion-item {
1329
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
1330
+ }
1331
+
1332
+ .wf-accordion-item:last-child {
1333
+ border-bottom: none;
1334
+ }
1335
+
1336
+ .wf-accordion-summary {
1337
+ padding: var(--wf-space) var(--wf-space-md);
1338
+ font-size: var(--wf-font-size-sm);
1339
+ font-weight: var(--wf-font-weight-medium);
1340
+ color: var(--wf-color-text);
1341
+ cursor: pointer;
1342
+ user-select: none;
1343
+ }
1344
+
1345
+ .wf-accordion-summary:hover {
1346
+ background: var(--wf-color-bg-tertiary);
1347
+ }
1348
+
1349
+ .wf-accordion-content {
1350
+ padding: var(--wf-space) var(--wf-space-md) var(--wf-space-md);
1351
+ font-size: var(--wf-font-size-sm);
1352
+ color: var(--wf-color-text-secondary);
1353
+ }
1354
+
1355
+ /* weifuwu/components — PageHeader */
1356
+
1357
+ .wf-page-head {
1358
+ display: flex;
1359
+ align-items: flex-start;
1360
+ justify-content: space-between;
1361
+ gap: var(--wf-gap-md);
1362
+ margin-bottom: var(--wf-space-md);
1363
+ }
1364
+
1365
+ .wf-page-head-left {
1366
+ display: flex;
1367
+ flex-direction: column;
1368
+ gap: var(--wf-gap-xs);
1369
+ }
1370
+
1371
+ .wf-page-title {
1372
+ font-family: var(--wf-font-sans);
1373
+ font-size: var(--wf-font-size-2xl);
1374
+ font-weight: var(--wf-font-weight-semibold);
1375
+ color: var(--wf-color-text);
1376
+ margin: 0;
1377
+ line-height: var(--wf-line-height-tight);
1378
+ }
1379
+
1380
+ .wf-page-sub {
1381
+ font-family: var(--wf-font-sans);
1382
+ font-size: var(--wf-font-size-sm);
1383
+ color: var(--wf-color-text-secondary);
1384
+ margin: 0;
1385
+ }
1386
+
1387
+ .wf-page-head-actions {
1388
+ display: flex;
1389
+ align-items: center;
1390
+ gap: var(--wf-gap-sm);
1391
+ flex-shrink: 0;
1392
+ }
1393
+
1394
+ /* weifuwu/components — Breadcrumb */
1395
+
1396
+ .wf-breadcrumb {
1397
+ display: flex;
1398
+ align-items: center;
1399
+ gap: var(--wf-gap-xs);
1400
+ font-family: var(--wf-font-sans);
1401
+ font-size: var(--wf-font-size-sm);
1402
+ color: var(--wf-color-text-secondary);
1403
+ line-height: var(--wf-line-height-normal);
1404
+ }
1405
+
1406
+ .wf-breadcrumb-link {
1407
+ color: var(--wf-color-primary);
1408
+ text-decoration: none;
1409
+ }
1410
+
1411
+ .wf-breadcrumb-link:hover {
1412
+ text-decoration: underline;
1413
+ }
1414
+
1415
+ .wf-breadcrumb-current {
1416
+ color: var(--wf-color-text);
1417
+ font-weight: var(--wf-font-weight-medium);
1418
+ }
1419
+
1420
+ .wf-breadcrumb-sep {
1421
+ color: var(--wf-color-text-tertiary);
1422
+ user-select: none;
1423
+ }
1424
+
1425
+ .wf-breadcrumb-text {
1426
+ color: var(--wf-color-text-secondary);
1427
+ }
1428
+
1429
+ /* weifuwu/components — Divider */
1430
+
1431
+ .wf-divider {
1432
+ border: none;
1433
+ border-top: 1px solid var(--wf-color-border);
1434
+ margin: var(--wf-space-md) 0;
1435
+ height: 0;
1436
+ }
1437
+
1438
+ .wf-divider--vertical {
1439
+ display: inline-block;
1440
+ width: 0;
1441
+ height: 1em;
1442
+ margin: 0 var(--wf-space-sm);
1443
+ border-top: none;
1444
+ border-left: 1px solid var(--wf-color-border);
1445
+ vertical-align: middle;
1446
+ }
1447
+
1448
+ .wf-divider--with-text {
1449
+ display: flex;
1450
+ align-items: center;
1451
+ border: none;
1452
+ height: auto;
1453
+ gap: var(--wf-gap-md);
1454
+ }
1455
+
1456
+ .wf-divider--with-text::before,
1457
+ .wf-divider--with-text::after {
1458
+ content: '';
1459
+ flex: 1;
1460
+ border-top: 1px solid var(--wf-color-border);
1461
+ }
1462
+
1463
+ .wf-divider-text {
1464
+ font-family: var(--wf-font-sans);
1465
+ font-size: var(--wf-font-size-sm);
1466
+ color: var(--wf-color-text-secondary);
1467
+ white-space: nowrap;
1468
+ flex-shrink: 0;
1469
+ }
1470
+
1471
+ /* weifuwu/components — FileUpload */
1472
+
1473
+ .wf-upload {
1474
+ display: flex;
1475
+ flex-direction: column;
1476
+ gap: var(--wf-gap-sm);
1477
+ }
1478
+
1479
+ .wf-upload-zone {
1480
+ display: flex;
1481
+ flex-direction: column;
1482
+ align-items: center;
1483
+ justify-content: center;
1484
+ gap: var(--wf-gap-xs);
1485
+ padding: var(--wf-space-lg);
1486
+ border: 2px dashed var(--wf-color-border);
1487
+ border-radius: var(--wf-radius);
1488
+ background: var(--wf-color-bg-secondary);
1489
+ cursor: pointer;
1490
+ transition: all var(--wf-transition);
1491
+ min-height: 120px;
1492
+ }
1493
+
1494
+ .wf-upload-zone:hover {
1495
+ border-color: var(--wf-color-primary);
1496
+ background: var(--wf-color-bg);
1497
+ }
1498
+
1499
+ .wf-upload-zone--disabled {
1500
+ opacity: var(--wf-opacity-disabled);
1501
+ cursor: not-allowed;
1502
+ }
1503
+
1504
+ .wf-upload-zone--err {
1505
+ border-color: var(--wf-color-error);
1506
+ }
1507
+
1508
+ .wf-upload-placeholder {
1509
+ display: flex;
1510
+ flex-direction: column;
1511
+ align-items: center;
1512
+ gap: var(--wf-gap-xs);
1513
+ }
1514
+
1515
+ .wf-upload-icon {
1516
+ font-size: 24px;
1517
+ line-height: 1;
1518
+ }
1519
+
1520
+ .wf-upload-text {
1521
+ font-family: var(--wf-font-sans);
1522
+ font-size: var(--wf-font-size-sm);
1523
+ color: var(--wf-color-text-secondary);
1524
+ }
1525
+
1526
+ .wf-upload-hint {
1527
+ font-family: var(--wf-font-sans);
1528
+ font-size: var(--wf-font-size-xs);
1529
+ color: var(--wf-color-text-tertiary);
1530
+ }
1531
+
1532
+ .wf-upload-list {
1533
+ list-style: none;
1534
+ margin: 0;
1535
+ padding: 0;
1536
+ display: flex;
1537
+ flex-direction: column;
1538
+ gap: var(--wf-gap-xs);
1539
+ }
1540
+
1541
+ .wf-upload-item {
1542
+ display: flex;
1543
+ align-items: center;
1544
+ justify-content: space-between;
1545
+ gap: var(--wf-gap-sm);
1546
+ padding: var(--wf-space-sm) var(--wf-space);
1547
+ border: var(--wf-border-width) solid var(--wf-color-border);
1548
+ border-radius: var(--wf-radius);
1549
+ background: var(--wf-color-bg);
1550
+ }
1551
+
1552
+ .wf-upload-item-info {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ gap: var(--wf-gap-md);
1556
+ min-width: 0;
1557
+ }
1558
+
1559
+ .wf-upload-item-name {
1560
+ font-family: var(--wf-font-sans);
1561
+ font-size: var(--wf-font-size-sm);
1562
+ color: var(--wf-color-text);
1563
+ overflow: hidden;
1564
+ text-overflow: ellipsis;
1565
+ white-space: nowrap;
1566
+ }
1567
+
1568
+ .wf-upload-item-size {
1569
+ font-family: var(--wf-font-sans);
1570
+ font-size: var(--wf-font-size-xs);
1571
+ color: var(--wf-color-text-tertiary);
1572
+ flex-shrink: 0;
1573
+ }
1574
+
1575
+ .wf-upload-item-remove {
1576
+ border: none;
1577
+ background: transparent;
1578
+ color: var(--wf-color-text-tertiary);
1579
+ cursor: pointer;
1580
+ padding: 2px 4px;
1581
+ font-size: 12px;
1582
+ line-height: 1;
1583
+ border-radius: var(--wf-radius-sm);
1584
+ flex-shrink: 0;
1585
+ }
1586
+
1587
+ .wf-upload-item-remove:hover {
1588
+ color: var(--wf-color-error);
1589
+ background: var(--wf-color-error-bg);
1590
+ }
1591
+
1592
+ .wf-upload-err {
1593
+ font-family: var(--wf-font-sans);
1594
+ font-size: var(--wf-font-size-xs);
1595
+ color: var(--wf-color-error);
1596
+ }
1597
+
1598
+ /* weifuwu/components — Tooltip */
1599
+
1600
+ .wf-tooltip-wrap {
1601
+ position: relative;
1602
+ display: inline-flex;
1603
+ }
1604
+
1605
+ .wf-tooltip {
1606
+ position: absolute;
1607
+ z-index: var(--wf-cover-z, 1000);
1608
+ display: flex;
1609
+ flex-direction: column;
1610
+ align-items: center;
1611
+ pointer-events: none;
1612
+ animation: wf-tooltip-fadein 0.15s ease-out;
1613
+ }
1614
+
1615
+ @keyframes wf-tooltip-fadein {
1616
+ from { opacity: 0; }
1617
+ to { opacity: 1; }
1618
+ }
1619
+
1620
+ .wf-tooltip-content {
1621
+ font-family: var(--wf-font-sans);
1622
+ font-size: var(--wf-font-size-xs);
1623
+ color: var(--wf-color-bg);
1624
+ background: var(--wf-color-text);
1625
+ padding: var(--wf-space-xs) var(--wf-space-sm);
1626
+ border-radius: var(--wf-radius-sm);
1627
+ white-space: nowrap;
1628
+ max-width: 240px;
1629
+ overflow: hidden;
1630
+ text-overflow: ellipsis;
1631
+ line-height: var(--wf-line-height-tight);
1632
+ }
1633
+
1634
+ .wf-tooltip-arrow {
1635
+ width: 6px;
1636
+ height: 6px;
1637
+ background: var(--wf-color-text);
1638
+ transform: rotate(45deg);
1639
+ border-radius: 1px;
1640
+ }
1641
+
1642
+ /* 位置: top (默认) */
1643
+ .wf-tooltip--top {
1644
+ bottom: 100%;
1645
+ left: 50%;
1646
+ transform: translateX(-50%);
1647
+ padding-bottom: 4px;
1648
+ }
1649
+
1650
+ .wf-tooltip--top .wf-tooltip-arrow {
1651
+ order: 1;
1652
+ margin-top: -3px;
1653
+ }
1654
+
1655
+ /* 位置: bottom */
1656
+ .wf-tooltip--bottom {
1657
+ top: 100%;
1658
+ left: 50%;
1659
+ transform: translateX(-50%);
1660
+ padding-top: 4px;
1661
+ }
1662
+
1663
+ .wf-tooltip--bottom .wf-tooltip-arrow {
1664
+ order: -1;
1665
+ margin-bottom: -3px;
1666
+ }
1667
+
1668
+ /* 位置: left */
1669
+ .wf-tooltip--left {
1670
+ right: 100%;
1671
+ top: 50%;
1672
+ transform: translateY(-50%);
1673
+ padding-right: 4px;
1674
+ flex-direction: row;
1675
+ }
1676
+
1677
+ .wf-tooltip--left .wf-tooltip-arrow {
1678
+ order: 1;
1679
+ margin-left: -3px;
1680
+ }
1681
+
1682
+ /* 位置: right */
1683
+ .wf-tooltip--right {
1684
+ left: 100%;
1685
+ top: 50%;
1686
+ transform: translateY(-50%);
1687
+ padding-left: 4px;
1688
+ flex-direction: row;
1689
+ }
1690
+
1691
+ .wf-tooltip--right .wf-tooltip-arrow {
1692
+ order: -1;
1693
+ margin-right: -3px;
1694
+ }
1695
+
1696
+ /* weifuwu/components — Drawer */
1697
+
1698
+ .wf-drawer {
1699
+ position: fixed;
1700
+ inset: 0;
1701
+ z-index: var(--wf-cover-z, 1000);
1702
+ display: flex;
1703
+ }
1704
+
1705
+ .wf-drawer--left {
1706
+ justify-content: flex-start;
1707
+ }
1708
+
1709
+ .wf-drawer--right {
1710
+ justify-content: flex-end;
1711
+ }
1712
+
1713
+ .wf-drawer-overlay {
1714
+ position: absolute;
1715
+ inset: 0;
1716
+ background: rgba(0, 0, 0, 0.4);
1717
+ }
1718
+
1719
+ .wf-drawer--enter .wf-drawer-overlay {
1720
+ animation: wf-drawer-overlay-fadein 0.2s ease-out;
1721
+ }
1722
+
1723
+ .wf-drawer--exit .wf-drawer-overlay {
1724
+ animation: wf-drawer-overlay-fadeout 0.2s ease-out forwards;
1725
+ }
1726
+
1727
+ @keyframes wf-drawer-overlay-fadein {
1728
+ from { opacity: 0; }
1729
+ to { opacity: 1; }
1730
+ }
1731
+
1732
+ @keyframes wf-drawer-overlay-fadeout {
1733
+ from { opacity: 1; }
1734
+ to { opacity: 0; }
1735
+ }
1736
+
1737
+ .wf-drawer-panel {
1738
+ position: relative;
1739
+ display: flex;
1740
+ flex-direction: column;
1741
+ width: 360px;
1742
+ max-width: 100vw;
1743
+ height: 100%;
1744
+ background: var(--wf-color-bg);
1745
+ box-shadow: var(--wf-shadow-lg, 0 4px 24px rgba(0, 0, 0, 0.12));
1746
+ }
1747
+
1748
+ .wf-drawer--enter .wf-drawer-panel {
1749
+ animation: wf-drawer-slidein 0.25s ease-out;
1750
+ }
1751
+
1752
+ .wf-drawer--enter .wf-drawer-panel--right {
1753
+ animation-name: wf-drawer-slidein-right;
1754
+ }
1755
+
1756
+ .wf-drawer--enter .wf-drawer-panel--left {
1757
+ animation-name: wf-drawer-slidein-left;
1758
+ }
1759
+
1760
+ .wf-drawer--exit .wf-drawer-panel {
1761
+ animation: wf-drawer-slideout 0.2s ease-out forwards;
1762
+ }
1763
+
1764
+ .wf-drawer--exit .wf-drawer-panel--right {
1765
+ animation-name: wf-drawer-slideout-right;
1766
+ }
1767
+
1768
+ .wf-drawer--exit .wf-drawer-panel--left {
1769
+ animation-name: wf-drawer-slideout-left;
1770
+ }
1771
+
1772
+ @keyframes wf-drawer-slidein-right {
1773
+ from { transform: translateX(100%); }
1774
+ to { transform: translateX(0); }
1775
+ }
1776
+
1777
+ @keyframes wf-drawer-slidein-left {
1778
+ from { transform: translateX(-100%); }
1779
+ to { transform: translateX(0); }
1780
+ }
1781
+
1782
+ @keyframes wf-drawer-slideout-right {
1783
+ from { transform: translateX(0); }
1784
+ to { transform: translateX(100%); }
1785
+ }
1786
+
1787
+ @keyframes wf-drawer-slideout-left {
1788
+ from { transform: translateX(0); }
1789
+ to { transform: translateX(-100%); }
1790
+ }
1791
+
1792
+ .wf-drawer-header {
1793
+ display: flex;
1794
+ align-items: center;
1795
+ justify-content: space-between;
1796
+ padding: var(--wf-space-md);
1797
+ border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border);
1798
+ font-family: var(--wf-font-sans);
1799
+ font-size: var(--wf-font-size-lg);
1800
+ font-weight: var(--wf-font-weight-semibold);
1801
+ color: var(--wf-color-text);
1802
+ flex-shrink: 0;
1803
+ }
1804
+
1805
+ .wf-drawer-close {
1806
+ border: none;
1807
+ background: transparent;
1808
+ color: var(--wf-color-text-tertiary);
1809
+ cursor: pointer;
1810
+ padding: var(--wf-space-xs);
1811
+ font-size: 16px;
1812
+ line-height: 1;
1813
+ border-radius: var(--wf-radius-sm);
1814
+ }
1815
+
1816
+ .wf-drawer-close:hover {
1817
+ color: var(--wf-color-text);
1818
+ background: var(--wf-color-bg-secondary);
1819
+ }
1820
+
1821
+ .wf-drawer-body {
1822
+ flex: 1;
1823
+ overflow-y: auto;
1824
+ padding: var(--wf-space-md);
1825
+ }
1826
+
1827
+ .wf-drawer-footer {
1828
+ flex-shrink: 0;
1829
+ display: flex;
1830
+ align-items: center;
1831
+ justify-content: flex-end;
1832
+ gap: var(--wf-gap-sm);
1833
+ padding: var(--wf-space-md);
1834
+ border-top: var(--wf-border-width, 1px) solid var(--wf-color-border);
1835
+ }
1836
+
1837
+ /* weifuwu/components — Popover */
1838
+
1839
+ .wf-popover-wrap {
1840
+ position: relative;
1841
+ display: inline-flex;
1842
+ }
1843
+
1844
+ .wf-popover-overlay {
1845
+ position: fixed;
1846
+ inset: 0;
1847
+ z-index: 998;
1848
+ }
1849
+
1850
+ .wf-popover {
1851
+ position: absolute;
1852
+ z-index: 999;
1853
+ display: flex;
1854
+ flex-direction: column;
1855
+ align-items: center;
1856
+ animation: wf-popover-fadein 0.15s ease-out;
1857
+ }
1858
+
1859
+ @keyframes wf-popover-fadein {
1860
+ from { opacity: 0; }
1861
+ to { opacity: 1; }
1862
+ }
1863
+
1864
+ .wf-popover-content {
1865
+ font-family: var(--wf-font-sans);
1866
+ font-size: var(--wf-font-size-sm);
1867
+ color: var(--wf-color-text);
1868
+ background: var(--wf-color-bg);
1869
+ border: 1px solid var(--wf-color-border);
1870
+ border-radius: var(--wf-radius);
1871
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
1872
+ padding: var(--wf-space-sm);
1873
+ min-width: 120px;
1874
+ max-width: 320px;
1875
+ line-height: var(--wf-line-height-normal);
1876
+ }
1877
+
1878
+ .wf-popover-arrow {
1879
+ width: 8px;
1880
+ height: 8px;
1881
+ background: var(--wf-color-bg);
1882
+ border: 1px solid var(--wf-color-border);
1883
+ transform: rotate(45deg);
1884
+ border-radius: 1px;
1885
+ }
1886
+
1887
+ .wf-popover-arrow {
1888
+ border-bottom: none;
1889
+ border-right: none;
1890
+ }
1891
+
1892
+ /* 位置: top */
1893
+ .wf-popover--top {
1894
+ bottom: 100%;
1895
+ left: 50%;
1896
+ transform: translateX(-50%);
1897
+ padding-bottom: 6px;
1898
+ }
1899
+
1900
+ .wf-popover--top .wf-popover-arrow {
1901
+ order: 1;
1902
+ margin-top: -4px;
1903
+ border: none;
1904
+ border-top: 1px solid var(--wf-color-border);
1905
+ border-left: 1px solid var(--wf-color-border);
1906
+ }
1907
+
1908
+ /* 位置: bottom */
1909
+ .wf-popover--bottom {
1910
+ top: 100%;
1911
+ left: 50%;
1912
+ transform: translateX(-50%);
1913
+ padding-top: 6px;
1914
+ }
1915
+
1916
+ .wf-popover--bottom .wf-popover-arrow {
1917
+ order: -1;
1918
+ margin-bottom: -4px;
1919
+ border: none;
1920
+ border-bottom: 1px solid var(--wf-color-border);
1921
+ border-right: 1px solid var(--wf-color-border);
1922
+ }
1923
+
1924
+ /* 位置: left */
1925
+ .wf-popover--left {
1926
+ right: 100%;
1927
+ top: 50%;
1928
+ transform: translateY(-50%);
1929
+ padding-right: 6px;
1930
+ flex-direction: row;
1931
+ }
1932
+
1933
+ .wf-popover--left .wf-popover-arrow {
1934
+ order: 1;
1935
+ margin-left: -4px;
1936
+ border: none;
1937
+ border-left: 1px solid var(--wf-color-border);
1938
+ border-bottom: 1px solid var(--wf-color-border);
1939
+ }
1940
+
1941
+ /* 位置: right */
1942
+ .wf-popover--right {
1943
+ left: 100%;
1944
+ top: 50%;
1945
+ transform: translateY(-50%);
1946
+ padding-left: 6px;
1947
+ flex-direction: row;
1948
+ }
1949
+
1950
+ .wf-popover--right .wf-popover-arrow {
1951
+ order: -1;
1952
+ margin-right: -4px;
1953
+ border: none;
1954
+ border-right: 1px solid var(--wf-color-border);
1955
+ border-top: 1px solid var(--wf-color-border);
1956
+ }
1957
+
1958
+ /* weifuwu/components — Skeleton */
1959
+
1960
+ .wf-skeleton {
1961
+ display: inline-block;
1962
+ height: 1em;
1963
+ border-radius: var(--wf-radius-sm, 4px);
1964
+ background: linear-gradient(
1965
+ 90deg,
1966
+ var(--wf-color-border, #e5e7eb) 25%,
1967
+ var(--wf-color-bg-hover, #f3f4f6) 50%,
1968
+ var(--wf-color-border, #e5e7eb) 75%
1969
+ );
1970
+ background-size: 200% 100%;
1971
+ animation: wf-skeleton-shimmer 1.5s ease-in-out infinite;
1972
+ vertical-align: middle;
1973
+ }
1974
+
1975
+ @keyframes wf-skeleton-shimmer {
1976
+ 0% { background-position: 200% 0; }
1977
+ 100% { background-position: -200% 0; }
1978
+ }
1979
+
1980
+ /* 变体 */
1981
+
1982
+ .wf-skeleton--text {
1983
+ width: 100%;
1984
+ min-width: 60px;
1985
+ }
1986
+
1987
+ .wf-skeleton--circle {
1988
+ border-radius: 50%;
1989
+ width: 40px;
1990
+ height: 40px;
1991
+ min-width: unset;
1992
+ }
1993
+
1994
+ .wf-skeleton--rect {
1995
+ border-radius: var(--wf-radius, 8px);
1996
+ width: 100%;
1997
+ height: 120px;
1998
+ }
1999
+
2000
+ /* 多行:最后一行缩短 */
2001
+
2002
+ .wf-skeleton--short {
2003
+ width: 60%;
2004
+ }
2005
+