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