@kingsimba/nc-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,867 @@
1
+ :root {
2
+ color-scheme: dark;
3
+
4
+ /* Core colors */
5
+ --nc-bg: #151b23;
6
+ --nc-bg-secondary: #1a2332;
7
+ --nc-bg-tertiary: #232d3d;
8
+ --nc-bg-quaternary: #2c3847;
9
+ --nc-muted: #7a8a9a;
10
+ --nc-text: #e8eef6;
11
+ --nc-text-weak: #6b7280;
12
+ --nc-text-weaker: #4b5563;
13
+ --nc-primary: #3b82f6;
14
+ --nc-danger: #ef4444;
15
+ --nc-warning: #f59e0b;
16
+ --nc-success: #22c55e;
17
+
18
+ /* UI element colors */
19
+ --nc-border: #1f2937;
20
+ --nc-button-border: #223042;
21
+ --nc-button-bg: #0f1722;
22
+ --nc-button-hover: #162332;
23
+ --nc-button-active: #1d2e42;
24
+ --nc-overlay-hover: rgba(255, 255, 255, 0.05);
25
+
26
+ /* YAML syntax highlighting */
27
+ --nc-code-string: #f48771;
28
+ --nc-code-boolean: #7cc5ff;
29
+ --nc-code-null: #7cc5ff;
30
+ --nc-code-number: #b5cea8;
31
+ --nc-code-key: #9cdcfe;
32
+ --nc-code-comment: #6a9955;
33
+ }
34
+
35
+ /* Light theme */
36
+ :root.light {
37
+ color-scheme: light;
38
+
39
+ /* Core colors */
40
+ --nc-bg: #f1f5f9;
41
+ --nc-bg-secondary: #ffffff;
42
+ --nc-bg-tertiary: #f1f5f9;
43
+ --nc-bg-quaternary: #e2e8f0;
44
+ --nc-muted: #64748b;
45
+ --nc-text: #1e293b;
46
+ --nc-text-weak: #64748b;
47
+ --nc-text-weaker: #b5c2d5;
48
+ --nc-primary: #2563eb;
49
+ --nc-danger: #dc2626;
50
+ --nc-warning: #d97706;
51
+ --nc-success: #16a34a;
52
+
53
+ /* UI element colors */
54
+ --nc-border: #e2e8f0;
55
+ --nc-button-border: #cbd5e1;
56
+ --nc-button-bg: #f8fafc;
57
+ --nc-button-hover: #f1f5f9;
58
+ --nc-button-active: #e2e8f0;
59
+ --nc-overlay-hover: rgba(0, 0, 0, 0.05);
60
+
61
+ /* YAML syntax highlighting */
62
+ --nc-code-string: #a31515;
63
+ --nc-code-boolean: #0000ff;
64
+ --nc-code-null: #0000ff;
65
+ --nc-code-number: #098658;
66
+ --nc-code-key: #001080;
67
+ --nc-code-comment: #008000;
68
+ }
69
+
70
+ /* Button component */
71
+ .nc-button {
72
+ padding: 9px 14px;
73
+ border-radius: 8px;
74
+ border: 1px solid var(--nc-button-border);
75
+ background: var(--nc-button-bg);
76
+ color: var(--nc-text);
77
+ cursor: pointer;
78
+ transition: background 100ms, transform 80ms;
79
+ text-transform: uppercase;
80
+ display: inline-flex;
81
+ align-items: center;
82
+ gap: 8px;
83
+ justify-content: center;
84
+ position: relative;
85
+ }
86
+
87
+ .nc-button:hover { background: var(--nc-button-hover); }
88
+ .nc-button:active { transform: scale(0.97); background: var(--nc-button-active); }
89
+ .nc-button.nc-block { width: 100%; }
90
+
91
+ .nc-button.nc-primary { background: var(--nc-primary); border-color: var(--nc-primary); color: white; }
92
+ .nc-button.nc-primary:hover { filter: brightness(1.05); }
93
+ .nc-button.nc-primary:active { filter: brightness(0.95); transform: scale(0.97); }
94
+
95
+ .nc-button.nc-danger { background: var(--nc-danger); border-color: var(--nc-danger); color: white; }
96
+ .nc-button.nc-danger:hover { filter: brightness(1.05); }
97
+ .nc-button.nc-danger:active { filter: brightness(0.9); transform: scale(0.97); }
98
+
99
+ .nc-button.nc-warning { background: var(--nc-warning); border-color: var(--nc-warning); color: white; }
100
+ .nc-button.nc-warning:hover { filter: brightness(1.05); }
101
+ .nc-button.nc-warning:active { filter: brightness(0.9); transform: scale(0.97); }
102
+
103
+ .nc-button.nc-success { background: var(--nc-success); border-color: var(--nc-success); color: white; }
104
+ .nc-button.nc-success:hover { filter: brightness(1.05); }
105
+ .nc-button.nc-success:active { filter: brightness(0.9); transform: scale(0.97); }
106
+
107
+ .nc-button.nc-ghost { background: transparent; border-width: 0; color: var(--nc-text); }
108
+ .nc-button.nc-ghost:hover { background: var(--nc-button-hover); }
109
+ .nc-button.nc-ghost:active { background: var(--nc-button-active); transform: scale(0.97); }
110
+
111
+ .nc-button.nc-small { padding: 2px 10px; font-size: 12px; margin: 0; border-radius: 6px; height: 32px; }
112
+ .nc-button.nc-large { padding: 12px 14px; font-size: 16px; min-height: 60px; font-weight: bold; }
113
+ .nc-button.nc-text-selectable { user-select: text; -webkit-user-select: text; text-transform: none; }
114
+
115
+ /* Disabled state */
116
+ .nc-button.nc-disabled, .nc-button:disabled { opacity: 0.5; cursor: default; pointer-events: none; }
117
+
118
+ /* Loading state */
119
+ .nc-button.nc-loading { color: transparent; }
120
+ .nc-button.nc-loading>*:not(.nc-button-spinner) { visibility: hidden; }
121
+ .nc-button-spinner { position: absolute; }
122
+
123
+ /* Activity Indicator */
124
+ .nc-activity-indicator {
125
+ border: 2px solid transparent;
126
+ border-top-color: var(--nc-primary);
127
+ border-radius: 50%;
128
+ animation: nc-spin 0.8s linear infinite;
129
+ box-sizing: border-box;
130
+ }
131
+
132
+ .nc-activity-indicator.nc-small { width: 16px; height: 16px; border-width: 2px; }
133
+ .nc-activity-indicator.nc-default { width: 24px; height: 24px; border-width: 2.5px; }
134
+ .nc-activity-indicator.nc-large { width: 32px; height: 32px; border-width: 3px; }
135
+
136
+ /* Overlay mode - covers parent element (parent must have position: relative) */
137
+ .nc-activity-indicator-overlay {
138
+ position: absolute;
139
+ inset: 0;
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: center;
143
+ background: var(--nc-overlay-bg, rgba(128, 128, 128, 0.1));
144
+ border-radius: inherit;
145
+ pointer-events: all;
146
+ z-index: 1;
147
+ }
148
+
149
+ @keyframes nc-spin {
150
+ to {
151
+ transform: rotate(360deg);
152
+ }
153
+ }
154
+
155
+ /* Input component */
156
+ .nc-input {
157
+ background: var(--nc-button-bg);
158
+ color: var(--nc-text);
159
+ border: 1px solid var(--nc-button-border);
160
+ border-radius: 8px;
161
+ padding: 10px 12px;
162
+ font-size: inherit;
163
+ }
164
+
165
+ .nc-input.nc-small { padding: 6px 12px; font-size: 12px; min-height: 32px; height: 32px; border-radius: 4px; }
166
+
167
+ /* Label component */
168
+ .nc-label { font-size: 14px; color: var(--nc-text); margin-bottom: 4px; }
169
+ .nc-label.nc-small { font-size: 12px; }
170
+
171
+ /* ComboBox component */
172
+ .nc-combo-container { display: flex; flex-direction: column; }
173
+
174
+ .nc-combo-button {
175
+ position: absolute;
176
+ padding: 0;
177
+ min-height: 0;
178
+ border: none;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ padding: 2px;
183
+ }
184
+
185
+ .nc-combo-button.nc-small { height: 24px; width: 14px; font-size: 10px; padding: 2px; }
186
+ .nc-combo-button:not(.nc-small) { height: 34px; width: 24px; font-size: 14px; }
187
+ .nc-combo-clear { right: 4px; }
188
+ .nc-combo-clear.nc-small { right: 4px; }
189
+ .nc-combo-toggle { right: 4px; transition: transform 140ms ease; }
190
+ .nc-combo-toggle.nc-open { transform: rotate(180deg); }
191
+
192
+ .nc-combo-dropdown { background: var(--nc-button-bg); border: 1px solid var(--nc-button-border); border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }
193
+
194
+ .nc-combo-dropdown-option { padding: 6px 10px; font-size: 12px; cursor: pointer; }
195
+ .nc-combo-dropdown-option:not(.nc-small) { padding: 10px 12px; font-size: inherit; }
196
+ .nc-combo-dropdown-option:hover { background: var(--nc-button-hover); }
197
+
198
+ .nc-combo-overlay-text { color: var(--nc-text); overflow: hidden; text-overflow: ellipsis; }
199
+ .nc-combo-overlay-text.nc-small { font-size: 13px; }
200
+ .nc-combo-overlay-default { color: var(--nc-text-weak); }
201
+ .nc-combo-overlay-default.nc-small { font-size: 10px; }
202
+
203
+ /* Checkbox component */
204
+ .nc-checkbox-label {
205
+ display: flex;
206
+ flex-direction: row;
207
+ gap: 10px;
208
+ align-items: center;
209
+ cursor: pointer;
210
+ padding: 6px 0;
211
+ width: 100%;
212
+ user-select: none;
213
+ font-size: 14px;
214
+ }
215
+
216
+ .nc-checkbox-label.nc-small { gap: 8px; padding: 6px 0; font-size: 12px; }
217
+ .nc-checkbox-label.nc-disabled { cursor: not-allowed; opacity: 0.5; }
218
+
219
+ .nc-checkbox-box {
220
+ border-radius: 4px;
221
+ border: 2px solid var(--nc-button-border);
222
+ background: transparent;
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ color: white;
227
+ flex-shrink: 0;
228
+ transition: border-color 160ms, background 160ms;
229
+ width: 18px;
230
+ height: 18px;
231
+ }
232
+
233
+ .nc-checkbox-box.nc-small { width: 14px; height: 14px; border-radius: 3px; }
234
+ .nc-checkbox-box.nc-checked { border-color: var(--nc-primary); background: var(--nc-primary); }
235
+ .nc-checkbox-text { flex: 1; color: var(--nc-text); }
236
+ .nc-checkbox-icon { width: 12px; height: 12px; }
237
+ .nc-checkbox-icon.nc-small { width: 10px; height: 10px; }
238
+
239
+ /* Icon button component (common buttons) */
240
+ .nc-icon-button {
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ border: none;
245
+ border-radius: 4px;
246
+ background: transparent;
247
+ color: var(--nc-text-weak);
248
+ cursor: pointer;
249
+ transition: background 100ms, color 100ms;
250
+ }
251
+
252
+ .nc-icon-button[data-size="small"] { width: 24px; height: 24px; }
253
+ .nc-icon-button[data-size="default"] { width: 28px; height: 28px; }
254
+ .nc-icon-button[data-size="large"] { width: 32px; height: 32px; }
255
+
256
+ .nc-icon-button:hover { background: var(--nc-button-hover); color: var(--nc-text); }
257
+ .nc-icon-button:active { transform: scale(0.95); }
258
+ .nc-icon-button:disabled { cursor: not-allowed; opacity: 0.5; }
259
+ .nc-icon-button:disabled:active { transform: none; }
260
+
261
+ /* Close button variant */
262
+ .nc-icon-button-close:hover { background: var(--nc-danger); color: white; }
263
+
264
+ /* Edit button variant */
265
+ .nc-icon-button-edit:hover { background: var(--nc-primary); color: white; }
266
+
267
+ /* Trash button variant */
268
+ .nc-icon-button-trash:hover { background: var(--nc-danger); color: white; }
269
+
270
+ /* Spinning animation for refresh icon */
271
+ .nc-spinning { animation: nc-spin 1s linear infinite; }
272
+
273
+ /* Hyperlink component */
274
+ .nc-hyperlink {
275
+ background: none;
276
+ border: none;
277
+ color: var(--nc-primary);
278
+ cursor: pointer;
279
+ font-size: inherit;
280
+ padding: 0;
281
+ text-decoration: underline;
282
+ text-underline-offset: 2px;
283
+ }
284
+
285
+ .nc-hyperlink:hover { filter: brightness(1.2); }
286
+ .nc-hyperlink:disabled { opacity: 0.5; cursor: not-allowed; }
287
+ .nc-hyperlink[data-size="small"] { font-size: 12px; }
288
+
289
+ /* Alert component */
290
+ .nc-alert {
291
+ display: flex;
292
+ gap: 8px;
293
+ padding: 12px 16px 12px 5px;
294
+ margin: 6px 0;
295
+ border-radius: 6px;
296
+ min-height: 56px;
297
+ align-items: flex-start;
298
+ flex-direction: column;
299
+ }
300
+
301
+ .nc-alert.nc-error { background: rgba(239, 68, 68, 0.15); }
302
+ .nc-alert.nc-warning { background: rgba(245, 158, 11, 0.15); }
303
+
304
+ .nc-alert-message {
305
+ padding: 2px 10px;
306
+ color: var(--nc-text);
307
+ font-size: 15px;
308
+ white-space: normal;
309
+ word-break: break-word;
310
+ overflow-wrap: anywhere;
311
+ line-height: 1.6;
312
+ font-weight: 600;
313
+ text-align: left;
314
+ }
315
+
316
+ .nc-alert-message.nc-error { color: var(--nc-danger); }
317
+ .nc-alert-message.nc-warning { color: var(--nc-warning); }
318
+ .nc-alert-code { font-size: 1.1em; font-weight: bold; margin-right: 8px; }
319
+ .nc-alert-action { align-self: flex-end; }
320
+
321
+ /* Battery component */
322
+ .nc-battery { display: block; }
323
+
324
+ /* ButtonGroup component */
325
+ .nc-button-group {
326
+ display: inline-flex;
327
+ border-radius: 8px;
328
+ border: 1px solid var(--nc-button-border);
329
+ overflow: hidden;
330
+ background: var(--nc-button-bg);
331
+ width: fit-content;
332
+ }
333
+
334
+ .nc-button-group.nc-small .nc-button-group-item {
335
+ padding: 6px 12px;
336
+ font-size: 13px;
337
+ }
338
+
339
+ .nc-button-group-item {
340
+ padding: 10px 20px;
341
+ border: none;
342
+ background: transparent;
343
+ color: var(--nc-text);
344
+ cursor: pointer;
345
+ transition: background 120ms, color 120ms;
346
+ font-size: inherit;
347
+ font-family: inherit;
348
+ text-transform: capitalize;
349
+ }
350
+
351
+ .nc-button-group-item.nc-has-border { border-right: 1px solid var(--nc-button-border); }
352
+ .nc-button-group-item.nc-active { background: var(--nc-primary); color: white; }
353
+ .nc-button-group-item:hover:not(:disabled):not(.nc-active) { background: var(--nc-button-hover); }
354
+ .nc-button-group-item:active:not(:disabled) { transform: scale(0.98); }
355
+ .nc-button-group-item:disabled { cursor: not-allowed; opacity: 0.5; }
356
+
357
+ /* ContextMenu component */
358
+ .nc-context-menu {
359
+ background: var(--nc-button-bg);
360
+ border: 1px solid var(--nc-border);
361
+ border-radius: 6px;
362
+ box-shadow: 0 10px 38px rgba(0, 0, 0, 0.2), 0 5px 20px rgba(0, 0, 0, 0.15);
363
+ min-width: 160px;
364
+ overflow: hidden;
365
+ animation: nc-context-menu-enter 0.15s ease-out;
366
+ }
367
+
368
+ @keyframes nc-context-menu-enter {
369
+ from {
370
+ opacity: 0;
371
+ transform: scale(0.95);
372
+ }
373
+
374
+ to {
375
+ opacity: 1;
376
+ transform: scale(1);
377
+ }
378
+ }
379
+
380
+ .nc-context-menu-item {
381
+ display: flex;
382
+ align-items: center;
383
+ gap: 12px;
384
+ width: 100%;
385
+ padding: 8px 12px;
386
+ background: none;
387
+ border: none;
388
+ color: var(--nc-text);
389
+ cursor: pointer;
390
+ text-align: left;
391
+ font-size: 14px;
392
+ transition: background-color 0.2s ease;
393
+ }
394
+
395
+ .nc-context-menu-item:not(.nc-disabled):hover { background-color: var(--nc-overlay-hover); }
396
+ .nc-context-menu-item:not(.nc-disabled):active { background-color: var(--nc-button-active); }
397
+ .nc-context-menu-item.nc-disabled { color: var(--nc-text-weak); cursor: not-allowed; }
398
+ .nc-context-menu-item.nc-danger { color: var(--nc-danger); }
399
+ .nc-context-menu-item.nc-danger:not(.nc-disabled):hover { background-color: rgba(239, 68, 68, 0.1); }
400
+ .nc-context-menu-item.nc-danger:not(.nc-disabled):active { background-color: rgba(239, 68, 68, 0.15); }
401
+
402
+ .nc-context-menu-icon {
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: center;
406
+ width: 16px;
407
+ height: 16px;
408
+ flex-shrink: 0;
409
+ }
410
+
411
+ .nc-context-menu-label {
412
+ flex: 1;
413
+ white-space: nowrap;
414
+ overflow: hidden;
415
+ text-overflow: ellipsis;
416
+ }
417
+
418
+ /* NumberInput component */
419
+ .nc-number-input-container { display: flex; align-items: stretch; }
420
+ .nc-number-input-container.nc-small { gap: 4px; }
421
+ .nc-number-input-container:not(.nc-small) { gap: 6px; }
422
+ .nc-number-input { text-align: center; }
423
+ .nc-number-input.nc-small { width: 80px; font-size: 12px; padding: 0 4px; border-radius: 4px; }
424
+ .nc-number-input:not(.nc-small) { width: 120px; }
425
+ .nc-number-input-button { padding: 0; font-weight: normal; display: flex; align-items: center; justify-content: center; font-family: Arial, sans-serif; }
426
+ .nc-number-input-button.nc-small { width: 28px; min-height: 28px; font-size: 16px; }
427
+ .nc-number-input-button:not(.nc-small) { width: 42px; min-height: 42px; font-size: 24px; }
428
+ .nc-number-input-col.nc-small { gap: 4px; }
429
+ .nc-number-input-col:not(.nc-small) { gap: 6px; }
430
+
431
+ /* Hide number input spinner arrows */
432
+ input[type="number"]::-webkit-inner-spin-button,
433
+ input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
434
+ input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
435
+
436
+ /* Layout utilities */
437
+ .nc-label { color: var(--nc-muted); font-size: 12px; }
438
+ .nc-row { display: flex; gap: 8px; align-items: center; }
439
+ .nc-col { display: flex; flex-direction: column; gap: 6px; }
440
+ .nc-section { padding: 12px; }
441
+ .nc-section+.nc-section { border-top: 1px solid var(--nc-border); }
442
+
443
+ /* ComboBox dropdown options */
444
+ .nc-combo-dropdown .nc-section { padding: 8px 12px; }
445
+ .nc-combo-dropdown .nc-section + .nc-section { border-top: none; }
446
+ .nc-combo-dropdown .nc-section:hover { background: var(--nc-overlay-hover); }
447
+
448
+ /* Slider component */
449
+ .nc-slider {
450
+ -webkit-appearance: none;
451
+ appearance: none;
452
+ height: 6px;
453
+ border-radius: 3px;
454
+ background: linear-gradient(
455
+ to right,
456
+ var(--nc-primary) 0%,
457
+ var(--nc-primary) var(--nc-slider-percentage, 50%),
458
+ var(--nc-button-bg) var(--nc-slider-percentage, 50%),
459
+ var(--nc-button-bg) 100%
460
+ );
461
+ border: 1px solid var(--nc-button-border);
462
+ outline: none;
463
+ cursor: pointer;
464
+ }
465
+
466
+ .nc-slider::-webkit-slider-thumb {
467
+ -webkit-appearance: none;
468
+ appearance: none;
469
+ width: 18px;
470
+ height: 18px;
471
+ border-radius: 50%;
472
+ background: var(--nc-primary);
473
+ border: 2px solid var(--nc-primary);
474
+ cursor: pointer;
475
+ transition: transform 100ms, box-shadow 100ms;
476
+ }
477
+
478
+ .nc-slider::-webkit-slider-thumb:hover {
479
+ transform: scale(1.1);
480
+ box-shadow: 0 0 8px rgba(59, 130, 246, 0.5);
481
+ }
482
+
483
+ .nc-slider::-webkit-slider-thumb:active {
484
+ transform: scale(0.95);
485
+ }
486
+
487
+ .nc-slider::-moz-range-thumb {
488
+ width: 18px;
489
+ height: 18px;
490
+ border-radius: 50%;
491
+ background: var(--nc-primary);
492
+ border: 2px solid var(--nc-primary);
493
+ cursor: pointer;
494
+ transition: transform 100ms, box-shadow 100ms;
495
+ }
496
+
497
+ .nc-slider::-moz-range-thumb:hover { transform: scale(1.1); box-shadow: 0 0 8px rgba(59, 130, 246, 0.5); }
498
+ .nc-slider:disabled { opacity: 0.5; cursor: not-allowed; }
499
+ .nc-slider:disabled::-webkit-slider-thumb { cursor: not-allowed; }
500
+ .nc-slider:disabled::-moz-range-thumb { cursor: not-allowed; }
501
+
502
+ /* ListGroup component */
503
+ .nc-list-group { margin-bottom: 0; }
504
+ .nc-list-group:last-child { margin-bottom: 16px; }
505
+
506
+ .nc-list-group-title {
507
+ font-size: 12px;
508
+ font-weight: 600;
509
+ color: var(--nc-text-weak);
510
+ text-transform: uppercase;
511
+ letter-spacing: 0.5px;
512
+ margin-bottom: 8px;
513
+ padding-left: 2px;
514
+ display: flex;
515
+ align-items: center;
516
+ justify-content: space-between;
517
+ }
518
+
519
+ .nc-list-group-content {
520
+ background: var(--nc-button-bg);
521
+ border: 1px solid var(--nc-border);
522
+ border-radius: 8px;
523
+ overflow: hidden;
524
+ }
525
+
526
+ .nc-list-group-item {
527
+ padding: 12px 14px;
528
+ cursor: default;
529
+ border-bottom: 1px solid var(--nc-border);
530
+ min-height: 56px;
531
+ box-sizing: border-box;
532
+ display: flex;
533
+ align-items: center;
534
+ transition: background-color 150ms ease-out;
535
+ }
536
+
537
+ .nc-list-group-item:last-child { border-bottom: none; }
538
+ .nc-list-group-item-clickable:hover { background-color: var(--nc-overlay-hover); }
539
+ .nc-list-group-item-active { background-color: var(--nc-button-active); }
540
+
541
+ .nc-list-group-title-tools { display: flex; gap: 8px; }
542
+
543
+ /* Tabs component */
544
+ .nc-tab-container { border-bottom: 1px solid var(--nc-border); }
545
+
546
+ .nc-tab-item {
547
+ padding: 12px 16px;
548
+ font-size: 12px;
549
+ font-weight: 600;
550
+ color: var(--nc-text-weak);
551
+ cursor: pointer;
552
+ transition: color 120ms, border-color 120ms;
553
+ border-bottom: 2px solid transparent;
554
+ text-transform: uppercase;
555
+ letter-spacing: 0.5px;
556
+ }
557
+
558
+ .nc-tab-item:hover { color: var(--nc-text); }
559
+ .nc-tab-item.nc-active { color: var(--nc-primary); border-bottom-color: var(--nc-primary); }
560
+
561
+ /* Toggle component */
562
+ .nc-toggle {
563
+ position: relative;
564
+ width: 56px;
565
+ height: 30px;
566
+ border-radius: 18px;
567
+ padding: 4px;
568
+ display: inline-flex;
569
+ align-items: center;
570
+ justify-content: flex-start;
571
+ transition: border-color 160ms, background 160ms;
572
+ cursor: pointer;
573
+ }
574
+
575
+ .nc-toggle.nc-checked { border-color: var(--nc-primary); background: rgba(59, 130, 246, 0.08); }
576
+ .nc-toggle:not(.nc-checked) { border: 2px solid var(--nc-button-border); background: transparent; }
577
+
578
+ .nc-toggle-thumb {
579
+ width: 22px;
580
+ height: 22px;
581
+ border-radius: 12px;
582
+ transition: transform 160ms, background 160ms;
583
+ border: none;
584
+ }
585
+
586
+ .nc-toggle-thumb.nc-checked { background: var(--nc-text); transform: translateX(24px); box-shadow: 0 2px 6px rgba(59, 130, 246, 0.28); }
587
+ .nc-toggle-thumb:not(.nc-checked) { background: var(--nc-muted); transform: translateX(0); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); }
588
+
589
+ /* Dialog component */
590
+ .nc-dialog-overlay {
591
+ position: absolute;
592
+ inset: 0;
593
+ background: rgba(0, 0, 0, 0.6);
594
+ display: flex;
595
+ align-items: center;
596
+ justify-content: center;
597
+ z-index: 100;
598
+ animation: nc-dialog-fade-in 150ms ease-out;
599
+ }
600
+
601
+ .nc-dialog-overlay.nc-fullscreen {
602
+ position: fixed;
603
+ z-index: 1000;
604
+ }
605
+
606
+ .nc-dialog-container {
607
+ background: var(--nc-bg);
608
+ border-radius: 12px;
609
+ border: 1px solid var(--nc-border);
610
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
611
+ display: flex;
612
+ flex-direction: column;
613
+ animation: nc-dialog-slide-up 200ms ease-out;
614
+ outline: none;
615
+ }
616
+
617
+ .nc-dialog-header {
618
+ display: flex;
619
+ align-items: center;
620
+ justify-content: space-between;
621
+ padding: 16px 20px;
622
+ border-bottom: 1px solid var(--nc-border);
623
+ }
624
+
625
+ .nc-dialog-title {
626
+ font-size: 16px;
627
+ font-weight: 600;
628
+ color: var(--nc-text);
629
+ margin: 0;
630
+ }
631
+
632
+ .nc-dialog-content {
633
+ padding: 20px;
634
+ overflow-y: auto;
635
+ flex: 1;
636
+ color: var(--nc-text);
637
+ }
638
+
639
+ .nc-dialog-footer {
640
+ display: flex;
641
+ gap: 8px;
642
+ padding: 16px 20px;
643
+ border-top: 1px solid var(--nc-border);
644
+ justify-content: flex-end;
645
+ }
646
+
647
+ @keyframes nc-dialog-fade-in {
648
+ from {
649
+ opacity: 0;
650
+ }
651
+ to {
652
+ opacity: 1;
653
+ }
654
+ }
655
+
656
+ @keyframes nc-dialog-slide-up {
657
+ from {
658
+ opacity: 0;
659
+ transform: translateY(20px) scale(0.95);
660
+ }
661
+ to {
662
+ opacity: 1;
663
+ transform: translateY(0) scale(1);
664
+ }
665
+ }
666
+
667
+ /* App Title Bar */
668
+ .nc-app-title-bar {
669
+ display: flex;
670
+ align-items: center;
671
+ justify-content: space-between;
672
+ padding: 6px 8px;
673
+ background: var(--nc-bg-secondary);
674
+ border-bottom: 1px solid var(--nc-border);
675
+ flex-shrink: 0;
676
+ min-height: 36px;
677
+ }
678
+
679
+ .nc-app-title-bar-left {
680
+ display: flex;
681
+ align-items: center;
682
+ gap: 8px;
683
+ flex: 1;
684
+ min-width: 0;
685
+ }
686
+
687
+ .nc-app-title-bar-title {
688
+ font-size: 13px;
689
+ font-weight: 600;
690
+ color: var(--nc-text);
691
+ white-space: nowrap;
692
+ overflow: hidden;
693
+ text-overflow: ellipsis;
694
+ }
695
+
696
+ .nc-app-title-bar-back {
697
+ display: flex;
698
+ align-items: center;
699
+ justify-content: center;
700
+ width: 28px;
701
+ height: 28px;
702
+ border: none;
703
+ background: transparent;
704
+ color: var(--nc-text);
705
+ border-radius: 6px;
706
+ cursor: pointer;
707
+ transition: background-color 0.15s ease;
708
+ flex-shrink: 0;
709
+ }
710
+
711
+ .nc-app-title-bar-back:hover {
712
+ background-color: var(--nc-bg-tertiary);
713
+ }
714
+
715
+ .nc-app-title-bar-back:active {
716
+ background-color: var(--nc-bg-quaternary);
717
+ }
718
+
719
+ .nc-app-title-bar-right {
720
+ display: flex;
721
+ align-items: center;
722
+ gap: 4px;
723
+ flex-shrink: 0;
724
+ }
725
+
726
+ .nc-app-title-bar-toolbar {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: 4px;
730
+ }
731
+
732
+ .nc-app-content-wrapper {
733
+ overflow-y: auto;
734
+ }
735
+
736
+ /* App Taskbar */
737
+ .nc-app-taskbar {
738
+ display: flex;
739
+ flex-direction: column;
740
+ align-items: center;
741
+ gap: 6px;
742
+ padding: 8px;
743
+ background: var(--nc-bg-secondary);
744
+ border-right: 1px solid var(--nc-border);
745
+ flex-shrink: 0;
746
+ width: 56px;
747
+ }
748
+
749
+ .nc-app-taskbar-button {
750
+ display: flex;
751
+ align-items: center;
752
+ justify-content: center;
753
+ width: 40px;
754
+ height: 40px;
755
+ border: none;
756
+ background: transparent;
757
+ color: var(--nc-text);
758
+ border-radius: 8px;
759
+ cursor: pointer;
760
+ transition: background-color 0.15s ease, transform 0.1s ease;
761
+ position: relative;
762
+ user-select: none;
763
+ }
764
+
765
+ .nc-app-taskbar-button:hover {
766
+ background-color: var(--nc-bg-tertiary);
767
+ }
768
+
769
+ .nc-app-taskbar-button:active {
770
+ transform: scale(0.95);
771
+ background-color: var(--nc-bg-quaternary);
772
+ }
773
+
774
+ .nc-app-taskbar-button.nc-active {
775
+ background-color: var(--nc-bg-tertiary);
776
+ }
777
+
778
+ .nc-app-taskbar-button.nc-active:hover {
779
+ background-color: var(--nc-bg-quaternary);
780
+ }
781
+
782
+ /* Running indicator dot under the icon */
783
+ .nc-app-taskbar-indicator {
784
+ position: absolute;
785
+ bottom: 2px;
786
+ left: 50%;
787
+ transform: translateX(-50%);
788
+ width: 4px;
789
+ height: 4px;
790
+ border-radius: 50%;
791
+ background-color: var(--nc-primary);
792
+ }
793
+
794
+ .nc-app-taskbar-button.nc-active .nc-app-taskbar-indicator {
795
+ width: 16px;
796
+ border-radius: 2px;
797
+ }
798
+
799
+ /* Separator between pinned and non-pinned apps */
800
+ .nc-app-taskbar-separator {
801
+ width: 24px;
802
+ height: 1px;
803
+ background-color: var(--nc-border);
804
+ margin: 4px 0;
805
+ }
806
+
807
+ /* Desktop separator (keep horizontal) */
808
+ .nc-app-taskbar.nc-desktop .nc-app-taskbar-separator {
809
+ width: 32px;
810
+ height: 1px;
811
+ background: var(--nc-border);
812
+ margin: 4px 0;
813
+ }
814
+
815
+ /* Mobile taskbar - horizontal at bottom */
816
+ @media (max-width: 767px) {
817
+ .nc-app-taskbar.nc-mobile {
818
+ flex-direction: row;
819
+ width: 100%;
820
+ height: 56px;
821
+ border-right: none;
822
+ border-top: 1px solid var(--nc-border);
823
+ position: fixed;
824
+ bottom: 0;
825
+ left: 0;
826
+ right: 0;
827
+ z-index: 100;
828
+ justify-content: center;
829
+ overflow-x: auto;
830
+ }
831
+
832
+ /* Adjust running indicator for horizontal layout */
833
+ .nc-app-taskbar.nc-mobile .nc-app-taskbar-indicator {
834
+ bottom: auto;
835
+ top: 2px;
836
+ }
837
+
838
+ /* Separator becomes vertical divider */
839
+ .nc-app-taskbar.nc-mobile .nc-app-taskbar-separator {
840
+ width: 1px;
841
+ height: 32px;
842
+ background: var(--nc-border);
843
+ margin: 0 4px;
844
+ }
845
+ }
846
+
847
+ /* AppDialog component */
848
+ .nc-app-dialog-container {
849
+ width: 95vw;
850
+ height: 95vh;
851
+ background: var(--nc-bg);
852
+ border: 1px solid var(--nc-border);
853
+ border-radius: 12px;
854
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
855
+ display: flex;
856
+ flex-direction: column;
857
+ overflow: hidden;
858
+ animation: nc-dialog-slide-up 200ms ease-out;
859
+ }
860
+
861
+ /* YAML Editor syntax highlighting tokens */
862
+ .nc-token-string { color: var(--nc-code-string) !important; }
863
+ .nc-token-boolean { color: var(--nc-code-boolean) !important; }
864
+ .nc-token-constant { color: var(--nc-code-null) !important; }
865
+ .nc-token-number { color: var(--nc-code-number) !important; }
866
+ .nc-token-atrule { color: var(--nc-code-key) !important; }
867
+ .nc-token-comment { color: var(--nc-code-comment) !important; }