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