cronixui 1.0.6 → 1.1.1

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 (169) hide show
  1. package/README.md +20 -5
  2. package/package.json +20 -5
  3. package/packages/flutter/lib/cronixui.dart +41 -0
  4. package/packages/flutter/lib/src/tokens/colors.dart +34 -0
  5. package/packages/flutter/lib/src/tokens/spacing.dart +54 -0
  6. package/packages/flutter/lib/src/tokens/theme.dart +174 -0
  7. package/packages/flutter/lib/src/widgets/cn_accordion.dart +254 -0
  8. package/packages/flutter/lib/src/widgets/cn_alert.dart +137 -0
  9. package/packages/flutter/lib/src/widgets/cn_avatar.dart +98 -0
  10. package/packages/flutter/lib/src/widgets/cn_badge.dart +80 -0
  11. package/packages/flutter/lib/src/widgets/cn_breadcrumb.dart +88 -0
  12. package/packages/flutter/lib/src/widgets/cn_button.dart +137 -0
  13. package/packages/flutter/lib/src/widgets/cn_card.dart +99 -0
  14. package/packages/flutter/lib/src/widgets/cn_checkbox.dart +77 -0
  15. package/packages/flutter/lib/src/widgets/cn_command_palette.dart +299 -0
  16. package/packages/flutter/lib/src/widgets/cn_container.dart +131 -0
  17. package/packages/flutter/lib/src/widgets/cn_dropdown.dart +149 -0
  18. package/packages/flutter/lib/src/widgets/cn_file_input.dart +113 -0
  19. package/packages/flutter/lib/src/widgets/cn_footer.dart +108 -0
  20. package/packages/flutter/lib/src/widgets/cn_header.dart +173 -0
  21. package/packages/flutter/lib/src/widgets/cn_input.dart +142 -0
  22. package/packages/flutter/lib/src/widgets/cn_list.dart +150 -0
  23. package/packages/flutter/lib/src/widgets/cn_modal.dart +213 -0
  24. package/packages/flutter/lib/src/widgets/cn_nav.dart +157 -0
  25. package/packages/flutter/lib/src/widgets/cn_pagination.dart +193 -0
  26. package/packages/flutter/lib/src/widgets/cn_progress.dart +146 -0
  27. package/packages/flutter/lib/src/widgets/cn_radio.dart +133 -0
  28. package/packages/flutter/lib/src/widgets/cn_search.dart +183 -0
  29. package/packages/flutter/lib/src/widgets/cn_select.dart +244 -0
  30. package/packages/flutter/lib/src/widgets/cn_sidebar.dart +207 -0
  31. package/packages/flutter/lib/src/widgets/cn_skeleton.dart +136 -0
  32. package/packages/flutter/lib/src/widgets/cn_slider.dart +141 -0
  33. package/packages/flutter/lib/src/widgets/cn_spinner.dart +85 -0
  34. package/packages/flutter/lib/src/widgets/cn_stat.dart +135 -0
  35. package/packages/flutter/lib/src/widgets/cn_table.dart +136 -0
  36. package/packages/flutter/lib/src/widgets/cn_tabs.dart +229 -0
  37. package/packages/flutter/lib/src/widgets/cn_tag.dart +185 -0
  38. package/packages/flutter/lib/src/widgets/cn_textarea.dart +143 -0
  39. package/packages/flutter/lib/src/widgets/cn_toast.dart +121 -0
  40. package/packages/flutter/lib/src/widgets/cn_toggle.dart +78 -0
  41. package/packages/flutter/lib/src/widgets/cn_tooltip.dart +118 -0
  42. package/packages/flutter/pubspec.yaml +20 -0
  43. package/packages/go/cronixui/cronixui.go +784 -237
  44. package/packages/go/cronixui/go.mod +32 -0
  45. package/packages/go/cronixui/go.sum +666 -0
  46. package/packages/python/cronixui/__init__.py +59 -3
  47. package/packages/python/cronixui/alert.py +61 -0
  48. package/packages/python/cronixui/avatar.py +50 -0
  49. package/packages/python/cronixui/badge.py +46 -0
  50. package/packages/python/cronixui/button.py +64 -0
  51. package/packages/python/cronixui/card.py +62 -0
  52. package/packages/python/cronixui/form.py +255 -0
  53. package/packages/python/cronixui/layout.py +143 -0
  54. package/packages/python/cronixui/list.py +51 -0
  55. package/packages/python/cronixui/loading.py +36 -0
  56. package/packages/python/cronixui/progress.py +90 -0
  57. package/packages/python/cronixui/table.py +48 -0
  58. package/packages/python/cronixui/tooltip.py +28 -0
  59. package/packages/react/src/components/Accordion.tsx +82 -0
  60. package/packages/react/src/components/Alert.tsx +80 -0
  61. package/packages/react/src/components/Avatar.tsx +54 -0
  62. package/packages/react/src/components/Badge.tsx +32 -0
  63. package/packages/react/src/components/Breadcrumb.tsx +50 -0
  64. package/packages/react/src/components/Button.tsx +47 -0
  65. package/packages/react/src/components/Card.tsx +69 -0
  66. package/packages/react/src/components/Checkbox.tsx +30 -0
  67. package/packages/react/src/components/CommandPalette.tsx +131 -0
  68. package/packages/react/src/components/Container.tsx +26 -0
  69. package/packages/react/src/components/Dropdown.tsx +88 -0
  70. package/packages/react/src/components/FileInput.tsx +86 -0
  71. package/packages/react/src/components/Footer.tsx +36 -0
  72. package/packages/react/src/components/FormGroup.tsx +36 -0
  73. package/packages/react/src/components/Header.tsx +29 -0
  74. package/packages/react/src/components/Input.tsx +54 -0
  75. package/packages/react/src/components/List.tsx +55 -0
  76. package/packages/react/src/components/Modal.tsx +89 -0
  77. package/packages/react/src/components/Nav.tsx +63 -0
  78. package/packages/react/src/components/Pagination.tsx +107 -0
  79. package/packages/react/src/components/Progress.tsx +49 -0
  80. package/packages/react/src/components/Radio.tsx +64 -0
  81. package/packages/react/src/components/Search.tsx +95 -0
  82. package/packages/react/src/components/Select.tsx +41 -0
  83. package/packages/react/src/components/Sidebar.tsx +64 -0
  84. package/packages/react/src/components/Skeleton.tsx +39 -0
  85. package/packages/react/src/components/Slider.tsx +32 -0
  86. package/packages/react/src/components/Spinner.tsx +24 -0
  87. package/packages/react/src/components/Stack.tsx +69 -0
  88. package/packages/react/src/components/Stat.tsx +35 -0
  89. package/packages/react/src/components/Table.tsx +90 -0
  90. package/packages/react/src/components/Tabs.tsx +85 -0
  91. package/packages/react/src/components/Tag.tsx +30 -0
  92. package/packages/react/src/components/Textarea.tsx +21 -0
  93. package/packages/react/src/components/Toast.tsx +134 -0
  94. package/packages/react/src/components/Toggle.tsx +58 -0
  95. package/packages/react/src/components/Tooltip.tsx +31 -0
  96. package/packages/react/src/components/Typography.tsx +66 -0
  97. package/packages/react/src/index.ts +40 -0
  98. package/packages/react/src/styles.css +2039 -0
  99. package/packages/react/src/tokens/index.ts +94 -0
  100. package/packages/rust/cronixui/src/colors.rs +135 -0
  101. package/packages/rust/cronixui/src/components/accordion.rs +47 -0
  102. package/packages/rust/cronixui/src/components/alert.rs +95 -0
  103. package/packages/rust/cronixui/src/components/avatar.rs +85 -0
  104. package/packages/rust/cronixui/src/components/badge.rs +35 -0
  105. package/packages/rust/cronixui/src/components/breadcrumb.rs +58 -0
  106. package/packages/rust/cronixui/src/components/button.rs +70 -0
  107. package/packages/rust/cronixui/src/components/card.rs +259 -0
  108. package/packages/rust/cronixui/src/components/command_palette.rs +254 -0
  109. package/packages/rust/cronixui/src/components/dropdown.rs +179 -0
  110. package/packages/rust/cronixui/src/components/file_input.rs +74 -0
  111. package/packages/rust/cronixui/src/components/input.rs +21 -0
  112. package/packages/rust/cronixui/src/components/list.rs +38 -0
  113. package/packages/rust/cronixui/src/components/mod.rs +51 -0
  114. package/packages/rust/cronixui/src/{modal.rs → components/modal.rs} +15 -1
  115. package/packages/rust/cronixui/src/components/nav.rs +19 -0
  116. package/packages/rust/cronixui/src/{pagination.rs → components/pagination.rs} +14 -13
  117. package/packages/rust/cronixui/src/components/progress.rs +50 -0
  118. package/packages/rust/cronixui/src/components/search.rs +185 -0
  119. package/packages/rust/cronixui/src/components/skeleton.rs +63 -0
  120. package/packages/rust/cronixui/src/components/spinner.rs +21 -0
  121. package/packages/rust/cronixui/src/components/table.rs +56 -0
  122. package/packages/rust/cronixui/src/components/tabs.rs +43 -0
  123. package/packages/rust/cronixui/src/components/toast.rs +69 -0
  124. package/packages/rust/cronixui/src/{toggle.rs → components/toggle.rs} +7 -5
  125. package/packages/rust/cronixui/src/components/tooltip.rs +11 -0
  126. package/packages/rust/cronixui/src/lib.rs +111 -64
  127. package/packages/rust/cronixui/src/tokens.rs +97 -127
  128. package/packages/web/src/variables.css +81 -81
  129. package/packages/go/cronixui/tokens.go +0 -129
  130. package/packages/python/cronixui/pyproject.toml +0 -11
  131. package/packages/react/src/components/Accordion.jsx +0 -50
  132. package/packages/react/src/components/Alert.jsx +0 -62
  133. package/packages/react/src/components/Avatar.jsx +0 -34
  134. package/packages/react/src/components/Badge.jsx +0 -15
  135. package/packages/react/src/components/Breadcrumb.jsx +0 -27
  136. package/packages/react/src/components/Button.jsx +0 -21
  137. package/packages/react/src/components/Card.jsx +0 -23
  138. package/packages/react/src/components/Checkbox.jsx +0 -27
  139. package/packages/react/src/components/CommandPalette.jsx +0 -93
  140. package/packages/react/src/components/Dropdown.jsx +0 -48
  141. package/packages/react/src/components/FileInput.jsx +0 -44
  142. package/packages/react/src/components/Input.jsx +0 -22
  143. package/packages/react/src/components/List.jsx +0 -29
  144. package/packages/react/src/components/Modal.jsx +0 -65
  145. package/packages/react/src/components/Nav.jsx +0 -50
  146. package/packages/react/src/components/Pagination.jsx +0 -81
  147. package/packages/react/src/components/Progress.jsx +0 -23
  148. package/packages/react/src/components/Radio.jsx +0 -50
  149. package/packages/react/src/components/Search.jsx +0 -70
  150. package/packages/react/src/components/Select.jsx +0 -33
  151. package/packages/react/src/components/Skeleton.jsx +0 -15
  152. package/packages/react/src/components/Slider.jsx +0 -29
  153. package/packages/react/src/components/Spinner.jsx +0 -5
  154. package/packages/react/src/components/Stat.jsx +0 -19
  155. package/packages/react/src/components/Table.jsx +0 -48
  156. package/packages/react/src/components/Tabs.jsx +0 -65
  157. package/packages/react/src/components/Tag.jsx +0 -19
  158. package/packages/react/src/components/Textarea.jsx +0 -17
  159. package/packages/react/src/components/Toast.jsx +0 -78
  160. package/packages/react/src/components/Toggle.jsx +0 -34
  161. package/packages/react/src/components/Tooltip.jsx +0 -12
  162. package/packages/react/src/index.d.ts +0 -103
  163. package/packages/react/src/index.js +0 -33
  164. package/packages/rust/cronixui/src/accordion.rs +0 -49
  165. package/packages/rust/cronixui/src/command_palette.rs +0 -62
  166. package/packages/rust/cronixui/src/dropdown.rs +0 -31
  167. package/packages/rust/cronixui/src/search.rs +0 -49
  168. package/packages/rust/cronixui/src/tabs.rs +0 -23
  169. package/packages/rust/cronixui/src/toast.rs +0 -70
@@ -0,0 +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
+ }