cronixui 1.1.2 → 1.1.3

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