weifuwu 0.36.2 → 0.37.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 (45) hide show
  1. package/README.md +97 -3
  2. package/dist/client/app.d.ts +4 -7
  3. package/dist/client/i18n.d.ts +27 -0
  4. package/dist/client/index.d.ts +4 -0
  5. package/dist/client/index.js +171 -54
  6. package/dist/client/locale/en_US.d.ts +38 -0
  7. package/dist/client/locale/zh_CN.d.ts +38 -0
  8. package/dist/components/Accordion/Accordion.d.ts +11 -0
  9. package/dist/components/Alert/Alert.d.ts +9 -0
  10. package/dist/components/Avatar/Avatar.d.ts +7 -0
  11. package/dist/components/Badge/Badge.d.ts +8 -0
  12. package/dist/components/Breadcrumb/Breadcrumb.d.ts +9 -0
  13. package/dist/components/Button/Button.d.ts +12 -0
  14. package/dist/components/Card/Card.d.ts +9 -0
  15. package/dist/components/Checkbox/Checkbox.d.ts +8 -0
  16. package/dist/components/Divider/Divider.d.ts +6 -0
  17. package/dist/components/Drawer/Drawer.d.ts +11 -0
  18. package/dist/components/Dropdown/Dropdown.d.ts +14 -0
  19. package/dist/components/EmptyState/EmptyState.d.ts +8 -0
  20. package/dist/components/Field/Field.d.ts +9 -0
  21. package/dist/components/FileUpload/FileUpload.d.ts +13 -0
  22. package/dist/components/Form/Form.d.ts +6 -0
  23. package/dist/components/Input/Input.d.ts +15 -0
  24. package/dist/components/Loading/Loading.d.ts +5 -0
  25. package/dist/components/Modal/Modal.d.ts +9 -0
  26. package/dist/components/PageHeader/PageHeader.d.ts +7 -0
  27. package/dist/components/Pagination/Pagination.d.ts +8 -0
  28. package/dist/components/ProgressBar/ProgressBar.d.ts +8 -0
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +14 -0
  30. package/dist/components/SearchInput/SearchInput.d.ts +8 -0
  31. package/dist/components/Select/Select.d.ts +18 -0
  32. package/dist/components/Slider/Slider.d.ts +10 -0
  33. package/dist/components/StatCard/StatCard.d.ts +9 -0
  34. package/dist/components/Steps/Steps.d.ts +12 -0
  35. package/dist/components/Switch/Switch.d.ts +8 -0
  36. package/dist/components/Table/Table.d.ts +13 -0
  37. package/dist/components/Tabs/Tabs.d.ts +12 -0
  38. package/dist/components/Tag/Tag.d.ts +8 -0
  39. package/dist/components/Textarea/Textarea.d.ts +13 -0
  40. package/dist/components/Toast/Toast.d.ts +12 -0
  41. package/dist/components/Tooltip/Tooltip.d.ts +9 -0
  42. package/dist/components/index.d.ts +75 -0
  43. package/dist/components/index.js +887 -0
  44. package/dist/components/style.css +1779 -0
  45. package/package.json +7 -2
@@ -0,0 +1,1779 @@
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-overlay {
523
+ position: fixed;
524
+ inset: 0;
525
+ background: rgba(0, 0, 0, 0.4);
526
+ z-index: -1;
527
+ }
528
+
529
+ .wf-modal-content {
530
+ background: var(--wf-color-bg);
531
+ border-radius: var(--wf-radius-md);
532
+ box-shadow: var(--wf-shadow-lg);
533
+ min-width: 400px;
534
+ max-width: 90vw;
535
+ max-height: 80vh;
536
+ display: flex;
537
+ flex-direction: column;
538
+ z-index: 1;
539
+ }
540
+
541
+ .wf-modal-header {
542
+ display: flex;
543
+ align-items: center;
544
+ justify-content: space-between;
545
+ padding: var(--wf-space-md) var(--wf-space-lg);
546
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
547
+ font-size: var(--wf-font-size-lg);
548
+ font-weight: var(--wf-font-weight-semibold);
549
+ }
550
+
551
+ .wf-modal-close {
552
+ background: none;
553
+ border: none;
554
+ font-size: var(--wf-font-size-lg);
555
+ cursor: pointer;
556
+ color: var(--wf-color-text-secondary);
557
+ padding: 4px;
558
+ line-height: 1;
559
+ }
560
+ .wf-modal-close:hover {
561
+ color: var(--wf-color-text);
562
+ }
563
+
564
+ .wf-modal-body {
565
+ padding: var(--wf-space-lg);
566
+ overflow-y: auto;
567
+ flex: 1;
568
+ }
569
+
570
+ .wf-modal-footer {
571
+ display: flex;
572
+ justify-content: flex-end;
573
+ gap: var(--wf-gap-sm);
574
+ padding: var(--wf-space-md) var(--wf-space-lg);
575
+ border-top: var(--wf-border-width) solid var(--wf-color-border);
576
+ }
577
+
578
+ /* weifuwu/components — Toast */
579
+
580
+ .wf-toast-container {
581
+ position: fixed;
582
+ top: var(--wf-space-lg);
583
+ right: var(--wf-space-lg);
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: var(--wf-gap-sm);
587
+ z-index: var(--wf-cover-z, 100);
588
+ pointer-events: none;
589
+ }
590
+
591
+ .wf-toast {
592
+ display: flex;
593
+ align-items: center;
594
+ gap: var(--wf-gap-sm);
595
+ padding: var(--wf-space) var(--wf-space-md);
596
+ border-radius: var(--wf-radius);
597
+ box-shadow: var(--wf-shadow-md);
598
+ font-family: var(--wf-font-sans);
599
+ font-size: var(--wf-font-size-sm);
600
+ min-width: 260px;
601
+ max-width: 400px;
602
+ cursor: pointer;
603
+ pointer-events: auto;
604
+ animation: wf-toast-in 0.2s ease;
605
+ }
606
+
607
+ @keyframes wf-toast-in {
608
+ from { opacity: 0; transform: translateX(20px); }
609
+ to { opacity: 1; transform: translateX(0); }
610
+ }
611
+
612
+ .wf-toast--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
613
+ .wf-toast--error { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
614
+ .wf-toast--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
615
+ .wf-toast--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
616
+
617
+ .wf-toast-icon {
618
+ font-size: var(--wf-font-size-lg);
619
+ font-weight: var(--wf-font-weight-bold);
620
+ }
621
+
622
+ .wf-toast-msg {
623
+ flex: 1;
624
+ color: var(--wf-color-text);
625
+ }
626
+
627
+ /* weifuwu/components — Alert */
628
+
629
+ .wf-alert {
630
+ display: flex;
631
+ align-items: flex-start;
632
+ gap: var(--wf-gap-sm);
633
+ padding: var(--wf-space) var(--wf-space-md);
634
+ border-radius: var(--wf-radius);
635
+ font-family: var(--wf-font-sans);
636
+ font-size: var(--wf-font-size-sm);
637
+ line-height: var(--wf-line-height);
638
+ }
639
+
640
+ .wf-alert--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
641
+ .wf-alert--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
642
+ .wf-alert--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
643
+ .wf-alert--error { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
644
+
645
+ .wf-alert-icon {
646
+ font-weight: var(--wf-font-weight-bold);
647
+ flex-shrink: 0;
648
+ }
649
+
650
+ .wf-alert-msg {
651
+ flex: 1;
652
+ color: var(--wf-color-text);
653
+ }
654
+
655
+ .wf-alert-close {
656
+ background: none;
657
+ border: none;
658
+ cursor: pointer;
659
+ font-size: var(--wf-font-size-sm);
660
+ opacity: 0.6;
661
+ color: inherit;
662
+ padding: 2px;
663
+ line-height: 1;
664
+ flex-shrink: 0;
665
+ }
666
+ .wf-alert-close:hover {
667
+ opacity: 1;
668
+ }
669
+
670
+ /* weifuwu/components — Loading */
671
+
672
+ .wf-loading {
673
+ display: flex;
674
+ flex-direction: column;
675
+ align-items: center;
676
+ justify-content: center;
677
+ gap: var(--wf-gap-sm);
678
+ padding: var(--wf-space-2xl);
679
+ color: var(--wf-color-text-secondary);
680
+ }
681
+
682
+ .wf-loading-spinner {
683
+ width: 24px;
684
+ height: 24px;
685
+ border: 3px solid var(--wf-color-border);
686
+ border-top-color: var(--wf-color-primary);
687
+ border-radius: 50%;
688
+ animation: wf-spin 0.6s linear infinite;
689
+ }
690
+
691
+ @keyframes wf-spin {
692
+ to { transform: rotate(360deg); }
693
+ }
694
+
695
+ .wf-loading-text {
696
+ font-family: var(--wf-font-sans);
697
+ font-size: var(--wf-font-size-sm);
698
+ }
699
+
700
+ /* weifuwu/components — EmptyState */
701
+
702
+ .wf-empty {
703
+ display: flex;
704
+ flex-direction: column;
705
+ align-items: center;
706
+ justify-content: center;
707
+ gap: var(--wf-gap-sm);
708
+ padding: var(--wf-space-2xl) var(--wf-space-lg);
709
+ text-align: center;
710
+ }
711
+
712
+ .wf-empty-icon {
713
+ font-size: 48px;
714
+ line-height: 1;
715
+ margin-bottom: var(--wf-gap-xs);
716
+ }
717
+
718
+ .wf-empty-text {
719
+ font-family: var(--wf-font-sans);
720
+ font-size: var(--wf-font-size-base);
721
+ font-weight: var(--wf-font-weight-medium);
722
+ color: var(--wf-color-text-secondary);
723
+ }
724
+
725
+ .wf-empty-hint {
726
+ font-family: var(--wf-font-sans);
727
+ font-size: var(--wf-font-size-sm);
728
+ color: var(--wf-color-text-tertiary);
729
+ max-width: 320px;
730
+ line-height: var(--wf-line-height);
731
+ }
732
+
733
+ .wf-empty-action {
734
+ margin-top: var(--wf-gap-sm);
735
+ }
736
+
737
+ /* weifuwu/components — Tabs */
738
+
739
+ .wf-tabs {
740
+ font-family: var(--wf-font-sans);
741
+ }
742
+
743
+ .wf-tab-list {
744
+ display: flex;
745
+ gap: 0;
746
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
747
+ }
748
+
749
+ .wf-tab {
750
+ padding: var(--wf-space) var(--wf-space-md);
751
+ border: none;
752
+ background: none;
753
+ font-family: inherit;
754
+ font-size: var(--wf-font-size-sm);
755
+ font-weight: var(--wf-font-weight-medium);
756
+ color: var(--wf-color-text-secondary);
757
+ cursor: pointer;
758
+ border-bottom: 2px solid transparent;
759
+ margin-bottom: -1px;
760
+ transition: all var(--wf-transition);
761
+ white-space: nowrap;
762
+ }
763
+
764
+ .wf-tab:hover {
765
+ color: var(--wf-color-text);
766
+ }
767
+
768
+ .wf-tab--active {
769
+ color: var(--wf-color-primary);
770
+ border-bottom-color: var(--wf-color-primary);
771
+ }
772
+
773
+ .wf-tab-content {
774
+ padding-top: var(--wf-space-md);
775
+ }
776
+
777
+ /* weifuwu/components — Dropdown */
778
+
779
+ .wf-dropdown {
780
+ position: relative;
781
+ display: inline-block;
782
+ }
783
+
784
+ .wf-dropdown-menu {
785
+ position: absolute;
786
+ top: 100%;
787
+ left: 0;
788
+ margin-top: var(--wf-gap-xs);
789
+ min-width: 140px;
790
+ background: var(--wf-color-bg);
791
+ border: var(--wf-border-width) solid var(--wf-color-border);
792
+ border-radius: var(--wf-radius);
793
+ box-shadow: var(--wf-shadow-md);
794
+ z-index: var(--wf-pop-z);
795
+ padding: var(--wf-space-xs) 0;
796
+ }
797
+
798
+ .wf-dropdown--open {
799
+ z-index: var(--wf-cover-z);
800
+ }
801
+ }
802
+
803
+ .wf-dropdown-item {
804
+ display: block;
805
+ width: 100%;
806
+ text-align: left;
807
+ padding: var(--wf-space-sm) var(--wf-space-md);
808
+ border: none;
809
+ background: none;
810
+ font-family: var(--wf-font-sans);
811
+ font-size: var(--wf-font-size-sm);
812
+ color: var(--wf-color-text);
813
+ cursor: pointer;
814
+ white-space: nowrap;
815
+ }
816
+
817
+ .wf-dropdown-item:hover {
818
+ background: var(--wf-color-bg-tertiary);
819
+ }
820
+
821
+ .wf-dropdown-item:disabled {
822
+ opacity: var(--wf-opacity-disabled);
823
+ cursor: not-allowed;
824
+ }
825
+
826
+ .wf-dropdown-item--danger {
827
+ color: var(--wf-color-error);
828
+ }
829
+
830
+ /* weifuwu/components — Pagination */
831
+
832
+ .wf-pagination {
833
+ display: flex;
834
+ align-items: center;
835
+ gap: var(--wf-gap-xs);
836
+ font-family: var(--wf-font-sans);
837
+ font-size: var(--wf-font-size-sm);
838
+ }
839
+
840
+ .wf-page-btn {
841
+ display: inline-flex;
842
+ align-items: center;
843
+ justify-content: center;
844
+ min-width: 32px;
845
+ height: 32px;
846
+ padding: 0 var(--wf-space-xs);
847
+ border: var(--wf-border-width) solid var(--wf-color-border);
848
+ border-radius: var(--wf-radius);
849
+ background: var(--wf-color-bg);
850
+ color: var(--wf-color-text);
851
+ cursor: pointer;
852
+ font-family: inherit;
853
+ font-size: inherit;
854
+ transition: all var(--wf-transition);
855
+ }
856
+
857
+ .wf-page-btn:hover:not(:disabled):not(.wf-page-btn--active) {
858
+ border-color: var(--wf-color-primary);
859
+ color: var(--wf-color-primary);
860
+ }
861
+
862
+ .wf-page-btn--active {
863
+ background: var(--wf-color-primary);
864
+ border-color: var(--wf-color-primary);
865
+ color: #fff;
866
+ }
867
+
868
+ .wf-page-btn--disabled {
869
+ opacity: var(--wf-opacity-disabled);
870
+ cursor: not-allowed;
871
+ }
872
+
873
+ .wf-page-ellipsis {
874
+ padding: 0 var(--wf-space-xs);
875
+ color: var(--wf-color-text-tertiary);
876
+ }
877
+
878
+ /* weifuwu/components — Card */
879
+
880
+ .wf-card {
881
+ border-radius: var(--wf-surface-radius);
882
+ background: var(--wf-surface-bg);
883
+ font-family: var(--wf-font-sans);
884
+ }
885
+
886
+ .wf-card--default {
887
+ box-shadow: var(--wf-surface-shadow);
888
+ }
889
+
890
+ .wf-card--outlined {
891
+ border: var(--wf-border-width) solid var(--wf-color-border);
892
+ }
893
+
894
+ .wf-card--pad-sm { padding: var(--wf-space-sm); }
895
+ .wf-card--pad-md { padding: var(--wf-space-md); }
896
+ .wf-card--pad-lg { padding: var(--wf-space-lg); }
897
+
898
+ .wf-card--clickable {
899
+ cursor: pointer;
900
+ transition: box-shadow var(--wf-transition);
901
+ }
902
+
903
+ .wf-card--clickable:hover {
904
+ box-shadow: var(--wf-shadow-md);
905
+ }
906
+
907
+ /* weifuwu/components — Badge */
908
+
909
+ .wf-badge {
910
+ display: inline-flex;
911
+ align-items: center;
912
+ padding: 2px var(--wf-space-sm);
913
+ border-radius: 10px;
914
+ font-family: var(--wf-font-sans);
915
+ font-size: var(--wf-font-size-xs);
916
+ font-weight: var(--wf-font-weight-medium);
917
+ line-height: 1.4;
918
+ white-space: nowrap;
919
+ }
920
+
921
+ .wf-badge--default { background: var(--wf-color-bg-tertiary); color: var(--wf-color-text-secondary); }
922
+ .wf-badge--primary { background: var(--wf-color-primary-bg); color: var(--wf-color-primary); }
923
+ .wf-badge--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
924
+ .wf-badge--warning { background: var(--wf-color-warning-bg); color: var(--wf-color-warning); }
925
+ .wf-badge--danger { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
926
+ .wf-badge--info { background: var(--wf-color-info-bg); color: var(--wf-color-info); }
927
+
928
+ /* Dot variant */
929
+ .wf-badge-dot {
930
+ display: inline-block;
931
+ width: 8px;
932
+ height: 8px;
933
+ border-radius: 50%;
934
+ }
935
+
936
+ .wf-badge-dot--default { background: var(--wf-color-text-tertiary); }
937
+ .wf-badge-dot--primary { background: var(--wf-color-primary); }
938
+ .wf-badge-dot--success { background: var(--wf-color-success); }
939
+ .wf-badge-dot--warning { background: var(--wf-color-warning); }
940
+ .wf-badge-dot--danger { background: var(--wf-color-error); }
941
+ .wf-badge-dot--info { background: var(--wf-color-info); }
942
+
943
+ /* weifuwu/components — Avatar */
944
+
945
+ .wf-avatar {
946
+ display: inline-flex;
947
+ align-items: center;
948
+ justify-content: center;
949
+ border-radius: 50%;
950
+ font-family: var(--wf-font-sans);
951
+ font-weight: var(--wf-font-weight-semibold);
952
+ color: #fff;
953
+ flex-shrink: 0;
954
+ overflow: hidden;
955
+ object-fit: cover;
956
+ }
957
+
958
+ .wf-avatar--sm { width: 24px; height: 24px; font-size: 11px; }
959
+ .wf-avatar--md { width: 32px; height: 32px; font-size: 13px; }
960
+ .wf-avatar--lg { width: 40px; height: 40px; font-size: 16px; }
961
+
962
+ /* weifuwu/components — Tag */
963
+
964
+ .wf-tag {
965
+ display: inline-flex;
966
+ align-items: center;
967
+ gap: var(--wf-gap-xs);
968
+ padding: 2px var(--wf-space-sm);
969
+ border-radius: var(--wf-radius-sm);
970
+ font-family: var(--wf-font-sans);
971
+ font-size: var(--wf-font-size-xs);
972
+ line-height: 1.5;
973
+ }
974
+
975
+ .wf-tag--default { background: var(--wf-color-bg-tertiary); color: var(--wf-color-text-secondary); }
976
+ .wf-tag--primary { background: var(--wf-color-primary-bg); color: var(--wf-color-primary); }
977
+ .wf-tag--success { background: var(--wf-color-success-bg); color: var(--wf-color-success); }
978
+ .wf-tag--danger { background: var(--wf-color-error-bg); color: var(--wf-color-error); }
979
+
980
+ .wf-tag-text { }
981
+
982
+ .wf-tag-close {
983
+ background: none;
984
+ border: none;
985
+ cursor: pointer;
986
+ font-size: 10px;
987
+ padding: 0;
988
+ line-height: 1;
989
+ opacity: 0.6;
990
+ color: inherit;
991
+ }
992
+ .wf-tag-close:hover { opacity: 1; }
993
+
994
+ /* weifuwu/components — StatCard */
995
+
996
+ .wf-stat {
997
+ display: flex;
998
+ flex-direction: column;
999
+ gap: var(--wf-gap-xs);
1000
+ padding: var(--wf-space-md);
1001
+ border-radius: var(--wf-radius-md);
1002
+ background: var(--wf-surface-bg);
1003
+ box-shadow: var(--wf-surface-shadow);
1004
+ font-family: var(--wf-font-sans);
1005
+ }
1006
+
1007
+ .wf-stat-icon {
1008
+ font-size: 24px;
1009
+ line-height: 1;
1010
+ margin-bottom: var(--wf-gap-xs);
1011
+ }
1012
+
1013
+ .wf-stat-value {
1014
+ font-size: var(--wf-font-size-3xl);
1015
+ font-weight: var(--wf-font-weight-bold);
1016
+ color: var(--wf-color-text);
1017
+ line-height: 1;
1018
+ }
1019
+
1020
+ .wf-stat-label {
1021
+ font-size: var(--wf-font-size-sm);
1022
+ color: var(--wf-color-text-secondary);
1023
+ }
1024
+
1025
+ .wf-stat-trend {
1026
+ display: flex;
1027
+ align-items: center;
1028
+ gap: var(--wf-gap-xs);
1029
+ font-size: var(--wf-font-size-xs);
1030
+ margin-top: var(--wf-gap-xs);
1031
+ }
1032
+
1033
+ .wf-stat-trend--up { color: var(--wf-color-success); }
1034
+ .wf-stat-trend--down { color: var(--wf-color-error); }
1035
+
1036
+ .wf-stat-trend-arrow {
1037
+ font-weight: var(--wf-font-weight-bold);
1038
+ }
1039
+
1040
+ /* weifuwu/components — Steps */
1041
+
1042
+ .wf-steps {
1043
+ display: flex;
1044
+ align-items: flex-start;
1045
+ font-family: var(--wf-font-sans);
1046
+ }
1047
+
1048
+ .wf-step {
1049
+ display: flex;
1050
+ flex-direction: column;
1051
+ align-items: center;
1052
+ flex: 1;
1053
+ position: relative;
1054
+ gap: var(--wf-gap-xs);
1055
+ }
1056
+
1057
+ .wf-step-num {
1058
+ width: 28px;
1059
+ height: 28px;
1060
+ border-radius: 50%;
1061
+ display: flex;
1062
+ align-items: center;
1063
+ justify-content: center;
1064
+ font-size: var(--wf-font-size-sm);
1065
+ font-weight: var(--wf-font-weight-semibold);
1066
+ background: var(--wf-color-bg-tertiary);
1067
+ color: var(--wf-color-text-secondary);
1068
+ flex-shrink: 0;
1069
+ }
1070
+
1071
+ .wf-step--done .wf-step-num {
1072
+ background: var(--wf-color-primary);
1073
+ color: #fff;
1074
+ font-size: 14px;
1075
+ }
1076
+
1077
+ .wf-step--current .wf-step-num {
1078
+ background: var(--wf-color-primary);
1079
+ color: #fff;
1080
+ box-shadow: 0 0 0 3px var(--wf-color-primary-bg);
1081
+ }
1082
+
1083
+ .wf-step-label {
1084
+ font-size: var(--wf-font-size-sm);
1085
+ font-weight: var(--wf-font-weight-medium);
1086
+ color: var(--wf-color-text);
1087
+ text-align: center;
1088
+ }
1089
+
1090
+ .wf-step--current .wf-step-label {
1091
+ color: var(--wf-color-primary);
1092
+ }
1093
+
1094
+ .wf-step-desc {
1095
+ font-size: var(--wf-font-size-xs);
1096
+ color: var(--wf-color-text-tertiary);
1097
+ text-align: center;
1098
+ }
1099
+
1100
+ .wf-step-connector {
1101
+ position: absolute;
1102
+ top: 14px;
1103
+ left: calc(50% + 18px);
1104
+ right: calc(-50% + 18px);
1105
+ height: 2px;
1106
+ background: var(--wf-color-border);
1107
+ }
1108
+
1109
+ .wf-step-connector--done {
1110
+ background: var(--wf-color-primary);
1111
+ }
1112
+
1113
+ /* weifuwu/components — Form */
1114
+
1115
+ .wf-form {
1116
+ display: flex;
1117
+ flex-direction: column;
1118
+ gap: var(--wf-gap-md);
1119
+ }
1120
+
1121
+ /* weifuwu/components — Field */
1122
+
1123
+ .wf-field {
1124
+ display: flex;
1125
+ flex-direction: column;
1126
+ gap: var(--wf-gap-xs);
1127
+ }
1128
+
1129
+ .wf-field-label {
1130
+ font-size: var(--wf-font-size-sm);
1131
+ font-weight: var(--wf-font-weight-medium);
1132
+ color: var(--wf-color-text);
1133
+ }
1134
+
1135
+ .wf-field-req {
1136
+ color: var(--wf-color-error);
1137
+ margin-left: 2px;
1138
+ }
1139
+
1140
+ .wf-field-err {
1141
+ font-size: var(--wf-font-size-xs);
1142
+ color: var(--wf-color-error);
1143
+ }
1144
+
1145
+ .wf-field-hint {
1146
+ font-size: var(--wf-font-size-xs);
1147
+ color: var(--wf-color-text-tertiary);
1148
+ }
1149
+
1150
+ .wf-field--err .wf-field-label {
1151
+ color: var(--wf-color-error);
1152
+ }
1153
+
1154
+ /* weifuwu/components — Slider */
1155
+
1156
+ .wf-slider-wrap {
1157
+ display: flex;
1158
+ flex-direction: column;
1159
+ gap: var(--wf-gap-xs);
1160
+ }
1161
+
1162
+ .wf-slider-label {
1163
+ font-size: var(--wf-font-size-sm);
1164
+ font-weight: var(--wf-font-weight-medium);
1165
+ color: var(--wf-color-text);
1166
+ }
1167
+
1168
+ .wf-slider {
1169
+ display: flex;
1170
+ align-items: center;
1171
+ gap: var(--wf-gap-md);
1172
+ }
1173
+
1174
+ .wf-slider-input {
1175
+ flex: 1;
1176
+ height: 6px;
1177
+ appearance: none;
1178
+ background: var(--wf-color-border);
1179
+ border-radius: 3px;
1180
+ outline: none;
1181
+ cursor: pointer;
1182
+ }
1183
+
1184
+ .wf-slider-input::-webkit-slider-thumb {
1185
+ appearance: none;
1186
+ width: 18px;
1187
+ height: 18px;
1188
+ border-radius: 50%;
1189
+ background: var(--wf-color-primary);
1190
+ cursor: pointer;
1191
+ border: 2px solid #fff;
1192
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
1193
+ }
1194
+
1195
+ .wf-slider-input:focus-visible {
1196
+ box-shadow: var(--wf-focus-ring);
1197
+ }
1198
+
1199
+ .wf-slider-value {
1200
+ font-size: var(--wf-font-size-sm);
1201
+ font-weight: var(--wf-font-weight-semibold);
1202
+ color: var(--wf-color-text);
1203
+ min-width: 30px;
1204
+ text-align: center;
1205
+ }
1206
+
1207
+ /* weifuwu/components — SearchInput */
1208
+
1209
+ .wf-search {
1210
+ display: flex;
1211
+ align-items: center;
1212
+ gap: var(--wf-gap-sm);
1213
+ padding: var(--wf-space-sm) var(--wf-space);
1214
+ border: var(--wf-border-width) solid var(--wf-color-border);
1215
+ border-radius: var(--wf-radius);
1216
+ background: var(--wf-color-bg);
1217
+ transition: all var(--wf-transition);
1218
+ }
1219
+
1220
+ .wf-search:focus-within {
1221
+ border-color: var(--wf-color-primary);
1222
+ box-shadow: var(--wf-focus-ring);
1223
+ }
1224
+
1225
+ .wf-search-icon {
1226
+ font-size: var(--wf-font-size-sm);
1227
+ flex-shrink: 0;
1228
+ line-height: 1;
1229
+ }
1230
+
1231
+ .wf-search-input {
1232
+ flex: 1;
1233
+ border: none;
1234
+ outline: none;
1235
+ background: none;
1236
+ font-family: var(--wf-font-sans);
1237
+ font-size: var(--wf-font-size-sm);
1238
+ color: var(--wf-color-text);
1239
+ padding: 0;
1240
+ }
1241
+
1242
+ .wf-search-input::placeholder {
1243
+ color: var(--wf-color-text-tertiary);
1244
+ }
1245
+
1246
+ .wf-search-clear {
1247
+ background: none;
1248
+ border: none;
1249
+ cursor: pointer;
1250
+ font-size: 12px;
1251
+ color: var(--wf-color-text-tertiary);
1252
+ padding: 2px;
1253
+ line-height: 1;
1254
+ flex-shrink: 0;
1255
+ }
1256
+
1257
+ .wf-search-clear:hover {
1258
+ color: var(--wf-color-text);
1259
+ }
1260
+
1261
+ /* weifuwu/components — ProgressBar */
1262
+
1263
+ .wf-progress-wrap {
1264
+ display: flex;
1265
+ align-items: center;
1266
+ gap: var(--wf-gap-sm);
1267
+ }
1268
+
1269
+ .wf-progress-label {
1270
+ font-size: var(--wf-font-size-sm);
1271
+ color: var(--wf-color-text-secondary);
1272
+ white-space: nowrap;
1273
+ min-width: 60px;
1274
+ }
1275
+
1276
+ .wf-progress {
1277
+ flex: 1;
1278
+ height: 8px;
1279
+ background: var(--wf-color-bg-tertiary);
1280
+ border-radius: 4px;
1281
+ overflow: hidden;
1282
+ }
1283
+
1284
+ .wf-progress-fill {
1285
+ height: 100%;
1286
+ background: var(--wf-color-primary);
1287
+ border-radius: 4px;
1288
+ transition: width var(--wf-transition);
1289
+ }
1290
+
1291
+ .wf-progress-value {
1292
+ font-size: var(--wf-font-size-sm);
1293
+ font-weight: var(--wf-font-weight-medium);
1294
+ color: var(--wf-color-text-secondary);
1295
+ min-width: 40px;
1296
+ text-align: right;
1297
+ }
1298
+
1299
+ /* weifuwu/components — Accordion */
1300
+
1301
+ .wf-accordion {
1302
+ display: flex;
1303
+ flex-direction: column;
1304
+ border: var(--wf-border-width) solid var(--wf-color-border);
1305
+ border-radius: var(--wf-radius);
1306
+ overflow: hidden;
1307
+ font-family: var(--wf-font-sans);
1308
+ }
1309
+
1310
+ .wf-accordion-item {
1311
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
1312
+ }
1313
+
1314
+ .wf-accordion-item:last-child {
1315
+ border-bottom: none;
1316
+ }
1317
+
1318
+ .wf-accordion-summary {
1319
+ padding: var(--wf-space) var(--wf-space-md);
1320
+ font-size: var(--wf-font-size-sm);
1321
+ font-weight: var(--wf-font-weight-medium);
1322
+ color: var(--wf-color-text);
1323
+ cursor: pointer;
1324
+ user-select: none;
1325
+ }
1326
+
1327
+ .wf-accordion-summary:hover {
1328
+ background: var(--wf-color-bg-tertiary);
1329
+ }
1330
+
1331
+ .wf-accordion-content {
1332
+ padding: var(--wf-space) var(--wf-space-md) var(--wf-space-md);
1333
+ font-size: var(--wf-font-size-sm);
1334
+ color: var(--wf-color-text-secondary);
1335
+ }
1336
+
1337
+ /* weifuwu/components — PageHeader */
1338
+
1339
+ .wf-page-head {
1340
+ display: flex;
1341
+ align-items: flex-start;
1342
+ justify-content: space-between;
1343
+ gap: var(--wf-gap-md);
1344
+ margin-bottom: var(--wf-space-md);
1345
+ }
1346
+
1347
+ .wf-page-head-left {
1348
+ display: flex;
1349
+ flex-direction: column;
1350
+ gap: var(--wf-gap-xs);
1351
+ }
1352
+
1353
+ .wf-page-title {
1354
+ font-family: var(--wf-font-sans);
1355
+ font-size: var(--wf-font-size-2xl);
1356
+ font-weight: var(--wf-font-weight-semibold);
1357
+ color: var(--wf-color-text);
1358
+ margin: 0;
1359
+ line-height: var(--wf-line-height-tight);
1360
+ }
1361
+
1362
+ .wf-page-sub {
1363
+ font-family: var(--wf-font-sans);
1364
+ font-size: var(--wf-font-size-sm);
1365
+ color: var(--wf-color-text-secondary);
1366
+ margin: 0;
1367
+ }
1368
+
1369
+ .wf-page-head-actions {
1370
+ display: flex;
1371
+ align-items: center;
1372
+ gap: var(--wf-gap-sm);
1373
+ flex-shrink: 0;
1374
+ }
1375
+
1376
+ /* weifuwu/components — Breadcrumb */
1377
+
1378
+ .wf-breadcrumb {
1379
+ display: flex;
1380
+ align-items: center;
1381
+ gap: var(--wf-gap-xs);
1382
+ font-family: var(--wf-font-sans);
1383
+ font-size: var(--wf-font-size-sm);
1384
+ color: var(--wf-color-text-secondary);
1385
+ line-height: var(--wf-line-height-normal);
1386
+ }
1387
+
1388
+ .wf-breadcrumb-link {
1389
+ color: var(--wf-color-primary);
1390
+ text-decoration: none;
1391
+ }
1392
+
1393
+ .wf-breadcrumb-link:hover {
1394
+ text-decoration: underline;
1395
+ }
1396
+
1397
+ .wf-breadcrumb-current {
1398
+ color: var(--wf-color-text);
1399
+ font-weight: var(--wf-font-weight-medium);
1400
+ }
1401
+
1402
+ .wf-breadcrumb-sep {
1403
+ color: var(--wf-color-text-tertiary);
1404
+ user-select: none;
1405
+ }
1406
+
1407
+ .wf-breadcrumb-text {
1408
+ color: var(--wf-color-text-secondary);
1409
+ }
1410
+
1411
+ /* weifuwu/components — Divider */
1412
+
1413
+ .wf-divider {
1414
+ border: none;
1415
+ border-top: 1px solid var(--wf-color-border);
1416
+ margin: var(--wf-space-md) 0;
1417
+ height: 0;
1418
+ }
1419
+
1420
+ .wf-divider--vertical {
1421
+ display: inline-block;
1422
+ width: 0;
1423
+ height: 1em;
1424
+ margin: 0 var(--wf-space-sm);
1425
+ border-top: none;
1426
+ border-left: 1px solid var(--wf-color-border);
1427
+ vertical-align: middle;
1428
+ }
1429
+
1430
+ .wf-divider--with-text {
1431
+ display: flex;
1432
+ align-items: center;
1433
+ border: none;
1434
+ height: auto;
1435
+ gap: var(--wf-gap-md);
1436
+ }
1437
+
1438
+ .wf-divider--with-text::before,
1439
+ .wf-divider--with-text::after {
1440
+ content: '';
1441
+ flex: 1;
1442
+ border-top: 1px solid var(--wf-color-border);
1443
+ }
1444
+
1445
+ .wf-divider-text {
1446
+ font-family: var(--wf-font-sans);
1447
+ font-size: var(--wf-font-size-sm);
1448
+ color: var(--wf-color-text-secondary);
1449
+ white-space: nowrap;
1450
+ flex-shrink: 0;
1451
+ }
1452
+
1453
+ /* weifuwu/components — FileUpload */
1454
+
1455
+ .wf-upload {
1456
+ display: flex;
1457
+ flex-direction: column;
1458
+ gap: var(--wf-gap-sm);
1459
+ }
1460
+
1461
+ .wf-upload-zone {
1462
+ display: flex;
1463
+ flex-direction: column;
1464
+ align-items: center;
1465
+ justify-content: center;
1466
+ gap: var(--wf-gap-xs);
1467
+ padding: var(--wf-space-lg);
1468
+ border: 2px dashed var(--wf-color-border);
1469
+ border-radius: var(--wf-radius);
1470
+ background: var(--wf-color-bg-secondary);
1471
+ cursor: pointer;
1472
+ transition: all var(--wf-transition);
1473
+ min-height: 120px;
1474
+ }
1475
+
1476
+ .wf-upload-zone:hover {
1477
+ border-color: var(--wf-color-primary);
1478
+ background: var(--wf-color-bg);
1479
+ }
1480
+
1481
+ .wf-upload-zone--disabled {
1482
+ opacity: var(--wf-opacity-disabled);
1483
+ cursor: not-allowed;
1484
+ }
1485
+
1486
+ .wf-upload-zone--err {
1487
+ border-color: var(--wf-color-error);
1488
+ }
1489
+
1490
+ .wf-upload-placeholder {
1491
+ display: flex;
1492
+ flex-direction: column;
1493
+ align-items: center;
1494
+ gap: var(--wf-gap-xs);
1495
+ }
1496
+
1497
+ .wf-upload-icon {
1498
+ font-size: 24px;
1499
+ line-height: 1;
1500
+ }
1501
+
1502
+ .wf-upload-text {
1503
+ font-family: var(--wf-font-sans);
1504
+ font-size: var(--wf-font-size-sm);
1505
+ color: var(--wf-color-text-secondary);
1506
+ }
1507
+
1508
+ .wf-upload-hint {
1509
+ font-family: var(--wf-font-sans);
1510
+ font-size: var(--wf-font-size-xs);
1511
+ color: var(--wf-color-text-tertiary);
1512
+ }
1513
+
1514
+ .wf-upload-list {
1515
+ list-style: none;
1516
+ margin: 0;
1517
+ padding: 0;
1518
+ display: flex;
1519
+ flex-direction: column;
1520
+ gap: var(--wf-gap-xs);
1521
+ }
1522
+
1523
+ .wf-upload-item {
1524
+ display: flex;
1525
+ align-items: center;
1526
+ justify-content: space-between;
1527
+ gap: var(--wf-gap-sm);
1528
+ padding: var(--wf-space-sm) var(--wf-space);
1529
+ border: var(--wf-border-width) solid var(--wf-color-border);
1530
+ border-radius: var(--wf-radius);
1531
+ background: var(--wf-color-bg);
1532
+ }
1533
+
1534
+ .wf-upload-item-info {
1535
+ display: flex;
1536
+ align-items: center;
1537
+ gap: var(--wf-gap-md);
1538
+ min-width: 0;
1539
+ }
1540
+
1541
+ .wf-upload-item-name {
1542
+ font-family: var(--wf-font-sans);
1543
+ font-size: var(--wf-font-size-sm);
1544
+ color: var(--wf-color-text);
1545
+ overflow: hidden;
1546
+ text-overflow: ellipsis;
1547
+ white-space: nowrap;
1548
+ }
1549
+
1550
+ .wf-upload-item-size {
1551
+ font-family: var(--wf-font-sans);
1552
+ font-size: var(--wf-font-size-xs);
1553
+ color: var(--wf-color-text-tertiary);
1554
+ flex-shrink: 0;
1555
+ }
1556
+
1557
+ .wf-upload-item-remove {
1558
+ border: none;
1559
+ background: transparent;
1560
+ color: var(--wf-color-text-tertiary);
1561
+ cursor: pointer;
1562
+ padding: 2px 4px;
1563
+ font-size: 12px;
1564
+ line-height: 1;
1565
+ border-radius: var(--wf-radius-sm);
1566
+ flex-shrink: 0;
1567
+ }
1568
+
1569
+ .wf-upload-item-remove:hover {
1570
+ color: var(--wf-color-error);
1571
+ background: var(--wf-color-error-bg);
1572
+ }
1573
+
1574
+ .wf-upload-err {
1575
+ font-family: var(--wf-font-sans);
1576
+ font-size: var(--wf-font-size-xs);
1577
+ color: var(--wf-color-error);
1578
+ }
1579
+
1580
+ /* weifuwu/components — Tooltip */
1581
+
1582
+ .wf-tooltip-wrap {
1583
+ position: relative;
1584
+ display: inline-flex;
1585
+ }
1586
+
1587
+ .wf-tooltip {
1588
+ position: absolute;
1589
+ z-index: var(--wf-cover-z, 1000);
1590
+ display: flex;
1591
+ flex-direction: column;
1592
+ align-items: center;
1593
+ pointer-events: none;
1594
+ animation: wf-tooltip-fadein 0.15s ease-out;
1595
+ }
1596
+
1597
+ @keyframes wf-tooltip-fadein {
1598
+ from { opacity: 0; transform: translateY(2px); }
1599
+ to { opacity: 1; transform: translateY(0); }
1600
+ }
1601
+
1602
+ .wf-tooltip-content {
1603
+ font-family: var(--wf-font-sans);
1604
+ font-size: var(--wf-font-size-xs);
1605
+ color: var(--wf-color-bg);
1606
+ background: var(--wf-color-text);
1607
+ padding: var(--wf-space-xs) var(--wf-space-sm);
1608
+ border-radius: var(--wf-radius-sm);
1609
+ white-space: nowrap;
1610
+ max-width: 240px;
1611
+ overflow: hidden;
1612
+ text-overflow: ellipsis;
1613
+ line-height: var(--wf-line-height-tight);
1614
+ }
1615
+
1616
+ .wf-tooltip-arrow {
1617
+ width: 6px;
1618
+ height: 6px;
1619
+ background: var(--wf-color-text);
1620
+ transform: rotate(45deg);
1621
+ border-radius: 1px;
1622
+ }
1623
+
1624
+ /* 位置: top (默认) */
1625
+ .wf-tooltip--top {
1626
+ bottom: 100%;
1627
+ left: 50%;
1628
+ transform: translateX(-50%);
1629
+ padding-bottom: 4px;
1630
+ }
1631
+
1632
+ .wf-tooltip--top .wf-tooltip-arrow {
1633
+ order: 1;
1634
+ margin-top: -3px;
1635
+ }
1636
+
1637
+ /* 位置: bottom */
1638
+ .wf-tooltip--bottom {
1639
+ top: 100%;
1640
+ left: 50%;
1641
+ transform: translateX(-50%);
1642
+ padding-top: 4px;
1643
+ }
1644
+
1645
+ .wf-tooltip--bottom .wf-tooltip-arrow {
1646
+ order: -1;
1647
+ margin-bottom: -3px;
1648
+ }
1649
+
1650
+ /* 位置: left */
1651
+ .wf-tooltip--left {
1652
+ right: 100%;
1653
+ top: 50%;
1654
+ transform: translateY(-50%);
1655
+ padding-right: 4px;
1656
+ }
1657
+
1658
+ .wf-tooltip--left .wf-tooltip-arrow {
1659
+ order: 1;
1660
+ margin-left: -3px;
1661
+ }
1662
+
1663
+ /* 位置: right */
1664
+ .wf-tooltip--right {
1665
+ left: 100%;
1666
+ top: 50%;
1667
+ transform: translateY(-50%);
1668
+ padding-left: 4px;
1669
+ }
1670
+
1671
+ .wf-tooltip--right .wf-tooltip-arrow {
1672
+ order: -1;
1673
+ margin-right: -3px;
1674
+ }
1675
+
1676
+ /* weifuwu/components — Drawer */
1677
+
1678
+ .wf-drawer {
1679
+ position: fixed;
1680
+ inset: 0;
1681
+ z-index: var(--wf-cover-z, 1000);
1682
+ display: flex;
1683
+ }
1684
+
1685
+ .wf-drawer--left {
1686
+ justify-content: flex-start;
1687
+ }
1688
+
1689
+ .wf-drawer--right {
1690
+ justify-content: flex-end;
1691
+ }
1692
+
1693
+ .wf-drawer-overlay {
1694
+ position: absolute;
1695
+ inset: 0;
1696
+ background: rgba(0, 0, 0, 0.4);
1697
+ animation: wf-drawer-overlay-fadein 0.2s ease-out;
1698
+ }
1699
+
1700
+ @keyframes wf-drawer-overlay-fadein {
1701
+ from { opacity: 0; }
1702
+ to { opacity: 1; }
1703
+ }
1704
+
1705
+ .wf-drawer-panel {
1706
+ position: relative;
1707
+ display: flex;
1708
+ flex-direction: column;
1709
+ width: 360px;
1710
+ max-width: 100vw;
1711
+ height: 100%;
1712
+ background: var(--wf-color-bg);
1713
+ box-shadow: var(--wf-shadow-lg, 0 4px 24px rgba(0, 0, 0, 0.12));
1714
+ animation: wf-drawer-slidein 0.25s ease-out;
1715
+ }
1716
+
1717
+ .wf-drawer-panel--right {
1718
+ animation-name: wf-drawer-slidein-right;
1719
+ }
1720
+
1721
+ .wf-drawer-panel--left {
1722
+ animation-name: wf-drawer-slidein-left;
1723
+ }
1724
+
1725
+ @keyframes wf-drawer-slidein-right {
1726
+ from { transform: translateX(100%); }
1727
+ to { transform: translateX(0); }
1728
+ }
1729
+
1730
+ @keyframes wf-drawer-slidein-left {
1731
+ from { transform: translateX(-100%); }
1732
+ to { transform: translateX(0); }
1733
+ }
1734
+
1735
+ .wf-drawer-header {
1736
+ display: flex;
1737
+ align-items: center;
1738
+ justify-content: space-between;
1739
+ padding: var(--wf-space-md);
1740
+ border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border);
1741
+ font-family: var(--wf-font-sans);
1742
+ font-size: var(--wf-font-size-lg);
1743
+ font-weight: var(--wf-font-weight-semibold);
1744
+ color: var(--wf-color-text);
1745
+ flex-shrink: 0;
1746
+ }
1747
+
1748
+ .wf-drawer-close {
1749
+ border: none;
1750
+ background: transparent;
1751
+ color: var(--wf-color-text-tertiary);
1752
+ cursor: pointer;
1753
+ padding: var(--wf-space-xs);
1754
+ font-size: 16px;
1755
+ line-height: 1;
1756
+ border-radius: var(--wf-radius-sm);
1757
+ }
1758
+
1759
+ .wf-drawer-close:hover {
1760
+ color: var(--wf-color-text);
1761
+ background: var(--wf-color-bg-secondary);
1762
+ }
1763
+
1764
+ .wf-drawer-body {
1765
+ flex: 1;
1766
+ overflow-y: auto;
1767
+ padding: var(--wf-space-md);
1768
+ }
1769
+
1770
+ .wf-drawer-footer {
1771
+ flex-shrink: 0;
1772
+ display: flex;
1773
+ align-items: center;
1774
+ justify-content: flex-end;
1775
+ gap: var(--wf-gap-sm);
1776
+ padding: var(--wf-space-md);
1777
+ border-top: var(--wf-border-width, 1px) solid var(--wf-color-border);
1778
+ }
1779
+