@loidolt/theme-styles 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,891 @@
1
+ /* Deep slice: assumes the token custom properties are already loaded.
2
+ Import '@loidolt/theme-styles/tokens' (or the whole '@loidolt/theme-styles') first. */
3
+ .ldt-button {
4
+ min-height: var(--loidolt-size-control);
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ gap: var(--loidolt-space-2);
9
+ border: var(--loidolt-border-width) solid var(--loidolt-border-strong);
10
+ border-radius: var(--loidolt-border-radius);
11
+ padding: 0.5rem 0.85rem;
12
+ color: var(--loidolt-text);
13
+ background: transparent;
14
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
15
+ letter-spacing: 0.08em;
16
+ line-height: 1;
17
+ text-decoration: none;
18
+ text-transform: uppercase;
19
+ white-space: nowrap;
20
+ }
21
+ .ldt-button:hover:not(:disabled, [aria-disabled='true']) {
22
+ color: var(--loidolt-text-inverse);
23
+ background: var(--loidolt-surface-inverse);
24
+ }
25
+ .ldt-button--primary {
26
+ color: var(--loidolt-on-accent);
27
+ border-color: var(--loidolt-accent);
28
+ background: var(--loidolt-accent);
29
+ }
30
+ .ldt-button--primary:hover:not(:disabled, [aria-disabled='true']) {
31
+ color: var(--loidolt-on-accent);
32
+ border-color: var(--loidolt-accent-hover);
33
+ background: var(--loidolt-accent-hover);
34
+ }
35
+ .ldt-button--quiet {
36
+ color: var(--loidolt-text-muted);
37
+ border-color: var(--loidolt-border);
38
+ }
39
+ .ldt-button--danger {
40
+ color: var(--loidolt-on-danger);
41
+ border-color: var(--loidolt-danger);
42
+ background: var(--loidolt-danger);
43
+ }
44
+ .ldt-button--ghost,
45
+ .ldt-button--text {
46
+ border-color: transparent;
47
+ background: transparent;
48
+ }
49
+ .ldt-button--text {
50
+ /* 1.5rem is the WCAG 2.2 minimum target size; `auto` left this at ~22px. */
51
+ min-height: 1.5rem;
52
+ padding: 0.25rem;
53
+ color: var(--loidolt-text-muted);
54
+ }
55
+ .ldt-button--text:hover:not(:disabled, [aria-disabled='true']) {
56
+ color: var(--loidolt-text-accent);
57
+ background: transparent;
58
+ }
59
+ .ldt-button--sm {
60
+ min-height: var(--loidolt-size-control-sm);
61
+ padding: 0.38rem 0.65rem;
62
+ font-size: var(--loidolt-font-size-xs);
63
+ }
64
+ .ldt-button--lg {
65
+ min-height: var(--loidolt-size-control-lg);
66
+ padding-inline: 1.2rem;
67
+ }
68
+ .ldt-button:disabled,
69
+ .ldt-button[aria-disabled='true'] {
70
+ opacity: 0.4;
71
+ cursor: not-allowed;
72
+ }
73
+ .ldt-icon-button {
74
+ width: var(--loidolt-size-control);
75
+ min-width: var(--loidolt-size-control);
76
+ padding: 0;
77
+ }
78
+ .ldt-icon-button.ldt-button--sm {
79
+ width: var(--loidolt-size-control-sm);
80
+ min-width: var(--loidolt-size-control-sm);
81
+ padding: 0;
82
+ }
83
+ .ldt-icon-button.ldt-button--lg {
84
+ width: var(--loidolt-size-control-lg);
85
+ min-width: var(--loidolt-size-control-lg);
86
+ padding: 0;
87
+ }
88
+ .ldt-spinner {
89
+ width: 1em;
90
+ height: 1em;
91
+ border: 2px solid currentColor;
92
+ border-right-color: transparent;
93
+ border-radius: 50%;
94
+ animation: ldt-spin 0.7s linear infinite;
95
+ }
96
+ @keyframes ldt-spin {
97
+ to {
98
+ transform: rotate(360deg);
99
+ }
100
+ }
101
+
102
+ .ldt-field {
103
+ display: grid;
104
+ gap: 0.35rem;
105
+ min-width: 0;
106
+ }
107
+ .ldt-label,
108
+ .ldt-field__label,
109
+ .ldt-legend {
110
+ display: flex;
111
+ justify-content: space-between;
112
+ color: var(--loidolt-text-muted);
113
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
114
+ letter-spacing: var(--loidolt-font-tracking-utility);
115
+ text-transform: uppercase;
116
+ }
117
+ .ldt-field__description {
118
+ margin: 0;
119
+ color: var(--loidolt-text-muted);
120
+ font: var(--loidolt-font-size-xs) / 1.5 var(--loidolt-font-utility);
121
+ }
122
+ .ldt-field__error {
123
+ margin: 0;
124
+ /* Status *as text on a surface* — not the fill role, which is tuned for `on-danger` ink. */
125
+ color: var(--loidolt-text-danger);
126
+ font: var(--loidolt-font-size-xs) / 1.5 var(--loidolt-font-utility);
127
+ }
128
+ .ldt-input,
129
+ .ldt-select,
130
+ .ldt-textarea,
131
+ .ldt-number-field__input {
132
+ width: 100%;
133
+ min-height: var(--loidolt-size-control);
134
+ border: 0;
135
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-control);
136
+ border-radius: 0;
137
+ padding: 0.45rem 0.15rem;
138
+ color: var(--loidolt-text);
139
+ background: transparent;
140
+ }
141
+ .ldt-input--boxed,
142
+ .ldt-select--boxed,
143
+ .ldt-textarea--boxed,
144
+ .ldt-number-field--boxed {
145
+ border: var(--loidolt-border-width) solid var(--loidolt-border-control);
146
+ padding-inline: 0.65rem;
147
+ background: var(--loidolt-surface-input);
148
+ }
149
+ /* The focus ring itself comes from the `loidolt.a11y` layer; this only tints the border. */
150
+ .ldt-input:focus-visible,
151
+ .ldt-select:focus-visible,
152
+ .ldt-textarea:focus-visible,
153
+ .ldt-number-field__input:focus-visible {
154
+ border-color: var(--loidolt-accent);
155
+ }
156
+ .ldt-input[aria-invalid='true'],
157
+ .ldt-select[aria-invalid='true'],
158
+ .ldt-textarea[aria-invalid='true'] {
159
+ border-color: var(--loidolt-danger);
160
+ }
161
+ .ldt-textarea {
162
+ min-height: 6rem;
163
+ resize: vertical;
164
+ }
165
+ .ldt-choice {
166
+ /* The label is the pointer target for the input it wraps, so it carries the 24px minimum. */
167
+ min-height: 1.5rem;
168
+ display: inline-flex;
169
+ align-items: center;
170
+ gap: 0.55rem;
171
+ color: var(--loidolt-text-muted);
172
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
173
+ letter-spacing: 0.06em;
174
+ }
175
+ .ldt-choice input {
176
+ width: 1rem;
177
+ height: 1rem;
178
+ accent-color: var(--loidolt-accent);
179
+ }
180
+ .ldt-fieldset {
181
+ min-width: 0;
182
+ margin: 0;
183
+ padding: 0;
184
+ border: 0;
185
+ }
186
+ .ldt-radio-group {
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: 0.75rem 1rem;
190
+ }
191
+ .ldt-radio-group--vertical {
192
+ flex-direction: column;
193
+ }
194
+ .ldt-switch {
195
+ min-height: 1.5rem;
196
+ display: inline-flex;
197
+ align-items: center;
198
+ gap: 0.65rem;
199
+ border: 0;
200
+ padding: 0;
201
+ background: transparent;
202
+ }
203
+ .ldt-switch__track {
204
+ width: 2.4rem;
205
+ height: 1.25rem;
206
+ padding: 2px;
207
+ border: var(--loidolt-border-width) solid var(--loidolt-border-control);
208
+ background: var(--loidolt-surface-alt);
209
+ }
210
+ .ldt-switch__thumb {
211
+ display: block;
212
+ width: 0.9rem;
213
+ height: 0.9rem;
214
+ background: var(--loidolt-text-muted);
215
+ transition: transform var(--loidolt-motion-fast) var(--loidolt-motion-easing);
216
+ }
217
+ .ldt-switch[aria-checked='true'] .ldt-switch__track {
218
+ border-color: var(--loidolt-accent);
219
+ background: var(--loidolt-accent);
220
+ }
221
+ .ldt-switch[aria-checked='true'] .ldt-switch__thumb {
222
+ background: var(--loidolt-on-accent);
223
+ transform: translateX(1.1rem);
224
+ }
225
+ .ldt-number-field {
226
+ display: grid;
227
+ grid-template-columns: 2rem minmax(0, 1fr) 2rem;
228
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-control);
229
+ }
230
+ .ldt-number-field .ldt-number-field__input {
231
+ border: 0;
232
+ text-align: center;
233
+ }
234
+ .ldt-number-field__button {
235
+ border: 0;
236
+ background: transparent;
237
+ }
238
+ .ldt-number-field__button:hover:not(:disabled, [aria-disabled='true']) {
239
+ color: var(--loidolt-text-accent);
240
+ background: var(--loidolt-surface-input);
241
+ }
242
+ .ldt-number-field__button[aria-disabled='true'] {
243
+ opacity: 0.4;
244
+ cursor: not-allowed;
245
+ }
246
+
247
+ .ldt-card,
248
+ .ldt-panel {
249
+ border: var(--loidolt-border-width) solid var(--loidolt-border);
250
+ color: var(--loidolt-text);
251
+ background: var(--loidolt-surface);
252
+ }
253
+ .ldt-card__header,
254
+ .ldt-card__content,
255
+ .ldt-card__footer,
256
+ .ldt-panel__header,
257
+ .ldt-panel__content,
258
+ .ldt-panel__footer {
259
+ padding: var(--loidolt-space-4);
260
+ }
261
+ .ldt-card__header,
262
+ .ldt-panel__header {
263
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-soft);
264
+ }
265
+ .ldt-card__footer,
266
+ .ldt-panel__footer {
267
+ border-top: var(--loidolt-border-width) solid var(--loidolt-border-soft);
268
+ }
269
+ .ldt-card__title,
270
+ .ldt-panel__title {
271
+ margin: 0;
272
+ font-size: var(--loidolt-font-size-lg);
273
+ }
274
+ .ldt-card__description {
275
+ margin: 0.35rem 0 0;
276
+ color: var(--loidolt-text-muted);
277
+ font-family: var(--loidolt-font-utility);
278
+ font-size: var(--loidolt-font-size-sm);
279
+ }
280
+ .ldt-badge {
281
+ display: inline-flex;
282
+ align-items: center;
283
+ min-height: 1.4rem;
284
+ padding: 0.15rem 0.45rem;
285
+ border: var(--loidolt-border-width) solid var(--loidolt-border);
286
+ color: var(--loidolt-text-muted);
287
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
288
+ letter-spacing: 0.08em;
289
+ text-transform: uppercase;
290
+ }
291
+ .ldt-badge--accent {
292
+ color: var(--loidolt-on-accent);
293
+ border-color: var(--loidolt-accent);
294
+ background: var(--loidolt-accent);
295
+ }
296
+ .ldt-badge--success {
297
+ color: var(--loidolt-on-success);
298
+ border-color: var(--loidolt-success);
299
+ background: var(--loidolt-success);
300
+ }
301
+ .ldt-badge--warning {
302
+ color: var(--loidolt-on-warning);
303
+ border-color: var(--loidolt-warning);
304
+ background: var(--loidolt-warning);
305
+ }
306
+ .ldt-badge--error {
307
+ color: var(--loidolt-on-danger);
308
+ border-color: var(--loidolt-danger);
309
+ background: var(--loidolt-danger);
310
+ }
311
+ .ldt-badge--info {
312
+ color: var(--loidolt-on-info);
313
+ border-color: var(--loidolt-info);
314
+ background: var(--loidolt-info);
315
+ }
316
+ .ldt-separator {
317
+ width: 100%;
318
+ height: var(--loidolt-border-width);
319
+ border: 0;
320
+ background: var(--loidolt-border);
321
+ }
322
+ .ldt-separator--vertical {
323
+ width: var(--loidolt-border-width);
324
+ height: auto;
325
+ min-height: 1em;
326
+ align-self: stretch;
327
+ }
328
+ .ldt-table-wrap {
329
+ width: 100%;
330
+ overflow-x: auto;
331
+ border: var(--loidolt-border-width) solid var(--loidolt-border);
332
+ }
333
+ .ldt-table {
334
+ width: 100%;
335
+ border-collapse: collapse;
336
+ color: var(--loidolt-text);
337
+ background: var(--loidolt-surface);
338
+ }
339
+ .ldt-table :where(th, td) {
340
+ padding: 0.7rem 0.8rem;
341
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-soft);
342
+ text-align: left;
343
+ }
344
+ .ldt-table th {
345
+ color: var(--loidolt-text-muted);
346
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
347
+ letter-spacing: var(--loidolt-font-tracking-utility);
348
+ text-transform: uppercase;
349
+ }
350
+ .ldt-table tbody tr:last-child td {
351
+ border-bottom: 0;
352
+ }
353
+
354
+ .ldt-alert {
355
+ padding: 0.8rem 1rem;
356
+ border: var(--loidolt-border-width) solid var(--loidolt-border);
357
+ border-left: 3px solid var(--loidolt-info);
358
+ color: var(--loidolt-text);
359
+ background: var(--loidolt-surface);
360
+ }
361
+ .ldt-alert--info {
362
+ border-left-color: var(--loidolt-info);
363
+ }
364
+ .ldt-alert--success {
365
+ border-left-color: var(--loidolt-success);
366
+ }
367
+ .ldt-alert--warning {
368
+ border-left-color: var(--loidolt-warning);
369
+ }
370
+ .ldt-alert--error {
371
+ border-left-color: var(--loidolt-danger);
372
+ }
373
+ .ldt-alert__title {
374
+ margin: 0 0 0.2rem;
375
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
376
+ letter-spacing: 0.06em;
377
+ text-transform: uppercase;
378
+ }
379
+ .ldt-alert__description {
380
+ margin: 0;
381
+ color: var(--loidolt-text-muted);
382
+ }
383
+ .ldt-progress {
384
+ width: 100%;
385
+ height: 0.35rem;
386
+ overflow: hidden;
387
+ background: var(--loidolt-border-soft);
388
+ }
389
+ .ldt-progress__bar {
390
+ width: 100%;
391
+ height: 100%;
392
+ background: var(--loidolt-accent);
393
+ /*
394
+ * Scale rather than animate `width`: a width transition relayouts on every frame, while a
395
+ * transform is composited. `--ldt-progress-value` is the 0..1 fraction, set by the component.
396
+ */
397
+ transform: scaleX(var(--ldt-progress-value, 0));
398
+ transform-origin: left center;
399
+ transition: transform var(--loidolt-motion-normal) var(--loidolt-motion-easing);
400
+ }
401
+ .ldt-progress--indeterminate .ldt-progress__bar {
402
+ width: 40%;
403
+ transform: none;
404
+ animation: ldt-progress-slide 1.2s var(--loidolt-motion-easing) infinite;
405
+ }
406
+ @keyframes ldt-progress-slide {
407
+ from {
408
+ transform: translateX(-100%);
409
+ }
410
+ to {
411
+ transform: translateX(250%);
412
+ }
413
+ }
414
+ .ldt-skeleton {
415
+ min-height: 1rem;
416
+ background: linear-gradient(
417
+ 90deg,
418
+ var(--loidolt-border-soft),
419
+ var(--loidolt-surface),
420
+ var(--loidolt-border-soft)
421
+ );
422
+ background-size: 200% 100%;
423
+ animation: ldt-shimmer 1.5s linear infinite;
424
+ }
425
+ @keyframes ldt-shimmer {
426
+ to {
427
+ background-position: -200% 0;
428
+ }
429
+ }
430
+ .ldt-toast-viewport {
431
+ position: fixed;
432
+ z-index: var(--loidolt-z-toast);
433
+ right: 1rem;
434
+ bottom: 1rem;
435
+ display: grid;
436
+ width: min(24rem, calc(100vw - 2rem));
437
+ gap: 0.5rem;
438
+ }
439
+ .ldt-toast {
440
+ display: grid;
441
+ grid-template-columns: minmax(0, 1fr) auto;
442
+ gap: 0.4rem 1rem;
443
+ padding: 0.8rem 1rem;
444
+ border: var(--loidolt-border-width) solid var(--loidolt-border-strong);
445
+ border-left: 3px solid var(--loidolt-border-strong);
446
+ color: var(--loidolt-text);
447
+ background: var(--loidolt-surface);
448
+ box-shadow: var(--loidolt-shadow-popover);
449
+ }
450
+ .ldt-toast--info {
451
+ border-left-color: var(--loidolt-info);
452
+ }
453
+ .ldt-toast--success {
454
+ border-left-color: var(--loidolt-success);
455
+ }
456
+ .ldt-toast--warning {
457
+ border-left-color: var(--loidolt-warning);
458
+ }
459
+ .ldt-toast--error {
460
+ border-left-color: var(--loidolt-danger);
461
+ }
462
+ .ldt-toast__title {
463
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
464
+ letter-spacing: 0.06em;
465
+ text-transform: uppercase;
466
+ }
467
+ .ldt-toast__description {
468
+ grid-column: 1;
469
+ margin: 0;
470
+ color: var(--loidolt-text-muted);
471
+ }
472
+ .ldt-toast__dismiss {
473
+ grid-area: 1 / 2 / span 2 / auto;
474
+ align-self: start;
475
+ }
476
+
477
+ .ldt-overlay {
478
+ position: fixed;
479
+ z-index: var(--loidolt-z-overlay);
480
+ inset: 0;
481
+ background: var(--loidolt-scrim);
482
+ }
483
+ .ldt-dialog {
484
+ position: fixed;
485
+ z-index: var(--loidolt-z-dialog);
486
+ top: 50%;
487
+ left: 50%;
488
+ display: grid;
489
+ width: min(var(--ldt-dialog-width, 34rem), calc(100vw - 2rem));
490
+ max-height: min(48rem, calc(100dvh - 2rem));
491
+ overflow: hidden;
492
+ border: var(--loidolt-border-width) solid var(--loidolt-border-strong);
493
+ color: var(--loidolt-text);
494
+ background: var(--loidolt-surface);
495
+ box-shadow: var(--loidolt-shadow-modal);
496
+ transform: translate(-50%, -50%);
497
+ }
498
+ .ldt-dialog--sm {
499
+ --ldt-dialog-width: 24rem;
500
+ }
501
+ .ldt-dialog--md {
502
+ --ldt-dialog-width: 34rem;
503
+ }
504
+ .ldt-dialog--lg {
505
+ --ldt-dialog-width: 46rem;
506
+ }
507
+ .ldt-dialog--xl {
508
+ --ldt-dialog-width: 60rem;
509
+ }
510
+ .ldt-dialog__header,
511
+ .ldt-dialog__body,
512
+ .ldt-dialog__footer {
513
+ padding: 1rem 1.25rem;
514
+ }
515
+ .ldt-dialog__header {
516
+ display: flex;
517
+ align-items: start;
518
+ justify-content: space-between;
519
+ gap: 1rem;
520
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border);
521
+ }
522
+ .ldt-dialog__body {
523
+ overflow-y: auto;
524
+ }
525
+ .ldt-dialog__footer {
526
+ display: flex;
527
+ justify-content: flex-end;
528
+ gap: 0.5rem;
529
+ border-top: var(--loidolt-border-width) solid var(--loidolt-border);
530
+ }
531
+ .ldt-dialog__title {
532
+ margin: 0;
533
+ font-size: var(--loidolt-font-size-lg);
534
+ }
535
+ .ldt-dialog__description {
536
+ margin: 0.25rem 0 0;
537
+ color: var(--loidolt-text-muted);
538
+ }
539
+ .ldt-popover,
540
+ .ldt-menu {
541
+ z-index: var(--loidolt-z-menu);
542
+ min-width: 13rem;
543
+ max-width: min(22rem, calc(100vw - 2rem));
544
+ padding: 0.45rem;
545
+ border: var(--loidolt-border-width) solid var(--loidolt-border-strong);
546
+ color: var(--loidolt-text);
547
+ background: var(--loidolt-surface);
548
+ box-shadow: var(--loidolt-shadow-popover);
549
+ }
550
+ .ldt-menu {
551
+ display: grid;
552
+ gap: 0.1rem;
553
+ }
554
+ .ldt-menu__label {
555
+ padding: 0.45rem 0.55rem 0.3rem;
556
+ color: var(--loidolt-text-accent);
557
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
558
+ letter-spacing: 0.09em;
559
+ text-transform: uppercase;
560
+ }
561
+ .ldt-menu__item {
562
+ width: 100%;
563
+ display: flex;
564
+ align-items: center;
565
+ justify-content: space-between;
566
+ gap: 1rem;
567
+ border: 0;
568
+ padding: 0.65rem 0.55rem;
569
+ color: var(--loidolt-text);
570
+ background: transparent;
571
+ text-align: left;
572
+ text-decoration: none;
573
+ }
574
+ .ldt-menu__item:hover,
575
+ .ldt-menu__item[data-highlighted] {
576
+ color: var(--loidolt-text-inverse);
577
+ background: var(--loidolt-surface-inverse);
578
+ }
579
+ .ldt-menu__item[data-disabled],
580
+ .ldt-menu__item:disabled {
581
+ opacity: 0.4;
582
+ cursor: not-allowed;
583
+ }
584
+ .ldt-menu__separator {
585
+ height: var(--loidolt-border-width);
586
+ margin: 0.25rem 0;
587
+ border: 0;
588
+ background: var(--loidolt-border-soft);
589
+ }
590
+ .ldt-tooltip {
591
+ z-index: var(--loidolt-z-tooltip);
592
+ max-width: 18rem;
593
+ padding: 0.4rem 0.55rem;
594
+ color: var(--loidolt-text-inverse);
595
+ background: var(--loidolt-surface-inverse);
596
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
597
+ box-shadow: var(--loidolt-shadow-popover);
598
+ }
599
+ /*
600
+ * Bits UI stamps `data-orientation` on the root, list, triggers and panels, so the vertical
601
+ * layout keys off that rather than needing a second class.
602
+ */
603
+ .ldt-tabs[data-orientation='vertical'] {
604
+ display: grid;
605
+ grid-template-columns: auto minmax(0, 1fr);
606
+ gap: var(--loidolt-space-4);
607
+ }
608
+ .ldt-tabs__list {
609
+ display: flex;
610
+ gap: 2px;
611
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border);
612
+ }
613
+ .ldt-tabs__list[data-orientation='vertical'] {
614
+ flex-direction: column;
615
+ align-items: stretch;
616
+ border-bottom: 0;
617
+ border-right: var(--loidolt-border-width) solid var(--loidolt-border);
618
+ }
619
+ .ldt-tabs__trigger {
620
+ min-height: var(--loidolt-size-control);
621
+ border: 0;
622
+ border-bottom: 2px solid transparent;
623
+ padding: 0 0.85rem;
624
+ color: var(--loidolt-text-muted);
625
+ background: transparent;
626
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
627
+ letter-spacing: 0.08em;
628
+ text-transform: uppercase;
629
+ }
630
+ .ldt-tabs__trigger[data-orientation='vertical'] {
631
+ border-bottom: 0;
632
+ border-right: 2px solid transparent;
633
+ padding: 0 0.85rem;
634
+ text-align: left;
635
+ }
636
+ .ldt-tabs__trigger[data-state='active'],
637
+ .ldt-tabs__trigger[aria-selected='true'] {
638
+ color: var(--loidolt-text);
639
+ border-color: var(--loidolt-accent);
640
+ }
641
+ .ldt-tabs__content[data-orientation='vertical'] {
642
+ padding-block: 0;
643
+ }
644
+ .ldt-tabs__content {
645
+ padding-block: 1rem;
646
+ }
647
+
648
+ .ldt-app-shell {
649
+ min-height: 100dvh;
650
+ display: grid;
651
+ grid-template-rows: auto minmax(0, 1fr) auto;
652
+ /*
653
+ * Without an explicit column the implicit one is content-sized, so anything too wide for the
654
+ * viewport — a topbar with many links, a wide table — stretched the entire shell and put the
655
+ * page into horizontal scroll. `minmax(0, 1fr)` caps it at the container width.
656
+ */
657
+ grid-template-columns: minmax(0, 1fr);
658
+ color: var(--loidolt-text);
659
+ background: var(--loidolt-background);
660
+ }
661
+ .ldt-app-shell > :where(header, main, footer) {
662
+ min-width: 0;
663
+ }
664
+ .ldt-topbar {
665
+ min-width: 0;
666
+ min-height: var(--loidolt-size-topbar);
667
+ display: flex;
668
+ /* Reflow at whatever width runs out of room, rather than only at the compact breakpoint. */
669
+ flex-wrap: wrap;
670
+ align-items: center;
671
+ gap: 1.25rem;
672
+ padding: 0 1.35rem;
673
+ color: var(--loidolt-text);
674
+ background: var(--loidolt-surface);
675
+ }
676
+ .ldt-brand {
677
+ display: inline-flex;
678
+ flex: 0 0 auto;
679
+ align-items: baseline;
680
+ gap: 0.55rem;
681
+ color: var(--loidolt-text);
682
+ text-decoration: none;
683
+ }
684
+ .ldt-brand:hover {
685
+ text-decoration: none;
686
+ }
687
+ .ldt-brand__name {
688
+ font-size: var(--loidolt-font-size-lg);
689
+ font-weight: 500;
690
+ letter-spacing: -0.02em;
691
+ }
692
+ .ldt-brand__meta {
693
+ color: var(--loidolt-text-accent);
694
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
695
+ letter-spacing: 0.12em;
696
+ text-transform: uppercase;
697
+ }
698
+ .ldt-topbar__nav {
699
+ /*
700
+ * Flex items refuse to shrink below their content width without `min-width: 0`, so a nav
701
+ * with more links than room pushed the whole page into horizontal scroll. Let it shrink,
702
+ * and scroll on its own when even the wrapped layout cannot fit the links.
703
+ */
704
+ min-width: 0;
705
+ display: flex;
706
+ align-self: stretch;
707
+ overflow-x: auto;
708
+ scrollbar-width: thin;
709
+ }
710
+ .ldt-topbar__actions {
711
+ min-width: 0;
712
+ margin-left: auto;
713
+ display: flex;
714
+ align-items: center;
715
+ gap: 0.4rem;
716
+ }
717
+ .ldt-nav-menu {
718
+ min-height: var(--loidolt-size-control);
719
+ display: inline-flex;
720
+ align-items: center;
721
+ gap: 0.35rem;
722
+ border: 0;
723
+ border-bottom: 2px solid transparent;
724
+ padding: 0 0.75rem;
725
+ color: var(--loidolt-text-muted);
726
+ background: transparent;
727
+ font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
728
+ letter-spacing: 0.08em;
729
+ text-transform: uppercase;
730
+ }
731
+ .ldt-nav-menu:hover:not(:disabled, [aria-disabled='true']) {
732
+ color: var(--loidolt-text);
733
+ }
734
+ .ldt-nav-menu[data-state='open'] {
735
+ color: var(--loidolt-text);
736
+ }
737
+ .ldt-nav-menu--active,
738
+ .ldt-nav-menu[aria-current='page'] {
739
+ color: var(--loidolt-text);
740
+ border-bottom-color: var(--loidolt-accent);
741
+ }
742
+ .ldt-contextbar {
743
+ min-width: 0;
744
+ min-height: var(--loidolt-size-contextbar);
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: space-between;
748
+ gap: 1rem;
749
+ padding: 0.4rem 1.35rem;
750
+ border-block: var(--loidolt-border-width) solid var(--loidolt-border);
751
+ color: var(--loidolt-text);
752
+ background: var(--loidolt-surface-alt);
753
+ }
754
+ .ldt-contextbar__location {
755
+ min-width: 0;
756
+ display: flex;
757
+ align-items: baseline;
758
+ gap: 0.65rem;
759
+ }
760
+ .ldt-contextbar__section {
761
+ flex: 0 0 auto;
762
+ color: var(--loidolt-text-accent);
763
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
764
+ letter-spacing: 0.1em;
765
+ text-transform: uppercase;
766
+ }
767
+ .ldt-contextbar__actions {
768
+ flex: 0 0 auto;
769
+ display: flex;
770
+ align-items: center;
771
+ gap: var(--ldt-gap, var(--loidolt-space-2));
772
+ }
773
+ .ldt-contextbar__title,
774
+ .ldt-contextbar__detail {
775
+ overflow: hidden;
776
+ text-overflow: ellipsis;
777
+ white-space: nowrap;
778
+ }
779
+ .ldt-contextbar__detail {
780
+ color: var(--loidolt-text-muted);
781
+ font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
782
+ }
783
+ .ldt-workspace {
784
+ min-width: 0;
785
+ min-height: 0;
786
+ display: grid;
787
+ grid-template-columns: minmax(0, 1fr);
788
+ }
789
+ .ldt-workspace--sidebar {
790
+ grid-template-columns: var(--ldt-sidebar-width, var(--loidolt-size-sidebar)) minmax(0, 1fr);
791
+ }
792
+ .ldt-workspace--inspector {
793
+ grid-template-columns: minmax(0, 1fr) var(--ldt-inspector-width, var(--loidolt-size-inspector));
794
+ }
795
+ .ldt-workspace--sidebar.ldt-workspace--inspector {
796
+ grid-template-columns: var(--ldt-sidebar-width, var(--loidolt-size-sidebar)) minmax(0, 1fr) var(
797
+ --ldt-inspector-width,
798
+ var(--loidolt-size-inspector)
799
+ );
800
+ }
801
+ .ldt-sidebar {
802
+ min-width: 0;
803
+ overflow-y: auto;
804
+ padding: 1.25rem;
805
+ border-right: var(--loidolt-border-width) solid var(--loidolt-border);
806
+ color: var(--loidolt-text);
807
+ background: var(--loidolt-surface);
808
+ }
809
+ .ldt-sidebar--right {
810
+ border-right: 0;
811
+ border-left: var(--loidolt-border-width) solid var(--loidolt-border);
812
+ }
813
+ .ldt-workspace__main {
814
+ min-width: 0;
815
+ padding: var(--loidolt-space-6);
816
+ }
817
+ .ldt-page-header {
818
+ display: flex;
819
+ align-items: end;
820
+ justify-content: space-between;
821
+ gap: 1rem;
822
+ margin-bottom: var(--loidolt-space-6);
823
+ padding-bottom: var(--loidolt-space-4);
824
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border);
825
+ }
826
+ .ldt-page-header__title {
827
+ margin: 0;
828
+ font-size: var(--loidolt-font-size-xl);
829
+ }
830
+ .ldt-page-header__description {
831
+ max-width: 48rem;
832
+ margin: 0.4rem 0 0;
833
+ color: var(--loidolt-text-muted);
834
+ }
835
+ .ldt-section {
836
+ padding-block: var(--loidolt-space-6);
837
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-soft);
838
+ }
839
+ .ldt-section__heading {
840
+ display: flex;
841
+ align-items: baseline;
842
+ justify-content: space-between;
843
+ gap: 1rem;
844
+ margin-bottom: var(--loidolt-space-4);
845
+ }
846
+ .ldt-section__title {
847
+ margin: 0;
848
+ font-size: var(--loidolt-font-size-lg);
849
+ }
850
+
851
+ /* Single breakpoint, mirroring `tokens.breakpoints.compact`. */
852
+ @media (max-width: 760px) {
853
+ .ldt-topbar {
854
+ min-height: auto;
855
+ padding-block: 0.75rem;
856
+ gap: 0.75rem;
857
+ }
858
+ .ldt-topbar__actions {
859
+ width: 100%;
860
+ margin-left: 0;
861
+ overflow-x: auto;
862
+ }
863
+ .ldt-contextbar {
864
+ align-items: start;
865
+ }
866
+ .ldt-contextbar__location {
867
+ display: grid;
868
+ gap: 0.15rem;
869
+ }
870
+ .ldt-contextbar__detail {
871
+ display: none;
872
+ }
873
+ .ldt-workspace,
874
+ .ldt-workspace--sidebar,
875
+ .ldt-workspace--inspector,
876
+ .ldt-workspace--sidebar.ldt-workspace--inspector {
877
+ display: block;
878
+ }
879
+ .ldt-sidebar,
880
+ .ldt-sidebar--right {
881
+ border: 0;
882
+ border-bottom: var(--loidolt-border-width) solid var(--loidolt-border);
883
+ }
884
+ .ldt-workspace__main {
885
+ padding: var(--loidolt-space-4);
886
+ }
887
+ .ldt-page-header {
888
+ align-items: start;
889
+ flex-direction: column;
890
+ }
891
+ }