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