@mirror-physics/fractal-ui 0.2.0-next.4 → 0.2.0-next.41

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.
package/dist/index.css CHANGED
@@ -32,6 +32,60 @@
32
32
  }
33
33
  }
34
34
 
35
+ /* src/components/Breadcrumbs/Breadcrumbs.css */
36
+ .fractal-breadcrumbs {
37
+ min-width: 0;
38
+ color: var(--fg-primary);
39
+ font-family: var(--font-sans);
40
+ font-size: 0.875rem;
41
+ line-height: 1.4;
42
+ }
43
+ .fractal-breadcrumbs__list {
44
+ display: flex;
45
+ min-width: 0;
46
+ align-items: center;
47
+ margin: 0;
48
+ padding: 0;
49
+ list-style: none;
50
+ }
51
+ .fractal-breadcrumbs__item {
52
+ display: flex;
53
+ min-width: 0;
54
+ align-items: center;
55
+ gap: var(--space-1);
56
+ }
57
+ .fractal-breadcrumbs__separator {
58
+ display: inline-grid;
59
+ flex: 0 0 auto;
60
+ place-items: center;
61
+ color: var(--fg-tertiary);
62
+ }
63
+ .fractal-breadcrumbs__link,
64
+ .fractal-breadcrumbs__current {
65
+ min-width: 0;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
70
+ .fractal-breadcrumbs__link {
71
+ color: var(--fg-tertiary);
72
+ font: inherit;
73
+ text-decoration: none;
74
+ transition: color 120ms ease;
75
+ }
76
+ .fractal-breadcrumbs__link:hover {
77
+ color: var(--fg-primary);
78
+ }
79
+ .fractal-breadcrumbs__link:focus-visible {
80
+ border-radius: var(--radius-sm);
81
+ outline: 2px solid var(--border-focus);
82
+ outline-offset: 2px;
83
+ }
84
+ .fractal-breadcrumbs__current {
85
+ color: var(--fg-primary);
86
+ font-weight: 500;
87
+ }
88
+
35
89
  /* src/components/Card/Card.css */
36
90
  .fractal-card {
37
91
  border-radius: var(--radius-lg, 8px);
@@ -369,6 +423,69 @@
369
423
  padding: 0;
370
424
  }
371
425
 
426
+ /* src/components/NumberInput/NumberInput.css */
427
+ .fractal-number-input {
428
+ position: relative;
429
+ width: 100%;
430
+ height: 40px;
431
+ align-self: start;
432
+ }
433
+ .fractal-number-input .fractal-input {
434
+ padding-right: calc(80px + var(--space-3, 12px));
435
+ appearance: textfield;
436
+ }
437
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
438
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
439
+ margin: 0;
440
+ appearance: none;
441
+ }
442
+ .fractal-number-input-controls {
443
+ position: absolute;
444
+ top: 1px;
445
+ right: 1px;
446
+ bottom: 1px;
447
+ display: flex;
448
+ align-items: stretch;
449
+ overflow: hidden;
450
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
451
+ background: var(--bg-canvas);
452
+ }
453
+ .fractal-number-input-unit {
454
+ position: absolute;
455
+ top: 50%;
456
+ color: var(--fg-secondary);
457
+ font-size: 0.875rem;
458
+ line-height: 1;
459
+ pointer-events: none;
460
+ transform: translateY(-50%);
461
+ user-select: none;
462
+ }
463
+ .fractal-number-input-step {
464
+ display: grid;
465
+ width: 40px;
466
+ place-items: center;
467
+ padding: 0;
468
+ border: 0;
469
+ border-left: 1px solid var(--border-subtle);
470
+ background: transparent;
471
+ color: var(--fg-tertiary);
472
+ cursor: pointer;
473
+ }
474
+ .fractal-number-input-step:hover:not(:disabled) {
475
+ background: var(--bg-surface-1);
476
+ color: var(--fg-primary);
477
+ }
478
+ .fractal-number-input-step:focus-visible {
479
+ position: relative;
480
+ z-index: 1;
481
+ outline: 2px solid var(--border-focus);
482
+ outline-offset: -2px;
483
+ }
484
+ .fractal-number-input-step:disabled {
485
+ color: var(--fg-disabled);
486
+ cursor: not-allowed;
487
+ }
488
+
372
489
  /* src/components/Label/Label.css */
373
490
  .fractal-label {
374
491
  font-size: 0.875rem;
@@ -401,9 +518,11 @@
401
518
  height: 18px;
402
519
  font-size: 0.75rem;
403
520
  font-weight: 600;
404
- border-radius: 50%;
405
521
  margin-top: 1px;
406
522
  }
523
+ .fractal-alert-icon svg {
524
+ display: block;
525
+ }
407
526
  .fractal-alert-content {
408
527
  flex: 1;
409
528
  min-width: 0;
@@ -415,53 +534,49 @@
415
534
  line-height: 1.4;
416
535
  }
417
536
  .fractal-alert-description {
537
+ color: var(--fg-secondary);
418
538
  font-size: 0.875rem;
419
539
  line-height: 1.5;
420
540
  }
421
541
  .fractal-alert--default {
422
542
  background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
543
+ border-color: var(--border-subtle);
424
544
  color: var(--fg-primary);
425
545
  }
426
546
  .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
547
  color: var(--fg-secondary);
429
548
  }
430
549
  .fractal-alert--info {
431
550
  background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
551
+ border-color: var(--accent-surface-stroke);
433
552
  color: var(--fg-primary);
434
553
  }
435
554
  .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
555
+ color: var(--accent-default);
438
556
  }
439
557
  .fractal-alert--success {
440
558
  background-color: var(--success-surface);
441
- border-color: var(--success-default);
559
+ border-color: var(--success-surface-stroke);
442
560
  color: var(--fg-primary);
443
561
  }
444
562
  .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
563
+ color: var(--success-default);
447
564
  }
448
565
  .fractal-alert--warning {
449
566
  background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
567
+ border-color: var(--warning-surface-stroke);
451
568
  color: var(--fg-primary);
452
569
  }
453
570
  .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
571
+ color: var(--warning-default);
456
572
  }
457
573
  .fractal-alert--error {
458
574
  background-color: var(--error-surface);
459
- border-color: var(--error-default);
575
+ border-color: var(--error-surface-stroke);
460
576
  color: var(--fg-primary);
461
577
  }
462
578
  .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
579
+ color: var(--error-default);
465
580
  }
466
581
 
467
582
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +621,60 @@
506
621
  user-select: none;
507
622
  }
508
623
 
624
+ /* src/components/UILoader/UILoader.css */
625
+ .fractal-ui-loader {
626
+ display: inline-flex;
627
+ line-height: 0;
628
+ }
629
+ .fractal-ui-loader svg {
630
+ display: block;
631
+ overflow: visible;
632
+ }
633
+ .fractal-ui-loader__stop-start {
634
+ stop-color: var(--grey-200);
635
+ }
636
+ .fractal-ui-loader__stop-end {
637
+ stop-color: var(--grey-100);
638
+ }
639
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
640
+ stop-color: var(--blue-500);
641
+ }
642
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
643
+ stop-color: var(--blue-300);
644
+ }
645
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
646
+ stop-color: var(--green-500);
647
+ }
648
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
649
+ stop-color: var(--green-300);
650
+ }
651
+ .fractal-ui-loader__shine-axis {
652
+ transform-box: view-box;
653
+ transform-origin: 0 0;
654
+ }
655
+ .fractal-ui-loader__shine {
656
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
657
+ transform-box: view-box;
658
+ transform-origin: 0 0;
659
+ }
660
+ @keyframes fractal-ui-loader-shine {
661
+ 0%, 12% {
662
+ transform: translateX(-120px);
663
+ }
664
+ 48% {
665
+ transform: translateX(120px);
666
+ }
667
+ 49%, 100% {
668
+ transform: translateX(-120px);
669
+ }
670
+ }
671
+ @media (prefers-reduced-motion: reduce) {
672
+ .fractal-ui-loader__shine {
673
+ animation: none;
674
+ transform: translateX(0);
675
+ }
676
+ }
677
+
509
678
  /* src/components/Modal/Modal.css */
510
679
  .fractal-modal-overlay {
511
680
  position: fixed;
@@ -517,11 +686,12 @@
517
686
  z-index: 9998;
518
687
  }
519
688
  .fractal-modal-panel {
689
+ --fractal-modal-panel-padding: var(--space-6, 24px);
520
690
  background: var(--bg-canvas);
521
691
  border: 1px solid var(--border-subtle);
522
692
  border-radius: var(--radius-lg, 8px);
523
693
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
694
+ padding: var(--fractal-modal-panel-padding);
525
695
  max-width: 90vw;
526
696
  font-family: var(--font-sans);
527
697
  }
@@ -538,6 +708,12 @@
538
708
  display: flex;
539
709
  flex-direction: column;
540
710
  }
711
+ .fractal-modal-panel--scrollable {
712
+ display: flex;
713
+ max-height: calc(100dvh - 2rem);
714
+ flex-direction: column;
715
+ padding-bottom: 0;
716
+ }
541
717
  .fractal-modal-panel--danger {
542
718
  border-color: var(--error-subtle);
543
719
  }
@@ -576,21 +752,46 @@
576
752
  color: var(--fg-primary);
577
753
  background: var(--bg-surface-1);
578
754
  }
755
+ .fractal-modal-close:disabled {
756
+ cursor: not-allowed;
757
+ opacity: 0.4;
758
+ }
759
+ .fractal-modal-close:disabled:hover {
760
+ color: var(--fg-secondary);
761
+ background: none;
762
+ }
579
763
  .fractal-modal-body {
580
764
  font-size: 0.875rem;
581
765
  color: var(--fg-secondary);
582
766
  }
767
+ .fractal-modal-body--loading {
768
+ display: grid;
769
+ min-height: 168px;
770
+ place-items: center;
771
+ }
583
772
  .fractal-modal-body--lg {
584
773
  flex: 1;
585
774
  min-height: 0;
586
775
  overflow: hidden;
587
776
  }
777
+ .fractal-modal-body--scrollable {
778
+ min-height: 0;
779
+ overflow-y: auto;
780
+ overscroll-behavior: contain;
781
+ }
588
782
  .fractal-modal-footer {
589
783
  display: flex;
590
784
  justify-content: flex-end;
591
785
  gap: var(--space-2, 8px);
592
786
  margin-top: var(--space-4, 16px);
593
787
  }
788
+ .fractal-modal-footer--divided {
789
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
790
+ flex: 0 0 auto;
791
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
792
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
793
+ border-top: 1px solid var(--border-subtle);
794
+ }
594
795
 
595
796
  /* src/components/DataTable/DataTable.css */
596
797
  .fractal-datatable {
@@ -600,7 +801,7 @@
600
801
  .fractal-datatable-surface {
601
802
  overflow: hidden;
602
803
  border: 1px solid var(--border-subtle);
603
- border-radius: var(--radius-xl, 12px);
804
+ border-radius: var(--radius-md, 6px);
604
805
  background: var(--bg-canvas);
605
806
  }
606
807
  .fractal-datatable-header {
@@ -639,9 +840,6 @@
639
840
  border-bottom: 1px solid var(--border-subtle);
640
841
  vertical-align: middle;
641
842
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
843
  .fractal-datatable-row {
646
844
  background: var(--bg-canvas);
647
845
  transition: background 120ms ease;
@@ -656,8 +854,8 @@
656
854
  vertical-align: top;
657
855
  overflow-wrap: anywhere;
658
856
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
857
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
858
+ background: var(--bg-canvas);
661
859
  }
662
860
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
861
  border-top: 1px solid var(--border-subtle);
@@ -700,6 +898,16 @@
700
898
  padding: 4px 8px;
701
899
  font-size: 0.75rem;
702
900
  }
901
+ .fractal-dropdown-trigger--icon-only {
902
+ width: 32px;
903
+ height: 32px;
904
+ justify-content: center;
905
+ padding: 0;
906
+ }
907
+ .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--sm {
908
+ width: 28px;
909
+ height: 28px;
910
+ }
703
911
  .fractal-dropdown-trigger--tertiary {
704
912
  border-color: transparent;
705
913
  background: transparent;
@@ -708,6 +916,17 @@
708
916
  .fractal-dropdown-trigger--tertiary:hover {
709
917
  background: var(--bg-surface-1);
710
918
  }
919
+ .fractal-dropdown-trigger:disabled,
920
+ .fractal-dropdown-trigger:disabled:hover {
921
+ color: var(--fg-disabled);
922
+ cursor: not-allowed;
923
+ background: var(--bg-surface-1);
924
+ }
925
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
926
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
927
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
928
+ color: var(--fg-disabled);
929
+ }
711
930
  .fractal-dropdown-trigger:focus-visible {
712
931
  outline: none;
713
932
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,12 +950,15 @@
731
950
  .fractal-dropdown-chevron {
732
951
  display: flex;
733
952
  flex-shrink: 0;
953
+ margin-left: auto;
734
954
  color: var(--fg-secondary);
735
955
  }
736
956
  .fractal-dropdown-panel {
737
957
  position: absolute;
738
958
  z-index: 999999;
959
+ min-width: 100%;
739
960
  overflow: hidden;
961
+ box-sizing: border-box;
740
962
  border-radius: var(--radius-md, 6px);
741
963
  border: 1px solid var(--border-subtle);
742
964
  background: var(--bg-canvas);
@@ -755,6 +977,7 @@
755
977
  .fractal-dropdown-option {
756
978
  display: flex;
757
979
  width: 100%;
980
+ box-sizing: border-box;
758
981
  align-items: center;
759
982
  gap: 8px;
760
983
  padding: 6px 8px;
@@ -778,7 +1001,7 @@
778
1001
  }
779
1002
  .fractal-dropdown-option:hover,
780
1003
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1004
+ background: var(--hover-surface, var(--bg-surface-2));
782
1005
  outline: none;
783
1006
  }
784
1007
  .fractal-dropdown-separator {
@@ -874,6 +1097,35 @@
874
1097
  color: var(--accent-default);
875
1098
  }
876
1099
 
1100
+ /* src/components/Checkbox/Checkbox.css */
1101
+ .fractal-checkbox {
1102
+ display: grid;
1103
+ width: 28px;
1104
+ height: 28px;
1105
+ place-items: center;
1106
+ padding: 0;
1107
+ border: 0;
1108
+ border-radius: var(--radius-sm);
1109
+ background: transparent;
1110
+ color: var(--fg-secondary);
1111
+ cursor: pointer;
1112
+ }
1113
+ .fractal-checkbox:hover:not(:disabled) {
1114
+ background: var(--hover-canvas);
1115
+ color: var(--fg-primary);
1116
+ }
1117
+ .fractal-checkbox--checked {
1118
+ color: var(--fg-primary);
1119
+ }
1120
+ .fractal-checkbox:focus-visible {
1121
+ outline: 2px solid var(--border-focus);
1122
+ outline-offset: 2px;
1123
+ }
1124
+ .fractal-checkbox:disabled {
1125
+ cursor: not-allowed;
1126
+ color: var(--fg-disabled);
1127
+ }
1128
+
877
1129
  /* src/components/SortableTable/SortableTable.css */
878
1130
  .fractal-sortable-table {
879
1131
  font-family: var(--font-sans);
@@ -882,9 +1134,14 @@
882
1134
  .fractal-sortable-table-surface {
883
1135
  overflow: hidden;
884
1136
  border: 1px solid var(--border-subtle);
885
- border-radius: var(--radius-xl, 12px);
1137
+ border-radius: var(--radius-md, 6px);
886
1138
  background: var(--bg-canvas);
887
1139
  }
1140
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
1141
+ border: 0;
1142
+ border-top: 1px solid var(--border-subtle);
1143
+ border-radius: 0;
1144
+ }
888
1145
  .fractal-sortable-table-header {
889
1146
  display: flex;
890
1147
  align-items: center;
@@ -922,9 +1179,6 @@
922
1179
  vertical-align: middle;
923
1180
  white-space: nowrap;
924
1181
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
1182
  .fractal-sortable-table-th--sortable {
929
1183
  padding: 0;
930
1184
  }
@@ -977,6 +1231,56 @@
977
1231
  .fractal-sortable-table-row:hover {
978
1232
  background: var(--bg-surface-1);
979
1233
  }
1234
+ .fractal-sortable-table-row--interactive {
1235
+ cursor: pointer;
1236
+ }
1237
+ .fractal-sortable-table-td--row-action {
1238
+ position: relative;
1239
+ }
1240
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1241
+ background: var(--bg-canvas);
1242
+ }
1243
+ .fractal-sortable-table-row-action {
1244
+ position: absolute;
1245
+ z-index: 1;
1246
+ top: 0;
1247
+ right: -1px;
1248
+ bottom: 0;
1249
+ display: flex;
1250
+ width: min(280px, calc(200% + 32px));
1251
+ align-items: center;
1252
+ justify-content: flex-end;
1253
+ padding-right: var(--space-4);
1254
+ background:
1255
+ linear-gradient(
1256
+ 90deg,
1257
+ transparent 0%,
1258
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
1259
+ var(--hover-surface) 100%);
1260
+ opacity: 0;
1261
+ pointer-events: none;
1262
+ transition: opacity 150ms ease-out;
1263
+ }
1264
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
1265
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
1266
+ opacity: 1;
1267
+ }
1268
+ .fractal-sortable-table-row-action__icon {
1269
+ display: grid;
1270
+ width: 32px;
1271
+ height: 32px;
1272
+ place-items: center;
1273
+ border: 1px solid var(--border-default);
1274
+ border-radius: var(--radius-full);
1275
+ background: var(--bg-canvas);
1276
+ color: var(--fg-primary);
1277
+ }
1278
+ .fractal-sortable-table-row--interactive:focus-visible {
1279
+ position: relative;
1280
+ z-index: 1;
1281
+ outline: 2px solid var(--border-focus);
1282
+ outline-offset: -2px;
1283
+ }
980
1284
  .fractal-sortable-table-row + .fractal-sortable-table-row .fractal-sortable-table-td {
981
1285
  border-top: 1px solid var(--border-subtle);
982
1286
  }
@@ -993,17 +1297,14 @@
993
1297
  vertical-align: top;
994
1298
  overflow-wrap: anywhere;
995
1299
  }
996
- .fractal-sortable-table-td + .fractal-sortable-table-td {
997
- border-left: 1px solid var(--border-subtle);
998
- }
999
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1300
+ .fractal-sortable-table--sm .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1000
1301
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1001
1302
  padding: 8px 12px;
1002
1303
  }
1003
1304
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1004
1305
  padding: 10px 12px;
1005
1306
  }
1006
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1307
+ .fractal-sortable-table--lg .fractal-sortable-table-th:not(.fractal-sortable-table-th--sortable),
1007
1308
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1008
1309
  padding: 18px 24px;
1009
1310
  }
@@ -1017,17 +1318,60 @@
1017
1318
  font-size: 0.875rem;
1018
1319
  }
1019
1320
  .fractal-tabs-list {
1321
+ position: relative;
1020
1322
  display: flex;
1021
1323
  gap: 24px;
1324
+ margin-bottom: var(--space-6);
1325
+ }
1326
+ .fractal-tabs--divider > .fractal-tabs-list {
1022
1327
  border-bottom: 1px solid var(--border-subtle);
1023
- margin-bottom: 16px;
1328
+ }
1329
+ .fractal-tabs--surface > .fractal-tabs-list {
1330
+ width: 100%;
1331
+ gap: 0;
1332
+ margin-bottom: 0;
1333
+ background: var(--bg-surface-1);
1334
+ }
1335
+ .fractal-tabs--surface > .fractal-tabs-list::before {
1336
+ position: absolute;
1337
+ z-index: 3;
1338
+ right: 0;
1339
+ bottom: 0;
1340
+ left: 0;
1341
+ height: 1px;
1342
+ background: var(--border-subtle);
1343
+ content: "";
1344
+ pointer-events: none;
1345
+ }
1346
+ .fractal-tabs-list::after {
1347
+ position: absolute;
1348
+ bottom: -1px;
1349
+ left: 0;
1350
+ width: var(--fractal-tabs-indicator-width, 0px);
1351
+ height: 2px;
1352
+ background: var(--accent-default);
1353
+ content: "";
1354
+ opacity: 0;
1355
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
1356
+ transition:
1357
+ transform 180ms var(--ease-standard, ease),
1358
+ width 180ms var(--ease-standard, ease),
1359
+ opacity 100ms ease;
1360
+ }
1361
+ .fractal-tabs-list[data-indicator-ready=true]::after {
1362
+ opacity: 1;
1363
+ }
1364
+ .fractal-tabs--surface > .fractal-tabs-list::after {
1365
+ display: none;
1024
1366
  }
1025
1367
  .fractal-tabs-trigger {
1026
1368
  position: relative;
1027
1369
  display: inline-flex;
1370
+ min-width: 88px;
1028
1371
  align-items: center;
1372
+ justify-content: center;
1029
1373
  gap: 6px;
1030
- padding: 10px 0;
1374
+ padding: 10px 1rem;
1031
1375
  background: none;
1032
1376
  border: 0;
1033
1377
  font: inherit;
@@ -1035,8 +1379,7 @@
1035
1379
  font-weight: 400;
1036
1380
  color: var(--fg-secondary);
1037
1381
  cursor: pointer;
1038
- transition: color 0.15s ease, box-shadow 0.15s ease;
1039
- box-shadow: inset 0 -1px 0 transparent;
1382
+ transition: color 0.15s ease;
1040
1383
  margin-bottom: -1px;
1041
1384
  }
1042
1385
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1050,7 +1393,21 @@
1050
1393
  .fractal-tabs-trigger--active {
1051
1394
  color: var(--accent-default);
1052
1395
  font-weight: 500;
1053
- box-shadow: inset 0 -1px 0 var(--accent-default);
1396
+ }
1397
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
1398
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
1399
+ }
1400
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
1401
+ margin-bottom: 0;
1402
+ border-right: 1px solid var(--border-subtle);
1403
+ background: var(--bg-surface-1);
1404
+ }
1405
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
1406
+ background: var(--hover-surface);
1407
+ }
1408
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
1409
+ background: var(--bg-canvas);
1410
+ color: var(--fg-primary);
1054
1411
  }
1055
1412
  .fractal-tabs-trigger--disabled {
1056
1413
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1064,26 +1421,114 @@
1064
1421
  .fractal-tabs-panel[hidden] {
1065
1422
  display: none;
1066
1423
  }
1424
+ @media (prefers-reduced-motion: reduce) {
1425
+ .fractal-tabs-list::after {
1426
+ transition: none;
1427
+ }
1428
+ }
1067
1429
 
1068
- /* src/components/Disclosure/Disclosure.css */
1069
- .fractal-disclosure {
1430
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
1431
+ .fractal-content-switcher {
1432
+ position: relative;
1433
+ display: inline-flex;
1434
+ gap: 2px;
1435
+ padding: 2px;
1436
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
1437
+ border-radius: var(--radius-md);
1438
+ background: var(--bg-surface-subtle);
1070
1439
  font-family: var(--font-sans);
1071
- font-size: 0.875rem;
1072
1440
  }
1073
- .fractal-disclosure--card {
1074
- border: 1px solid var(--border-subtle);
1075
- border-radius: 8px;
1441
+ .fractal-content-switcher__indicator {
1442
+ position: absolute;
1443
+ top: 0;
1444
+ left: 0;
1445
+ width: var(--fractal-content-switcher-indicator-width, 0);
1446
+ height: var(--fractal-content-switcher-indicator-height, 0);
1447
+ border-radius: var(--radius-sm);
1076
1448
  background: var(--bg-canvas);
1077
- overflow: hidden;
1449
+ box-shadow: var(--shadow-sm);
1450
+ opacity: 0;
1451
+ pointer-events: none;
1452
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
1078
1453
  }
1079
- .fractal-disclosure-trigger {
1454
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
1455
+ opacity: 1;
1456
+ }
1457
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1458
+ transition:
1459
+ transform var(--duration-normal) var(--ease-in-out),
1460
+ width var(--duration-normal) var(--ease-in-out),
1461
+ height var(--duration-normal) var(--ease-in-out),
1462
+ opacity var(--duration-fast) var(--ease-out);
1463
+ }
1464
+ .fractal-content-switcher--full-width {
1080
1465
  display: flex;
1081
- align-items: center;
1082
- gap: 8px;
1083
1466
  width: 100%;
1084
- padding: 12px 16px;
1085
- background: transparent;
1086
- border: 0;
1467
+ }
1468
+ .fractal-content-switcher__item {
1469
+ position: relative;
1470
+ z-index: 1;
1471
+ min-width: 128px;
1472
+ min-height: 40px;
1473
+ padding: 0 var(--space-4);
1474
+ border: 0;
1475
+ border-radius: var(--radius-sm);
1476
+ background: transparent;
1477
+ color: var(--fg-secondary);
1478
+ cursor: pointer;
1479
+ font: inherit;
1480
+ font-size: 0.875rem;
1481
+ line-height: 1.25;
1482
+ text-align: center;
1483
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
1484
+ }
1485
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
1486
+ flex: 1;
1487
+ }
1488
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
1489
+ background: var(--hover-surface);
1490
+ color: var(--fg-primary);
1491
+ }
1492
+ .fractal-content-switcher__item--active {
1493
+ background: transparent;
1494
+ color: var(--fg-primary);
1495
+ }
1496
+ .fractal-content-switcher__item:focus-visible {
1497
+ position: relative;
1498
+ z-index: 1;
1499
+ outline: 2px solid var(--border-focus);
1500
+ outline-offset: -2px;
1501
+ }
1502
+ .fractal-content-switcher__item:disabled {
1503
+ cursor: not-allowed;
1504
+ color: var(--fg-disabled);
1505
+ opacity: 0.5;
1506
+ }
1507
+ @media (prefers-reduced-motion: reduce) {
1508
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
1509
+ transition: none;
1510
+ }
1511
+ }
1512
+
1513
+ /* src/components/Disclosure/Disclosure.css */
1514
+ .fractal-disclosure {
1515
+ font-family: var(--font-sans);
1516
+ font-size: 0.875rem;
1517
+ }
1518
+ .fractal-disclosure--card {
1519
+ border: 1px solid var(--border-subtle);
1520
+ border-radius: 8px;
1521
+ background: var(--bg-canvas);
1522
+ overflow: hidden;
1523
+ }
1524
+ .fractal-disclosure-trigger {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ gap: 8px;
1528
+ width: 100%;
1529
+ padding: 12px 16px;
1530
+ background: transparent;
1531
+ border: 0;
1087
1532
  font: inherit;
1088
1533
  font-size: 0.875rem;
1089
1534
  font-weight: 500;
@@ -1095,6 +1540,17 @@
1095
1540
  .fractal-disclosure-trigger:hover {
1096
1541
  background: var(--bg-surface-1);
1097
1542
  }
1543
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
1544
+ color: var(--fg-tertiary);
1545
+ cursor: not-allowed;
1546
+ }
1547
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
1548
+ background: transparent;
1549
+ }
1550
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
1551
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
1552
+ color: var(--fg-tertiary);
1553
+ }
1098
1554
  .fractal-disclosure-trigger:focus-visible {
1099
1555
  outline: 2px solid var(--border-focus);
1100
1556
  outline-offset: -2px;
@@ -1137,9 +1593,348 @@
1137
1593
  padding: 4px 0 12px 24px;
1138
1594
  }
1139
1595
 
1596
+ /* src/components/LatticeLoader/LatticeLoader.css */
1597
+ .fractal-lattice-loader {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ gap: 6px;
1601
+ width: 100%;
1602
+ height: 12px;
1603
+ overflow: hidden;
1604
+ color: var(--fg-secondary);
1605
+ }
1606
+ .fractal-lattice-loader__cell {
1607
+ position: relative;
1608
+ width: 12px;
1609
+ flex: 0 0 12px;
1610
+ aspect-ratio: 1;
1611
+ background: currentColor;
1612
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1613
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
1614
+ opacity: 0.08;
1615
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
1616
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
1617
+ }
1618
+ @keyframes fractal-lattice-wave {
1619
+ 0%, 58%, 100% {
1620
+ opacity: 0.08;
1621
+ }
1622
+ 18% {
1623
+ opacity: 0.28;
1624
+ }
1625
+ 30% {
1626
+ opacity: 1;
1627
+ }
1628
+ 42% {
1629
+ opacity: 0.28;
1630
+ }
1631
+ }
1632
+ @media (prefers-reduced-motion: reduce) {
1633
+ .fractal-lattice-loader__cell {
1634
+ opacity: 0.35;
1635
+ animation: none;
1636
+ }
1637
+ }
1638
+
1639
+ /* src/components/Ghost/Ghost.css */
1640
+ .fractal-ghost {
1641
+ --fractal-ghost-base: var(--bg-surface-1);
1642
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
1643
+ display: block;
1644
+ min-width: 0;
1645
+ min-height: 1px;
1646
+ background:
1647
+ linear-gradient(
1648
+ 105deg,
1649
+ var(--fractal-ghost-base) 20%,
1650
+ var(--fractal-ghost-shine) 44%,
1651
+ var(--fractal-ghost-base) 68%);
1652
+ background-size: 220% 100%;
1653
+ border-radius: var(--radius-sm);
1654
+ animation: fractal-ghost-shine var(--duration-ambient) var(--ease-in-out) infinite;
1655
+ }
1656
+ .fractal-ghost-line {
1657
+ height: 0.875rem;
1658
+ }
1659
+ .fractal-ghost-line--sm {
1660
+ height: 0.6875rem;
1661
+ }
1662
+ .fractal-ghost-line--lg {
1663
+ height: 1.125rem;
1664
+ }
1665
+ .fractal-ghost-stack {
1666
+ display: grid;
1667
+ gap: var(--space-2);
1668
+ }
1669
+ .fractal-ghost-button {
1670
+ border-radius: var(--radius-full);
1671
+ }
1672
+ .fractal-ghost-button--xs {
1673
+ width: 72px;
1674
+ height: 28px;
1675
+ }
1676
+ .fractal-ghost-button--sm {
1677
+ width: 84px;
1678
+ height: 32px;
1679
+ }
1680
+ .fractal-ghost-button--md {
1681
+ width: 96px;
1682
+ height: 40px;
1683
+ }
1684
+ .fractal-ghost-button--lg {
1685
+ width: 108px;
1686
+ height: 44px;
1687
+ }
1688
+ .fractal-ghost-button--xl {
1689
+ width: 128px;
1690
+ height: 56px;
1691
+ }
1692
+ .fractal-ghost-button--icon-only {
1693
+ width: var(--fractal-ghost-icon-size, 40px);
1694
+ }
1695
+ .fractal-ghost-button--xs.fractal-ghost-button--icon-only {
1696
+ --fractal-ghost-icon-size: 28px;
1697
+ }
1698
+ .fractal-ghost-button--sm.fractal-ghost-button--icon-only {
1699
+ --fractal-ghost-icon-size: 32px;
1700
+ }
1701
+ .fractal-ghost-button--lg.fractal-ghost-button--icon-only {
1702
+ --fractal-ghost-icon-size: 44px;
1703
+ }
1704
+ .fractal-ghost-button--xl.fractal-ghost-button--icon-only {
1705
+ --fractal-ghost-icon-size: 56px;
1706
+ }
1707
+ .fractal-ghost-card {
1708
+ display: grid;
1709
+ gap: var(--space-4);
1710
+ padding: var(--space-5);
1711
+ border: 1px solid var(--border-subtle);
1712
+ border-radius: var(--radius-md);
1713
+ background: var(--bg-canvas);
1714
+ }
1715
+ .fractal-ghost-table {
1716
+ overflow: hidden;
1717
+ border: 1px solid var(--border-subtle);
1718
+ border-radius: var(--radius-md);
1719
+ background: var(--bg-canvas);
1720
+ }
1721
+ .fractal-ghost-table__table {
1722
+ width: 100%;
1723
+ border-collapse: separate;
1724
+ border-spacing: 0;
1725
+ }
1726
+ .fractal-ghost-table__head-row {
1727
+ background: var(--bg-surface-1);
1728
+ }
1729
+ .fractal-ghost-table th {
1730
+ padding: 12px 16px;
1731
+ border-bottom: 1px solid var(--border-subtle);
1732
+ color: var(--fg-secondary);
1733
+ font-size: 0.75rem;
1734
+ font-weight: 500;
1735
+ text-align: left;
1736
+ }
1737
+ .fractal-ghost-table td {
1738
+ padding: 14px 16px;
1739
+ }
1740
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
1741
+ border-top: 1px solid var(--border-subtle);
1742
+ }
1743
+ .fractal-ghost-table--sm th {
1744
+ padding: 8px 12px;
1745
+ }
1746
+ .fractal-ghost-table--sm td {
1747
+ padding: 10px 12px;
1748
+ }
1749
+ .fractal-ghost-table--lg th {
1750
+ padding: 18px 24px;
1751
+ }
1752
+ .fractal-ghost-table--lg td {
1753
+ padding: 22px 24px;
1754
+ }
1755
+ .fractal-ghost-field {
1756
+ display: grid;
1757
+ gap: var(--space-2);
1758
+ }
1759
+ .fractal-ghost-field__control {
1760
+ width: 100%;
1761
+ height: 40px;
1762
+ border: 1px solid var(--border-subtle);
1763
+ border-radius: var(--radius-md);
1764
+ }
1765
+ .fractal-ghost-field__control--multiline {
1766
+ height: 112px;
1767
+ }
1768
+ .fractal-ghost-label {
1769
+ border-radius: var(--radius-sm);
1770
+ }
1771
+ .fractal-ghost-alert {
1772
+ display: grid;
1773
+ gap: var(--space-2);
1774
+ padding: var(--space-4);
1775
+ border: 1px solid var(--border-subtle);
1776
+ border-radius: var(--radius-md);
1777
+ }
1778
+ .fractal-ghost-choice {
1779
+ display: flex;
1780
+ align-items: center;
1781
+ gap: var(--space-2);
1782
+ }
1783
+ .fractal-ghost-choice__control {
1784
+ width: 16px;
1785
+ height: 16px;
1786
+ border-radius: var(--radius-sm);
1787
+ }
1788
+ .fractal-ghost-chip {
1789
+ border-radius: var(--radius-full);
1790
+ }
1791
+ .fractal-ghost-link {
1792
+ display: inline-block;
1793
+ }
1794
+ .fractal-ghost-dropdown {
1795
+ display: flex;
1796
+ align-items: center;
1797
+ justify-content: space-between;
1798
+ width: 220px;
1799
+ height: 40px;
1800
+ padding: 0 var(--space-3);
1801
+ border: 1px solid var(--border-subtle);
1802
+ border-radius: var(--radius-md);
1803
+ }
1804
+ .fractal-ghost-dropdown__chevron {
1805
+ width: 14px;
1806
+ height: 14px;
1807
+ border-radius: var(--radius-full);
1808
+ }
1809
+ .fractal-ghost-switcher {
1810
+ display: flex;
1811
+ width: fit-content;
1812
+ gap: 2px;
1813
+ padding: 3px;
1814
+ border-radius: var(--radius-md);
1815
+ background: var(--bg-surface-1);
1816
+ }
1817
+ .fractal-ghost-switcher > .fractal-ghost {
1818
+ width: 76px;
1819
+ height: 32px;
1820
+ border-radius: calc(var(--radius-md) - 2px);
1821
+ }
1822
+ .fractal-ghost-disclosure {
1823
+ display: flex;
1824
+ align-items: center;
1825
+ gap: var(--space-3);
1826
+ padding: var(--space-3) 0;
1827
+ border-bottom: 1px solid var(--border-subtle);
1828
+ }
1829
+ .fractal-ghost-disclosure__icon {
1830
+ width: 16px;
1831
+ height: 16px;
1832
+ border-radius: var(--radius-full);
1833
+ }
1834
+ .fractal-ghost-pagination {
1835
+ display: flex;
1836
+ gap: var(--space-2);
1837
+ }
1838
+ .fractal-ghost-pagination > .fractal-ghost {
1839
+ width: 32px;
1840
+ height: 32px;
1841
+ border-radius: var(--radius-md);
1842
+ }
1843
+ .fractal-ghost-dropzone {
1844
+ display: grid;
1845
+ place-items: center;
1846
+ gap: var(--space-3);
1847
+ min-height: 184px;
1848
+ padding: var(--space-6);
1849
+ border: 1px dashed var(--border-default);
1850
+ border-radius: var(--radius-md);
1851
+ }
1852
+ .fractal-ghost-dropzone__icon {
1853
+ width: 32px;
1854
+ height: 32px;
1855
+ border-radius: var(--radius-full);
1856
+ }
1857
+ .fractal-ghost-prompt-card {
1858
+ min-height: 176px;
1859
+ }
1860
+ .fractal-ghost-sidebar {
1861
+ display: grid;
1862
+ align-content: start;
1863
+ gap: var(--space-7);
1864
+ width: 248px;
1865
+ min-height: 100%;
1866
+ padding: var(--space-5);
1867
+ border-right: 1px solid var(--border-subtle);
1868
+ background: var(--bg-canvas);
1869
+ }
1870
+ .fractal-ghost-sidebar__brand {
1871
+ width: 112px;
1872
+ height: 24px;
1873
+ }
1874
+ .fractal-ghost-sidebar__items {
1875
+ display: grid;
1876
+ gap: var(--space-2);
1877
+ }
1878
+ .fractal-ghost-sidebar__item {
1879
+ display: flex;
1880
+ align-items: center;
1881
+ gap: var(--space-3);
1882
+ height: 36px;
1883
+ padding: 0 var(--space-2);
1884
+ }
1885
+ .fractal-ghost-sidebar__item > .fractal-ghost {
1886
+ width: 16px;
1887
+ height: 16px;
1888
+ border-radius: var(--radius-sm);
1889
+ }
1890
+ .fractal-ghost-surface {
1891
+ display: grid;
1892
+ gap: var(--space-5);
1893
+ padding: var(--space-6);
1894
+ border: 1px solid var(--border-subtle);
1895
+ border-radius: var(--radius-lg);
1896
+ background: var(--bg-canvas);
1897
+ }
1898
+ .fractal-ghost-modal {
1899
+ width: min(100%, 420px);
1900
+ }
1901
+ .fractal-ghost-side-panel {
1902
+ width: min(100%, 540px);
1903
+ min-height: 480px;
1904
+ }
1905
+ .fractal-ghost-surface__header {
1906
+ display: flex;
1907
+ align-items: center;
1908
+ justify-content: space-between;
1909
+ }
1910
+ .fractal-ghost-surface__close {
1911
+ width: 28px;
1912
+ height: 28px;
1913
+ border-radius: var(--radius-md);
1914
+ }
1915
+ .fractal-ghost-surface__title {
1916
+ color: var(--fg-secondary);
1917
+ font-size: 0.75rem;
1918
+ }
1919
+ @keyframes fractal-ghost-shine {
1920
+ from {
1921
+ background-position: 110% 0;
1922
+ }
1923
+ to {
1924
+ background-position: -110% 0;
1925
+ }
1926
+ }
1927
+ @media (prefers-reduced-motion: reduce) {
1928
+ .fractal-ghost {
1929
+ animation: none;
1930
+ background: var(--fractal-ghost-base);
1931
+ }
1932
+ }
1933
+
1140
1934
  /* src/components/Sidebar/Sidebar.css */
1141
1935
  .fractal-sidebar {
1142
1936
  --fractal-sidebar-width: 232px;
1937
+ --fractal-sidebar-compact-width: 56px;
1143
1938
  box-sizing: border-box;
1144
1939
  display: flex;
1145
1940
  width: var(--fractal-sidebar-width);
@@ -1151,11 +1946,27 @@
1151
1946
  color: var(--fg-primary);
1152
1947
  font-family: var(--font-sans);
1153
1948
  }
1949
+ .fractal-sidebar[data-compact] {
1950
+ z-index: 10;
1951
+ width: var(--fractal-sidebar-compact-width);
1952
+ min-width: var(--fractal-sidebar-compact-width);
1953
+ overflow: hidden;
1954
+ transition:
1955
+ width var(--duration-normal) var(--ease-out),
1956
+ min-width var(--duration-normal) var(--ease-out),
1957
+ box-shadow var(--duration-normal) var(--ease-out);
1958
+ }
1959
+ .fractal-sidebar[data-compact]:hover,
1960
+ .fractal-sidebar[data-compact]:focus-within {
1961
+ width: var(--fractal-sidebar-width);
1962
+ min-width: var(--fractal-sidebar-width);
1963
+ box-shadow: var(--shadow-md);
1964
+ }
1154
1965
  .fractal-sidebar__header {
1155
1966
  display: flex;
1156
1967
  min-height: 48px;
1157
1968
  align-items: center;
1158
- padding: 0 var(--space-4);
1969
+ padding: var(--space-2);
1159
1970
  border-bottom: 1px solid var(--border-subtle);
1160
1971
  }
1161
1972
  .fractal-sidebar__brand {
@@ -1180,10 +1991,55 @@
1180
1991
  transform: scale(0.98);
1181
1992
  }
1182
1993
  .fractal-sidebar__brand:focus-visible,
1183
- .fractal-sidebar__nav-item:focus-visible {
1994
+ .fractal-sidebar__nav-item:focus-visible,
1995
+ .fractal-sidebar__account-trigger:focus-visible {
1184
1996
  outline: 2px solid var(--border-focus);
1185
1997
  outline-offset: 2px;
1186
1998
  }
1999
+ .fractal-sidebar__account {
2000
+ display: block;
2001
+ width: 100%;
2002
+ }
2003
+ .fractal-sidebar__account-trigger {
2004
+ width: 100%;
2005
+ min-height: 36px;
2006
+ box-sizing: border-box;
2007
+ gap: var(--space-2);
2008
+ padding: 8px 10px;
2009
+ border: 0;
2010
+ background: transparent;
2011
+ border-radius: var(--radius-md);
2012
+ color: var(--fg-primary);
2013
+ font-weight: 500;
2014
+ }
2015
+ .fractal-sidebar__account-trigger:hover,
2016
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
2017
+ background: var(--nav-hover);
2018
+ }
2019
+ .fractal-sidebar__account-name {
2020
+ min-width: 0;
2021
+ flex: 1;
2022
+ overflow: hidden;
2023
+ text-overflow: ellipsis;
2024
+ white-space: nowrap;
2025
+ }
2026
+ .fractal-sidebar__account-icon {
2027
+ display: inline-flex;
2028
+ width: 18px;
2029
+ height: 18px;
2030
+ flex: 0 0 18px;
2031
+ align-items: center;
2032
+ justify-content: center;
2033
+ }
2034
+ .fractal-sidebar__account-icon > img,
2035
+ .fractal-sidebar__account-icon > svg {
2036
+ display: block;
2037
+ width: 18px;
2038
+ height: 18px;
2039
+ }
2040
+ .fractal-sidebar__account-panel {
2041
+ min-width: 100%;
2042
+ }
1187
2043
  .fractal-sidebar__nav {
1188
2044
  display: flex;
1189
2045
  flex: 1;
@@ -1275,54 +2131,383 @@
1275
2131
  border-top: 1px solid var(--border-subtle);
1276
2132
  }
1277
2133
  @media (prefers-reduced-motion: reduce) {
2134
+ .fractal-sidebar[data-compact],
1278
2135
  .fractal-sidebar__brand,
1279
2136
  .fractal-sidebar__nav-item {
1280
2137
  transition: none;
1281
2138
  }
1282
2139
  }
1283
2140
 
1284
- /* src/components/PageHeader/PageHeader.css */
1285
- .fractal-page-header {
2141
+ /* src/components/SidePanel/SidePanel.css */
2142
+ .fractal-side-panel-overlay {
2143
+ position: fixed;
2144
+ inset: 0;
2145
+ z-index: 9998;
1286
2146
  display: flex;
1287
- min-height: 48px;
1288
- align-items: center;
1289
- justify-content: space-between;
1290
- gap: var(--space-5);
2147
+ justify-content: flex-end;
2148
+ background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
2149
+ animation: fractal-side-panel-overlay-in 180ms ease-out both;
2150
+ }
2151
+ .fractal-side-panel {
2152
+ display: flex;
2153
+ width: min(100vw, 540px);
2154
+ height: 100%;
2155
+ flex-direction: column;
2156
+ border-left: 1px solid var(--border-subtle);
2157
+ background: var(--bg-canvas);
2158
+ box-shadow: var(--shadow-lg);
1291
2159
  color: var(--fg-primary);
1292
2160
  font-family: var(--font-sans);
2161
+ animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
2162
+ }
2163
+ .fractal-side-panel--sm {
2164
+ width: min(100vw, 420px);
2165
+ }
2166
+ .fractal-side-panel--md {
2167
+ width: min(100vw, 540px);
2168
+ }
2169
+ .fractal-side-panel--lg {
2170
+ width: min(100vw, 680px);
2171
+ }
2172
+ .fractal-side-panel--xl {
2173
+ width: min(100vw, 960px);
1293
2174
  }
1294
- .fractal-page-header__content {
2175
+ .fractal-side-panel__header {
2176
+ display: flex;
2177
+ align-items: flex-start;
2178
+ justify-content: space-between;
2179
+ gap: var(--space-4);
2180
+ padding: var(--space-5) var(--space-6) var(--space-4);
2181
+ }
2182
+ .fractal-side-panel__heading {
1295
2183
  min-width: 0;
1296
2184
  }
1297
- .fractal-page-header__title {
2185
+ .fractal-side-panel__title {
2186
+ display: flex;
2187
+ min-height: 32px;
2188
+ align-items: center;
1298
2189
  margin: 0;
1299
- color: var(--fg-primary);
1300
- font-family: var(--font-sans);
1301
2190
  font-size: 1rem;
1302
2191
  font-weight: 500;
1303
2192
  line-height: 1.4;
1304
2193
  }
1305
- .fractal-page-header__description {
2194
+ .fractal-side-panel__description {
1306
2195
  margin: var(--space-1) 0 0;
1307
2196
  color: var(--fg-secondary);
1308
2197
  font-size: 0.875rem;
1309
- font-weight: 400;
1310
2198
  line-height: 1.4;
1311
2199
  }
1312
- .fractal-page-header__actions {
1313
- display: flex;
2200
+ .fractal-side-panel__close {
2201
+ display: grid;
2202
+ width: 32px;
2203
+ height: 32px;
1314
2204
  flex: 0 0 auto;
1315
- align-items: center;
2205
+ place-items: center;
2206
+ border: 0;
2207
+ border-radius: var(--radius-md);
2208
+ background: transparent;
2209
+ color: var(--fg-secondary);
2210
+ cursor: pointer;
2211
+ }
2212
+ .fractal-side-panel__close:hover {
2213
+ background: var(--hover-surface);
2214
+ color: var(--fg-primary);
2215
+ }
2216
+ .fractal-side-panel__close:focus-visible {
2217
+ outline: 2px solid var(--border-focus);
2218
+ outline-offset: 2px;
2219
+ }
2220
+ .fractal-side-panel__body {
2221
+ min-height: 0;
2222
+ flex: 1;
2223
+ overflow: auto;
2224
+ padding: var(--space-2) var(--space-6) var(--space-6);
2225
+ }
2226
+ .fractal-side-panel__body--loading {
2227
+ display: grid;
2228
+ place-items: center;
2229
+ }
2230
+ .fractal-side-panel__footer {
2231
+ display: flex;
2232
+ justify-content: flex-end;
1316
2233
  gap: var(--space-2);
2234
+ padding: var(--space-4) var(--space-6);
2235
+ border-top: 1px solid var(--border-subtle);
1317
2236
  }
1318
2237
  @media (max-width: 640px) {
1319
- .fractal-page-header {
1320
- align-items: flex-start;
1321
- flex-direction: column;
1322
- gap: var(--space-3);
1323
- }
1324
- .fractal-page-header__actions {
2238
+ .fractal-side-panel {
1325
2239
  width: 100%;
1326
2240
  }
2241
+ .fractal-side-panel__header {
2242
+ padding: var(--space-4) var(--space-5) var(--space-3);
2243
+ }
2244
+ .fractal-side-panel__body {
2245
+ padding: var(--space-2) var(--space-5) var(--space-5);
2246
+ }
2247
+ .fractal-side-panel__footer {
2248
+ padding: var(--space-3) var(--space-5);
2249
+ }
2250
+ }
2251
+ @keyframes fractal-side-panel-overlay-in {
2252
+ from {
2253
+ opacity: 0;
2254
+ }
2255
+ to {
2256
+ opacity: 1;
2257
+ }
2258
+ }
2259
+ @keyframes fractal-side-panel-in {
2260
+ from {
2261
+ transform: translateX(100%);
2262
+ }
2263
+ to {
2264
+ transform: translateX(0);
2265
+ }
2266
+ }
2267
+ @media (prefers-reduced-motion: reduce) {
2268
+ .fractal-side-panel-overlay,
2269
+ .fractal-side-panel {
2270
+ animation-duration: 0.01ms;
2271
+ }
2272
+ }
2273
+
2274
+ /* src/components/Textarea/Textarea.css */
2275
+ .fractal-textarea {
2276
+ display: block;
2277
+ width: 100%;
2278
+ min-height: 120px;
2279
+ resize: vertical;
2280
+ border: 1px solid var(--border-default);
2281
+ border-radius: var(--radius-md);
2282
+ background: var(--bg-canvas);
2283
+ padding: var(--space-3);
2284
+ color: var(--fg-primary);
2285
+ font: 0.8125rem/1.55 var(--font-mono);
2286
+ }
2287
+ .fractal-textarea::placeholder {
2288
+ color: var(--fg-placeholder);
2289
+ }
2290
+ .fractal-textarea:hover {
2291
+ border-color: var(--fg-tertiary);
2292
+ }
2293
+ .fractal-textarea:focus-visible {
2294
+ outline: none;
2295
+ border-color: var(--border-focus);
2296
+ box-shadow: 0 0 0 2px var(--accent-surface);
2297
+ }
2298
+ .fractal-textarea:disabled {
2299
+ cursor: not-allowed;
2300
+ opacity: 0.5;
2301
+ background: var(--bg-surface-1);
2302
+ }
2303
+
2304
+ /* src/components/TextButton/TextButton.css */
2305
+ .fractal-text-button {
2306
+ display: inline-flex;
2307
+ align-items: center;
2308
+ gap: var(--space-1);
2309
+ border: 0;
2310
+ background: transparent;
2311
+ cursor: pointer;
2312
+ font-family: var(--font-sans);
2313
+ font-weight: 500;
2314
+ line-height: 1.4;
2315
+ padding: 0;
2316
+ text-align: left;
2317
+ transition: color 120ms ease;
2318
+ }
2319
+ .fractal-text-button--primary {
2320
+ color: var(--fg-primary);
2321
+ }
2322
+ .fractal-text-button--primary:hover:not(:disabled) {
2323
+ color: var(--fg-secondary);
2324
+ }
2325
+ .fractal-text-button--secondary {
2326
+ color: var(--fg-secondary);
2327
+ }
2328
+ .fractal-text-button--secondary:hover:not(:disabled) {
2329
+ color: var(--fg-primary);
2330
+ }
2331
+ .fractal-text-button:focus-visible {
2332
+ outline: 2px solid var(--border-focus);
2333
+ outline-offset: 3px;
2334
+ border-radius: var(--radius-sm);
2335
+ }
2336
+ .fractal-text-button:disabled {
2337
+ cursor: not-allowed;
2338
+ opacity: 0.5;
2339
+ }
2340
+ .fractal-text-button--sm {
2341
+ font-size: 0.8125rem;
2342
+ }
2343
+ .fractal-text-button--md {
2344
+ font-size: 0.875rem;
2345
+ }
2346
+ .fractal-text-button__icon {
2347
+ display: inline-grid;
2348
+ place-items: center;
2349
+ }
2350
+
2351
+ /* src/components/FileDropzone/FileDropzone.css */
2352
+ .fractal-file-dropzone {
2353
+ display: grid;
2354
+ gap: var(--space-2);
2355
+ color: var(--fg-primary);
2356
+ font-family: var(--font-sans);
2357
+ }
2358
+ .fractal-file-dropzone__input {
2359
+ display: none;
2360
+ }
2361
+ .fractal-file-dropzone__target {
2362
+ display: flex;
2363
+ width: 100%;
2364
+ min-height: 92px;
2365
+ align-items: center;
2366
+ justify-content: center;
2367
+ gap: var(--space-3);
2368
+ border: 1px dashed var(--border-default);
2369
+ border-radius: var(--radius-md);
2370
+ background: var(--bg-canvas);
2371
+ color: var(--fg-secondary);
2372
+ cursor: pointer;
2373
+ padding: var(--space-4);
2374
+ text-align: left;
2375
+ }
2376
+ .fractal-file-dropzone__target:hover,
2377
+ .fractal-file-dropzone__target[data-dragging] {
2378
+ border-color: var(--border-focus);
2379
+ background: var(--hover-surface);
2380
+ color: var(--fg-primary);
2381
+ }
2382
+ .fractal-file-dropzone__target:focus-visible {
2383
+ outline: 2px solid var(--border-focus);
2384
+ outline-offset: 2px;
2385
+ }
2386
+ .fractal-file-dropzone__target:disabled {
2387
+ cursor: not-allowed;
2388
+ opacity: 0.5;
2389
+ }
2390
+ .fractal-file-dropzone__copy {
2391
+ display: grid;
2392
+ gap: var(--space-1);
2393
+ }
2394
+ .fractal-file-dropzone__title {
2395
+ font-size: 0.875rem;
2396
+ font-weight: 500;
2397
+ line-height: 1.4;
2398
+ }
2399
+ .fractal-file-dropzone__description {
2400
+ color: var(--fg-secondary);
2401
+ font-size: 0.8125rem;
2402
+ line-height: 1.4;
2403
+ }
2404
+ .fractal-file-dropzone__files {
2405
+ display: grid;
2406
+ gap: var(--space-1);
2407
+ margin: 0;
2408
+ padding: 0;
2409
+ list-style: none;
2410
+ }
2411
+ .fractal-file-dropzone__file {
2412
+ display: flex;
2413
+ min-width: 0;
2414
+ align-items: center;
2415
+ gap: var(--space-2);
2416
+ padding: var(--space-2) var(--space-3);
2417
+ border: 1px solid var(--border-subtle);
2418
+ border-radius: var(--radius-md);
2419
+ background: var(--bg-canvas);
2420
+ font-size: 0.8125rem;
2421
+ line-height: 1.4;
2422
+ }
2423
+ .fractal-file-dropzone__file-name {
2424
+ min-width: 0;
2425
+ flex: 1;
2426
+ overflow: hidden;
2427
+ text-overflow: ellipsis;
2428
+ white-space: nowrap;
2429
+ }
2430
+ .fractal-file-dropzone__file-meta {
2431
+ color: var(--fg-secondary);
2432
+ white-space: nowrap;
2433
+ }
2434
+ .fractal-file-dropzone__remove {
2435
+ display: grid;
2436
+ width: 24px;
2437
+ height: 24px;
2438
+ flex: 0 0 auto;
2439
+ place-items: center;
2440
+ border: 0;
2441
+ border-radius: var(--radius-sm);
2442
+ background: transparent;
2443
+ color: var(--fg-secondary);
2444
+ cursor: pointer;
2445
+ }
2446
+ .fractal-file-dropzone__remove:hover {
2447
+ background: var(--hover-surface);
2448
+ color: var(--fg-primary);
2449
+ }
2450
+ .fractal-file-dropzone__remove:focus-visible {
2451
+ outline: 2px solid var(--border-focus);
2452
+ outline-offset: 1px;
2453
+ }
2454
+ .fractal-file-dropzone__remove:disabled {
2455
+ cursor: not-allowed;
2456
+ opacity: 0.5;
2457
+ }
2458
+
2459
+ /* src/components/Pagination/Pagination.css */
2460
+ .fractal-pagination {
2461
+ display: flex;
2462
+ align-items: center;
2463
+ justify-content: space-between;
2464
+ gap: var(--space-3);
2465
+ color: var(--fg-secondary);
2466
+ font-family: var(--font-sans);
2467
+ font-size: 0.8125rem;
2468
+ line-height: 1.4;
2469
+ }
2470
+ .fractal-pagination__controls {
2471
+ display: flex;
2472
+ align-items: center;
2473
+ gap: var(--space-2);
2474
+ }
2475
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
2476
+ padding: 4px 0;
2477
+ border: 0;
2478
+ background: transparent;
2479
+ color: var(--fg-secondary);
2480
+ }
2481
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
2482
+ background: transparent;
2483
+ color: var(--fg-primary);
2484
+ }
2485
+ .fractal-pagination__button {
2486
+ display: grid;
2487
+ width: 28px;
2488
+ height: 28px;
2489
+ place-items: center;
2490
+ border: 1px solid var(--border-default);
2491
+ border-radius: var(--radius-sm);
2492
+ background: var(--bg-canvas);
2493
+ color: var(--fg-secondary);
2494
+ cursor: pointer;
2495
+ }
2496
+ .fractal-pagination__button:hover:not(:disabled) {
2497
+ background: var(--hover-surface);
2498
+ color: var(--fg-primary);
2499
+ }
2500
+ .fractal-pagination__button:focus-visible {
2501
+ outline: 2px solid var(--border-focus);
2502
+ outline-offset: 2px;
2503
+ }
2504
+ .fractal-pagination__button:disabled {
2505
+ cursor: not-allowed;
2506
+ opacity: 0.45;
2507
+ }
2508
+ .fractal-pagination__page {
2509
+ min-width: 44px;
2510
+ text-align: center;
2511
+ white-space: nowrap;
1327
2512
  }
1328
2513
  /*# sourceMappingURL=index.css.map */