aifastdb 3.7.6 → 3.8.6-mac.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.
@@ -5,947 +5,947 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.adminStyles = void 0;
8
- exports.adminStyles = `
9
- /* ============================================
10
- CSS Variables - 设计令牌
11
- ============================================ */
12
- :root {
13
- --primary: #6366f1;
14
- --primary-hover: #4f46e5;
15
- --secondary: #8b5cf6;
16
- --success: #22c55e;
17
- --warning: #f59e0b;
18
- --danger: #ef4444;
19
- --info: #3b82f6;
20
-
21
- --bg-dark: #0f172a;
22
- --bg-surface: #1e293b;
23
- --bg-surface-hover: #334155;
24
- --bg-input: #0f172a;
25
-
26
- --text-primary: #f1f5f9;
27
- --text-secondary: #94a3b8;
28
- --text-muted: #64748b;
29
-
30
- --border-color: #334155;
31
- --border-radius: 8px;
32
- --border-radius-lg: 12px;
33
-
34
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
35
- --shadow-md: 0 4px 6px rgba(0,0,0,0.4);
36
- --shadow-lg: 0 10px 15px rgba(0,0,0,0.5);
37
-
38
- --transition: all 0.2s ease;
39
-
40
- --sidebar-width: 240px;
41
- --header-height: 60px;
42
- }
43
-
44
- /* ============================================
45
- Reset & Base
46
- ============================================ */
47
- *, *::before, *::after {
48
- box-sizing: border-box;
49
- margin: 0;
50
- padding: 0;
51
- }
52
-
53
- html, body {
54
- height: 100%;
55
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
56
- font-size: 14px;
57
- line-height: 1.5;
58
- color: var(--text-primary);
59
- background: var(--bg-dark);
60
- }
61
-
62
- a {
63
- color: var(--primary);
64
- text-decoration: none;
65
- }
66
-
67
- a:hover {
68
- color: var(--primary-hover);
69
- }
70
-
71
- /* ============================================
72
- Layout
73
- ============================================ */
74
- .admin-layout {
75
- display: flex;
76
- min-height: 100vh;
77
- }
78
-
79
- .admin-sidebar {
80
- width: var(--sidebar-width);
81
- background: var(--bg-surface);
82
- border-right: 1px solid var(--border-color);
83
- display: flex;
84
- flex-direction: column;
85
- position: fixed;
86
- top: 0;
87
- left: 0;
88
- bottom: 0;
89
- z-index: 100;
90
- }
91
-
92
- .admin-main {
93
- flex: 1;
94
- margin-left: var(--sidebar-width);
95
- display: flex;
96
- flex-direction: column;
97
- min-height: 100vh;
98
- }
99
-
100
- .admin-header {
101
- height: var(--header-height);
102
- background: var(--bg-surface);
103
- border-bottom: 1px solid var(--border-color);
104
- display: flex;
105
- align-items: center;
106
- justify-content: space-between;
107
- padding: 0 24px;
108
- position: sticky;
109
- top: 0;
110
- z-index: 50;
111
- }
112
-
113
- .admin-content {
114
- flex: 1;
115
- padding: 24px;
116
- overflow-y: auto;
117
- }
118
-
119
- .admin-footer {
120
- padding: 16px 24px;
121
- background: var(--bg-surface);
122
- border-top: 1px solid var(--border-color);
123
- font-size: 12px;
124
- color: var(--text-muted);
125
- display: flex;
126
- justify-content: space-between;
127
- }
128
-
129
- /* ============================================
130
- Sidebar
131
- ============================================ */
132
- .sidebar-logo {
133
- padding: 20px;
134
- border-bottom: 1px solid var(--border-color);
135
- display: flex;
136
- align-items: center;
137
- gap: 12px;
138
- }
139
-
140
- .sidebar-logo svg {
141
- width: 32px;
142
- height: 32px;
143
- color: var(--primary);
144
- }
145
-
146
- .sidebar-logo h1 {
147
- font-size: 18px;
148
- font-weight: 600;
149
- color: var(--text-primary);
150
- }
151
-
152
- .sidebar-logo span {
153
- font-size: 11px;
154
- color: var(--text-muted);
155
- background: var(--bg-dark);
156
- padding: 2px 6px;
157
- border-radius: 4px;
158
- }
159
-
160
- .sidebar-nav {
161
- flex: 1;
162
- padding: 16px 12px;
163
- overflow-y: auto;
164
- }
165
-
166
- .nav-section {
167
- margin-bottom: 24px;
168
- }
169
-
170
- .nav-section-title {
171
- font-size: 11px;
172
- font-weight: 600;
173
- text-transform: uppercase;
174
- color: var(--text-muted);
175
- padding: 0 12px;
176
- margin-bottom: 8px;
177
- }
178
-
179
- .nav-item {
180
- display: flex;
181
- align-items: center;
182
- gap: 12px;
183
- padding: 10px 12px;
184
- border-radius: var(--border-radius);
185
- color: var(--text-secondary);
186
- transition: var(--transition);
187
- cursor: pointer;
188
- }
189
-
190
- .nav-item:hover {
191
- background: var(--bg-surface-hover);
192
- color: var(--text-primary);
193
- }
194
-
195
- .nav-item.active {
196
- background: var(--primary);
197
- color: white;
198
- }
199
-
200
- .nav-item svg {
201
- width: 20px;
202
- height: 20px;
203
- flex-shrink: 0;
204
- }
205
-
206
- .nav-item span {
207
- font-size: 14px;
208
- }
209
-
210
- /* ============================================
211
- Cards
212
- ============================================ */
213
- .card {
214
- background: var(--bg-surface);
215
- border: 1px solid var(--border-color);
216
- border-radius: var(--border-radius-lg);
217
- padding: 20px;
218
- }
219
-
220
- .card-header {
221
- display: flex;
222
- justify-content: space-between;
223
- align-items: center;
224
- margin-bottom: 16px;
225
- }
226
-
227
- .card-title {
228
- font-size: 16px;
229
- font-weight: 600;
230
- color: var(--text-primary);
231
- }
232
-
233
- .card-subtitle {
234
- font-size: 13px;
235
- color: var(--text-muted);
236
- margin-top: 4px;
237
- }
238
-
239
- /* ============================================
240
- Stats Cards
241
- ============================================ */
242
- .stats-grid {
243
- display: grid;
244
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
245
- gap: 16px;
246
- margin-bottom: 24px;
247
- }
248
-
249
- .stat-card {
250
- background: var(--bg-surface);
251
- border: 1px solid var(--border-color);
252
- border-radius: var(--border-radius-lg);
253
- padding: 20px;
254
- display: flex;
255
- align-items: flex-start;
256
- gap: 16px;
257
- }
258
-
259
- .stat-icon {
260
- width: 48px;
261
- height: 48px;
262
- border-radius: var(--border-radius);
263
- display: flex;
264
- align-items: center;
265
- justify-content: center;
266
- flex-shrink: 0;
267
- }
268
-
269
- .stat-icon svg {
270
- width: 24px;
271
- height: 24px;
272
- }
273
-
274
- .stat-icon.primary { background: rgba(99, 102, 241, 0.2); color: var(--primary); }
275
- .stat-icon.success { background: rgba(34, 197, 94, 0.2); color: var(--success); }
276
- .stat-icon.warning { background: rgba(245, 158, 11, 0.2); color: var(--warning); }
277
- .stat-icon.info { background: rgba(59, 130, 246, 0.2); color: var(--info); }
278
-
279
- .stat-content h3 {
280
- font-size: 24px;
281
- font-weight: 700;
282
- color: var(--text-primary);
283
- margin-bottom: 4px;
284
- }
285
-
286
- .stat-content p {
287
- font-size: 13px;
288
- color: var(--text-muted);
289
- }
290
-
291
- .stat-trend {
292
- font-size: 12px;
293
- margin-top: 8px;
294
- }
295
-
296
- .stat-trend.up { color: var(--success); }
297
- .stat-trend.down { color: var(--danger); }
298
-
299
- /* ============================================
300
- Tables
301
- ============================================ */
302
- .table-container {
303
- overflow-x: auto;
304
- }
305
-
306
- .table {
307
- width: 100%;
308
- border-collapse: collapse;
309
- }
310
-
311
- .table th,
312
- .table td {
313
- padding: 12px 16px;
314
- text-align: left;
315
- border-bottom: 1px solid var(--border-color);
316
- }
317
-
318
- .table th {
319
- font-size: 12px;
320
- font-weight: 600;
321
- text-transform: uppercase;
322
- color: var(--text-muted);
323
- background: var(--bg-dark);
324
- }
325
-
326
- .table tr:hover {
327
- background: var(--bg-surface-hover);
328
- }
329
-
330
- .table td {
331
- font-size: 14px;
332
- color: var(--text-primary);
333
- }
334
-
335
- /* ============================================
336
- Buttons
337
- ============================================ */
338
- .btn {
339
- display: inline-flex;
340
- align-items: center;
341
- justify-content: center;
342
- gap: 8px;
343
- padding: 8px 16px;
344
- border-radius: var(--border-radius);
345
- font-size: 14px;
346
- font-weight: 500;
347
- cursor: pointer;
348
- border: none;
349
- transition: var(--transition);
350
- }
351
-
352
- .btn svg {
353
- width: 16px;
354
- height: 16px;
355
- }
356
-
357
- .btn-primary {
358
- background: var(--primary);
359
- color: white;
360
- }
361
-
362
- .btn-primary:hover {
363
- background: var(--primary-hover);
364
- }
365
-
366
- .btn-secondary {
367
- background: var(--bg-surface-hover);
368
- color: var(--text-primary);
369
- border: 1px solid var(--border-color);
370
- }
371
-
372
- .btn-secondary:hover {
373
- background: var(--bg-dark);
374
- }
375
-
376
- .btn-danger {
377
- background: var(--danger);
378
- color: white;
379
- }
380
-
381
- .btn-danger:hover {
382
- background: #dc2626;
383
- }
384
-
385
- .btn-sm {
386
- padding: 6px 12px;
387
- font-size: 13px;
388
- }
389
-
390
- .btn-icon {
391
- padding: 8px;
392
- }
393
-
394
- /* ============================================
395
- Forms
396
- ============================================ */
397
- .form-group {
398
- margin-bottom: 16px;
399
- }
400
-
401
- .form-label {
402
- display: block;
403
- font-size: 13px;
404
- font-weight: 500;
405
- color: var(--text-secondary);
406
- margin-bottom: 6px;
407
- }
408
-
409
- .form-input,
410
- .form-select,
411
- .form-textarea {
412
- width: 100%;
413
- padding: 10px 12px;
414
- background: var(--bg-input);
415
- border: 1px solid var(--border-color);
416
- border-radius: var(--border-radius);
417
- color: var(--text-primary);
418
- font-size: 14px;
419
- transition: var(--transition);
420
- }
421
-
422
- .form-input:focus,
423
- .form-select:focus,
424
- .form-textarea:focus {
425
- outline: none;
426
- border-color: var(--primary);
427
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
428
- }
429
-
430
- .form-textarea {
431
- min-height: 100px;
432
- resize: vertical;
433
- }
434
-
435
- /* ============================================
436
- Badges
437
- ============================================ */
438
- .badge {
439
- display: inline-flex;
440
- align-items: center;
441
- padding: 4px 8px;
442
- border-radius: 9999px;
443
- font-size: 12px;
444
- font-weight: 500;
445
- }
446
-
447
- .badge-success {
448
- background: rgba(34, 197, 94, 0.2);
449
- color: var(--success);
450
- }
451
-
452
- .badge-warning {
453
- background: rgba(245, 158, 11, 0.2);
454
- color: var(--warning);
455
- }
456
-
457
- .badge-danger {
458
- background: rgba(239, 68, 68, 0.2);
459
- color: var(--danger);
460
- }
461
-
462
- .badge-info {
463
- background: rgba(59, 130, 246, 0.2);
464
- color: var(--info);
465
- }
466
-
467
- /* ============================================
468
- Alerts
469
- ============================================ */
470
- .alert {
471
- padding: 12px 16px;
472
- border-radius: var(--border-radius);
473
- margin-bottom: 16px;
474
- display: flex;
475
- align-items: center;
476
- gap: 12px;
477
- }
478
-
479
- .alert svg {
480
- width: 20px;
481
- height: 20px;
482
- flex-shrink: 0;
483
- }
484
-
485
- .alert-success {
486
- background: rgba(34, 197, 94, 0.1);
487
- border: 1px solid rgba(34, 197, 94, 0.3);
488
- color: var(--success);
489
- }
490
-
491
- .alert-warning {
492
- background: rgba(245, 158, 11, 0.1);
493
- border: 1px solid rgba(245, 158, 11, 0.3);
494
- color: var(--warning);
495
- }
496
-
497
- .alert-danger {
498
- background: rgba(239, 68, 68, 0.1);
499
- border: 1px solid rgba(239, 68, 68, 0.3);
500
- color: var(--danger);
501
- }
502
-
503
- /* ============================================
504
- Search Box
505
- ============================================ */
506
- .search-box {
507
- position: relative;
508
- max-width: 400px;
509
- }
510
-
511
- .search-box input {
512
- width: 100%;
513
- padding: 10px 12px 10px 40px;
514
- background: var(--bg-dark);
515
- border: 1px solid var(--border-color);
516
- border-radius: var(--border-radius);
517
- color: var(--text-primary);
518
- }
519
-
520
- .search-box svg {
521
- position: absolute;
522
- left: 12px;
523
- top: 50%;
524
- transform: translateY(-50%);
525
- width: 18px;
526
- height: 18px;
527
- color: var(--text-muted);
528
- }
529
-
530
- /* ============================================
531
- Pagination
532
- ============================================ */
533
- .pagination {
534
- display: flex;
535
- align-items: center;
536
- gap: 8px;
537
- margin-top: 16px;
538
- }
539
-
540
- .pagination-btn {
541
- padding: 8px 12px;
542
- background: var(--bg-surface);
543
- border: 1px solid var(--border-color);
544
- border-radius: var(--border-radius);
545
- color: var(--text-secondary);
546
- cursor: pointer;
547
- transition: var(--transition);
548
- }
549
-
550
- .pagination-btn:hover:not(:disabled) {
551
- background: var(--bg-surface-hover);
552
- color: var(--text-primary);
553
- }
554
-
555
- .pagination-btn:disabled {
556
- opacity: 0.5;
557
- cursor: not-allowed;
558
- }
559
-
560
- .pagination-btn.active {
561
- background: var(--primary);
562
- border-color: var(--primary);
563
- color: white;
564
- }
565
-
566
- .pagination-info {
567
- color: var(--text-muted);
568
- font-size: 13px;
569
- }
570
-
571
- /* ============================================
572
- Modal
573
- ============================================ */
574
- .modal-overlay {
575
- position: fixed;
576
- top: 0;
577
- left: 0;
578
- right: 0;
579
- bottom: 0;
580
- background: rgba(0, 0, 0, 0.7);
581
- display: flex;
582
- align-items: center;
583
- justify-content: center;
584
- z-index: 1000;
585
- opacity: 0;
586
- visibility: hidden;
587
- transition: var(--transition);
588
- }
589
-
590
- .modal-overlay.active {
591
- opacity: 1;
592
- visibility: visible;
593
- }
594
-
595
- .modal {
596
- background: var(--bg-surface);
597
- border-radius: var(--border-radius-lg);
598
- width: 100%;
599
- max-width: 500px;
600
- max-height: 90vh;
601
- overflow-y: auto;
602
- transform: scale(0.9);
603
- transition: var(--transition);
604
- }
605
-
606
- .modal-overlay.active .modal {
607
- transform: scale(1);
608
- }
609
-
610
- .modal-header {
611
- padding: 20px;
612
- border-bottom: 1px solid var(--border-color);
613
- display: flex;
614
- justify-content: space-between;
615
- align-items: center;
616
- }
617
-
618
- .modal-header h2 {
619
- font-size: 18px;
620
- font-weight: 600;
621
- }
622
-
623
- .modal-close {
624
- background: none;
625
- border: none;
626
- color: var(--text-muted);
627
- cursor: pointer;
628
- padding: 4px;
629
- }
630
-
631
- .modal-close:hover {
632
- color: var(--text-primary);
633
- }
634
-
635
- .modal-body {
636
- padding: 20px;
637
- }
638
-
639
- .modal-footer {
640
- padding: 16px 20px;
641
- border-top: 1px solid var(--border-color);
642
- display: flex;
643
- justify-content: flex-end;
644
- gap: 12px;
645
- }
646
-
647
- /* ============================================
648
- Code Block
649
- ============================================ */
650
- .code-block {
651
- background: var(--bg-dark);
652
- border: 1px solid var(--border-color);
653
- border-radius: var(--border-radius);
654
- padding: 16px;
655
- overflow-x: auto;
656
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
657
- font-size: 13px;
658
- line-height: 1.6;
659
- }
660
-
661
- .code-block pre {
662
- margin: 0;
663
- white-space: pre-wrap;
664
- word-break: break-word;
665
- }
666
-
667
- /* ============================================
668
- JSON Viewer
669
- ============================================ */
670
- .json-key { color: #7dd3fc; }
671
- .json-string { color: #86efac; }
672
- .json-number { color: #fcd34d; }
673
- .json-boolean { color: #f472b6; }
674
- .json-null { color: #94a3b8; }
675
-
676
- /* ============================================
677
- Loading
678
- ============================================ */
679
- .loading {
680
- display: flex;
681
- align-items: center;
682
- justify-content: center;
683
- padding: 40px;
684
- }
685
-
686
- .spinner {
687
- width: 32px;
688
- height: 32px;
689
- border: 3px solid var(--border-color);
690
- border-top-color: var(--primary);
691
- border-radius: 50%;
692
- animation: spin 1s linear infinite;
693
- }
694
-
695
- @keyframes spin {
696
- to { transform: rotate(360deg); }
697
- }
698
-
699
- /* ============================================
700
- Empty State
701
- ============================================ */
702
- .empty-state {
703
- text-align: center;
704
- padding: 60px 20px;
705
- color: var(--text-muted);
706
- }
707
-
708
- .empty-state svg {
709
- width: 64px;
710
- height: 64px;
711
- margin-bottom: 16px;
712
- opacity: 0.5;
713
- }
714
-
715
- .empty-state h3 {
716
- font-size: 18px;
717
- color: var(--text-secondary);
718
- margin-bottom: 8px;
719
- }
720
-
721
- .empty-state p {
722
- font-size: 14px;
723
- margin-bottom: 20px;
724
- }
725
-
726
- /* ============================================
727
- Tabs
728
- ============================================ */
729
- .tabs {
730
- display: flex;
731
- border-bottom: 1px solid var(--border-color);
732
- margin-bottom: 20px;
733
- }
734
-
735
- .tab {
736
- padding: 12px 20px;
737
- color: var(--text-secondary);
738
- cursor: pointer;
739
- border-bottom: 2px solid transparent;
740
- transition: var(--transition);
741
- }
742
-
743
- .tab:hover {
744
- color: var(--text-primary);
745
- }
746
-
747
- .tab.active {
748
- color: var(--primary);
749
- border-bottom-color: var(--primary);
750
- }
751
-
752
- /* ============================================
753
- Grid Layouts
754
- ============================================ */
755
- .grid-2 {
756
- display: grid;
757
- grid-template-columns: repeat(2, 1fr);
758
- gap: 24px;
759
- }
760
-
761
- .grid-3 {
762
- display: grid;
763
- grid-template-columns: repeat(3, 1fr);
764
- gap: 24px;
765
- }
766
-
767
- @media (max-width: 1024px) {
768
- .grid-3 { grid-template-columns: repeat(2, 1fr); }
769
- }
770
-
771
- @media (max-width: 768px) {
772
- .grid-2, .grid-3 { grid-template-columns: 1fr; }
773
-
774
- .admin-sidebar {
775
- transform: translateX(-100%);
776
- }
777
-
778
- .admin-main {
779
- margin-left: 0;
780
- }
781
- }
782
-
783
- /* ============================================
784
- Utilities
785
- ============================================ */
786
- .text-center { text-align: center; }
787
- .text-right { text-align: right; }
788
- .text-muted { color: var(--text-muted); }
789
- .text-success { color: var(--success); }
790
- .text-danger { color: var(--danger); }
791
- .text-warning { color: var(--warning); }
792
-
793
- .mt-0 { margin-top: 0; }
794
- .mt-2 { margin-top: 8px; }
795
- .mt-4 { margin-top: 16px; }
796
- .mb-0 { margin-bottom: 0; }
797
- .mb-2 { margin-bottom: 8px; }
798
- .mb-4 { margin-bottom: 16px; }
799
-
800
- .flex { display: flex; }
801
- .items-center { align-items: center; }
802
- .justify-between { justify-content: space-between; }
803
- .gap-2 { gap: 8px; }
804
- .gap-4 { gap: 16px; }
805
-
806
- .truncate {
807
- overflow: hidden;
808
- text-overflow: ellipsis;
809
- white-space: nowrap;
810
- }
811
-
812
- /* ============================================
813
- CrudTable 通用增删改查组件样式
814
- ============================================ */
815
- .crud-table {
816
- margin-bottom: 24px;
817
- }
818
-
819
- .crud-header {
820
- display: flex;
821
- justify-content: space-between;
822
- align-items: center;
823
- margin-bottom: 20px;
824
- }
825
-
826
- .crud-title {
827
- display: flex;
828
- align-items: center;
829
- gap: 12px;
830
- }
831
-
832
- .crud-title svg {
833
- width: 28px;
834
- height: 28px;
835
- color: var(--primary);
836
- }
837
-
838
- .crud-title h1 {
839
- font-size: 24px;
840
- font-weight: 600;
841
- color: var(--text-primary);
842
- margin: 0;
843
- }
844
-
845
- .crud-count {
846
- font-size: 14px;
847
- color: var(--text-muted);
848
- background: var(--bg-dark);
849
- padding: 4px 12px;
850
- border-radius: 20px;
851
- }
852
-
853
- .crud-actions {
854
- display: flex;
855
- gap: 12px;
856
- }
857
-
858
- .crud-search {
859
- margin-bottom: 20px;
860
- }
861
-
862
- .crud-search form {
863
- display: flex;
864
- gap: 12px;
865
- max-width: 500px;
866
- }
867
-
868
- .crud-search .search-box {
869
- flex: 1;
870
- }
871
-
872
- .crud-pagination {
873
- display: flex;
874
- justify-content: space-between;
875
- align-items: center;
876
- padding: 16px 20px;
877
- border-top: 1px solid var(--border-color);
878
- }
879
-
880
- .actions-column {
881
- width: 120px;
882
- text-align: right;
883
- }
884
-
885
- .actions-cell {
886
- text-align: right;
887
- }
888
-
889
- /* 成功按钮 */
890
- .btn-success {
891
- background: var(--success);
892
- color: white;
893
- }
894
-
895
- .btn-success:hover {
896
- background: #16a34a;
897
- }
898
-
899
- /* 图标选择器样式 */
900
- .icon-picker {
901
- display: flex;
902
- flex-direction: column;
903
- gap: 8px;
904
- }
905
-
906
- .icon-options {
907
- display: flex;
908
- flex-wrap: wrap;
909
- gap: 8px;
910
- }
911
-
912
- .icon-option {
913
- width: 40px;
914
- height: 40px;
915
- font-size: 20px;
916
- display: flex;
917
- align-items: center;
918
- justify-content: center;
919
- border: 2px solid var(--border-color);
920
- border-radius: var(--border-radius);
921
- background: var(--bg-dark);
922
- cursor: pointer;
923
- transition: var(--transition);
924
- }
925
-
926
- .icon-option:hover {
927
- border-color: var(--text-muted);
928
- }
929
-
930
- .icon-option.selected {
931
- border-color: var(--primary);
932
- background: rgba(99, 102, 241, 0.2);
933
- }
934
-
935
- .icon-display {
936
- font-size: 20px;
937
- }
938
-
939
- /* 必填标记 */
940
- .required {
941
- color: var(--danger);
942
- margin-left: 4px;
943
- }
944
-
945
- /* Badge 扩展 */
946
- .badge-secondary {
947
- background: rgba(148, 163, 184, 0.2);
948
- color: var(--text-secondary);
949
- }
8
+ exports.adminStyles = `
9
+ /* ============================================
10
+ CSS Variables - 设计令牌
11
+ ============================================ */
12
+ :root {
13
+ --primary: #6366f1;
14
+ --primary-hover: #4f46e5;
15
+ --secondary: #8b5cf6;
16
+ --success: #22c55e;
17
+ --warning: #f59e0b;
18
+ --danger: #ef4444;
19
+ --info: #3b82f6;
20
+
21
+ --bg-dark: #0f172a;
22
+ --bg-surface: #1e293b;
23
+ --bg-surface-hover: #334155;
24
+ --bg-input: #0f172a;
25
+
26
+ --text-primary: #f1f5f9;
27
+ --text-secondary: #94a3b8;
28
+ --text-muted: #64748b;
29
+
30
+ --border-color: #334155;
31
+ --border-radius: 8px;
32
+ --border-radius-lg: 12px;
33
+
34
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
35
+ --shadow-md: 0 4px 6px rgba(0,0,0,0.4);
36
+ --shadow-lg: 0 10px 15px rgba(0,0,0,0.5);
37
+
38
+ --transition: all 0.2s ease;
39
+
40
+ --sidebar-width: 240px;
41
+ --header-height: 60px;
42
+ }
43
+
44
+ /* ============================================
45
+ Reset & Base
46
+ ============================================ */
47
+ *, *::before, *::after {
48
+ box-sizing: border-box;
49
+ margin: 0;
50
+ padding: 0;
51
+ }
52
+
53
+ html, body {
54
+ height: 100%;
55
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
56
+ font-size: 14px;
57
+ line-height: 1.5;
58
+ color: var(--text-primary);
59
+ background: var(--bg-dark);
60
+ }
61
+
62
+ a {
63
+ color: var(--primary);
64
+ text-decoration: none;
65
+ }
66
+
67
+ a:hover {
68
+ color: var(--primary-hover);
69
+ }
70
+
71
+ /* ============================================
72
+ Layout
73
+ ============================================ */
74
+ .admin-layout {
75
+ display: flex;
76
+ min-height: 100vh;
77
+ }
78
+
79
+ .admin-sidebar {
80
+ width: var(--sidebar-width);
81
+ background: var(--bg-surface);
82
+ border-right: 1px solid var(--border-color);
83
+ display: flex;
84
+ flex-direction: column;
85
+ position: fixed;
86
+ top: 0;
87
+ left: 0;
88
+ bottom: 0;
89
+ z-index: 100;
90
+ }
91
+
92
+ .admin-main {
93
+ flex: 1;
94
+ margin-left: var(--sidebar-width);
95
+ display: flex;
96
+ flex-direction: column;
97
+ min-height: 100vh;
98
+ }
99
+
100
+ .admin-header {
101
+ height: var(--header-height);
102
+ background: var(--bg-surface);
103
+ border-bottom: 1px solid var(--border-color);
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ padding: 0 24px;
108
+ position: sticky;
109
+ top: 0;
110
+ z-index: 50;
111
+ }
112
+
113
+ .admin-content {
114
+ flex: 1;
115
+ padding: 24px;
116
+ overflow-y: auto;
117
+ }
118
+
119
+ .admin-footer {
120
+ padding: 16px 24px;
121
+ background: var(--bg-surface);
122
+ border-top: 1px solid var(--border-color);
123
+ font-size: 12px;
124
+ color: var(--text-muted);
125
+ display: flex;
126
+ justify-content: space-between;
127
+ }
128
+
129
+ /* ============================================
130
+ Sidebar
131
+ ============================================ */
132
+ .sidebar-logo {
133
+ padding: 20px;
134
+ border-bottom: 1px solid var(--border-color);
135
+ display: flex;
136
+ align-items: center;
137
+ gap: 12px;
138
+ }
139
+
140
+ .sidebar-logo svg {
141
+ width: 32px;
142
+ height: 32px;
143
+ color: var(--primary);
144
+ }
145
+
146
+ .sidebar-logo h1 {
147
+ font-size: 18px;
148
+ font-weight: 600;
149
+ color: var(--text-primary);
150
+ }
151
+
152
+ .sidebar-logo span {
153
+ font-size: 11px;
154
+ color: var(--text-muted);
155
+ background: var(--bg-dark);
156
+ padding: 2px 6px;
157
+ border-radius: 4px;
158
+ }
159
+
160
+ .sidebar-nav {
161
+ flex: 1;
162
+ padding: 16px 12px;
163
+ overflow-y: auto;
164
+ }
165
+
166
+ .nav-section {
167
+ margin-bottom: 24px;
168
+ }
169
+
170
+ .nav-section-title {
171
+ font-size: 11px;
172
+ font-weight: 600;
173
+ text-transform: uppercase;
174
+ color: var(--text-muted);
175
+ padding: 0 12px;
176
+ margin-bottom: 8px;
177
+ }
178
+
179
+ .nav-item {
180
+ display: flex;
181
+ align-items: center;
182
+ gap: 12px;
183
+ padding: 10px 12px;
184
+ border-radius: var(--border-radius);
185
+ color: var(--text-secondary);
186
+ transition: var(--transition);
187
+ cursor: pointer;
188
+ }
189
+
190
+ .nav-item:hover {
191
+ background: var(--bg-surface-hover);
192
+ color: var(--text-primary);
193
+ }
194
+
195
+ .nav-item.active {
196
+ background: var(--primary);
197
+ color: white;
198
+ }
199
+
200
+ .nav-item svg {
201
+ width: 20px;
202
+ height: 20px;
203
+ flex-shrink: 0;
204
+ }
205
+
206
+ .nav-item span {
207
+ font-size: 14px;
208
+ }
209
+
210
+ /* ============================================
211
+ Cards
212
+ ============================================ */
213
+ .card {
214
+ background: var(--bg-surface);
215
+ border: 1px solid var(--border-color);
216
+ border-radius: var(--border-radius-lg);
217
+ padding: 20px;
218
+ }
219
+
220
+ .card-header {
221
+ display: flex;
222
+ justify-content: space-between;
223
+ align-items: center;
224
+ margin-bottom: 16px;
225
+ }
226
+
227
+ .card-title {
228
+ font-size: 16px;
229
+ font-weight: 600;
230
+ color: var(--text-primary);
231
+ }
232
+
233
+ .card-subtitle {
234
+ font-size: 13px;
235
+ color: var(--text-muted);
236
+ margin-top: 4px;
237
+ }
238
+
239
+ /* ============================================
240
+ Stats Cards
241
+ ============================================ */
242
+ .stats-grid {
243
+ display: grid;
244
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
245
+ gap: 16px;
246
+ margin-bottom: 24px;
247
+ }
248
+
249
+ .stat-card {
250
+ background: var(--bg-surface);
251
+ border: 1px solid var(--border-color);
252
+ border-radius: var(--border-radius-lg);
253
+ padding: 20px;
254
+ display: flex;
255
+ align-items: flex-start;
256
+ gap: 16px;
257
+ }
258
+
259
+ .stat-icon {
260
+ width: 48px;
261
+ height: 48px;
262
+ border-radius: var(--border-radius);
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: center;
266
+ flex-shrink: 0;
267
+ }
268
+
269
+ .stat-icon svg {
270
+ width: 24px;
271
+ height: 24px;
272
+ }
273
+
274
+ .stat-icon.primary { background: rgba(99, 102, 241, 0.2); color: var(--primary); }
275
+ .stat-icon.success { background: rgba(34, 197, 94, 0.2); color: var(--success); }
276
+ .stat-icon.warning { background: rgba(245, 158, 11, 0.2); color: var(--warning); }
277
+ .stat-icon.info { background: rgba(59, 130, 246, 0.2); color: var(--info); }
278
+
279
+ .stat-content h3 {
280
+ font-size: 24px;
281
+ font-weight: 700;
282
+ color: var(--text-primary);
283
+ margin-bottom: 4px;
284
+ }
285
+
286
+ .stat-content p {
287
+ font-size: 13px;
288
+ color: var(--text-muted);
289
+ }
290
+
291
+ .stat-trend {
292
+ font-size: 12px;
293
+ margin-top: 8px;
294
+ }
295
+
296
+ .stat-trend.up { color: var(--success); }
297
+ .stat-trend.down { color: var(--danger); }
298
+
299
+ /* ============================================
300
+ Tables
301
+ ============================================ */
302
+ .table-container {
303
+ overflow-x: auto;
304
+ }
305
+
306
+ .table {
307
+ width: 100%;
308
+ border-collapse: collapse;
309
+ }
310
+
311
+ .table th,
312
+ .table td {
313
+ padding: 12px 16px;
314
+ text-align: left;
315
+ border-bottom: 1px solid var(--border-color);
316
+ }
317
+
318
+ .table th {
319
+ font-size: 12px;
320
+ font-weight: 600;
321
+ text-transform: uppercase;
322
+ color: var(--text-muted);
323
+ background: var(--bg-dark);
324
+ }
325
+
326
+ .table tr:hover {
327
+ background: var(--bg-surface-hover);
328
+ }
329
+
330
+ .table td {
331
+ font-size: 14px;
332
+ color: var(--text-primary);
333
+ }
334
+
335
+ /* ============================================
336
+ Buttons
337
+ ============================================ */
338
+ .btn {
339
+ display: inline-flex;
340
+ align-items: center;
341
+ justify-content: center;
342
+ gap: 8px;
343
+ padding: 8px 16px;
344
+ border-radius: var(--border-radius);
345
+ font-size: 14px;
346
+ font-weight: 500;
347
+ cursor: pointer;
348
+ border: none;
349
+ transition: var(--transition);
350
+ }
351
+
352
+ .btn svg {
353
+ width: 16px;
354
+ height: 16px;
355
+ }
356
+
357
+ .btn-primary {
358
+ background: var(--primary);
359
+ color: white;
360
+ }
361
+
362
+ .btn-primary:hover {
363
+ background: var(--primary-hover);
364
+ }
365
+
366
+ .btn-secondary {
367
+ background: var(--bg-surface-hover);
368
+ color: var(--text-primary);
369
+ border: 1px solid var(--border-color);
370
+ }
371
+
372
+ .btn-secondary:hover {
373
+ background: var(--bg-dark);
374
+ }
375
+
376
+ .btn-danger {
377
+ background: var(--danger);
378
+ color: white;
379
+ }
380
+
381
+ .btn-danger:hover {
382
+ background: #dc2626;
383
+ }
384
+
385
+ .btn-sm {
386
+ padding: 6px 12px;
387
+ font-size: 13px;
388
+ }
389
+
390
+ .btn-icon {
391
+ padding: 8px;
392
+ }
393
+
394
+ /* ============================================
395
+ Forms
396
+ ============================================ */
397
+ .form-group {
398
+ margin-bottom: 16px;
399
+ }
400
+
401
+ .form-label {
402
+ display: block;
403
+ font-size: 13px;
404
+ font-weight: 500;
405
+ color: var(--text-secondary);
406
+ margin-bottom: 6px;
407
+ }
408
+
409
+ .form-input,
410
+ .form-select,
411
+ .form-textarea {
412
+ width: 100%;
413
+ padding: 10px 12px;
414
+ background: var(--bg-input);
415
+ border: 1px solid var(--border-color);
416
+ border-radius: var(--border-radius);
417
+ color: var(--text-primary);
418
+ font-size: 14px;
419
+ transition: var(--transition);
420
+ }
421
+
422
+ .form-input:focus,
423
+ .form-select:focus,
424
+ .form-textarea:focus {
425
+ outline: none;
426
+ border-color: var(--primary);
427
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
428
+ }
429
+
430
+ .form-textarea {
431
+ min-height: 100px;
432
+ resize: vertical;
433
+ }
434
+
435
+ /* ============================================
436
+ Badges
437
+ ============================================ */
438
+ .badge {
439
+ display: inline-flex;
440
+ align-items: center;
441
+ padding: 4px 8px;
442
+ border-radius: 9999px;
443
+ font-size: 12px;
444
+ font-weight: 500;
445
+ }
446
+
447
+ .badge-success {
448
+ background: rgba(34, 197, 94, 0.2);
449
+ color: var(--success);
450
+ }
451
+
452
+ .badge-warning {
453
+ background: rgba(245, 158, 11, 0.2);
454
+ color: var(--warning);
455
+ }
456
+
457
+ .badge-danger {
458
+ background: rgba(239, 68, 68, 0.2);
459
+ color: var(--danger);
460
+ }
461
+
462
+ .badge-info {
463
+ background: rgba(59, 130, 246, 0.2);
464
+ color: var(--info);
465
+ }
466
+
467
+ /* ============================================
468
+ Alerts
469
+ ============================================ */
470
+ .alert {
471
+ padding: 12px 16px;
472
+ border-radius: var(--border-radius);
473
+ margin-bottom: 16px;
474
+ display: flex;
475
+ align-items: center;
476
+ gap: 12px;
477
+ }
478
+
479
+ .alert svg {
480
+ width: 20px;
481
+ height: 20px;
482
+ flex-shrink: 0;
483
+ }
484
+
485
+ .alert-success {
486
+ background: rgba(34, 197, 94, 0.1);
487
+ border: 1px solid rgba(34, 197, 94, 0.3);
488
+ color: var(--success);
489
+ }
490
+
491
+ .alert-warning {
492
+ background: rgba(245, 158, 11, 0.1);
493
+ border: 1px solid rgba(245, 158, 11, 0.3);
494
+ color: var(--warning);
495
+ }
496
+
497
+ .alert-danger {
498
+ background: rgba(239, 68, 68, 0.1);
499
+ border: 1px solid rgba(239, 68, 68, 0.3);
500
+ color: var(--danger);
501
+ }
502
+
503
+ /* ============================================
504
+ Search Box
505
+ ============================================ */
506
+ .search-box {
507
+ position: relative;
508
+ max-width: 400px;
509
+ }
510
+
511
+ .search-box input {
512
+ width: 100%;
513
+ padding: 10px 12px 10px 40px;
514
+ background: var(--bg-dark);
515
+ border: 1px solid var(--border-color);
516
+ border-radius: var(--border-radius);
517
+ color: var(--text-primary);
518
+ }
519
+
520
+ .search-box svg {
521
+ position: absolute;
522
+ left: 12px;
523
+ top: 50%;
524
+ transform: translateY(-50%);
525
+ width: 18px;
526
+ height: 18px;
527
+ color: var(--text-muted);
528
+ }
529
+
530
+ /* ============================================
531
+ Pagination
532
+ ============================================ */
533
+ .pagination {
534
+ display: flex;
535
+ align-items: center;
536
+ gap: 8px;
537
+ margin-top: 16px;
538
+ }
539
+
540
+ .pagination-btn {
541
+ padding: 8px 12px;
542
+ background: var(--bg-surface);
543
+ border: 1px solid var(--border-color);
544
+ border-radius: var(--border-radius);
545
+ color: var(--text-secondary);
546
+ cursor: pointer;
547
+ transition: var(--transition);
548
+ }
549
+
550
+ .pagination-btn:hover:not(:disabled) {
551
+ background: var(--bg-surface-hover);
552
+ color: var(--text-primary);
553
+ }
554
+
555
+ .pagination-btn:disabled {
556
+ opacity: 0.5;
557
+ cursor: not-allowed;
558
+ }
559
+
560
+ .pagination-btn.active {
561
+ background: var(--primary);
562
+ border-color: var(--primary);
563
+ color: white;
564
+ }
565
+
566
+ .pagination-info {
567
+ color: var(--text-muted);
568
+ font-size: 13px;
569
+ }
570
+
571
+ /* ============================================
572
+ Modal
573
+ ============================================ */
574
+ .modal-overlay {
575
+ position: fixed;
576
+ top: 0;
577
+ left: 0;
578
+ right: 0;
579
+ bottom: 0;
580
+ background: rgba(0, 0, 0, 0.7);
581
+ display: flex;
582
+ align-items: center;
583
+ justify-content: center;
584
+ z-index: 1000;
585
+ opacity: 0;
586
+ visibility: hidden;
587
+ transition: var(--transition);
588
+ }
589
+
590
+ .modal-overlay.active {
591
+ opacity: 1;
592
+ visibility: visible;
593
+ }
594
+
595
+ .modal {
596
+ background: var(--bg-surface);
597
+ border-radius: var(--border-radius-lg);
598
+ width: 100%;
599
+ max-width: 500px;
600
+ max-height: 90vh;
601
+ overflow-y: auto;
602
+ transform: scale(0.9);
603
+ transition: var(--transition);
604
+ }
605
+
606
+ .modal-overlay.active .modal {
607
+ transform: scale(1);
608
+ }
609
+
610
+ .modal-header {
611
+ padding: 20px;
612
+ border-bottom: 1px solid var(--border-color);
613
+ display: flex;
614
+ justify-content: space-between;
615
+ align-items: center;
616
+ }
617
+
618
+ .modal-header h2 {
619
+ font-size: 18px;
620
+ font-weight: 600;
621
+ }
622
+
623
+ .modal-close {
624
+ background: none;
625
+ border: none;
626
+ color: var(--text-muted);
627
+ cursor: pointer;
628
+ padding: 4px;
629
+ }
630
+
631
+ .modal-close:hover {
632
+ color: var(--text-primary);
633
+ }
634
+
635
+ .modal-body {
636
+ padding: 20px;
637
+ }
638
+
639
+ .modal-footer {
640
+ padding: 16px 20px;
641
+ border-top: 1px solid var(--border-color);
642
+ display: flex;
643
+ justify-content: flex-end;
644
+ gap: 12px;
645
+ }
646
+
647
+ /* ============================================
648
+ Code Block
649
+ ============================================ */
650
+ .code-block {
651
+ background: var(--bg-dark);
652
+ border: 1px solid var(--border-color);
653
+ border-radius: var(--border-radius);
654
+ padding: 16px;
655
+ overflow-x: auto;
656
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
657
+ font-size: 13px;
658
+ line-height: 1.6;
659
+ }
660
+
661
+ .code-block pre {
662
+ margin: 0;
663
+ white-space: pre-wrap;
664
+ word-break: break-word;
665
+ }
666
+
667
+ /* ============================================
668
+ JSON Viewer
669
+ ============================================ */
670
+ .json-key { color: #7dd3fc; }
671
+ .json-string { color: #86efac; }
672
+ .json-number { color: #fcd34d; }
673
+ .json-boolean { color: #f472b6; }
674
+ .json-null { color: #94a3b8; }
675
+
676
+ /* ============================================
677
+ Loading
678
+ ============================================ */
679
+ .loading {
680
+ display: flex;
681
+ align-items: center;
682
+ justify-content: center;
683
+ padding: 40px;
684
+ }
685
+
686
+ .spinner {
687
+ width: 32px;
688
+ height: 32px;
689
+ border: 3px solid var(--border-color);
690
+ border-top-color: var(--primary);
691
+ border-radius: 50%;
692
+ animation: spin 1s linear infinite;
693
+ }
694
+
695
+ @keyframes spin {
696
+ to { transform: rotate(360deg); }
697
+ }
698
+
699
+ /* ============================================
700
+ Empty State
701
+ ============================================ */
702
+ .empty-state {
703
+ text-align: center;
704
+ padding: 60px 20px;
705
+ color: var(--text-muted);
706
+ }
707
+
708
+ .empty-state svg {
709
+ width: 64px;
710
+ height: 64px;
711
+ margin-bottom: 16px;
712
+ opacity: 0.5;
713
+ }
714
+
715
+ .empty-state h3 {
716
+ font-size: 18px;
717
+ color: var(--text-secondary);
718
+ margin-bottom: 8px;
719
+ }
720
+
721
+ .empty-state p {
722
+ font-size: 14px;
723
+ margin-bottom: 20px;
724
+ }
725
+
726
+ /* ============================================
727
+ Tabs
728
+ ============================================ */
729
+ .tabs {
730
+ display: flex;
731
+ border-bottom: 1px solid var(--border-color);
732
+ margin-bottom: 20px;
733
+ }
734
+
735
+ .tab {
736
+ padding: 12px 20px;
737
+ color: var(--text-secondary);
738
+ cursor: pointer;
739
+ border-bottom: 2px solid transparent;
740
+ transition: var(--transition);
741
+ }
742
+
743
+ .tab:hover {
744
+ color: var(--text-primary);
745
+ }
746
+
747
+ .tab.active {
748
+ color: var(--primary);
749
+ border-bottom-color: var(--primary);
750
+ }
751
+
752
+ /* ============================================
753
+ Grid Layouts
754
+ ============================================ */
755
+ .grid-2 {
756
+ display: grid;
757
+ grid-template-columns: repeat(2, 1fr);
758
+ gap: 24px;
759
+ }
760
+
761
+ .grid-3 {
762
+ display: grid;
763
+ grid-template-columns: repeat(3, 1fr);
764
+ gap: 24px;
765
+ }
766
+
767
+ @media (max-width: 1024px) {
768
+ .grid-3 { grid-template-columns: repeat(2, 1fr); }
769
+ }
770
+
771
+ @media (max-width: 768px) {
772
+ .grid-2, .grid-3 { grid-template-columns: 1fr; }
773
+
774
+ .admin-sidebar {
775
+ transform: translateX(-100%);
776
+ }
777
+
778
+ .admin-main {
779
+ margin-left: 0;
780
+ }
781
+ }
782
+
783
+ /* ============================================
784
+ Utilities
785
+ ============================================ */
786
+ .text-center { text-align: center; }
787
+ .text-right { text-align: right; }
788
+ .text-muted { color: var(--text-muted); }
789
+ .text-success { color: var(--success); }
790
+ .text-danger { color: var(--danger); }
791
+ .text-warning { color: var(--warning); }
792
+
793
+ .mt-0 { margin-top: 0; }
794
+ .mt-2 { margin-top: 8px; }
795
+ .mt-4 { margin-top: 16px; }
796
+ .mb-0 { margin-bottom: 0; }
797
+ .mb-2 { margin-bottom: 8px; }
798
+ .mb-4 { margin-bottom: 16px; }
799
+
800
+ .flex { display: flex; }
801
+ .items-center { align-items: center; }
802
+ .justify-between { justify-content: space-between; }
803
+ .gap-2 { gap: 8px; }
804
+ .gap-4 { gap: 16px; }
805
+
806
+ .truncate {
807
+ overflow: hidden;
808
+ text-overflow: ellipsis;
809
+ white-space: nowrap;
810
+ }
811
+
812
+ /* ============================================
813
+ CrudTable 通用增删改查组件样式
814
+ ============================================ */
815
+ .crud-table {
816
+ margin-bottom: 24px;
817
+ }
818
+
819
+ .crud-header {
820
+ display: flex;
821
+ justify-content: space-between;
822
+ align-items: center;
823
+ margin-bottom: 20px;
824
+ }
825
+
826
+ .crud-title {
827
+ display: flex;
828
+ align-items: center;
829
+ gap: 12px;
830
+ }
831
+
832
+ .crud-title svg {
833
+ width: 28px;
834
+ height: 28px;
835
+ color: var(--primary);
836
+ }
837
+
838
+ .crud-title h1 {
839
+ font-size: 24px;
840
+ font-weight: 600;
841
+ color: var(--text-primary);
842
+ margin: 0;
843
+ }
844
+
845
+ .crud-count {
846
+ font-size: 14px;
847
+ color: var(--text-muted);
848
+ background: var(--bg-dark);
849
+ padding: 4px 12px;
850
+ border-radius: 20px;
851
+ }
852
+
853
+ .crud-actions {
854
+ display: flex;
855
+ gap: 12px;
856
+ }
857
+
858
+ .crud-search {
859
+ margin-bottom: 20px;
860
+ }
861
+
862
+ .crud-search form {
863
+ display: flex;
864
+ gap: 12px;
865
+ max-width: 500px;
866
+ }
867
+
868
+ .crud-search .search-box {
869
+ flex: 1;
870
+ }
871
+
872
+ .crud-pagination {
873
+ display: flex;
874
+ justify-content: space-between;
875
+ align-items: center;
876
+ padding: 16px 20px;
877
+ border-top: 1px solid var(--border-color);
878
+ }
879
+
880
+ .actions-column {
881
+ width: 120px;
882
+ text-align: right;
883
+ }
884
+
885
+ .actions-cell {
886
+ text-align: right;
887
+ }
888
+
889
+ /* 成功按钮 */
890
+ .btn-success {
891
+ background: var(--success);
892
+ color: white;
893
+ }
894
+
895
+ .btn-success:hover {
896
+ background: #16a34a;
897
+ }
898
+
899
+ /* 图标选择器样式 */
900
+ .icon-picker {
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: 8px;
904
+ }
905
+
906
+ .icon-options {
907
+ display: flex;
908
+ flex-wrap: wrap;
909
+ gap: 8px;
910
+ }
911
+
912
+ .icon-option {
913
+ width: 40px;
914
+ height: 40px;
915
+ font-size: 20px;
916
+ display: flex;
917
+ align-items: center;
918
+ justify-content: center;
919
+ border: 2px solid var(--border-color);
920
+ border-radius: var(--border-radius);
921
+ background: var(--bg-dark);
922
+ cursor: pointer;
923
+ transition: var(--transition);
924
+ }
925
+
926
+ .icon-option:hover {
927
+ border-color: var(--text-muted);
928
+ }
929
+
930
+ .icon-option.selected {
931
+ border-color: var(--primary);
932
+ background: rgba(99, 102, 241, 0.2);
933
+ }
934
+
935
+ .icon-display {
936
+ font-size: 20px;
937
+ }
938
+
939
+ /* 必填标记 */
940
+ .required {
941
+ color: var(--danger);
942
+ margin-left: 4px;
943
+ }
944
+
945
+ /* Badge 扩展 */
946
+ .badge-secondary {
947
+ background: rgba(148, 163, 184, 0.2);
948
+ color: var(--text-secondary);
949
+ }
950
950
  `;
951
951
  //# sourceMappingURL=styles.js.map