@jerco/ui 0.2.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,1289 @@
1
+ @import "@jerco/tokens/styles.css";
2
+ @import "@jerco/theme-base/styles.css";
3
+ @import "@jerco/theme-jerco/styles.css";
4
+
5
+ .j-sr-only {
6
+ position: absolute;
7
+ width: 1px;
8
+ height: 1px;
9
+ padding: 0;
10
+ margin: -1px;
11
+ overflow: hidden;
12
+ clip: rect(0, 0, 0, 0);
13
+ white-space: nowrap;
14
+ border: 0;
15
+ }
16
+
17
+ .j-icon {
18
+ width: 1rem;
19
+ height: 1rem;
20
+ flex: 0 0 auto;
21
+ }
22
+
23
+ .j-button {
24
+ display: inline-flex;
25
+ min-height: var(--control-height);
26
+ align-items: center;
27
+ justify-content: center;
28
+ gap: var(--space-2);
29
+ border: 1px solid transparent;
30
+ border-radius: var(--radius-md);
31
+ padding-inline: var(--control-padding-x);
32
+ font: inherit;
33
+ font-size: var(--font-size-sm);
34
+ font-weight: var(--font-weight-semibold);
35
+ line-height: 1;
36
+ cursor: pointer;
37
+ transition:
38
+ background-color var(--motion-fast) var(--ease-standard),
39
+ border-color var(--motion-fast) var(--ease-standard),
40
+ color var(--motion-fast) var(--ease-standard),
41
+ transform var(--motion-fast) var(--ease-standard);
42
+ }
43
+
44
+ .j-button:active:not(:disabled) {
45
+ transform: translateY(1px);
46
+ }
47
+
48
+ .j-button:disabled,
49
+ .j-button[aria-disabled="true"] {
50
+ cursor: not-allowed;
51
+ opacity: 0.55;
52
+ }
53
+
54
+ .j-button--primary {
55
+ background: var(--action-primary);
56
+ color: var(--action-primary-foreground);
57
+ }
58
+
59
+ .j-button--primary:hover:not(:disabled) {
60
+ background: var(--action-primary-hover);
61
+ }
62
+
63
+ .j-button--secondary {
64
+ background: var(--action-secondary);
65
+ color: var(--foreground);
66
+ border-color: var(--border);
67
+ }
68
+
69
+ .j-button--secondary:hover:not(:disabled),
70
+ .j-button--outline:hover:not(:disabled),
71
+ .j-button--ghost:hover:not(:disabled) {
72
+ background: var(--action-secondary-hover);
73
+ }
74
+
75
+ .j-button--outline {
76
+ background: transparent;
77
+ color: var(--foreground);
78
+ border-color: var(--border-strong);
79
+ }
80
+
81
+ .j-button--ghost {
82
+ background: transparent;
83
+ color: var(--foreground-muted);
84
+ }
85
+
86
+ .j-button--destructive {
87
+ background: var(--status-danger);
88
+ color: var(--primitive-white);
89
+ }
90
+
91
+ .j-button--destructive:hover:not(:disabled) {
92
+ background: color-mix(in oklch, var(--status-danger), black 12%);
93
+ }
94
+
95
+ .j-button--sm {
96
+ min-height: calc(var(--control-height) - 8px);
97
+ padding-inline: calc(var(--control-padding-x) - 0.125rem);
98
+ }
99
+
100
+ .j-button--lg {
101
+ min-height: calc(var(--control-height) + 8px);
102
+ padding-inline: calc(var(--control-padding-x) + 0.25rem);
103
+ }
104
+
105
+ .j-button--icon {
106
+ width: var(--control-height);
107
+ padding: 0;
108
+ }
109
+
110
+ .j-input,
111
+ .j-select {
112
+ width: 100%;
113
+ min-height: var(--control-height);
114
+ border: 1px solid var(--border);
115
+ border-radius: var(--radius-md);
116
+ background: var(--surface);
117
+ color: var(--foreground);
118
+ padding-inline: var(--control-padding-x);
119
+ font: inherit;
120
+ font-size: var(--font-size-sm);
121
+ transition:
122
+ border-color var(--motion-fast) var(--ease-standard),
123
+ box-shadow var(--motion-fast) var(--ease-standard);
124
+ }
125
+
126
+ .j-input::placeholder {
127
+ color: var(--foreground-subtle);
128
+ }
129
+
130
+ .j-input:hover,
131
+ .j-select:hover {
132
+ border-color: var(--border-strong);
133
+ }
134
+
135
+ .j-input[aria-invalid="true"] {
136
+ border-color: var(--status-danger);
137
+ }
138
+
139
+ .j-textarea {
140
+ min-height: calc(var(--control-height) * 2);
141
+ padding-block: var(--space-3);
142
+ resize: vertical;
143
+ }
144
+
145
+ .j-label {
146
+ display: inline-block;
147
+ margin-bottom: var(--space-2);
148
+ color: var(--foreground);
149
+ font-size: var(--font-size-sm);
150
+ font-weight: var(--font-weight-medium);
151
+ }
152
+
153
+ .j-separator {
154
+ height: 1px;
155
+ width: 100%;
156
+ background: var(--border);
157
+ }
158
+
159
+ .j-select {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ justify-content: space-between;
163
+ gap: var(--space-2);
164
+ }
165
+
166
+ .j-native-select {
167
+ appearance: auto;
168
+ }
169
+
170
+ .j-select-content {
171
+ z-index: var(--z-dropdown);
172
+ min-width: var(--radix-select-trigger-width);
173
+ overflow: hidden;
174
+ border: 1px solid var(--border);
175
+ border-radius: var(--radius-md);
176
+ background: var(--surface-raised);
177
+ color: var(--foreground);
178
+ box-shadow: var(--shadow-md);
179
+ padding: var(--space-1);
180
+ }
181
+
182
+ .j-select-item {
183
+ position: relative;
184
+ display: flex;
185
+ min-height: 2rem;
186
+ align-items: center;
187
+ border-radius: var(--radius-sm);
188
+ padding: var(--space-2) calc(var(--space-3) + 1rem) var(--space-2) var(--space-3);
189
+ outline: none;
190
+ font-size: var(--font-size-sm);
191
+ cursor: default;
192
+ user-select: none;
193
+ }
194
+
195
+ .j-select-item[data-highlighted] {
196
+ background: var(--surface-hover);
197
+ }
198
+
199
+ .j-select-item[data-disabled] {
200
+ opacity: 0.5;
201
+ }
202
+
203
+ .j-select-check {
204
+ position: absolute;
205
+ right: var(--space-2);
206
+ }
207
+
208
+ .j-badge {
209
+ display: inline-flex;
210
+ align-items: center;
211
+ gap: var(--space-1);
212
+ border: 1px solid transparent;
213
+ border-radius: var(--radius-full);
214
+ padding: 0.125rem var(--space-2);
215
+ font-size: var(--font-size-xs);
216
+ font-weight: var(--font-weight-semibold);
217
+ line-height: 1.4;
218
+ }
219
+
220
+ .j-badge--neutral {
221
+ border-color: var(--border);
222
+ background: var(--action-secondary);
223
+ color: var(--foreground-muted);
224
+ }
225
+
226
+ .j-badge--success {
227
+ background: color-mix(in oklch, var(--status-success), transparent 84%);
228
+ color: color-mix(in oklch, var(--status-success), var(--foreground) 28%);
229
+ }
230
+
231
+ .j-badge--warning {
232
+ background: color-mix(in oklch, var(--status-warning), transparent 82%);
233
+ color: color-mix(in oklch, var(--status-warning), var(--foreground) 35%);
234
+ }
235
+
236
+ .j-badge--danger {
237
+ background: color-mix(in oklch, var(--status-danger), transparent 84%);
238
+ color: color-mix(in oklch, var(--status-danger), var(--foreground) 24%);
239
+ }
240
+
241
+ .j-badge--info {
242
+ background: color-mix(in oklch, var(--status-info), transparent 84%);
243
+ color: color-mix(in oklch, var(--status-info), var(--foreground) 28%);
244
+ }
245
+
246
+ .j-card {
247
+ border: 1px solid var(--border);
248
+ border-radius: var(--radius-lg);
249
+ background: var(--surface);
250
+ color: var(--foreground);
251
+ box-shadow: var(--shadow-sm);
252
+ }
253
+
254
+ .j-card-header,
255
+ .j-card-content,
256
+ .j-card-footer {
257
+ padding: var(--space-5);
258
+ }
259
+
260
+ .j-card-header + .j-card-content,
261
+ .j-card-content + .j-card-footer {
262
+ padding-top: 0;
263
+ }
264
+
265
+ .j-card-title {
266
+ margin: 0;
267
+ font-size: var(--font-size-lg);
268
+ line-height: var(--line-height-tight);
269
+ }
270
+
271
+ .j-card-description,
272
+ .j-metric-description {
273
+ margin: var(--space-2) 0 0;
274
+ color: var(--foreground-muted);
275
+ font-size: var(--font-size-sm);
276
+ }
277
+
278
+ .j-card-footer {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: var(--space-2);
282
+ }
283
+
284
+ .j-dialog-overlay {
285
+ position: fixed;
286
+ inset: 0;
287
+ z-index: calc(var(--z-dialog) - 1);
288
+ background: oklch(8% 0.02 255 / 0.66);
289
+ animation: j-fade-in var(--motion-normal) var(--ease-standard);
290
+ }
291
+
292
+ .j-dialog-content {
293
+ position: fixed;
294
+ top: 50%;
295
+ left: 50%;
296
+ z-index: var(--z-dialog);
297
+ width: min(92vw, 32rem);
298
+ max-height: 85vh;
299
+ overflow: auto;
300
+ transform: translate(-50%, -50%);
301
+ border: 1px solid var(--border);
302
+ border-radius: var(--radius-lg);
303
+ background: var(--surface-raised);
304
+ color: var(--foreground);
305
+ box-shadow: var(--shadow-lg);
306
+ padding: var(--space-6);
307
+ animation: j-dialog-in var(--motion-normal) var(--ease-standard);
308
+ }
309
+
310
+ .j-dialog-close {
311
+ position: absolute;
312
+ top: var(--space-3);
313
+ right: var(--space-3);
314
+ }
315
+
316
+ .j-dialog-header {
317
+ padding-right: var(--space-8);
318
+ }
319
+
320
+ .j-dialog-title {
321
+ margin: 0;
322
+ font-size: var(--font-size-xl);
323
+ line-height: var(--line-height-tight);
324
+ }
325
+
326
+ .j-dialog-description {
327
+ margin: var(--space-2) 0 0;
328
+ color: var(--foreground-muted);
329
+ }
330
+
331
+ .j-dialog-footer {
332
+ display: flex;
333
+ justify-content: flex-end;
334
+ gap: var(--space-2);
335
+ margin-top: var(--space-6);
336
+ }
337
+
338
+ .j-tooltip {
339
+ z-index: var(--z-dropdown);
340
+ max-width: 18rem;
341
+ border-radius: var(--radius-sm);
342
+ background: var(--foreground);
343
+ color: var(--background);
344
+ padding: var(--space-2) var(--space-3);
345
+ box-shadow: var(--shadow-md);
346
+ font-size: var(--font-size-xs);
347
+ }
348
+
349
+ .j-tabs-list {
350
+ display: inline-flex;
351
+ align-items: center;
352
+ gap: var(--space-1);
353
+ border-bottom: 1px solid var(--border);
354
+ }
355
+
356
+ .j-tabs-trigger {
357
+ min-height: var(--control-height);
358
+ border: 0;
359
+ border-bottom: 2px solid transparent;
360
+ background: transparent;
361
+ color: var(--foreground-muted);
362
+ padding-inline: var(--control-padding-x);
363
+ font: inherit;
364
+ font-size: var(--font-size-sm);
365
+ font-weight: var(--font-weight-medium);
366
+ cursor: pointer;
367
+ }
368
+
369
+ .j-tabs-trigger[data-state="active"] {
370
+ border-bottom-color: var(--action-primary);
371
+ color: var(--foreground);
372
+ }
373
+
374
+ .j-tabs-content {
375
+ padding-top: var(--space-4);
376
+ }
377
+
378
+ .j-spinner-wrap {
379
+ display: inline-flex;
380
+ }
381
+
382
+ .j-spinner {
383
+ width: 1rem;
384
+ height: 1rem;
385
+ animation: j-spin 0.8s linear infinite;
386
+ }
387
+
388
+ .j-skeleton {
389
+ min-height: 1rem;
390
+ border-radius: var(--radius-sm);
391
+ background: linear-gradient(90deg, var(--surface-hover), var(--border), var(--surface-hover));
392
+ background-size: 200% 100%;
393
+ animation: j-shimmer 1.5s ease-in-out infinite;
394
+ }
395
+
396
+ .j-status {
397
+ display: inline-flex;
398
+ align-items: center;
399
+ gap: var(--space-2);
400
+ color: var(--foreground-muted);
401
+ font-size: var(--font-size-sm);
402
+ font-weight: var(--font-weight-medium);
403
+ }
404
+
405
+ .j-status-icon {
406
+ width: 1rem;
407
+ height: 1rem;
408
+ }
409
+
410
+ .j-status-dot {
411
+ width: 0.625rem;
412
+ height: 0.625rem;
413
+ border-radius: var(--radius-full);
414
+ background: currentColor;
415
+ }
416
+
417
+ .j-status--online,
418
+ .j-status--healthy {
419
+ color: var(--status-success);
420
+ }
421
+
422
+ .j-status--degraded,
423
+ .j-status--warning {
424
+ color: var(--status-warning);
425
+ }
426
+
427
+ .j-status--offline {
428
+ color: var(--status-offline);
429
+ }
430
+
431
+ .j-status--error {
432
+ color: var(--status-danger);
433
+ }
434
+
435
+ .j-status--unknown {
436
+ color: var(--status-unknown);
437
+ }
438
+
439
+ .j-metric-card {
440
+ min-height: 10.5rem;
441
+ padding: var(--space-5);
442
+ }
443
+
444
+ .j-metric-card-header,
445
+ .j-metric-meta {
446
+ display: flex;
447
+ align-items: center;
448
+ justify-content: space-between;
449
+ gap: var(--space-3);
450
+ }
451
+
452
+ .j-metric-label {
453
+ color: var(--foreground-muted);
454
+ font-size: var(--font-size-sm);
455
+ font-weight: var(--font-weight-medium);
456
+ }
457
+
458
+ .j-metric-icon {
459
+ width: 1.25rem;
460
+ height: 1.25rem;
461
+ color: var(--foreground-subtle);
462
+ }
463
+
464
+ .j-metric-value {
465
+ margin-block: var(--space-3);
466
+ font-size: var(--font-size-2xl);
467
+ font-weight: var(--font-weight-bold);
468
+ line-height: var(--line-height-tight);
469
+ letter-spacing: -0.02em;
470
+ }
471
+
472
+ .j-metric-trend {
473
+ color: var(--foreground-muted);
474
+ font-family: var(--font-mono);
475
+ font-size: var(--font-size-sm);
476
+ }
477
+
478
+ .j-metric-skeleton-value {
479
+ width: 45%;
480
+ height: 2rem;
481
+ margin-block: var(--space-4);
482
+ }
483
+
484
+ .j-metric-skeleton-text {
485
+ width: 70%;
486
+ }
487
+
488
+ .j-brand-logo {
489
+ display: inline-flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ }
493
+
494
+ .j-brand-logo--placeholder {
495
+ width: 2rem;
496
+ height: 2rem;
497
+ border-radius: var(--radius-sm);
498
+ background: var(--action-primary);
499
+ color: var(--action-primary-foreground);
500
+ font-weight: var(--font-weight-bold);
501
+ }
502
+
503
+ .j-checkbox,
504
+ .j-radio,
505
+ .j-switch {
506
+ flex: 0 0 auto;
507
+ border: 1px solid var(--border-strong);
508
+ background: var(--surface);
509
+ color: var(--action-primary-foreground);
510
+ cursor: pointer;
511
+ }
512
+
513
+ .j-checkbox {
514
+ display: inline-flex;
515
+ width: 1.125rem;
516
+ height: 1.125rem;
517
+ align-items: center;
518
+ justify-content: center;
519
+ border-radius: var(--radius-xs);
520
+ }
521
+
522
+ .j-checkbox[data-state="checked"],
523
+ .j-checkbox[data-state="indeterminate"],
524
+ .j-radio[data-state="checked"],
525
+ .j-switch[data-state="checked"] {
526
+ border-color: var(--action-primary);
527
+ background: var(--action-primary);
528
+ }
529
+
530
+ .j-checkbox-indicator,
531
+ .j-checkbox-indicator svg {
532
+ width: 0.875rem;
533
+ height: 0.875rem;
534
+ }
535
+
536
+ .j-choice-field,
537
+ .j-switch-field {
538
+ display: flex;
539
+ align-items: flex-start;
540
+ gap: var(--space-3);
541
+ }
542
+
543
+ .j-choice-label {
544
+ color: var(--foreground);
545
+ font-size: var(--font-size-sm);
546
+ font-weight: var(--font-weight-medium);
547
+ cursor: pointer;
548
+ }
549
+
550
+ .j-choice-description {
551
+ margin-top: var(--space-1);
552
+ color: var(--foreground-muted);
553
+ font-size: var(--font-size-xs);
554
+ }
555
+
556
+ .j-radio-group {
557
+ display: grid;
558
+ gap: var(--space-3);
559
+ }
560
+
561
+ .j-radio {
562
+ position: relative;
563
+ width: 1.125rem;
564
+ height: 1.125rem;
565
+ border-radius: var(--radius-full);
566
+ }
567
+
568
+ .j-radio-indicator::after {
569
+ position: absolute;
570
+ inset: 4px;
571
+ border-radius: var(--radius-full);
572
+ background: var(--action-primary-foreground);
573
+ content: "";
574
+ }
575
+
576
+ .j-switch-field {
577
+ align-items: center;
578
+ justify-content: space-between;
579
+ }
580
+
581
+ .j-switch {
582
+ position: relative;
583
+ width: 2.5rem;
584
+ height: 1.375rem;
585
+ border-radius: var(--radius-full);
586
+ transition: background-color var(--motion-fast) var(--ease-standard);
587
+ }
588
+
589
+ .j-switch-thumb {
590
+ display: block;
591
+ width: 1rem;
592
+ height: 1rem;
593
+ transform: translateX(2px);
594
+ border-radius: var(--radius-full);
595
+ background: var(--primitive-white);
596
+ box-shadow: var(--shadow-sm);
597
+ transition: transform var(--motion-fast) var(--ease-standard);
598
+ }
599
+
600
+ .j-switch[data-state="checked"] .j-switch-thumb {
601
+ transform: translateX(18px);
602
+ }
603
+
604
+ .j-dropdown-content {
605
+ z-index: var(--z-dropdown);
606
+ min-width: 12rem;
607
+ border: 1px solid var(--border);
608
+ border-radius: var(--radius-md);
609
+ background: var(--surface-raised);
610
+ color: var(--foreground);
611
+ box-shadow: var(--shadow-md);
612
+ padding: var(--space-1);
613
+ }
614
+
615
+ .j-dropdown-item {
616
+ position: relative;
617
+ display: flex;
618
+ min-height: 2rem;
619
+ align-items: center;
620
+ gap: var(--space-2);
621
+ border-radius: var(--radius-sm);
622
+ padding: var(--space-2) var(--space-3);
623
+ outline: none;
624
+ font-size: var(--font-size-sm);
625
+ cursor: default;
626
+ user-select: none;
627
+ }
628
+
629
+ .j-dropdown-item[data-highlighted] {
630
+ background: var(--surface-hover);
631
+ }
632
+
633
+ .j-dropdown-item[data-disabled] {
634
+ opacity: 0.5;
635
+ }
636
+
637
+ .j-dropdown-check-item {
638
+ padding-left: var(--space-8);
639
+ }
640
+
641
+ .j-dropdown-indicator {
642
+ position: absolute;
643
+ left: var(--space-3);
644
+ display: inline-flex;
645
+ width: 1rem;
646
+ align-items: center;
647
+ justify-content: center;
648
+ }
649
+
650
+ .j-dropdown-indicator svg {
651
+ width: 0.875rem;
652
+ }
653
+
654
+ .j-dropdown-dot {
655
+ width: 0.5rem;
656
+ height: 0.5rem;
657
+ border-radius: var(--radius-full);
658
+ background: currentColor;
659
+ }
660
+
661
+ .j-dropdown-label {
662
+ padding: var(--space-2) var(--space-3);
663
+ font-size: var(--font-size-xs);
664
+ font-weight: var(--font-weight-semibold);
665
+ }
666
+
667
+ .j-dropdown-separator {
668
+ height: 1px;
669
+ margin: var(--space-1) 0;
670
+ background: var(--border);
671
+ }
672
+
673
+ .j-dropdown-chevron {
674
+ width: 1rem;
675
+ margin-left: auto;
676
+ }
677
+
678
+ .j-toast-viewport {
679
+ position: fixed;
680
+ right: 0;
681
+ bottom: 0;
682
+ z-index: var(--z-toast);
683
+ display: flex;
684
+ width: min(100%, 26rem);
685
+ max-height: 100vh;
686
+ flex-direction: column;
687
+ gap: var(--space-2);
688
+ margin: 0;
689
+ padding: var(--space-5);
690
+ list-style: none;
691
+ }
692
+
693
+ .j-toast {
694
+ position: relative;
695
+ display: grid;
696
+ grid-template-columns: 1fr auto;
697
+ gap: var(--space-1) var(--space-3);
698
+ border: 1px solid var(--border);
699
+ border-left: 4px solid var(--border-strong);
700
+ border-radius: var(--radius-md);
701
+ background: var(--surface-raised);
702
+ box-shadow: var(--shadow-lg);
703
+ padding: var(--space-4);
704
+ }
705
+
706
+ .j-toast--success {
707
+ border-left-color: var(--status-success);
708
+ }
709
+ .j-toast--warning {
710
+ border-left-color: var(--status-warning);
711
+ }
712
+ .j-toast--danger {
713
+ border-left-color: var(--status-danger);
714
+ }
715
+ .j-toast-title {
716
+ font-weight: var(--font-weight-semibold);
717
+ }
718
+ .j-toast-description {
719
+ color: var(--foreground-muted);
720
+ font-size: var(--font-size-sm);
721
+ }
722
+ .j-toast-close {
723
+ grid-column: 2;
724
+ grid-row: 1 / span 2;
725
+ align-self: start;
726
+ border: 0;
727
+ background: transparent;
728
+ color: var(--foreground-muted);
729
+ cursor: pointer;
730
+ }
731
+ .j-toast-close svg {
732
+ width: 1rem;
733
+ }
734
+
735
+ .j-data-table {
736
+ min-width: 0;
737
+ border: 1px solid var(--border);
738
+ border-radius: var(--radius-lg);
739
+ background: var(--surface);
740
+ overflow: hidden;
741
+ }
742
+
743
+ .j-data-table-toolbar,
744
+ .j-data-table-selection,
745
+ .j-data-table-footer {
746
+ display: flex;
747
+ align-items: center;
748
+ gap: var(--space-3);
749
+ padding: var(--space-3) var(--space-4);
750
+ }
751
+
752
+ .j-data-table-toolbar {
753
+ flex-wrap: wrap;
754
+ border-bottom: 1px solid var(--border);
755
+ }
756
+
757
+ .j-data-table-toolbar > .j-native-select {
758
+ width: auto;
759
+ min-width: 10rem;
760
+ }
761
+ .j-data-table-search {
762
+ position: relative;
763
+ min-width: min(100%, 18rem);
764
+ flex: 1;
765
+ }
766
+ .j-data-table-search > svg {
767
+ position: absolute;
768
+ top: 50%;
769
+ left: var(--space-3);
770
+ width: 1rem;
771
+ transform: translateY(-50%);
772
+ color: var(--foreground-subtle);
773
+ }
774
+ .j-data-table-search .j-input {
775
+ padding-left: var(--space-8);
776
+ }
777
+ .j-data-table-selection {
778
+ justify-content: space-between;
779
+ background: color-mix(in oklch, var(--action-primary), transparent 90%);
780
+ font-size: var(--font-size-sm);
781
+ }
782
+ .j-data-table-scroll {
783
+ overflow: auto;
784
+ }
785
+ .j-data-table-scroll--virtual {
786
+ overscroll-behavior: contain;
787
+ }
788
+ .j-data-table table {
789
+ width: 100%;
790
+ border-collapse: collapse;
791
+ table-layout: fixed;
792
+ }
793
+ .j-data-table th {
794
+ position: sticky;
795
+ top: 0;
796
+ z-index: 1;
797
+ height: var(--row-height);
798
+ border-bottom: 1px solid var(--border);
799
+ background: var(--surface-raised);
800
+ color: var(--foreground-muted);
801
+ padding: 0 var(--space-3);
802
+ text-align: left;
803
+ font-size: var(--font-size-xs);
804
+ font-weight: var(--font-weight-semibold);
805
+ }
806
+ .j-data-table td {
807
+ height: var(--row-height);
808
+ border-bottom: 1px solid var(--border);
809
+ padding: var(--space-2) var(--space-3);
810
+ font-size: var(--font-size-sm);
811
+ overflow: hidden;
812
+ text-overflow: ellipsis;
813
+ white-space: nowrap;
814
+ }
815
+ .j-data-table tbody tr:last-child td {
816
+ border-bottom: 0;
817
+ }
818
+ .j-data-table tbody tr[data-selected="true"] {
819
+ background: color-mix(in oklch, var(--action-primary), transparent 92%);
820
+ }
821
+ .j-data-table-sort {
822
+ display: inline-flex;
823
+ width: 100%;
824
+ align-items: center;
825
+ gap: var(--space-1);
826
+ border: 0;
827
+ background: transparent;
828
+ color: inherit;
829
+ padding: 0;
830
+ font: inherit;
831
+ font-weight: inherit;
832
+ cursor: pointer;
833
+ }
834
+ .j-data-table-sort svg {
835
+ width: 0.875rem;
836
+ }
837
+ .j-data-table-resizer {
838
+ position: absolute;
839
+ top: 20%;
840
+ right: -2px;
841
+ width: 5px;
842
+ height: 60%;
843
+ cursor: col-resize;
844
+ }
845
+ .j-data-table-empty {
846
+ height: 8rem !important;
847
+ color: var(--foreground-muted);
848
+ text-align: center;
849
+ white-space: normal !important;
850
+ }
851
+ .j-data-table-skeleton {
852
+ width: 100%;
853
+ }
854
+ .j-data-table-footer {
855
+ justify-content: space-between;
856
+ border-top: 1px solid var(--border);
857
+ color: var(--foreground-muted);
858
+ font-size: var(--font-size-sm);
859
+ }
860
+ .j-data-table-pagination {
861
+ display: flex;
862
+ gap: var(--space-2);
863
+ }
864
+
865
+ .j-device-card {
866
+ min-height: 12rem;
867
+ padding: var(--space-5);
868
+ }
869
+ .j-device-card-header {
870
+ display: grid;
871
+ grid-template-columns: auto 1fr auto;
872
+ align-items: center;
873
+ gap: var(--space-3);
874
+ }
875
+ .j-device-card-header h3,
876
+ .j-service-health h3,
877
+ .j-operational-state h3 {
878
+ margin: 0;
879
+ font-size: var(--font-size-md);
880
+ }
881
+ .j-device-card-header p,
882
+ .j-service-health p,
883
+ .j-operational-state p {
884
+ margin: var(--space-1) 0 0;
885
+ color: var(--foreground-muted);
886
+ font-size: var(--font-size-sm);
887
+ }
888
+ .j-device-card-icon,
889
+ .j-service-health-icon {
890
+ display: inline-flex;
891
+ width: 2.5rem;
892
+ height: 2.5rem;
893
+ align-items: center;
894
+ justify-content: center;
895
+ border-radius: var(--radius-md);
896
+ background: var(--action-secondary);
897
+ color: var(--foreground-muted);
898
+ }
899
+ .j-device-card-icon svg,
900
+ .j-service-health-icon svg {
901
+ width: 1.25rem;
902
+ }
903
+ .j-device-card-status {
904
+ display: flex;
905
+ align-items: center;
906
+ justify-content: space-between;
907
+ margin-top: var(--space-5);
908
+ }
909
+ .j-device-card-status > span:last-child {
910
+ color: var(--foreground-muted);
911
+ font-family: var(--font-mono);
912
+ font-size: var(--font-size-sm);
913
+ }
914
+ .j-device-card-address,
915
+ .j-service-health code {
916
+ display: block;
917
+ margin-top: var(--space-3);
918
+ color: var(--foreground-muted);
919
+ font-size: var(--font-size-xs);
920
+ }
921
+ .j-device-card-description {
922
+ margin: var(--space-3) 0 0;
923
+ color: var(--foreground-muted);
924
+ font-size: var(--font-size-sm);
925
+ }
926
+ .j-device-card-line {
927
+ width: 70%;
928
+ margin: var(--space-4) 0;
929
+ }
930
+ .j-device-card-line--short {
931
+ width: 45%;
932
+ }
933
+
934
+ .j-service-health {
935
+ display: grid;
936
+ grid-template-columns: auto 1fr auto;
937
+ align-items: start;
938
+ gap: var(--space-4);
939
+ border: 1px solid var(--border);
940
+ border-radius: var(--radius-md);
941
+ background: var(--surface);
942
+ padding: var(--space-4);
943
+ }
944
+ .j-service-health-title {
945
+ display: flex;
946
+ flex-wrap: wrap;
947
+ align-items: center;
948
+ justify-content: space-between;
949
+ gap: var(--space-3);
950
+ }
951
+ .j-service-health-meta {
952
+ display: grid;
953
+ justify-items: end;
954
+ gap: var(--space-2);
955
+ color: var(--foreground-muted);
956
+ font-family: var(--font-mono);
957
+ font-size: var(--font-size-sm);
958
+ }
959
+
960
+ .j-operational-state {
961
+ display: grid;
962
+ justify-items: center;
963
+ padding: var(--space-10);
964
+ border: 1px dashed var(--border-strong);
965
+ border-radius: var(--radius-lg);
966
+ background: var(--surface);
967
+ text-align: center;
968
+ }
969
+ .j-operational-state-icon {
970
+ width: 2rem;
971
+ height: 2rem;
972
+ margin-bottom: var(--space-3);
973
+ color: var(--foreground-subtle);
974
+ }
975
+ .j-operational-state--error .j-operational-state-icon {
976
+ color: var(--status-danger);
977
+ }
978
+ .j-operational-state-action {
979
+ margin-top: var(--space-5);
980
+ }
981
+ .j-operational-state--compact {
982
+ padding: var(--space-5);
983
+ }
984
+
985
+ .j-app-shell {
986
+ display: grid;
987
+ min-height: 100vh;
988
+ grid-template-columns: minmax(13rem, 16rem) 1fr;
989
+ grid-template-rows: auto 1fr;
990
+ grid-template-areas:
991
+ "header header"
992
+ "sidebar main";
993
+ background: var(--background);
994
+ }
995
+
996
+ .j-app-shell--collapsed {
997
+ grid-template-columns: 4.5rem 1fr;
998
+ }
999
+
1000
+ .j-header {
1001
+ grid-area: header;
1002
+ display: flex;
1003
+ min-height: 3.5rem;
1004
+ align-items: center;
1005
+ justify-content: space-between;
1006
+ border-bottom: 1px solid var(--border);
1007
+ background: var(--surface);
1008
+ padding-inline: var(--space-5);
1009
+ }
1010
+
1011
+ .j-sidebar {
1012
+ grid-area: sidebar;
1013
+ border-right: 1px solid var(--border);
1014
+ background: var(--surface);
1015
+ padding: var(--space-4);
1016
+ }
1017
+
1018
+ .j-app-shell--collapsed .j-sidebar {
1019
+ padding-inline: var(--space-2);
1020
+ }
1021
+
1022
+ .j-sidebar-overlay,
1023
+ .j-sidebar-mobile-header,
1024
+ .j-app-shell-menu {
1025
+ display: none;
1026
+ }
1027
+
1028
+ .j-app-shell-collapse {
1029
+ display: inline-flex;
1030
+ }
1031
+
1032
+ .j-app-navigation {
1033
+ display: flex;
1034
+ height: 100%;
1035
+ flex-direction: column;
1036
+ justify-content: space-between;
1037
+ }
1038
+
1039
+ .j-app-navigation-list {
1040
+ display: grid;
1041
+ gap: var(--space-1);
1042
+ }
1043
+ .j-app-navigation-sublist {
1044
+ margin-block: var(--space-1) var(--space-2);
1045
+ margin-left: calc(var(--space-3) + 0.5rem);
1046
+ border-left: 1px solid var(--border);
1047
+ padding-left: var(--space-2);
1048
+ }
1049
+ .j-app-navigation-link {
1050
+ display: grid;
1051
+ grid-template-columns: auto 1fr auto;
1052
+ align-items: center;
1053
+ gap: var(--space-3);
1054
+ min-height: var(--control-height);
1055
+ border-radius: var(--radius-md);
1056
+ color: var(--foreground-muted);
1057
+ padding: var(--space-2) var(--space-3);
1058
+ text-decoration: none;
1059
+ }
1060
+ .j-app-navigation-group-trigger {
1061
+ width: 100%;
1062
+ border: 0;
1063
+ font: inherit;
1064
+ text-align: left;
1065
+ cursor: pointer;
1066
+ }
1067
+ .j-app-navigation-link:hover,
1068
+ .j-app-navigation-link[aria-current="page"] {
1069
+ background: var(--surface-hover);
1070
+ color: var(--foreground);
1071
+ }
1072
+ .j-app-navigation-link > svg {
1073
+ width: 1.125rem;
1074
+ }
1075
+ .j-app-navigation-badge {
1076
+ font-size: var(--font-size-xs);
1077
+ }
1078
+ .j-app-navigation-chevron {
1079
+ width: 1rem !important;
1080
+ transition: transform var(--motion-fast) var(--ease-standard);
1081
+ }
1082
+ .j-app-navigation-group-trigger[aria-expanded="true"] .j-app-navigation-chevron {
1083
+ transform: rotate(180deg);
1084
+ }
1085
+ .j-app-navigation-footer {
1086
+ display: flex;
1087
+ align-items: center;
1088
+ justify-content: space-between;
1089
+ border-top: 1px solid var(--border);
1090
+ margin-top: var(--space-4);
1091
+ padding-top: var(--space-4);
1092
+ }
1093
+
1094
+ .j-app-shell--collapsed .j-app-navigation-link {
1095
+ grid-template-columns: 1fr;
1096
+ justify-items: center;
1097
+ padding-inline: var(--space-2);
1098
+ }
1099
+ .j-app-shell--collapsed .j-app-navigation-link > span,
1100
+ .j-app-shell--collapsed .j-app-navigation-chevron,
1101
+ .j-app-shell--collapsed .j-app-navigation-sublist {
1102
+ display: none;
1103
+ }
1104
+ .j-app-shell--collapsed .j-app-navigation-footer {
1105
+ display: flex;
1106
+ justify-content: center;
1107
+ }
1108
+ .j-app-shell--collapsed .j-app-navigation-footer > :not(.j-app-shell-collapse) {
1109
+ display: none;
1110
+ }
1111
+
1112
+ .j-main-content {
1113
+ grid-area: main;
1114
+ min-width: 0;
1115
+ padding: var(--space-6);
1116
+ }
1117
+
1118
+ .j-page-header {
1119
+ display: flex;
1120
+ align-items: flex-start;
1121
+ justify-content: space-between;
1122
+ gap: var(--space-4);
1123
+ margin-bottom: var(--space-6);
1124
+ }
1125
+
1126
+ .j-page-title {
1127
+ margin: 0;
1128
+ font-size: var(--font-size-2xl);
1129
+ line-height: var(--line-height-tight);
1130
+ }
1131
+
1132
+ .j-page-description {
1133
+ margin: var(--space-2) 0 0;
1134
+ color: var(--foreground-muted);
1135
+ }
1136
+
1137
+ .j-page-eyebrow {
1138
+ margin-bottom: var(--space-1);
1139
+ color: var(--foreground-subtle);
1140
+ font-size: var(--font-size-xs);
1141
+ font-weight: var(--font-weight-semibold);
1142
+ letter-spacing: 0.08em;
1143
+ text-transform: uppercase;
1144
+ }
1145
+
1146
+ .j-page-actions {
1147
+ display: flex;
1148
+ flex-wrap: wrap;
1149
+ gap: var(--space-2);
1150
+ }
1151
+
1152
+ @media (max-width: 720px) {
1153
+ .j-app-shell {
1154
+ grid-template-columns: 1fr;
1155
+ grid-template-areas:
1156
+ "header"
1157
+ "main";
1158
+ }
1159
+
1160
+ .j-app-shell--collapsed {
1161
+ grid-template-columns: 1fr;
1162
+ }
1163
+
1164
+ .j-sidebar {
1165
+ position: fixed;
1166
+ inset: 0 auto 0 0;
1167
+ z-index: var(--z-dialog);
1168
+ display: block;
1169
+ width: min(86vw, 19rem);
1170
+ transform: translateX(-105%);
1171
+ box-shadow: var(--shadow-lg);
1172
+ transition: transform var(--motion-normal) var(--ease-standard);
1173
+ }
1174
+
1175
+ .j-app-shell--collapsed .j-sidebar {
1176
+ padding: var(--space-4);
1177
+ }
1178
+
1179
+ .j-app-shell--nav-open .j-sidebar {
1180
+ transform: translateX(0);
1181
+ }
1182
+
1183
+ .j-sidebar-overlay {
1184
+ position: fixed;
1185
+ inset: 0;
1186
+ z-index: calc(var(--z-dialog) - 1);
1187
+ display: block;
1188
+ border: 0;
1189
+ background: oklch(8% 0.02 255 / 0.66);
1190
+ opacity: 0;
1191
+ pointer-events: none;
1192
+ transition: opacity var(--motion-normal) var(--ease-standard);
1193
+ }
1194
+
1195
+ .j-app-shell--nav-open .j-sidebar-overlay {
1196
+ opacity: 1;
1197
+ pointer-events: auto;
1198
+ }
1199
+
1200
+ .j-sidebar-mobile-header {
1201
+ display: flex;
1202
+ align-items: center;
1203
+ justify-content: space-between;
1204
+ margin-bottom: var(--space-4);
1205
+ font-weight: var(--font-weight-semibold);
1206
+ }
1207
+
1208
+ .j-app-shell-menu {
1209
+ display: inline-flex;
1210
+ }
1211
+
1212
+ .j-app-shell-collapse {
1213
+ display: none;
1214
+ }
1215
+
1216
+ .j-app-shell--collapsed .j-app-navigation-link {
1217
+ grid-template-columns: auto 1fr auto;
1218
+ justify-items: stretch;
1219
+ padding: var(--space-2) var(--space-3);
1220
+ }
1221
+ .j-app-shell--collapsed .j-app-navigation-link > span,
1222
+ .j-app-shell--collapsed .j-app-navigation-chevron,
1223
+ .j-app-shell--collapsed .j-app-navigation-sublist {
1224
+ display: initial;
1225
+ }
1226
+ .j-app-shell--collapsed .j-app-navigation-footer {
1227
+ display: block;
1228
+ }
1229
+ .j-app-shell--collapsed .j-app-navigation-footer > :not(.j-app-shell-collapse) {
1230
+ display: initial;
1231
+ }
1232
+
1233
+ .j-main-content {
1234
+ padding: var(--space-4);
1235
+ }
1236
+
1237
+ .j-page-header {
1238
+ flex-direction: column;
1239
+ }
1240
+
1241
+ .j-data-table-toolbar > * {
1242
+ width: 100%;
1243
+ }
1244
+
1245
+ .j-service-health {
1246
+ grid-template-columns: auto 1fr;
1247
+ }
1248
+
1249
+ .j-service-health-meta {
1250
+ grid-column: 2;
1251
+ justify-items: start;
1252
+ }
1253
+ }
1254
+
1255
+ @media (prefers-reduced-motion: reduce) {
1256
+ *,
1257
+ *::before,
1258
+ *::after {
1259
+ scroll-behavior: auto !important;
1260
+ animation-duration: 0.01ms !important;
1261
+ animation-iteration-count: 1 !important;
1262
+ transition-duration: 0.01ms !important;
1263
+ }
1264
+ }
1265
+
1266
+ @keyframes j-spin {
1267
+ to {
1268
+ transform: rotate(360deg);
1269
+ }
1270
+ }
1271
+
1272
+ @keyframes j-shimmer {
1273
+ to {
1274
+ background-position: -200% 0;
1275
+ }
1276
+ }
1277
+
1278
+ @keyframes j-fade-in {
1279
+ from {
1280
+ opacity: 0;
1281
+ }
1282
+ }
1283
+
1284
+ @keyframes j-dialog-in {
1285
+ from {
1286
+ opacity: 0;
1287
+ transform: translate(-50%, -48%) scale(0.98);
1288
+ }
1289
+ }